增加了mongo用户登录模块

This commit is contained in:
wanggeng 2022-05-20 10:13:23 +08:00
parent 194dc83b72
commit 8f298947db
35 changed files with 1225 additions and 476 deletions

View File

@ -49,6 +49,10 @@ public class ServerProperties {
* 初始化
*/
private ServerInitProperties init;
/**
* 主节点
*/
private Boolean masterNode;
public Integer getPort() {
return port;
@ -114,6 +118,14 @@ public class ServerProperties {
this.init = init;
}
public Boolean getMasterNode() {
return masterNode == null ? false : masterNode;
}
public void setMasterNode(Boolean masterNode) {
this.masterNode = masterNode;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
@ -131,6 +143,10 @@ public class ServerProperties {
.append(defaultIndexPage).append('\"');
sb.append(",\"defaultHomePage\":\"")
.append(defaultHomePage).append('\"');
sb.append(",\"init\":")
.append(init);
sb.append(",\"masterNode\":")
.append(masterNode);
sb.append('}');
return sb.toString();
}

View File

@ -0,0 +1,40 @@
package ink.wgink.util.thread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: CachedThreadPoolUtil
* @Description: 缓存线程池
* @Author: wanggeng
* @Date: 2022/5/20 00:27
* @Version: 1.0
*/
public class CachedThreadPoolUtil {
private static final Logger LOG = LoggerFactory.getLogger(CachedThreadPoolUtil.class);
/**
* 最多66个线程保持60s
*/
private static ExecutorService executorService = new ThreadPoolExecutor(0, 66,
60L, TimeUnit.SECONDS,
new SynchronousQueue<>());
/**
* 执行线程
*
* @param runnable
*/
public static void execute(Runnable runnable) {
LOG.debug("****************** execute");
executorService.execute(runnable);
}
}

View File

@ -1,44 +1,21 @@
package ink.wgink.login.base.authentication.user;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.expand.login.ILoginHandlerService;
import ink.wgink.interfaces.group.IGroupUserBaseService;
import ink.wgink.interfaces.position.IPositionUserBaseService;
import ink.wgink.interfaces.role.IRoleBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.interfaces.role.IRolePermissionBaseService;
import ink.wgink.interfaces.role.IRoleUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.login.base.consts.IUserCenterConst;
import ink.wgink.login.base.enums.LoginTypeEnum;
import ink.wgink.login.base.exceptions.UserAuthenticationException;
import ink.wgink.login.base.service.user.UserLoginService;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.pojo.bos.RoleGrantedAuthorityBO;
import ink.wgink.pojo.dtos.department.DepartmentSimpleDTO;
import ink.wgink.pojo.dtos.group.GroupSimpleDTO;
import ink.wgink.pojo.dtos.position.PositionSimpleDTO;
import ink.wgink.pojo.dtos.role.RoleSimpleDTO;
import ink.wgink.pojo.pos.DepartmentPO;
import ink.wgink.pojo.pos.GroupPO;
import ink.wgink.pojo.pos.PositionPO;
import ink.wgink.pojo.pos.RolePO;
import ink.wgink.properties.AccessControlProperties;
import ink.wgink.service.department.service.IDepartmentUserService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* When you feel like quitting. Think about why you started
@ -55,15 +32,8 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
private UserDetailsService userDetailsService;
private PasswordEncoder passwordEncoder;
private UserLoginService userLoginService;
private IRoleBaseService roleBaseService;
private IRoleUserBaseService roleUserBaseService;
private IRoleMenuBaseService roleMenuBaseService;
private IRolePermissionBaseService rolePermissionService;
private IGroupUserBaseService groupUserBaseService;
private IPositionUserBaseService positionUserBaseService;
private ILoginHandlerService loginHandler;
private IDepartmentUserService departmentUserService;
private AccessControlProperties accessControlProperties;
private IMongoLoginUserService mongoLoginUserService;
private HttpSession httpSession;
@Override
@ -71,74 +41,28 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
UserAuthenticationToken userAuthenticationToken = (UserAuthenticationToken) authentication;
String username = userAuthenticationToken.getPrincipal().toString();
httpSession.setAttribute(IUserCenterConst.LOGIN_USERNAME, username);
LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
LoginUser loginUser = null;
if (mongoLoginUserService != null) {
// mongo 存在 MongoDB
loginUser = mongoLoginUserService.getByUsername(username);
}
// 当loginUser为空时查询数据库确保用户不存在
if (loginUser == null) {
loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
// 设置登录用户信息
userLoginService.setLoginUserInfo(loginUser);
}
if (!passwordEncoder.matches(userAuthenticationToken.getCredentials().toString(), loginUser.getPassword())) {
throw new UserAuthenticationException("用户名或密码错误");
}
if (loginUser.getAuthorities().isEmpty()) {
throw new UserAuthenticationException(loginUser.getUsername() + "用户无任何角色");
}
// 清空session中的错误信息
httpSession.removeAttribute(IUserCenterConst.ERROR_MESSAGE);
httpSession.removeAttribute(IUserCenterConst.LOGIN_USERNAME);
LOG.debug("set authority");
Set<GrantedAuthority> grantedAuthorities = new LinkedHashSet<>();
// 超管用户
boolean isAdmin = false;
if (StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername())) {
grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN));
} else {
List<RolePO> rolePOs = null;
// 先处理授权再创建对象否则 grantedAuthorities 中无法赋值
if (roleUserBaseService != null) {
LOG.debug("check is admin");
List<String> roleIds = roleUserBaseService.listRoleIdByUserId(loginUser.getUserId());
isAdmin = hasAdmin(roleIds);
if (!isAdmin) {
LOG.debug("set role, not admin");
rolePOs = roleUserBaseService.listRolePOByRoleIds(roleIds);
removalDuplicateRole(rolePOs);
grantedAuthorities.addAll(loadRoleAuthority(rolePOs));
if (grantedAuthorities.isEmpty()) {
throw new UserAuthenticationException(loginUser.getUsername() + "用户无任何角色");
}
}
}
// 标记超管
if (isAdmin) {
LOG.debug("mark admin role");
grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN));
} else {
// 非超管设置其他信息
if (rolePOs != null) {
List<RoleSimpleDTO> roleSimpleDTOs = roleUserBaseService.listSimple(rolePOs);
loginUser.setRoles(roleSimpleDTOs);
}
LOG.debug("set department");
List<DepartmentPO> departmentPOs = departmentUserService.listDepartmentPOByUserId(loginUser.getUserId());
List<DepartmentSimpleDTO> departmentSimpleDTOs = departmentUserService.listSimple(departmentPOs);
loginUser.setDepartments(departmentSimpleDTOs);
if (groupUserBaseService != null) {
LOG.debug("set group");
List<GroupPO> groupPOs = groupUserBaseService.listGroupPOByUserId(loginUser.getUserId());
List<GroupSimpleDTO> groupSimpleDTOs = groupUserBaseService.listSimple(groupPOs);
loginUser.setGroups(groupSimpleDTOs);
}
if (positionUserBaseService != null) {
LOG.debug("set position");
List<PositionPO> positionPOs = positionUserBaseService.listPositionPOByUserId(loginUser.getUserId());
List<PositionSimpleDTO> positionSimpleDTOs = positionUserBaseService.listSimple(positionPOs);
loginUser.setPositions(positionSimpleDTOs);
}
}
}
// 设置权限
loginUser.setAuthorities(grantedAuthorities);
// 登录逻辑处理
loginHandler(loginUser);
// 设置数据权限排除超管
if (!StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername()) && !isAdmin) {
LOG.debug("set data authority");
userLoginService.setUserDataAuthority(loginUser);
}
// 更新登录信息
userLoginService.updateUserLoginInfo(loginUser.getUserId(), loginUser.getUserName(), LoginTypeEnum.USERNAME_AND_PASSWORD.getValue());
UserAuthenticationToken userAuthenticationTokenResult = new UserAuthenticationToken(loginUser, null, loginUser.getAuthorities());
@ -146,20 +70,6 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
return userAuthenticationTokenResult;
}
/**
* 是否超管
*
* @param roleIds
* @return
*/
private boolean hasAdmin(List<String> roleIds) {
for (String roleId : roleIds) {
if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) {
return true;
}
}
return false;
}
/**
* 登录处理
@ -177,62 +87,6 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
}
}
/**
* 角色授权列表
*
* @param rolePOs
* @return
*/
private List<GrantedAuthority> loadRoleAuthority(List<RolePO> rolePOs) {
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
if (null != rolePOs && !rolePOs.isEmpty()) {
// 设置菜单权限
rolePOs.forEach((rolePO) -> {
List<String> menuUrls = roleMenuBaseService.listMenuUrl(rolePO.getRoleId());
List<String> inserts = new ArrayList<>();
List<String> deletes = new ArrayList<>();
List<String> updates = new ArrayList<>();
List<String> queries = new ArrayList<>();
if (accessControlProperties.getRolePermission()) {
inserts.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_INSERT));
deletes.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_DELETE));
updates.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_UPDATE));
queries.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_QUERY));
}
grantedAuthorities.add(new RoleGrantedAuthorityBO(rolePO.getRoleId(), rolePO.getRoleName(), menuUrls, inserts, deletes, updates, queries));
});
}
return grantedAuthorities;
}
/**
* 删除重复的角色
*
* @param rolePOs
*/
private void removalDuplicateRole(List<RolePO> rolePOs) {
if (rolePOs == null || rolePOs.isEmpty()) {
return;
}
for (int i = 0; i < rolePOs.size(); i++) {
RolePO rolePO = rolePOs.get(i);
boolean isExist = false;
for (int j = i + 1; j < rolePOs.size(); j++) {
if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) {
isExist = true;
break;
}
}
if (isExist) {
rolePOs.remove(i);
i--;
break;
}
}
}
@Override
public boolean supports(Class<?> authentication) {
return UserAuthenticationToken.class.isAssignableFrom(authentication);
@ -250,39 +104,15 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
this.userLoginService = userLoginService;
}
public void setRoleUserBaseService(IRoleUserBaseService roleUserBaseService) {
this.roleUserBaseService = roleUserBaseService;
}
public void setRoleMenuBaseService(IRoleMenuBaseService roleMenuBaseService) {
this.roleMenuBaseService = roleMenuBaseService;
}
public void setRolePermissionService(IRolePermissionBaseService rolePermissionService) {
this.rolePermissionService = rolePermissionService;
}
public void setGroupUserBaseService(IGroupUserBaseService groupUserBaseService) {
this.groupUserBaseService = groupUserBaseService;
}
public void setPositionUserBaseService(IPositionUserBaseService positionUserBaseService) {
this.positionUserBaseService = positionUserBaseService;
public void setHttpSession(HttpSession httpSession) {
this.httpSession = httpSession;
}
public void setLoginHandler(ILoginHandlerService loginHandler) {
this.loginHandler = loginHandler;
}
public void setDepartmentUserService(IDepartmentUserService departmentUserService) {
this.departmentUserService = departmentUserService;
}
public void setAccessControlProperties(AccessControlProperties accessControlProperties) {
this.accessControlProperties = accessControlProperties;
}
public void setHttpSession(HttpSession httpSession) {
this.httpSession = httpSession;
public void setMongoLoginUserService(IMongoLoginUserService mongoLoginUserService) {
this.mongoLoginUserService = mongoLoginUserService;
}
}

View File

@ -2,19 +2,13 @@ package ink.wgink.login.base.security;
import ink.wgink.common.handler.AccessDenyHandler;
import ink.wgink.interfaces.expand.login.ILoginHandlerService;
import ink.wgink.interfaces.group.IGroupUserBaseService;
import ink.wgink.interfaces.position.IPositionUserBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.interfaces.role.IRolePermissionBaseService;
import ink.wgink.interfaces.role.IRoleUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.login.base.handler.LoginFailureHandler;
import ink.wgink.login.base.handler.LogoutHandler;
import ink.wgink.login.base.security.user.UserSecurityConfig;
import ink.wgink.login.base.service.user.UserDetailServiceImpl;
import ink.wgink.login.base.service.user.UserLoginService;
import ink.wgink.properties.AccessControlProperties;
import ink.wgink.properties.BaseProperties;
import ink.wgink.service.department.service.IDepartmentUserService;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -44,25 +38,13 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserLoginService userLoginService;
@Autowired(required = false)
private IRoleUserBaseService roleUserBaseService;
@Autowired(required = false)
private IRoleMenuBaseService roleMenuBaseService;
@Autowired(required = false)
private IRolePermissionBaseService rolePermissionService;
@Autowired(required = false)
private IGroupUserBaseService groupUserBaseService;
@Autowired(required = false)
private IPositionUserBaseService positionUserBaseService;
@Autowired(required = false)
private ILoginHandlerService loginHandler;
@Autowired
private IDepartmentUserService departmentUserService;
@Autowired
private AccessControlProperties accessControlProperties;
@Autowired
private HttpSession httpSession;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
@ -136,15 +118,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
userSecurityConfig.setLoginProcessUrl(baseProperties.getLoginProcess());
userSecurityConfig.setLoginFailureHandler(loginFailureHandler);
userSecurityConfig.setUserLoginService(userLoginService);
userSecurityConfig.setRoleUserBaseService(roleUserBaseService);
userSecurityConfig.setRoleMenuBaseService(roleMenuBaseService);
userSecurityConfig.setRolePermissionService(rolePermissionService);
userSecurityConfig.setGroupUserBaseService(groupUserBaseService);
userSecurityConfig.setPositionUserBaseService(positionUserBaseService);
userSecurityConfig.setLoginHandler(loginHandler);
userSecurityConfig.setDepartmentUserService(departmentUserService);
userSecurityConfig.setAccessControlProperties(accessControlProperties);
userSecurityConfig.setHttpSession(httpSession);
userSecurityConfig.setMongoLoginUserService(mongoLoginUserService);
http.apply(userSecurityConfig);
}

View File

@ -1,18 +1,12 @@
package ink.wgink.login.base.security.user;
import ink.wgink.interfaces.expand.login.ILoginHandlerService;
import ink.wgink.interfaces.group.IGroupUserBaseService;
import ink.wgink.interfaces.position.IPositionUserBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.interfaces.role.IRolePermissionBaseService;
import ink.wgink.interfaces.role.IRoleUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.login.base.authentication.user.UserAuthenticationFilter;
import ink.wgink.login.base.authentication.user.UserAuthenticationProvider;
import ink.wgink.login.base.handler.LoginFailureHandler;
import ink.wgink.login.base.service.user.UserDetailServiceImpl;
import ink.wgink.login.base.service.user.UserLoginService;
import ink.wgink.properties.AccessControlProperties;
import ink.wgink.service.department.service.IDepartmentUserService;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -39,15 +33,9 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
private String loginProcessUrl;
private PasswordEncoder passwordEncoder;
private UserLoginService userLoginService;
private IRoleUserBaseService roleUserBaseService;
private IRoleMenuBaseService roleMenuBaseService;
private IRolePermissionBaseService rolePermissionService;
private IGroupUserBaseService groupUserBaseService;
private IPositionUserBaseService positionUserBaseService;
private ILoginHandlerService loginHandler;
private IDepartmentUserService departmentUserService;
private AccessControlProperties accessControlProperties;
private HttpSession httpSession;
private IMongoLoginUserService mongoLoginUserService;
@Override
public void configure(HttpSecurity http) throws Exception {
@ -61,15 +49,9 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
userAuthenticationProvider.setPasswordEncoder(passwordEncoder);
userAuthenticationProvider.setUserDetailsService(userDetailService);
userAuthenticationProvider.setUserLoginService(userLoginService);
userAuthenticationProvider.setRoleUserBaseService(roleUserBaseService);
userAuthenticationProvider.setRoleMenuBaseService(roleMenuBaseService);
userAuthenticationProvider.setRolePermissionService(rolePermissionService);
userAuthenticationProvider.setGroupUserBaseService(groupUserBaseService);
userAuthenticationProvider.setPositionUserBaseService(positionUserBaseService);
userAuthenticationProvider.setLoginHandler(loginHandler);
userAuthenticationProvider.setDepartmentUserService(departmentUserService);
userAuthenticationProvider.setAccessControlProperties(accessControlProperties);
userAuthenticationProvider.setHttpSession(httpSession);
userAuthenticationProvider.setLoginHandler(loginHandler);
userAuthenticationProvider.setMongoLoginUserService(mongoLoginUserService);
// 加入SpringSecurity的authentication管理的provider集合当中并且添加到UsernamePasswordAuthenticationFilter之前
http.authenticationProvider(userAuthenticationProvider).addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
@ -94,39 +76,16 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
this.userLoginService = userLoginService;
}
public void setRoleUserBaseService(IRoleUserBaseService roleUserBaseService) {
this.roleUserBaseService = roleUserBaseService;
}
public void setRoleMenuBaseService(IRoleMenuBaseService roleMenuBaseService) {
this.roleMenuBaseService = roleMenuBaseService;
}
public void setRolePermissionService(IRolePermissionBaseService rolePermissionService) {
this.rolePermissionService = rolePermissionService;
}
public void setGroupUserBaseService(IGroupUserBaseService groupUserBaseService) {
this.groupUserBaseService = groupUserBaseService;
}
public void setPositionUserBaseService(IPositionUserBaseService positionUserBaseService) {
this.positionUserBaseService = positionUserBaseService;
}
public void setLoginHandler(ILoginHandlerService loginHandler) {
this.loginHandler = loginHandler;
}
public void setDepartmentUserService(IDepartmentUserService departmentUserService) {
this.departmentUserService = departmentUserService;
}
public void setAccessControlProperties(AccessControlProperties accessControlProperties) {
this.accessControlProperties = accessControlProperties;
}
public void setHttpSession(HttpSession httpSession) {
this.httpSession = httpSession;
}
public void setMongoLoginUserService(IMongoLoginUserService mongoLoginUserService) {
this.mongoLoginUserService = mongoLoginUserService;
}
}

View File

@ -4,10 +4,10 @@ import com.alibaba.fastjson.JSONObject;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.user.IUserDetailCheckService;
import ink.wgink.login.base.exceptions.UserAuthenticationException;
import ink.wgink.login.base.util.UserLoginUtil;
import ink.wgink.service.user.enums.UserStateEnum;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.service.user.util.UserUtil;
import ink.wgink.util.date.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
@ -58,7 +58,7 @@ public class UserDetailServiceImpl implements UserDetailsService, IUserDetailChe
if (DateUtil.isDateExpired(userPO.getUserExpiredDate())) {
throw new UserAuthenticationException("账号已经过期");
}
return UserLoginUtil.createLoginUser(userPO);
return UserUtil.createLoginUser(userPO);
}
}

View File

@ -3,12 +3,29 @@ package ink.wgink.login.base.service.user;
import ink.wgink.common.enums.RoleDataRightEnum;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.UpdateException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.group.IGroupUserBaseService;
import ink.wgink.interfaces.position.IPositionUserBaseService;
import ink.wgink.interfaces.role.IRoleDataRightBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.interfaces.role.IRolePermissionBaseService;
import ink.wgink.interfaces.role.IRoleUserBaseService;
import ink.wgink.login.base.service.log.ILoginLogService;
import ink.wgink.login.base.util.UserLoginUtil;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.pojo.bos.RoleGrantedAuthorityBO;
import ink.wgink.pojo.dtos.department.DepartmentSimpleDTO;
import ink.wgink.pojo.dtos.group.GroupSimpleDTO;
import ink.wgink.pojo.dtos.position.PositionSimpleDTO;
import ink.wgink.pojo.dtos.role.RoleSimpleDTO;
import ink.wgink.pojo.pos.DepartmentPO;
import ink.wgink.pojo.pos.GroupPO;
import ink.wgink.pojo.pos.PositionPO;
import ink.wgink.pojo.pos.RolePO;
import ink.wgink.properties.AccessControlProperties;
import ink.wgink.service.department.service.IDepartmentService;
import ink.wgink.service.department.service.IDepartmentUserService;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.util.UUIDUtil;
import ink.wgink.util.date.DateUtil;
@ -18,12 +35,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* When you feel like quitting. Think about why you started
@ -49,6 +64,80 @@ public class UserLoginService {
private ILoginLogService loginLogService;
@Autowired(required = false)
private IRoleDataRightBaseService roleDataRightBaseService;
@Autowired(required = false)
private IRoleUserBaseService roleUserBaseService;
@Autowired(required = false)
private IRoleMenuBaseService roleMenuBaseService;
@Autowired(required = false)
private IRolePermissionBaseService rolePermissionService;
@Autowired(required = false)
private IGroupUserBaseService groupUserBaseService;
@Autowired(required = false)
private IPositionUserBaseService positionUserBaseService;
@Autowired
private AccessControlProperties accessControlProperties;
public void setLoginUserInfo(LoginUser loginUser) {
LOG.debug("set authority");
Set<GrantedAuthority> grantedAuthorities = new LinkedHashSet<>();
boolean isAdmin = false;
if (StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername())) {
grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN));
} else {
List<RolePO> rolePOs = null;
// 先处理授权再创建对象否则 grantedAuthorities 中无法赋值
if (roleUserBaseService != null) {
LOG.debug("check is admin");
List<String> roleIds = roleUserBaseService.listRoleIdByUserId(loginUser.getUserId());
isAdmin = UserLoginUtil.hasAdmin(roleIds);
if (!isAdmin && loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue())) {
// 非管理员系统用户设置角色权限
LOG.debug("set role, not admin");
rolePOs = roleUserBaseService.listRolePOByRoleIds(roleIds);
UserLoginUtil.removalDuplicateRole(rolePOs);
grantedAuthorities.addAll(loadRoleAuthority(rolePOs));
}
}
// 标记超管
if (isAdmin) {
LOG.debug("mark admin role");
grantedAuthorities.add(new RoleGrantedAuthorityBO(ISystemConstant.ADMIN));
} else {
// 非超管设置其他信息
if (rolePOs != null) {
List<RoleSimpleDTO> roleSimpleDTOs = roleUserBaseService.listSimple(rolePOs);
loginUser.setRoles(roleSimpleDTOs);
}
LOG.debug("set department");
List<DepartmentPO> departmentPOs = departmentUserService.listDepartmentPOByUserId(loginUser.getUserId());
List<DepartmentSimpleDTO> departmentSimpleDTOs = departmentUserService.listSimple(departmentPOs);
loginUser.setDepartments(departmentSimpleDTOs);
if (groupUserBaseService != null) {
LOG.debug("set group");
List<GroupPO> groupPOs = groupUserBaseService.listGroupPOByUserId(loginUser.getUserId());
List<GroupSimpleDTO> groupSimpleDTOs = groupUserBaseService.listSimple(groupPOs);
loginUser.setGroups(groupSimpleDTOs);
}
if (positionUserBaseService != null) {
LOG.debug("set position");
List<PositionPO> positionPOs = positionUserBaseService.listPositionPOByUserId(loginUser.getUserId());
List<PositionSimpleDTO> positionSimpleDTOs = positionUserBaseService.listSimple(positionPOs);
loginUser.setPositions(positionSimpleDTOs);
}
}
}
// 设置数据权限排除超管
if (!StringUtils.equalsIgnoreCase(ISystemConstant.ADMIN, loginUser.getUsername()) && !isAdmin) {
// 非管理员系统用户设置数据权限
if (loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue())) {
LOG.debug("set data authority");
setUserDataAuthority(loginUser);
}
}
loginUser.setAuthorities(grantedAuthorities);
}
/**
* 设置人员数据权限
@ -160,4 +249,33 @@ public class UserLoginService {
return roleDataAuthority;
}
/**
* 角色授权列表
*
* @param rolePOs
* @return
*/
private List<GrantedAuthority> loadRoleAuthority(List<RolePO> rolePOs) {
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
if (null != rolePOs && !rolePOs.isEmpty()) {
// 设置菜单权限
rolePOs.forEach((rolePO) -> {
List<String> menuUrls = roleMenuBaseService.listMenuUrl(rolePO.getRoleId());
List<String> inserts = new ArrayList<>();
List<String> deletes = new ArrayList<>();
List<String> updates = new ArrayList<>();
List<String> queries = new ArrayList<>();
if (accessControlProperties.getRolePermission()) {
inserts.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_INSERT));
deletes.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_DELETE));
updates.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_UPDATE));
queries.addAll(rolePermissionService.listPermissionUrl(rolePO.getRoleId(), IRolePermissionBaseService.PERMISSION_QUERY));
}
grantedAuthorities.add(new RoleGrantedAuthorityBO(rolePO.getRoleId(), rolePO.getRoleName(), menuUrls, inserts, deletes, updates, queries));
});
}
return grantedAuthorities;
}
}

View File

@ -1,14 +1,10 @@
package ink.wgink.login.base.util;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.login.base.manager.ConfigManager;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.pojo.pos.RolePO;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import java.util.Map;
import java.util.List;
/**
* @Description: 用户登录
@ -19,75 +15,44 @@ import java.util.Map;
public class UserLoginUtil {
/**
* 创建登录用户
* 删除重复的角色
*
* @param userPO
* @return
* @param rolePOs
*/
public static LoginUser createLoginUser(UserPO userPO) {
LoginUser loginUser = new LoginUser(userPO.getUserUsername(), userPO.getUserPassword(),
userPO.getUserType() == 1 ? true : false,
isAccountNonExpired(userPO),
isCredentialsNonExpired(userPO),
userPO.getUserState() == 0 ? true : false);
loginUser.setUserId(userPO.getUserId());
loginUser.setUserName(userPO.getUserName());
loginUser.setUserPhone(userPO.getUserPhone());
loginUser.setUserUKey(userPO.getUserUKey());
loginUser.setLoginType(userPO.getLoginType());
loginUser.setUserEmail(userPO.getUserEmail());
loginUser.setUserAvatar(userPO.getUserAvatar());
return loginUser;
}
/**
* 账号是否没有过期
*
* @param userPO
* @return
*/
private static boolean isAccountNonExpired(UserPO userPO) {
if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) {
return true;
public static void removalDuplicateRole(List<RolePO> rolePOs) {
if (rolePOs == null || rolePOs.isEmpty()) {
return;
}
if (!StringUtils.isBlank(userPO.getUserExpiredDate())) {
// 判断用户是否超时失效
DateTime expiredDateTime = DateTime.parse(userPO.getUserExpiredDate(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS));
DateTime nowDateTime = DateTime.now();
if (expiredDateTime.isBefore(nowDateTime)) {
return false;
for (int i = 0; i < rolePOs.size(); i++) {
RolePO rolePO = rolePOs.get(i);
boolean isExist = false;
for (int j = i + 1; j < rolePOs.size(); j++) {
if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) {
isExist = true;
break;
}
}
if (isExist) {
rolePOs.remove(i);
i--;
break;
}
}
return true;
}
/**
* 密码是否没有过期
* 是否超管
*
* @param userPO
* @param roleIds
* @return
*/
private static boolean isCredentialsNonExpired(UserPO userPO) {
if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) {
return true;
}
Map<String, String> config = ConfigManager.getInstance().getConfig();
String passwordValidity = config.get("passwordValidity");
// 自定义密码有效期
if (StringUtils.equals(passwordValidity, "custom")) {
Object passwordValidityDays = config.get("passwordValidityDays");
int validityDays = passwordValidityDays == null ? 0 : (Integer) passwordValidityDays;
if (validityDays <= 0) {
public static boolean hasAdmin(List<String> roleIds) {
for (String roleId : roleIds) {
if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) {
return true;
}
DateTime passwordModifiedDateTime = DateTime.parse(userPO.getGmtPasswordModified(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS));
DateTime passwordExpiredDateTime = passwordModifiedDateTime.plusDays(validityDays);
DateTime nowDateTime = DateTime.now();
if (passwordExpiredDateTime.isBefore(nowDateTime)) {
return false;
}
}
return true;
return false;
}
}

View File

@ -24,11 +24,6 @@
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@ -1,124 +0,0 @@
package ink.wgink.mongo.login.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.department.IDepartmentUserBaseService;
import ink.wgink.interfaces.group.IGroupUserBaseService;
import ink.wgink.interfaces.login.mongo.IMongoLoginService;
import ink.wgink.interfaces.position.IPositionUserBaseService;
import ink.wgink.interfaces.role.IRoleMenuBaseService;
import ink.wgink.interfaces.role.IRolePermissionBaseService;
import ink.wgink.interfaces.role.IRoleUserBaseService;
import ink.wgink.login.base.util.UserLoginUtil;
import ink.wgink.pojo.pos.RolePO;
import ink.wgink.pojo.pos.user.mongo.MongoUserPO;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.service.IUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @ClassName: MongoLoginServiceImpl
* @Description: mongo登录
* @Author: wanggeng
* @Date: 2022/5/19 11:31
* @Version: 1.0
*/
@Service
public class MongoLoginServiceImpl extends DefaultBaseService implements IMongoLoginService {
private static final String COLLECTION_NAME = "loginUser";
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private IUserService userService;
@Autowired(required = false)
private IDepartmentUserBaseService departmentUserBaseService;
@Autowired(required = false)
private IRoleUserBaseService roleUserBaseService;
@Autowired(required = false)
private IRoleMenuBaseService roleMenuBaseService;
@Autowired(required = false)
private IRolePermissionBaseService rolePermissionService;
@Autowired(required = false)
private IGroupUserBaseService groupUserBaseService;
@Autowired(required = false)
private IPositionUserBaseService positionUserBaseService;
@Override
public void update(String userId) {
UserPO userPO = userService.getPO(userId);
UserLoginUtil.createLoginUser(userPO);
// 非系统管理员
if (!StringUtils.equalsIgnoreCase(userPO.getUserUsername(), ISystemConstant.ADMIN)) {
}
}
@Override
public void delete(List<String> userIds) {
}
@Override
public MongoUserPO getPO(String userId) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userId").is(userId)), MongoUserPO.class, COLLECTION_NAME);
}
@Override
public MongoUserPO getPOByUsername(String username) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userUsername").is(username)), MongoUserPO.class, COLLECTION_NAME);
}
/**
* 设置用户信息
*
* @param userPO
*/
private void setMongoUserInfo(MongoUserPO mongoUserPO) {
}
private boolean hasAdmin(List<String> roleIds) {
for (String roleId : roleIds) {
if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) {
return true;
}
}
return false;
}
/**
* 删除重复的角色
*
* @param rolePOs
*/
private void removalDuplicateRole(List<RolePO> rolePOs) {
if (rolePOs == null || rolePOs.isEmpty()) {
return;
}
for (int i = 0; i < rolePOs.size(); i++) {
RolePO rolePO = rolePOs.get(i);
boolean isExist = false;
for (int j = i + 1; j < rolePOs.size(); j++) {
if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) {
isExist = true;
break;
}
}
if (isExist) {
rolePOs.remove(i);
i--;
break;
}
}
}
}

View File

@ -0,0 +1,90 @@
package ink.wgink.mongo.login.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.login.base.service.user.UserLoginService;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.service.department.service.IDepartmentUserService;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.service.user.util.UserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName: MongoLoginServiceImpl
* @Description: mongo登录
* @Author: wanggeng
* @Date: 2022/5/19 11:31
* @Version: 1.0
*/
@Service
public class MongoLoginUserServiceImpl extends DefaultBaseService implements IMongoLoginUserService {
private static final String COLLECTION_NAME = "loginUser";
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private IUserService userService;
@Autowired
private UserLoginService userLoginService;
@Autowired
private IDepartmentUserService departmentUserService;
@Override
public void updateByUserId(String userId) {
UserPO userPO = userService.getPO(userId);
LoginUser loginUser = UserUtil.createLoginUser(userPO);
update(loginUser);
}
@Override
public void updateByUserIds(List<String> userIds) {
userService.listPOByUserIds(userIds).forEach(userPO -> {
LoginUser loginUser = UserUtil.createLoginUser(userPO);
update(loginUser);
});
}
@Override
public void update(List<LoginUser> loginUsers) {
loginUsers.forEach(this::update);
}
@Override
public void update(LoginUser loginUser) {
// 系统用户普通用户加载逻辑公共用户不处理逻辑
if (loginUser.getUserType().equals(UserTypeEnum.SYSTEM.getValue()) ||
loginUser.getUserType().equals(UserTypeEnum.NORMAL.getValue())) {
userLoginService.setLoginUserInfo(loginUser);
}
// 删除原有
delete(Arrays.asList(loginUser.getUserId()));
// 新增更新
mongoTemplate.save(loginUser, COLLECTION_NAME);
}
@Override
public void delete(List<String> userIds) {
mongoTemplate.remove(Query.query(Criteria.where("userId").in(userIds)), COLLECTION_NAME);
}
@Override
public LoginUser get(String userId) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userId").is(userId)), LoginUser.class, COLLECTION_NAME);
}
@Override
public LoginUser getByUsername(String username) {
return mongoTemplate.findOne(new Query().addCriteria(Criteria.where("userUsername").is(username)), LoginUser.class, COLLECTION_NAME);
}
}

View File

@ -0,0 +1,59 @@
package ink.wgink.mongo.login.startup;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.properties.ServerProperties;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.service.user.util.UserUtil;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: MongoLoginStartUp
* @Description: mongo启动
* @Author: wanggeng
* @Date: 2022/5/19 16:25
* @Version: 1.0
*/
@Component
public class MongoLoginStartUp implements ApplicationRunner {
private static final Logger LOG = LoggerFactory.getLogger(MongoLoginStartUp.class);
@Autowired
private ServerProperties serverProperties;
@Autowired
private IMongoLoginUserService mongoLoginUserService;
@Autowired
private IUserService userService;
@Override
public void run(ApplicationArguments args) throws Exception {
if (serverProperties.getMasterNode()) {
LOG.debug("master-node: {}" + serverProperties.getMasterNode());
CachedThreadPoolUtil.execute(() -> {
// 初始化所有账号内容
System.out.println("**************************");
System.out.println("** LoginUser Init Start **");
System.out.println("**************************");
long startTime = System.currentTimeMillis();
Map<String, Object> params = new HashMap<>(0);
userService.listPO(params).forEach(userPO -> {
mongoLoginUserService.update(UserUtil.createLoginUser(userPO));
});
long endTime = System.currentTimeMillis();
System.out.println("**************************");
System.out.println("** LoginUser Init End **");
System.out.println("**************************");
LOG.debug("LoginUser init used time: {}ms", (endTime - startTime) / 1000L);
});
}
}
}

View File

@ -7,6 +7,7 @@ import ink.wgink.exceptions.UpdateException;
import ink.wgink.interfaces.init.IInitBaseTable;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -84,6 +85,15 @@ public interface IDepartmentUserDao extends IInitBaseTable {
*/
List<String> listDepartmentId(Map<String, Object> params) throws SearchException;
/**
* 用户列表
*
* @param params
* @return
* @throws SearchException
*/
List<UserPO> listUserPO(Map<String, Object> params) throws SearchException;
/**
* 用户列表
*

View File

@ -8,6 +8,7 @@ import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.pojo.pos.DepartmentPO;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO;
import ink.wgink.service.user.pojo.pos.UserPO;
import java.util.List;
import java.util.Map;
@ -46,7 +47,7 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService {
* 新增用户ID
*
* @param departmentId 部门ID
* @param userIds 新增的用户ID列表
* @param userIds 新增的用户ID列表
*/
void save(String departmentId, List<String> userIds);
@ -148,6 +149,37 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService {
*/
List<UserDTO> listUser(Map<String, Object> requestParams);
/**
* 用户分页
*
* @param page
* @return
*/
SuccessResultList<List<UserDTO>> listPageUser(ListPage page);
/**
* 用户列表
*
* @param params
* @return
*/
List<UserPO> listUserPO(Map<String, Object> params);
/**
* 用户列表
*
* @param departmentId
* @return
*/
List<UserPO> listUserPOByDepartmentId(String departmentId);
/**
* 用户列表
*
* @param departmentIds
* @return
*/
List<UserPO> listUserPOByDepartmentIds(List<String> departmentIds);
}

View File

@ -8,6 +8,7 @@ import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.department.IDepartmentUserDeleteAfterHandler;
import ink.wgink.interfaces.department.IDepartmentUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.department.DepartmentContainUserDTO;
import ink.wgink.pojo.dtos.department.DepartmentDTO;
@ -21,6 +22,8 @@ import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO;
import ink.wgink.service.department.service.IDepartmentAdjustmentService;
import ink.wgink.service.department.service.IDepartmentService;
import ink.wgink.service.department.service.IDepartmentUserService;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -53,6 +56,8 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
private IDepartmentUserSaveAfterHandler departmentUserSaveAfterHandler;
@Autowired(required = false)
private IDepartmentUserDeleteAfterHandler departmentUserDeleteAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void save(String departmentId, String departmentName, List<String> departmentUserIds) {
@ -77,6 +82,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
i--;
}
}
updateMongoLoginUser(departmentUserIds);
departmentAdjustmentService.save(existUserIds, departmentId, departmentName, USER_DEPARTMENT_TYPE_JOIN);
if (departmentUserSaveAfterHandler != null) {
departmentUserSaveAfterHandler.handle(departmentId, departmentUserIds);
@ -90,7 +96,6 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
throw new SearchException("部门不存在");
}
save(departmentId, departmentPO.getDepartmentName(), userIds);
}
@Override
@ -110,6 +115,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
params.put("departmentId", departmentId);
params.put("userIds", userIds);
departmentUserDao.delete(params);
updateMongoLoginUser(userIds);
departmentAdjustmentService.save(userIds, departmentId, adjustmentDepartmentName, USER_DEPARTMENT_TYPE_LEAVE);
if (departmentUserDeleteAfterHandler != null) {
departmentUserDeleteAfterHandler.handle(departmentId, userIds);
@ -140,6 +146,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
params.put("userId", userId);
departmentUserDao.save(params);
}
updateMongoLoginUser(saveUserIds);
}
departmentAdjustmentService.save(saveUserIds, departmentId, departmentPO.getDepartmentName(), USER_DEPARTMENT_TYPE_JOIN);
if (departmentUserSaveAfterHandler != null) {
@ -561,4 +568,40 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
departmentContainUserDTO.setUsers(listUserByDepartmentId(departmentPO.getDepartmentId()));
return departmentContainUserDTO;
}
@Override
public List<UserPO> listUserPO(Map<String, Object> params) {
params = params == null ? getHashMap(0) : params;
return departmentUserDao.listUserPO(params);
}
@Override
public List<UserPO> listUserPOByDepartmentId(String departmentId) {
Map<String, Object> params = getHashMap(2);
params.put("departmentId", departmentId);
return listUserPO(params);
}
@Override
public List<UserPO> listUserPOByDepartmentIds(List<String> departmentIds) {
if (departmentIds == null || departmentIds.isEmpty()) {
return new ArrayList<>();
}
Map<String, Object> params = getHashMap(2);
params.put("departmentIds", departmentIds);
return listUserPO(params);
}
/**
* 更新 mongo
*
* @param departmentUserIds
*/
private void updateMongoLoginUser(List<String> departmentUserIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
mongoLoginUserService.updateByUserIds(departmentUserIds);
});
}
}
}

View File

@ -280,6 +280,93 @@
</if>
</select>
<!-- 用户列表 -->
<select id="listUserPO" parameterType="map" resultMap="ink.wgink.service.user.dao.IUserDao.userPO" useCache="false">
SELECT
user_id,
user_password,
user_username,
user_name,
user_phone,
user_email,
user_ukey,
user_ukey_electronic_secret_key,
user_type,
user_state,
user_expired_date,
user_avatar,
user_longitude,
user_latitude,
last_login_address,
LEFT(last_login_time, 19) last_login_time,
login_type,
LEFT(gmt_password_modified, 19) gmt_password_modified,
remarks,
LEFT(gmt_create, 19) gmt_create
FROM
sys_user t1
WHERE
t1.is_delete = 0
<if test="userType != null">
AND
t1.user_type = #{userType}
</if>
<if test="userState != null">
AND
t1.user_state = #{userState}
</if>
<if test="departmentId != null and departmentId != ''">
AND
t1.user_id IN (
SELECT
user_id
FROM
sys_department_user st1
WHERE
st1.department_id = #{departmentId}
)
</if>
<if test="departmentIds != null and departmentIds.size > 0">
AND
t1.user_id IN (
SELECT
user_id
FROM
sys_department_user st1
WHERE
st1.department_id IN
<foreach collection="departmentIds" index="index" open="(" separator="," close=")">
#{departmentIds[${index}]}
</foreach>
)
</if>
<if test="excludeDepartmentId != null and excludeDepartmentId != ''">
AND
t1.user_id NOT IN (
SELECT
user_id
FROM
sys_department_user st1
WHERE
st1.department_id = #{excludeDepartmentId}
)
</if>
<if test="excludeDepartmentIds != null and excludeDepartmentIds.size > 0">
AND
t1.user_id NOT IN (
SELECT
user_id
FROM
sys_department_user st1
WHERE
st1.department_id IN
<foreach collection="excludeDepartmentIds" index="index" open="(" separator="," close=")">
#{excludeDepartmentIds[${index}]}
</foreach>
)
</if>
</select>
<!-- 同部门用户ID列表 -->
<select id="listSameDepartmentUserId" parameterType="map" resultType="java.lang.String" useCache="false">
SELECT

View File

@ -37,6 +37,20 @@ public interface IGroupUserService extends IGroupUserBaseService {
*/
void update(String groupId, List<String> saveUserIds, List<String> deleteUserIds);
/**
* 用户组人员删除
*
* @param groupId
*/
void delete(String groupId);
/**
* 用户组人员删除
*
* @param groupIds
*/
void delete(List<String> groupIds);
/**
* 用户组人员删除
*

View File

@ -12,6 +12,7 @@ import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.group.dao.IGroupDao;
import ink.wgink.service.group.pojo.vos.GroupVO;
import ink.wgink.service.group.service.IGroupService;
import ink.wgink.service.group.service.IGroupUserService;
import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil;
import org.springframework.beans.factory.annotation.Autowired;
@ -31,6 +32,8 @@ public class GroupServiceImpl extends DefaultBaseService implements IGroupServic
@Autowired
private IGroupDao groupDao;
@Autowired
private IGroupUserService groupUserService;
@Override
public void save(GroupVO groupVO) {
@ -51,6 +54,9 @@ public class GroupServiceImpl extends DefaultBaseService implements IGroupServic
@Override
public void remove(List<String> ids) {
// 删除用户
groupUserService.delete(ids);
Map<String, Object> params = getHashMap(2);
params.put("groupIds", ids);
setUpdateInfo(params);

View File

@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.group.GroupSimpleDTO;
import ink.wgink.pojo.dtos.group.GroupUserDTO;
@ -14,6 +15,7 @@ import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.group.dao.IGroupUserDao;
import ink.wgink.service.group.service.IGroupService;
import ink.wgink.service.group.service.IGroupUserService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -42,6 +44,8 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
private IUserBaseService userBaseService;
@Autowired
private IGroupService groupService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void save(String groupId, List<String> saveUserIds) {
@ -67,6 +71,7 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
i--;
}
}
updateMongoLoginUser(saveUserIds);
}
@Override
@ -81,15 +86,31 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
params.put("userId", userId);
groupUserDao.save(params);
}
updateMongoLoginUser(saveUserIds);
}
}
@Override
public void delete(String groupId) {
List<String> userIds = listUserId(groupId);
delete(groupId, userIds);
}
@Override
public void delete(List<String> groupIds) {
groupIds.forEach(groupId -> {
delete(groupId);
});
}
@Override
public void delete(String groupId, List<String> userIds) {
Map<String, Object> params = getHashMap(4);
params.put("groupId", groupId);
params.put("userIds", userIds);
groupUserDao.delete(params);
updateMongoLoginUser(userIds);
}
@Override
@ -210,4 +231,12 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
return groupUserDao.listUserId(params);
}
private void updateMongoLoginUser(List<String> userIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
mongoLoginUserService.updateByUserIds(userIds);
});
}
}
}

View File

@ -37,6 +37,20 @@ public interface IPositionUserService extends IPositionUserBaseService {
*/
void update(String positionId, List<String> saveUserIds, List<String> deleteUserIds);
/**
* 职位人员删除
*
* @param positionId
*/
void delete(String positionId);
/**
* 职位人员删除
*
* @param positionIds
*/
void delete(List<String> positionIds);
/**
* 职位人员删除
*

View File

@ -12,6 +12,7 @@ import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.position.dao.IPositionDao;
import ink.wgink.service.position.pojo.vos.PositionVO;
import ink.wgink.service.position.service.IPositionService;
import ink.wgink.service.position.service.IPositionUserService;
import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil;
import org.apache.commons.lang3.StringUtils;
@ -32,6 +33,8 @@ public class PositionServiceImpl extends DefaultBaseService implements IPosition
@Autowired
private IPositionDao positionDao;
@Autowired
private IPositionUserService positionUserService;
@Override
public void save(PositionVO positionVO) {
@ -52,6 +55,9 @@ public class PositionServiceImpl extends DefaultBaseService implements IPosition
@Override
public void remove(List<String> ids) {
// 删除职位用户
positionUserService.delete(ids);
Map<String, Object> params = getHashMap(2);
params.put("positionIds", ids);
setUpdateInfo(params);

View File

@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.position.PositionSimpleDTO;
import ink.wgink.pojo.dtos.position.PositionUserDTO;
@ -14,6 +15,7 @@ import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.position.dao.IPositionUserDao;
import ink.wgink.service.position.service.IPositionService;
import ink.wgink.service.position.service.IPositionUserService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -42,6 +44,8 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
private IUserBaseService userBaseService;
@Autowired
private IPositionService positionService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void save(String positionId, List<String> saveUserIds) {
@ -67,6 +71,8 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
i--;
}
}
updateMongoLoginUser(saveUserIds);
}
@Override
@ -81,15 +87,30 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
params.put("userId", userId);
positionUserDao.save(params);
}
updateMongoLoginUser(saveUserIds);
}
}
@Override
public void delete(String positionId) {
List<String> userIds = listUserId(positionId);
delete(positionId, userIds);
}
@Override
public void delete(List<String> positionIds) {
positionIds.forEach(positionId -> {
delete(positionId);
});
}
@Override
public void delete(String positionId, List<String> userIds) {
Map<String, Object> params = getHashMap(4);
params.put("positionId", positionId);
params.put("userIds", userIds);
positionUserDao.delete(params);
updateMongoLoginUser(userIds);
}
@Override
@ -236,4 +257,17 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
return userBaseService.listPageByIds(userIds, page);
}
/**
* 更新 mongo 用户
*
* @param userIds
*/
private void updateMongoLoginUser(List<String> userIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
mongoLoginUserService.updateByUserIds(userIds);
});
}
}
}

View File

@ -6,6 +6,7 @@ import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.init.IInitBaseTable;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -84,4 +85,13 @@ public interface IRoleUserDao extends IInitBaseTable {
* @throws SearchException
*/
List<DepartmentUserDTO> listDepartmentUser(Map<String, Object> params) throws SearchException;
/**
* 用户列表
*
* @param params
* @return
* @throws SearchException
*/
List<UserPO> listUserPO(Map<String, Object> params) throws SearchException;
}

View File

@ -5,6 +5,7 @@ import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.user.pojo.pos.UserPO;
import java.util.List;
import java.util.Map;
@ -41,11 +42,23 @@ public interface IRoleUserService extends IRoleUserBaseService {
* 更新用户组人员列表
*
* @param roleId 角色ID
* @param saveIds 新增ID列表
* @param saveUserIds 新增ID列表
* @param deleteIds 删除ID列表
*/
void update(String roleId, List<String> saveUserIds, List<String> deleteIds);
/**
* 删除角色用户
* @param roleId
*/
void delete(String roleId);
/**
* 删除角色用户
* @param roleIds
*/
void delete(List<String> roleIds);
/**
* 用户组人员删除
*
@ -77,4 +90,28 @@ public interface IRoleUserService extends IRoleUserBaseService {
* @return
*/
SuccessResultList<List<UserDTO>> listPageUser(ListPage page);
/**
* 用户列表
*
* @param params
* @return
*/
List<UserPO> listUserPO(Map<String, Object> params);
/**
* 用户列表
*
* @param roleId
* @return
*/
List<UserPO> listUserPOByRoleId(String roleId);
/**
* 用户列表
*
* @param roleIds
* @return
*/
List<UserPO> listUserPOByRoleIds(List<String> roleIds);
}

View File

@ -3,7 +3,7 @@ package ink.wgink.service.role.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.common.enums.RoleDataRightEnum;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.department.IDepartmentUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.dtos.role.RoleDTO;
import ink.wgink.pojo.dtos.role.RoleDataRightDTO;
import ink.wgink.pojo.dtos.role.RoleDataRightInfoDTO;
@ -11,6 +11,7 @@ import ink.wgink.service.role.dao.IRoleDataRightDao;
import ink.wgink.service.role.pojo.vos.RoleDataRightVO;
import ink.wgink.service.role.service.IRoleDataRightService;
import ink.wgink.service.role.service.IRoleService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -36,6 +37,8 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
private IRoleDataRightDao roleDataRightDao;
@Autowired
private IRoleService roleService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void update(String roleId, RoleDataRightVO roleDataRightVO) {
@ -50,6 +53,7 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
params.put("userId", userId);
roleDataRightDao.save(params);
}
updateMongoLoginUser(roleDataRightVO.getUserIds());
}
}
@ -103,5 +107,12 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
return listUserId(params);
}
private void updateMongoLoginUser(List<String> userIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
mongoLoginUserService.updateByUserIds(userIds);
});
}
}
}

View File

@ -1,18 +1,24 @@
package ink.wgink.service.role.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.module.menu.service.IMenuService;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.pojo.dtos.menu.MenuDTO;
import ink.wgink.pojo.dtos.role.RoleMenuDTO;
import ink.wgink.service.role.dao.IRoleMenuDao;
import ink.wgink.service.role.pojo.vos.RoleMenuVO;
import ink.wgink.service.role.service.IRoleMenuService;
import ink.wgink.service.role.service.IRoleUserService;
import ink.wgink.service.user.util.UserUtil;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* When you feel like quitting. Think about why you started
@ -31,6 +37,10 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
private IRoleMenuDao roleMenuDao;
@Autowired
private IMenuService menuService;
@Autowired
private IRoleUserService roleUserService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void update(String roleId, RoleMenuVO roleMenuVO) {
@ -41,6 +51,7 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
params.put("menuId", menuId);
roleMenuDao.save(params);
}
updateMongoLoginUser(roleId);
}
@Override
@ -82,4 +93,17 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
});
return menuUrls;
}
/**
* 更新 mongo 用户
* @param roleId
*/
private void updateMongoLoginUser(String roleId) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
List<LoginUser> loginUsers = roleUserService.listUserPOByRoleId(roleId).stream().map(UserUtil::createLoginUser).collect(Collectors.toList());
mongoLoginUserService.update(loginUsers);
});
}
}
}

View File

@ -1,18 +1,24 @@
package ink.wgink.service.role.service.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.pojo.dtos.permission.PermissionDTO;
import ink.wgink.pojo.dtos.role.RolePermissionDTO;
import ink.wgink.service.permission.service.IPermissionService;
import ink.wgink.service.role.dao.IRolePermissionDao;
import ink.wgink.service.role.pojo.vos.RolePermissionVO;
import ink.wgink.service.role.service.IRolePermissionService;
import ink.wgink.service.role.service.IRoleUserService;
import ink.wgink.service.user.util.UserUtil;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* When you feel like quitting. Think about why you started
@ -31,6 +37,10 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
private IRolePermissionDao rolePermissionDao;
@Autowired
private IPermissionService permissionService;
@Autowired
private IRoleUserService roleUserService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void update(String roleId, RolePermissionVO rolePermissionVO) {
@ -45,6 +55,7 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
params.put("permissionId", permissionIdArray[1]);
rolePermissionDao.save(params);
}
updateMongoLoginUser(roleId);
}
@Override
@ -101,5 +112,18 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
return permissionUrls;
}
/**
* 更新 mongo 用户
*
* @param roleId
*/
private void updateMongoLoginUser(String roleId) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
List<LoginUser> loginUsers = roleUserService.listUserPOByRoleId(roleId).stream().map(UserUtil::createLoginUser).collect(Collectors.toList());
mongoLoginUserService.update(loginUsers);
});
}
}
}

View File

@ -15,9 +15,8 @@ import ink.wgink.pojo.pos.RolePO;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.role.dao.IRoleDao;
import ink.wgink.service.role.pojo.vos.RoleVO;
import ink.wgink.service.role.service.IRoleMenuService;
import ink.wgink.service.role.service.IRolePermissionService;
import ink.wgink.service.role.service.IRoleService;
import ink.wgink.service.role.service.IRoleUserService;
import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil;
import org.apache.commons.lang3.StringUtils;
@ -42,9 +41,7 @@ public class RoleServiceImpl extends DefaultBaseService implements IRoleService
@Autowired
private IRoleDao roleDao;
@Autowired
private IRoleMenuService roleMenuService;
@Autowired
private IRolePermissionService rolePermissionService;
private IRoleUserService roleUserService;
@Override
public void save(RoleVO roleVO) throws SaveException, SearchException {
@ -65,6 +62,9 @@ public class RoleServiceImpl extends DefaultBaseService implements IRoleService
@Override
public void remove(List<String> ids) throws RemoveException {
// 删除角色用户
roleUserService.delete(ids);
Map<String, Object> params = getHashMap(10);
params.put("roleIds", ids);
setUpdateInfo(params);

View File

@ -7,6 +7,7 @@ import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.role.IRoleUserDeleteAfterHandler;
import ink.wgink.interfaces.role.IRoleUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.role.RoleSimpleDTO;
@ -18,6 +19,8 @@ import ink.wgink.service.department.service.IDepartmentUserService;
import ink.wgink.service.role.dao.IRoleUserDao;
import ink.wgink.service.role.service.IRoleService;
import ink.wgink.service.role.service.IRoleUserService;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -49,6 +52,8 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
private IRoleUserSaveAfterHandler roleUserSaveAfterHandler;
@Autowired(required = false)
private IRoleUserDeleteAfterHandler roleUserDeleteAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void save(String roleId, List<String> saveUserIds) {
@ -74,6 +79,7 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
i--;
}
}
updateMongoLoginUser(saveUserIds);
if (roleUserSaveAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, saveUserIds);
}
@ -96,18 +102,33 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
params.put("userId", userId);
roleUserDao.save(params);
}
updateMongoLoginUser(saveUserIds);
}
if (roleUserSaveAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, saveUserIds);
}
}
@Override
public void delete(String roleId) {
List<String> userIds = listUserId(roleId);
delete(roleId, userIds);
}
@Override
public void delete(List<String> roleIds) {
roleIds.forEach(roleId -> {
delete(roleId);
});
}
@Override
public void delete(String roleId, List<String> userIds) {
Map<String, Object> params = getHashMap(4);
params.put("roleId", roleId);
params.put("userIds", userIds);
roleUserDao.delete(params);
updateMongoLoginUser(userIds);
if (roleUserDeleteAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, userIds);
}
@ -267,6 +288,39 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
return new SuccessResultList<>(userDTOs, pageInfo.getPageNum(), pageInfo.getTotal());
}
@Override
public List<UserPO> listUserPO(Map<String, Object> params) {
params = params == null ? getHashMap(0) : params;
return roleUserDao.listUserPO(params);
}
@Override
public List<UserPO> listUserPOByRoleId(String roleId) {
Map<String, Object> params = getHashMap(2);
params.put("roleId", roleId);
return listUserPO(params);
}
@Override
public List<UserPO> listUserPOByRoleIds(List<String> roleIds) {
Map<String, Object> params = getHashMap(2);
params.put("roleIds", roleIds);
return listUserPO(params);
}
/**
* 更新mongo
*
* @param userIds
*/
private void updateMongoLoginUser(List<String> userIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
mongoLoginUserService.updateByUserIds(userIds);
});
}
}
private List<String> listGroupUserId(Map<String, Object> params) {
return roleUserDao.listGroupUserId(params);
}

View File

@ -7,7 +7,6 @@
<resultMap id="roleUserDTO" type="ink.wgink.pojo.dtos.role.RoleUserDTO" extends="ink.wgink.service.user.dao.IUserDao.userDTO">
<result column="role_id" property="roleId"/>
<result column="user_id" property="userId"/>
<result column="user_sort" property="userSort"/>
</resultMap>
<!-- 建表 -->
@ -214,6 +213,106 @@
</if>
</select>
<!-- 用户列表 -->
<select id="listUserPO" parameterType="map" resultMap="ink.wgink.service.user.dao.IUserDao.userPO" useCache="false">
SELECT
user_id,
user_password,
user_username,
user_name,
user_phone,
user_email,
user_ukey,
user_ukey_electronic_secret_key,
user_type,
user_state,
user_expired_date,
user_avatar,
user_longitude,
user_latitude,
last_login_address,
LEFT(last_login_time, 19) last_login_time,
login_type,
LEFT(gmt_password_modified, 19) gmt_password_modified,
remarks,
LEFT(gmt_create, 19) gmt_create
FROM
sys_user t1
WHERE
t1.is_delete = 0
<if test="userType != null">
AND
t1.user_type = #{userType}
</if>
<if test="userState != null">
AND
t1.user_state = #{userState}
</if>
<if test="excludeUserType != null and excludeUserType != ''">
AND
t1.user_type != #{excludeUserType}
</if>
<if test="roleId != null and roleId != ''">
AND
t1.user_id IN (
SELECT
st1.user_id
FROM
sys_role_user st1
WHERE
role_id = #{roleId}
)
</if>
<if test="roleIds != null and roleIds.size > 0">
AND
t1.user_id IN (
SELECT
user_id
FROM
sys_role_user st1
WHERE
st1.role_id IN
<foreach collection="roleIds" index="index" open="(" separator="," close=")">
#{roleIds[${index}]}
</foreach>
)
</if>
<if test="noRole != null and noRole == true">
AND
t1.user_id NOT IN (
SELECT
st3.user_id
FROM
sys_role_user st3
)
</if>
<if test="excludeRoleId != null and excludeRoleId != ''">
AND
t1.user_id NOT IN (
SELECT
user_id
FROM
sys_role_user st1
WHERE
st1.role_id = #{excludeRoleId}
)
</if>
<if test="excludeRoleIds != null and excludeRoleIds.size > 0">
AND
t1.user_id NOT IN (
SELECT
user_id
FROM
sys_role_user st1
WHERE
st1.role_id IN
<foreach collection="excludeRoleIds" index="index" open="(" separator="," close=")">
#{excludeRoleIds[${index}]}
</foreach>
)
</if>
</select>
<!-- 部门用户列表 -->
<select id="listRoleUser" parameterType="map" resultMap="roleUserDTO" useCache="false">
SELECT

View File

@ -94,10 +94,18 @@ public interface IUserDao extends IInitBaseTable {
*
* @param params
* @return
* @throws SaveException
* @throws SearchException
*/
UserPO getPO(Map<String, Object> params) throws SearchException;
/**
* 详情
* @param params
* @return
* @throws SearchException
*/
List<UserPO> listPO(Map<String, Object> params) throws SearchException;
/**
* 详情
*

View File

@ -4,6 +4,8 @@ import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.IUserCheckService;
import ink.wgink.pojo.result.UploadExcelResultDTO;
import ink.wgink.pojo.vos.UpdatePasswordVO;
import ink.wgink.service.user.enums.UserStateEnum;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.pojo.dtos.AppUserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.pojo.vos.*;
@ -249,6 +251,48 @@ public interface IUserService extends IUserBaseService, IUserCheckService {
*/
UserPO getPOByPhone(String phone);
/**
* 用户列表
*
* @param params
* @return
*/
List<UserPO> listPO(Map<String, Object> params);
/**
* 用户列表
*
* @param userIds
* @return
*/
List<UserPO> listPOByUserIds(List<String> userIds);
/**
* 用户列表
*
* @param userState
* @return
*/
List<UserPO> listPOByUserState(UserStateEnum userState);
/**
* 用户列表
*
* @param userType
* @return
*/
List<UserPO> listPOByUserType(UserTypeEnum userType);
/**
* 用户列表
*
* @param userState
* @param userType
* @return
*/
List<UserPO> listPOByUserStateAndUserType(UserStateEnum userState, UserTypeEnum userType);
/**
* 更新登陆信息
*

View File

@ -14,6 +14,7 @@ import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.manager.ISystemConfigManager;
import ink.wgink.interfaces.user.IUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserUpdateAfterHandler;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.interfaces.user.wechat.miniapp.IMiniappUserBaseService;
import ink.wgink.interfaces.user.wechat.official.account.IOfficialAccountBaseService;
import ink.wgink.module.file.excel.error.AbstractErrorExcelHandler;
@ -27,6 +28,7 @@ import ink.wgink.pojo.result.UploadExcelResultDTO;
import ink.wgink.pojo.vos.UpdatePasswordVO;
import ink.wgink.service.user.dao.IUserDao;
import ink.wgink.service.user.enums.UserStateEnum;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.enums.UserUpdateTypeEnum;
import ink.wgink.service.user.excel.UserExcel;
import ink.wgink.service.user.excel.UserExcelError;
@ -43,6 +45,7 @@ import ink.wgink.util.ResourceUtil;
import ink.wgink.util.UUIDUtil;
import ink.wgink.util.date.DateUtil;
import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
@ -92,6 +95,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
private IUserSaveAfterHandler userSaveAfterHandler;
@Autowired(required = false)
private IUserUpdateAfterHandler userUpdateAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override
public void save(UserVO userVO) {
@ -125,6 +130,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
setSaveInfo(params);
}
userDao.save(params);
updateMongoLoginUser(userId);
if (userSaveAfterHandler != null) {
userSaveAfterHandler.handle(userId, userVO.getUserUsername(), userVO.getUserName());
}
@ -139,6 +146,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
userDao.remove(params);
// 删除关联用户
deleteRelationUser(ids);
updateMongoLoginUser(ids);
}
@Override
@ -150,6 +158,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
setUpdateInfo(params);
params.put("userId", userId);
userDao.update(params);
updateMongoLoginUser(userId);
if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId);
}
@ -169,6 +178,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId);
setAppUpdateInfo(token, params);
userDao.update(params);
updateMongoLoginUser(userId);
if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId);
}
@ -186,6 +196,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userPassword", passwordEncoder.encode(DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(defaultPassword)))));
userDao.updatePassword(params);
updateMongoLoginUser(userId);
// 记录日志
UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO();
userAdjustmentBO.setUserId(userId);
@ -219,10 +231,11 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId);
userDao.updateUsername(params);
updateMongoLoginUser(userId);
if (updateAdjustment) {
updateUsernameAdjustment(userId, oldUserDTO.getUserUsername(), updateUsernameVO);
}
if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId);
}
@ -284,6 +297,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userPO.getUserId());
userDao.updatePassword(params);
updateMongoLoginUser(userPO.getUserId());
// 日志
UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO();
userAdjustmentBO.setUserId(userPO.getUserId());
@ -306,6 +321,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId);
params.put("userExpiredDate", updateExpiredDateVO.getExpiredDate());
userDao.updateExpiredDate(params);
updateMongoLoginUser(userId);
}
@Override
@ -315,6 +332,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.NORMAL.getValue());
setUpdateInfo(params);
userDao.updateUserState(params);
updateMongoLoginUser(userId);
}
@Override
@ -324,6 +343,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.NORMAL.getValue());
setUpdateInfo(params);
userDao.updateUserState(params);
updateMongoLoginUser(userIds);
}
@Override
@ -333,6 +354,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.UN_PASS.getValue());
setUpdateInfo(params);
userDao.updateUserState(params);
updateMongoLoginUser(userId);
}
@Override
@ -342,6 +365,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.UN_PASS.getValue());
setUpdateInfo(params);
userDao.updateUserState(params);
updateMongoLoginUser(userIds);
}
@Override
@ -415,6 +440,44 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
return userDao.getPO(params);
}
@Override
public List<UserPO> listPO(Map<String, Object> params) {
params = params == null ? getHashMap(0) : params;
return userDao.listPO(params);
}
@Override
public List<UserPO> listPOByUserIds(List<String> userIds) {
if (userIds == null || userIds.isEmpty()) {
return new ArrayList<>();
}
Map<String, Object> params = getHashMap(2);
params.put("userIds", userIds);
return listPO(params);
}
@Override
public List<UserPO> listPOByUserState(UserStateEnum userState) {
Map<String, Object> params = getHashMap(2);
params.put("userState", userState.getValue());
return listPO(params);
}
@Override
public List<UserPO> listPOByUserType(UserTypeEnum userType) {
Map<String, Object> params = getHashMap(2);
params.put("userType", userType.getValue());
return listPO(params);
}
@Override
public List<UserPO> listPOByUserStateAndUserType(UserStateEnum userState, UserTypeEnum userType) {
Map<String, Object> params = getHashMap(4);
params.put("userState", userState.getValue());
params.put("userType", userType.getValue());
return listPO(params);
}
@Override
public void updateLoginInfo(Map<String, Object> params) throws UpdateException {
userDao.updateLoginInfo(params);
@ -704,6 +767,35 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
return userDao.list(params);
}
/**
* 更新mongo
*
* @param userId
*/
private void updateMongoLoginUser(String userId) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
LOG.debug("update mongo login user");
mongoLoginUserService.updateByUserId(userId);
});
}
}
/**
* 更新mongo
*
* @param userIds
*/
private void updateMongoLoginUser(List<String> userIds) {
if (mongoLoginUserService != null) {
CachedThreadPoolUtil.execute(() -> {
LOG.debug("update mongo login user");
mongoLoginUserService.updateByUserIds(userIds);
});
}
}
/**
* Excel导入错误对象
*

View File

@ -0,0 +1,103 @@
package ink.wgink.service.user.util;
import ink.wgink.exceptions.base.SystemException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.manager.ISystemConfigManager;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.util.ReflectUtil;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import java.util.Map;
/**
* @ClassName: UserUtil
* @Description: 用户工具
* @Author: wanggeng
* @Date: 2022/5/19 17:56
* @Version: 1.0
*/
public class UserUtil {
/**
* 创建登录用户
*
* @param userPO
* @return
*/
public static LoginUser createLoginUser(UserPO userPO) {
LoginUser loginUser = new LoginUser(userPO.getUserUsername(), userPO.getUserPassword(),
userPO.getUserType() == 1 ? true : false,
isAccountNonExpired(userPO),
isCredentialsNonExpired(userPO),
userPO.getUserState() == 0 ? true : false);
loginUser.setUserId(userPO.getUserId());
loginUser.setUserName(userPO.getUserName());
loginUser.setUserPhone(userPO.getUserPhone());
loginUser.setUserUKey(userPO.getUserUKey());
loginUser.setLoginType(userPO.getLoginType());
loginUser.setUserEmail(userPO.getUserEmail());
loginUser.setUserAvatar(userPO.getUserAvatar());
loginUser.setUserState(userPO.getUserState());
loginUser.setUserType(userPO.getUserType());
return loginUser;
}
/**
* 账号是否没有过期
*
* @param userPO
* @return
*/
private static boolean isAccountNonExpired(UserPO userPO) {
if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) {
return true;
}
if (!StringUtils.isBlank(userPO.getUserExpiredDate())) {
// 判断用户是否超时失效
DateTime expiredDateTime = DateTime.parse(userPO.getUserExpiredDate(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS));
DateTime nowDateTime = DateTime.now();
if (expiredDateTime.isBefore(nowDateTime)) {
return false;
}
}
return true;
}
/**
* 密码是否没有过期
*
* @param userPO
* @return
*/
private static boolean isCredentialsNonExpired(UserPO userPO) {
if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) {
return true;
}
try {
ISystemConfigManager singleInstance = ReflectUtil.getSingleInstance("ink.wgink.login.base.manager.ConfigManager", ISystemConfigManager.class);
Map<String, String> config = singleInstance.getConfig();
String passwordValidity = config.get("passwordValidity");
// 自定义密码有效期
if (StringUtils.equals(passwordValidity, "custom")) {
Object passwordValidityDays = config.get("passwordValidityDays");
int validityDays = passwordValidityDays == null ? 0 : (Integer) passwordValidityDays;
if (validityDays <= 0) {
return true;
}
DateTime passwordModifiedDateTime = DateTime.parse(userPO.getGmtPasswordModified(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS));
DateTime passwordExpiredDateTime = passwordModifiedDateTime.plusDays(validityDays);
DateTime nowDateTime = DateTime.now();
if (passwordExpiredDateTime.isBefore(nowDateTime)) {
return false;
}
}
return true;
} catch (ReflectUtil.ReflectException e) {
throw new SystemException(e);
}
}
}

View File

@ -317,6 +317,50 @@
</if>
</select>
<!-- 用户列表 -->
<select id="listPO" parameterType="map" resultMap="userPO" useCache="true">
SELECT
user_id,
user_password,
user_username,
user_name,
user_phone,
user_email,
user_ukey,
user_ukey_electronic_secret_key,
user_type,
user_state,
user_expired_date,
user_avatar,
user_longitude,
user_latitude,
last_login_address,
LEFT(last_login_time, 19) last_login_time,
login_type,
LEFT(gmt_password_modified, 19) gmt_password_modified,
remarks,
LEFT(gmt_create, 19) gmt_create
FROM
sys_user
WHERE
is_delete = 0
<if test="userIds != null and userIds.size > 0">
AND
user_id IN
<foreach collection="userIds" index="index" open="(" separator="," close=")">
#{userIds[${}]}
</foreach>
</if>
<if test="userState != null">
AND
user_state = #{userState}
</if>
<if test="userType != null">
AND
user_type = #{userType}
</if>
</select>
<!-- 获取用户 -->
<select id="get" parameterType="map" resultMap="userDTO" useCache="true">
SELECT