Pu Zhibing
2025-03-31 97d99b76bdde8952cf257c3c85c1a8a080927af4
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -30,6 +30,7 @@
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.redisson.RedissonLock;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@@ -131,39 +132,52 @@
      }
      String openid = map.get("openid").toString();
      String sessionKey = map.get("sessionKey").toString();
      //查询用户是否注册,没有注册则跳转到注册页面
      AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
      if(null == appUser){
         String decrypt = WXCore.decrypt(appletLogin.getEncryptedData_phone(), sessionKey, appletLogin.getIv_phone());
         if (StringUtils.isEmpty(decrypt)) {
            return R.fail("获取手机信息失败");
         }
         JSONObject phone = JSON.parseObject(decrypt);
         String purePhoneNumber = phone.getString("purePhoneNumber");
         LoginVo loginVo = new LoginVo();
         loginVo.setSkipPage(2);
         loginVo.setPhone(purePhoneNumber);
         return R.ok(loginVo);
      }
      //账户被冻结,给出提示
      if(2 == appUser.getStatus()){
         return R.fail("账户已被冻结,请联系管理员!");
      }
      LoginVo loginVo = new LoginVo();
      loginVo.setSkipPage(1);
      loginVo.setFirstTime(false);
      loginVo.setPhone(appUser.getPhone());
      //构建token
      LoginUser loginUser = new LoginUser();
      loginUser.setUserid(appUser.getId());
      loginUser.setUsername(appUser.getName());
      Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
      loginVo.setToken(tokenApplet.get("access_token").toString());
      loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
      
      appUser.setLastLoginTime(LocalDateTime.now());
      this.updateById(appUser);
      return R.ok(loginVo);
      String key = "login:" + openid;
      Boolean hasKey = redisService.lock(key);
      if(hasKey){
         try {
            //查询用户是否注册,没有注册则跳转到注册页面
            AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0));
            if(null == appUser){
               String decrypt = WXCore.decrypt(appletLogin.getEncryptedData_phone(), sessionKey, appletLogin.getIv_phone());
               if (StringUtils.isEmpty(decrypt)) {
                  return R.fail("获取手机信息失败");
               }
               JSONObject phone = JSON.parseObject(decrypt);
               String purePhoneNumber = phone.getString("purePhoneNumber");
               loginVo.setSkipPage(2);
               loginVo.setPhone(purePhoneNumber);
               return R.ok(loginVo);
            }
            //账户被冻结,给出提示
            if(2 == appUser.getStatus()){
               return R.fail("账户已被冻结,请联系管理员!");
            }
            loginVo.setSkipPage(1);
            loginVo.setFirstTime(false);
            loginVo.setPhone(appUser.getPhone());
            //构建token
            LoginUser loginUser = new LoginUser();
            loginUser.setUserid(appUser.getId());
            loginUser.setUsername(appUser.getName());
            Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser);
            loginVo.setToken(tokenApplet.get("access_token").toString());
            loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
            appUser.setLastLoginTime(LocalDateTime.now());
            this.updateById(appUser);
            return R.ok(loginVo);
         }catch (Exception e){
            e.printStackTrace();
         }finally {
            redisService.unlock(key);
         }
      }else{
         return R.fail("请稍后重试");
      }
      return R.fail("登录失败");
   }