17 Commit-ok f302ead6af ... 2f2cfcc078

Szerző SHA1 Üzenet Dátum
  fuyuchuan 2f2cfcc078 修复工作报告、通知公告微信公众号消息推送显示账号非用户名问题 2 napja
  hanzhengyi 149ef97591 Merge branch 'system-zjy' of uskycloud/usky-cloud into master 2 hete
  zhaojinyu f73f5dfbbc 调整注解 2 hete
  zhaojinyu 171ebb7060 优化为相同操作系统只能存在最新一条token 2 hete
  gez 5aee9d5ee7 Merge branch 'han' of uskycloud/usky-cloud into master 3 hete
  hanzhengyi 9995b37fc7 调整移动端租户切换 3 hete
  zhaojinyu 3676562dbc Merge branch 'system-zjy' of uskycloud/usky-cloud into master 4 hete
  hanzhengyi e7377f51b9 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 4 hete
  zhaojinyu 6c3ee6e670 调整删除历史token方法,解决删除失败报错问题 4 hete
  gez 7fe68c11ee Merge branch 'system-zjy' of uskycloud/usky-cloud into master 1 hónapja
  zhaojinyu bb645c76a2 优化去除代码中无效引用 1 hónapja
  zhaojinyu 5a8766be8f 添加保留用户相同OS和Browser的最新两条token方法 1 hónapja
  zhaojinyu 113af5ba72 Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-cloud into system-zjy 1 hónapja
  hanzhengyi 9bb5414a04 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 1 hónapja
  hanzhengyi f972dd66b7 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 1 hónapja
  gez 02d9877423 Merge branch 'fu-dev' of uskycloud/usky-cloud into master 1 hónapja
  zhaojinyu 7918e6d9b8 操作日志优化获取操作地址,token令牌添加操作系统、浏览器类型字段并优化在线用户接口 1 hónapja
21 módosított fájl, 226 hozzáadás és 39 törlés
  1. 7 0
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysOperLogVO.java
  2. 0 6
      base-modules/service-system/service-system-biz/pom.xml
  3. 1 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/AuthorityConfigController.java
  4. 9 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysMobileMenuMapper.java
  5. 1 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysPlatformMenuMapper.java
  6. 2 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java
  7. 1 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysMobileMenuServiceImpl.java
  8. 1 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java
  9. 17 7
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysPlatformMenuServiceImpl.java
  10. 2 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserOnlineServiceImpl.java
  11. 114 12
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java
  12. 0 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncManager.java
  13. 29 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysMobileMenuMapper.xml
  14. 5 1
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysPlatformMenuMapper.xml
  15. 4 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/SecurityConstants.java
  16. 9 0
      usky-common/usky-common-log/pom.xml
  17. 3 5
      usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/AddressUtils.java
  18. 3 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java
  19. 1 1
      usky-common/usky-common-log/src/main/java/com/usky/common/log/service/WjConfig.java
  20. 6 0
      usky-common/usky-common-security/pom.xml
  21. 11 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/service/TokenService.java

+ 7 - 0
base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysOperLogVO.java

@@ -47,6 +47,9 @@ public class SysOperLogVO extends BaseEntity
     /** 操作地址 */
     private String operIp;
 
+    /** 操作地点 */
+    private String operLocation;
+
     /** 请求参数 */
     private String operParam;
 
@@ -195,6 +198,10 @@ public class SysOperLogVO extends BaseEntity
         this.operIp = operIp;
     }
 
+    public String getOperLocation() { return operLocation; }
+
+    public void setOperLocation(String operLocation) { this.operLocation = operLocation; }
+
     public String getOperParam()
     {
         return operParam;

+ 0 - 6
base-modules/service-system/service-system-biz/pom.xml

@@ -59,12 +59,6 @@
             <artifactId>hutool-all</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.json</groupId>
-            <artifactId>json</artifactId>
-            <version>20210307</version>
-        </dependency>
-
         <!-- 监控服务器资源状态 -->
         <dependency>
             <groupId>com.github.oshi</groupId>

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/AuthorityConfigController.java

@@ -78,7 +78,7 @@ public class AuthorityConfigController {
     @GetMapping("getMobileConfigMenuList")
     public ApiResult<Map<String, Object>> getMobileConfigMenuList(@RequestParam(value = "platformId") Integer platformId,
                                                                      @RequestParam(value = "tenantId") Integer tenantId) {
-        List<SysMobileMenu> menus =sysPlatformMenuService.getMobilePlatformMenuList(platformId);
+        List<SysMobileMenu> menus =sysPlatformMenuService.getMobilePlatformMenuList(tenantId);
         Map<String, Object> ajax = new HashMap<>();
         ajax.put("checkedKeys", sysPlatformMenuService.selectMobilePlatformMenu(tenantId));
         ajax.put("menus", menuService.buildMobileMenuTreeSelect(menus));

+ 9 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysMobileMenuMapper.java

@@ -43,6 +43,15 @@ public interface SysMobileMenuMapper extends CrudMapper<SysMobileMenu> {
      */
     public List<SysMobileMenu> selectMenuTreeByUserId(@Param("userId") long userId);
 
+    /**
+     * 根据用户Id查询菜单
+     *
+     * @param userId 用户Id
+     * @return 菜单列表
+     */
+    public List<SysMobileMenu> selectMenuTreeByUserId1(@Param("userId") long userId,
+                                                       @Param("tenantId") Integer tenantId);
+
     /**
      * 根据租户Id查询菜单
      *

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysPlatformMenuMapper.java

@@ -22,7 +22,7 @@ public interface SysPlatformMenuMapper extends CrudMapper<SysPlatformMenu> {
     List<SysMenu> getMenuList(@Param("platformId") Integer platformId,
                               @Param("menuType") String menuType);
 
-    List<SysMobileMenu> getMobileMenuList(@Param("platformId") Integer platformId,
+    List<SysMobileMenu> getMobileMenuList(@Param("platformIds") List<Integer> platformIds,
                               @Param("menuType") String menuType);
 
     List<SysMenu> getMenuIdList(@Param("menuIds") Long[] menuIds,

+ 2 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceMbuserServiceImpl.java

@@ -135,13 +135,13 @@ public class MceMbuserServiceImpl extends AbstractCrudService<MceMbuserMapper, M
              **/
             case "1":
                 data.put("thing9", new TemplateData("通知公告-" + requestVO.getInfoContent(), "#173177"));
-                data.put("thing8", new TemplateData(requestVO.getUserName(), "#173177"));
+                data.put("thing8", new TemplateData(requestVO.getRealName(), "#173177"));
                 data.put("time12", new TemplateData(nowTime, "#173177"));
                 templateId = constant.WE_CHAT_WORK_TEMPLATE_ID;
                 break;
             case "5":
                 data.put("thing9", new TemplateData("报告提醒-" + requestVO.getInfoContent(), "#173177"));
-                data.put("thing8", new TemplateData(requestVO.getUserName(), "#173177"));
+                data.put("thing8", new TemplateData(requestVO.getRealName(), "#173177"));
                 data.put("time12", new TemplateData(nowTime, "#173177"));
                 // 设置公众号模板消息ID
                 templateId = constant.WE_CHAT_WORK_TEMPLATE_ID;

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysMobileMenuServiceImpl.java

@@ -238,7 +238,7 @@ public class SysMobileMenuServiceImpl extends AbstractCrudService<SysMobileMenuM
         }
         else
         {
-            menus = sysMobileMenuMapper.selectMenuTreeByUserId(userId);
+            menus = sysMobileMenuMapper.selectMenuTreeByUserId1(userId,SecurityUtils.getTenantId());
         }
         return getChildPerms(menus, 0);
     }

+ 1 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysNoticeServiceImpl.java

@@ -107,6 +107,7 @@ public class SysNoticeServiceImpl extends AbstractCrudService<SysNoticeMapper, S
         mceRequestVO.setId(id);
         mceRequestVO.setUserName(userName);
         mceRequestVO.setUserIds(userIds);
+        mceRequestVO.setRealName(SecurityUtils.getLoginUser().getSysUser().getNickName());
         try {
             // mceReceiveService.add(jsonObject.toString());
             mceReceiveService.addMceReceive(mceRequestVO);

+ 17 - 7
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysPlatformMenuServiceImpl.java

@@ -1,14 +1,12 @@
 package com.usky.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.system.domain.SysMenu;
-import com.usky.system.domain.SysMobileMenu;
-import com.usky.system.domain.SysPlatformMenu;
-import com.usky.system.domain.SysTenantMenu;
-import com.usky.system.domain.SysMobileTenantMenu;
+import com.usky.system.domain.*;
 import com.usky.system.mapper.SysPlatformMenuMapper;
+import com.usky.system.mapper.SysTenantPlatformMapper;
 import com.usky.system.service.SysMobileTenantMenuService;
 import com.usky.system.service.SysPlatformMenuService;
 import com.usky.system.service.SysTenantMenuService;
@@ -36,6 +34,9 @@ public class SysPlatformMenuServiceImpl extends AbstractCrudService<SysPlatformM
     @Autowired
     private SysTenantMenuService sysTenantMenuService;
 
+    @Autowired
+    private SysTenantPlatformMapper sysTenantPlatformMapper;
+
     @Autowired
     private SysMobileTenantMenuService sysMobileTenantMenuService;
 
@@ -43,8 +44,17 @@ public class SysPlatformMenuServiceImpl extends AbstractCrudService<SysPlatformM
         return baseMapper.getMenuList(platformId, null);
     }
 
-    public List<SysMobileMenu> getMobilePlatformMenuList(Integer platformId){
-        return baseMapper.getMobileMenuList(platformId, null);
+    public List<SysMobileMenu> getMobilePlatformMenuList(Integer tenantId){
+        LambdaQueryWrapper<SysTenantPlatform> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(SysTenantPlatform::getTenantId,tenantId);
+        List<SysTenantPlatform> list = sysTenantPlatformMapper.selectList(queryWrapper);
+        List<Integer> platformIds = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (int j = 0; j < list.size(); j++) {
+                platformIds.add(list.get(j).getPlatformId());
+            }
+        }
+        return baseMapper.getMobileMenuList(platformIds, null);
     }
 
     public Long[] selectPlatformMenu(Integer tenantId){

+ 2 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserOnlineServiceImpl.java

@@ -90,6 +90,8 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
         sysUserOnline.setIpaddr(user.getIpaddr());
         sysUserOnline.setLoginTime(user.getLoginTime());
         sysUserOnline.setExpireTime(user.getExpireTime());
+        sysUserOnline.setOs(user.getOs());
+        sysUserOnline.setBrowser(user.getBrowser());
         return sysUserOnline;
     }
 }

+ 114 - 12
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java

@@ -1,26 +1,29 @@
 package com.usky.system.service.util;
 
-
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.constant.CacheConstants;
 import com.ruoyi.common.core.constant.Constants;
-import com.ruoyi.common.core.utils.ServletUtils;
 import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.ip.IpUtils;
 import com.usky.common.core.util.SpringContextUtils;
+import com.usky.common.log.aspect.AddressUtils;
+import com.usky.common.redis.core.RedisService;
 import com.usky.system.domain.MceRequestVO;
 import com.usky.system.domain.SysLogininfor;
 import com.usky.system.domain.SysUser;
 import com.usky.system.mapper.SysUserMapper;
+import com.usky.system.model.LoginUser;
 import com.usky.system.service.ISysLogininforService;
-import com.usky.system.service.ISysUserService;
 import com.usky.system.service.MceReceiveService;
 import eu.bitwalker.useragentutils.UserAgent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Collections;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 import static com.usky.common.core.utils.ip.IpUtils.getIpAddr;
 
@@ -29,8 +32,8 @@ import static com.usky.common.core.utils.ip.IpUtils.getIpAddr;
  * @author: XiaoYu
  * @date: 2024/08/20 13:58
  */
-public class AsyncFactory
-{
+@Component
+public class AsyncFactory {
     private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
 
     private static final MceReceiveService mceReceiveService = SpringContextUtils.getBean(MceReceiveService.class);
@@ -80,9 +83,11 @@ public class AsyncFactory
         if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
             logininfor.setStatus(String.valueOf(Constants.LOGIN_SUCCESS_STATUS)); // 使用String.valueOf进行转换
 
-        // 如果登录成功,发送微信公众号消息
+            // 如果登录成功,发送微信公众号消息
             if (Constants.LOGIN_SUCCESS.equals(status)) {
                 sendWeChatMessage(logininfor);
+                // 保留用户相同OS的最新1条token,删除其他所有token
+                SpringContextUtils.getBean(AsyncFactory.class).asyncRetainLatestToken(username);
             }
         } else if (Constants.LOGIN_FAIL.equals(status)) {
             logininfor.setStatus(String.valueOf(Constants.LOGIN_FAIL_STATUS)); // 使用String.valueOf进行转换
@@ -92,10 +97,8 @@ public class AsyncFactory
         SpringContextUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
     }
 
-    public static String getBlock(Object msg)
-    {
-        if (msg == null)
-        {
+    public static String getBlock(Object msg) {
+        if (msg == null) {
             msg = "";
         }
         return "[" + msg.toString() + "]";
@@ -122,4 +125,103 @@ public class AsyncFactory
         mceRequestVO.setIpAddress(logininfor.getIpaddr());
         mceReceiveService.addMceReceive(mceRequestVO);
     }
+
+    /**
+     * 异步清理历史token
+     *
+     * @param username 用户名
+     */
+    @Async
+    public void asyncRetainLatestToken(String username) {
+        try {
+            // 等待2秒
+            TimeUnit.SECONDS.sleep(2);
+            // 调用清理token的方法
+            retainLatestToken(username);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            sys_user_logger.error("异步清理token时发生错误", e);
+        }
+    }
+
+    /**
+     * 保留用户相同OS的最新一个token,删除其他历史token
+     *
+     * @param username 用户名
+     */
+    private static void retainLatestToken(String username) {
+        RedisService redisService = SpringContextUtils.getBean(RedisService.class);
+
+        try {
+            // 获取所有与该用户相关的token键
+            String pattern = CacheConstants.LOGIN_TOKEN_KEY + "*";
+            Collection<String> keys = redisService.keys(pattern);
+            if (keys == null || keys.isEmpty()) {
+                sys_user_logger.warn("Redis密钥为null或为空");
+                return;
+            }
+
+            // 存储该用户的token及其对应的LoginUser对象
+            Map<String, LoginUser> userTokens = new HashMap<>();
+
+            for (String key : keys) {
+                // 检查键是否存在并且未过期
+                if (redisService.hasKey(key)) {
+                    LoginUser user = redisService.getCacheObject(key);
+                    sys_user_logger.info("从Redis获取的LoginUser对象: {}", user);
+                    if (user != null && username.equals(user.getUsername())) {
+                        userTokens.put(key, user);
+                    }
+                }
+            }
+
+            if (userTokens.isEmpty()) {
+                sys_user_logger.warn("未找到用户 {} 的任何token", username);
+                return;
+            }
+
+            // 分组逻辑:根据OS分组
+            Map<String, List<Map.Entry<String, LoginUser>>> groupedTokens = new HashMap<>();
+            for (Map.Entry<String, LoginUser> entry : userTokens.entrySet()) {
+                LoginUser loginUser = entry.getValue();
+                String os = StringUtils.isEmpty(loginUser.getOs()) ? "未知" : loginUser.getOs();
+                groupedTokens.computeIfAbsent(os, k -> new ArrayList<>()).add(entry);
+            }
+
+            // 删除列表
+            List<String> tokensToDelete = new ArrayList<>();
+            for (List<Map.Entry<String, LoginUser>> entryList : groupedTokens.values()) {
+                // 按照登录时间降序排序
+                entryList.sort((e1, e2) ->
+                        e2.getValue().getLoginTime().compareTo(e1.getValue().getLoginTime())
+                );
+
+                // 只保留最新的一个token,其余的都添加到tokensToDelete列表中
+                for (int i = 1; i < entryList.size(); i++) {
+                    String keyToDelete = entryList.get(i).getKey();
+                    tokensToDelete.add(keyToDelete);
+                }
+            }
+
+            // 删除其他token
+            sys_user_logger.info("要删除的token列表: {}", tokensToDelete);
+            for (String keyToDelete : tokensToDelete) {
+                if (keyToDelete != null) {
+                    // 再次检查键是否存在
+                    if (redisService.hasKey(keyToDelete)) {
+                        boolean deleted = redisService.deleteObject(keyToDelete);
+                        sys_user_logger.info("Deleted Token Key: " + keyToDelete + ", Result: " + deleted);
+                    } else {
+                        sys_user_logger.warn("尝试删除的token键 {} 不存在,跳过删除操作", keyToDelete);
+                    }
+                } else {
+                    sys_user_logger.warn("尝试删除的token键为null,跳过删除操作");
+                }
+            }
+
+            sys_user_logger.info("用户 {} 的token已清理,仅保留每种OS的最新token: 已删除{}个", username, tokensToDelete.size());
+        } catch (Exception ex) {
+            sys_user_logger.error("清理用户 {} 的token时发生错误", username, ex);
+        }
+    }
 }

+ 0 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncManager.java

@@ -3,8 +3,6 @@ package com.usky.system.service.util;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.annotation.PreDestroy;
 import javax.servlet.http.HttpServletRequest;

+ 29 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysMobileMenuMapper.xml

@@ -139,6 +139,35 @@
         order by m.parent_id, m.order_num
     </select>
 
+    <select id="selectMenuTreeByUserId1" resultMap="BaseResultMap">
+        select distinct m.menu_id,
+                        m.parent_id,
+                        m.menu_name,
+                        rm.menu_alias_name,
+                        m.path,
+                        m.component,
+                        m.visible,
+                        m.status,
+                        ifnull(m.perms, '') as perms,
+                        m.is_frame,
+                        m.is_cache,
+                        m.menu_type,
+                        m.icon,
+                        m.order_num,
+                        m.create_time
+        from sys_mobile_menu m
+                 left join sys_mobile_role_menu rm on m.menu_id = rm.menu_id
+                 left join sys_user_role ur on rm.role_id = ur.role_id
+                 left join sys_role ro on ur.role_id = ro.role_id
+                 left join sys_user u on ur.user_id = u.user_id
+        where ur.user_id = #{userId}
+          and ur.tenant_id = #{tenantId}
+          and m.menu_type in ('M', 'C')
+          and m.status = 0
+          AND ro.status = 0
+        order by m.parent_id, m.order_num
+    </select>
+
     <select id="selectMenuTreeByUserIdOne" resultMap="BaseResultMap">
         SELECT
             m.menu_id,

+ 5 - 1
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysPlatformMenuMapper.xml

@@ -29,10 +29,14 @@
         sys_mobile_menu AS a
         JOIN sys_mobile_platform_menu AS b ON a.menu_id = b.menu_id
         WHERE
-        b.platform_id = #{platformId}
+        b.platform_id IN
+        <foreach collection="platformIds" item="item" open="(" separator="," close=")">
+            ${item}
+        </foreach>
         <if test="menuType != null and menuType != ''">
             AND a.menu_type = #{menuType}
         </if>
+        group by a.menu_id
         order by a.parent_id, a.order_num
     </select>
 

+ 4 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/SecurityConstants.java

@@ -43,4 +43,8 @@ public class SecurityConstants
     public static final String LOGIN_USER = "login_user";
 
     public static final String DETAILS_TENANT_ID = "";
+
+    public static final String DETAILS_OS =  "osInfo";
+
+    public static final String DETAILS_BROWSER = "browserInfo";
 }

+ 9 - 0
usky-common/usky-common-log/pom.xml

@@ -24,6 +24,15 @@
             <groupId>com.usky</groupId>
             <artifactId>usky-common-security</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20210307</version>
+        </dependency>
 
     </dependencies>
 </project>

+ 3 - 5
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AddressUtils.java → usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/AddressUtils.java

@@ -1,14 +1,12 @@
-package com.usky.system.service.util;
+package com.usky.common.log.aspect;
 
 import cn.hutool.http.HttpUtil;
-import com.alibaba.nacos.shaded.com.google.common.base.Strings;
 import com.ruoyi.common.core.utils.ip.IpUtils;
-import com.usky.system.domain.WjConfig;
+import com.usky.common.log.service.WjConfig;
 import org.json.JSONException;
+import org.json.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-import org.json.JSONObject;
 
 
 /*

+ 3 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java

@@ -103,6 +103,9 @@ public class LogAspect {
             operLog.setConsumingTime(consumingTime); // 存储耗时
             operLog.setConsumingTimeWithUnit(consumingTimeWithUnit); // 存储带有单位的字符串
 
+            String operLocation = AddressUtils.getRealAddressByIP(ip);
+            operLog.setOperLocation(operLocation);
+
             // 保存数据库
             asyncLogService.saveSysLog(operLog);
         } catch (Exception exp) {

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/WjConfig.java → usky-common/usky-common-log/src/main/java/com/usky/common/log/service/WjConfig.java

@@ -1,4 +1,4 @@
-package com.usky.system.domain;
+package com.usky.common.log.service;
 
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;

+ 6 - 0
usky-common/usky-common-security/pom.xml

@@ -36,6 +36,12 @@
             <groupId>com.usky</groupId>
             <artifactId>usky-common-redis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 11 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/service/TokenService.java

@@ -6,6 +6,7 @@ import com.usky.common.core.util.*;
 import com.usky.common.redis.core.RedisHelper;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.model.LoginUser;
+import eu.bitwalker.useragentutils.UserAgent;
 import org.springframework.cloud.commons.util.IdUtils;
 import org.springframework.stereotype.Component;
 
@@ -50,6 +51,14 @@ public class TokenService {
         loginUser.setUserid(userId);
         loginUser.setUsername(userName);
         loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        // 获取操作系统信息
+        String userAgentString = ServletUtils.getRequest().getHeader("User-Agent");
+        UserAgent userAgent = UserAgent.parseUserAgentString(userAgentString);
+        String osInfo = userAgent.getOperatingSystem().getName();
+        String browserInfo = userAgent.getBrowser().getName();
+        loginUser.setOs(osInfo);
+        loginUser.setBrowser(browserInfo);
+
         refreshToken(loginUser);
 
         // Jwt存储信息
@@ -58,6 +67,8 @@ public class TokenService {
         claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
         claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
         claimsMap.put(SecurityConstants.DETAILS_TENANT_ID, tenantId);
+        claimsMap.put(SecurityConstants.DETAILS_OS, osInfo);
+        claimsMap.put(SecurityConstants.DETAILS_BROWSER, browserInfo);
 
         // 接口返回信息
         Map<String, Object> rspMap = new HashMap<String, Object>();