增加了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 ServerInitProperties init;
/**
* 主节点
*/
private Boolean masterNode;
public Integer getPort() { public Integer getPort() {
return port; return port;
@ -114,6 +118,14 @@ public class ServerProperties {
this.init = init; this.init = init;
} }
public Boolean getMasterNode() {
return masterNode == null ? false : masterNode;
}
public void setMasterNode(Boolean masterNode) {
this.masterNode = masterNode;
}
@Override @Override
public String toString() { public String toString() {
final StringBuilder sb = new StringBuilder("{"); final StringBuilder sb = new StringBuilder("{");
@ -131,6 +143,10 @@ public class ServerProperties {
.append(defaultIndexPage).append('\"'); .append(defaultIndexPage).append('\"');
sb.append(",\"defaultHomePage\":\"") sb.append(",\"defaultHomePage\":\"")
.append(defaultHomePage).append('\"'); .append(defaultHomePage).append('\"');
sb.append(",\"init\":")
.append(init);
sb.append(",\"masterNode\":")
.append(masterNode);
sb.append('}'); sb.append('}');
return sb.toString(); 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; package ink.wgink.login.base.authentication.user;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.expand.login.ILoginHandlerService; import ink.wgink.interfaces.expand.login.ILoginHandlerService;
import ink.wgink.interfaces.group.IGroupUserBaseService; import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
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.login.base.consts.IUserCenterConst; import ink.wgink.login.base.consts.IUserCenterConst;
import ink.wgink.login.base.enums.LoginTypeEnum; import ink.wgink.login.base.enums.LoginTypeEnum;
import ink.wgink.login.base.exceptions.UserAuthenticationException; import ink.wgink.login.base.exceptions.UserAuthenticationException;
import ink.wgink.login.base.service.user.UserLoginService; import ink.wgink.login.base.service.user.UserLoginService;
import ink.wgink.pojo.bos.LoginUser; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import javax.servlet.http.HttpSession; 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 * When you feel like quitting. Think about why you started
@ -55,15 +32,8 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
private UserDetailsService userDetailsService; private UserDetailsService userDetailsService;
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
private UserLoginService userLoginService; 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 ILoginHandlerService loginHandler;
private IDepartmentUserService departmentUserService; private IMongoLoginUserService mongoLoginUserService;
private AccessControlProperties accessControlProperties;
private HttpSession httpSession; private HttpSession httpSession;
@Override @Override
@ -71,74 +41,28 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
UserAuthenticationToken userAuthenticationToken = (UserAuthenticationToken) authentication; UserAuthenticationToken userAuthenticationToken = (UserAuthenticationToken) authentication;
String username = userAuthenticationToken.getPrincipal().toString(); String username = userAuthenticationToken.getPrincipal().toString();
httpSession.setAttribute(IUserCenterConst.LOGIN_USERNAME, username); 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())) { if (!passwordEncoder.matches(userAuthenticationToken.getCredentials().toString(), loginUser.getPassword())) {
throw new UserAuthenticationException("用户名或密码错误"); throw new UserAuthenticationException("用户名或密码错误");
} }
if (loginUser.getAuthorities().isEmpty()) {
throw new UserAuthenticationException(loginUser.getUsername() + "用户无任何角色");
}
// 清空session中的错误信息 // 清空session中的错误信息
httpSession.removeAttribute(IUserCenterConst.ERROR_MESSAGE); httpSession.removeAttribute(IUserCenterConst.ERROR_MESSAGE);
httpSession.removeAttribute(IUserCenterConst.LOGIN_USERNAME); 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); 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()); userLoginService.updateUserLoginInfo(loginUser.getUserId(), loginUser.getUserName(), LoginTypeEnum.USERNAME_AND_PASSWORD.getValue());
UserAuthenticationToken userAuthenticationTokenResult = new UserAuthenticationToken(loginUser, null, loginUser.getAuthorities()); UserAuthenticationToken userAuthenticationTokenResult = new UserAuthenticationToken(loginUser, null, loginUser.getAuthorities());
@ -146,20 +70,6 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
return userAuthenticationTokenResult; 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 @Override
public boolean supports(Class<?> authentication) { public boolean supports(Class<?> authentication) {
return UserAuthenticationToken.class.isAssignableFrom(authentication); return UserAuthenticationToken.class.isAssignableFrom(authentication);
@ -250,39 +104,15 @@ public class UserAuthenticationProvider implements AuthenticationProvider {
this.userLoginService = userLoginService; this.userLoginService = userLoginService;
} }
public void setRoleUserBaseService(IRoleUserBaseService roleUserBaseService) { public void setHttpSession(HttpSession httpSession) {
this.roleUserBaseService = roleUserBaseService; this.httpSession = httpSession;
}
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) { public void setLoginHandler(ILoginHandlerService loginHandler) {
this.loginHandler = loginHandler; this.loginHandler = loginHandler;
} }
public void setDepartmentUserService(IDepartmentUserService departmentUserService) { public void setMongoLoginUserService(IMongoLoginUserService mongoLoginUserService) {
this.departmentUserService = departmentUserService; this.mongoLoginUserService = mongoLoginUserService;
}
public void setAccessControlProperties(AccessControlProperties accessControlProperties) {
this.accessControlProperties = accessControlProperties;
}
public void setHttpSession(HttpSession httpSession) {
this.httpSession = httpSession;
} }
} }

View File

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

View File

@ -1,18 +1,12 @@
package ink.wgink.login.base.security.user; package ink.wgink.login.base.security.user;
import ink.wgink.interfaces.expand.login.ILoginHandlerService; import ink.wgink.interfaces.expand.login.ILoginHandlerService;
import ink.wgink.interfaces.group.IGroupUserBaseService; import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
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.authentication.user.UserAuthenticationFilter; import ink.wgink.login.base.authentication.user.UserAuthenticationFilter;
import ink.wgink.login.base.authentication.user.UserAuthenticationProvider; import ink.wgink.login.base.authentication.user.UserAuthenticationProvider;
import ink.wgink.login.base.handler.LoginFailureHandler; import ink.wgink.login.base.handler.LoginFailureHandler;
import ink.wgink.login.base.service.user.UserDetailServiceImpl; import ink.wgink.login.base.service.user.UserDetailServiceImpl;
import ink.wgink.login.base.service.user.UserLoginService; 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.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -39,15 +33,9 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
private String loginProcessUrl; private String loginProcessUrl;
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
private UserLoginService userLoginService; private UserLoginService userLoginService;
private IRoleUserBaseService roleUserBaseService;
private IRoleMenuBaseService roleMenuBaseService;
private IRolePermissionBaseService rolePermissionService;
private IGroupUserBaseService groupUserBaseService;
private IPositionUserBaseService positionUserBaseService;
private ILoginHandlerService loginHandler; private ILoginHandlerService loginHandler;
private IDepartmentUserService departmentUserService;
private AccessControlProperties accessControlProperties;
private HttpSession httpSession; private HttpSession httpSession;
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void configure(HttpSecurity http) throws Exception { public void configure(HttpSecurity http) throws Exception {
@ -61,15 +49,9 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
userAuthenticationProvider.setPasswordEncoder(passwordEncoder); userAuthenticationProvider.setPasswordEncoder(passwordEncoder);
userAuthenticationProvider.setUserDetailsService(userDetailService); userAuthenticationProvider.setUserDetailsService(userDetailService);
userAuthenticationProvider.setUserLoginService(userLoginService); 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.setHttpSession(httpSession);
userAuthenticationProvider.setLoginHandler(loginHandler);
userAuthenticationProvider.setMongoLoginUserService(mongoLoginUserService);
// 加入SpringSecurity的authentication管理的provider集合当中并且添加到UsernamePasswordAuthenticationFilter之前 // 加入SpringSecurity的authentication管理的provider集合当中并且添加到UsernamePasswordAuthenticationFilter之前
http.authenticationProvider(userAuthenticationProvider).addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); http.authenticationProvider(userAuthenticationProvider).addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
} }
@ -94,39 +76,16 @@ public class UserSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurit
this.userLoginService = userLoginService; 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) { public void setLoginHandler(ILoginHandlerService loginHandler) {
this.loginHandler = 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) { public void setHttpSession(HttpSession httpSession) {
this.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.exceptions.SearchException;
import ink.wgink.interfaces.user.IUserDetailCheckService; import ink.wgink.interfaces.user.IUserDetailCheckService;
import ink.wgink.login.base.exceptions.UserAuthenticationException; 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.enums.UserStateEnum;
import ink.wgink.service.user.pojo.pos.UserPO; import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.service.IUserService; import ink.wgink.service.user.service.IUserService;
import ink.wgink.service.user.util.UserUtil;
import ink.wgink.util.date.DateUtil; import ink.wgink.util.date.DateUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
@ -58,7 +58,7 @@ public class UserDetailServiceImpl implements UserDetailsService, IUserDetailChe
if (DateUtil.isDateExpired(userPO.getUserExpiredDate())) { if (DateUtil.isDateExpired(userPO.getUserExpiredDate())) {
throw new UserAuthenticationException("账号已经过期"); 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.common.enums.RoleDataRightEnum;
import ink.wgink.exceptions.SaveException; import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.UpdateException; 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.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.service.log.ILoginLogService;
import ink.wgink.login.base.util.UserLoginUtil;
import ink.wgink.pojo.bos.LoginUser; 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.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.IDepartmentService;
import ink.wgink.service.department.service.IDepartmentUserService; import ink.wgink.service.department.service.IDepartmentUserService;
import ink.wgink.service.user.enums.UserTypeEnum;
import ink.wgink.service.user.service.IUserService; import ink.wgink.service.user.service.IUserService;
import ink.wgink.util.UUIDUtil; import ink.wgink.util.UUIDUtil;
import ink.wgink.util.date.DateUtil; import ink.wgink.util.date.DateUtil;
@ -18,12 +35,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* When you feel like quitting. Think about why you started * When you feel like quitting. Think about why you started
@ -49,6 +64,80 @@ public class UserLoginService {
private ILoginLogService loginLogService; private ILoginLogService loginLogService;
@Autowired(required = false) @Autowired(required = false)
private IRoleDataRightBaseService roleDataRightBaseService; 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; 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; package ink.wgink.login.base.util;
import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.login.base.manager.ConfigManager; import ink.wgink.pojo.pos.RolePO;
import ink.wgink.pojo.bos.LoginUser;
import ink.wgink.service.user.pojo.pos.UserPO;
import org.apache.commons.lang3.StringUtils; 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: 用户登录 * @Description: 用户登录
@ -19,75 +15,44 @@ import java.util.Map;
public class UserLoginUtil { public class UserLoginUtil {
/** /**
* 创建登录用户 * 删除重复的角色
* *
* @param userPO * @param rolePOs
* @return
*/ */
public static LoginUser createLoginUser(UserPO userPO) { public static void removalDuplicateRole(List<RolePO> rolePOs) {
LoginUser loginUser = new LoginUser(userPO.getUserUsername(), userPO.getUserPassword(), if (rolePOs == null || rolePOs.isEmpty()) {
userPO.getUserType() == 1 ? true : false, return;
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;
} }
if (!StringUtils.isBlank(userPO.getUserExpiredDate())) { for (int i = 0; i < rolePOs.size(); i++) {
// 判断用户是否超时失效 RolePO rolePO = rolePOs.get(i);
DateTime expiredDateTime = DateTime.parse(userPO.getUserExpiredDate(), DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)); boolean isExist = false;
DateTime nowDateTime = DateTime.now(); for (int j = i + 1; j < rolePOs.size(); j++) {
if (expiredDateTime.isBefore(nowDateTime)) { if (StringUtils.equals(rolePO.getRoleId(), rolePOs.get(j).getRoleId())) {
return false; isExist = true;
break;
}
}
if (isExist) {
rolePOs.remove(i);
i--;
break;
} }
} }
return true;
} }
/** /**
* 密码是否没有过期 * 是否超管
* *
* @param userPO * @param roleIds
* @return * @return
*/ */
private static boolean isCredentialsNonExpired(UserPO userPO) { public static boolean hasAdmin(List<String> roleIds) {
if (StringUtils.equals(userPO.getUserUsername(), ISystemConstant.ADMIN)) { for (String roleId : roleIds) {
return true; if (StringUtils.equals(ISystemConstant.ADMIN, roleId)) {
}
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) {
return true; 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> <version>1.0-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> </dependencies>
</project> </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.interfaces.init.IInitBaseTable;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO; import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@ -84,6 +85,15 @@ public interface IDepartmentUserDao extends IInitBaseTable {
*/ */
List<String> listDepartmentId(Map<String, Object> params) throws SearchException; 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.pos.DepartmentPO;
import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO; import ink.wgink.service.department.pojo.vos.DepartmentUserSortVO;
import ink.wgink.service.user.pojo.pos.UserPO;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -46,7 +47,7 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService {
* 新增用户ID * 新增用户ID
* *
* @param departmentId 部门ID * @param departmentId 部门ID
* @param userIds 新增的用户ID列表 * @param userIds 新增的用户ID列表
*/ */
void save(String departmentId, List<String> userIds); void save(String departmentId, List<String> userIds);
@ -148,6 +149,37 @@ public interface IDepartmentUserService extends IDepartmentUserBaseService {
*/ */
List<UserDTO> listUser(Map<String, Object> requestParams); List<UserDTO> listUser(Map<String, Object> requestParams);
/**
* 用户分页
*
* @param page
* @return
*/
SuccessResultList<List<UserDTO>> listPageUser(ListPage page); 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.IDepartmentUserDeleteAfterHandler;
import ink.wgink.interfaces.department.IDepartmentUserSaveAfterHandler; import ink.wgink.interfaces.department.IDepartmentUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage; import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.department.DepartmentContainUserDTO; import ink.wgink.pojo.dtos.department.DepartmentContainUserDTO;
import ink.wgink.pojo.dtos.department.DepartmentDTO; 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.IDepartmentAdjustmentService;
import ink.wgink.service.department.service.IDepartmentService; import ink.wgink.service.department.service.IDepartmentService;
import ink.wgink.service.department.service.IDepartmentUserService; 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.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -53,6 +56,8 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
private IDepartmentUserSaveAfterHandler departmentUserSaveAfterHandler; private IDepartmentUserSaveAfterHandler departmentUserSaveAfterHandler;
@Autowired(required = false) @Autowired(required = false)
private IDepartmentUserDeleteAfterHandler departmentUserDeleteAfterHandler; private IDepartmentUserDeleteAfterHandler departmentUserDeleteAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void save(String departmentId, String departmentName, List<String> departmentUserIds) { public void save(String departmentId, String departmentName, List<String> departmentUserIds) {
@ -77,6 +82,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
i--; i--;
} }
} }
updateMongoLoginUser(departmentUserIds);
departmentAdjustmentService.save(existUserIds, departmentId, departmentName, USER_DEPARTMENT_TYPE_JOIN); departmentAdjustmentService.save(existUserIds, departmentId, departmentName, USER_DEPARTMENT_TYPE_JOIN);
if (departmentUserSaveAfterHandler != null) { if (departmentUserSaveAfterHandler != null) {
departmentUserSaveAfterHandler.handle(departmentId, departmentUserIds); departmentUserSaveAfterHandler.handle(departmentId, departmentUserIds);
@ -90,7 +96,6 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
throw new SearchException("部门不存在"); throw new SearchException("部门不存在");
} }
save(departmentId, departmentPO.getDepartmentName(), userIds); save(departmentId, departmentPO.getDepartmentName(), userIds);
} }
@Override @Override
@ -110,6 +115,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
params.put("departmentId", departmentId); params.put("departmentId", departmentId);
params.put("userIds", userIds); params.put("userIds", userIds);
departmentUserDao.delete(params); departmentUserDao.delete(params);
updateMongoLoginUser(userIds);
departmentAdjustmentService.save(userIds, departmentId, adjustmentDepartmentName, USER_DEPARTMENT_TYPE_LEAVE); departmentAdjustmentService.save(userIds, departmentId, adjustmentDepartmentName, USER_DEPARTMENT_TYPE_LEAVE);
if (departmentUserDeleteAfterHandler != null) { if (departmentUserDeleteAfterHandler != null) {
departmentUserDeleteAfterHandler.handle(departmentId, userIds); departmentUserDeleteAfterHandler.handle(departmentId, userIds);
@ -140,6 +146,7 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
params.put("userId", userId); params.put("userId", userId);
departmentUserDao.save(params); departmentUserDao.save(params);
} }
updateMongoLoginUser(saveUserIds);
} }
departmentAdjustmentService.save(saveUserIds, departmentId, departmentPO.getDepartmentName(), USER_DEPARTMENT_TYPE_JOIN); departmentAdjustmentService.save(saveUserIds, departmentId, departmentPO.getDepartmentName(), USER_DEPARTMENT_TYPE_JOIN);
if (departmentUserSaveAfterHandler != null) { if (departmentUserSaveAfterHandler != null) {
@ -561,4 +568,40 @@ public class DepartmentUserServiceImpl extends DefaultBaseService implements IDe
departmentContainUserDTO.setUsers(listUserByDepartmentId(departmentPO.getDepartmentId())); departmentContainUserDTO.setUsers(listUserByDepartmentId(departmentPO.getDepartmentId()));
return departmentContainUserDTO; 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> </if>
</select> </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列表 --> <!-- 同部门用户ID列表 -->
<select id="listSameDepartmentUserId" parameterType="map" resultType="java.lang.String" useCache="false"> <select id="listSameDepartmentUserId" parameterType="map" resultType="java.lang.String" useCache="false">
SELECT SELECT

View File

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

View File

@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage; import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.group.GroupSimpleDTO; import ink.wgink.pojo.dtos.group.GroupSimpleDTO;
import ink.wgink.pojo.dtos.group.GroupUserDTO; 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.dao.IGroupUserDao;
import ink.wgink.service.group.service.IGroupService; import ink.wgink.service.group.service.IGroupService;
import ink.wgink.service.group.service.IGroupUserService; import ink.wgink.service.group.service.IGroupUserService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,6 +44,8 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
private IUserBaseService userBaseService; private IUserBaseService userBaseService;
@Autowired @Autowired
private IGroupService groupService; private IGroupService groupService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void save(String groupId, List<String> saveUserIds) { public void save(String groupId, List<String> saveUserIds) {
@ -67,6 +71,7 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
i--; i--;
} }
} }
updateMongoLoginUser(saveUserIds);
} }
@Override @Override
@ -81,15 +86,31 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
params.put("userId", userId); params.put("userId", userId);
groupUserDao.save(params); 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 @Override
public void delete(String groupId, List<String> userIds) { public void delete(String groupId, List<String> userIds) {
Map<String, Object> params = getHashMap(4); Map<String, Object> params = getHashMap(4);
params.put("groupId", groupId); params.put("groupId", groupId);
params.put("userIds", userIds); params.put("userIds", userIds);
groupUserDao.delete(params); groupUserDao.delete(params);
updateMongoLoginUser(userIds);
} }
@Override @Override
@ -210,4 +231,12 @@ public class GroupUserServiceImpl extends DefaultBaseService implements IGroupUs
return groupUserDao.listUserId(params); 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); 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.dao.IPositionDao;
import ink.wgink.service.position.pojo.vos.PositionVO; import ink.wgink.service.position.pojo.vos.PositionVO;
import ink.wgink.service.position.service.IPositionService; import ink.wgink.service.position.service.IPositionService;
import ink.wgink.service.position.service.IPositionUserService;
import ink.wgink.util.UUIDUtil; import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil; import ink.wgink.util.map.HashMapUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -32,6 +33,8 @@ public class PositionServiceImpl extends DefaultBaseService implements IPosition
@Autowired @Autowired
private IPositionDao positionDao; private IPositionDao positionDao;
@Autowired
private IPositionUserService positionUserService;
@Override @Override
public void save(PositionVO positionVO) { public void save(PositionVO positionVO) {
@ -52,6 +55,9 @@ public class PositionServiceImpl extends DefaultBaseService implements IPosition
@Override @Override
public void remove(List<String> ids) { public void remove(List<String> ids) {
// 删除职位用户
positionUserService.delete(ids);
Map<String, Object> params = getHashMap(2); Map<String, Object> params = getHashMap(2);
params.put("positionIds", ids); params.put("positionIds", ids);
setUpdateInfo(params); setUpdateInfo(params);

View File

@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage; import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.position.PositionSimpleDTO; import ink.wgink.pojo.dtos.position.PositionSimpleDTO;
import ink.wgink.pojo.dtos.position.PositionUserDTO; 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.dao.IPositionUserDao;
import ink.wgink.service.position.service.IPositionService; import ink.wgink.service.position.service.IPositionService;
import ink.wgink.service.position.service.IPositionUserService; import ink.wgink.service.position.service.IPositionUserService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,6 +44,8 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
private IUserBaseService userBaseService; private IUserBaseService userBaseService;
@Autowired @Autowired
private IPositionService positionService; private IPositionService positionService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void save(String positionId, List<String> saveUserIds) { public void save(String positionId, List<String> saveUserIds) {
@ -67,6 +71,8 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
i--; i--;
} }
} }
updateMongoLoginUser(saveUserIds);
} }
@Override @Override
@ -81,15 +87,30 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
params.put("userId", userId); params.put("userId", userId);
positionUserDao.save(params); 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 @Override
public void delete(String positionId, List<String> userIds) { public void delete(String positionId, List<String> userIds) {
Map<String, Object> params = getHashMap(4); Map<String, Object> params = getHashMap(4);
params.put("positionId", positionId); params.put("positionId", positionId);
params.put("userIds", userIds); params.put("userIds", userIds);
positionUserDao.delete(params); positionUserDao.delete(params);
updateMongoLoginUser(userIds);
} }
@Override @Override
@ -236,4 +257,17 @@ public class PositionUserServiceImpl extends DefaultBaseService implements IPosi
return userBaseService.listPageByIds(userIds, page); 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.interfaces.init.IInitBaseTable;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO; import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.service.user.pojo.pos.UserPO;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@ -84,4 +85,13 @@ public interface IRoleUserDao extends IInitBaseTable {
* @throws SearchException * @throws SearchException
*/ */
List<DepartmentUserDTO> listDepartmentUser(Map<String, Object> params) 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.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.service.user.pojo.pos.UserPO;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -41,11 +42,23 @@ public interface IRoleUserService extends IRoleUserBaseService {
* 更新用户组人员列表 * 更新用户组人员列表
* *
* @param roleId 角色ID * @param roleId 角色ID
* @param saveIds 新增ID列表 * @param saveUserIds 新增ID列表
* @param deleteIds 删除ID列表 * @param deleteIds 删除ID列表
*/ */
void update(String roleId, List<String> saveUserIds, List<String> deleteIds); 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 * @return
*/ */
SuccessResultList<List<UserDTO>> listPageUser(ListPage page); 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.base.DefaultBaseService;
import ink.wgink.common.enums.RoleDataRightEnum; import ink.wgink.common.enums.RoleDataRightEnum;
import ink.wgink.exceptions.SearchException; 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.RoleDTO;
import ink.wgink.pojo.dtos.role.RoleDataRightDTO; import ink.wgink.pojo.dtos.role.RoleDataRightDTO;
import ink.wgink.pojo.dtos.role.RoleDataRightInfoDTO; 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.pojo.vos.RoleDataRightVO;
import ink.wgink.service.role.service.IRoleDataRightService; import ink.wgink.service.role.service.IRoleDataRightService;
import ink.wgink.service.role.service.IRoleService; import ink.wgink.service.role.service.IRoleService;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -36,6 +37,8 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
private IRoleDataRightDao roleDataRightDao; private IRoleDataRightDao roleDataRightDao;
@Autowired @Autowired
private IRoleService roleService; private IRoleService roleService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void update(String roleId, RoleDataRightVO roleDataRightVO) { public void update(String roleId, RoleDataRightVO roleDataRightVO) {
@ -50,6 +53,7 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
params.put("userId", userId); params.put("userId", userId);
roleDataRightDao.save(params); roleDataRightDao.save(params);
} }
updateMongoLoginUser(roleDataRightVO.getUserIds());
} }
} }
@ -103,5 +107,12 @@ public class RoleDataRightServiceImpl extends DefaultBaseService implements IRol
return listUserId(params); 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; package ink.wgink.service.role.service.impl;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.module.menu.service.IMenuService; 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.menu.MenuDTO;
import ink.wgink.pojo.dtos.role.RoleMenuDTO; import ink.wgink.pojo.dtos.role.RoleMenuDTO;
import ink.wgink.service.role.dao.IRoleMenuDao; import ink.wgink.service.role.dao.IRoleMenuDao;
import ink.wgink.service.role.pojo.vos.RoleMenuVO; import ink.wgink.service.role.pojo.vos.RoleMenuVO;
import ink.wgink.service.role.service.IRoleMenuService; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* When you feel like quitting. Think about why you started * When you feel like quitting. Think about why you started
@ -31,6 +37,10 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
private IRoleMenuDao roleMenuDao; private IRoleMenuDao roleMenuDao;
@Autowired @Autowired
private IMenuService menuService; private IMenuService menuService;
@Autowired
private IRoleUserService roleUserService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void update(String roleId, RoleMenuVO roleMenuVO) { public void update(String roleId, RoleMenuVO roleMenuVO) {
@ -41,6 +51,7 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
params.put("menuId", menuId); params.put("menuId", menuId);
roleMenuDao.save(params); roleMenuDao.save(params);
} }
updateMongoLoginUser(roleId);
} }
@Override @Override
@ -82,4 +93,17 @@ public class RoleMenuServiceImpl extends DefaultBaseService implements IRoleMenu
}); });
return menuUrls; 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; package ink.wgink.service.role.service.impl;
import ink.wgink.common.base.DefaultBaseService; 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.permission.PermissionDTO;
import ink.wgink.pojo.dtos.role.RolePermissionDTO; import ink.wgink.pojo.dtos.role.RolePermissionDTO;
import ink.wgink.service.permission.service.IPermissionService; import ink.wgink.service.permission.service.IPermissionService;
import ink.wgink.service.role.dao.IRolePermissionDao; import ink.wgink.service.role.dao.IRolePermissionDao;
import ink.wgink.service.role.pojo.vos.RolePermissionVO; import ink.wgink.service.role.pojo.vos.RolePermissionVO;
import ink.wgink.service.role.service.IRolePermissionService; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* When you feel like quitting. Think about why you started * When you feel like quitting. Think about why you started
@ -31,6 +37,10 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
private IRolePermissionDao rolePermissionDao; private IRolePermissionDao rolePermissionDao;
@Autowired @Autowired
private IPermissionService permissionService; private IPermissionService permissionService;
@Autowired
private IRoleUserService roleUserService;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void update(String roleId, RolePermissionVO rolePermissionVO) { public void update(String roleId, RolePermissionVO rolePermissionVO) {
@ -45,6 +55,7 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
params.put("permissionId", permissionIdArray[1]); params.put("permissionId", permissionIdArray[1]);
rolePermissionDao.save(params); rolePermissionDao.save(params);
} }
updateMongoLoginUser(roleId);
} }
@Override @Override
@ -101,5 +112,18 @@ public class RolePermissionServiceImpl extends DefaultBaseService implements IRo
return permissionUrls; 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.pojo.result.SuccessResultList;
import ink.wgink.service.role.dao.IRoleDao; import ink.wgink.service.role.dao.IRoleDao;
import ink.wgink.service.role.pojo.vos.RoleVO; 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.IRoleService;
import ink.wgink.service.role.service.IRoleUserService;
import ink.wgink.util.UUIDUtil; import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil; import ink.wgink.util.map.HashMapUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -42,9 +41,7 @@ public class RoleServiceImpl extends DefaultBaseService implements IRoleService
@Autowired @Autowired
private IRoleDao roleDao; private IRoleDao roleDao;
@Autowired @Autowired
private IRoleMenuService roleMenuService; private IRoleUserService roleUserService;
@Autowired
private IRolePermissionService rolePermissionService;
@Override @Override
public void save(RoleVO roleVO) throws SaveException, SearchException { public void save(RoleVO roleVO) throws SaveException, SearchException {
@ -65,6 +62,9 @@ public class RoleServiceImpl extends DefaultBaseService implements IRoleService
@Override @Override
public void remove(List<String> ids) throws RemoveException { public void remove(List<String> ids) throws RemoveException {
// 删除角色用户
roleUserService.delete(ids);
Map<String, Object> params = getHashMap(10); Map<String, Object> params = getHashMap(10);
params.put("roleIds", ids); params.put("roleIds", ids);
setUpdateInfo(params); 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.IRoleUserDeleteAfterHandler;
import ink.wgink.interfaces.role.IRoleUserSaveAfterHandler; import ink.wgink.interfaces.role.IRoleUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.interfaces.user.mongo.IMongoLoginUserService;
import ink.wgink.pojo.ListPage; import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.department.DepartmentUserDTO; import ink.wgink.pojo.dtos.department.DepartmentUserDTO;
import ink.wgink.pojo.dtos.role.RoleSimpleDTO; 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.dao.IRoleUserDao;
import ink.wgink.service.role.service.IRoleService; import ink.wgink.service.role.service.IRoleService;
import ink.wgink.service.role.service.IRoleUserService; 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.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -49,6 +52,8 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
private IRoleUserSaveAfterHandler roleUserSaveAfterHandler; private IRoleUserSaveAfterHandler roleUserSaveAfterHandler;
@Autowired(required = false) @Autowired(required = false)
private IRoleUserDeleteAfterHandler roleUserDeleteAfterHandler; private IRoleUserDeleteAfterHandler roleUserDeleteAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void save(String roleId, List<String> saveUserIds) { public void save(String roleId, List<String> saveUserIds) {
@ -74,6 +79,7 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
i--; i--;
} }
} }
updateMongoLoginUser(saveUserIds);
if (roleUserSaveAfterHandler != null) { if (roleUserSaveAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, saveUserIds); roleUserSaveAfterHandler.handle(roleId, saveUserIds);
} }
@ -96,18 +102,33 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
params.put("userId", userId); params.put("userId", userId);
roleUserDao.save(params); roleUserDao.save(params);
} }
updateMongoLoginUser(saveUserIds);
} }
if (roleUserSaveAfterHandler != null) { if (roleUserSaveAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, saveUserIds); 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 @Override
public void delete(String roleId, List<String> userIds) { public void delete(String roleId, List<String> userIds) {
Map<String, Object> params = getHashMap(4); Map<String, Object> params = getHashMap(4);
params.put("roleId", roleId); params.put("roleId", roleId);
params.put("userIds", userIds); params.put("userIds", userIds);
roleUserDao.delete(params); roleUserDao.delete(params);
updateMongoLoginUser(userIds);
if (roleUserDeleteAfterHandler != null) { if (roleUserDeleteAfterHandler != null) {
roleUserSaveAfterHandler.handle(roleId, userIds); roleUserSaveAfterHandler.handle(roleId, userIds);
} }
@ -267,6 +288,39 @@ public class RoleUserServiceImpl extends DefaultBaseService implements IRoleUser
return new SuccessResultList<>(userDTOs, pageInfo.getPageNum(), pageInfo.getTotal()); 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) { private List<String> listGroupUserId(Map<String, Object> params) {
return roleUserDao.listGroupUserId(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"> <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="role_id" property="roleId"/>
<result column="user_id" property="userId"/> <result column="user_id" property="userId"/>
<result column="user_sort" property="userSort"/>
</resultMap> </resultMap>
<!-- 建表 --> <!-- 建表 -->
@ -214,6 +213,106 @@
</if> </if>
</select> </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 id="listRoleUser" parameterType="map" resultMap="roleUserDTO" useCache="false">
SELECT SELECT

View File

@ -94,10 +94,18 @@ public interface IUserDao extends IInitBaseTable {
* *
* @param params * @param params
* @return * @return
* @throws SaveException * @throws SearchException
*/ */
UserPO getPO(Map<String, Object> params) 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.interfaces.user.IUserCheckService;
import ink.wgink.pojo.result.UploadExcelResultDTO; import ink.wgink.pojo.result.UploadExcelResultDTO;
import ink.wgink.pojo.vos.UpdatePasswordVO; 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.dtos.AppUserDTO;
import ink.wgink.service.user.pojo.pos.UserPO; import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.pojo.vos.*; import ink.wgink.service.user.pojo.vos.*;
@ -249,6 +251,48 @@ public interface IUserService extends IUserBaseService, IUserCheckService {
*/ */
UserPO getPOByPhone(String phone); 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.manager.ISystemConfigManager;
import ink.wgink.interfaces.user.IUserSaveAfterHandler; import ink.wgink.interfaces.user.IUserSaveAfterHandler;
import ink.wgink.interfaces.user.IUserUpdateAfterHandler; 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.miniapp.IMiniappUserBaseService;
import ink.wgink.interfaces.user.wechat.official.account.IOfficialAccountBaseService; import ink.wgink.interfaces.user.wechat.official.account.IOfficialAccountBaseService;
import ink.wgink.module.file.excel.error.AbstractErrorExcelHandler; 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.pojo.vos.UpdatePasswordVO;
import ink.wgink.service.user.dao.IUserDao; import ink.wgink.service.user.dao.IUserDao;
import ink.wgink.service.user.enums.UserStateEnum; 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.enums.UserUpdateTypeEnum;
import ink.wgink.service.user.excel.UserExcel; import ink.wgink.service.user.excel.UserExcel;
import ink.wgink.service.user.excel.UserExcelError; 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.UUIDUtil;
import ink.wgink.util.date.DateUtil; import ink.wgink.util.date.DateUtil;
import ink.wgink.util.map.HashMapUtil; import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.thread.CachedThreadPoolUtil;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -92,6 +95,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
private IUserSaveAfterHandler userSaveAfterHandler; private IUserSaveAfterHandler userSaveAfterHandler;
@Autowired(required = false) @Autowired(required = false)
private IUserUpdateAfterHandler userUpdateAfterHandler; private IUserUpdateAfterHandler userUpdateAfterHandler;
@Autowired(required = false)
private IMongoLoginUserService mongoLoginUserService;
@Override @Override
public void save(UserVO userVO) { public void save(UserVO userVO) {
@ -125,6 +130,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
setSaveInfo(params); setSaveInfo(params);
} }
userDao.save(params); userDao.save(params);
updateMongoLoginUser(userId);
if (userSaveAfterHandler != null) { if (userSaveAfterHandler != null) {
userSaveAfterHandler.handle(userId, userVO.getUserUsername(), userVO.getUserName()); userSaveAfterHandler.handle(userId, userVO.getUserUsername(), userVO.getUserName());
} }
@ -139,6 +146,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
userDao.remove(params); userDao.remove(params);
// 删除关联用户 // 删除关联用户
deleteRelationUser(ids); deleteRelationUser(ids);
updateMongoLoginUser(ids);
} }
@Override @Override
@ -150,6 +158,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
setUpdateInfo(params); setUpdateInfo(params);
params.put("userId", userId); params.put("userId", userId);
userDao.update(params); userDao.update(params);
updateMongoLoginUser(userId);
if (userUpdateAfterHandler != null) { if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId); userUpdateAfterHandler.handle(userId);
} }
@ -169,6 +178,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId); params.put("userId", userId);
setAppUpdateInfo(token, params); setAppUpdateInfo(token, params);
userDao.update(params); userDao.update(params);
updateMongoLoginUser(userId);
if (userUpdateAfterHandler != null) { if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId); 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))))); params.put("userPassword", passwordEncoder.encode(DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(defaultPassword)))));
userDao.updatePassword(params); userDao.updatePassword(params);
updateMongoLoginUser(userId);
// 记录日志 // 记录日志
UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO(); UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO();
userAdjustmentBO.setUserId(userId); userAdjustmentBO.setUserId(userId);
@ -219,10 +231,11 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId); params.put("userId", userId);
userDao.updateUsername(params); userDao.updateUsername(params);
updateMongoLoginUser(userId);
if (updateAdjustment) { if (updateAdjustment) {
updateUsernameAdjustment(userId, oldUserDTO.getUserUsername(), updateUsernameVO); updateUsernameAdjustment(userId, oldUserDTO.getUserUsername(), updateUsernameVO);
} }
if (userUpdateAfterHandler != null) { if (userUpdateAfterHandler != null) {
userUpdateAfterHandler.handle(userId); userUpdateAfterHandler.handle(userId);
} }
@ -284,6 +297,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userPO.getUserId()); params.put("userId", userPO.getUserId());
userDao.updatePassword(params); userDao.updatePassword(params);
updateMongoLoginUser(userPO.getUserId());
// 日志 // 日志
UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO(); UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO();
userAdjustmentBO.setUserId(userPO.getUserId()); userAdjustmentBO.setUserId(userPO.getUserId());
@ -306,6 +321,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userId", userId); params.put("userId", userId);
params.put("userExpiredDate", updateExpiredDateVO.getExpiredDate()); params.put("userExpiredDate", updateExpiredDateVO.getExpiredDate());
userDao.updateExpiredDate(params); userDao.updateExpiredDate(params);
updateMongoLoginUser(userId);
} }
@Override @Override
@ -315,6 +332,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.NORMAL.getValue()); params.put("userState", UserStateEnum.NORMAL.getValue());
setUpdateInfo(params); setUpdateInfo(params);
userDao.updateUserState(params); userDao.updateUserState(params);
updateMongoLoginUser(userId);
} }
@Override @Override
@ -324,6 +343,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.NORMAL.getValue()); params.put("userState", UserStateEnum.NORMAL.getValue());
setUpdateInfo(params); setUpdateInfo(params);
userDao.updateUserState(params); userDao.updateUserState(params);
updateMongoLoginUser(userIds);
} }
@Override @Override
@ -333,6 +354,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.UN_PASS.getValue()); params.put("userState", UserStateEnum.UN_PASS.getValue());
setUpdateInfo(params); setUpdateInfo(params);
userDao.updateUserState(params); userDao.updateUserState(params);
updateMongoLoginUser(userId);
} }
@Override @Override
@ -342,6 +365,8 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
params.put("userState", UserStateEnum.UN_PASS.getValue()); params.put("userState", UserStateEnum.UN_PASS.getValue());
setUpdateInfo(params); setUpdateInfo(params);
userDao.updateUserState(params); userDao.updateUserState(params);
updateMongoLoginUser(userIds);
} }
@Override @Override
@ -415,6 +440,44 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
return userDao.getPO(params); 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 @Override
public void updateLoginInfo(Map<String, Object> params) throws UpdateException { public void updateLoginInfo(Map<String, Object> params) throws UpdateException {
userDao.updateLoginInfo(params); userDao.updateLoginInfo(params);
@ -704,6 +767,35 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
return userDao.list(params); 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导入错误对象 * 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> </if>
</select> </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 id="get" parameterType="map" resultMap="userDTO" useCache="true">
SELECT SELECT