From bba1fde867d624fa5d5911ac23c6fba4b768b13f Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Wed, 11 Feb 2026 18:41:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/vv/AppUserLoginController.java | 74 ++++++++++++++++--- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java index b51317f..f7eea92 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppUserLoginController.java @@ -31,6 +31,12 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; +/** + * App用户登录控制器 + * 提供用户登录、匿名登录、用户信息更新等功能 + * + * @author heyu + */ @Slf4j @RestController @RequestMapping("/app/user") @@ -58,59 +64,107 @@ public class AppUserLoginController { private VvActivityDao vvActivityDao; + /** + * 微信用户登录 + * 通过微信授权码进行登录,如果用户不存在则自动注册 + * + * @param request 登录请求参数,包含微信授权code和token + * @return 登录结果,包含买家信息和token + */ // http://localhost:8888/app/user/login @RequestMapping("/login") @Describe("微信用户登录") public R login(@RequestBody AppUserLoginRequest request) { + log.info("[微信用户登录] 开始处理登录请求, code={}", request.getCode()); + + // 通过微信授权码获取openId和sessionKey WeiChatLoginDTO weiChatLoginDTO = weChatUtils.getOpenId(request.getCode()); if (weiChatLoginDTO == null) { + log.warn("[微信用户登录] 微信授权码失效, code={}", request.getCode()); return R.error("code 失效"); } + + log.info("[微信用户登录] 获取微信用户信息成功, openid={}", weiChatLoginDTO.getOpenid()); + + // 根据openId查询用户信息 VvBuyerEntity target = vvBuyerDao.selectVvBuyerOpenId(weiChatLoginDTO.getOpenid()); if (target == null) { + log.info("[微信用户登录] 新用户注册, openid={}", weiChatLoginDTO.getOpenid()); target = new VvBuyerEntity(); target.setOpenid(weiChatLoginDTO.getOpenid()); target.setIsTest(0); target.setCreateTimestamp(System.currentTimeMillis()); + } else { + log.info("[微信用户登录] 老用户登录, buyerId={}, openid={}", target.getId(), weiChatLoginDTO.getOpenid()); } + + // 更新sessionKey target.setSessionKey(weiChatLoginDTO.getSessionKey()); vvBuyerDao.insertOrUpdateVvBuyer(target); - // 默认24 小时 - BuyerDTO buyerDTO = buildBuyerLoginInfoCacheRedisDB(target, RedisUtils.DEFAULT_EXPIRE, null,1); - insertPromoter(request.getToken(),buyerDTO); + + // 构建买家信息并缓存到Redis,默认24小时 + BuyerDTO buyerDTO = buildBuyerLoginInfoCacheRedisDB(target, RedisUtils.DEFAULT_EXPIRE, null, 1); + log.info("[微信用户登录] 用户登录成功, buyerId={}, token={}", buyerDTO.getBuyerId(), buyerDTO.getToken()); + + // 处理推广关系 + insertPromoter(request.getToken(), buyerDTO); + return R.ok().put("buyer", buyerDTO); } + /** + * 匿名用户登录 + * 允许用户在不进行微信授权的情况下使用部分功能 + * 使用设备ID进行身份识别,token有效期较短(30分钟) + * + * @param request 匿名登录请求参数,包含设备ID和token + * @return 登录结果,包含买家信息和token + */ // http://localhost:8888/app/user/anonymous/login @RequestMapping("/anonymous/login") @Describe("匿名用户登录") public R anonymousLogin(@RequestBody VvAnonymousUserLoginRequest request) { + log.info("[匿名用户登录] 开始处理匿名登录请求, deviceId={}, token={}", request.getDeviceId(), request.getToken()); + + // 解密并验证设备ID String deviceId = request.getDeviceId(); String value = AesUtil.decrypt(deviceId, ApiConstants.AnonymousUserLogin_aes_password); if (StringUtils.isBlank(value) || !value.startsWith(ApiConstants.AnonymousUserLogin_pre)) { - log.info("AnonymousUserLoginAesPassword anonymous value:{}", JSON.toJSONString(request)); + log.warn("[匿名用户登录] 设备号验证失败, deviceId={}, decryptValue={}", deviceId, value); return R.error("设备号不对"); } + + log.info("[匿名用户登录] 设备号验证通过, decryptValue={}", value); + BuyerDTO buyerDTO = null; + // 尝试从Redis获取已登录的用户信息 String activityInfoStr = redisUtils.get(request.getToken()); if (StringUtils.isNotEmpty(activityInfoStr)) { buyerDTO = JSONObject.parseObject(activityInfoStr, BuyerDTO.class); - // 真实用户登录 - if(buyerDTO.getBuyerId() > 0 ){ + log.info("[匿名用户登录] 从token中获取到用户信息, buyerId={}", buyerDTO.getBuyerId()); + + // 如果是真实用户(buyerId > 0),重新构建登录信息 + if (buyerDTO.getBuyerId() > 0) { VvBuyerEntity target = vvBuyerDao.selectVvBuyerById(buyerDTO.getBuyerId()); - buyerDTO = buildBuyerLoginInfoCacheRedisDB(target, RedisUtils.DEFAULT_EXPIRE, null,1); + buyerDTO = buildBuyerLoginInfoCacheRedisDB(target, RedisUtils.DEFAULT_EXPIRE, null, 1); + log.info("[匿名用户登录] 真实用户登录, buyerId={}", buyerDTO.getBuyerId()); } } - // 假登陆 - if(buyerDTO == null){ + // 如果没有用户信息,创建匿名用户(buyerId=0) + if (buyerDTO == null) { + log.info("[匿名用户登录] 创建匿名用户, deviceId={}", deviceId); VvBuyerEntity target = new VvBuyerEntity(); target.setId(0L); target.setIsTest(0); buyerDTO = buildBuyerLoginInfoCacheRedisDB(target, RedisUtils.thirty_minute, request.getDeviceId(), 0); } - insertPromoter(request.getToken(),buyerDTO); + log.info("[匿名用户登录] 登录成功, buyerId={}, loginType={}, token={}", + buyerDTO.getBuyerId(), buyerDTO.getLoginType(), buyerDTO.getToken()); + + // 处理推广关系 + insertPromoter(request.getToken(), buyerDTO); return R.ok().put("buyer", buyerDTO); }