init
This commit is contained in:
parent
463b19a049
commit
14c753af24
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<EmailVerificationCode> 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<EmailVerificationCode> 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("🧹 已清理过期验证码");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user