|
@@ -1,9 +1,9 @@
|
|
|
package com.usky.system.controller.web;
|
|
|
|
|
|
import java.util.*;
|
|
|
-
|
|
|
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;
|
|
@@ -52,7 +52,6 @@ public class SysUserOnlineController {
|
|
|
return ApiResult.error("SYS-0000", "Redis keys is null or empty");
|
|
|
}
|
|
|
Map<String, List<SysUserOnline>> userOnlineMap = new HashMap<>();
|
|
|
- long currentTime = System.currentTimeMillis();
|
|
|
|
|
|
for (String key : keys) {
|
|
|
// 检查键是否存在并且未过期
|
|
@@ -61,7 +60,8 @@ public class SysUserOnlineController {
|
|
|
if (user != null) {
|
|
|
SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
|
|
|
if (online != null) {
|
|
|
- userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>()).add(online);
|
|
|
+ List<SysUserOnline> list = userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>());
|
|
|
+ list.add(online);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -71,7 +71,9 @@ 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);
|
|
|
}
|
|
@@ -94,12 +96,28 @@ public class SysUserOnlineController {
|
|
|
/**
|
|
|
* 强退用户
|
|
|
*/
|
|
|
- @RequiresPermissions("monitor:online:forceLogout")
|
|
|
+// @RequiresPermissions("monitor:online:forceLogout")
|
|
|
@Log(title = "在线用户", businessType = BusinessType.FORCE)
|
|
|
@DeleteMapping("/{tokenId}")
|
|
|
- public ApiResult forceLogout(@PathVariable String tokenId)
|
|
|
- {
|
|
|
- redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
|
|
|
- return ApiResult.success();
|
|
|
+ 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");
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ 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");
|
|
|
+ }
|
|
|
+ } 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());
|
|
|
+ }
|
|
|
}
|
|
|
}
|