diff --git a/xianyu-server/src/main/java/top/biwin/xinayu/server/controller/OrderController.java b/xianyu-server/src/main/java/top/biwin/xinayu/server/controller/OrderController.java index d60024c..1dd2532 100644 --- a/xianyu-server/src/main/java/top/biwin/xinayu/server/controller/OrderController.java +++ b/xianyu-server/src/main/java/top/biwin/xinayu/server/controller/OrderController.java @@ -14,7 +14,6 @@ import top.biwin.xinayu.common.dto.response.OrderResponse; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * TODO diff --git a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/AuthService.java b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/AuthService.java index b569c4c..6336259 100644 --- a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/AuthService.java +++ b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/AuthService.java @@ -64,9 +64,6 @@ public class AuthService { public LoginResponse login(LoginRequest request) { AdminUser user = null; - // TODO: 主人,这里判断使用哪种登录方式! - // 根据 request 中的字段判断登录类型,然后调用对应的认证方法 - if (StringUtils.hasText(request.getUsername()) && StringUtils.hasText(request.getPassword())) { // 方式1:用户名 + 密码登录 user = authenticateByUsername(request.getUsername(), request.getPassword()); @@ -89,10 +86,6 @@ public class AuthService { .build(); } - // TODO: 主人,这里生成 JWT Token 并构建响应! - // 1. 使用 user.getUsername() 生成 accessToken 和 refreshToken - // 2. 调用 buildLoginResponse() 方法构建包含完整用户信息的响应 - // 生成 JWT Token String accessToken = jwtUtil.generateAccessToken(user.getUsername()); String refreshToken = jwtUtil.generateRefreshToken(user.getUsername()); @@ -110,12 +103,6 @@ public class AuthService { * @return AdminUser 用户实体 */ private AdminUser authenticateByUsername(String username, String password) { - // TODO: 主人,这里使用 Spring Security 的 AuthenticationManager 进行认证! - // 步骤: - // 1. 创建 UsernamePasswordAuthenticationToken - // 2. 调用 authenticationManager.authenticate(authToken) - // 3. 认证成功后,从数据库查询用户信息并返回 - UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password); Authentication authentication = authenticationManager.authenticate(authToken); @@ -133,15 +120,6 @@ public class AuthService { * @return AdminUser 用户实体 */ private AdminUser authenticateByEmail(String email, String password) { - // TODO: 主人,这里验证邮箱和密码! - // 步骤: - // 1. 通过邮箱查询用户:adminUserRepository.findByEmail(email) - // 2. 如果用户不存在,抛出 BadCredentialsException - // 3. 验证密码:passwordEncoder.matches(password, user.getPasswordHash()) - // 4. 如果密码错误,抛出 BadCredentialsException - // 5. 检查账号是否激活 - // 6. 返回用户实体 - AdminUser user = adminUserRepository.findByEmail(email) .orElseThrow(() -> new BadCredentialsException("邮箱或密码错误")); @@ -166,14 +144,6 @@ public class AuthService { * @return AdminUser 用户实体 */ private AdminUser authenticateByEmailCode(String email, String code) { - // TODO: 主人,这里验证邮箱验证码! - // 步骤: - // 1. 调用 emailVerificationService.verifyCode(email, code) 验证验证码 - // 2. 如果验证失败,抛出 BadCredentialsException - // 3. 通过邮箱查询用户 - // 4. 检查账号是否激活 - // 5. 返回用户实体 - // 验证验证码 if (!emailVerificationService.verifyCode(email, code)) { throw new BadCredentialsException("验证码无效或已过期"); @@ -202,7 +172,6 @@ public class AuthService { */ private LoginResponse buildLoginResponse(AdminUser user, String accessToken, String refreshToken, Long expiresIn) { - // TODO: 主人,这里构建包含完整用户信息的响应! // 将 user 实体的信息映射到 LoginResponse 的各个字段 LoginResponse response = new LoginResponse(); diff --git a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/CaptchaService.java b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/CaptchaService.java index 01a4473..8ac5638 100644 --- a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/CaptchaService.java +++ b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/CaptchaService.java @@ -52,15 +52,6 @@ public class CaptchaService { * @return CaptchaResponse 包含验证码ID和Base64图片 */ public CaptchaResponse generateCaptcha(String sessionId) { - // TODO: 主人,这里使用 Hutool 生成验证码! - // 步骤: - // 1. 使用 CaptchaUtil.createLineCaptcha(宽, 高, 验证码长度, 干扰线数量) - // 2. 生成唯一的 captchaId(使用 UUID) - // 3. 获取验证码文本:captcha.getCode() - // 4. 存储验证码到内存,设置过期时间 - // 5. 获取Base64图片:captcha.getImageBase64Data() - // 6. 返回 CaptchaResponse - // 创建线性验证码(宽120,高40,4位验证码,50条干扰线) LineCaptcha captcha = CaptchaUtil.createLineCaptcha(120, 40, CAPTCHA_LENGTH, 50); @@ -93,13 +84,6 @@ public class CaptchaService { * @return 是否验证成功 */ public boolean verifyCaptcha(String captchaId, String userInput) { - // TODO: 主人,这里验证验证码是否正确! - // 步骤: - // 1. 从 captchaStore 获取验证码数据 - // 2. 检查是否存在 - // 3. 检查是否过期 - // 4. 比较验证码(不区分大小写) - // 5. 验证成功后立即删除(一次性使用) if (captchaId == null || userInput == null) { log.warn("⚠️ 验证码参数为空"); @@ -142,8 +126,6 @@ public class CaptchaService { */ @Scheduled(fixedRate = 60000) public void cleanExpiredCaptcha() { - // TODO: 主人,这里清理过期的验证码! - // 遍历 captchaStore,删除过期的验证码 LocalDateTime now = LocalDateTime.now(); int removedCount = 0; diff --git a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/EmailVerificationService.java b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/EmailVerificationService.java index ca42a6f..a60744d 100644 --- a/xianyu-server/src/main/java/top/biwin/xinayu/server/service/EmailVerificationService.java +++ b/xianyu-server/src/main/java/top/biwin/xinayu/server/service/EmailVerificationService.java @@ -57,15 +57,6 @@ public class EmailVerificationService { */ @Transactional public void generateAndSendCode(String email) { - // TODO: 主人,这里需要实现防止频繁发送的逻辑! - // 步骤: - // 1. 查询该邮箱最新的验证码:codeRepository.findFirstByEmailOrderByCreatedAtDesc(email) - // 2. 如果存在且创建时间距今小于 resendIntervalSeconds 秒,则抛出异常 - // 3. 生成6位随机数字验证码:调用 generateCode() 方法 - // 4. 计算过期时间:LocalDateTime.now().plusMinutes(expirationMinutes) - // 5. 创建 EmailVerificationCode 实体并保存 - // 6. 调用 emailService.sendVerificationCode(email, code) 发送邮件 - // 防止频繁发送 Optional latestCode = codeRepository.findFirstByEmailOrderByCreatedAtDesc(email); if (latestCode.isPresent()) { @@ -105,14 +96,7 @@ public class EmailVerificationService { */ @Transactional public boolean verifyCode(String email, String code) { - // TODO: 主人,这里需要验证验证码是否有效! - // 步骤: - // 1. 查询未使用且未过期的验证码:codeRepository.findByEmailAndCodeAndIsUsedFalseAndExpiresAtAfter(...) - // 2. 如果不存在,返回 false - // 3. 如果存在,标记为已使用:verificationCode.setIsUsed(true) - // 4. 保存:codeRepository.save(verificationCode) - // 5. 返回 true - + LocalDateTime now = LocalDateTime.now(); Optional verificationCodeOpt = codeRepository.findByEmailAndCodeAndIsUsedFalseAndExpiresAtAfter(email, code, now); @@ -137,9 +121,7 @@ public class EmailVerificationService { * @return 验证码字符串 */ private String generateCode() { - // TODO: 主人,这里生成随机数字验证码! - // 提示:使用 StringBuilder 和 RANDOM.nextInt(10) 生成 codeLength 位数字 - + StringBuilder code = new StringBuilder(); for (int i = 0; i < codeLength; i++) { code.append(RANDOM.nextInt(10)); @@ -152,9 +134,7 @@ public class EmailVerificationService { */ @Transactional public void cleanupExpiredCodes() { - // TODO: 主人,这里可以实现定时清理过期验证码的逻辑! - // 调用:codeRepository.deleteByExpiresAtBefore(LocalDateTime.now()) - + LocalDateTime now = LocalDateTime.now(); codeRepository.deleteByExpiresAtBefore(now); log.info("🧹 已清理过期验证码");