提交修改

This commit is contained in:
quyixiao 2026-02-11 18:41:59 +08:00
parent 640ef6ab5e
commit bba1fde867

View File

@ -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);
}