All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.xujiaji.mk.security.admin.service.MonitorService Maven / Gradle / Ivy

The newest version!
package com.github.xujiaji.mk.security.admin.service;

import cn.hutool.core.util.StrUtil;
import com.github.xujiaji.mk.common.base.Consts;
import com.github.xujiaji.mk.common.payload.PageCondition;
import com.github.xujiaji.mk.common.util.RedisUtil;
import com.github.xujiaji.mk.common.vo.PageVO;
import com.github.xujiaji.mk.security.admin.vo.OnlineUser;
import com.github.xujiaji.mk.security.entity.MkSecUser;
import com.github.xujiaji.mk.security.mapper.MkSecUserMapper;
import com.github.xujiaji.mk.common.service.IUserInfoService;
import com.github.xujiaji.mk.security.util.SecurityUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 

* 监控 Service *

*/ @Slf4j @Service public class MonitorService { @Autowired private RedisUtil redisUtil; @Autowired private MkSecUserMapper mkSecUserMapper; @Autowired private IUserInfoService userInfoService; /** * 在线用户分页列表 * * @param pageCondition 分页参数 * @return 在线用户分页列表 */ public PageVO onlineUser(PageCondition pageCondition) { PageVO keys = redisUtil.findKeysForPage(Consts.REDIS_JWT_KEY_PREFIX + Consts.SYMBOL_STAR, pageCondition.getPage(), pageCondition.getSize()); List rows = keys.getList(); Long total = keys.getTotal(); // 根据 redis 中键获取用户名列表 List usernameList = rows.stream() .map(s -> StrUtil.subAfter(s, Consts.REDIS_JWT_KEY_PREFIX, true)) .collect(Collectors.toList()); // 根据用户名查询用户信息 List userList = mkSecUserMapper.selectBatchIds(usernameList); // 封装在线用户信息 List onlineUserList = Lists.newArrayList(); userList.forEach(user -> onlineUserList.add(OnlineUser.create(user, userInfoService.getUserWithPhoneEmailPassword(user.getUserId())))); return PageVO.create(onlineUserList, pageCondition.getPage(), pageCondition.getSize(), keys.getTotal()); } /** * 踢出在线用户 * * @param names 用户名列表 */ public void kickout(List names) { // 清除 Redis 中的 JWT 信息 List redisKeys = names.parallelStream() .map(s -> Consts.REDIS_JWT_KEY_PREFIX + s) .collect(Collectors.toList()); redisUtil.delete(redisKeys); // 获取当前用户名 String currentUsername = SecurityUtil.getCurrentUsername(); names.parallelStream() .forEach(name -> { // TODO: 通知被踢出的用户已被当前登录用户踢出, // 后期考虑使用 websocket 实现,具体伪代码实现如下。 // String message = "您已被用户【" + currentUsername + "】手动下线!"; log.debug("用户【{}】被用户【{}】手动下线!", name, currentUsername); }); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy