diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java index 12559de4..0495fc8f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java @@ -1,8 +1,8 @@ package cn.odboy.system.dal.model.response; +import cn.odboy.base.KitBaseUserTimeTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserTb; import io.swagger.annotations.ApiModelProperty; import java.util.Date; import java.util.Objects; @@ -12,7 +12,7 @@ import lombok.Setter; @Getter @Setter -public class SystemUserVo extends SystemUserTb { +public class SystemUserVo extends KitBaseUserTimeTb { @ApiModelProperty(value = "ID", hidden = true) private Long id; diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java index 7e3993bb..b5dafd08 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java @@ -15,9 +15,13 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import java.util.Set; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 角色部门关联 Mapper @@ -27,4 +31,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemRoleDeptMapper extends BaseMapper { + Set listUserDeptByRoleId(@Param("roleId") Long roleId); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java index f07f5fa2..5cc06b8b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java @@ -15,9 +15,13 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemUserJobTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.Set; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; /** * 用户职位关联 Mapper @@ -27,4 +31,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemUserJobMapper extends BaseMapper { + Set listUserJobByUserId(@Param("userId") Long userId); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java index 700e6e21..f7deb075 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java @@ -15,11 +15,15 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.Set; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface SystemUserRoleMapper extends BaseMapper { + Set listUserRoleByUserId(@Param("userId") Long userId); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java index 5c8129b4..c5cb4168 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java @@ -62,7 +62,7 @@ public class SystemUserOnlineInfoDAO { userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); userOnlineVo.setLoginTime(new Date()); } catch (Exception e) { - log.error(e.getMessage(), e); + log.error("保存在线用户信息失败", e); } String loginKey = tokenProvider.loginKey(token); redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java index 66e83d0a..d7712692 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java @@ -49,7 +49,7 @@ public class UserDetailsHandler implements UserDetailsService { public SystemUserJwtVo loadUserByUsername(String username) { SystemUserJwtVo userJwtVo = systemUserInfoDAO.getUserLoginInfoByUserName(username); if (userJwtVo == null) { - SystemUserVo user = systemUserService.getUserVoByUsername(username); + SystemUserVo user = systemUserService.getUserVoWithPasswordByUsername(username); if (user == null) { throw new BadRequestException("用户不存在"); } else { diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java index 28e2f86a..fdaa7750 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java @@ -22,6 +22,9 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +/** + * 用户认证 + */ @Service public class SystemAuthService { @@ -38,6 +41,9 @@ public class SystemAuthService { @Autowired private SystemCaptchaService systemCaptchaService; + /** + * 登录 + */ public SystemAuthVo doLogin(SystemUserLoginArgs loginArgs, HttpServletRequest request) throws Exception { KitValidUtil.notNull(loginArgs); @@ -74,6 +80,9 @@ public class SystemAuthService { return authInfo; } + /** + * 获取当前登录人信息 + */ public SystemUserJwtVo getCurrentUserInfo() { SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); if (jwtUser.getUser() != null) { @@ -82,6 +91,9 @@ public class SystemAuthService { return jwtUser; } + /** + * 退出登录 + */ public void doLogout(HttpServletRequest request) { String token = tokenProvider.getToken(request); systemUserOnlineInfoDAO.logoutByToken(token); diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java index 1de7cbcd..44a6e777 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java @@ -25,6 +25,9 @@ public class SystemCaptchaService { @Autowired private AppProperties properties; + /** + * 获取登录验证码 + */ public SystemCaptchaVo getLoginCaptcha() { // 获取运算的结果 Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); @@ -44,6 +47,12 @@ public class SystemCaptchaService { return captchaVo; } + /** + * 验证验证码 + * + * @param uuid 验证码uuid + * @param inputCode 用户输入的验证码 + */ public void validate(String uuid, String inputCode) { // 查询验证码 String code = redisHelper.get(uuid, String.class); diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java index 128f8fb3..07ad023a 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java @@ -18,18 +18,19 @@ package cn.odboy.system.service; import cn.hutool.core.collection.CollUtil; import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; -import cn.odboy.system.dal.model.response.SystemDeptVo; -import cn.odboy.system.dal.model.response.SystemRoleVo; +import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.response.SystemUserVo; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** - * 数据权限 Service + * 数据权限 * * @author odboy */ @@ -52,16 +53,19 @@ public class SystemDataService { public List queryDeptIdByArgs(SystemUserVo user) { List deptIds = new ArrayList<>(); // 查询用户角色 - List roleList = systemUserRoleService.queryRoleByUsersId(user.getId()); + Set roleList = systemUserRoleService.listUserRoleByUserId(user.getId()); // 获取对应的部门ID - for (SystemRoleVo role : roleList) { + for (SystemRoleTb role : roleList) { SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); switch (Objects.requireNonNull(dataScopeEnum)) { case THIS_LEVEL: - deptIds.add(user.getDept().getId()); + Long currentDeptId = user.getDept().getId(); + deptIds.add(currentDeptId); break; case CUSTOMIZE: - deptIds.addAll(this.queryCustomDataPermissionByArgs(deptIds, role)); + // 优化 283ms -> 51 ms + List customDeptIds = this.queryCustomDataPermissionV2ByArgs(deptIds, role.getId()); + deptIds.addAll(customDeptIds); break; default: return new ArrayList<>(); @@ -73,17 +77,19 @@ public class SystemDataService { /** * 获取自定义的数据权限 * - * @param deptIds 部门ID - * @param role 角色 - * @return 数据权限ID + * @param deptIds 部门ID(外部数据) + * @param roleId 角色ID + * @return 数据权限ID(所有部门ID数据) */ - private List queryCustomDataPermissionByArgs(List deptIds, SystemRoleVo role) { - List deptList = systemRoleDeptService.listDeptByRoleId(role.getId()); + private List queryCustomDataPermissionV2ByArgs(List deptIds, Long roleId) { + Set deptList = systemRoleDeptService.listUserDeptByRoleId(roleId); + Map> deptPidMap = systemDeptService.listPidNonNull().stream() + .collect(Collectors.groupingBy(SystemDeptTb::getPid)); for (SystemDeptTb dept : deptList) { deptIds.add(dept.getId()); - List deptChildren = systemDeptService.listDeptByPid(dept.getId()); + List deptChildren = deptPidMap.getOrDefault(dept.getId(), null); if (CollUtil.isNotEmpty(deptChildren)) { - deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren)); + deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren, deptPidMap)); } } return deptIds; diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java index 7c0aa0ec..7a0429a6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java @@ -226,20 +226,24 @@ public class SystemDeptService { private void queryRelationDeptByArgs(List deptTbList, Set depts) { for (SystemDeptVo dept : deptTbList) { depts.add(dept); - List deptList = this.listDeptByPid(dept.getId()); + List deptList = this.listDeptVoByPid(dept.getId()); if (CollUtil.isNotEmpty(deptList)) { queryRelationDeptByArgs(deptList, depts); } } } - public List queryChildDeptIdByDeptIds(List deptList) { + private List listDeptVoByPid(Long pid) { + return KitBeanUtil.copyToList(this.listDeptByPid(pid), SystemDeptVo.class); + } + + public List queryChildDeptIdByDeptIds(List deptList, Map> deptPidMap) { List list = new ArrayList<>(); - for (SystemDeptVo systemDeptTb : deptList) { + for (SystemDeptTb systemDeptTb : deptList) { if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = this.listDeptByPid(systemDeptTb.getId()); + List deptList1 = deptPidMap.getOrDefault(systemDeptTb.getId(), null); if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(queryChildDeptIdByDeptIds(deptList1)); + list.addAll(this.queryChildDeptIdByDeptIds(deptList1, deptPidMap)); } list.add(systemDeptTb.getId()); } @@ -259,7 +263,7 @@ public class SystemDeptService { deptList.addAll(this.listRootDept()); return deptList; } - deptList.addAll(this.listDeptByPid(dept.getPid())); + deptList.addAll(this.listDeptVoByPid(dept.getPid())); return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); } @@ -359,7 +363,7 @@ public class SystemDeptService { // 根部门 depts.add(this.getDeptVoById(id)); // 子部门 - List deptList = this.listDeptByPid(id); + List deptList = this.listDeptVoByPid(id); if (CollectionUtil.isNotEmpty(deptList)) { queryRelationDeptByArgs(deptList, depts); } @@ -465,10 +469,10 @@ public class SystemDeptService { return vo; } - public List listDeptByPid(long pid) { + public List listDeptByPid(long pid) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SystemDeptTb::getPid, pid); - return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); + return systemDeptMapper.selectList(wrapper); } public void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { @@ -483,4 +487,11 @@ public class SystemDeptService { } KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); } + + public List listPidNonNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + wrapper.isNotNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java index 5a4d9443..dc3b84d3 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java @@ -221,7 +221,7 @@ public class SystemMenuService { * @return / */ public List listMenuByUserId(Long currentUserId) { - List roles = systemUserRoleService.queryRoleByUsersId(currentUserId); + List roles = systemUserRoleService.queryRoleVoByUsersId(currentUserId); Set roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java index 4e81616a..172dbdb0 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java @@ -24,7 +24,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -60,23 +59,6 @@ public class SystemRoleDeptService { } } - /** - * 根据角色id查询 - * - * @param roleId / - * @return / - */ - public List listDeptByRoleId(Long roleId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleDeptTb::getRoleId, roleId); - List systemRoleDeptTbs = systemRoleDeptMapper.selectList(wrapper); - if (systemRoleDeptTbs.isEmpty()) { - return new ArrayList<>(); - } - List deptIds = systemRoleDeptTbs.stream().map(SystemRoleDeptTb::getDeptId).collect(Collectors.toList()); - return systemDeptMapper.selectByIds(deptIds); - } - /** * 根据部门ID统计角色数量 * @@ -92,4 +74,14 @@ public class SystemRoleDeptService { wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); return systemRoleDeptMapper.selectCount(wrapper); } + + /** + * 根据角色id查询部门信息 + * + * @param roleId 角色id + * @return / + */ + public Set listUserDeptByRoleId(Long roleId) { + return systemRoleDeptMapper.listUserDeptByRoleId(roleId); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java index afe2efb9..4229b702 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java @@ -22,13 +22,13 @@ import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.export.SystemRoleExportRowVo; import cn.odboy.system.dal.model.request.SystemCreateRoleArgs; import cn.odboy.system.dal.model.request.SystemQueryRoleArgs; import cn.odboy.system.dal.model.response.SystemMenuVo; import cn.odboy.system.dal.model.response.SystemRoleCodeVo; import cn.odboy.system.dal.model.response.SystemRoleVo; +import cn.odboy.system.dal.model.response.SystemUserVo; import cn.odboy.system.dal.mysql.SystemRoleMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBeanUtil; @@ -75,7 +75,7 @@ public class SystemRoleService { systemRoleMapper.insert(roleTb); // 判断是否有部门数据, 若有, 则需创建关联 if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), roleTb.getId()); } } @@ -218,14 +218,14 @@ public class SystemRoleService { * @param user 用户信息 * @return 权限信息 */ - public List buildUserRolePermissions(SystemUserTb user) { + public List buildUserRolePermissions(SystemUserVo user) { Set permissions = new HashSet<>(); // 如果是管理员直接返回 if (user.getIsAdmin()) { permissions.add("admin"); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); } - List roles = systemUserRoleService.queryRoleByUsersId(user.getId()); + List roles = systemUserRoleService.queryRoleVoByUsersId(user.getId()); permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); @@ -273,7 +273,7 @@ public class SystemRoleService { * @return / */ private int checkRoleLevels(Integer level) { - List levels = systemUserRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + List levels = systemUserRoleService.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() .map(SystemRoleVo::getLevel).collect(Collectors.toList()); int min = Collections.min(levels); if (level != null) { diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java index 33ae7628..ed5c0bab 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java @@ -71,9 +71,7 @@ public class SystemUserJobService { return systemUserJobMapper.selectCount(wrapper); } - public List listUserJobByUserId(Long userId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserJobTb::getUserId, userId); - return systemUserJobMapper.selectList(wrapper); + public Set listUserJobByUserId(Long userId) { + return systemUserJobMapper.listUserJobByUserId(userId); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java index e389bda9..456cc264 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java @@ -30,9 +30,9 @@ import cn.odboy.util.KitBeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -88,11 +88,9 @@ public class SystemUserRoleService { // 查询关联的菜单信息 Set menus = systemRoleMenuService.queryMenuByRoleIds(Collections.singleton(role.getId())); roleVo.setMenus(menus); - // 查询关联的部门信息 - List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); - roleVo.setDepts(new LinkedHashSet<>(depts)); - + Set depts = systemRoleDeptService.listUserDeptByRoleId(role.getId()); + roleVo.setDepts(depts); return roleVo; } @@ -102,16 +100,8 @@ public class SystemUserRoleService { * @param userId 用户ID * @return / */ - public List queryRoleByUsersId(Long userId) { - // 查询用户角色关联 - LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); - userRoleWrapper.eq(SystemUserRoleTb::getUserId, userId); - List userRoles = systemUserRoleMapper.selectList(userRoleWrapper); - if (CollUtil.isEmpty(userRoles)) { - return new ArrayList<>(); - } - Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); - List roles = systemRoleMapper.selectByIds(roleIds); + public List queryRoleVoByUsersId(Long userId) { + Set roles = this.listUserRoleByUserId(userId); return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); } @@ -123,13 +113,24 @@ public class SystemUserRoleService { */ public Integer getDeptLevelByRoles(Set roles) { if (CollUtil.isEmpty(roles)) { + // 最小权限 return Integer.MAX_VALUE; } - Set roleSet = new HashSet<>(); - for (SystemRoleTb role : roles) { - roleSet.add(systemRoleMapper.selectById(role.getId())); + List roleIds = roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(roleIds)) { + // 最小权限 + return Integer.MAX_VALUE; } - return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + List roleLevels = systemRoleMapper.selectList(new LambdaQueryWrapper() + .select(SystemRoleTb::getLevel) + .isNotNull(SystemRoleTb::getLevel) + .in(SystemRoleTb::getId, roleIds) + ).stream().map(SystemRoleTb::getLevel).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(roleLevels)) { + // 最小权限 + return Integer.MAX_VALUE; + } + return Collections.min(roleLevels); } /** @@ -139,7 +140,7 @@ public class SystemUserRoleService { */ public void checkLevel(SystemUserVo args) { Integer currentLevel = Collections.min( - this.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + this.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() .map(SystemRoleVo::getLevel).collect(Collectors.toList())); Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); if (currentLevel > optLevel) { @@ -147,12 +148,6 @@ public class SystemUserRoleService { } } - public List listUserRoleByUserId(Long userId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserRoleTb::getUserId, userId); - return systemUserRoleMapper.selectList(wrapper); - } - public long countUserByRoleIds(Set ids) { if (CollUtil.isEmpty(ids)) { return 0L; @@ -161,4 +156,8 @@ public class SystemUserRoleService { wrapper.in(SystemUserRoleTb::getRoleId, ids); return systemUserRoleMapper.selectCount(wrapper); } + + public Set listUserRoleByUserId(Long userId) { + return systemUserRoleMapper.listUserRoleByUserId(userId); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java index 10cac11f..81afe958 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java @@ -26,15 +26,13 @@ import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.constant.SystemZhConst; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserJobTb; -import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.export.SystemUserExportRowVo; import cn.odboy.system.dal.model.request.SystemQueryUserArgs; import cn.odboy.system.dal.model.request.SystemUpdateUserPasswordArgs; -import cn.odboy.system.dal.model.response.SystemDeptVo; import cn.odboy.system.dal.model.response.SystemRoleVo; import cn.odboy.system.dal.model.response.SystemUserVo; import cn.odboy.system.dal.mysql.SystemUserMapper; @@ -54,7 +52,6 @@ import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -108,24 +105,25 @@ public class SystemUserService { @Transactional(rollbackFor = Exception.class) public void saveUser(SystemUserVo args) { systemUserRoleService.checkLevel(args); + SystemUserTb record = KitBeanUtil.copyToClass(args, SystemUserTb.class); // 默认密码 123456 - args.setPassword(passwordEncoder.encode("123456")); - args.setDeptId(args.getDept().getId()); - if (this.getUserByUsername(args.getUsername()) != null) { + record.setPassword(passwordEncoder.encode("123456")); + record.setDeptId(args.getDept().getId()); + if (this.getUserByUsername(record.getUsername()) != null) { throw new BadRequestException("用户名已存在"); } - if (this.getUserByEmail(args.getEmail()) != null) { + if (this.getUserByEmail(record.getEmail()) != null) { throw new BadRequestException("邮箱已存在"); } - if (this.getUserByPhone(args.getPhone()) != null) { + if (this.getUserByPhone(record.getPhone()) != null) { throw new BadRequestException("手机号已存在"); } // 保存用户 - systemUserMapper.insert(args); + systemUserMapper.insert(record); // 保存用户岗位 - systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + systemUserJobService.batchInsertUserJob(args.getJobs(), record.getId()); // 保存用户角色 - systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId()); } /** @@ -160,7 +158,7 @@ public class SystemUserService { user.setPhone(args.getPhone()); user.setNickName(args.getNickName()); user.setGender(args.getGender()); - systemUserMapper.insertOrUpdate(user); + systemUserMapper.updateById(user); // 清除用户登录缓存 systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); // 更新用户岗位 @@ -204,10 +202,10 @@ public class SystemUserService { // 校验权限 for (Long id : ids) { Integer currentLevel = Collections.min( - systemUserRoleService.queryRoleByUsersId(currentUserId).stream() + systemUserRoleService.queryRoleVoByUsersId(currentUserId).stream() .map(SystemRoleVo::getLevel).collect(Collectors.toList())); Integer optLevel = Collections.min( - systemUserRoleService.queryRoleByUsersId(id).stream().map(SystemRoleVo::getLevel) + systemUserRoleService.queryRoleVoByUsersId(id).stream().map(SystemRoleVo::getLevel) .collect(Collectors.toList())); if (currentLevel > optLevel) { throw new BadRequestException( @@ -335,16 +333,16 @@ public class SystemUserService { */ public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { // 查询用户基本信息 - LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); IPage userPage = systemUserMapper.selectPage(page, wrapper); List users = userPage.getRecords(); // 转换为SystemUserVo并关联查询 - List userVos = users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + List userVos = users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList()); return KitPageUtil.toPage(userVos, userPage.getTotal()); } public long countUserByArgs(SystemQueryUserArgs args) { - LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); return systemUserMapper.selectCount(wrapper); } @@ -415,33 +413,27 @@ public class SystemUserService { /** * 转换为SystemUserVo并关联查询部门、角色、岗位信息 * - * @param user 用户基本信息 + * @param user 用户基本信息 + * @param includePassword 是否包含用户密码 * @return 包含关联信息的SystemUserVo */ - private SystemUserVo convertToUserVo(SystemUserTb user) { + private SystemUserVo convertToUserVo(SystemUserTb user, boolean includePassword) { if (user == null) { return null; } + if (!includePassword) { + // 查询用户时,清空密码 + user.setPassword(null); + } SystemUserVo userVo = KitBeanUtil.copyToClass(user, SystemUserVo.class); // 查询关联的部门信息 if (user.getDeptId() != null) { - SystemDeptVo dept = systemDeptService.getDeptVoById(user.getDeptId()); - userVo.setDept(dept); + userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); } // 查询关联的岗位信息 - List userJobs = systemUserJobService.listUserJobByUserId(user.getId()); - if (CollUtil.isNotEmpty(userJobs)) { - Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); - List jobs = systemJobService.listByIds(jobIds); - userVo.setJobs(new LinkedHashSet<>(jobs)); - } + userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); // 查询关联的角色信息 - List userRoles = systemUserRoleService.listUserRoleByUserId(user.getId()); - if (CollUtil.isNotEmpty(userRoles)) { - Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); - List roles = systemRoleService.listByIds(roleIds); - userVo.setRoles(new LinkedHashSet<>(roles)); - } + userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); return userVo; } @@ -452,8 +444,12 @@ public class SystemUserService { return systemUserMapper.selectOne(wrapper); } + public SystemUserVo getUserVoWithPasswordByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username), true); + } + public SystemUserVo getUserVoByUsername(String username) { - return this.convertToUserVo(this.getUserByUsername(username)); + return this.convertToUserVo(this.getUserByUsername(username), false); } public SystemUserTb getUserByEmail(String email) { @@ -474,9 +470,11 @@ public class SystemUserService { if (!ObjectUtils.isEmpty(args.getDeptId())) { args.getDeptIds().add(args.getDeptId()); // 先查找是否存在子节点 - List data = systemDeptService.listDeptByPid(args.getDeptId()); + List data = systemDeptService.listDeptByPid(args.getDeptId()); + Map> deptPidMap = systemDeptService.listPidNonNull().stream() + .collect(Collectors.groupingBy(SystemDeptTb::getPid)); // 然后把子节点的ID都加入到集合中 - args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap)); } // 数据权限 List dataScopes = systemDataService.queryDeptIdByArgs(this.getUserVoByUsername(currentUsername)); diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml new file mode 100644 index 00000000..96d2714c --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml new file mode 100644 index 00000000..5ffdd7f1 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml new file mode 100644 index 00000000..177b248e --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml @@ -0,0 +1,10 @@ + + + + +