feat(qr-login): 增加租户ID字段并优化扫码登录逻辑- 在 QrLoginData 和 QrLoginStatusResponse 中新增 tenantId 字段,用于支持多租户场景
- 调整日期时间格式化方式,使用字符串存储时间以兼容 Redis 序列化
-修复时间比较逻辑,确保过期判断准确性
- 更新用户信息获取方法,从 getByIdRel 改为 getAllByUserId
- 优化扫码登录状态更新和 token生成逻辑
- 移除调试日志输出,清理无用导入和代码
```
This commit is contained in:
2025-09-21 09:57:06 +08:00
parent e6dc546965
commit 5431e4bc81
4 changed files with 23 additions and 19 deletions

View File

@@ -52,4 +52,9 @@ public class QrLoginData {
*/
private String accessToken;
/**
* 租户ID
*/
private Integer tenantId;
}

View File

@@ -1,5 +1,7 @@
package com.gxwebsoft.auto.dto;
import com.gxwebsoft.common.system.entity.User;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -24,9 +26,12 @@ public class QrLoginStatusResponse {
private String accessToken;
@Schema(description = "用户信息(仅在confirmed状态时返回)")
private Object userInfo;
private User userInfo;
@Schema(description = "剩余过期时间(秒)")
private Long expiresIn;
@Schema(description = "租户ID")
private Integer tenantId;
}

View File

@@ -6,7 +6,6 @@ import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gxwebsoft.auto.dto.*;
import com.gxwebsoft.auto.service.QrLoginService;
import com.gxwebsoft.common.core.config.ConfigProperties;
@@ -18,7 +17,6 @@ import com.gxwebsoft.common.system.service.UserService;
import com.gxwebsoft.common.system.service.WxService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.io.File;
@@ -60,8 +58,8 @@ public class QrLoginServiceImpl implements QrLoginService {
QrLoginData qrLoginData = new QrLoginData();
qrLoginData.setToken(token);
qrLoginData.setStatus(QR_LOGIN_STATUS_PENDING);
qrLoginData.setCreateTime(DateUtil.date());
qrLoginData.setExpireTime(DateUtil.offsetSecond(DateUtil.date(), QR_LOGIN_TOKEN_TTL.intValue()));
qrLoginData.setCreateTime(DateUtil.formatDateTime(DateUtil.date()));
qrLoginData.setExpireTime(DateUtil.formatDateTime(DateUtil.offsetSecond(DateUtil.date(), QR_LOGIN_TOKEN_TTL.intValue())));
// 存储到Redis设置过期时间
String redisKey = QR_LOGIN_TOKEN_KEY + token;
@@ -106,26 +104,27 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (DateUtil.date().after(qrLoginData.getExpireTime())) {
if (DateUtil.date().after(DateUtil.parseDateTime(qrLoginData.getExpireTime()))) {
// 删除过期的token
redisUtil.delete(redisKey);
return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L);
}
// 计算剩余过期时间
long expiresIn = (qrLoginData.getExpireTime().getTime() - DateUtil.date().getTime()) / 1000;
long expiresIn = (DateUtil.parseDateTime(qrLoginData.getExpireTime()).getTime() - DateUtil.date().getTime()) / 1000;
QrLoginStatusResponse response = new QrLoginStatusResponse();
response.setStatus(qrLoginData.getStatus());
response.setExpiresIn(expiresIn);
response.setTenantId(qrLoginData.getTenantId());
// 如果已确认返回token和用户信息
if (QR_LOGIN_STATUS_CONFIRMED.equals(qrLoginData.getStatus())) {
response.setAccessToken(qrLoginData.getAccessToken());
// 获取用户信息
if (qrLoginData.getUserId() != null) {
User user = userService.getByIdRel(qrLoginData.getUserId());
User user = userService.getAllByUserId("" + qrLoginData.getUserId());
System.out.println("qrLoginData->user = " + user);
if (user != null) {
// 清除敏感信息
user.setPassword(null);
@@ -134,7 +133,7 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 确认后删除token防止重复使用
redisUtil.delete(redisKey);
// redisUtil.delete(redisKey);
}
return response;
@@ -157,7 +156,7 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (DateUtil.date().after(qrLoginData.getExpireTime())) {
if (DateUtil.date().after(DateUtil.parseDateTime(qrLoginData.getExpireTime()))) {
redisUtil.delete(redisKey);
throw new RuntimeException("扫码登录token已过期");
}
@@ -173,7 +172,6 @@ public class QrLoginServiceImpl implements QrLoginService {
throw new RuntimeException("用户已被冻结");
}
System.out.println("扫码登录->user = " + user);
// 生成JWT token
JwtSubject jwtSubject = new JwtSubject(user.getUsername(), user.getTenantId());
String accessToken = JwtUtil.buildToken(jwtSubject, configProperties.getTokenExpireTime(), configProperties.getTokenKey());
@@ -183,9 +181,8 @@ public class QrLoginServiceImpl implements QrLoginService {
qrLoginData.setUserId(userId);
qrLoginData.setUsername(user.getUsername());
qrLoginData.setAccessToken(accessToken);
qrLoginData.setTenantId(user.getTenantId());
System.out.println("qrLoginData = " + qrLoginData);
System.out.println("token = " + token);
System.out.println("getUsername. = " + user.getUsername());
// 更新Redis中的数据
redisUtil.set(redisKey, qrLoginData, 60L, TimeUnit.SECONDS); // 给前端60秒时间获取token
@@ -211,7 +208,7 @@ public class QrLoginServiceImpl implements QrLoginService {
}
// 检查是否过期
if (DateUtil.date().after(qrLoginData.getExpireTime())) {
if (DateUtil.date().after(DateUtil.parseDateTime(qrLoginData.getExpireTime()))) {
redisUtil.delete(redisKey);
return false;
}
@@ -221,7 +218,7 @@ public class QrLoginServiceImpl implements QrLoginService {
qrLoginData.setStatus(QR_LOGIN_STATUS_SCANNED);
// 计算剩余过期时间
long remainingSeconds = (qrLoginData.getExpireTime().getTime() - DateUtil.date().getTime()) / 1000;
long remainingSeconds = (DateUtil.parseDateTime(qrLoginData.getExpireTime()).getTime() - DateUtil.date().getTime()) / 1000;
redisUtil.set(redisKey, qrLoginData, remainingSeconds, TimeUnit.SECONDS);
log.info("扫码登录token {} 状态更新为已扫码", token);

View File

@@ -177,11 +177,8 @@ public class UserController extends BaseController {
final Set<String> collect = userList.stream().map(User::getPhone).collect(Collectors.toSet());
final List<User> list = userService.list(new LambdaQueryWrapper<User>().in(User::getPhone, collect).select(User::getPhone));
System.out.println("list = " + list);
final Map<String, List<User>> phoneCollect = list.stream().collect(Collectors.groupingBy(User::getPhone));
System.out.println("phoneCollect = " + phoneCollect);
userList.removeIf(d -> phoneCollect.containsKey(d.getPhone()));
System.out.println("phoneCollect = " + phoneCollect);
if (userService.saveBatch(userList)) {
return success("添加成功");