diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCacheKey.java similarity index 95% rename from cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java rename to cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCacheKey.java index b12bcce5..554844af 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCacheKey.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.odboy.system.dal.redis; +package cn.odboy.system.constant; /** * 关于缓存的Key集合 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java index 7ae1c964..0ae7a5c9 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java @@ -21,6 +21,7 @@ import cn.odboy.system.dal.model.response.SystemAuthVo; import cn.odboy.system.service.SystemAuthService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -28,7 +29,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import jakarta.servlet.http.HttpServletRequest; /** * 授权、根据token获取用户详细信息 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java index 73ade6c6..bbc876cb 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java @@ -68,7 +68,7 @@ public class SystemMenuController { @PostMapping(value = "/listMenuByPid") @PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity> listMenuByPid(@RequestParam Long pid) { - List systemMenuTbs = systemMenuService.listMenuByPid(pid); + List systemMenuTbs = systemMenuService.listMenuByPid(pid, false); return ResponseEntity.ok(systemMenuTbs); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java index 6098ddfc..88d0658a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java @@ -20,10 +20,10 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; import java.util.Objects; @Getter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java index d316ffe8..8b022468 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java @@ -43,31 +43,42 @@ public class SystemUserTb extends KitBaseUserTimeTb { private Long deptId; @NotBlank @ApiModelProperty(value = "用户名称") + @TableField(value = "username") private String username; @NotBlank @ApiModelProperty(value = "用户昵称") + @TableField(value = "nick_name") private String nickName; @Email @NotBlank @ApiModelProperty(value = "邮箱") + @TableField(value = "email") private String email; @NotBlank @ApiModelProperty(value = "电话号码") + @TableField(value = "phone") private String phone; @ApiModelProperty(value = "用户性别") + @TableField(value = "gender") private String gender; @ApiModelProperty(value = "头像真实名称", hidden = true) + @TableField(value = "avatar_name") private String avatarName; @ApiModelProperty(value = "头像存储的路径", hidden = true) + @TableField(value = "avatar_path") private String avatarPath; @ApiModelProperty(value = "密码") + @TableField(value = "password") private String password; @NotNull @ApiModelProperty(value = "是否启用") + @TableField(value = "enabled") private Boolean enabled; @ApiModelProperty(value = "是否为admin账号", hidden = true) + @TableField(value = "is_admin") private Boolean isAdmin = false; @ApiModelProperty(value = "最后修改密码的时间", hidden = true) + @TableField(value = "pwd_reset_time") private Date pwdResetTime; @Override diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java deleted file mode 100644 index 1ffeb347..00000000 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021-2026 Odboy - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.odboy.system.dal.redis; - -/** - * 关于缓存的Key集合 - */ -public interface SystemRedisKey { - - /** - * 用户 - */ - String USER_ID = "user::id:"; - /** - * 数据 - */ - String DATA_USER = "data::user:"; - /** - * 菜单 - */ - String MENU_ID = "menu::id:"; - String MENU_USER = "menu::user:"; - /** - * 角色授权 - */ - String ROLE_AUTH = "role::auth:"; - String ROLE_USER = "role::user:"; - /** - * 角色信息 - */ - String ROLE_ID = "role::id:"; - /** - * 部门 - */ - String DEPT_ID = "dept::id:"; - /** - * 岗位 - */ - String JOB_ID = "job::id:"; - /** - * 数据字典 - */ - String DICT_NAME = "dict::name:"; - /** - * 在线用户 - */ - String ONLINE_USER = "online::token:"; - /** - * 登录验证码 - */ - String CAPTCHA_LOGIN = "captcha::login:"; - /** - * 用户信息 - */ - String USER_INFO = "user::info:"; -} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java index b52f0f77..767151cb 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java @@ -18,6 +18,7 @@ package cn.odboy.system.dal.redis; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.framework.redis.KitRedisHelper; +import cn.odboy.system.constant.SystemCacheKey; import cn.odboy.system.dal.model.response.SystemUserJwtVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; @@ -42,7 +43,7 @@ public class SystemUserInfoDAO { if (StrUtil.isNotEmpty(userName)) { // 添加数据, 避免数据同时过期(2小时左右) long time = 7200 + RandomUtil.randomInt(900, 1800); - redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); + redisHelper.set(SystemCacheKey.ONLINE_USER + userName, user, time); } } @@ -55,7 +56,7 @@ public class SystemUserInfoDAO { public void deleteUserLoginInfoByUserName(String userName) { if (StrUtil.isNotEmpty(userName)) { // 清除数据 - redisHelper.del(SystemRedisKey.USER_INFO + userName); + redisHelper.del(SystemCacheKey.ONLINE_USER + userName); } } @@ -68,7 +69,7 @@ public class SystemUserInfoDAO { public SystemUserJwtVo getUserLoginInfoByUserName(String username) { if (StrUtil.isNotEmpty(username)) { // 获取数据 - return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); + return redisHelper.get(SystemCacheKey.ONLINE_USER + username, SystemUserJwtVo.class); } return null; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java index 2aac9cb9..12a7f525 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java @@ -19,6 +19,7 @@ import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.redis.KitRedisHelper; +import cn.odboy.system.constant.SystemCacheKey; import cn.odboy.system.dal.model.export.SystemUserOnlineExportRowVo; import cn.odboy.system.dal.model.response.SystemUserJwtVo; import cn.odboy.system.dal.model.response.SystemUserOnlineVo; @@ -122,7 +123,7 @@ public class SystemUserOnlineInfoDAO { * @param username / */ public void kickOutByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; + String loginKey = SystemCacheKey.ONLINE_USER + username + "*"; redisHelper.scanDel(loginKey); } @@ -133,15 +134,13 @@ public class SystemUserOnlineInfoDAO { * @param pageable / * @return / */ - public KitPageResult searchOnlineUser(SystemUserOnlineVo onlineVo, - IPage pageable) { + public KitPageResult searchOnlineUser(SystemUserOnlineVo onlineVo, IPage pageable) { String username = null; if (onlineVo != null) { username = onlineVo.getUserName(); } - List onlineUserList = queryUserOnlineModelListByUsername(username); - List paging = - KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); + List onlineUserList = this.queryUserOnlineModelListByUsername(username); + List paging = KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); return KitPageUtil.toPage(paging, onlineUserList.size()); } @@ -152,7 +151,7 @@ public class SystemUserOnlineInfoDAO { * @return / */ public List queryUserOnlineModelListByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); + String loginKey = SystemCacheKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); List keys = redisHelper.scan(loginKey + "*"); Collections.reverse(keys); List onlineUserList = new ArrayList<>(); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java index b61835ee..71585bd7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java @@ -23,7 +23,7 @@ import cn.odboy.constant.SystemConst; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.dal.model.response.SystemUserJwtVo; -import cn.odboy.system.dal.redis.SystemCacheKey; +import cn.odboy.system.constant.SystemCacheKey; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java index 91d2ac7e..ba1521ce 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java @@ -22,8 +22,8 @@ import cn.odboy.constant.SystemConst; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.redis.KitRedisHelper; +import cn.odboy.system.constant.SystemCacheKey; import cn.odboy.system.dal.model.response.SystemCaptchaVo; -import cn.odboy.system.dal.redis.SystemCacheKey; import com.wf.captcha.base.Captcha; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java index 9fd4905d..9b6ec1a2 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java @@ -99,16 +99,6 @@ public class SystemDeptService { this.updateDeptSubCnt(newPid); } - /** - * 根据部门id查询部门信息 -> TestPassed - * - * @param id 部门id - * @return / - */ - private SystemDeptTb getDeptById(Long id) { - return systemDeptMapper.selectById(id); - } - /** * 删除 * @@ -139,43 +129,6 @@ public class SystemDeptService { } } - private long countDeptByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return systemDeptMapper.selectCount(wrapper); - } - - /** - * 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表 - */ - private List deduplication(List list) { - List deptList = new ArrayList<>(); - // 使用 Set 存储所有部门的 id - Set idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - // 遍历部门列表, 筛选出没有父部门的部门 - for (SystemDeptTb dept : list) { - if (!idSet.contains(dept.getPid())) { - deptList.add(dept); - } - } - return deptList; - } - - private List queryDeptByArgs(SystemQueryDeptArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); - wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); - wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); - wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); - wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemDeptTb::getDeptSort); - return systemDeptMapper.selectList(wrapper); - } - /** * 查询所有数据 * @@ -213,7 +166,7 @@ public class SystemDeptService { List list = this.queryDeptByArgs(args); // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); + return this.filterRootDeptList(list); } return list; } @@ -229,25 +182,11 @@ public class SystemDeptService { } /** - * 查询部门下所有关联的部门 + * 根据部门id遍历所有部门和子部门id集合 * - * @param deptTbList / - * @param depts / + * @param deptList 部门集合 + * @param deptPidMap 父部门id和子部门集合的映射关系 */ - private void queryRelationDeptByArgs(List deptTbList, Set depts) { - for (SystemDeptVo dept : deptTbList) { - depts.add(dept); - List deptList = this.listDeptVoByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } - } - } - - 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 (SystemDeptTb systemDeptTb : deptList) { @@ -262,28 +201,6 @@ public class SystemDeptService { return list; } - /** - * 根据ID查询同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(this.listRootDept()); - return deptList; - } - deptList.addAll(this.listDeptVoByPid(dept.getPid())); - return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); - } - - private List listRootDept() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); - } - /** * 构建树形数据 * @@ -357,16 +274,10 @@ public class SystemDeptService { } } - private List listEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return systemDeptMapper.selectList(wrapper); - } - /** - * 遍历所有部门和子部门 + * 根据部门id遍历所有部门和子部门 * - * @param ids / + * @param ids 部门id集合 */ public Set traverseDeptByIdWithPids(Set ids) { Set depts = new HashSet<>(); @@ -376,61 +287,27 @@ public class SystemDeptService { // 子部门 List deptList = this.listDeptVoByPid(id); if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); + this.queryRelationDeptByArgs(deptList, depts); } } return depts; } + /** + * 产品线选择组件 数据源 + * + * @return / + */ public List listDeptSelectDataSource() { List depts = this.listEnabledDepts(); - return buildDeptSelectOptions(depts); - } - - private List buildDeptSelectOptions(List depts) { - // 查询所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - // 构建部门ID路径 - List pathIds = new ArrayList<>(); - buildDeptIdPath(dept, deptMap, pathIds); - // 反转路径,从顶级部门到当前部门 - Collections.reverse(pathIds); - SystemProductLineVo dto = new SystemProductLineVo(); - dto.setValue(dept.getId()); - dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); - // 保留名称路径用于显示 - dto.setLabel(buildNamePath(dept, deptMap)); - options.add(dto); - } - // 按部门名称路径排序 - options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); - return options; - } - - private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { - pathIds.add(dept.getId()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); - } - } - - private String buildNamePath(SystemDeptTb dept, Map deptMap) { - List pathNames = new ArrayList<>(); - buildDeptNamePath(dept, deptMap, pathNames); - Collections.reverse(pathNames); - return String.join(" / ", pathNames); - } - - private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { - pathNames.add(dept.getName()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); - } + return this.buildDeptSelectOptions(depts); } + /** + * 产品线选择组件Pro版 数据源 + * + * @return / + */ public List listDeptSelectProDataSource() { List depts = this.listEnabledDepts(); // 查询所有部门并按父子关系组织 @@ -441,7 +318,7 @@ public class SystemDeptService { for (SystemDeptTb dept : depts) { // 只处理顶级部门(pid为null或0的部门) if (dept.getPid() == null || dept.getPid() == 0) { - SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap); + SystemProductLineTreeVo vo = this.buildDeptTreePro(dept, deptMap); options.add(vo); } } @@ -453,6 +330,49 @@ public class SystemDeptService { return options; } + /** + * 根据父部门id查询部门集合 + * + * @param pid 父部门id + * @return / + */ + public List listDeptByPid(long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return systemDeptMapper.selectList(wrapper); + } + + /** + * 导出部门数据 + * + * @param response / + * @param args / + */ + public void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { + List systemDeptTbs = this.queryAllDeptByArgs(args, false); + List rowVos = new ArrayList<>(); + for (SystemDeptTb dataObject : systemDeptTbs) { + SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); + } + + /** + * 查询父部门非空且启用的部门数据 + * + * @return / + */ + public List listPidNonNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + wrapper.isNotNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); + } + /** * 递归构建部门树 * @@ -468,7 +388,7 @@ public class SystemDeptService { List children = new ArrayList<>(); for (SystemDeptTb childDept : deptMap.values()) { if (dept.getId().equals(childDept.getPid())) { - children.add(buildDeptTreePro(childDept, deptMap)); + children.add(this.buildDeptTreePro(childDept, deptMap)); } } // 子部门按排序字段排序 @@ -480,29 +400,180 @@ public class SystemDeptService { return vo; } - public List listDeptByPid(long pid) { + /** + * 产品线选择组件使用 + * + * @param depts 部门集合 + * @return / + */ + private List buildDeptSelectOptions(List depts) { + // 查询所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + for (SystemDeptTb dept : depts) { + // 构建部门ID路径 + List pathIds = new ArrayList<>(); + this.buildDeptIdPath(dept, deptMap, pathIds); + // 反转路径,从顶级部门到当前部门 + Collections.reverse(pathIds); + SystemProductLineVo dto = new SystemProductLineVo(); + dto.setValue(dept.getId()); + dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); + // 保留名称路径用于显示 + dto.setLabel(this.buildNamePath(dept, deptMap)); + options.add(dto); + } + // 按部门名称路径排序 + options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); + return options; + } + + /** + * 产品线选择组件使用 + */ + private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { + pathIds.add(dept.getId()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + this.buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); + } + } + + /** + * 产品线选择组件使用 + */ + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + this.buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } + + /** + * 产品线选择组件使用 + */ + private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { + pathNames.add(dept.getName()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + this.buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); + } + } + + /** + * 查询启用的所有部门集合 + * + * @return / + */ + private List listEnabledDepts() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); + wrapper.eq(SystemDeptTb::getEnabled, 1); return systemDeptMapper.selectList(wrapper); } - public void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { - List systemDeptTbs = this.queryAllDeptByArgs(args, false); - List rowVos = new ArrayList<>(); - for (SystemDeptTb dataObject : systemDeptTbs) { - SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 查询部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + */ + private void queryRelationDeptByArgs(List deptTbList, Set depts) { + for (SystemDeptVo dept : deptTbList) { + depts.add(dept); + List deptList = this.listDeptVoByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + this.queryRelationDeptByArgs(deptList, depts); + } } - KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); } - public List listPidNonNull() { + private List listDeptVoByPid(Long pid) { + return KitBeanUtil.copyToList(this.listDeptByPid(pid), SystemDeptVo.class); + } + + /** + * 根据ID查询同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(this.listRootDept()); + return deptList; + } + deptList.addAll(this.listDeptVoByPid(dept.getPid())); + return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); + } + + /** + * 查询所有根部门 + * + * @return / + */ + private List listRootDept() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - wrapper.isNotNull(SystemDeptTb::getPid); + wrapper.isNull(SystemDeptTb::getPid); + return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); + } + + /** + * 根据部门id查询部门信息 -> TestPassed + * + * @param id 部门id + * @return / + */ + private SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 根据父部门id统计数量 + * + * @param pid 父部门id + * @return / + */ + private long countDeptByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return systemDeptMapper.selectCount(wrapper); + } + + /** + * 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表 + */ + private List filterRootDeptList(List list) { + List deptList = new ArrayList<>(); + // 使用 Set 存储所有部门的 id + Set idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); + // 遍历部门列表, 筛选出没有父部门的部门 + for (SystemDeptTb dept : list) { + if (!idSet.contains(dept.getPid())) { + deptList.add(dept); + } + } + return deptList; + } + + /** + * 根据复杂条件查询部门集合 + * + * @param args / + * @return / + */ + private List queryDeptByArgs(SystemQueryDeptArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); + wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); + wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); + wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); + wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemDeptTb::getDeptSort); return systemDeptMapper.selectList(wrapper); } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java index 691e3b6e..e1f7de6a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java @@ -84,6 +84,11 @@ public class SystemDictDetailService { systemDictDetailMapper.deleteById(id); } + /** + * 根据字典id集合删除字典明细 + * + * @param ids 字典id集合 + */ @Transactional(rollbackFor = Exception.class) public void deleteDictDetailByDictIds(Set ids) { if (CollUtil.isNotEmpty(ids)) { @@ -100,8 +105,10 @@ public class SystemDictDetailService { * @param page 分页参数 * @return / */ - public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, - Page page) { + public KitPageResult searchDictDetail( + SystemQueryDictDetailArgs args, + Page page + ) { IPage iPage = systemDictDetailMapper.selectPageByArgs(page, args); List dictIds = iPage.getRecords().stream().map(SystemDictDetailVo::getDictId).collect(Collectors.toList()); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java index e01bfb06..b400df97 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java @@ -96,19 +96,24 @@ public class SystemDictService { return KitPageUtil.toPage(selectPage); } - private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or() - .like(SystemDictTb::getDescription, args.getBlurry())); - } - } - + /** + * 复杂条件查询字典列表 + * + * @param args / + * @return / + */ public List queryDictByArgs(SystemQueryDictArgs args) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); this.injectQueryParams(args, wrapper); return systemDictMapper.selectList(wrapper); } + /** + * 导出字典数据 + * + * @param response / + * @param args / + */ public void exportDictXlsx(HttpServletResponse response, SystemQueryDictArgs args) { List systemDictTbs = this.queryDictByArgs(args); List rowVos = new ArrayList<>(); @@ -136,4 +141,17 @@ public class SystemDictService { } KitExcelExporter.exportSimple(response, "字典数据", SystemDictExportRowVo.class, rowVos); } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or() + .like(SystemDictTb::getDescription, args.getBlurry())); + } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java index de0c69ad..dc687253 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java @@ -108,19 +108,6 @@ public class SystemEmailService { } } - /** - * 校验邮箱验证码 -> TestPassed - */ - public void checkEmailCaptchaV1(SystemCaptchaBizEnum biEnum, String email, String code) { - String redisKey = biEnum.getRedisKey() + email; - String value = redisHelper.get(redisKey, String.class); - if (value == null || !value.equals(code)) { - throw new BadRequestException("无效验证码"); - } else { - redisHelper.del(redisKey); - } - } - /** * 发送给邮箱验证码 */ @@ -148,11 +135,19 @@ public class SystemEmailService { sendEmail(sendEmailRequest); } + /** + * 查询邮箱配置 + * + * @return / + */ public SystemEmailConfigTb getLastEmailConfig() { SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; } + /** + * 校验邮箱验证码 -> TestPassed + */ public void checkEmailCaptcha(SystemCheckEmailCaptchaArgs args) { SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); if (biEnum == null) { @@ -160,4 +155,14 @@ public class SystemEmailService { } this.checkEmailCaptchaV1(biEnum, args.getEmail(), args.getCode()); } + + public void checkEmailCaptchaV1(SystemCaptchaBizEnum biEnum, String email, String code) { + String redisKey = biEnum.getRedisKey() + email; + String value = redisHelper.get(redisKey, String.class); + if (value == null || !value.equals(code)) { + throw new BadRequestException("无效验证码"); + } else { + redisHelper.del(redisKey); + } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java index aef9d605..4a1137df 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java @@ -119,6 +119,22 @@ public class SystemJobService { } } + /** + * 导出岗位数据 -> TestPassed + */ + public void exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { + List systemJobTbs = this.queryJobByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemJobTb dataObject : systemJobTbs) { + SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); + } + /** * 根据岗位名称查询岗位是否存在 -> TestPassed */ @@ -138,6 +154,12 @@ public class SystemJobService { return systemJobMapper.exists(wrapper); } + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ private void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper wrapper) { if (args != null) { wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName()); @@ -148,20 +170,4 @@ public class SystemJobService { } wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); } - - /** - * 导出岗位数据 -> TestPassed - */ - public void exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { - List systemJobTbs = this.queryJobByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemJobTb dataObject : systemJobTbs) { - SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); - } - KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); - } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java index 5db8f625..c8a0bfaf 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java @@ -133,29 +133,13 @@ public class SystemLocalStorageService { * @param page 分页参数 * @return / */ - public KitPageResult searchLocalStorage(SystemQueryStorageArgs args, - Page page) { + public KitPageResult searchLocalStorage(SystemQueryStorageArgs args, Page page) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); this.injectQueryParams(args, wrapper); Page selectPage = systemLocalStorageMapper.selectPage(page, wrapper); return KitPageUtil.toPage(selectPage); } - private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or() - .like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or() - .like(SystemLocalStorageTb::getType, args.getBlurry()).or() - .like(SystemLocalStorageTb::getCreateBy, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemLocalStorageTb::getId); - } - /** * 查询文件上传记录 -> TestPassed */ @@ -186,4 +170,28 @@ public class SystemLocalStorageService { List rowVos = KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class); KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos); } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.and( + StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or() + .like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or() + .like(SystemLocalStorageTb::getType, args.getBlurry()).or() + .like(SystemLocalStorageTb::getCreateBy, args.getBlurry()) + ); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1) + ); + } + } + wrapper.orderByDesc(SystemLocalStorageTb::getId); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java index f3f88ec6..c6cb2f5b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java @@ -95,56 +95,6 @@ public class SystemMenuService { this.updateMenuSubCnt(args.getPid()); } - /** - * 根据组件名称查询菜单是否存在 -> TestPassed - * - * @param componentName 组件名称 - * @return / - */ - private boolean existMenuWithComponentName(String componentName) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getComponentName, componentName); - return systemMenuMapper.exists(wrapper); - } - - /** - * 根据组件名称查询菜单是否存在 -> TestPassed - * - * @param componentName 组件名称 - * @return / - */ - private boolean existMenuWithComponentNameNeSelf(String componentName, Long currentMenuId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getComponentName, componentName); - wrapper.ne(SystemMenuTb::getId, currentMenuId); - return systemMenuMapper.exists(wrapper); - } - - /** - * 根据菜单标题查询菜单是否存在 -> TestPassed - * - * @param title 菜单标题 - * @return / - */ - private boolean existMenuWithTitle(String title) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getTitle, title); - return systemMenuMapper.exists(wrapper); - } - - /** - * 根据菜单标题查询菜单是否存在 -> TestPassed - * - * @param title 菜单标题 - * @return / - */ - private boolean existMenuWithTitleNeSelf(String title, Long currentMenuId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getTitle, title); - wrapper.ne(SystemMenuTb::getId, currentMenuId); - return systemMenuMapper.exists(wrapper); - } - /** * 编辑 -> TestPassed * @@ -222,7 +172,7 @@ public class SystemMenuService { } // 查询所有菜单数据 List allMenus = systemMenuMapper.listAll(); - // 根据ID集合获取当前菜单和其子菜单 + // 根据ID集合查询当前菜单和其子菜单 Set allMenuIds = this.getAllMenuIdsWithChildren(ids, allMenus); if (CollUtil.isNotEmpty(allMenuIds)) { // 删除角色菜单关联 @@ -234,60 +184,6 @@ public class SystemMenuService { } } - /** - * 从所有菜单中找出指定ID及其子菜单ID - * - * @param rootIds 要删除的根菜单ID集合 - * @param allMenus 所有菜单数据 - * @return 包含根菜单及其所有子菜单的ID集合 - */ - private Set getAllMenuIdsWithChildren(Set rootIds, List allMenus) { - Set result = new HashSet<>(rootIds); - Set currentLevelIds = new HashSet<>(rootIds); - // 构建父ID到子菜单的映射 - Map> parentToChildrenMap = allMenus.stream().filter(menu -> menu.getPid() != null) - .collect(Collectors.groupingBy(SystemMenuTb::getPid)); - while (!currentLevelIds.isEmpty()) { - Set nextLevelIds = new HashSet<>(); - // 对于当前层级的每个菜单ID,查找其子菜单 - for (Long parentId : currentLevelIds) { - List children = parentToChildrenMap.get(parentId); - if (children != null && !children.isEmpty()) { - for (SystemMenuTb child : children) { - if (result.add(child.getId())) { // 如果成功添加(之前不存在),则继续查找其子菜单 - nextLevelIds.add(child.getId()); - } - } - } - } - currentLevelIds = nextLevelIds; - } - return result; - } - - /** - * 更新被删除菜单的父菜单子节点计数 - */ - private void updateParentMenuCounts(Set deletedMenuIds, List allMenus) { - // 获取被删除菜单的父ID - Set parentIds = - allMenus.stream().filter(menu -> deletedMenuIds.contains(menu.getId()) && menu.getPid() != null) - .map(SystemMenuTb::getPid).collect(Collectors.toSet()); - // 更新每个父菜单的子节点计数 - for (Long parentId : parentIds) { - proxyService.updateMenuSubCnt(parentId); - } - } - - /** - * 根据菜单id查询目录 -> TestPassed - * - * @param id 菜单id - */ - private SystemMenuTb getMenuById(Long id) { - return systemMenuMapper.selectById(id); - } - @Transactional(rollbackFor = Exception.class) public void updateMenuSubCnt(Long menuId) { if (menuId != null) { @@ -341,35 +237,21 @@ public class SystemMenuService { return systemRoleMenuService.listMenuByRoleIds(roleIds, false); } -// /** -// * 查询所有子节点, 包含自身ID -// * -// * @param menuList / -// * @param menuSet / -// * @return / -// */ -// public Set queryChildMenuByArgs(List menuList, Set menuSet) { -// for (SystemMenuTb menu : menuList) { -// menuSet.add(menu); -// List menus = this.listMenuByPid(menu.getId()); -// if (CollUtil.isNotEmpty(menus)) { -// queryChildMenuByArgs(menus, menuSet); -// } -// } -// return menuSet; -// } - /** * 懒加载菜单数据 * * @param pid / * @return / */ - public List listMenuByPid(Long pid) { + public List listMenuByPid(Long pid, boolean includeButton) { List menus; if (pid != null && !pid.equals(0L)) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SystemMenuTb::getPid, pid); + if (!includeButton) { + // 是否剔除按钮 + wrapper.ne(SystemMenuTb::getType, 2); + } wrapper.orderByAsc(SystemMenuTb::getMenuSort); return systemMenuMapper.selectList(wrapper); } else { @@ -390,7 +272,7 @@ public class SystemMenuService { menus.addAll(this.listRootMenu()); return menus; } - menus.addAll(this.listMenuByPid(menu.getPid())); + menus.addAll(this.listMenuByPid(menu.getPid(), true)); return querySuperiorMenuByArgs(this.getMenuById(menu.getPid()), menus); } @@ -473,62 +355,10 @@ public class SystemMenuService { return list; } - /** - * 查询 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { - SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 - if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); - } - return menuVo1; - } - public List listMenuByIds(List ids) { return systemMenuMapper.selectByIds(ids); } - private Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return systemMenuMapper.selectCount(wrapper); - } - - private List queryMenuByArgs(SystemQueryMenuArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); - wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() - .like(SystemMenuTb::getComponentName, args.getBlurry()).or() - .like(SystemMenuTb::getPermission, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } - - /** - * 查询根目录 -> TestPassed - */ - private List listRootMenu() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } - public List buildFrontMenus() { List originMenus = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); List targetMenus = this.buildMenuTree(originMenus); @@ -563,7 +393,7 @@ public class SystemMenuService { List newMenuList = new ArrayList<>(menus); return this.buildMenuTree(newMenuList); } else { - List records = this.listMenuByPid(null); + List records = this.listMenuByPid(null, true); return KitBeanUtil.copyToList(records, SystemMenuVo.class); } } @@ -584,4 +414,178 @@ public class SystemMenuService { } KitExcelExporter.exportSimple(response, "菜单数据", SystemMenuExportRowVo.class, rowVos); } + + /** + * 查询 MenuResponse + * + * @param menu / + * @param menuVo / + * @return / + */ + private SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { + SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 + if (!menu.getIFrame()) { + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menu.getPath()); + } + return menuVo1; + } + + private Long countMenuByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + return systemMenuMapper.selectCount(wrapper); + } + + private List queryMenuByArgs(SystemQueryMenuArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); + wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() + .like(SystemMenuTb::getComponentName, args.getBlurry()).or() + .like(SystemMenuTb::getPermission, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); + } + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } + + /** + * 查询根目录 -> TestPassed + */ + private List listRootMenu() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } + + /** + * 根据组件名称查询菜单是否存在 -> TestPassed + * + * @param componentName 组件名称 + * @return / + */ + private boolean existMenuWithComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return systemMenuMapper.exists(wrapper); + } + + /** + * 根据组件名称查询菜单是否存在 -> TestPassed + * + * @param componentName 组件名称 + * @return / + */ + private boolean existMenuWithComponentNameNeSelf(String componentName, Long currentMenuId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + wrapper.ne(SystemMenuTb::getId, currentMenuId); + return systemMenuMapper.exists(wrapper); + } + + /** + * 根据菜单标题查询菜单是否存在 -> TestPassed + * + * @param title 菜单标题 + * @return / + */ + private boolean existMenuWithTitle(String title) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getTitle, title); + return systemMenuMapper.exists(wrapper); + } + + /** + * 根据菜单标题查询菜单是否存在 -> TestPassed + * + * @param title 菜单标题 + * @return / + */ + private boolean existMenuWithTitleNeSelf(String title, Long currentMenuId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getTitle, title); + wrapper.ne(SystemMenuTb::getId, currentMenuId); + return systemMenuMapper.exists(wrapper); + } + + /** + * 从所有菜单中找出指定ID及其子菜单ID + * + * @param rootIds 要删除的根菜单ID集合 + * @param allMenus 所有菜单数据 + * @return 包含根菜单及其所有子菜单的ID集合 + */ + private Set getAllMenuIdsWithChildren(Set rootIds, List allMenus) { + Set result = new HashSet<>(rootIds); + Set currentLevelIds = new HashSet<>(rootIds); + // 构建父ID到子菜单的映射 + Map> parentToChildrenMap = allMenus.stream().filter(menu -> menu.getPid() != null) + .collect(Collectors.groupingBy(SystemMenuTb::getPid)); + while (!currentLevelIds.isEmpty()) { + Set nextLevelIds = new HashSet<>(); + // 对于当前层级的每个菜单ID,查找其子菜单 + for (Long parentId : currentLevelIds) { + List children = parentToChildrenMap.get(parentId); + if (children != null && !children.isEmpty()) { + for (SystemMenuTb child : children) { + if (result.add(child.getId())) { // 如果成功添加(之前不存在),则继续查找其子菜单 + nextLevelIds.add(child.getId()); + } + } + } + } + currentLevelIds = nextLevelIds; + } + return result; + } + + /** + * 更新被删除菜单的父菜单子节点计数 + */ + private void updateParentMenuCounts(Set deletedMenuIds, List allMenus) { + // 查询被删除菜单的父ID + Set parentIds = + allMenus.stream().filter(menu -> deletedMenuIds.contains(menu.getId()) && menu.getPid() != null) + .map(SystemMenuTb::getPid).collect(Collectors.toSet()); + // 更新每个父菜单的子节点计数 + for (Long parentId : parentIds) { + proxyService.updateMenuSubCnt(parentId); + } + } + + /** + * 根据菜单id查询目录 -> TestPassed + * + * @param id 菜单id + */ + private SystemMenuTb getMenuById(Long id) { + return systemMenuMapper.selectById(id); + } + + /** + * 查询所有子节点, 包含自身ID + * + * @param menuList / + * @param menuSet / + * @return / + */ + private Set queryChildMenuByArgs(List menuList, Set menuSet) { + for (SystemMenuTb menu : menuList) { + menuSet.add(menu); + List menus = this.listMenuByPid(menu.getId(), true); + if (CollUtil.isNotEmpty(menus)) { + queryChildMenuByArgs(menus, menuSet); + } + } + return menuSet; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java index 50da4422..5df34fbd 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java @@ -141,8 +141,10 @@ public class SystemMonitorService { memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); - memoryInfo.put("usageRate", - df.format((memory.getTotal() - memory.getAvailable()) / (double) memory.getTotal() * 100)); + memoryInfo.put( + "usageRate", + df.format((memory.getTotal() - memory.getAvailable()) / (double) memory.getTotal() * 100) + ); return memoryInfo; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java index de41a08e..70cb7717 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java @@ -35,13 +35,43 @@ import java.util.List; */ public interface SystemOssStorageService extends IService { + /** + * 分页查询 + * + * @param args 查询条件 + * @param page 分页参数 + * @return / + */ KitPageResult searchOssStorage(SystemQueryStorageArgs args, Page page); + /** + * 复杂条件查询 + * + * @param args 查询条件 + * @return / + */ List queryOssStorage(SystemQueryStorageArgs args); + /** + * 上传文件 + * + * @param file / + * @return / + */ String uploadFile(MultipartFile file); + /** + * 根据id删除文件 + * + * @param ids 文件记录id + */ void deleteFileByIds(Long[] ids); + /** + * 导出文件上传记录 + * + * @param response / + * @param args 查询条件 + */ void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java index 76525590..1d81a236 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java @@ -59,19 +59,6 @@ public class SystemQuartzJobService { @Autowired private KitRedisHelper redisHelper; - /** - * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - * - * @param beanName Bean名称 - */ - private void checkBean(String beanName) { - // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 - // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 - if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { - throw new BadRequestException("非法的 Bean,请重新输入!"); - } - } - /** * 创建 -> TestPassed * @@ -207,28 +194,6 @@ public class SystemQuartzJobService { return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); } - private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzJobTb::getJobName, args.getJobName()); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzJobTb::getUpdateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzJobTb::getId); - } - - private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); - wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzLogTb::getId); - } - /** * 分页查询日志 -> TestPassed * @@ -324,4 +289,52 @@ public class SystemQuartzJobService { public SystemQuartzJobTb getQuartzJobById(Long id) { return systemQuartzJobMapper.selectById(id); } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzJobTb::getJobName, args.getJobName()); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzJobTb::getUpdateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); + } + } + wrapper.orderByDesc(SystemQuartzJobTb::getId); + } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); + wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1) + ); + } + } + wrapper.orderByDesc(SystemQuartzLogTb::getId); + } + + /** + * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + * + * @param beanName Bean名称 + */ + private void checkBean(String beanName) { + // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 + // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 + if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { + throw new BadRequestException("非法的 Bean,请重新输入!"); + } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java index c5624ca7..ff921186 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java @@ -102,7 +102,7 @@ public class SystemRoleMenuService { // menuWrapper.ne(SystemMenuTb::getType, 2); // menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); // return systemMenuMapper.selectList(menuWrapper); - if (hasButton){ + if (hasButton) { return systemRoleMenuMapper.listMenuWithRoleIds(roleIds); } return systemRoleMenuMapper.listMenuWithRoleIdsNeButton(roleIds); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java index 87fe39f5..1b09ae07 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java @@ -66,7 +66,7 @@ public class SystemRoleService { */ @Transactional(rollbackFor = Exception.class) public void saveRole(SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); + this.checkRoleLevels(args.getLevel()); if (this.existRoleWithName(args.getName())) { throw new BadRequestException("角色名称已存在"); } @@ -78,19 +78,6 @@ public class SystemRoleService { } } - private boolean existRoleWithName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.exists(wrapper); - } - - private boolean existRoleWithNameNeSelf(String name, Long roleId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - wrapper.eq(SystemRoleTb::getId, roleId); - return systemRoleMapper.exists(wrapper); - } - /** * 修改 -> TestPassed * @@ -98,7 +85,7 @@ public class SystemRoleService { */ @Transactional(rollbackFor = Exception.class) public void updateRoleById(SystemRoleVo args) { - checkRoleLevels(args.getLevel()); + this.checkRoleLevels(args.getLevel()); SystemRoleTb role = systemRoleMapper.selectById(args.getId()); if (this.existRoleWithNameNeSelf(args.getName(), role.getId())) { throw new BadRequestException("角色名称已存在"); @@ -125,7 +112,7 @@ public class SystemRoleService { @Transactional(rollbackFor = Exception.class) public void updateBindMenuById(SystemRoleVo args) { SystemRoleTb role = systemRoleMapper.selectById(args.getId()); - checkRoleLevels(role.getLevel()); + this.checkRoleLevels(role.getLevel()); // 更新菜单 systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); Set menus = args.getMenus(); @@ -143,7 +130,7 @@ public class SystemRoleService { public void deleteRoleByIds(Set ids) { List roleLevels = systemRoleMapper.listRoleLevelByRoleIds(new ArrayList<>(ids)); for (Integer roleLevel : roleLevels) { - checkRoleLevels(roleLevel); + this.checkRoleLevels(roleLevel); } // 验证是否被用户关联 this.verifyBindRelationByIds(ids); @@ -176,17 +163,6 @@ public class SystemRoleService { return systemRoleMapper.selectList(wrapper); } - private void injectQueryParams(SystemQueryRoleArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() - .like(SystemRoleTb::getDescription, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemRoleTb::getLevel); - } - /** * 分页查询角色 -> TestPassed * @@ -239,6 +215,12 @@ public class SystemRoleService { } } + /** + * 根据角色id查询用户可访问的部门和菜单信息 + * + * @param id 角色id + * @return / + */ public SystemRoleVo getRoleVoById(Long id) { SystemRoleTb roleTb = systemRoleMapper.selectById(id); if (roleTb == null) { @@ -247,8 +229,55 @@ public class SystemRoleService { return systemUserRoleService.convertToRoleVo(roleTb); } + /** + * 查询当前用户角色级别 + * + * @return / + */ public Dict getCurrentUserRoleLevel() { - return Dict.create().set("level", checkRoleLevels(null)); + return Dict.create().set("level", this.checkRoleLevels(null)); + } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQueryParams(SystemQueryRoleArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + .like(SystemRoleTb::getDescription, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemRoleTb::getLevel); + } + + /** + * 查询角色名称是否存在 + * + * @param name 角色名称 + * @return / + */ + private boolean existRoleWithName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.exists(wrapper); + } + + /** + * 查询角色名称是否存在(排除本身) + * + * @param name 角色名称 + * @return / + */ + private boolean existRoleWithNameNeSelf(String name, Long roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + wrapper.eq(SystemRoleTb::getId, roleId); + return systemRoleMapper.exists(wrapper); } /** @@ -267,6 +296,12 @@ public class SystemRoleService { return min; } + /** + * 导出部门数据 + * + * @param response / + * @param args / + */ public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { List systemRoleVos = this.queryRoleByArgs(args, null); List rowVos = new ArrayList<>(); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java index 08b535cd..1a6d9259 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java @@ -117,27 +117,6 @@ public class SystemUserService { systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId()); } - private boolean existUserWithPhone(String phone) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getPhone, phone); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.exists(wrapper); - } - - private boolean existUserWithEmail(String email) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getEmail, email); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.exists(wrapper); - } - - private boolean existUserWithUsername(String username) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.exists(wrapper); - } - /** * 编辑用户 -> TestPassed * @@ -178,27 +157,6 @@ public class SystemUserService { systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); } - private boolean existUserWithPhoneNeSelf(String phone, Long currentUserId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getPhone, phone); - wrapper.ne(SystemUserTb::getId, currentUserId); - return systemUserMapper.exists(wrapper); - } - - private boolean existUserWithEmailNeSelf(String email, Long currentUserId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getEmail, email); - wrapper.ne(SystemUserTb::getId, currentUserId); - return systemUserMapper.exists(wrapper); - } - - private boolean existUserWithUsernameNeSelf(String username, Long currentUserId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.ne(SystemUserTb::getId, currentUserId); - return systemUserMapper.exists(wrapper); - } - /** * 用户自助修改资料 -> TestPassed * @@ -354,8 +312,8 @@ public class SystemUserService { * @return / */ public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { - // 查询用户基本信息 - LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); IPage userPage = systemUserMapper.selectPage(page, wrapper); List users = userPage.getRecords(); // 转换为SystemUserVo并关联查询 @@ -363,15 +321,29 @@ public class SystemUserService { return KitPageUtil.toPage(userVos, userPage.getTotal()); } + /** + * 复杂条件统计用户数量 + * + * @param args / + * @return / + */ public long countUserByArgs(SystemQueryUserArgs args) { - LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); return systemUserMapper.selectCount(wrapper); } + /** + * 模糊查询用户基础信息,限制返回的条数 + * + * @param pageArgs 分页参数 + * @return / + */ public List queryUserMetadataOptions(KitPageArgs pageArgs) { SystemQueryUserArgs args = pageArgs.getArgs(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); + wrapper.select( + SystemUserTb::getId, SystemUserTb::getUsername, SystemUserTb::getNickName, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); wrapper.and(c -> { c.eq(SystemUserTb::getPhone, args.getBlurry()); c.or(); @@ -392,62 +364,11 @@ public class SystemUserService { } /** - * 构建用户查询条件 -> TestPassed + * 根据用户名查询启用的用户信息 * - * @param args 查询条件 + * @param username 用户名 * @return / */ - private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args != null) { - if (args.getId() != null) { - wrapper.eq(SystemUserTb::getId, args.getId()); - } - if (args.getEnabled() != null) { - wrapper.eq(SystemUserTb::getEnabled, args.getEnabled()); - } - if (CollUtil.isNotEmpty(args.getDeptIds())) { - wrapper.in(SystemUserTb::getDeptId, args.getDeptIds()); - } - if (StrUtil.isNotBlank(args.getBlurry())) { - wrapper.and(w -> w.like(SystemUserTb::getUsername, args.getBlurry()).or() - .like(SystemUserTb::getNickName, args.getBlurry()).or().like(SystemUserTb::getEmail, args.getBlurry())); - } - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemUserTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemUserTb::getCreateTime); - return wrapper; - } - - /** - * 转换为SystemUserVo并关联查询部门、角色、岗位信息 -> TestPassed - * - * @param user 用户基本信息 - * @param includePassword 是否包含用户密码 - * @return 包含关联信息的SystemUserVo - */ - 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) { - userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); - } - // 查询关联的岗位信息 - userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); - // 查询关联的角色信息 - userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); - return userVo; - } - public SystemUserTb getUserByUsername(String username) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SystemUserTb::getUsername, username); @@ -455,10 +376,22 @@ public class SystemUserService { return systemUserMapper.selectOne(wrapper); } + /** + * 根据用户名查询用户的部门、岗位和角色信息,用户信息中有密码数据 + * + * @param username 用户名 + * @return / + */ public SystemUserVo getUserVoWithPasswordByUsername(String username) { return this.convertToUserVo(this.getUserByUsername(username), true); } + /** + * 根据用户名查询用户的部门、岗位和角色信息,用户信息中无密码数据 + * + * @param username 用户名 + * @return / + */ public SystemUserVo getUserVoByUsername(String username) { return this.convertToUserVo(this.getUserByUsername(username), false); } @@ -466,8 +399,10 @@ public class SystemUserService { /** * 聚合查询 -> TestPassed */ - public KitPageResult aggregationSearchUserByArgs(Page page, SystemQueryUserArgs args, - String currentUsername) { + public KitPageResult aggregationSearchUserByArgs( + Page page, SystemQueryUserArgs args, + String currentUsername + ) { if (!ObjectUtils.isEmpty(args.getDeptId())) { args.getDeptIds().add(args.getDeptId()); // 先查找是否存在子节点 @@ -518,6 +453,143 @@ public class SystemUserService { rowVos.add(rowVo); } return rowVos; - }); + } + ); + } + + /** + * 查询手机号是否存在 + * + * @param phone 手机号 + * @return / + */ + private boolean existUserWithPhone(String phone) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getPhone, phone); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.exists(wrapper); + } + + /** + * 查询邮箱是否存在 + * + * @param email 邮箱 + * @return / + */ + private boolean existUserWithEmail(String email) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getEmail, email); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.exists(wrapper); + } + + /** + * 查询用户名是否存在 + * + * @param username 用户名 + * @return / + */ + private boolean existUserWithUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.exists(wrapper); + } + + /** + * 查询手机号是否存在(排除指定用户) + * + * @param phone 手机号 + * @param currentUserId 指定用户id + * @return / + */ + private boolean existUserWithPhoneNeSelf(String phone, Long currentUserId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getPhone, phone); + wrapper.ne(SystemUserTb::getId, currentUserId); + return systemUserMapper.exists(wrapper); + } + + /** + * 查询邮箱是否存在(排除指定用户) + * + * @param email 邮箱 + * @param currentUserId 指定用户id + * @return / + */ + private boolean existUserWithEmailNeSelf(String email, Long currentUserId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getEmail, email); + wrapper.ne(SystemUserTb::getId, currentUserId); + return systemUserMapper.exists(wrapper); + } + + /** + * 查询用户名是否存在(排除指定用户) + * + * @param username 用户名 + * @param currentUserId 指定用户id + * @return / + */ + private boolean existUserWithUsernameNeSelf(String username, Long currentUserId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.ne(SystemUserTb::getId, currentUserId); + return systemUserMapper.exists(wrapper); + } + + /** + * 构建查询条件 + * + * @param args / + * @param wrapper / + */ + private void injectQueryParams(SystemQueryUserArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + if (args.getId() != null) { + wrapper.eq(SystemUserTb::getId, args.getId()); + } + if (args.getEnabled() != null) { + wrapper.eq(SystemUserTb::getEnabled, args.getEnabled()); + } + if (CollUtil.isNotEmpty(args.getDeptIds())) { + wrapper.in(SystemUserTb::getDeptId, args.getDeptIds()); + } + if (StrUtil.isNotBlank(args.getBlurry())) { + wrapper.and(w -> w.like(SystemUserTb::getUsername, args.getBlurry()).or() + .like(SystemUserTb::getNickName, args.getBlurry()).or().like(SystemUserTb::getEmail, args.getBlurry())); + } + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemUserTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); + } + } + wrapper.orderByDesc(SystemUserTb::getCreateTime); + } + + /** + * 转换为SystemUserVo并关联查询部门、角色、岗位信息 -> TestPassed + * + * @param user 用户基本信息 + * @param includePassword 是否包含用户密码 + * @return 包含关联信息的SystemUserVo + */ + 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) { + userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); + } + // 查询关联的岗位信息 + userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); + // 查询关联的角色信息 + userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); + return userVo; } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java index 645b158d..f9488150 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java @@ -69,8 +69,10 @@ public class SystemMinioStorageServiceImpl extends ServiceImpl searchOssStorage(SystemQueryStorageArgs args, - Page page) { + public KitPageResult searchOssStorage( + SystemQueryStorageArgs args, + Page page + ) { IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); @@ -78,18 +80,23 @@ public class SystemMinioStorageServiceImpl extends ServiceImpl selectOssStorageByArgs(SystemQueryStorageArgs args, - Page page) { + private IPage selectOssStorageByArgs( + SystemQueryStorageArgs args, + Page page + ) { KitValidUtil.notNull(args); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + wrapper.and( + StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or() .like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or() .like(SystemOssStorageTb::getFileMime, args.getBlurry()).or() - .like(SystemOssStorageTb::getFileMd5, args.getBlurry())); + .like(SystemOssStorageTb::getFileMd5, args.getBlurry()) + ); if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); + args.getCreateTime().get(1) + ); } wrapper.orderByAsc(SystemOssStorageTb::getId); return systemOssStorageMapper.selectPage(page, wrapper)