Ver Fonte

Merge branch 'system-zjy' of uskycloud/usky-cloud into master

gez há 6 meses atrás
pai
commit
9de2fdc1e1

+ 26 - 0
base-modules/service-system/service-system-api/src/main/java/com/usky/system/model/LoginUser.java

@@ -69,6 +69,15 @@ public class LoginUser implements Serializable {
      */
     private String userType;
 
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
 
     /**
      * 用户人员信息
@@ -170,4 +179,21 @@ public class LoginUser implements Serializable {
     public void setSysUser(SysUserVO sysUser) {
         this.sysUser = sysUser;
     }
+
+    public String getBrowser() {
+        return browser;
+    }
+
+    public void setBrowser(String browser) {
+        this.browser = browser;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os)
+    {
+        this.os = os;
+    }
 }

+ 105 - 22
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserOnlineController.java

@@ -1,13 +1,12 @@
 package com.usky.system.controller.web;
 
 import java.util.*;
+import java.util.List;
+import java.util.stream.Collectors;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.constants.CacheConstants;
 import com.usky.common.core.utils.StringUtils;
-import com.usky.common.log.annotation.Log;
-import com.usky.common.log.enums.BusinessType;
 import com.usky.common.redis.core.RedisService;
-import com.usky.common.security.annotation.RequiresPermissions;
 import com.usky.system.controller.web.page.TableDataInfo;
 import com.usky.system.domain.SysUserOnline;
 import com.usky.system.model.LoginUser;
@@ -44,12 +43,14 @@ public class SysUserOnlineController {
 
     @GetMapping("/list")
     public ApiResult<TableDataInfo> list(@RequestParam(required = false, defaultValue = "1") Integer page,
-                                         @RequestParam(required = false, defaultValue = "10") Integer size) {
+                                         @RequestParam(required = false, defaultValue = "10") Integer size,
+                                         @RequestParam(required = false) String ipaddr,
+                                         @RequestParam(required = false) String userName) {
         try {
             Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
             if (keys == null || keys.isEmpty()) {
-                logger.error("Redis keys is null or empty");
-                return ApiResult.error("SYS-0000", "Redis keys is null or empty");
+                logger.error("Redis密钥为null或为空");
+                return ApiResult.error("SYS-0000", "Redis密钥为null或为空");
             }
             Map<String, List<SysUserOnline>> userOnlineMap = new HashMap<>();
 
@@ -58,6 +59,12 @@ public class SysUserOnlineController {
                 if (redisService.hasKey(key)) {
                     LoginUser user = redisService.getCacheObject(key);
                     if (user != null) {
+                        if (ipaddr != null && !ipaddr.equals(user.getIpaddr())) {
+                            continue;
+                        }
+                        if (userName != null && !userName.equals(user.getUsername())) {
+                            continue;
+                        }
                         SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
                         if (online != null) {
                             List<SysUserOnline> list = userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>());
@@ -71,15 +78,58 @@ public class SysUserOnlineController {
             for (Map.Entry<String, List<SysUserOnline>> entry : userOnlineMap.entrySet()) {
                 List<SysUserOnline> sortedList = entry.getValue();
                 sortedList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
-                int loginCount = sortedList.size(); // 计算登录次数
-                SysUserOnline lastOnline = sortedList.get(0); // 取最后登录时间的记录
-                lastOnline.setLoginCount(loginCount); // 设置登录记录的数量
-                lastOnline.setPreviousOnlines(sortedList.subList(1, sortedList.size())); // 设置其他登录记录
-                userOnlineList.add(lastOnline);
+                if (!sortedList.isEmpty()) {
+                    SysUserOnline lastOnline = sortedList.get(0);
+                    lastOnline.setLoginCount(sortedList.size()); // 设置登录次数
+                    userOnlineList.add(lastOnline);
+                }
+            }
+
+            // 按照登录时间降序排序
+            userOnlineList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
+
+            long total = userOnlineList.size();
+            int start = (page - 1) * size;
+            int end = Math.min(start + size, (int) total);
+            List<SysUserOnline> pageList = userOnlineList.subList(start, end);
+
+            return ApiResult.success(getDataTable(pageList, page, size, total));
+        } catch (Exception ex) {
+            logger.error("处理/online/list错误", ex);
+            return ApiResult.error("SYS-0001", "内部系统错误", ex.getMessage());
+        }
+    }
+
+    @GetMapping("/history")
+    public ApiResult<TableDataInfo> listOtherLogins(@RequestParam Long userid,
+                                                    @RequestParam(required = false, defaultValue = "1") Integer page,
+                                                    @RequestParam(required = false, defaultValue = "10") Integer size) {
+        try {
+            Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
+            if (keys == null || keys.isEmpty()) {
+                logger.error("Redis密钥为null或为空");
+                return ApiResult.error("SYS-0000", "Redis密钥为null或为空");
+            }
+            List<SysUserOnline> userOnlineList = new ArrayList<>();
+
+            for (String key : keys) {
+                if (redisService.hasKey(key)) {
+                    LoginUser user = redisService.getCacheObject(key);
+                    if (user != null && user.getUserid().equals(userid)) {
+                        SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
+                        if (online != null) {
+                            userOnlineList.add(online);
+                        }
+                    }
+                }
             }
 
             // 按照登录时间降序排序
             userOnlineList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
+            // 排除最后一条记录,只保留其他记录
+//            if (!userOnlineList.isEmpty()) {
+//                userOnlineList = userOnlineList.subList(1, userOnlineList.size());
+//            }
 
             long total = userOnlineList.size();
             int start = (page - 1) * size;
@@ -88,8 +138,8 @@ public class SysUserOnlineController {
 
             return ApiResult.success(getDataTable(pageList, page, size, total));
         } catch (Exception ex) {
-            logger.error("Error processing /online/list", ex);
-            return ApiResult.error("SYS-0001", "Internal system error", ex.getMessage());
+            logger.error("处理/online/listOtherLogins错误", ex);
+            return ApiResult.error("SYS-0001", "内部服务器错误", ex.getMessage());
         }
     }
 
@@ -97,27 +147,60 @@ public class SysUserOnlineController {
      * 强退用户
      */
 //    @RequiresPermissions("monitor:online:forceLogout")
-    @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @DeleteMapping("/{tokenId}")
     public ApiResult forceLogout(@PathVariable String tokenId) {
         try {
             if (StringUtils.isBlank(tokenId)) {
-                logger.error("Token ID is blank for force logout");
-                return ApiResult.error("SYS-0004", "Token ID is required for force logout");
+                logger.error("强制注销时Token为空");
+                return ApiResult.error("SYS-0004", "强制注销需要Token");
             }
 
             String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
             boolean deleted = redisService.deleteObject(key);
             if (deleted) {
-                logger.info("User with tokenId {} has been forcibly logged out.", tokenId);
+                logger.info("tokenId为 {} 的用户已被强制注销.", tokenId);
                 return ApiResult.success();
             } else {
-                logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
-                return ApiResult.error("SYS-0002", "Session not found or already deleted");
+                logger.warn("未能找到并删除tokenId为 {} 的用户会话", tokenId);
+                return ApiResult.error("SYS-0002", "未找到会话或已删除会话");
+            }
+        } catch (Exception ex) {
+            logger.error("处理tokenId {} 的forceLogout时出错", tokenId, ex);
+            return ApiResult.error("SYS-0003", "强制注销时出现内部系统错误", ex.getMessage());
+        }
+    }
+
+    @DeleteMapping("/logoutMany/{userid}")
+    public ApiResult forceLogoutMany(@PathVariable Long userid,
+                                     @RequestParam(required = false, defaultValue = "1") Integer page,
+                                     @RequestParam(required = false, defaultValue = "999") Integer size) {
+        try {
+            ApiResult<TableDataInfo> apiResult = listOtherLogins(userid, page, size);
+            if (apiResult.isSuccess() && apiResult.getData() != null) {
+                TableDataInfo tableDataInfo = apiResult.getData();
+                List<SysUserOnline> userOnlineList = (List<SysUserOnline>) tableDataInfo.getRows();
+                List<String> tokenIds = userOnlineList.stream()
+                        .map(SysUserOnline::getTokenId)
+                        .collect(Collectors.toList());
+
+                // 执行强退操作
+                for (String tokenId : tokenIds) {
+                    String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
+                    boolean deleted = redisService.deleteObject(key);
+                    if (deleted) {
+                        logger.info("tokenId为 {} 的用户已被强制注销.", tokenId);
+                    } else {
+                        logger.warn("未能找到并删除tokenId为 {} 的用户会话", tokenId);
+                    }
+                }
+                return ApiResult.success("已强制注销所有选中token.");
+            } else {
+                logger.error("调用 listOtherLogins 方法失败,原因:{}", apiResult.getMsg());
+                return ApiResult.error("SYS-0003", "调用历史记录接口失败", apiResult.getMsg());
             }
         } catch (Exception ex) {
-            logger.error("Error processing forceLogout for tokenId {}", tokenId, ex);
-            return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
+            logger.error("处理forceLogoutMany时出错", ex);
+            return ApiResult.error("SYS-0003", "强制注销时出现内部系统错误", ex.getMessage());
         }
     }
-}
+}

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

@@ -49,7 +49,6 @@ public class SysUserOnline {
     public SysUserOnline() {
         // 初始化默认值
         this.lastOnline = null;
-        this.previousOnlines = new ArrayList<>();
     }
 
     public String getTokenId() {
@@ -144,14 +143,6 @@ public class SysUserOnline {
         this.lastOnline = lastOnline;
     }
 
-    public List<SysUserOnline> getPreviousOnlines() {
-        return previousOnlines;
-    }
-
-    public void setPreviousOnlines(List<SysUserOnline> previousOnlines) {
-        this.previousOnlines = previousOnlines;
-    }
-
     public int getLoginCount() {
         return loginCount;
     }

+ 2 - 2
usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthUtil.java

@@ -26,8 +26,8 @@ public class AuthUtil
 
     /**
      * 会话注销,根据指定Token
-     * 
-     * @param tokenValue 指定token
+     *
+     * @param token 指定token
      */
     public static void logoutByToken(String token,String openId)
     {