From 5431e4bc81c48f22fd12c55d65adf0ad32f3f7b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sun, 21 Sep 2025 09:57:06 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(qr-login):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A7=9F=E6=88=B7ID=E5=AD=97=E6=AE=B5=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?-=20=E5=9C=A8=20QrLoginData=20=E5=92=8C=20QrLoginStatusResponse?= =?UTF-8?q?=20=E4=B8=AD=E6=96=B0=E5=A2=9E=20tenantId=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=94=AF=E6=8C=81=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=9C=BA=E6=99=AF=20-=20=E8=B0=83=E6=95=B4=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=E5=8C=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E6=97=B6=E9=97=B4=E4=BB=A5=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=20Redis=20=E5=BA=8F=E5=88=97=E5=8C=96=20-=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AF=94=E8=BE=83=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E8=BF=87=E6=9C=9F=E5=88=A4=E6=96=AD=E5=87=86?= =?UTF-8?q?=E7=A1=AE=E6=80=A7=20-=20=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E4=BB=8E=20getByIdRel=20=E6=94=B9=E4=B8=BA=20getAllByUserId=20?= =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0=E5=92=8C=20token=E7=94=9F?= =?UTF-8?q?=E6=88=90=E9=80=BB=E8=BE=91=20-=20=E7=A7=BB=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA=EF=BC=8C=E6=B8=85?= =?UTF-8?q?=E7=90=86=E6=97=A0=E7=94=A8=E5=AF=BC=E5=85=A5=E5=92=8C=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20```?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gxwebsoft/auto/dto/QrLoginData.java | 5 ++++ .../auto/dto/QrLoginStatusResponse.java | 7 ++++- .../auto/service/impl/QrLoginServiceImpl.java | 27 +++++++++---------- .../system/controller/UserController.java | 3 --- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java index 20ee1f9..39fadcc 100644 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java +++ b/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java @@ -52,4 +52,9 @@ public class QrLoginData { */ private String accessToken; + /** + * 租户ID + */ + private Integer tenantId; + } diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java index 1eb0d4a..4c9a6f7 100644 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java +++ b/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java @@ -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; + } diff --git a/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java b/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java index cc3f9bb..e9f04c0 100644 --- a/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java +++ b/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java @@ -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); diff --git a/src/main/java/com/gxwebsoft/common/system/controller/UserController.java b/src/main/java/com/gxwebsoft/common/system/controller/UserController.java index 5f7bfd4..81ff503 100644 --- a/src/main/java/com/gxwebsoft/common/system/controller/UserController.java +++ b/src/main/java/com/gxwebsoft/common/system/controller/UserController.java @@ -177,11 +177,8 @@ public class UserController extends BaseController { final Set collect = userList.stream().map(User::getPhone).collect(Collectors.toSet()); final List list = userService.list(new LambdaQueryWrapper().in(User::getPhone, collect).select(User::getPhone)); - System.out.println("list = " + list); final Map> 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("添加成功");