密码加密类
//MD5 生成器
public class MD5Utils {
public static String md5(String password){
//生成一个md5加密器
try {
MessageDigest md = MessageDigest.getInstance("MD5");
//计算MD5 的值
md.update(password.getBytes());
//BigInteger 将8位的字符串 转成16位的字符串 得到的字符串形式是哈希码值
//BigInteger(参数1,参数2) 参数1 是 1为正数 0为0 -1为负数
return new BigInteger(1, md.digest()).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "User对象",description = "用户或买家信息")
public class User {
private Integer userId;
private String username;
private String password;
private String nickname;
private String realname;
private String userImg;
private String userMobile;
private String userEmail;
private String userSex;
private Date userBirth;
private Date userRegtime;
private Date usermodtime;
}
Dao
public interface UserMapper {
//用户注册
public int insertUser(User user);
//按照用户名查询用户
public User queryByName(String userName);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pxl.dao.UserMapper">
<insert id="insertUser" parameterType="User">
insert into users (username,password,user_regtime,user_modtime)
values (#{username},#{password},#{userRegtime},#{userModtime})
</insert>
<select id="queryByName" resultType="User" >
select * from users where userName=#{userName}
</select>
</mapper>
Service
public interface UserService {
//用户注册
public ResultVO userRegister(String name,String pwd);
//用户登录
public ResultVO checkLogin(String name, String pwd);
}
@Service
public class UserServiceImpl implements UserService {
@Resource
UserMapper userMapper;
/*用户注册时,需要考虑一个问题
* 当前用户是否存在,即用户名是否已经存在
* 同一时刻可能有多个用户正在注册
* 保证注册时用户名唯一
* 采用事务管理
*/
@Transactional
@Override
public ResultVO userRegister(String name, String pwd) {
synchronized (this) {
//1,根据用户名查询,该用户名是否已经被注册
User user = userMapper.queryByName(name);
//2,若该用户名不存在,则进行保存操作
if (user == null) {
//加密
String Md5Pwd = MD5Utils.md5(pwd);
//保存用户
user = new User();
user.setUsername(name);
user.setPassword(Md5Pwd);
user.setUserRegtime(new Date());
user.setUsermodtime(new Date());
int i = userMapper.insertUser(user);
if (i == 1) {
//注册成功
return new ResultVO(10001, "注册成功", null);
} else {
//注册失败
return new ResultVO(10002, "注册失败", null);
}
} else {
return new ResultVO(10000, "用户名已存在", null);
}
}
}
@Override
public ResultVO checkLogin(String name, String pwd) {
//1,根据账号查询信息
User user = userMapper.queryByName(name);
//2,判断
if(user == null){
//用户名不存在
return new ResultVO(10001,"用户名不存在",null);
}else{
//3.对输入的密码进行加密
String Md5Pwd = MD5Utils.md5(pwd);
//使用加密后的密码和user中的密码进行比对
if(user.getPassword().equals(Md5Pwd)){
//验证成功
return new ResultVO(10000,"登录成功",user);
}else{
//验证失败
return new ResultVO(10002,"密码错误",null);
}
}
}
}
Controller
@RestController
@RequestMapping("/user")
@Api(value = "提供用户的登录和注册接口",tags="用户管理")
public class UserController {
@Resource
UserService userService;
@ApiOperation("用户登录接口")
@ApiImplicitParams({
@ApiImplicitParam(dataType = "string",name = "username",value = "用户登录账号",required = true),
@ApiImplicitParam(dataType = "string",name="password",value = "用户登陆密码",required = true)
})
@GetMapping("/login") //查询是GET
public ResultVO login(@RequestParam("username") String name,
@RequestParam(value = "password") String pwd){
ResultVO resultVO = userService.checkLogin(name,pwd);
return resultVO;
}
@ApiOperation("用户注册接口")
//如果所需要的参数是对象类型的话,就不需要在这里写注解,直接去对象的类里面写
// @ApiImplicitParam(name = "用户信息",required = true)//参数是对象类型的时候,有些可以不写,但是实体类需要引入swagger依赖
@ApiImplicitParams({
@ApiImplicitParam(dataType = "string",name = "username",value = "用户登录账号",required = true),
@ApiImplicitParam(dataType = "string",name="password",value = "用户登陆密码",required = true)
})
@PostMapping("/register")//添加是POST
public ResultVO register(String name,String pwd){
ResultVO resultVO = userService.userRegister(name,pwd);
return resultVO;
}
}
测试
http://localhost:8080/doc.html