refactor(qr-login): 重构二维码登录功能

- 将 LocalDateTime 替换为 Date 类型- 优化日期处理逻辑,使用 DateUtil 工具类
- 调整日志输出格式
- 重构部分代码结构,提高可读性
This commit is contained in:
2025-09-08 08:01:33 +08:00
parent 8551386af6
commit 630935f0f5
2 changed files with 158 additions and 155 deletions

View File

@@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.Date;
/**
* 扫码登录数据模型
@@ -40,12 +40,12 @@ public class QrLoginData {
/**
* 创建时间
*/
private LocalDateTime createTime;
private Date createTime;
/**
* 过期时间
*/
private LocalDateTime expireTime;
private Date expireTime;
/**
* JWT访问令牌(确认后生成)

View File

@@ -1,5 +1,7 @@
package com.gxwebsoft.auto.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import com.gxwebsoft.auto.dto.*;
@@ -36,11 +38,11 @@ public class QrLoginServiceImpl implements QrLoginService {
@Autowired
private UserService userService;
@Value("${config.jwt.secret:websoft-jwt-secret-key-2025}")
private String jwtSecret;
@Value("${config.token-key}")
private String tokenKey;
@Value("${config.jwt.expire:86400}")
private Long jwtExpire;
@Value("${config.token-expire-time:86400}")
private Long tokenExpireTime;
@Override
public QrLoginGenerateResponse generateQrLoginToken() {
@@ -51,8 +53,8 @@ public class QrLoginServiceImpl implements QrLoginService {
QrLoginData qrLoginData = new QrLoginData();
qrLoginData.setToken(token);
qrLoginData.setStatus(QR_LOGIN_STATUS_PENDING);
qrLoginData.setCreateTime(LocalDateTime.now());
qrLoginData.setExpireTime(LocalDateTime.now().plusSeconds(QR_LOGIN_TOKEN_TTL));
// 五分钟过期
qrLoginData.setExpireTime(DateUtil.offsetSecond(DateUtil.date(), QR_LOGIN_TOKEN_TTL.intValue()));
// 存储到Redis设置过期时间
String redisKey = QR_LOGIN_TOKEN_KEY + token;
@@ -80,14 +82,15 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) {
// 替换第85行代码为以下内容
if (LocalDateTime.now().isAfter(DateUtil.toLocalDateTime(qrLoginData.getExpireTime()))) {
// 删除过期的token
redisUtil.delete(redisKey);
return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L);
}
// 计算剩余过期时间
long expiresIn = ChronoUnit.SECONDS.between(LocalDateTime.now(), qrLoginData.getExpireTime());
long expiresIn = ChronoUnit.SECONDS.between(LocalDateTime.now(), DateUtil.toLocalDateTime(qrLoginData.getExpireTime()));
QrLoginStatusResponse response = new QrLoginStatusResponse();
response.setStatus(qrLoginData.getStatus());
@@ -131,13 +134,13 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) {
if (LocalDateTime.now().isAfter(DateUtil.toLocalDateTime(qrLoginData.getExpireTime()))) {
redisUtil.delete(redisKey);
throw new RuntimeException("扫码登录token已过期");
}
// 获取用户信息
User user = userService.getByIdRel(userId);
User user = userService.getAllByUserId(String.valueOf(userId));
if (user == null) {
throw new RuntimeException("用户不存在");
}
@@ -149,7 +152,7 @@ public class QrLoginServiceImpl implements QrLoginService {
// 生成JWT token
JwtSubject jwtSubject = new JwtSubject(user.getUsername(), user.getTenantId());
String accessToken = JwtUtil.buildToken(jwtSubject, jwtExpire, jwtSecret);
String accessToken = JwtUtil.buildToken(jwtSubject, tokenExpireTime, tokenKey);
// 更新扫码登录数据
qrLoginData.setStatus(QR_LOGIN_STATUS_CONFIRMED);
@@ -182,7 +185,7 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) {
if (LocalDateTime.now().isAfter(DateUtil.toLocalDateTime(qrLoginData.getExpireTime()))) {
redisUtil.delete(redisKey);
return false;
}
@@ -192,7 +195,7 @@ public class QrLoginServiceImpl implements QrLoginService {
qrLoginData.setStatus(QR_LOGIN_STATUS_SCANNED);
// 计算剩余过期时间
long remainingSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), qrLoginData.getExpireTime());
long remainingSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), DateUtil.toLocalDateTime(qrLoginData.getExpireTime()));
redisUtil.set(redisKey, qrLoginData, remainingSeconds, TimeUnit.SECONDS);
log.info("扫码登录token {} 状态更新为已扫码", token);