【system】更新在线用户的查询和踢下线

【auth】登录用户新增了两个属性
pull/3/head
fengshuonan 2021-01-11 23:11:09 +08:00
parent d6924fc276
commit 3d23ce9573
11 changed files with 250 additions and 30 deletions

View File

@ -46,4 +46,22 @@ public enum SexEnum {
}
return null;
}
/**
*
*
* @author fengshuonan
* @date 2021/1/11 22:34
*/
public static String codeToMessage(String code) {
if (null != code) {
for (SexEnum e : SexEnum.values()) {
if (e.getCode().equals(code)) {
return e.getMessage();
}
}
}
return "未知";
}
}

View File

@ -7,6 +7,7 @@ import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;
@ -73,6 +74,16 @@ public class LoginUser implements Serializable {
*/
private Set<String> buttonCodes;
/**
*
*/
private Date loginTime;
/**
* tokentoken
*/
private String token;
/**
* DictMap
*/

View File

@ -10,10 +10,7 @@ import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
* redis
@ -182,7 +179,17 @@ public class DefaultSessionManager implements SessionManagerApi {
@Override
public List<LoginUser> onlineUserList() {
return new ArrayList<>(loginUserCache.getAllValues());
Map<String, LoginUser> allKeyValues = loginUserCache.getAllKeyValues();
ArrayList<LoginUser> loginUsers = new ArrayList<>();
for (Map.Entry<String, LoginUser> userEntry : allKeyValues.entrySet()) {
String token = userEntry.getKey();
LoginUser loginUser = userEntry.getValue();
loginUser.setToken(token);
loginUsers.add(loginUser);
}
return loginUsers;
}
}

View File

@ -1,9 +1,10 @@
package cn.stylefeng.roses.kernel.system;
import cn.stylefeng.roses.kernel.system.pojo.user.OnlineUserResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserDTO;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.UserLoginInfoDTO;
import cn.stylefeng.roses.kernel.system.pojo.user.request.OnlineUserRequest;
import cn.stylefeng.roses.kernel.system.pojo.user.request.SysUserRequest;
import java.util.Date;
@ -83,7 +84,7 @@ public interface UserServiceApi {
* @author fengshuonan
* @date 2021/1/10 9:56
*/
List<LoginUser> onlineUserList();
List<OnlineUserResponse> onlineUserList(OnlineUserRequest onlineUserRequest);
/**
* ID
@ -104,8 +105,6 @@ public interface UserServiceApi {
*/
List<Long> queryAllUserIdList(SysUserRequest sysUserRequest);
/**
*
*

View File

@ -0,0 +1,57 @@
package cn.stylefeng.roses.kernel.system.pojo.user;
import lombok.Data;
import java.util.Date;
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:30
*/
@Data
public class OnlineUserResponse {
/**
* token
*/
private String token;
/**
*
*/
private Long userId;
/**
*
*/
private String account;
/**
*
*/
private String nickName;
/**
*
*/
private String realName;
/**
*
*/
private String sex;
/**
*
*/
private String roleName;
/**
*
*/
private Date loginTime;
}

View File

@ -0,0 +1,28 @@
package cn.stylefeng.roses.kernel.system.pojo.user.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:30
*/
@Data
public class OnlineUserRequest {
/**
* token
*/
@NotBlank(message = "参数token不能为空")
private String token;
/**
*
*/
private String account;
}

View File

@ -0,0 +1,56 @@
package cn.stylefeng.roses.kernel.system.modular.user.controller;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.PostResource;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
import cn.stylefeng.roses.kernel.system.pojo.user.request.OnlineUserRequest;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:52
*/
@RestController
@ApiResource(name = "在线用户管理")
public class OnlineUserController {
@Resource
private SysUserService sysUserService;
@Resource
private SessionManagerApi sessionManagerApi;
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:53
*/
@GetResource(name = "当前在线用户列表", path = "/sysUser/onlineUserList")
public ResponseData onlineUserList(OnlineUserRequest onlineUserRequest) {
return new SuccessResponseData(sysUserService.onlineUserList(onlineUserRequest));
}
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:53
*/
@PostResource(name = "踢掉在线用户", path = "/sysUser/removeSession")
public ResponseData removeSession(@Valid @RequestBody OnlineUserRequest onlineUserRequest) {
sessionManagerApi.removeSession(onlineUserRequest.getToken());
return new SuccessResponseData();
}
}

View File

@ -8,9 +8,9 @@ import cn.stylefeng.roses.kernel.resource.api.annotation.PostResource;
import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.system.pojo.user.request.SysUserRequest;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserRoleService;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
import cn.stylefeng.roses.kernel.system.pojo.user.request.SysUserRequest;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@ -240,15 +240,4 @@ public class SysUserController {
return new SuccessResponseData(sysUserService.detail(sysUserRequest));
}
/**
* 线
*
* @author fengshuonan
* @date 2021/1/1 19:01
*/
@GetResource(name = "当前在线用户列表", path = "/sysUser/onlineUserList", requiredPermission = false)
public ResponseData onlineUserList() {
return new SuccessResponseData(sysUserService.onlineUserList());
}
}

View File

@ -0,0 +1,41 @@
package cn.stylefeng.roses.kernel.system.modular.user.factory;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.rule.enums.SexEnum;
import cn.stylefeng.roses.kernel.system.pojo.user.OnlineUserResponse;
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:31
*/
public class OnlineUserCreateFactory {
/**
* 线
*
* @author fengshuonan
* @date 2021/1/11 22:31
*/
public static OnlineUserResponse createOnlineUser(LoginUser loginUser) {
OnlineUserResponse onlineUserResponse = new OnlineUserResponse();
onlineUserResponse.setUserId(loginUser.getUserId());
onlineUserResponse.setAccount(loginUser.getAccount());
onlineUserResponse.setSex(SexEnum.codeToMessage(loginUser.getSimpleUserInfo().getSex()));
onlineUserResponse.setRealName(loginUser.getSimpleUserInfo().getRealName());
onlineUserResponse.setNickName(loginUser.getSimpleUserInfo().getNickName());
if (loginUser.getSimpleRoleInfoList() != null && loginUser.getSimpleRoleInfoList().size() > 0) {
onlineUserResponse.setRoleName(loginUser.getSimpleRoleInfoList().get(0).getRoleName());
}
onlineUserResponse.setLoginTime(loginUser.getLoginTime());
onlineUserResponse.setToken(loginUser.getToken());
return onlineUserResponse;
}
}

View File

@ -13,10 +13,7 @@ import cn.stylefeng.roses.kernel.system.pojo.role.response.SysRoleResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserOrgResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.UserLoginInfoDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
/**
*
@ -34,7 +31,7 @@ public class UserLoginInfoFactory {
* @param dataScopeResponse
* @param userOrgInfo
* @param resourceUrlsListByCodes url
* @param roleButtonCodes
* @param roleButtonCodes
* @author fengshuonan
* @date 2020/12/26 17:53
*/
@ -102,6 +99,9 @@ public class UserLoginInfoFactory {
// 填充用户拥有的按钮编码
loginUser.setButtonCodes(roleButtonCodes);
// 设置用户的登录时间
loginUser.setLoginTime(new Date());
// 响应dto
userLoginInfoDTO.setLoginUser(loginUser);
return userLoginInfoDTO;

View File

@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.system.modular.user.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
@ -25,11 +26,10 @@ import cn.stylefeng.roses.kernel.system.exception.enums.SysUserExceptionEnum;
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUser;
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUserDataScope;
import cn.stylefeng.roses.kernel.system.modular.user.entity.SysUserRole;
import cn.stylefeng.roses.kernel.system.modular.user.factory.OnlineUserCreateFactory;
import cn.stylefeng.roses.kernel.system.modular.user.factory.SysUserCreateFactory;
import cn.stylefeng.roses.kernel.system.modular.user.factory.UserLoginInfoFactory;
import cn.stylefeng.roses.kernel.system.modular.user.mapper.SysUserMapper;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserDTO;
import cn.stylefeng.roses.kernel.system.pojo.user.request.SysUserRequest;
import cn.stylefeng.roses.kernel.system.modular.user.pojo.response.SysUserResponse;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserDataScopeService;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserOrgService;
@ -37,8 +37,12 @@ import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserRoleService;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
import cn.stylefeng.roses.kernel.system.pojo.organization.DataScopeResponse;
import cn.stylefeng.roses.kernel.system.pojo.role.response.SysRoleResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.OnlineUserResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserDTO;
import cn.stylefeng.roses.kernel.system.pojo.user.SysUserOrgResponse;
import cn.stylefeng.roses.kernel.system.pojo.user.UserLoginInfoDTO;
import cn.stylefeng.roses.kernel.system.pojo.user.request.OnlineUserRequest;
import cn.stylefeng.roses.kernel.system.pojo.user.request.SysUserRequest;
import cn.stylefeng.roses.kernel.system.util.DataScopeUtil;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -473,8 +477,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
@Override
public List<LoginUser> onlineUserList() {
return sessionManagerApi.onlineUserList();
public List<OnlineUserResponse> onlineUserList(OnlineUserRequest onlineUserRequest) {
List<LoginUser> loginUsers = sessionManagerApi.onlineUserList();
// 对象转化
List<OnlineUserResponse> result = loginUsers.stream().map(OnlineUserCreateFactory::createOnlineUser).collect(Collectors.toList());
// 如果带了条件则根据account筛选结果
if (StrUtil.isNotBlank(onlineUserRequest.getAccount())) {
return result.stream().filter(i -> i.getAccount().equals(onlineUserRequest.getAccount())).collect(Collectors.toList());
} else {
return result;
}
}
@Override