From 728a54cc02ff66e38bc8719ecc0f3155e597084c Mon Sep 17 00:00:00 2001
From: zhangmei <645025773@qq.com>
Date: 星期五, 14 二月 2025 15:27:56 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/xiaochen991015/xizang into xizang-changyun

---
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
index d4e744e..a7a640b 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -4,6 +4,8 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
+
+import com.ruoyi.common.core.domain.model.LoginUserApplet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,6 +68,15 @@
         return getLoginUser(ServletUtils.getRequest());
     }
     /**
+     * 小程序获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUserApplet getLoginUserApplet()
+    {
+        return getLoginUserApplet(ServletUtils.getRequest());
+    }
+    /**
      * 获取用户身份信息
      *
      * @return 用户信息
@@ -83,6 +94,33 @@
                 String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
                 String userKey = getTokenKey(uuid);
                 LoginUser user = redisCache.getCacheObject(userKey);
+                return user;
+            }
+            catch (Exception e)
+            {
+                log.error("获取用户信息异常'{}'", e.getMessage());
+            }
+        }
+        return null;
+    }
+    /**
+     * 小程序获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUserApplet getLoginUserApplet(HttpServletRequest request)
+    {
+        // 获取请求携带的令牌
+        String token = getToken(request);
+        if (StringUtils.isNotEmpty(token))
+        {
+            try
+            {
+                Claims claims = parseToken(token);
+                // 解析对应的权限以及用户信息
+                String uuid = (String) claims.get(Constants.LOGIN_USER_APPLET_KEY);
+                String userKey = getTokenKey(uuid);
+                LoginUserApplet user = redisCache.getCacheObject(userKey);
                 return user;
             }
             catch (Exception e)
@@ -133,6 +171,23 @@
         claims.put(Constants.LOGIN_USER_KEY, token);
         return createToken(claims);
     }
+    /**
+     * 创建用户小程序令牌
+     *
+     * @param loginUser 用户信息
+     * @return 令牌
+     */
+    public String createTokenApplet(LoginUserApplet loginUser)
+    {
+        String token = IdUtils.fastUUID();
+        loginUser.setToken(token);
+        setUserAgentApplet(loginUser);
+        refreshTokenApplet(loginUser);
+
+        Map<String, Object> claims = new HashMap<>();
+        claims.put(Constants.LOGIN_USER_APPLET_KEY, token);
+        return createTokenApplet(claims);
+    }
 
     /**
      * 验证令牌有效期,相差不足20分钟,自动刷新缓存
@@ -149,6 +204,21 @@
             refreshToken(loginUser);
         }
     }
+    /**
+     * 小程序验证令牌有效期,相差不足20分钟,自动刷新缓存
+     *
+     * @param loginUser
+     * @return 令牌
+     */
+    public void verifyTokenApplet(LoginUserApplet loginUser)
+    {
+        long expireTime = loginUser.getExpireTime();
+        long currentTime = System.currentTimeMillis();
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
+        {
+            refreshTokenApplet(loginUser);
+        }
+    }
 
     /**
      * 刷新令牌有效期
@@ -156,6 +226,19 @@
      * @param loginUser 登录信息
      */
     public void refreshToken(LoginUser loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 根据uuid将loginUser缓存
+        String userKey = getTokenKey(loginUser.getToken());
+        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }
+    /**
+     * 刷新令牌有效期
+     *
+     * @param loginUser 登录信息
+     */
+    public void refreshTokenApplet(LoginUserApplet loginUser)
     {
         loginUser.setLoginTime(System.currentTimeMillis());
         loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
@@ -178,6 +261,20 @@
         loginUser.setBrowser(userAgent.getBrowser().getName());
         loginUser.setOs(userAgent.getOperatingSystem().getName());
     }
+    /**
+     * 设置用户代理信息
+     *
+     * @param loginUser 登录信息
+     */
+    public void setUserAgentApplet(LoginUserApplet loginUser)
+    {
+        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
+        String ip = IpUtils.getIpAddr();
+        loginUser.setIpaddr(ip);
+        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
+        loginUser.setBrowser(userAgent.getBrowser().getName());
+        loginUser.setOs(userAgent.getOperatingSystem().getName());
+    }
 
     /**
      * 从数据声明生成令牌
@@ -192,6 +289,19 @@
                 .signWith(SignatureAlgorithm.HS512, secret).compact();
         return token;
     }
+    /**
+     * 小程序从数据声明生成令牌
+     *
+     * @param claims 数据声明
+     * @return 令牌
+     */
+    private String createTokenApplet(Map<String, Object> claims)
+    {
+        String token = Jwts.builder()
+                .setClaims(claims)
+                .signWith(SignatureAlgorithm.HS512, secret).compact();
+        return token;
+    }
 
     /**
      * 从令牌中获取数据声明

--
Gitblit v1.7.1