|
@@ -4,8 +4,6 @@ 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;
|
|
|
import com.usky.common.security.annotation.RequiresPermissions;
|
|
|
import com.usky.system.controller.web.page.TableDataInfo;
|
|
@@ -44,7 +42,9 @@ 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()) {
|
|
@@ -58,6 +58,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,11 +77,11 @@ 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);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 按照登录时间降序排序
|
|
@@ -93,11 +99,53 @@ public class SysUserOnlineController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @GetMapping("/history")
|
|
|
+ public ApiResult<TableDataInfo> listOtherLogins(@RequestParam String userName,
|
|
|
+ @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 keys is null or empty");
|
|
|
+ return ApiResult.error("SYS-0000", "Redis keys is null or empty");
|
|
|
+ }
|
|
|
+ List<SysUserOnline> userOnlineList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (String key : keys) {
|
|
|
+ if (redisService.hasKey(key)) {
|
|
|
+ LoginUser user = redisService.getCacheObject(key);
|
|
|
+ if (user != null && user.getUsername().equals(userName)) {
|
|
|
+ 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;
|
|
|
+ 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("Error processing /online/listOtherLogins", ex);
|
|
|
+ return ApiResult.error("SYS-0001", "Internal system error", ex.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 强退用户
|
|
|
*/
|
|
|
// @RequiresPermissions("monitor:online:forceLogout")
|
|
|
- @Log(title = "在线用户", businessType = BusinessType.FORCE)
|
|
|
@DeleteMapping("/{tokenId}")
|
|
|
public ApiResult forceLogout(@PathVariable String tokenId) {
|
|
|
try {
|
|
@@ -120,4 +168,28 @@ public class SysUserOnlineController {
|
|
|
return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+ @DeleteMapping("/logoutMany")
|
|
|
+ public ApiResult forceLogoutMany(@RequestBody List<String> tokenIds) {
|
|
|
+ for (String tokenId : tokenIds) {
|
|
|
+ try {
|
|
|
+ if (StringUtils.isBlank(tokenId)) {
|
|
|
+ logger.error("Token ID is blank for force logout");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ } else {
|
|
|
+ logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
|
|
|
+ }
|
|
|
+ } 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ApiResult.success("All selected tokens have been processed for force logout.");
|
|
|
+ }
|
|
|
+}
|