AuthService.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package com.campus.trade.service;
  2. import com.campus.trade.common.BusinessException;
  3. import com.campus.trade.common.FileUploadUtil;
  4. import com.campus.trade.common.StatusCode;
  5. import com.campus.trade.dto.ChangePasswordRequest;
  6. import com.campus.trade.dto.LoginRequest;
  7. import com.campus.trade.dto.RegisterRequest;
  8. import com.campus.trade.entity.User;
  9. import com.campus.trade.mapper.UserMapper;
  10. import com.campus.trade.vo.UserProfileVO;
  11. import jakarta.servlet.http.HttpSession;
  12. import org.springframework.beans.BeanUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.util.DigestUtils;
  16. import java.nio.charset.StandardCharsets;
  17. @Service
  18. public class AuthService {
  19. @Autowired
  20. private UserMapper userMapper;
  21. @Autowired
  22. private FileUploadUtil fileUploadUtil;
  23. // 用户注册
  24. public Long register(RegisterRequest req) {
  25. // 检查学号是否已注册
  26. User existing = userMapper.selectByStudentId(req.getStudentId());
  27. if (existing != null) {
  28. throw new BusinessException(StatusCode.CONFLICT, "学号已注册");
  29. }
  30. // 上传校园卡照片
  31. String campusCardUrl = null;
  32. if (req.getCampusCardImage() != null && !req.getCampusCardImage().isEmpty()) {
  33. campusCardUrl = fileUploadUtil.upload(req.getCampusCardImage());
  34. }
  35. // MD5 加密密码
  36. String passwordHash = DigestUtils.md5DigestAsHex(
  37. req.getPassword().getBytes(StandardCharsets.UTF_8)
  38. );
  39. // 构建用户实体
  40. User user = new User();
  41. user.setStudentId(req.getStudentId());
  42. user.setName(req.getName());
  43. user.setPasswordHash(passwordHash);
  44. user.setCampusCardUrl(campusCardUrl);
  45. user.setAuthStatus("PENDING"); // 待审核
  46. user.setStatus("NORMAL");
  47. user.setRole("USER");
  48. // 默认昵称为姓名
  49. user.setNickname(req.getName());
  50. userMapper.insert(user);
  51. return user.getId();
  52. }
  53. // 用户登录
  54. public UserProfileVO login(LoginRequest req, HttpSession session) {
  55. User user = userMapper.selectByStudentId(req.getStudentId());
  56. if (user == null) {
  57. throw new BusinessException(StatusCode.BAD_REQUEST, "学号或密码错误");
  58. }
  59. // 检查是否被封禁
  60. if ("BANNED".equals(user.getStatus())) {
  61. throw new BusinessException(StatusCode.FORBIDDEN, "账号已被封禁");
  62. }
  63. // MD5 密码比对
  64. String inputHash = DigestUtils.md5DigestAsHex(
  65. req.getPassword().getBytes(StandardCharsets.UTF_8)
  66. );
  67. if (!inputHash.equals(user.getPasswordHash())) {
  68. throw new BusinessException(StatusCode.BAD_REQUEST, "学号或密码错误");
  69. }
  70. // 创建 Session
  71. session.setAttribute("userId", user.getId());
  72. session.setAttribute("role", user.getRole());
  73. UserProfileVO vo = new UserProfileVO();
  74. BeanUtils.copyProperties(user, vo);
  75. return vo;
  76. }
  77. // 修改密码
  78. public void changePassword(ChangePasswordRequest req, HttpSession session) {
  79. Long userId = (Long) session.getAttribute("userId");
  80. User user = userMapper.selectById(userId);
  81. // 验证旧密码
  82. String oldHash = DigestUtils.md5DigestAsHex(
  83. req.getOldPassword().getBytes(StandardCharsets.UTF_8)
  84. );
  85. if (!oldHash.equals(user.getPasswordHash())) {
  86. throw new BusinessException(StatusCode.BAD_REQUEST, "旧密码错误");
  87. }
  88. // 更新为新密码
  89. String newHash = DigestUtils.md5DigestAsHex(
  90. req.getNewPassword().getBytes(StandardCharsets.UTF_8)
  91. );
  92. user.setPasswordHash(newHash);
  93. userMapper.updatePassword(user);
  94. }
  95. }