|
@@ -8,8 +8,9 @@ import com.example.demo.common.utils.RedisClient;
|
|
|
import com.example.demo.common.utils.TokenUtils;
|
|
|
import com.example.demo.user.domain.User;
|
|
|
import com.example.demo.user.dto.LoginDto;
|
|
|
+import com.example.demo.user.dto.PerfectDto;
|
|
|
import com.example.demo.user.dto.PhoneDto;
|
|
|
-import com.example.demo.user.dto.UserDto;
|
|
|
+import com.example.demo.user.dto.RegisterDto;
|
|
|
import com.example.demo.user.service.UserService;
|
|
|
import com.example.demo.user.dao.UserMapper;
|
|
|
import com.example.demo.user.vo.ResultVo;
|
|
@@ -20,8 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
import java.util.UUID;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
@@ -44,7 +43,19 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
|
|
@Autowired
|
|
|
private RedisClient redisClient;
|
|
|
@Override
|
|
|
- public ResultVo register(UserDto dto) {
|
|
|
+ public ResultVo register(RegisterDto dto) {
|
|
|
+ // 获取验证码
|
|
|
+ Object code = getVerificationCode(dto.getPhone());
|
|
|
+ if (code == null) {
|
|
|
+ return ResultVo.error(201, "验证码已过期");
|
|
|
+ }
|
|
|
+ String codeStr = String.valueOf(code);
|
|
|
+ String userCode = dto.getCode();
|
|
|
+ if (!codeStr.equals(userCode)) {
|
|
|
+ return ResultVo.error(202, "验证码错误");
|
|
|
+ }
|
|
|
+ // 删除已使用的验证码
|
|
|
+ deleteVerificationCode(dto.getPhone());
|
|
|
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
|
|
|
userQueryWrapper.eq("phone", dto.getPhone());
|
|
|
log.info("加锁");
|
|
@@ -71,6 +82,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
|
|
String md5Password = Md5Util.MD5(uuid + password);
|
|
|
u.setPassword(md5Password);
|
|
|
u.setPhone(dto.getPhone());
|
|
|
+ u.setEmail(u.getPhone()+"@example.com");
|
|
|
userMapper.insert(u);
|
|
|
return ResultVo.success("注册成功");
|
|
|
} catch (Exception e) {
|
|
@@ -119,7 +131,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
|
|
String encryptedPassword = Md5Util.MD5(salt + password);
|
|
|
if (encryptedPassword.equals(user.getPassword())){
|
|
|
String token = TokenUtils.createJwtToken(user.getId().toString());
|
|
|
- redisTemplate.opsForValue().set("userToken:",token);
|
|
|
+ // 使用用户ID作为键名的一部分
|
|
|
+ redisTemplate.opsForValue().set("userToken:" + user.getId(), token);
|
|
|
+ redisTemplate.expire("userToken:" + user.getId(), 24, TimeUnit.HOURS); // 设置24小时过期
|
|
|
return ResultVo.success(token);
|
|
|
}
|
|
|
return ResultVo.error("用户名或密码有误");
|
|
@@ -133,24 +147,24 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
|
|
}
|
|
|
|
|
|
// 获取验证码
|
|
|
- Integer collect = (Integer) getVerificationCode(dto.getPhone());
|
|
|
- if (collect == null) {
|
|
|
+ Integer code = (Integer) getVerificationCode(dto.getPhone());
|
|
|
+ if (code == null) {
|
|
|
// logger.info("手机号 {} 验证码已过期", dto.getPhone());
|
|
|
return ResultVo.error(201, "验证码已过期");
|
|
|
}
|
|
|
|
|
|
// 验证验证码
|
|
|
- String codeStr = String.valueOf(collect);
|
|
|
+ String codeStr = String.valueOf(code);
|
|
|
String userCode = dto.getCode();
|
|
|
if (userCode == null ||!userCode.matches("\\d{6}")) {
|
|
|
// logger.info("手机号 {} 输入的验证码格式错误", dto.getPhone());
|
|
|
- return ResultVo.error(201, "验证码格式错误");
|
|
|
+ return ResultVo.error(203, "验证码格式错误");
|
|
|
}
|
|
|
|
|
|
if (!codeStr.equals(userCode)) {
|
|
|
// logger.info("手机号 {} 验证码错误,Redis: {}, 用户输入: {}",
|
|
|
// dto.getPhone(), codeStr, userCode);
|
|
|
- return ResultVo.error(201, "验证码错误");
|
|
|
+ return ResultVo.error(202, "验证码错误");
|
|
|
}
|
|
|
|
|
|
// 验证通过后删除验证码
|
|
@@ -177,9 +191,86 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
|
|
|
// redisClient.set("uid", user.getId());
|
|
|
// redisClient.expire("uid", 60*60);
|
|
|
String token = TokenUtils.createJwtToken(user.getId().toString());
|
|
|
- redisTemplate.opsForValue().set("userToken:",token);
|
|
|
+ // 使用用户ID作为键名的一部分
|
|
|
+ redisTemplate.opsForValue().set("userToken:" + user.getId(), token);
|
|
|
+ redisTemplate.expire("userToken:" + user.getId(), 24, TimeUnit.HOURS); // 设置24小时过期
|
|
|
return ResultVo.success(token);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResultVo forget(RegisterDto dto) {
|
|
|
+ QueryWrapper<User> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("phone",dto.getPhone());
|
|
|
+ User user = userMapper.selectOne(queryWrapper);
|
|
|
+ if (user==null){
|
|
|
+ return ResultVo.error("用户不存在");
|
|
|
+ }
|
|
|
+ // 获取验证码
|
|
|
+ Object code = getVerificationCode(dto.getPhone());
|
|
|
+ if (code == null) {
|
|
|
+ return ResultVo.error(201, "验证码已过期");
|
|
|
+ }
|
|
|
+ String codeStr = String.valueOf(code);
|
|
|
+ String userCode = dto.getCode();
|
|
|
+ if (!codeStr.equals(userCode)) {
|
|
|
+ return ResultVo.error(202, "验证码错误");
|
|
|
+ }
|
|
|
+ // 删除已使用的验证码
|
|
|
+ deleteVerificationCode(dto.getPhone());
|
|
|
+ //生成盐值
|
|
|
+ String uuid = UUID.randomUUID().toString().replaceAll("-", "");
|
|
|
+ user.setSalt(uuid);
|
|
|
+ //获取密码
|
|
|
+ String password = dto.getPassword();
|
|
|
+ //加密
|
|
|
+ String md5Password = Md5Util.MD5(uuid + password);
|
|
|
+ user.setPassword(md5Password);
|
|
|
+ userMapper.updateById(user);
|
|
|
+ return ResultVo.success("找回成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResultVo logout(String token) {
|
|
|
+ if (token == null || token.isEmpty()) {
|
|
|
+ return ResultVo.error("无效的token");
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 解析token获取用户ID
|
|
|
+ Long userId = TokenUtils.getUserId(token);
|
|
|
+ if (userId == null) {
|
|
|
+ return ResultVo.error("无效的token");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从Redis删除token
|
|
|
+ redisTemplate.delete("userToken:" + userId);
|
|
|
+
|
|
|
+ // 可以设置token黑名单,防止已注销的token被再次使用
|
|
|
+ String blacklistKey = "token:blacklist:" + token;
|
|
|
+ redisTemplate.opsForValue().set(blacklistKey, "1");
|
|
|
+ redisTemplate.expire(blacklistKey, 24, TimeUnit.HOURS); // 设置黑名单24小时过期
|
|
|
+
|
|
|
+ log.info("用户{}已成功退出登录", userId);
|
|
|
+ return ResultVo.success("退出成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("注销失败", e);
|
|
|
+ return ResultVo.error("注销失败,请稍后再试");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResultVo perfect(String token,PerfectDto dto) {
|
|
|
+ Long userId = TokenUtils.getUserId(token);
|
|
|
+ if (userId==null){
|
|
|
+ return ResultVo.error("用户不存在");
|
|
|
+ }
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ user.setUsername(dto.getUsername());
|
|
|
+ user.setEmail(dto.getEmail());
|
|
|
+ user.setAvatar(dto.getAvatar());
|
|
|
+ userMapper.updateById(user);
|
|
|
+ return ResultVo.success("完善用户信息成功");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|