package com.campus.trade.service; import com.campus.trade.common.BusinessException; import com.campus.trade.common.FileUploadUtil; import com.campus.trade.common.StatusCode; import com.campus.trade.dto.ChangePasswordRequest; import com.campus.trade.dto.LoginRequest; import com.campus.trade.dto.RegisterRequest; import com.campus.trade.entity.User; import com.campus.trade.mapper.UserMapper; import com.campus.trade.vo.UserProfileVO; import jakarta.servlet.http.HttpSession; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; import java.nio.charset.StandardCharsets; @Service public class AuthService { @Autowired private UserMapper userMapper; @Autowired private FileUploadUtil fileUploadUtil; // 用户注册 public Long register(RegisterRequest req) { // 检查学号是否已注册 User existing = userMapper.selectByStudentId(req.getStudentId()); if (existing != null) { throw new BusinessException(StatusCode.CONFLICT, "学号已注册"); } // 上传校园卡照片 String campusCardUrl = null; if (req.getCampusCardImage() != null && !req.getCampusCardImage().isEmpty()) { campusCardUrl = fileUploadUtil.upload(req.getCampusCardImage()); } // MD5 加密密码 String passwordHash = DigestUtils.md5DigestAsHex( req.getPassword().getBytes(StandardCharsets.UTF_8) ); // 构建用户实体 User user = new User(); user.setStudentId(req.getStudentId()); user.setName(req.getName()); user.setPasswordHash(passwordHash); user.setCampusCardUrl(campusCardUrl); user.setAuthStatus("PENDING"); // 待审核 user.setStatus("NORMAL"); user.setRole("USER"); // 默认昵称为姓名 user.setNickname(req.getName()); userMapper.insert(user); return user.getId(); } // 用户登录 public UserProfileVO login(LoginRequest req, HttpSession session) { User user = userMapper.selectByStudentId(req.getStudentId()); if (user == null) { throw new BusinessException(StatusCode.BAD_REQUEST, "学号或密码错误"); } // 检查是否被封禁 if ("BANNED".equals(user.getStatus())) { throw new BusinessException(StatusCode.FORBIDDEN, "账号已被封禁"); } // MD5 密码比对 String inputHash = DigestUtils.md5DigestAsHex( req.getPassword().getBytes(StandardCharsets.UTF_8) ); if (!inputHash.equals(user.getPasswordHash())) { throw new BusinessException(StatusCode.BAD_REQUEST, "学号或密码错误"); } // 创建 Session session.setAttribute("userId", user.getId()); session.setAttribute("role", user.getRole()); UserProfileVO vo = new UserProfileVO(); BeanUtils.copyProperties(user, vo); return vo; } // 修改密码 public void changePassword(ChangePasswordRequest req, HttpSession session) { Long userId = (Long) session.getAttribute("userId"); User user = userMapper.selectById(userId); // 验证旧密码 String oldHash = DigestUtils.md5DigestAsHex( req.getOldPassword().getBytes(StandardCharsets.UTF_8) ); if (!oldHash.equals(user.getPasswordHash())) { throw new BusinessException(StatusCode.BAD_REQUEST, "旧密码错误"); } // 更新为新密码 String newHash = DigestUtils.md5DigestAsHex( req.getNewPassword().getBytes(StandardCharsets.UTF_8) ); user.setPasswordHash(newHash); userMapper.updatePassword(user); } }