refactor(qr-login): 重构二维码登录功能
- 将 LocalDateTime 替换为 Date 类型- 优化日期处理逻辑,使用 DateUtil 工具类 - 调整日志输出格式 - 重构部分代码结构,提高可读性
This commit is contained in:
@@ -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访问令牌(确认后生成)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user