============= 后端_用户注册 ============= 用户注册: - 检查是否可以注册,若可以则将账号密码等用户信息保存到数据库中 - 为用户生成令牌 - 将令牌和用户的信息保存在Redis中 - 将令牌返回前端 1 视图对象 1.1 注册参数视图对象 /ysdblog-api/src/main/java/com/weihome/ysdblog/vo/param/RegisterParam.java: @Data public class RegisterParam { private String account; private String nickname; private String password; } 2 用户服务 2.1 用户服务接口 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/UserService.java: public interface UserService { ... /** * 根据账号查询用户 */ public User findUserByAccount(String account); /** * 添加用户 */ public void add(User user); ... } 2.2 用户服务实现 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/impl/UserServiceImpl.java: ... public class UserServiceImpl implements UserService { ... @Override public User findUserByAccount(String account) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getAccount, account); queryWrapper.last("limit 1"); return userMapper.selectOne(queryWrapper); } @Override public void add(User user) { userMapper.insert(user); } ... } 3 登录服务 3.1 登录服务接口 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/LoginService.java: public interface LoginService { ... /** * 用户注册 */ public Result register(RegisterParam registerParam); ... } 3.2 登录服务实现 /ysdblog-api/src/main/java/com/weihome/ysdblog/service/impl/LoginServiceImpl.java: ... public class LoginServiceImpl implements LoginService { ... @Override @Transactional public Result register(RegisterParam registerParam) { String account = registerParam.getAccount(); String nickname = registerParam.getNickname(); String password = registerParam.getPassword(); // 检查账号昵称密码是否合法 if (StringUtils.isBlank(account) || StringUtils.isBlank(nickname) || StringUtils.isBlank(password)) return Result.fail( ErrorCode.PARAM_ERROR.getCode(), ErrorCode.PARAM_ERROR.getMsg()); // 检查账号是否已存在 User user = userService.findUserByAccount(account); if (user != null) return Result.fail( ErrorCode.ACCOUNT_EXIST.getCode(), ErrorCode.ACCOUNT_EXIST.getMsg()); // 添加用户 user = new User(); user.setAccount(account); user.setAdmin(0); user.setAvatar("/static/img/logo.b3a48c0.png"); user.setCreateDate(System.currentTimeMillis()); user.setDeleted(0); user.setEmail(""); user.setLastLogin(System.currentTimeMillis()); user.setMobilePhoneNumber(""); user.setNickname(nickname); user.setPassword(DigestUtils.md5Hex(password + salt)); user.setSalt(""); user.setStatus(""); userService.add(user); // 为该用户生成令牌 String token = JWTUtils.createToken(user.getId()); // 将令牌和用户的对应关系保存到Redis中并将过期时间设置为1天 redisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(user), 1, TimeUnit.DAYS); // 返回令牌给前端 return Result.success(token); } ... } 通过Transactional注解启用事务,Redis出错数据库回滚。 4 注册控制器 /ysdblog-api/src/main/java/com/weihome/ysdblog/controller/RegisterController.java: @RestController @RequestMapping("register") public class RegisterController { @Autowired private LoginService loginService; /** * 用户注册 */ @PostMapping public Result register(@RequestBody RegisterParam registerParam) { return loginService.register(registerParam); } } 5 运行测试 Postman POST localhost:8888/register Body { "account": "user_a", "nickname": "nickname_a", "password": "123456" } ------------------------------- { "success": true, "code": 200, "msg": "success", "data": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDk1ODQyMjcsInVzZXJJZCI6MTUwOTM2MzE2Mjc2MjE4Njc1NCwiaWF0IjoxNjQ4Njk1MTk1fQ.cHFM0rmfQvr6frtWJaC1citGTESGt0b25FOBNwPgdlY" } 检查ysdblogdb库t_user表中的新增用户记录。 检查Redis库,新增如下键值对: 键:TOKEN_eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDk1ODQyMjcsInVzZXJJZCI6MTUwOTM2MzE2Mjc2MjE4Njc1NCwiaWF0IjoxNjQ4Njk1MTk1fQ.cHFM0rmfQvr6frtWJaC1citGTESGt0b25FOBNwPgdlY 值:{"account":"user_f","admin":0,"avatar":"/static/img/logo.b3a48c0.png","createDate":20220331105315,"deleted":0,"email":"","id":1509363162762186754,"lastLogin":20220331105315,"mobilePhoneNumber":"","nickname":"nickname_f","password":"01bec61b2f05979aed0c4935bd8c7653","salt":"","status":""}