UserServiceImpl.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package com.example.demo.user.service.impl;
  2. import cn.hutool.core.util.IdUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.example.demo.common.utils.Md5Util;
  6. import com.example.demo.common.utils.TokenUtils;
  7. import com.example.demo.user.domain.User;
  8. import com.example.demo.user.dto.LoginDto;
  9. import com.example.demo.user.dto.UserDto;
  10. import com.example.demo.user.service.UserService;
  11. import com.example.demo.user.dao.UserMapper;
  12. import com.example.demo.user.vo.ResultVo;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.redisson.api.RLock;
  15. import org.redisson.api.RedissonClient;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.data.redis.core.RedisTemplate;
  18. import org.springframework.stereotype.Service;
  19. import java.util.UUID;
  20. import java.util.concurrent.TimeUnit;
  21. /**
  22. * @author 徐乐
  23. * @description 针对表【user(用户基础信息表)】的数据库操作Service实现
  24. * @createDate 2025-06-04 17:31:35
  25. */
  26. @Slf4j
  27. @Service
  28. public class UserServiceImpl extends ServiceImpl<UserMapper, User>
  29. implements UserService{
  30. @Autowired
  31. private UserMapper userMapper;
  32. @Autowired
  33. private RedissonClient redissonClient;
  34. @Autowired
  35. private RedisTemplate<String,String> redisTemplate;
  36. @Override
  37. public ResultVo register(UserDto dto) {
  38. QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
  39. userQueryWrapper.eq("phone", dto.getPhone());
  40. log.info("加锁");
  41. RLock lock = redissonClient.getLock(dto.getPhone());
  42. try {
  43. log.info("获取锁");
  44. boolean lockSuccess = lock.tryLock(3, TimeUnit.SECONDS);
  45. if (!lockSuccess) {
  46. throw new RuntimeException("操作频繁,请稍后再试");
  47. }
  48. User user = userMapper.selectOne(userQueryWrapper);
  49. if (user != null) {
  50. return ResultVo.error("用户已存在");
  51. }
  52. log.info("注册");
  53. User u = new User();
  54. u.setId(IdUtil.getSnowflake().nextId());
  55. u.setUsername(dto.getUsername());
  56. //生成盐值
  57. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  58. u.setSalt(uuid);
  59. //获取密码
  60. String password = dto.getPassword();
  61. //加密
  62. String md5Password = Md5Util.MD5(uuid + password);
  63. u.setPassword(md5Password);
  64. u.setEmail(dto.getEmail());
  65. u.setPhone(dto.getPhone());
  66. u.setAvatar(dto.getAvatar());
  67. userMapper.insert(u);
  68. return ResultVo.success("注册成功");
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. throw new RuntimeException("注册过程中出现异常,请稍后再试");
  72. } finally {
  73. if (lock.isLocked() && lock.isHeldByCurrentThread()) {
  74. log.info("释放锁");
  75. lock.unlock();
  76. }
  77. }
  78. }
  79. @Override
  80. public ResultVo login(LoginDto dto) {
  81. QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
  82. userQueryWrapper.eq("phone",dto.getPhone());
  83. User user = userMapper.selectOne(userQueryWrapper);
  84. if (user==null){
  85. return ResultVo.error("用户不存在");
  86. }
  87. //获取盐值
  88. String salt = user.getSalt();
  89. //获取密码
  90. String password = dto.getPassword();
  91. //加密
  92. String encryptedPassword = Md5Util.MD5(salt + password);
  93. if (encryptedPassword.equals(user.getPassword())){
  94. String token = TokenUtils.createJwtToken(user.getId().toString());
  95. redisTemplate.opsForValue().set("userToken:",token);
  96. return ResultVo.success("登录成功");
  97. }
  98. return ResultVo.error("用户名或密码有误");
  99. }
  100. }