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.Data;
import lombok.NoArgsConstructor; 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访问令牌(确认后生成) * JWT访问令牌(确认后生成)

View File

@@ -1,5 +1,7 @@
package com.gxwebsoft.auto.service.impl; 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.lang.UUID;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.gxwebsoft.auto.dto.*; import com.gxwebsoft.auto.dto.*;
@@ -36,11 +38,11 @@ public class QrLoginServiceImpl implements QrLoginService {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Value("${config.jwt.secret:websoft-jwt-secret-key-2025}") @Value("${config.token-key}")
private String jwtSecret; private String tokenKey;
@Value("${config.jwt.expire:86400}") @Value("${config.token-expire-time:86400}")
private Long jwtExpire; private Long tokenExpireTime;
@Override @Override
public QrLoginGenerateResponse generateQrLoginToken() { public QrLoginGenerateResponse generateQrLoginToken() {
@@ -51,8 +53,8 @@ public class QrLoginServiceImpl implements QrLoginService {
QrLoginData qrLoginData = new QrLoginData(); QrLoginData qrLoginData = new QrLoginData();
qrLoginData.setToken(token); qrLoginData.setToken(token);
qrLoginData.setStatus(QR_LOGIN_STATUS_PENDING); 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设置过期时间 // 存储到Redis设置过期时间
String redisKey = QR_LOGIN_TOKEN_KEY + token; 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 // 删除过期的token
redisUtil.delete(redisKey); redisUtil.delete(redisKey);
return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L); 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(); QrLoginStatusResponse response = new QrLoginStatusResponse();
response.setStatus(qrLoginData.getStatus()); 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); redisUtil.delete(redisKey);
throw new RuntimeException("扫码登录token已过期"); throw new RuntimeException("扫码登录token已过期");
} }
// 获取用户信息 // 获取用户信息
User user = userService.getByIdRel(userId); User user = userService.getAllByUserId(String.valueOf(userId));
if (user == null) { if (user == null) {
throw new RuntimeException("用户不存在"); throw new RuntimeException("用户不存在");
} }
@@ -149,7 +152,7 @@ public class QrLoginServiceImpl implements QrLoginService {
// 生成JWT token // 生成JWT token
JwtSubject jwtSubject = new JwtSubject(user.getUsername(), user.getTenantId()); 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); 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); redisUtil.delete(redisKey);
return false; return false;
} }
@@ -192,7 +195,7 @@ public class QrLoginServiceImpl implements QrLoginService {
qrLoginData.setStatus(QR_LOGIN_STATUS_SCANNED); 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); redisUtil.set(redisKey, qrLoginData, remainingSeconds, TimeUnit.SECONDS);
log.info("扫码登录token {} 状态更新为已扫码", token); log.info("扫码登录token {} 状态更新为已扫码", token);