From 377b0989f8236fa70bfb3f8a64b98b6d1400392a Mon Sep 17 00:00:00 2001 From: Odboy Date: Mon, 29 Dec 2025 23:57:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor(system):=20=E9=87=8D=E6=9E=84=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=A8=A1=E5=9D=97=E6=8E=A7=E5=88=B6=E5=99=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 解决所有接口分页异常 - 剥离控制器校验逻辑 - 解决循环依赖问题 - 解决角色赋权后,权限回显不正确 --- .../controller/SystemAuthController.java | 136 +-- .../controller/SystemCaptchaController.java | 44 +- .../controller/SystemComponentController.java | 27 +- .../controller/SystemDeptController.java | 94 +- .../controller/SystemDictController.java | 88 +- .../SystemDictDetailController.java | 91 +- .../controller/SystemEmailController.java | 39 +- .../controller/SystemJobController.java | 92 +- .../SystemLocalStorageController.java | 94 +- .../controller/SystemMenuController.java | 174 ++-- .../controller/SystemMonitorController.java | 15 +- .../controller/SystemOnlineController.java | 55 +- .../SystemOssStorageController.java | 60 +- .../controller/SystemQuartzJobController.java | 154 ++- .../controller/SystemRoleController.java | 155 ++-- .../controller/SystemUserController.java | 253 ++--- .../system/dal/mysql/SystemDeptMapper.java | 12 +- .../dal/mysql/SystemDictDetailMapper.java | 1 + .../system/dal/mysql/SystemDictMapper.java | 16 +- .../system/dal/mysql/SystemUserMapper.java | 36 +- .../system/dal/redis/SystemCacheKey.java | 92 +- .../system/dal/redis/SystemRedisKey.java | 92 +- .../system/dal/redis/SystemUserInfoDAO.java | 73 +- .../dal/redis/SystemUserOnlineInfoDAO.java | 239 ++--- .../system/service/SystemAuthService.java | 117 +++ .../system/service/SystemDataService.java | 93 +- .../system/service/SystemDeptService.java | 796 ++++++++-------- .../service/SystemDictDetailService.java | 10 + .../system/service/SystemDictService.java | 182 ++-- .../system/service/SystemEmailService.java | 213 +++-- .../system/service/SystemJobService.java | 199 ++-- .../service/SystemLocalStorageService.java | 253 ++--- .../system/service/SystemMenuService.java | 801 ++++++++-------- .../system/service/SystemMonitorService.java | 316 +++---- .../service/SystemOssStorageService.java | 12 +- .../service/SystemQuartzJobService.java | 487 +++++----- .../system/service/SystemRoleDeptService.java | 96 +- .../system/service/SystemRoleMenuService.java | 90 +- .../system/service/SystemRoleService.java | 484 +++++----- .../system/service/SystemUserDeptService.java | 21 + .../system/service/SystemUserJobService.java | 41 +- .../system/service/SystemUserRoleService.java | 133 ++- .../system/service/SystemUserService.java | 876 ++++++++++-------- .../impl/SystemOssStorageServiceImpl.java | 210 +++-- .../mapper/SystemDictDetailMapper.xml | 28 +- .../controller/SystemAuthController.java | 98 +- .../controller/SystemCaptchaController.java | 7 +- .../controller/SystemDeptController.java | 9 +- .../controller/SystemDictController.java | 3 +- .../SystemDictDetailController.java | 10 +- .../controller/SystemJobController.java | 7 +- .../SystemLocalStorageController.java | 15 +- .../controller/SystemMenuController.java | 42 +- .../controller/SystemOnlineController.java | 18 +- .../SystemOssStorageController.java | 5 +- .../controller/SystemQuartzJobController.java | 27 +- .../controller/SystemRoleController.java | 40 +- .../controller/SystemUserController.java | 123 +-- .../system/dal/mysql/SystemDeptMapper.java | 5 - .../dal/mysql/SystemDictDetailMapper.java | 1 + .../system/dal/mysql/SystemUserMapper.java | 5 - .../dal/redis/SystemUserOnlineInfoDAO.java | 9 + .../system/service/SystemAuthService.java | 117 +++ .../system/service/SystemDataService.java | 4 +- .../system/service/SystemDeptService.java | 18 +- .../service/SystemDictDetailService.java | 10 + .../system/service/SystemEmailService.java | 11 +- .../system/service/SystemJobService.java | 2 + .../service/SystemLocalStorageService.java | 12 + .../system/service/SystemMenuService.java | 43 +- .../service/SystemQuartzJobService.java | 21 + .../system/service/SystemRoleDeptService.java | 16 + .../system/service/SystemRoleService.java | 161 ++-- .../system/service/SystemUserDeptService.java | 21 + .../system/service/SystemUserRoleService.java | 92 ++ .../system/service/SystemUserService.java | 136 ++- .../mapper/SystemDictDetailMapper.xml | 28 +- 77 files changed, 4471 insertions(+), 4235 deletions(-) create mode 100644 cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java create mode 100644 cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java create mode 100644 cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java create mode 100644 cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java 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 38fa3dc5..f9f55523 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 @@ -15,38 +15,17 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.annotation.AnonymousPostMapping; -import cn.odboy.constant.CaptchaCodeEnum; -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.dal.model.SystemUserInfoVo; -import cn.odboy.system.dal.model.SystemUserJwtVo; import cn.odboy.system.dal.model.SystemUserLoginArgs; -import cn.odboy.system.dal.redis.SystemCacheKey; -import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; -import cn.odboy.system.framework.permission.core.handler.TokenProvider; -import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; -import cn.odboy.util.KitRsaEncryptUtil; -import com.wf.captcha.base.Captcha; +import cn.odboy.system.service.SystemAuthService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletRequest; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.TimeUnit; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -62,92 +41,35 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:系统授权接口") public class SystemAuthController { - @Autowired private KitRedisHelper redisHelper; - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired private TokenProvider tokenProvider; - @Autowired private AppProperties properties; - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private UserDetailsHandler userDetailsService; + @Autowired + private SystemAuthService systemAuthService; - @ApiOperation("登录授权") - @AnonymousPostMapping(value = "/login") - public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, - HttpServletRequest request) throws Exception { - // 密码解密 - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); - // 查询验证码 - String code = redisHelper.get(loginRequest.getUuid(), String.class); - // 清除验证码 - redisHelper.del(loginRequest.getUuid()); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); - } - if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { - throw new BadRequestException("验证码错误"); - } - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); - } - Authentication authentication = - new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - Map authInfo = new HashMap<>(2) {{ - put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); - }}; - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); - } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return ResponseEntity.ok(authInfo); - } + @ApiOperation("登录授权") + @AnonymousPostMapping(value = "/login") + public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, + HttpServletRequest request) throws Exception { + Map loginInfo = systemAuthService.doLogin(loginRequest, request); + return ResponseEntity.ok(loginInfo); + } - @ApiOperation("获取用户信息") - @PostMapping(value = "/info") - public ResponseEntity getUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo)KitSecurityHelper.getCurrentUser(); - SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); - return ResponseEntity.ok(userInfoVo); - } + @ApiOperation("获取用户信息") + @PostMapping(value = "/info") + public ResponseEntity getUserInfo() { + SystemUserInfoVo userInfoVo = systemAuthService.getCurrentUserInfoVo(); + return ResponseEntity.ok(userInfoVo); + } - @ApiOperation("获取验证码") - @AnonymousPostMapping(value = "/captcha/getImage") - public ResponseEntity> getCode() { - // 获取运算的结果 - Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); - String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); - //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 - String captchaValue = captcha.text(); - if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && - captchaValue.contains(SystemConst.SYMBOL_DOT)) { - captchaValue = captchaValue.split("\\.")[0]; - } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), - TimeUnit.MINUTES); - // 验证码信息 - Map imgResult = new HashMap(2) {{ - put("img", captcha.toBase64()); - put("uuid", uuid); - }}; - return ResponseEntity.ok(imgResult); - } + @ApiOperation("获取验证码") + @AnonymousPostMapping(value = "/captcha/getImage") + public ResponseEntity> getCode() { + Map imgResult = systemAuthService.getCaptchaInfo(); + return ResponseEntity.ok(imgResult); + } - @ApiOperation("退出登录") - @AnonymousPostMapping(value = "/logout") - public ResponseEntity logout(HttpServletRequest request) { - String token = tokenProvider.getToken(request); - systemUserOnlineInfoDAO.logoutByToken(token); - return ResponseEntity.ok(null); - } + @ApiOperation("退出登录") + @AnonymousPostMapping(value = "/logout") + public ResponseEntity logout(HttpServletRequest request) { + systemAuthService.doLogout(request); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java index c993f6f4..5834823e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java @@ -15,7 +15,6 @@ */ package cn.odboy.system.controller; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.service.SystemEmailService; @@ -35,30 +34,27 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:验证码管理") public class SystemCaptchaController { - @Autowired private SystemEmailService systemEmailService; + @Autowired + private SystemEmailService systemEmailService; - @ApiOperation("重置邮箱, 发送验证码") - @PostMapping(value = "/sendResetEmailCaptcha") - public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); - return ResponseEntity.ok(null); - } + @ApiOperation("重置邮箱, 发送验证码") + @PostMapping(value = "/sendResetEmailCaptcha") + public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); + return ResponseEntity.ok(null); + } - @ApiOperation("重置密码,发送验证码") - @PostMapping(value = "/sendResetPasswordCaptcha") - public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); - return ResponseEntity.ok(null); - } + @ApiOperation("重置密码,发送验证码") + @PostMapping(value = "/sendResetPasswordCaptcha") + public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); + return ResponseEntity.ok(null); + } - @ApiOperation("验证码验证") - @PostMapping(value = "/checkEmailCaptcha") - public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { - SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); - if (biEnum == null) { - throw new BadRequestException("不支持的业务"); - } - systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); - return ResponseEntity.ok(null); - } + @ApiOperation("验证码验证") + @PostMapping(value = "/checkEmailCaptcha") + public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { + systemEmailService.checkEmailCaptcha(args); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java index 6d29a7ad..ffb123a7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java @@ -30,19 +30,20 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/component") public class SystemComponentController { - @Autowired private SystemDeptService systemDeptService; + @Autowired + private SystemDeptService systemDeptService; - @ApiOperation("查询部门下拉选择数据源") - @PostMapping(value = "/queryDeptSelectDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); - } + @ApiOperation("查询部门下拉选择数据源") + @PostMapping(value = "/queryDeptSelectDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); + } - @ApiOperation("查询部门下拉选择Pro数据源") - @PostMapping(value = "/queryDeptSelectProDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectProDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); - } + @ApiOperation("查询部门下拉选择Pro数据源") + @PostMapping(value = "/queryDeptSelectProDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectProDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java index 799e989b..abec6b80 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java @@ -24,9 +24,9 @@ import cn.odboy.system.service.SystemDeptService; import cn.odboy.util.KitPageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.util.List; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -43,58 +43,54 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/dept") public class SystemDeptController { - @Autowired private SystemDeptService systemDeptService; + @Autowired + private SystemDeptService systemDeptService; - @ApiOperation("导出部门数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dept:list')") - public void exportDept(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { - systemDeptService.exportDeptExcel(systemDeptService.queryAllDeptByArgs(args, false), response); - } + @ApiOperation("导出部门数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dept:list')") + public void exportDept(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { + systemDeptService.exportDeptExcel(systemDeptService.queryAllDeptByArgs(args, false), response); + } - @ApiOperation("查询部门") - @PostMapping - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDept( - @Validated @RequestBody KitPageArgs pageArgs) throws Exception { - SystemQueryDeptArgs args = pageArgs.getArgs(); - List depts = systemDeptService.queryAllDeptByArgs(args, true); - return ResponseEntity.ok(KitPageUtil.toPage(depts)); - } + @ApiOperation("查询部门") + @PostMapping + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDept( + @Validated @RequestBody KitPageArgs pageArgs) throws Exception { + List depts = systemDeptService.queryAllDeptByArgs(pageArgs.getArgs(), true); + return ResponseEntity.ok(KitPageUtil.toPage(depts)); + } - @ApiOperation("查询部门:根据ID获取同级与上级数据") - @PostMapping("/queryDeptSuperiorTree") - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, - @RequestParam(defaultValue = "false") Boolean exclude) { - return ResponseEntity.ok(systemDeptService.searchDeptTree(ids, exclude)); - } + @ApiOperation("查询部门:根据ID获取同级与上级数据") + @PostMapping("/queryDeptSuperiorTree") + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, + @RequestParam(defaultValue = "false") Boolean exclude) { + return ResponseEntity.ok(systemDeptService.searchDeptTree(ids, exclude)); + } - @ApiOperation("新增部门") - @PostMapping(value = "/saveDept") - @PreAuthorize("@el.check('dept:add')") - public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { - systemDeptService.saveDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增部门") + @PostMapping(value = "/saveDept") + @PreAuthorize("@el.check('dept:add')") + public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { + systemDeptService.saveDept(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改部门") - @PostMapping(value = "/modifyDept") - @PreAuthorize("@el.check('dept:edit')") - public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { - systemDeptService.updateDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改部门") + @PostMapping(value = "/modifyDept") + @PreAuthorize("@el.check('dept:edit')") + public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { + systemDeptService.updateDept(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除部门") - @PostMapping(value = "/removeDeptByIds") - @PreAuthorize("@el.check('dept:del')") - public ResponseEntity removeDeptByIds(@RequestBody Set ids) { - // 获取部门, 和其所有子部门 - Set depts = systemDeptService.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - systemDeptService.verifyBindRelationByIds(depts); - systemDeptService.deleteDeptByIds(depts); - return ResponseEntity.ok(null); - } + @ApiOperation("删除部门") + @PostMapping(value = "/removeDeptByIds") + @PreAuthorize("@el.check('dept:del')") + public ResponseEntity removeDeptByIds(@RequestBody Set ids) { + systemDeptService.deleteDeptByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java index 236cf37c..7b1377da 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java @@ -24,10 +24,10 @@ import cn.odboy.system.service.SystemDictService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -43,53 +43,53 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/dict") public class SystemDictController { - @Autowired private SystemDictService systemDictService; + @Autowired + private SystemDictService systemDictService; - @ApiOperation("导出字典数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dict:list')") - public void exportDict(HttpServletResponse response, SystemQueryDictArgs args) throws IOException { - systemDictService.exportDictExcel(systemDictService.queryDictByArgs(args), response); - } + @ApiOperation("导出字典数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dict:list')") + public void exportDict(HttpServletResponse response, SystemQueryDictArgs args) throws IOException { + systemDictService.exportDictExcel(systemDictService.queryDictByArgs(args), response); + } - @ApiOperation("查询字典") - @PostMapping(value = "/queryAllDict") - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryAllDict() { - return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); - } + @ApiOperation("查询字典") + @PostMapping(value = "/queryAllDict") + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryAllDict() { + return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); + } - @ApiOperation("查询字典") - @PostMapping - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryDictByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { - Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - SystemQueryDictArgs args = pageArgs.getArgs(); - return ResponseEntity.ok(systemDictService.searchDict(args, page)); - } + @ApiOperation("查询字典") + @PostMapping + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryDictByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemDictService.searchDict(pageArgs.getArgs(), page)); + } - @ApiOperation("新增字典") - @PostMapping(value = "/saveDict") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { - systemDictService.saveDict(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典") + @PostMapping(value = "/saveDict") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { + systemDictService.saveDict(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改字典") - @PostMapping(value = "/modifyDictById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { - systemDictService.updateDictById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典") + @PostMapping(value = "/modifyDictById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { + systemDictService.updateDictById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除字典") - @PostMapping(value = "/removeDictByIds") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictByIds(@RequestBody Set ids) { - systemDictService.deleteDictByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("删除字典") + @PostMapping(value = "/removeDictByIds") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictByIds(@RequestBody Set ids) { + systemDictService.deleteDictByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java index ebc23bed..98d6bd89 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java @@ -25,7 +25,6 @@ import cn.odboy.system.service.SystemDictDetailService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; @@ -44,57 +43,53 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/dictDetail") public class SystemDictDetailController { - @Autowired private SystemDictDetailService systemDictDetailService; + @Autowired + private SystemDictDetailService systemDictDetailService; - @ApiOperation("查询字典详情") - @PostMapping - public ResponseEntity> queryDictDetailByCrud( - @Validated @RequestBody KitPageArgs args) { - return queryDictDetailByArgs(args); - } + @ApiOperation("查询字典详情") + @PostMapping + public ResponseEntity> queryDictDetailByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryDictDetailByArgs(args); + } - @ApiOperation("查询字典详情") - @PostMapping(value = "/queryDictDetailByArgs") - public ResponseEntity> queryDictDetailByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryDictDetailArgs args = pageArgs.getArgs(); - Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - return ResponseEntity.ok(systemDictDetailService.searchDictDetail(args, page)); - } + @ApiOperation("查询字典详情") + @PostMapping(value = "/queryDictDetailByArgs") + public ResponseEntity> queryDictDetailByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemDictDetailService.searchDictDetail(pageArgs.getArgs(), page)); + } - @ApiOperation("查询多个字典详情") - @GetMapping(value = "/getDictDetailMaps") - public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, systemDictDetailService.listDictDetailByName(name)); - } - return ResponseEntity.ok(dictMap); - } + @ApiOperation("查询多个字典详情") + @GetMapping(value = "/getDictDetailMaps") + public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { + Map> dictMap = systemDictDetailService.getDictDetailMap(dictName); + return ResponseEntity.ok(dictMap); + } - @ApiOperation("新增字典详情") - @PostMapping(value = "/saveDictDetail") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { - systemDictDetailService.saveDictDetail(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典详情") + @PostMapping(value = "/saveDictDetail") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { + systemDictDetailService.saveDictDetail(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改字典详情") - @PostMapping(value = "/modifyDictDetailById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictDetailById( - @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { - systemDictDetailService.updateDictDetailById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典详情") + @PostMapping(value = "/modifyDictDetailById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictDetailById( + @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { + systemDictDetailService.updateDictDetailById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除字典详情") - @PostMapping(value = "/removeDictDetailById") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { - systemDictDetailService.deleteDictDetailById(args.getId()); - return ResponseEntity.ok(null); - } + @ApiOperation("删除字典详情") + @PostMapping(value = "/removeDictDetailById") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { + systemDictDetailService.deleteDictDetailById(args.getId()); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java index 211f6af3..9fc9ac2c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java @@ -36,26 +36,27 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "工具:邮件管理") public class SystemEmailController { - @Autowired private SystemEmailService systemEmailService; + @Autowired + private SystemEmailService systemEmailService; - @ApiOperation("查询配置") - @PostMapping(value = "/getLastEmailConfig") - public ResponseEntity getLastEmailConfig() { - return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); - } + @ApiOperation("查询配置") + @PostMapping(value = "/getLastEmailConfig") + public ResponseEntity getLastEmailConfig() { + return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); + } - @ApiOperation("配置邮件") - @PostMapping(value = "/modifyEmailConfig") - public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) - throws Exception { - systemEmailService.updateEmailConfigById(emailConfig); - return ResponseEntity.ok(null); - } + @ApiOperation("配置邮件") + @PostMapping(value = "/modifyEmailConfig") + public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) + throws Exception { + systemEmailService.updateEmailConfigById(emailConfig); + return ResponseEntity.ok(null); + } - @ApiOperation("发送邮件") - @PostMapping(value = "/sendEmail") - public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { - systemEmailService.sendEmail(sendEmailRequest); - return ResponseEntity.ok(null); - } + @ApiOperation("发送邮件") + @PostMapping(value = "/sendEmail") + public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { + systemEmailService.sendEmail(sendEmailRequest); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java index 490b9151..1646ba11 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java @@ -24,9 +24,9 @@ import cn.odboy.system.service.SystemJobService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -42,56 +42,54 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/job") public class SystemJobController { - @Autowired private SystemJobService systemJobService; + @Autowired + private SystemJobService systemJobService; - @ApiOperation("导出岗位数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('job:list')") - public void exportJob(HttpServletResponse response, SystemQueryJobArgs args) throws IOException { - systemJobService.exportJobExcel(systemJobService.queryJobByArgs(args), response); - } + @ApiOperation("导出岗位数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('job:list')") + public void exportJob(HttpServletResponse response, SystemQueryJobArgs args) throws IOException { + systemJobService.exportJobExcel(systemJobService.queryJobByArgs(args), response); + } - @ApiOperation("查询岗位") - @PostMapping(value = "/queryAllEnableJob") - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryJobArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemJobService.searchJobByArgs(args, page)); - } + @ApiOperation("查询岗位") + @PostMapping(value = "/queryAllEnableJob") + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemJobService.searchJobByArgs(pageArgs.getArgs(), page)); + } - @ApiOperation("查询岗位") - @PostMapping - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByCrud( - @Validated @RequestBody KitPageArgs args) { - return queryJobByArgs(args); - } + @ApiOperation("查询岗位") + @PostMapping + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryJobByArgs(args); + } - @ApiOperation("新增岗位") - @PostMapping(value = "/saveJob") - @PreAuthorize("@el.check('job:add')") - public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { - systemJobService.saveJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增岗位") + @PostMapping(value = "/saveJob") + @PreAuthorize("@el.check('job:add')") + public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { + systemJobService.saveJob(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改岗位") - @PostMapping(value = "/modifyJobById") - @PreAuthorize("@el.check('job:edit')") - public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { - systemJobService.updateJobById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改岗位") + @PostMapping(value = "/modifyJobById") + @PreAuthorize("@el.check('job:edit')") + public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { + systemJobService.updateJobById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除岗位") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('job:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - // 验证是否被用户关联 - systemJobService.verifyBindRelationByIds(ids); - systemJobService.deleteJobByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("删除岗位") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('job:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + systemJobService.deleteJobByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java index 62df6ad9..9f81de8b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java @@ -17,17 +17,14 @@ package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.constant.FileTypeEnum; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemLocalStorageTb; import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.service.SystemLocalStorageService; -import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -45,57 +42,52 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/api/localStorage") public class SystemLocalStorageController { - @Autowired private SystemLocalStorageService localStorageService; + @Autowired + private SystemLocalStorageService localStorageService; - @ApiOperation("查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryLocalStorage( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryStorageArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(localStorageService.searchLocalStorage(args, page)); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryLocalStorage( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(localStorageService.searchLocalStorage(pageArgs.getArgs(), page)); + } - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { - localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorageByArgs(args), response); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { + localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorageByArgs(args), response); + } - @ApiOperation("上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { - localStorageService.uploadFile(name, file); - return ResponseEntity.ok(null); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { + localStorageService.uploadFile(name, file); + return ResponseEntity.ok(null); + } - @ApiOperation("上传图片") - @PostMapping("/uploadPicture") - public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { - // 判断文件是否为图片 - String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); - if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { - throw new BadRequestException("只能上传图片"); - } - SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); - return ResponseEntity.ok(localStorage); - } + @ApiOperation("上传图片") + @PostMapping("/uploadPicture") + public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { + SystemLocalStorageTb localStorage = localStorageService.uploadPictureV1(file); + return ResponseEntity.ok(localStorage); + } - @ApiOperation("修改文件") - @PostMapping(value = "/modifyLocalStorageById") - @PreAuthorize("@el.check('storage:edit')") - public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { - localStorageService.updateLocalStorageById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改文件") + @PostMapping(value = "/modifyLocalStorageById") + @PreAuthorize("@el.check('storage:edit')") + public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { + localStorageService.updateLocalStorageById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { - localStorageService.deleteFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { + localStorageService.deleteFileByIds(ids); + return ResponseEntity.ok(null); + } } 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 ed0dccda..43b77ea0 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 @@ -15,7 +15,6 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.collection.CollectionUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; @@ -23,18 +22,13 @@ import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.model.SystemMenuVo; import cn.odboy.system.dal.model.SystemQueryMenuArgs; import cn.odboy.system.dal.mysql.SystemMenuMapper; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemMenuService; import cn.odboy.util.KitPageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import jakarta.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -51,108 +45,90 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/menu") public class SystemMenuController { - @Autowired private SystemMenuService systemMenuService; - @Autowired private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemMenuService systemMenuService; + @Autowired + private SystemMenuMapper systemMenuMapper; - @ApiOperation("导出菜单数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('menu:list')") - public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { - systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(args, false), response); - } + @ApiOperation("导出菜单数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('menu:list')") + public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { + systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(args, false), response); + } - @PostMapping(value = "/buildMenus") - @ApiOperation("获取前端所需菜单") - public ResponseEntity> buildMenus() { - List menuList = systemMenuService.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); - List menus = systemMenuService.buildMenuTree(menuList); - return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); - } + @PostMapping(value = "/buildMenus") + @ApiOperation("获取前端所需菜单") + public ResponseEntity> buildMenus() { + List systemMenuVos = systemMenuService.buildFrontMenus(); + return ResponseEntity.ok(systemMenuVos); + } - @ApiOperation("返回全部的菜单") - @PostMapping(value = "/queryMenuListByPid") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { - return ResponseEntity.ok(systemMenuService.listMenuByPid(pid)); - } + @ApiOperation("返回全部的菜单") + @PostMapping(value = "/queryMenuListByPid") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { + List systemMenuTbs = systemMenuService.listMenuByPid(pid); + return ResponseEntity.ok(systemMenuTbs); + } - @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") - @PostMapping(value = "/queryChildMenuSet") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { - Set menuSet = new HashSet<>(); - List menuList = systemMenuService.listMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = systemMenuService.queryChildMenuByArgs(menuList, menuSet); - Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); - return ResponseEntity.ok(ids); - } + @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") + @PostMapping(value = "/queryChildMenuSet") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { + Set ids = systemMenuService.listChildMenuSetByMenuId(id); + return ResponseEntity.ok(ids); + } - @PostMapping - @ApiOperation("查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenuByCrud( - @Validated @RequestBody KitPageArgs args) throws Exception { - return queryAllMenu(args); - } + @PostMapping + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenuByCrud( + @Validated @RequestBody KitPageArgs args) throws Exception { + return queryAllMenu(args); + } - @PostMapping(value = "/queryMenuByArgs") - @ApiOperation("查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenu( - @Validated @RequestBody KitPageArgs pageArgs) throws Exception { - SystemQueryMenuArgs args = pageArgs.getArgs(); - List menuList = systemMenuService.queryAllMenu(args, true); - return ResponseEntity.ok(KitPageUtil.toPage(menuList)); - } + @PostMapping(value = "/queryMenuByArgs") + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenu( + @Validated @RequestBody KitPageArgs pageArgs) throws Exception { + List menuList = systemMenuService.queryAllMenu(pageArgs.getArgs(), true); + return ResponseEntity.ok(KitPageUtil.toPage(menuList)); + } - @ApiOperation("查询菜单:根据ID获取同级与上级数据") - @PostMapping("/queryMenuSuperior") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { - Set menus; - if (CollectionUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(systemMenuService.listMenuByIds(ids)); - for (SystemMenuTb menu : menus) { - List menuList = systemMenuService.querySuperiorMenuByArgs(menu, new ArrayList<>()); - for (SystemMenuTb data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); - } - return ResponseEntity.ok(systemMenuService.listMenuByPid(null)); - } + @ApiOperation("查询菜单:根据ID获取同级与上级数据") + @PostMapping("/queryMenuSuperior") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { + List systemMenuTbs = systemMenuService.listMenuSuperior(ids); + return ResponseEntity.ok(systemMenuTbs); + } - @ApiOperation("新增菜单") - @PostMapping(value = "/saveMenu") - @PreAuthorize("@el.check('menu:add')") - public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - systemMenuService.saveMenu(args); - return ResponseEntity.ok(null); + @ApiOperation("新增菜单") + @PostMapping(value = "/saveMenu") + @PreAuthorize("@el.check('menu:add')") + public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + systemMenuService.saveMenu(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改菜单") - @PostMapping(value = "/modifyMenuById") - @PreAuthorize("@el.check('menu:edit')") - public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { - systemMenuService.updateMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改菜单") + @PostMapping(value = "/modifyMenuById") + @PreAuthorize("@el.check('menu:edit')") + public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { + systemMenuService.updateMenuById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除菜单") - @PostMapping(value = "/removeMenuByIds") - @PreAuthorize("@el.check('menu:del')") - public ResponseEntity removeMenuByIds(@RequestBody Set ids) { - systemMenuService.deleteMenuByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("删除菜单") + @PostMapping(value = "/removeMenuByIds") + @PreAuthorize("@el.check('menu:del')") + public ResponseEntity removeMenuByIds(@RequestBody Set ids) { + systemMenuService.deleteMenuByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java index 1654599d..5b419e52 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java @@ -31,12 +31,13 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/monitor") public class SystemMonitorController { - @Autowired private SystemMonitorService systemMonitorService; + @Autowired + private SystemMonitorService systemMonitorService; - @PostMapping(value = "/queryServerMonitorInfo") - @ApiOperation("查询服务监控") - @PreAuthorize("@el.check('monitor:list')") - public ResponseEntity> queryServerMonitorInfo() { - return ResponseEntity.ok(systemMonitorService.getServerMonitorInfo()); - } + @PostMapping(value = "/queryServerMonitorInfo") + @ApiOperation("查询服务监控") + @PreAuthorize("@el.check('monitor:list')") + public ResponseEntity> queryServerMonitorInfo() { + return ResponseEntity.ok(systemMonitorService.getServerMonitorInfo()); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java index e5c341c5..d92e493a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java @@ -19,14 +19,14 @@ import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.model.SystemUserOnlineVo; import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.util.KitDesEncryptUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.List; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -42,34 +42,31 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:在线用户管理") public class SystemOnlineController { - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @ApiOperation("查询在线用户") - @PostMapping - @PreAuthorize("@el.check()") - public ResponseEntity> queryOnlineUser( - @Validated @RequestBody KitPageArgs args) { - IPage page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); - } + @ApiOperation("查询在线用户") + @PostMapping + @PreAuthorize("@el.check()") + public ResponseEntity> queryOnlineUser( + @Validated @RequestBody KitPageArgs pageArgs) { + IPage page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(pageArgs.getArgs(), page)); + } - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check()") - public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { - systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( - systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check()") + public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { + List userOnlineVos = systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username); + systemUserOnlineInfoDAO.downloadUserOnlineModelExcel(userOnlineVos, response); + } - @ApiOperation("踢出用户") - @PostMapping(value = "/kickOutUser") - @PreAuthorize("@el.check()") - public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { - for (String token : keys) { - // 解密Key - token = KitDesEncryptUtil.desDecrypt(token); - systemUserOnlineInfoDAO.logoutByToken(token); - } - return ResponseEntity.ok(null); - } + @ApiOperation("踢出用户") + @PostMapping(value = "/kickOutUser") + @PreAuthorize("@el.check()") + public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { + systemUserOnlineInfoDAO.kickOutUser(keys); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java index 59232ff6..43609b09 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java @@ -24,8 +24,8 @@ import cn.odboy.system.service.SystemOssStorageService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -45,37 +45,37 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/api/ossStorage") public class SystemOssStorageController { - @Autowired private SystemOssStorageService systemOssStorageService; + @Autowired + private SystemOssStorageService systemOssStorageService; - @ApiOperation("查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryOssStorage( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryStorageArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemOssStorageService.searchOssStorage(args, page)); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryOssStorage( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemOssStorageService.searchOssStorage(pageArgs.getArgs(), page)); + } - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { - systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(args), response); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { + systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(args), response); + } - @ApiOperation("上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { - String fileUrl = systemOssStorageService.uploadFile(file); - return ResponseEntity.ok(fileUrl); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + String fileUrl = systemOssStorageService.uploadFile(file); + return ResponseEntity.ok(fileUrl); + } - @ApiOperation("多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { - systemOssStorageService.deleteFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { + systemOssStorageService.deleteFileByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java index df5b0cae..53d1064d 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java @@ -17,8 +17,6 @@ package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.context.KitSpringBeanHolder; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemQuartzJobTb; import cn.odboy.system.dal.dataobject.SystemQuartzLogTb; import cn.odboy.system.dal.model.SystemQueryQuartzJobArgs; @@ -27,9 +25,9 @@ import cn.odboy.system.service.SystemQuartzJobService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -49,98 +47,78 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:定时任务管理") public class SystemQuartzJobController { - @Autowired private SystemQuartzJobService systemQuartzJobService; + @Autowired + private SystemQuartzJobService systemQuartzJobService; - @ApiOperation("查询定时任务") - @PostMapping - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobByCrud( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryQuartzJobArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemQuartzJobService.searchQuartzJobByArgs(args, page)); - } + @ApiOperation("查询定时任务") + @PostMapping + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobByCrud( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemQuartzJobService.searchQuartzJobByArgs(pageArgs.getArgs(), page)); + } - @ApiOperation("导出任务数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { - systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(args), response); - } + @ApiOperation("导出任务数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { + systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(args), response); + } - @ApiOperation("导出日志数据") - @GetMapping(value = "/logs/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { - systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(args), response); - } + @ApiOperation("导出日志数据") + @GetMapping(value = "/logs/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { + systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(args), response); + } - @ApiOperation("查询任务执行日志") - @PostMapping(value = "/logs") - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page)); - } + @ApiOperation("查询任务执行日志") + @PostMapping(value = "/logs") + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page)); + } - @ApiOperation("新增定时任务") - @PostMapping(value = "/createQuartzJob") - @PreAuthorize("@el.check('quartzJob:add')") - public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.createJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增定时任务") + @PostMapping(value = "/createQuartzJob") + @PreAuthorize("@el.check('quartzJob:add')") + public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { + systemQuartzJobService.createJob(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改定时任务") - @PutMapping - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity updateQuartzJob( - @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.updateQuartzJobResumeCron(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改定时任务") + @PutMapping + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity updateQuartzJob( + @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { + systemQuartzJobService.updateQuartzJobResumeCron(args); + return ResponseEntity.ok(null); + } - @ApiOperation("更改定时任务状态") - @PostMapping(value = "/switchQuartzJobStatus/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { - systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("更改定时任务状态") + @PostMapping(value = "/switchQuartzJobStatus/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { + systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - @ApiOperation("执行定时任务") - @PostMapping(value = "/startQuartzJob/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity startQuartzJob(@PathVariable Long id) { - systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("执行定时任务") + @PostMapping(value = "/startQuartzJob/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity startQuartzJob(@PathVariable Long id) { + systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - @ApiOperation("删除定时任务") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('quartzJob:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - systemQuartzJobService.deleteJobByIds(ids); - return ResponseEntity.ok(null); - } - - /** - * 验证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,请重新输入!"); - } - } + @ApiOperation("删除定时任务") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('quartzJob:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + systemQuartzJobService.deleteJobByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java index 57d22e95..619b991f 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java @@ -18,22 +18,18 @@ package cn.odboy.system.controller; import cn.hutool.core.lang.Dict; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleVo; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemRoleService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -49,101 +45,74 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/role") public class SystemRoleController { - @Autowired private SystemRoleService systemRoleService; + @Autowired + private SystemRoleService systemRoleService; - @ApiOperation("获取单个role") - @PostMapping(value = "/queryRoleById") - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { - return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); - } + @ApiOperation("获取单个role") + @PostMapping(value = "/queryRoleById") + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { + return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); + } - @ApiOperation("导出角色数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('role:list')") - public void exportRole(HttpServletResponse response, SystemQueryRoleArgs args) throws IOException { - systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(args), response); - } + @ApiOperation("导出角色数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('role:list')") + public void exportRole(HttpServletResponse response, SystemQueryRoleArgs args) throws IOException { + systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(args), response); + } - @ApiOperation("返回全部的角色") - @PostMapping(value = "/queryRoleList") - @PreAuthorize("@el.check('roles:list','user:add','user:edit')") - public ResponseEntity> queryRoleList() { - return ResponseEntity.ok(systemRoleService.listAllRole()); - } + @ApiOperation("返回全部的角色") + @PostMapping(value = "/queryRoleList") + @PreAuthorize("@el.check('roles:list','user:add','user:edit')") + public ResponseEntity> queryRoleList() { + return ResponseEntity.ok(systemRoleService.listAllRole()); + } - @ApiOperation("查询角色") - @PostMapping - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity> queryRoleByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryRoleArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemRoleService.searchRoleByArgs(args, page)); - } + @ApiOperation("查询角色") + @PostMapping + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity> queryRoleByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page)); + } - @ApiOperation("获取用户级别") - @PostMapping(value = "/queryRoleLevel") - public ResponseEntity queryRoleLevel() { - return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); - } + @ApiOperation("获取用户级别") + @PostMapping(value = "/queryRoleLevel") + public ResponseEntity queryRoleLevel() { + return ResponseEntity.ok(systemRoleService.getRoleLevel()); + } - @ApiOperation("新增角色") - @PostMapping(value = "/saveRole") - @PreAuthorize("@el.check('roles:add')") - public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); - systemRoleService.saveRole(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增角色") + @PostMapping(value = "/saveRole") + @PreAuthorize("@el.check('roles:add')") + public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { + systemRoleService.saveRole(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改角色") - @PostMapping(value = "/modifyRoleById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { - checkRoleLevels(args.getLevel()); - systemRoleService.updateRoleById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色") + @PostMapping(value = "/modifyRoleById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { + systemRoleService.updateRoleById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改角色菜单") - @PostMapping(value = "/modifyBindMenuById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleVo args) { - SystemRoleTb role = systemRoleService.getRoleById(args.getId()); - checkRoleLevels(role.getLevel()); - systemRoleService.updateBindMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色菜单") + @PostMapping(value = "/modifyBindMenuById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleVo args) { + systemRoleService.updateBindMenuById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除角色") - @PostMapping(value = "/removeRoleByIds") - @PreAuthorize("@el.check('roles:del')") - public ResponseEntity removeRoleByIds(@RequestBody Set ids) { - for (Long id : ids) { - SystemRoleTb role = systemRoleService.getRoleById(id); - checkRoleLevels(role.getLevel()); - } - // 验证是否被用户关联 - systemRoleService.verifyBindRelationByIds(ids); - systemRoleService.deleteRoleByIds(ids); - return ResponseEntity.ok(null); - } - - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList()); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } - } - return min; - } + @ApiOperation("删除角色") + @PostMapping(value = "/removeRoleByIds") + @PreAuthorize("@el.check('roles:del')") + public ResponseEntity removeRoleByIds(@RequestBody Set ids) { + systemRoleService.deleteRoleByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java index bf74379b..ce32eac2 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java @@ -15,15 +15,9 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.collection.CollectionUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; -import cn.odboy.framework.exception.BadRequestException; -import cn.odboy.framework.properties.AppProperties; -import cn.odboy.system.constant.SystemCaptchaBizEnum; -import cn.odboy.system.dal.dataobject.SystemDeptTb; -import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; @@ -31,26 +25,17 @@ import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemDataService; import cn.odboy.system.service.SystemDeptService; -import cn.odboy.system.service.SystemEmailService; -import cn.odboy.system.service.SystemRoleService; import cn.odboy.system.service.SystemUserService; -import cn.odboy.util.KitPageUtil; -import cn.odboy.util.KitRsaEncryptUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -66,173 +51,95 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/api/user") public class SystemUserController { - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private SystemUserService systemUserService; - @Autowired private SystemDataService systemDataService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemEmailService systemEmailService; - @Autowired private AppProperties properties; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemDeptService systemDeptService; - @ApiOperation("导出用户数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('user:list')") - public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs args) throws IOException { - systemUserService.exportUserExcel(systemUserService.queryUserByArgs(args), response); - } - @ApiOperation("查询用户") - @PostMapping - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { - Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - SystemQueryUserArgs args = pageArgs.getArgs(); - if (!ObjectUtils.isEmpty(args.getDeptId())) { - args.getDeptIds().add(args.getDeptId()); - // 先查找是否存在子节点 - List data = systemDeptService.listDeptByPid(args.getDeptId()); - // 然后把子节点的ID都加入到集合中 - args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); - } - // 数据权限 - List dataScopes = systemDataService.queryDeptIdByArgs( - systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername())); - // args.getDeptIds() 不为空并且数据权限不为空则取交集 - if (!CollectionUtils.isEmpty(args.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { - // 取交集 - args.getDeptIds().retainAll(dataScopes); - if (!CollectionUtil.isEmpty(args.getDeptIds())) { - return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); - } - } else { - // 否则取并集 - args.getDeptIds().addAll(dataScopes); - return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); - } - return ResponseEntity.ok(KitPageUtil.emptyData()); - } + @ApiOperation("导出用户数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('user:list')") + public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs args) throws IOException { + systemUserService.exportUserExcel(systemUserService.queryUserByArgs(args), response); + } - @ApiOperation("新增用户") - @PostMapping(value = "/saveUser") - @PreAuthorize("@el.check('user:add')") - public ResponseEntity saveUser(@Validated @RequestBody SystemUserVo args) { - checkLevel(args); - // 默认密码 123456 - args.setPassword(passwordEncoder.encode("123456")); - systemUserService.saveUser(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询用户") + @PostMapping + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserByArgs(@Validated @RequestBody KitPageArgs pageArgs) { + String currentUsername = KitSecurityHelper.getCurrentUsername(); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemUserService.aggregationSearchUserByArgs(page, pageArgs.getArgs(), currentUsername)); + } - @ApiOperation("修改用户") - @PostMapping(value = "/modifyUserById") - @PreAuthorize("@el.check('user:edit')") - public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { - checkLevel(args); - systemUserService.updateUserById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增用户") + @PostMapping(value = "/saveUser") + @PreAuthorize("@el.check('user:add')") + public ResponseEntity saveUser(@Validated @RequestBody SystemUserVo args) { + systemUserService.saveUser(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改用户:个人中心") - @PostMapping(value = "modifyUserCenterInfoById") - public ResponseEntity modifyUserCenterInfoById( - @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); - } - systemUserService.updateUserCenterInfoById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改用户") + @PostMapping(value = "/modifyUserById") + @PreAuthorize("@el.check('user:edit')") + public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { + systemUserService.updateUserById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除用户") - @PostMapping(value = "/removeUserByIds") - @PreAuthorize("@el.check('user:del')") - public ResponseEntity removeUserByIds(@RequestBody Set ids) { - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = Collections.min( - systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) - .collect(Collectors.toList())); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); - } - } - systemUserService.removeUserByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改用户:个人中心") + @PostMapping(value = "modifyUserCenterInfoById") + public ResponseEntity modifyUserCenterInfoById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { + systemUserService.updateUserCenterInfoById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改密码") - @PostMapping(value = "/modifyUserPasswordByUsername") - public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) - throws Exception { - String oldPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); - String newPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(oldPass, user.getPassword())) { - throw new BadRequestException("修改失败,旧密码错误"); - } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - systemUserService.updateUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); - return ResponseEntity.ok(null); - } + @ApiOperation("删除用户") + @PostMapping(value = "/removeUserByIds") + @PreAuthorize("@el.check('user:del')") + public ResponseEntity removeUserByIds(@RequestBody Set ids) { + systemUserService.removeUserByIds(ids); + return ResponseEntity.ok(null); + } - @ApiOperation("重置密码") - @PostMapping(value = "/resetUserPasswordByIds") - public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { - String defaultPwd = passwordEncoder.encode("123456"); - systemUserService.resetUserPasswordByIds(ids, defaultPwd); - return ResponseEntity.ok(null); - } + @ApiOperation("修改密码") + @PostMapping(value = "/modifyUserPasswordByUsername") + public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) throws Exception { + String currentUsername = KitSecurityHelper.getCurrentUsername(); + systemUserService.updateUserPasswordByUsername(currentUsername, passVo); + return ResponseEntity.ok(null); + } - @ApiOperation("修改头像") - @PostMapping(value = "/modifyUserAvatar") - public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { - return ResponseEntity.ok(systemUserService.updateUserAvatar(avatar)); - } + @ApiOperation("重置密码") + @PostMapping(value = "/resetUserPasswordByIds") + public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { + systemUserService.resetUserPasswordByIds(ids); + return ResponseEntity.ok(null); + } - @ApiOperation("修改邮箱") - @PostMapping(value = "/modifyUserEmailByUsername/{code}") - public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) - throws Exception { - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(password, user.getPassword())) { - throw new BadRequestException("密码错误"); - } - systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserService.updateUserEmailByUsername(user.getUsername(), args.getEmail()); - return ResponseEntity.ok(null); - } + @ApiOperation("修改头像") + @PostMapping(value = "/modifyUserAvatar") + public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { + return ResponseEntity.ok(systemUserService.updateUserAvatar(avatar)); + } - /** - * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 - * - * @param args / - */ - private void checkLevel(SystemUserVo args) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); - } - } + @ApiOperation("修改邮箱") + @PostMapping(value = "/modifyUserEmailByUsername/{code}") + public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) throws Exception { + String currentUsername = KitSecurityHelper.getCurrentUsername(); + systemUserService.updateUserEmailByUsername(currentUsername, args, code); + return ResponseEntity.ok(null); + } - @ApiOperation("查询用户基础数据") - @PostMapping(value = "/queryUserMetadataOptions") - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserMetadataOptions( - @Validated @RequestBody KitPageArgs args) { - List collect = systemUserService.queryUserMetadataOptions(args); - return ResponseEntity.ok(collect); - } + @ApiOperation("查询用户基础数据") + @PostMapping(value = "/queryUserMetadataOptions") + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserMetadataOptions(@Validated @RequestBody KitPageArgs args) { + List collect = systemUserService.queryUserMetadataOptions(args); + return ResponseEntity.ok(collect); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java index 7d537371..336b291a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java @@ -28,10 +28,10 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemDeptMapper extends BaseMapper { - default void updateDeptSubCountById(long count, Long deptId) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemDeptTb::getId, deptId); - wrapper.set(SystemDeptTb::getSubCount, count); - update(null, wrapper); - } + default void updateDeptSubCountById(long count, Long deptId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemDeptTb::getId, deptId); + wrapper.set(SystemDeptTb::getSubCount, count); + update(null, wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java index d9f62f54..b8916b24 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java @@ -30,5 +30,6 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemDictDetailMapper extends BaseMapper { + IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java index c5a86750..8e7e49e5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java @@ -29,13 +29,13 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemDictMapper extends BaseMapper { - default List listAll() { - return selectList(null); - } + default List listAll() { + return selectList(null); + } - default SystemDictTb getByName(String dictName) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDictTb::getName, dictName); - return selectOne(wrapper); - } + default SystemDictTb getByName(String dictName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDictTb::getName, dictName); + return selectOne(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java index 00aaecd8..4bfdd651 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java @@ -29,24 +29,24 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemUserMapper extends BaseMapper { - default void updateUserPasswordByUsername(String username, String password) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); - } + default void updateUserPasswordByUsername(String username, String password) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } - default void updateUserEmailByUsername(String username, String email) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getEmail, email); - update(null, wrapper); - } + default void updateUserEmailByUsername(String username, String email) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getEmail, email); + update(null, wrapper); + } - default void updateUserPasswordByUserIds(String password, Set userIds) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.in(SystemUserTb::getId, userIds); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); - } + default void updateUserPasswordByUserIds(String password, Set userIds) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(SystemUserTb::getId, userIds); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } } 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/dal/redis/SystemCacheKey.java index c4f8fc0d..7a73436b 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/dal/redis/SystemCacheKey.java @@ -20,50 +20,50 @@ package cn.odboy.system.dal.redis; */ public interface SystemCacheKey { - /** - * 用户 - */ - 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:"; + /** + * 用户 + */ + 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/SystemRedisKey.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java index d2fd4ba0..e8eb9240 100644 --- 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 @@ -5,50 +5,50 @@ package cn.odboy.system.dal.redis; */ 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:"; + /** + * 用户 + */ + 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 e751cdba..aea97b10 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 @@ -14,46 +14,47 @@ import org.springframework.stereotype.Component; @Component public class SystemUserInfoDAO { - @Autowired private KitRedisHelper redisHelper; + @Autowired + private KitRedisHelper redisHelper; - /** - * 添加缓存到Redis - * - * @param userName 用户名 - */ - @Async - public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { - if (StrUtil.isNotEmpty(userName)) { - // 添加数据, 避免数据同时过期(2小时左右) - long time = 7200 + RandomUtil.randomInt(900, 1800); - redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); - } + /** + * 添加缓存到Redis + * + * @param userName 用户名 + */ + @Async + public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { + if (StrUtil.isNotEmpty(userName)) { + // 添加数据, 避免数据同时过期(2小时左右) + long time = 7200 + RandomUtil.randomInt(900, 1800); + redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); } + } - /** - * 清理用户缓存信息 用户信息变更时 - * - * @param userName 用户名 - */ - @Async - public void deleteUserLoginInfoByUserName(String userName) { - if (StrUtil.isNotEmpty(userName)) { - // 清除数据 - redisHelper.del(SystemRedisKey.USER_INFO + userName); - } + /** + * 清理用户缓存信息 用户信息变更时 + * + * @param userName 用户名 + */ + @Async + public void deleteUserLoginInfoByUserName(String userName) { + if (StrUtil.isNotEmpty(userName)) { + // 清除数据 + redisHelper.del(SystemRedisKey.USER_INFO + userName); } + } - /** - * 返回用户缓存 - * - * @param username 用户名 - * @return UserJwtVo - */ - public SystemUserJwtVo getUserLoginInfoByUserName(String username) { - if (StrUtil.isNotEmpty(username)) { - // 获取数据 - return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); - } - return null; + /** + * 返回用户缓存 + * + * @param username 用户名 + * @return UserJwtVo + */ + public SystemUserJwtVo getUserLoginInfoByUserName(String username) { + if (StrUtil.isNotEmpty(username)) { + // 获取数据 + return redisHelper.get(SystemRedisKey.USER_INFO + 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 de834919..1c660dbc 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 @@ -13,8 +13,6 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitIPUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -22,7 +20,10 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -32,129 +33,137 @@ import org.springframework.stereotype.Component; @AllArgsConstructor public class SystemUserOnlineInfoDAO { - private final AppProperties properties; - private final TokenProvider tokenProvider; - private final KitRedisHelper redisHelper; + private final AppProperties properties; + private final TokenProvider tokenProvider; + private final KitRedisHelper redisHelper; - /** - * 保存在线用户信息 - * - * @param userJwtVo / - * @param token / - * @param request / - */ - public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { - String dept = userJwtVo.getUser().getDept().getName(); - String ip = KitBrowserUtil.getIp(request); - String id = tokenProvider.getId(token); - String version = KitBrowserUtil.getVersion(request); - String address = KitIPUtil.getCityInfo(ip); - SystemUserOnlineVo userOnlineVo = null; - try { - userOnlineVo = new SystemUserOnlineVo(); - userOnlineVo.setUid(id); - userOnlineVo.setUserName(userJwtVo.getUsername()); - userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); - userOnlineVo.setDept(dept); - userOnlineVo.setBrowser(version); - userOnlineVo.setIp(ip); - userOnlineVo.setAddress(address); - userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); - userOnlineVo.setLoginTime(new Date()); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - String loginKey = tokenProvider.loginKey(token); - redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); + /** + * 保存在线用户信息 + * + * @param userJwtVo / + * @param token / + * @param request / + */ + public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { + String dept = userJwtVo.getUser().getDept().getName(); + String ip = KitBrowserUtil.getIp(request); + String id = tokenProvider.getId(token); + String version = KitBrowserUtil.getVersion(request); + String address = KitIPUtil.getCityInfo(ip); + SystemUserOnlineVo userOnlineVo = null; + try { + userOnlineVo = new SystemUserOnlineVo(); + userOnlineVo.setUid(id); + userOnlineVo.setUserName(userJwtVo.getUsername()); + userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); + userOnlineVo.setDept(dept); + userOnlineVo.setBrowser(version); + userOnlineVo.setIp(ip); + userOnlineVo.setAddress(address); + userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); + userOnlineVo.setLoginTime(new Date()); + } catch (Exception e) { + log.error(e.getMessage(), e); } + String loginKey = tokenProvider.loginKey(token); + redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); + } - /** - * 退出登录 - * - * @param token / - */ - public void logoutByToken(String token) { - String loginKey = tokenProvider.loginKey(token); - redisHelper.del(loginKey); - } + /** + * 退出登录 + * + * @param token / + */ + public void logoutByToken(String token) { + String loginKey = tokenProvider.loginKey(token); + redisHelper.del(loginKey); + } - /** - * 导出 - * - * @param all / - * @param response / - * @throws IOException / - */ - public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemUserOnlineVo user : all) { - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUserName()); - map.put("部门", user.getDept()); - map.put("登录IP", user.getIp()); - map.put("登录地点", user.getAddress()); - map.put("浏览器", user.getBrowser()); - map.put("登录日期", user.getLoginTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出 + * + * @param all / + * @param response / + * @throws IOException / + */ + public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemUserOnlineVo user : all) { + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUserName()); + map.put("部门", user.getDept()); + map.put("登录IP", user.getIp()); + map.put("登录地点", user.getAddress()); + map.put("浏览器", user.getBrowser()); + map.put("登录日期", user.getLoginTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 根据用户名强退用户 - * - * @param username / - */ - public void kickOutByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; - redisHelper.scanDel(loginKey); - } + /** + * 根据用户名强退用户 + * + * @param username / + */ + public void kickOutByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; + redisHelper.scanDel(loginKey); + } - /** - * 查询全部数据 - * - * @param onlineVo / - * @param pageable / - * @return / - */ - public KitPageResult queryUserOnlineModelPage(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); - return KitPageUtil.toPage(paging, onlineUserList.size()); + /** + * 查询全部数据 + * + * @param onlineVo / + * @param pageable / + * @return / + */ + public KitPageResult queryUserOnlineModelPage(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); + return KitPageUtil.toPage(paging, onlineUserList.size()); + } - /** - * 查询全部数据,不分页 - * - * @param username / - * @return / - */ - public List queryUserOnlineModelListByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); - List keys = redisHelper.scan(loginKey + "*"); - Collections.reverse(keys); - List onlineUserList = new ArrayList<>(); - for (String key : keys) { - onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); - } - onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); - return onlineUserList; + /** + * 查询全部数据,不分页 + * + * @param username / + * @return / + */ + public List queryUserOnlineModelListByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); + List keys = redisHelper.scan(loginKey + "*"); + Collections.reverse(keys); + List onlineUserList = new ArrayList<>(); + for (String key : keys) { + onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); } + onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); + return onlineUserList; + } - /** - * 查询用户 - * - * @param key / - * @return / - */ - public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { - return redisHelper.get(key, SystemUserOnlineVo.class); + /** + * 查询用户 + * + * @param key / + * @return / + */ + public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { + return redisHelper.get(key, SystemUserOnlineVo.class); + } + + public void kickOutUser(Set keys) throws Exception { + for (String token : keys) { + // 解密Key + token = KitDesEncryptUtil.desDecrypt(token); + this.logoutByToken(token); } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java new file mode 100644 index 00000000..441f4d2c --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java @@ -0,0 +1,117 @@ +package cn.odboy.system.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.odboy.constant.CaptchaCodeEnum; +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.dal.model.SystemUserInfoVo; +import cn.odboy.system.dal.model.SystemUserJwtVo; +import cn.odboy.system.dal.model.SystemUserLoginArgs; +import cn.odboy.system.dal.redis.SystemCacheKey; +import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; +import cn.odboy.system.framework.permission.core.handler.TokenProvider; +import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; +import cn.odboy.util.KitRsaEncryptUtil; +import com.wf.captcha.base.Captcha; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class SystemAuthService { + + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; + + public Map doLogin(SystemUserLoginArgs loginRequest, HttpServletRequest request) throws Exception { + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); + // 查询验证码 + String code = redisHelper.get(loginRequest.getUuid(), String.class); + // 清除验证码 + redisHelper.del(loginRequest.getUuid()); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); + } + if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { + throw new BadRequestException("验证码错误"); + } + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); + // 验证用户密码 + if (!passwordEncoder.matches(password, jwtUser.getPassword())) { + throw new BadRequestException("登录密码错误"); + } + Authentication authentication = + new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map authInfo = new HashMap<>(2) {{ + put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); + }}; + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return authInfo; + } + + public SystemUserInfoVo getCurrentUserInfoVo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); + return BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); + } + + public Map getCaptchaInfo() { + // 获取运算的结果 + Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); + String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); + //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 + String captchaValue = captcha.text(); + if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && + captchaValue.contains(SystemConst.SYMBOL_DOT)) { + captchaValue = captchaValue.split("\\.")[0]; + } + // 保存 + redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), + TimeUnit.MINUTES); + // 验证码信息 + return new HashMap<>(2) {{ + put("img", captcha.toBase64()); + put("uuid", uuid); + }}; + } + + public void doLogout(HttpServletRequest request) { + String token = tokenProvider.getToken(request); + systemUserOnlineInfoDAO.logoutByToken(token); + } +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java index 82aa3224..587cc79e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java @@ -36,53 +36,56 @@ import org.springframework.stereotype.Service; @Service public class SystemDataService { - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 获取数据权限 - * - * @param user / - * @return / - */ - public List queryDeptIdByArgs(SystemUserTb user) { - List deptIds = new ArrayList<>(); - // 查询用户角色 - List roleList = systemRoleService.queryRoleByUsersId(user.getId()); - // 获取对应的部门ID - for (SystemRoleTb role : roleList) { - SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); - switch (Objects.requireNonNull(dataScopeEnum)) { - case THIS_LEVEL: - deptIds.add(user.getDept().getId()); - break; - case CUSTOMIZE: - deptIds.addAll(this.queryCustomDataPermissionByArgs(deptIds, role)); - break; - default: - return new ArrayList<>(); - } - } - return deptIds.stream().distinct().collect(Collectors.toList()); + /** + * 获取数据权限 + * + * @param user / + * @return / + */ + public List queryDeptIdByArgs(SystemUserTb user) { + List deptIds = new ArrayList<>(); + // 查询用户角色 + List roleList = systemUserRoleService.queryRoleByUsersId(user.getId()); + // 获取对应的部门ID + for (SystemRoleTb role : roleList) { + SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); + switch (Objects.requireNonNull(dataScopeEnum)) { + case THIS_LEVEL: + deptIds.add(user.getDept().getId()); + break; + case CUSTOMIZE: + deptIds.addAll(this.queryCustomDataPermissionByArgs(deptIds, role)); + break; + default: + return new ArrayList<>(); + } } + return deptIds.stream().distinct().collect(Collectors.toList()); + } - /** - * 获取自定义的数据权限 - * - * @param deptIds 部门ID - * @param role 角色 - * @return 数据权限ID - */ - private List queryCustomDataPermissionByArgs(List deptIds, SystemRoleTb role) { - List deptList = systemRoleDeptService.listDeptByRoleId(role.getId()); - for (SystemDeptTb dept : deptList) { - deptIds.add(dept.getId()); - List deptChildren = systemDeptService.listDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptChildren)) { - deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren)); - } - } - return deptIds; + /** + * 获取自定义的数据权限 + * + * @param deptIds 部门ID + * @param role 角色 + * @return 数据权限ID + */ + private List queryCustomDataPermissionByArgs(List deptIds, SystemRoleTb role) { + List deptList = systemRoleDeptService.listDeptByRoleId(role.getId()); + for (SystemDeptTb dept : deptList) { + deptIds.add(dept.getId()); + List deptChildren = systemDeptService.listDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptChildren)) { + deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren)); + } } + return deptIds; + } } 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 d0fd40b2..e08a05e7 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 @@ -33,7 +33,6 @@ import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -47,6 +46,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,429 +54,437 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemDeptService { - @Autowired private SystemDeptMapper systemDeptMapper; - @Autowired private SystemUserService systemUserService; - @Autowired private SystemRoleService systemRoleService; + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserDeptService systemUserDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDept(SystemCreateDeptArgs args) { - systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); - this.updateDeptSubCnt(args.getPid()); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDept(SystemCreateDeptArgs args) { + systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); + this.updateDeptSubCnt(args.getPid()); + } + + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDept(SystemDeptTb args) { + // 旧的部门 + Long oldPid = this.getDeptById(args.getId()).getPid(); + Long newPid = args.getPid(); + if (args.getPid() != null && args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); } + SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); + args.setId(dept.getId()); + systemDeptMapper.insertOrUpdate(args); + this.updateDeptSubCnt(oldPid); + this.updateDeptSubCnt(newPid); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDept(SystemDeptTb args) { - // 旧的部门 - Long oldPid = this.getDeptById(args.getId()).getPid(); - Long newPid = args.getPid(); - if (args.getPid() != null && args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDeptByIds(Set ids) { + // 获取部门, 和其所有子部门 + Set depts = this.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + this.verifyBindRelationByIds(depts); + for (SystemDeptTb dept : depts) { + systemDeptMapper.deleteById(dept.getId()); + this.updateDeptSubCnt(dept.getPid()); + } + } + + /** + * 导出数据 + * + * @param deptList 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDeptTb dept : deptList) { + Map map = new LinkedHashMap<>(); + map.put("部门名称", dept.getName()); + map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); + map.put("创建日期", dept.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 更新父节点中子节点数目 + * + * @param deptId / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptSubCnt(Long deptId) { + if (deptId != null) { + long count = this.countDeptByPid(deptId); + systemDeptMapper.updateDeptSubCountById(count, deptId); + } + } + + 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) { + 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); + } + + /** + * 查询所有数据 + * + * @param args 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllDeptByArgs(SystemQueryDeptArgs args, Boolean isQuery) throws Exception { + String dataScopeType = KitSecurityHelper.getDataScopeType(); + if (isQuery) { + if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { + args.setPidIsNull(true); + } + List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); + List fieldNames = new ArrayList<>() {{ + add("pidIsNull"); + add("enabled"); + }}; + for (Field field : fields) { + // 设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(args); + if (fieldNames.contains(field.getName())) { + continue; } - SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); - args.setId(dept.getId()); - systemDeptMapper.insertOrUpdate(args); - this.updateDeptSubCnt(oldPid); - this.updateDeptSubCnt(newPid); - } - - /** - * 删除 - * - * @param deptSet / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDeptByIds(Set deptSet) { - for (SystemDeptTb dept : deptSet) { - systemDeptMapper.deleteById(dept.getId()); - this.updateDeptSubCnt(dept.getPid()); + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; } + } } + // 数据权限 + args.setIds(KitSecurityHelper.getCurrentUserDataScope()); + List list = this.queryDeptByArgs(args); + // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 + if (StrUtil.isBlank(dataScopeType)) { + return this.deduplication(list); + } + return list; + } - /** - * 导出数据 - * - * @param deptList 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDeptTb dept : deptList) { - Map map = new LinkedHashMap<>(); - map.put("部门名称", dept.getName()); - map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); - map.put("创建日期", dept.getCreateTime()); - list.add(map); + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 获取部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + * @return / + */ + private Set queryRelationDeptByArgs(List deptTbList, Set depts) { + for (SystemDeptTb dept : deptTbList) { + depts.add(dept); + List deptList = this.listDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } + return depts; + } + + public List queryChildDeptIdByDeptIds(List deptList) { + List list = new ArrayList<>(); + for (SystemDeptTb systemDeptTb : deptList) { + if (systemDeptTb != null && systemDeptTb.getEnabled()) { + List deptList1 = this.listDeptByPid(systemDeptTb.getId()); + if (CollUtil.isNotEmpty(deptList1)) { + list.addAll(queryChildDeptIdByDeptIds(deptList1)); } - KitFileUtil.downloadExcel(list, response); + list.add(systemDeptTb.getId()); + } } + return list; + } - /** - * 更新父节点中子节点数目 - * - * @param deptId / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDeptSubCnt(Long deptId) { - if (deptId != null) { - long count = this.countDeptByPid(deptId); - systemDeptMapper.updateDeptSubCountById(count, deptId); + /** + * 根据ID获取同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + private List querySuperiorDeptByPid(SystemDeptTb dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(this.listRootDept()); + return deptList; + } + deptList.addAll(this.listDeptByPid(dept.getPid())); + return querySuperiorDeptByPid(this.getDeptById(dept.getPid()), deptList); + } + + private List listRootDept() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); + } + + /** + * 构建树形数据 + * + * @return / + */ + public KitPageResult searchDeptTree(List ids, Boolean exclude) { + Set deptSet1 = new LinkedHashSet<>(); + for (Long id : ids) { + // 同级数据 + SystemDeptTb dept = this.getDeptById(id); + // 上级数据 + List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); + if (exclude) { + for (SystemDeptTb data : depts) { + if (data.getId().equals(dept.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } } + // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); + } + deptSet1.addAll(depts); } - - 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); - } + ArrayList deptList = new ArrayList<>(deptSet1); + // 构建部门树 + Set trees = new LinkedHashSet<>(); + Set deptSet = new LinkedHashSet<>(); + List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); + boolean isChild; + for (SystemDeptTb dept : deptList) { + isChild = false; + if (dept.getPid() == null) { + trees.add(dept); + } + for (SystemDeptTb it : deptList) { + if (it.getPid() != null && dept.getId().equals(it.getPid())) { + isChild = true; + if (dept.getChildren() == null) { + dept.setChildren(new ArrayList<>()); + } + dept.getChildren().add(it); } - return deptList; + } + if (isChild) { + deptSet.add(dept); + } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { + deptSet.add(dept); + } } + if (CollectionUtil.isEmpty(trees)) { + trees = deptSet; + } + KitPageResult baseResult = new KitPageResult<>(); + baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); + baseResult.setTotalElements(deptSet.size()); + return baseResult; + } - 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); + /** + * 验证是否被角色或用户关联 + * + * @param deptSet / + */ + public void verifyBindRelationByIds(Set deptSet) { + Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); + if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); } + if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + } + } - /** - * 查询所有数据 - * - * @param args 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllDeptByArgs(SystemQueryDeptArgs args, Boolean isQuery) throws Exception { - String dataScopeType = KitSecurityHelper.getDataScopeType(); - if (isQuery) { - if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { - args.setPidIsNull(true); - } - List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); - List fieldNames = new ArrayList<>() {{ - add("pidIsNull"); - add("enabled"); - }}; - for (Field field : fields) { - // 设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(args); - if (fieldNames.contains(field.getName())) { - continue; - } - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; - } - } - } - // 数据权限 - args.setIds(KitSecurityHelper.getCurrentUserDataScope()); - List list = this.queryDeptByArgs(args); - // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 - if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); - } - return list; - } + private List listEnabledDepts() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + return systemDeptMapper.selectList(wrapper); + } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemDeptTb getDeptById(Long id) { - return systemDeptMapper.selectById(id); + /** + * 遍历所有部门和子部门 + * + * @param ids / + */ + public Set traverseDeptByIdWithPids(Set ids) { + Set depts = new HashSet<>(); + for (Long id : ids) { + // 根部门 + depts.add(this.getDeptById(id)); + // 子部门 + List deptList = listDeptByPid(id); + if (CollectionUtil.isNotEmpty(deptList)) { + depts = queryRelationDeptByArgs(deptList, depts); + } } + return depts; + } - /** - * 获取部门下所有关联的部门 - * - * @param deptTbList / - * @param depts / - * @return / - */ - private Set queryRelationDeptByArgs(List deptTbList, Set depts) { - for (SystemDeptTb dept : deptTbList) { - depts.add(dept); - List deptList = this.listDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } - } - return depts; - } + public List queryDeptSelectDataSource() { + List depts = this.listEnabledDepts(); + return buildDeptSelectOptions(depts); + } - public List queryChildDeptIdByDeptIds(List deptList) { - List list = new ArrayList<>(); - for (SystemDeptTb systemDeptTb : deptList) { - if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = this.listDeptByPid(systemDeptTb.getId()); - if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(queryChildDeptIdByDeptIds(deptList1)); - } - list.add(systemDeptTb.getId()); - } - } - return list; + 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; + } - /** - * 根据ID获取同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - private List querySuperiorDeptByPid(SystemDeptTb dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(this.listRootDept()); - return deptList; - } - deptList.addAll(this.listDeptByPid(dept.getPid())); - return querySuperiorDeptByPid(this.getDeptById(dept.getPid()), deptList); + 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 List listRootDept() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return systemDeptMapper.selectList(wrapper); - } + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } - /** - * 构建树形数据 - * - * @return / - */ - public KitPageResult searchDeptTree(List ids, Boolean exclude) { - Set deptSet1 = new LinkedHashSet<>(); - for (Long id : ids) { - // 同级数据 - SystemDeptTb dept = this.getDeptById(id); - // 上级数据 - List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); - if (exclude) { - for (SystemDeptTb data : depts) { - if (data.getId().equals(dept.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); - } - deptSet1.addAll(depts); - } - ArrayList deptList = new ArrayList<>(deptSet1); - // 构建部门树 - Set trees = new LinkedHashSet<>(); - Set deptSet = new LinkedHashSet<>(); - List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); - boolean isChild; - for (SystemDeptTb dept : deptList) { - isChild = false; - if (dept.getPid() == null) { - trees.add(dept); - } - for (SystemDeptTb it : deptList) { - if (it.getPid() != null && dept.getId().equals(it.getPid())) { - isChild = true; - if (dept.getChildren() == null) { - dept.setChildren(new ArrayList<>()); - } - dept.getChildren().add(it); - } - } - if (isChild) { - deptSet.add(dept); - } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { - deptSet.add(dept); - } - } - if (CollectionUtil.isEmpty(trees)) { - trees = deptSet; - } - KitPageResult baseResult = new KitPageResult<>(); - baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); - baseResult.setTotalElements(deptSet.size()); - return baseResult; + 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); } + } - /** - * 验证是否被角色或用户关联 - * - * @param deptSet / - */ - public void verifyBindRelationByIds(Set deptSet) { - Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - if (systemUserService.countUserByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); - } - if (systemRoleService.countRoleByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); - } + public List queryDeptSelectProDataSource() { + List depts = this.listEnabledDepts(); + // 获取所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + // 构建树形结构 + for (SystemDeptTb dept : depts) { + // 只处理顶级部门(pid为null或0的部门) + if (dept.getPid() == null || dept.getPid() == 0) { + SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap); + options.add(vo); + } } + // 按排序字段排序 + options.sort(Comparator.comparingInt(o -> { + Long id = Long.valueOf(o.getValue()); + return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0; + })); + return options; + } - private List listEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return systemDeptMapper.selectList(wrapper); + /** + * 递归构建部门树 + * + * @param dept 当前部门 + * @param deptMap 部门映射 + * @return SystemProductLineTreeVo 树节点 + */ + private SystemProductLineTreeVo buildDeptTreePro(SystemDeptTb dept, Map deptMap) { + SystemProductLineTreeVo vo = new SystemProductLineTreeVo(); + vo.setValue(String.valueOf(dept.getId())); + vo.setLabel(dept.getName()); + // 查找子部门 + List children = new ArrayList<>(); + for (SystemDeptTb childDept : deptMap.values()) { + if (dept.getId().equals(childDept.getPid())) { + children.add(buildDeptTreePro(childDept, deptMap)); + } } + // 子部门按排序字段排序 + children.sort(Comparator.comparingInt(o -> { + Long id = Long.valueOf(o.getValue()); + return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0; + })); + vo.setChildren(children); + return vo; + } - /** - * 遍历所有部门和子部门 - * - * @param ids / - */ - public Set traverseDeptByIdWithPids(Set ids) { - Set depts = new HashSet<>(); - for (Long id : ids) { - // 根部门 - depts.add(this.getDeptById(id)); - // 子部门 - List deptList = listDeptByPid(id); - if (CollectionUtil.isNotEmpty(deptList)) { - depts = queryRelationDeptByArgs(deptList, depts); - } - } - return depts; - } - - public List queryDeptSelectDataSource() { - 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); - } - } - - public List queryDeptSelectProDataSource() { - List depts = this.listEnabledDepts(); - // 获取所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - // 构建树形结构 - for (SystemDeptTb dept : depts) { - // 只处理顶级部门(pid为null或0的部门) - if (dept.getPid() == null || dept.getPid() == 0) { - SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap); - options.add(vo); - } - } - // 按排序字段排序 - options.sort(Comparator.comparingInt(o -> { - Long id = Long.valueOf(o.getValue()); - return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0; - })); - return options; - } - - /** - * 递归构建部门树 - * - * @param dept 当前部门 - * @param deptMap 部门映射 - * @return SystemProductLineTreeVo 树节点 - */ - private SystemProductLineTreeVo buildDeptTreePro(SystemDeptTb dept, Map deptMap) { - SystemProductLineTreeVo vo = new SystemProductLineTreeVo(); - vo.setValue(String.valueOf(dept.getId())); - vo.setLabel(dept.getName()); - // 查找子部门 - List children = new ArrayList<>(); - for (SystemDeptTb childDept : deptMap.values()) { - if (dept.getId().equals(childDept.getPid())) { - children.add(buildDeptTreePro(childDept, deptMap)); - } - } - // 子部门按排序字段排序 - children.sort(Comparator.comparingInt(o -> { - Long id = Long.valueOf(o.getValue()); - return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0; - })); - vo.setChildren(children); - return vo; - } - - public List listDeptByPid(long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return systemDeptMapper.selectList(wrapper); - } + public List listDeptByPid(long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + 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 43d68628..6f81af6a 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 @@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -134,4 +135,13 @@ public class SystemDictDetailService { return detailVo; }).collect(Collectors.toList()); } + + public Map> getDictDetailMap(String dictName) { + String[] names = dictName.split("[,, ]"); + Map> dictMap = new HashMap<>(16); + for (String name : names) { + dictMap.put(name, this.listDictDetailByName(name)); + } + return dictMap; + } } 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 4ef6f8c0..d2b92869 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 @@ -29,13 +29,13 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -43,103 +43,105 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemDictService { - @Autowired private SystemDictMapper systemDictMapper; - @Autowired private SystemDictDetailService systemDictDetailService; + @Autowired + private SystemDictMapper systemDictMapper; + @Autowired + private SystemDictDetailService systemDictDetailService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDict(SystemCreateDictArgs args) { - systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); - } + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDict(SystemCreateDictArgs args) { + systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDictById(SystemDictTb args) { - SystemDictTb dict = systemDictMapper.selectById(args.getId()); - dict.setName(args.getName()); - dict.setDescription(args.getDescription()); - systemDictMapper.insertOrUpdate(dict); - } + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDictById(SystemDictTb args) { + SystemDictTb dict = systemDictMapper.selectById(args.getId()); + dict.setName(args.getName()); + dict.setDescription(args.getDescription()); + systemDictMapper.insertOrUpdate(dict); + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDictByIds(Set ids) { - // 删除字典 - systemDictMapper.deleteByIds(ids); - // 删除字典详情 - systemDictDetailService.deleteDictDetailByDictIds(ids); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictByIds(Set ids) { + // 删除字典 + systemDictMapper.deleteByIds(ids); + // 删除字典详情 + systemDictDetailService.deleteDictDetailByDictIds(ids); + } - /** - * 导出数据 - * - * @param dicts 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDictTb dict : dicts) { - List dictDetails = systemDictDetailService.listDictDetailByName(dict.getName()); - if (CollectionUtil.isNotEmpty(dictDetails)) { - for (SystemDictDetailTb dictDetail : dictDetails) { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", dictDetail.getLabel()); - map.put("字典值", dictDetail.getValue()); - map.put("创建日期", dictDetail.getCreateTime()); - list.add(map); - } - } else { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", null); - map.put("字典值", null); - map.put("创建日期", dict.getCreateTime()); - list.add(map); - } + /** + * 导出数据 + * + * @param dicts 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDictTb dict : dicts) { + List dictDetails = systemDictDetailService.listDictDetailByName(dict.getName()); + if (CollectionUtil.isNotEmpty(dictDetails)) { + for (SystemDictDetailTb dictDetail : dictDetails) { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", dictDetail.getLabel()); + map.put("字典值", dictDetail.getValue()); + map.put("创建日期", dictDetail.getCreateTime()); + list.add(map); } - KitFileUtil.downloadExcel(list, response); + } else { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", null); + map.put("字典值", null); + map.put("创建日期", dict.getCreateTime()); + list.add(map); + } } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - Page selectPage = systemDictMapper.selectPage(page, wrapper); - return KitPageUtil.toPage(selectPage); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + Page selectPage = systemDictMapper.selectPage(page, wrapper); + 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())); - } + 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())); } + } - public List queryDictByArgs(SystemQueryDictArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - return systemDictMapper.selectList(wrapper); - } + public List queryDictByArgs(SystemQueryDictArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + return systemDictMapper.selectList(wrapper); + } } 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 94cb4afa..2a40d0cf 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 @@ -24,6 +24,7 @@ import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.dataobject.SystemEmailConfigTb; +import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.dal.model.SystemSendEmailArgs; import cn.odboy.system.dal.mysql.SystemEmailConfigMapper; import cn.odboy.util.KitDesEncryptUtil; @@ -39,114 +40,126 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemEmailService { - @Autowired private SystemEmailConfigMapper systemEmailConfigMapper; - @Autowired private KitRedisHelper redisHelper; - @Autowired private AppProperties properties; - @Value("${spring.application.title}") private String applicationTitle; + @Autowired + private SystemEmailConfigMapper systemEmailConfigMapper; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; + @Value("${spring.application.title}") + private String applicationTitle; - /** - * 更新邮件配置 - * - * @param emailConfig 邮箱配置 - */ - @Transactional(rollbackFor = Exception.class) - public void updateEmailConfigById(SystemEmailConfigTb emailConfig) throws Exception { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (!emailConfig.getPassword().equals(systemEmailConfigTb.getPassword())) { - // 对称加密 - systemEmailConfigTb.setPassword(KitDesEncryptUtil.desEncrypt(emailConfig.getPassword())); - } - systemEmailConfigTb.setId(1L); - systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb); + /** + * 更新邮件配置 + * + * @param emailConfig 邮箱配置 + */ + @Transactional(rollbackFor = Exception.class) + public void updateEmailConfigById(SystemEmailConfigTb emailConfig) throws Exception { + SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); + if (!emailConfig.getPassword().equals(systemEmailConfigTb.getPassword())) { + // 对称加密 + systemEmailConfigTb.setPassword(KitDesEncryptUtil.desEncrypt(emailConfig.getPassword())); } + systemEmailConfigTb.setId(1L); + systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb); + } - /** - * 发送邮件 - * - * @param sendEmailRequest 邮件发送的内容 - */ - public void sendEmail(SystemSendEmailArgs sendEmailRequest) { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (systemEmailConfigTb.getId() == null) { - throw new BadRequestException("请先配置, 再操作"); - } - // 封装 - MailAccount account = new MailAccount(); - // 设置用户 - String user = systemEmailConfigTb.getFromUser().split("@")[0]; - account.setUser(user); - account.setHost(systemEmailConfigTb.getHost()); - account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); - account.setAuth(true); - try { - // 对称解密 - account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); - } catch (Exception e) { - throw new BadRequestException(e.getMessage()); - } - account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); - // ssl方式发送 - account.setSslEnable(true); - // 使用STARTTLS安全连接 - account.setStarttlsEnable(true); - // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 - account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); - String content = sendEmailRequest.getContent(); - // 发送 - try { - int size = sendEmailRequest.getTos().size(); - Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) - .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) - // 关闭session - .setUseGlobalSession(false).send(); - } catch (Exception e) { - log.error("邮件发送失败", e); - throw new BadRequestException("邮件发送失败"); - } + /** + * 发送邮件 + * + * @param sendEmailRequest 邮件发送的内容 + */ + public void sendEmail(SystemSendEmailArgs sendEmailRequest) { + SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); + if (systemEmailConfigTb.getId() == null) { + throw new BadRequestException("请先配置, 再操作"); } + // 封装 + MailAccount account = new MailAccount(); + // 设置用户 + String user = systemEmailConfigTb.getFromUser().split("@")[0]; + account.setUser(user); + account.setHost(systemEmailConfigTb.getHost()); + account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); + account.setAuth(true); + try { + // 对称解密 + account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); + // ssl方式发送 + account.setSslEnable(true); + // 使用STARTTLS安全连接 + account.setStarttlsEnable(true); + // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 + account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); + String content = sendEmailRequest.getContent(); + // 发送 + try { + int size = sendEmailRequest.getTos().size(); + Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) + .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) + // 关闭session + .setUseGlobalSession(false).send(); + } catch (Exception e) { + log.error("邮件发送失败", e); + throw new BadRequestException("邮件发送失败"); + } + } - /** - * 校验邮箱验证码 - */ - public void checkEmailCaptcha(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); - } + /** + * 校验邮箱验证码 + */ + 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); } + } - /** - * 发送给邮箱验证码 - */ - public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { - if (biEnum == null) { - throw new BadRequestException("biEnum必填"); - } - String content; - String redisKey = biEnum.getRedisKey() + email; - String oldCode = redisHelper.get(redisKey, String.class); - if (oldCode == null) { - String code = RandomUtil.randomNumbers(6); - // 存入缓存 - if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { - throw new BadRequestException("服务异常, 请联系网站负责人"); - } - // 存在就再次发送原来的验证码 - content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); - } else { - content = - KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); - } - SystemSendEmailArgs sendEmailRequest = - new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); - sendEmail(sendEmailRequest); + /** + * 发送给邮箱验证码 + */ + public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { + if (biEnum == null) { + throw new BadRequestException("biEnum必填"); } + String content; + String redisKey = biEnum.getRedisKey() + email; + String oldCode = redisHelper.get(redisKey, String.class); + if (oldCode == null) { + String code = RandomUtil.randomNumbers(6); + // 存入缓存 + if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { + throw new BadRequestException("服务异常, 请联系网站负责人"); + } + // 存在就再次发送原来的验证码 + content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); + } else { + content = + KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); + } + SystemSendEmailArgs sendEmailRequest = + new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); + sendEmail(sendEmailRequest); + } - public SystemEmailConfigTb getLastEmailConfig() { - SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); - return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + public SystemEmailConfigTb getLastEmailConfig() { + SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); + return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + } + + public void checkEmailCaptcha(SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); } + this.checkEmailCaptchaV1(biEnum, args.getEmail(), args.getCode()); + } } 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 669b7cd3..da158c0b 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 @@ -28,13 +28,13 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,114 +42,119 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemJobService { - @Autowired private SystemJobMapper systemJobMapper; - @Autowired private SystemUserService systemUserService; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemUserService systemUserService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveJob(SystemCreateJobArgs args) { - SystemJobTb job = this.getJobByName(args.getName()); - if (job != null) { - throw new BadRequestException("职位名称已存在"); - } - systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveJob(SystemCreateJobArgs args) { + SystemJobTb job = this.getJobByName(args.getName()); + if (job != null) { + throw new BadRequestException("职位名称已存在"); } + systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateJobById(SystemJobTb args) { - SystemJobTb job = systemJobMapper.selectById(args.getId()); - SystemJobTb old = this.getJobByName(args.getName()); - if (old != null && !old.getId().equals(args.getId())) { - throw new BadRequestException("职位名称已存在"); - } - args.setId(job.getId()); - systemJobMapper.insertOrUpdate(args); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateJobById(SystemJobTb args) { + SystemJobTb job = systemJobMapper.selectById(args.getId()); + SystemJobTb old = this.getJobByName(args.getName()); + if (old != null && !old.getId().equals(args.getId())) { + throw new BadRequestException("职位名称已存在"); } + args.setId(job.getId()); + systemJobMapper.insertOrUpdate(args); + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteJobByIds(Set ids) { - systemJobMapper.deleteByIds(ids); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); + systemJobMapper.deleteByIds(ids); + } - /** - * 导出数据 - * - * @param jobs 待导出的数据 - * @param response / - */ - public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemJobTb job : jobs) { - Map map = new LinkedHashMap<>(); - map.put("岗位名称", job.getName()); - map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); - map.put("创建日期", job.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出数据 + * + * @param jobs 待导出的数据 + * @param response / + */ + public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemJobTb job : jobs) { + Map map = new LinkedHashMap<>(); + map.put("岗位名称", job.getName()); + map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); + map.put("创建日期", job.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - */ - public KitPageResult searchJobByArgs(SystemQueryJobArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(args, wrapper); - Page selectPage = systemJobMapper.selectPage(page, wrapper); - return KitPageUtil.toPage(selectPage); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + */ + public KitPageResult searchJobByArgs(SystemQueryJobArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + Page selectPage = systemJobMapper.selectPage(page, wrapper); + return KitPageUtil.toPage(selectPage); + } - /** - * 查询全部数据 - */ - public List queryJobByArgs(SystemQueryJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(args, wrapper); - return systemJobMapper.selectList(wrapper); - } + /** + * 查询全部数据 + */ + public List queryJobByArgs(SystemQueryJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemJobMapper.selectList(wrapper); + } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserService.countUserByJobIds(ids) > 0) { - throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); - } + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserService.countUserByJobIds(ids) > 0) { + throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); } + } - public SystemJobTb getJobByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemJobTb::getName, name); - return systemJobMapper.selectOne(wrapper); - } + public SystemJobTb getJobByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemJobTb::getName, name); + return systemJobMapper.selectOne(wrapper); + } - public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName()); - wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled()); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); + public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName()); + wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled()); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); + } } 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 bfb43f62..0b4549eb 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 @@ -21,6 +21,8 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; +import cn.odboy.constant.FileTypeEnum; +import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; @@ -31,7 +33,6 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -39,6 +40,7 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,134 +49,147 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemLocalStorageService { - @Autowired private SystemLocalStorageMapper systemLocalStorageMapper; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired private AppProperties properties; + @Autowired + private SystemLocalStorageMapper systemLocalStorageMapper; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private AppProperties properties; - /** - * 上传 - * - * @param name 文件名称 - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { - long size = multipartFile.getSize(); - KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); - String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); - String type = KitFileUtil.getFileType(suffix); - String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); - File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); - if (file == null) { - throw new BadRequestException("上传失败"); - } - try { - String formatSize = KitFileUtil.getSize(size); - String prefixName = - StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; - SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); - localStorage.setRealName(file.getName()); - localStorage.setName(prefixName); - localStorage.setSuffix(suffix); - localStorage.setPath(file.getPath()); - localStorage.setType(type); - localStorage.setSize(formatSize); - localStorage.setDateGroup(uploadDateStr); - systemLocalStorageMapper.insert(localStorage); - return localStorage; - } catch (Exception e) { - KitFileUtil.del(file); - throw e; - } + /** + * 上传 + * + * @param name 文件名称 + * @param multipartFile 文件 + * @return / + */ + @Transactional(rollbackFor = Exception.class) + public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { + long size = multipartFile.getSize(); + KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); + String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); + String type = KitFileUtil.getFileType(suffix); + String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); + File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); + if (file == null) { + throw new BadRequestException("上传失败"); } + try { + String formatSize = KitFileUtil.getSize(size); + String prefixName = + StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; + SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); + localStorage.setRealName(file.getName()); + localStorage.setName(prefixName); + localStorage.setSuffix(suffix); + localStorage.setPath(file.getPath()); + localStorage.setType(type); + localStorage.setSize(formatSize); + localStorage.setDateGroup(uploadDateStr); + systemLocalStorageMapper.insert(localStorage); + return localStorage; + } catch (Exception e) { + KitFileUtil.del(file); + throw e; + } + } - /** - * 编辑 - * - * @param args 文件信息 - */ - @Transactional(rollbackFor = Exception.class) - public void updateLocalStorageById(SystemLocalStorageTb args) { - SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); - localStorage.copy(args); - systemLocalStorageMapper.insertOrUpdate(localStorage); - } + /** + * 编辑 + * + * @param args 文件信息 + */ + @Transactional(rollbackFor = Exception.class) + public void updateLocalStorageById(SystemLocalStorageTb args) { + SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); + localStorage.copy(args); + systemLocalStorageMapper.insertOrUpdate(localStorage); + } - /** - * 多选删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteFileByIds(Long[] ids) { - for (Long id : ids) { - SystemLocalStorageTb storage = systemLocalStorageMapper.selectById(id); - try { - KitFileUtil.del(storage.getPath()); - systemLocalStorageMapper.deleteById(storage); - } catch (IORuntimeException e) { - throw new BadRequestException("删除文件 " + storage.getName() + " 失败"); - } - } + /** + * 多选删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteFileByIds(Long[] ids) { + for (Long id : ids) { + SystemLocalStorageTb storage = systemLocalStorageMapper.selectById(id); + try { + KitFileUtil.del(storage.getPath()); + systemLocalStorageMapper.deleteById(storage); + } catch (IORuntimeException e) { + throw new BadRequestException("删除文件 " + storage.getName() + " 失败"); + } } + } - /** - * 导出数据 - * - * @param localStorages 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemLocalStorageTb localStorage : localStorages) { - Map map = new LinkedHashMap<>(); - map.put("文件名", localStorage.getRealName()); - map.put("备注名", localStorage.getName()); - map.put("文件类型", localStorage.getType()); - map.put("文件大小", localStorage.getSize()); - map.put("创建者", localStorage.getCreateBy()); - map.put("创建日期", localStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出数据 + * + * @param localStorages 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemLocalStorageTb localStorage : localStorages) { + Map map = new LinkedHashMap<>(); + map.put("文件名", localStorage.getRealName()); + map.put("备注名", localStorage.getName()); + map.put("文件类型", localStorage.getType()); + map.put("文件大小", localStorage.getSize()); + map.put("创建者", localStorage.getCreateBy()); + map.put("创建日期", localStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - 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); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + 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); + 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); + } - public List queryLocalStorageByArgs(SystemQueryStorageArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(args, wrapper); - return systemLocalStorageMapper.selectList(wrapper); + public List queryLocalStorageByArgs(SystemQueryStorageArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemLocalStorageMapper.selectList(wrapper); + } + + + public SystemLocalStorageTb uploadPictureV1(MultipartFile file) { + // 判断文件是否为图片 + String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); + if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { + throw new BadRequestException("只能上传图片"); } + return KitSpringBeanHolder.getBean(SystemLocalStorageService.class).uploadFile(null, file); + } } 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 f29f7fbf..3e1cfb5c 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 @@ -31,22 +31,24 @@ import cn.odboy.system.dal.model.SystemQueryMenuArgs; import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,398 +56,443 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemMenuService { - private static final String YES_STR = "是"; - private static final String NO_STR = "否"; - @Autowired private SystemMenuMapper systemMenuMapper; - @Autowired private SystemRoleMenuMapper systemRoleMenuMapper; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemRoleMenuService systemRoleMenuService; + private static final String YES_STR = "是"; + private static final String NO_STR = "否"; + @Autowired + private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuMapper systemRoleMenuMapper; + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemUserRoleService systemUserRoleService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveMenu(SystemMenuTb args) { - if (this.getMenuByTitle(args.getTitle()) != null) { - throw new BadRequestException("菜单标题已存在"); - } - if (StrUtil.isNotBlank(args.getComponentName())) { - if (this.getMenuByComponentName(args.getComponentName()) != null) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - if (Long.valueOf(0L).equals(args.getPid())) { - args.setPid(null); - } - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - systemMenuMapper.insert(args); - // 计算子节点数目 - args.setSubCount(0); - // 更新父节点菜单数目 - this.updateMenuSubCnt(args.getPid()); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveMenu(SystemMenuTb args) { + if (this.getMenuByTitle(args.getTitle()) != null) { + throw new BadRequestException("菜单标题已存在"); } - - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateMenuById(SystemMenuTb args) { - if (args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); - } - SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - SystemMenuTb menu1 = this.getMenuByTitle(args.getTitle()); - if (menu1 != null && !menu1.getId().equals(menu.getId())) { - throw new BadRequestException("菜单标题已存在"); - } - if (args.getPid().equals(0L)) { - args.setPid(null); - } - // 记录的父节点ID - Long oldPid = menu.getPid(); - Long newPid = args.getPid(); - if (StrUtil.isNotBlank(args.getComponentName())) { - menu1 = this.getMenuByComponentName(args.getComponentName()); - if (menu1 != null && !menu1.getId().equals(menu.getId())) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - menu.setTitle(args.getTitle()); - menu.setComponent(args.getComponent()); - menu.setPath(args.getPath()); - menu.setIcon(args.getIcon()); - menu.setIFrame(args.getIFrame()); - menu.setPid(args.getPid()); - menu.setMenuSort(args.getMenuSort()); - menu.setCache(args.getCache()); - menu.setHidden(args.getHidden()); - menu.setComponentName(args.getComponentName()); - menu.setPermission(args.getPermission()); - menu.setType(args.getType()); - // auto fill - menu.setUpdateBy(null); - menu.setUpdateTime(null); - systemMenuMapper.insertOrUpdate(menu); - // 计算父级菜单节点数目 - this.updateMenuSubCnt(oldPid); - this.updateMenuSubCnt(newPid); + if (StrUtil.isNotBlank(args.getComponentName())) { + if (this.getMenuByComponentName(args.getComponentName()) != null) { + throw new BadRequestException("菜单组件名称已存在"); + } } - - /** - * 删除 - */ - @Transactional(rollbackFor = Exception.class) - public void deleteMenuByIds(Set ids) { - Set menuSet = new HashSet<>(); - for (Long id : ids) { - List menuList = this.listMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = this.queryChildMenuByArgs(menuList, menuSet); - } - List menuIds = - menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(menuIds)) { - KitSpringBeanHolder.getBean(SystemMenuService.class).deleteRoleMenuByMenuIds(menuIds); - systemMenuMapper.deleteByIds(menuIds); - } - for (SystemMenuTb menu : menuSet) { - this.updateMenuSubCnt(menu.getPid()); - } + if (Long.valueOf(0L).equals(args.getPid())) { + args.setPid(null); } + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + systemMenuMapper.insert(args); + // 计算子节点数目 + args.setSubCount(0); + // 更新父节点菜单数目 + this.updateMenuSubCnt(args.getPid()); + } - @Transactional(rollbackFor = Exception.class) - public void deleteRoleMenuByMenuIds(List menuIds) { - if (CollUtil.isNotEmpty(menuIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); - systemRoleMenuMapper.delete(wrapper); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateMenuById(SystemMenuTb args) { + if (args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); + } + SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + SystemMenuTb menu1 = this.getMenuByTitle(args.getTitle()); + if (menu1 != null && !menu1.getId().equals(menu.getId())) { + throw new BadRequestException("菜单标题已存在"); + } + if (args.getPid().equals(0L)) { + args.setPid(null); + } + // 记录的父节点ID + Long oldPid = menu.getPid(); + Long newPid = args.getPid(); + if (StrUtil.isNotBlank(args.getComponentName())) { + menu1 = this.getMenuByComponentName(args.getComponentName()); + if (menu1 != null && !menu1.getId().equals(menu.getId())) { + throw new BadRequestException("菜单组件名称已存在"); + } + } + menu.setTitle(args.getTitle()); + menu.setComponent(args.getComponent()); + menu.setPath(args.getPath()); + menu.setIcon(args.getIcon()); + menu.setIFrame(args.getIFrame()); + menu.setPid(args.getPid()); + menu.setMenuSort(args.getMenuSort()); + menu.setCache(args.getCache()); + menu.setHidden(args.getHidden()); + menu.setComponentName(args.getComponentName()); + menu.setPermission(args.getPermission()); + menu.setType(args.getType()); + // auto fill + menu.setUpdateBy(null); + menu.setUpdateTime(null); + systemMenuMapper.insertOrUpdate(menu); + // 计算父级菜单节点数目 + this.updateMenuSubCnt(oldPid); + this.updateMenuSubCnt(newPid); + } + + /** + * 删除 + */ + @Transactional(rollbackFor = Exception.class) + public void deleteMenuByIds(Set ids) { + Set menuSet = new HashSet<>(); + for (Long id : ids) { + List menuList = this.listMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + } + List menuIds = + menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(menuIds)) { + KitSpringBeanHolder.getBean(SystemMenuService.class).deleteRoleMenuByMenuIds(menuIds); + systemMenuMapper.deleteByIds(menuIds); + } + for (SystemMenuTb menu : menuSet) { + this.updateMenuSubCnt(menu.getPid()); + } + } + + @Transactional(rollbackFor = Exception.class) + public void deleteRoleMenuByMenuIds(List menuIds) { + if (CollUtil.isNotEmpty(menuIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); + systemRoleMenuMapper.delete(wrapper); + } + } + + /** + * 导出 + * + * @param menus 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemMenuTb menu : menus) { + Map map = new LinkedHashMap<>(); + map.put("菜单标题", menu.getTitle()); + map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); + map.put("权限标识", menu.getPermission()); + map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); + map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); + map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); + map.put("创建日期", menu.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + @Transactional(rollbackFor = Exception.class) + public void updateMenuSubCnt(Long menuId) { + if (menuId != null) { + long count = this.countMenuByPid(menuId); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemMenuTb::getId, menuId); + wrapper.set(SystemMenuTb::getSubCount, count); + systemMenuMapper.update(wrapper); + } + } + + /** + * 查询全部数据 + * + * @param args 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllMenu(SystemQueryMenuArgs args, Boolean isQuery) throws Exception { + if (Boolean.TRUE.equals(isQuery)) { + args.setPidIsNull(true); + List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); + for (Field field : fields) { + //设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(args); + if ("pidIsNull".equals(field.getName())) { + continue; } - } - - /** - * 导出 - * - * @param menus 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - Map map = new LinkedHashMap<>(); - map.put("菜单标题", menu.getTitle()); - map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); - map.put("权限标识", menu.getPermission()); - map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); - map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); - map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); - map.put("创建日期", menu.getCreateTime()); - list.add(map); + // 如果有查询条件, 则不指定pidIsNull + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; } - KitFileUtil.downloadExcel(list, response); + } } + return this.queryMenuByArgs(args); + } - @Transactional(rollbackFor = Exception.class) - public void updateMenuSubCnt(Long menuId) { - if (menuId != null) { - long count = this.countMenuByPid(menuId); - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemMenuTb::getId, menuId); - wrapper.set(SystemMenuTb::getSubCount, count); - systemMenuMapper.update(wrapper); + /** + * 根据当前用户获取菜单 + * + * @param currentUserId / + * @return / + */ + public List listMenuByUserId(Long currentUserId) { + List roles = systemUserRoleService.queryRoleByUsersId(currentUserId); + Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); + return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); + } + + /** + * 获取所有子节点, 包含自身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) { + List menus; + if (pid != null && !pid.equals(0L)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } else { + menus = this.listRootMenu(); + } + return menus; + } + + /** + * 根据ID获取同级与上级数据 + * + * @param menu / + * @param menus / + * @return / + */ + public List querySuperiorMenuByArgs(SystemMenuTb menu, List menus) { + if (menu.getPid() == null) { + menus.addAll(this.listRootMenu()); + return menus; + } + menus.addAll(this.listMenuByPid(menu.getPid())); + return querySuperiorMenuByArgs(systemMenuMapper.selectById(menu.getPid()), menus); + } + + /** + * 构建菜单树 + * + * @param menus 原始数据 + * @return / + */ + public List buildMenuTree(List menus) { + List trees = new ArrayList<>(); + Set ids = new HashSet<>(); + for (SystemMenuTb menu : menus) { + if (menu.getPid() == null) { + trees.add(menu); + } + for (SystemMenuTb it : menus) { + if (menu.getId().equals(it.getPid())) { + if (menu.getChildren() == null) { + menu.setChildren(new ArrayList<>()); + } + menu.getChildren().add(it); + ids.add(it.getId()); } + } } - - /** - * 查询全部数据 - * - * @param args 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllMenu(SystemQueryMenuArgs args, Boolean isQuery) throws Exception { - if (Boolean.TRUE.equals(isQuery)) { - args.setPidIsNull(true); - List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); - for (Field field : fields) { - //设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(args); - if ("pidIsNull".equals(field.getName())) { - continue; - } - // 如果有查询条件, 则不指定pidIsNull - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; - } - } - } - return this.queryMenuByArgs(args); + if (CollUtil.isNotEmpty(trees)) { + trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); } + return trees; + } - /** - * 根据当前用户获取菜单 - * - * @param currentUserId / - * @return / - */ - public List listMenuByUserId(Long currentUserId) { - List roles = systemRoleService.queryRoleByUsersId(currentUserId); - Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); - return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); - } - - /** - * 获取所有子节点, 包含自身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) { - List menus; - if (pid != null && !pid.equals(0L)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } else { - menus = this.listRootMenu(); - } - return menus; - } - - /** - * 根据ID获取同级与上级数据 - * - * @param menu / - * @param menus / - * @return / - */ - public List querySuperiorMenuByArgs(SystemMenuTb menu, List menus) { - if (menu.getPid() == null) { - menus.addAll(this.listRootMenu()); - return menus; - } - menus.addAll(this.listMenuByPid(menu.getPid())); - return querySuperiorMenuByArgs(systemMenuMapper.selectById(menu.getPid()), menus); - } - - /** - * 构建菜单树 - * - * @param menus 原始数据 - * @return / - */ - public List buildMenuTree(List menus) { - List trees = new ArrayList<>(); - Set ids = new HashSet<>(); - for (SystemMenuTb menu : menus) { - if (menu.getPid() == null) { - trees.add(menu); - } - for (SystemMenuTb it : menus) { - if (menu.getId().equals(it.getPid())) { - if (menu.getChildren() == null) { - menu.setChildren(new ArrayList<>()); - } - menu.getChildren().add(it); - ids.add(it.getId()); - } - } - } - if (CollUtil.isNotEmpty(trees)) { - trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); - } - return trees; - } - - /** - * 构建菜单树 - * - * @param menus / - * @return / - */ - public List buildMenuVo(List menus) { - List list = new LinkedList<>(); - menus.forEach(menu -> { - if (menu != null) { - List menuList = menu.getChildren(); - SystemMenuVo menuVo = new SystemMenuVo(); - menuVo.setName( - ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); - // 一级目录需要加斜杠, 不然会报警告 - menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); - menuVo.setHidden(menu.getHidden()); - // 如果不是外链 - if (!menu.getIFrame()) { - if (menu.getPid() == null) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); - // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 - } else if (menu.getType() == 0) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); - } else if (StrUtil.isNotBlank(menu.getComponent())) { - menuVo.setComponent(menu.getComponent()); - } - } - menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); - if (CollectionUtil.isNotEmpty(menuList)) { - menuVo.setAlwaysShow(true); - menuVo.setRedirect("noredirect"); - menuVo.setChildren(buildMenuVo(menuList)); - // 处理是一级菜单并且没有子菜单的情况 - } else if (menu.getPid() == null) { - SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); - menuVo.setName(null); - menuVo.setMeta(null); - menuVo.setComponent("Layout"); - List list1 = new ArrayList<>(); - list1.add(menuVo1); - menuVo.setChildren(list1); - } - list.add(menuVo); - } - }); - return list; - } - - /** - * 获取 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { - SystemMenuVo menuVo1 = new SystemMenuVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 + /** + * 构建菜单树 + * + * @param menus / + * @return / + */ + public List buildMenuVo(List menus) { + List list = new LinkedList<>(); + menus.forEach(menu -> { + if (menu != null) { + List menuList = menu.getChildren(); + SystemMenuVo menuVo = new SystemMenuVo(); + menuVo.setName( + ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); + // 一级目录需要加斜杠, 不然会报警告 + menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); + menuVo.setHidden(menu.getHidden()); + // 如果不是外链 if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); + if (menu.getPid() == null) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); + // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 + } else if (menu.getType() == 0) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); + } else if (StrUtil.isNotBlank(menu.getComponent())) { + menuVo.setComponent(menu.getComponent()); + } } - return menuVo1; - } - - public List listMenuByIds(List ids) { - return systemMenuMapper.selectByIds(ids); - } - - private SystemMenuTb getMenuByComponentName(String componentName) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getComponentName, componentName); - return systemMenuMapper.selectOne(wrapper); - } - - private SystemMenuTb getMenuByTitle(String title) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getTitle, title); - return systemMenuMapper.selectOne(wrapper); - } - - private Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return systemMenuMapper.selectCount(wrapper); - } - - private List queryMenuByArgs(SystemQueryMenuArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args != null) { - 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)); - } + menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); + if (CollectionUtil.isNotEmpty(menuList)) { + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenuVo(menuList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if (menu.getPid() == null) { + SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); + menuVo.setName(null); + menuVo.setMeta(null); + menuVo.setComponent("Layout"); + List list1 = new ArrayList<>(); + list1.add(menuVo1); + menuVo.setChildren(list1); } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } + list.add(menuVo); + } + }); + return list; + } - private List listRootMenu() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); + /** + * 获取 MenuResponse + * + * @param menu / + * @param menuVo / + * @return / + */ + private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { + SystemMenuVo menuVo1 = new SystemMenuVo(); + 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 SystemMenuTb getMenuByComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return systemMenuMapper.selectOne(wrapper); + } + + private SystemMenuTb getMenuByTitle(String title) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getTitle, title); + return systemMenuMapper.selectOne(wrapper); + } + + private Long countMenuByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + return systemMenuMapper.selectCount(wrapper); + } + + private List queryMenuByArgs(SystemQueryMenuArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + 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); + } + + private List listRootMenu() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } + + public List buildFrontMenus() { + List menuList = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); + List menus = this.buildMenuTree(menuList); + return this.buildMenuVo(menus); + } + + public Set listChildMenuSetByMenuId(Long id) { + Set menuSet = new HashSet<>(); + List menuList = this.listMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + return menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); + } + + public List listMenuSuperior(List ids) { + Set menus; + List systemMenuTbs; + if (CollectionUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(this.listMenuByIds(ids)); + for (SystemMenuTb menu : menus) { + List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); + for (SystemMenuTb data : menuList) { + if (data.getId().equals(menu.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } + } + menus.addAll(menuList); + } + // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); + systemMenuTbs = this.buildMenuTree(new ArrayList<>(menus)); + } else { + systemMenuTbs = this.listMenuByPid(null); + } + return systemMenuTbs; + } } 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 b07f4168..fc019183 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 @@ -44,172 +44,172 @@ import oshi.util.Util; @Service public class SystemMonitorService { - private final DecimalFormat df = new DecimalFormat("0.00"); + private final DecimalFormat df = new DecimalFormat("0.00"); - /** - * 查询服务器监控信息 - * - * @return Map - */ - public Map getServerMonitorInfo() { - Map resultMap = new LinkedHashMap<>(8); - try { - SystemInfo si = new SystemInfo(); - OperatingSystem os = si.getOperatingSystem(); - HardwareAbstractionLayer hal = si.getHardware(); - // 系统信息 - resultMap.put("sys", getSystemInfo(os)); - // cpu 信息 - resultMap.put("cpu", getCpuInfo(hal.getProcessor())); - // 内存信息 - resultMap.put("memory", getMemoryInfo(hal.getMemory())); - // 交换区信息 - resultMap.put("swap", getSwapInfo(hal.getMemory())); - // 磁盘 - resultMap.put("disk", getDiskInfo(os)); - resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss")); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - return resultMap; + /** + * 查询服务器监控信息 + * + * @return Map + */ + public Map getServerMonitorInfo() { + Map resultMap = new LinkedHashMap<>(8); + try { + SystemInfo si = new SystemInfo(); + OperatingSystem os = si.getOperatingSystem(); + HardwareAbstractionLayer hal = si.getHardware(); + // 系统信息 + resultMap.put("sys", getSystemInfo(os)); + // cpu 信息 + resultMap.put("cpu", getCpuInfo(hal.getProcessor())); + // 内存信息 + resultMap.put("memory", getMemoryInfo(hal.getMemory())); + // 交换区信息 + resultMap.put("swap", getSwapInfo(hal.getMemory())); + // 磁盘 + resultMap.put("disk", getDiskInfo(os)); + resultMap.put("time", DateUtil.format(new Date(), "HH:mm:ss")); + } catch (Exception e) { + log.error(e.getMessage(), e); } + return resultMap; + } - /** - * 获取磁盘信息 - * - * @return / - */ - private Map getDiskInfo(OperatingSystem os) { - Map diskInfo = new LinkedHashMap<>(); - FileSystem fileSystem = os.getFileSystem(); - List fsArray = fileSystem.getFileStores(); - String osName = System.getProperty("os.name"); - long available = 0, total = 0; - for (OSFileStore fs : fsArray) { - // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 - if (osName.toLowerCase().startsWith(SystemConst.WIN)) { - available += fs.getUsableSpace(); - total += fs.getTotalSpace(); - } else { - available = fs.getUsableSpace(); - total = fs.getTotalSpace(); - break; - } - } - long used = total - available; - diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); - diskInfo.put("available", KitFileUtil.getSize(available)); - diskInfo.put("used", KitFileUtil.getSize(used)); - if (total != 0) { - diskInfo.put("usageRate", df.format(used / (double)total * 100)); - } else { - diskInfo.put("usageRate", 0); - } - return diskInfo; + /** + * 获取磁盘信息 + * + * @return / + */ + private Map getDiskInfo(OperatingSystem os) { + Map diskInfo = new LinkedHashMap<>(); + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + String osName = System.getProperty("os.name"); + long available = 0, total = 0; + for (OSFileStore fs : fsArray) { + // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 + if (osName.toLowerCase().startsWith(SystemConst.WIN)) { + available += fs.getUsableSpace(); + total += fs.getTotalSpace(); + } else { + available = fs.getUsableSpace(); + total = fs.getTotalSpace(); + break; + } } + long used = total - available; + diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); + diskInfo.put("available", KitFileUtil.getSize(available)); + diskInfo.put("used", KitFileUtil.getSize(used)); + if (total != 0) { + diskInfo.put("usageRate", df.format(used / (double) total * 100)); + } else { + diskInfo.put("usageRate", 0); + } + return diskInfo; + } - /** - * 获取交换区信息 - * - * @param memory / - * @return / - */ - private Map getSwapInfo(GlobalMemory memory) { - Map swapInfo = new LinkedHashMap<>(); - VirtualMemory virtualMemory = memory.getVirtualMemory(); - long total = virtualMemory.getSwapTotal(); - long used = virtualMemory.getSwapUsed(); - swapInfo.put("total", FormatUtil.formatBytes(total)); - swapInfo.put("used", FormatUtil.formatBytes(used)); - swapInfo.put("available", FormatUtil.formatBytes(total - used)); - if (used == 0) { - swapInfo.put("usageRate", 0); - } else { - swapInfo.put("usageRate", df.format(used / (double)total * 100)); - } - return swapInfo; + /** + * 获取交换区信息 + * + * @param memory / + * @return / + */ + private Map getSwapInfo(GlobalMemory memory) { + Map swapInfo = new LinkedHashMap<>(); + VirtualMemory virtualMemory = memory.getVirtualMemory(); + long total = virtualMemory.getSwapTotal(); + long used = virtualMemory.getSwapUsed(); + swapInfo.put("total", FormatUtil.formatBytes(total)); + swapInfo.put("used", FormatUtil.formatBytes(used)); + swapInfo.put("available", FormatUtil.formatBytes(total - used)); + if (used == 0) { + swapInfo.put("usageRate", 0); + } else { + swapInfo.put("usageRate", df.format(used / (double) total * 100)); } + return swapInfo; + } - /** - * 获取内存信息 - * - * @param memory / - * @return / - */ - private Map getMemoryInfo(GlobalMemory memory) { - Map memoryInfo = new LinkedHashMap<>(); - 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)); - return memoryInfo; - } + /** + * 获取内存信息 + * + * @param memory / + * @return / + */ + private Map getMemoryInfo(GlobalMemory memory) { + Map memoryInfo = new LinkedHashMap<>(); + 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)); + return memoryInfo; + } - /** - * 获取Cpu相关信息 - * - * @param processor / - * @return / - */ - private Map getCpuInfo(CentralProcessor processor) { - Map cpuInfo = new LinkedHashMap<>(); - cpuInfo.put("name", processor.getProcessorIdentifier().getName()); - cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); - cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); - cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); - cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); - // CPU信息 - long[] prevTicks = processor.getSystemCpuLoadTicks(); - // 默认等待300毫秒... - long time = 300; - Util.sleep(time); - long[] ticks = processor.getSystemCpuLoadTicks(); - long minCpuLoadTick = 1000; - while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) { - time += 25; - Util.sleep(25); - ticks = processor.getSystemCpuLoadTicks(); - } - long user = - ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; - long nice = - ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; - long sys = - ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; - long idle = - ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; - long ioWait = - ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; - long irq = - ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; - long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; - long steal = - ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; - long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; - cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); - cpuInfo.put("idle", df.format(100d * idle / totalCpu)); - return cpuInfo; + /** + * 获取Cpu相关信息 + * + * @param processor / + * @return / + */ + private Map getCpuInfo(CentralProcessor processor) { + Map cpuInfo = new LinkedHashMap<>(); + cpuInfo.put("name", processor.getProcessorIdentifier().getName()); + cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); + cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); + cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); + cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + // 默认等待300毫秒... + long time = 300; + Util.sleep(time); + long[] ticks = processor.getSystemCpuLoadTicks(); + long minCpuLoadTick = 1000; + while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) { + time += 25; + Util.sleep(25); + ticks = processor.getSystemCpuLoadTicks(); } + long user = + ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long nice = + ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long sys = + ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long idle = + ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long ioWait = + ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long irq = + ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - + prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = + ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; + cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); + cpuInfo.put("idle", df.format(100d * idle / totalCpu)); + return cpuInfo; + } - /** - * 获取系统相关信息,系统、运行天数、系统IP - * - * @param os / - * @return / - */ - private Map getSystemInfo(OperatingSystem os) { - Map systemInfo = new LinkedHashMap<>(); - // jvm 运行时间 - long time = ManagementFactory.getRuntimeMXBean().getStartTime(); - Date date = new Date(time); - // 计算项目运行时间 - String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); - // 系统信息 - systemInfo.put("os", os.toString()); - systemInfo.put("day", formatBetween); - systemInfo.put("ip", KitIPUtil.getLocalIp()); - return systemInfo; - } + /** + * 获取系统相关信息,系统、运行天数、系统IP + * + * @param os / + * @return / + */ + private Map getSystemInfo(OperatingSystem os) { + Map systemInfo = new LinkedHashMap<>(); + // jvm 运行时间 + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + // 计算项目运行时间 + String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); + // 系统信息 + systemInfo.put("os", os.toString()); + systemInfo.put("day", formatBetween); + systemInfo.put("ip", KitIPUtil.getLocalIp()); + return systemInfo; + } } 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 55f8ef02..68069417 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 @@ -21,9 +21,9 @@ import cn.odboy.system.dal.model.SystemOssStorageVo; import cn.odboy.system.dal.model.SystemQueryStorageArgs; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; /** @@ -36,13 +36,13 @@ import org.springframework.web.multipart.MultipartFile; */ public interface SystemOssStorageService extends IService { - KitPageResult searchOssStorage(SystemQueryStorageArgs args, Page page); + KitPageResult searchOssStorage(SystemQueryStorageArgs args, Page page); - List queryOssStorage(SystemQueryStorageArgs args); + List queryOssStorage(SystemQueryStorageArgs args); - void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; + void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; - String uploadFile(MultipartFile file); + String uploadFile(MultipartFile file); - void deleteFileByIds(Long[] ids); + void deleteFileByIds(Long[] ids); } 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 a6d022a7..a47c54ba 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 @@ -20,6 +20,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; +import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.dal.dataobject.SystemQuartzJobTb; @@ -33,7 +34,6 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -41,6 +41,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.quartz.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -49,259 +50,285 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemQuartzJobService { - @Autowired private SystemQuartzJobMapper systemQuartzJobMapper; - @Autowired private SystemQuartzLogMapper systemQuartzLogMapper; - @Autowired private QuartzManage quartzManage; - @Autowired private KitRedisHelper redisHelper; + @Autowired + private SystemQuartzJobMapper systemQuartzJobMapper; + @Autowired + private SystemQuartzLogMapper systemQuartzLogMapper; + @Autowired + private QuartzManage quartzManage; + @Autowired + private KitRedisHelper redisHelper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void createJob(SystemQuartzJobTb args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - systemQuartzJobMapper.insert(args); - quartzManage.addJob(args); + /** + * 验证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,请重新输入!"); } + } - /** - * 修改任务并重新调度 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - if (StrUtil.isNotBlank(args.getSubTask())) { - List tasks = Arrays.asList(args.getSubTask().split("[,,]")); - if (tasks.contains(args.getId().toString())) { - throw new BadRequestException("子任务中不能添加当前任务ID"); - } - } - SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(quartzJob); - quartzManage.updateJobCron(quartzJob); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void createJob(SystemQuartzJobTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); + } + systemQuartzJobMapper.insert(args); + quartzManage.addJob(args); + } - /** - * 更改定时任务状态 - * - * @param quartzJob / - */ - @Transactional(rollbackFor = Exception.class) - public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { - // 置换暂停状态 - if (quartzJob.getIsPause()) { - quartzManage.resumeJob(quartzJob); - quartzJob.setIsPause(false); - } else { - quartzManage.pauseJob(quartzJob); - quartzJob.setIsPause(true); - } - systemQuartzJobMapper.insertOrUpdate(quartzJob); + /** + * 修改任务并重新调度 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); } + if (StrUtil.isNotBlank(args.getSubTask())) { + List tasks = Arrays.asList(args.getSubTask().split("[,,]")); + if (tasks.contains(args.getId().toString())) { + throw new BadRequestException("子任务中不能添加当前任务ID"); + } + } + SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(quartzJob); + quartzManage.updateJobCron(quartzJob); + } - /** - * 立即执行定时任务 - * - * @param quartzJob / - */ - public void startQuartzJob(SystemQuartzJobTb quartzJob) { - quartzManage.runJobNow(quartzJob); + /** + * 更改定时任务状态 + * + * @param quartzJob / + */ + @Transactional(rollbackFor = Exception.class) + public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { + // 置换暂停状态 + if (quartzJob.getIsPause()) { + quartzManage.resumeJob(quartzJob); + quartzJob.setIsPause(false); + } else { + quartzManage.pauseJob(quartzJob); + quartzJob.setIsPause(true); } + systemQuartzJobMapper.insertOrUpdate(quartzJob); + } - /** - * 删除任务 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteJobByIds(Set ids) { - for (Long id : ids) { - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); - quartzManage.deleteJob(quartzJob); - systemQuartzJobMapper.deleteById(quartzJob); - } - } + /** + * 立即执行定时任务 + * + * @param quartzJob / + */ + public void startQuartzJob(SystemQuartzJobTb quartzJob) { + quartzManage.runJobNow(quartzJob); + } - /** - * 执行子任务 - * - * @param tasks / - * @throws InterruptedException / - */ - @Transactional(rollbackFor = Exception.class) - public void startSubQuartJob(String[] tasks) throws InterruptedException { - for (String id : tasks) { - if (StrUtil.isBlank(id)) { - // 如果是手动清除子任务id, 会出现id为空字符串的问题 - continue; - } - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); - if (quartzJob == null) { - // 防止子任务不存在 - continue; - } - // 执行任务 - String uuid = IdUtil.simpleUUID(); - quartzJob.setUuid(uuid); - // 执行任务 - startQuartzJob(quartzJob); - // 获取执行状态, 如果执行失败则停止后面的子任务执行 - Boolean result = redisHelper.get(uuid, Boolean.class); - while (result == null) { - // 休眠5秒, 再次获取子任务执行情况 - Thread.sleep(5000); - result = redisHelper.get(uuid, Boolean.class); - } - if (!result) { - redisHelper.del(uuid); - break; - } - } + /** + * 删除任务 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + for (Long id : ids) { + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); + quartzManage.deleteJob(quartzJob); + systemQuartzJobMapper.deleteById(quartzJob); } + } - /** - * 导出定时任务 - * - * @param quartzJobs 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzJobTb quartzJob : quartzJobs) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzJob.getJobName()); - map.put("Bean名称", quartzJob.getBeanName()); - map.put("执行方法", quartzJob.getMethodName()); - map.put("参数", quartzJob.getParams()); - map.put("表达式", quartzJob.getCronExpression()); - map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); - map.put("描述", quartzJob.getDescription()); - map.put("创建日期", quartzJob.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 执行子任务 + * + * @param tasks / + * @throws InterruptedException / + */ + @Transactional(rollbackFor = Exception.class) + public void startSubQuartJob(String[] tasks) throws InterruptedException { + for (String id : tasks) { + if (StrUtil.isBlank(id)) { + // 如果是手动清除子任务id, 会出现id为空字符串的问题 + continue; + } + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); + if (quartzJob == null) { + // 防止子任务不存在 + continue; + } + // 执行任务 + String uuid = IdUtil.simpleUUID(); + quartzJob.setUuid(uuid); + // 执行任务 + startQuartzJob(quartzJob); + // 获取执行状态, 如果执行失败则停止后面的子任务执行 + Boolean result = redisHelper.get(uuid, Boolean.class); + while (result == null) { + // 休眠5秒, 再次获取子任务执行情况 + Thread.sleep(5000); + result = redisHelper.get(uuid, Boolean.class); + } + if (!result) { + redisHelper.del(uuid); + break; + } } + } - /** - * 导出定时任务日志 - * - * @param queryAllLog 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzLogTb quartzLog : queryAllLog) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzLog.getJobName()); - map.put("Bean名称", quartzLog.getBeanName()); - map.put("执行方法", quartzLog.getMethodName()); - map.put("参数", quartzLog.getParams()); - map.put("表达式", quartzLog.getCronExpression()); - map.put("异常详情", quartzLog.getExceptionDetail()); - map.put("耗时/毫秒", quartzLog.getTime()); - map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); - map.put("创建日期", quartzLog.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出定时任务 + * + * @param quartzJobs 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzJobTb quartzJob : quartzJobs) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzJob.getJobName()); + map.put("Bean名称", quartzJob.getBeanName()); + map.put("执行方法", quartzJob.getMethodName()); + map.put("参数", quartzJob.getParams()); + map.put("表达式", quartzJob.getCronExpression()); + map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); + map.put("描述", quartzJob.getDescription()); + map.put("创建日期", quartzJob.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchQuartzJobByArgs(SystemQueryQuartzJobArgs args, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(args, wrapper); - return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); + /** + * 导出定时任务日志 + * + * @param queryAllLog 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzLogTb quartzLog : queryAllLog) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzLog.getJobName()); + map.put("Bean名称", quartzLog.getBeanName()); + map.put("执行方法", quartzLog.getMethodName()); + map.put("参数", quartzLog.getParams()); + map.put("表达式", quartzLog.getCronExpression()); + map.put("异常详情", quartzLog.getExceptionDetail()); + map.put("耗时/毫秒", quartzLog.getTime()); + map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); + map.put("创建日期", quartzLog.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - 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 page 分页参数 + * @return / + */ + public KitPageResult searchQuartzJobByArgs(SystemQueryQuartzJobArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, 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); + 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 page 分页参数 - * @return / - */ - public KitPageResult searchQuartzLogByArgs(SystemQueryQuartzJobArgs args, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(args, wrapper); - return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, 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); + } - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(args, wrapper); - return systemQuartzJobMapper.selectList(wrapper); - } + /** + * 分页查询日志 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchQuartzLogByArgs(SystemQueryQuartzJobArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper)); + } - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(args, wrapper); - return systemQuartzLogMapper.selectList(wrapper); - } + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return systemQuartzJobMapper.selectList(wrapper); + } - public SystemQuartzJobTb getQuartzJobById(Long id) { - return systemQuartzJobMapper.selectById(id); - } + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return systemQuartzLogMapper.selectList(wrapper); + } - public List listEnableQuartzJob() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemQuartzJobTb::getIsPause, 0); - return systemQuartzJobMapper.selectList(wrapper); - } + public SystemQuartzJobTb getQuartzJobById(Long id) { + return systemQuartzJobMapper.selectById(id); + } + + public List listEnableQuartzJob() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemQuartzJobTb::getIsPause, 0); + return systemQuartzJobMapper.selectList(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java index fdfdc851..4e81616a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java @@ -32,46 +32,64 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleDeptService { - @Autowired private SystemRoleDeptMapper systemRoleDeptMapper; - @Autowired private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemRoleDeptMapper systemRoleDeptMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; - @Transactional(rollbackFor = Exception.class) - public void batchDeleteRoleDept(Set roleIds) { - if (CollUtil.isNotEmpty(roleIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleDeptTb::getRoleId, roleIds); - systemRoleDeptMapper.delete(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void batchDeleteRoleDept(Set roleIds) { + if (CollUtil.isNotEmpty(roleIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getRoleId, roleIds); + systemRoleDeptMapper.delete(wrapper); + } + } + + @Transactional(rollbackFor = Exception.class) + public void batchInsertRoleDept(Set depts, Long id) { + if (CollUtil.isNotEmpty(depts)) { + List records = new ArrayList<>(); + for (SystemDeptTb dept : depts) { + SystemRoleDeptTb record = new SystemRoleDeptTb(); + record.setRoleId(id); + record.setDeptId(dept.getId()); + records.add(record); + } + systemRoleDeptMapper.insert(records); + } + } + + /** + * 根据角色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统计角色数量 + * + * @param deptIds 部门ID集合 + * @return / + */ + public Long countRoleByDeptIds(Set deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return 0L; } - @Transactional(rollbackFor = Exception.class) - public void batchInsertRoleDept(Set depts, Long id) { - if (CollUtil.isNotEmpty(depts)) { - List records = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - SystemRoleDeptTb record = new SystemRoleDeptTb(); - record.setRoleId(id); - record.setDeptId(dept.getId()); - records.add(record); - } - systemRoleDeptMapper.insert(records); - } - } - - /** - * 根据角色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); - } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); + return systemRoleDeptMapper.selectCount(wrapper); + } } 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 a34ceaf4..a631f3ff 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 @@ -33,55 +33,57 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleMenuService { - @Autowired private SystemRoleMenuMapper systemRoleMenuMapper; - @Autowired private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuMapper systemRoleMenuMapper; + @Autowired + private SystemMenuMapper systemMenuMapper; - @Transactional(rollbackFor = Exception.class) - public void deleteRoleMenuByRoleId(Long roleId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleMenuTb::getRoleId, roleId); - systemRoleMenuMapper.delete(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void deleteRoleMenuByRoleId(Long roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleMenuTb::getRoleId, roleId); + systemRoleMenuMapper.delete(wrapper); + } - @Transactional(rollbackFor = Exception.class) - public void batchInsertRoleMenu(Set menus, Long roleId) { - if (CollUtil.isNotEmpty(menus)) { - List records = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - SystemRoleMenuTb record = new SystemRoleMenuTb(); - record.setMenuId(menu.getId()); - record.setRoleId(roleId); - records.add(record); - } - systemRoleMenuMapper.insert(records); - } + @Transactional(rollbackFor = Exception.class) + public void batchInsertRoleMenu(Set menus, Long roleId) { + if (CollUtil.isNotEmpty(menus)) { + List records = new ArrayList<>(); + for (SystemMenuTb menu : menus) { + SystemRoleMenuTb record = new SystemRoleMenuTb(); + record.setMenuId(menu.getId()); + record.setRoleId(roleId); + records.add(record); + } + systemRoleMenuMapper.insert(records); } + } - @Transactional(rollbackFor = Exception.class) - public void batchDeleteRoleMenu(Set roleIds) { - if (CollUtil.isNotEmpty(roleIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - systemRoleMenuMapper.delete(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void batchDeleteRoleMenu(Set roleIds) { + if (CollUtil.isNotEmpty(roleIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); + systemRoleMenuMapper.delete(wrapper); } + } - public LinkedHashSet queryMenuByRoleIds(Set roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return new LinkedHashSet<>(); - } - LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); - roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - List menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(menuIds)) { - return new LinkedHashSet<>(); - } - LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); - menuWrapper.in(SystemMenuTb::getId, menuIds); - // 排除"按钮" - menuWrapper.ne(SystemMenuTb::getType, 2); - menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); - return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); + public LinkedHashSet queryMenuByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return new LinkedHashSet<>(); } + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds); + List menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(menuIds)) { + return new LinkedHashSet<>(); + } + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.in(SystemMenuTb::getId, menuIds); + // 排除"按钮" + menuWrapper.ne(SystemMenuTb::getType, 2); + menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); + return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); + } } 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 d943c0b3..1a4563a4 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 @@ -18,322 +18,282 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; -import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemMenuTb; -import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleCodeVo; import cn.odboy.system.dal.model.SystemRoleVo; -import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; import cn.odboy.system.dal.mysql.SystemRoleMapper; -import cn.odboy.system.dal.mysql.SystemUserRoleMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleService { - @Autowired private SystemRoleMapper systemRoleMapper; - @Autowired private SystemRoleMenuService systemRoleMenuService; - @Autowired private SystemRoleDeptService systemRoleDeptService; - @Autowired private SystemRoleDeptMapper systemRoleDeptMapper; - @Autowired private SystemUserRoleMapper systemUserRoleMapper; - @Autowired private SystemUserService systemUserService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveRole(SystemCreateRoleArgs args) { - if (this.getRoleByName(args.getName()) != null) { - throw new BadRequestException("角色名称已存在"); - } - systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); - // 判断是否有部门数据, 若有, 则需创建关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemUserRoleService systemUserRoleService; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveRole(SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); + if (this.getRoleByName(args.getName()) != null) { + throw new BadRequestException("角色名称已存在"); } - - private SystemRoleTb getRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectOne(wrapper); + systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); + // 判断是否有部门数据, 若有, 则需创建关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); } + } - /** - * 修改 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateRoleById(SystemRoleVo args) { - SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class); - SystemRoleTb role1 = this.getRoleByName(args.getName()); - if (role1 != null && !role1.getId().equals(role.getId())) { - throw new BadRequestException("角色名称已存在"); - } - role.setName(args.getName()); - role.setDescription(args.getDescription()); - role.setDataScope(args.getDataScope()); - role.setDepts(args.getDepts()); - role.setLevel(args.getLevel()); - // 更新 - systemRoleMapper.insertOrUpdate(role); - // 删除关联部门数据 - systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); - // 判断是否有部门数据, 若有, 则需更新关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } + private SystemRoleTb getRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectOne(wrapper); + } + + /** + * 修改 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleById(SystemRoleVo args) { + checkRoleLevels(args.getLevel()); + SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class); + SystemRoleTb role1 = this.getRoleByName(args.getName()); + if (role1 != null && !role1.getId().equals(role.getId())) { + throw new BadRequestException("角色名称已存在"); } - - /** - * 修改绑定的菜单 - * - * @param role / - */ - public void updateBindMenuById(SystemRoleVo role) { - // 更新菜单 - systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); - // 判断是否为空 - if (CollUtil.isNotEmpty(role.getMenus())) { - systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); - } + role.setName(args.getName()); + role.setDescription(args.getDescription()); + role.setDataScope(args.getDataScope()); + role.setDepts(args.getDepts()); + role.setLevel(args.getLevel()); + // 更新 + systemRoleMapper.insertOrUpdate(role); + // 删除关联部门数据 + systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); + // 判断是否有部门数据, 若有, 则需更新关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); } + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteRoleByIds(Set ids) { - systemRoleMapper.deleteByIds(ids); - // 删除角色部门关联数据、角色菜单关联数据 - systemRoleDeptService.batchDeleteRoleDept(ids); - systemRoleMenuService.batchDeleteRoleMenu(ids); + /** + * 修改绑定的菜单 + * + * @param args / + */ + public void updateBindMenuById(SystemRoleVo args) { + SystemRoleTb role = systemRoleMapper.selectById(args.getId()); + checkRoleLevels(role.getLevel()); + // 更新菜单 + systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); + // 判断是否为空 + if (CollUtil.isNotEmpty(args.getMenus())) { + systemRoleMenuService.batchInsertRoleMenu(args.getMenus(), role.getId()); } + } - /** - * 导出数据 - * - * @param roles 待导出的数据 - * @param response / - * @throws IOException - */ - public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemRoleVo role : roles) { - Map map = new LinkedHashMap<>(); - map.put("角色名称", role.getName()); - map.put("角色级别", role.getLevel()); - map.put("描述", role.getDescription()); - map.put("创建日期", role.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteRoleByIds(Set ids) { + List roleLevels = systemRoleMapper.selectByIds(ids).stream().map(SystemRoleTb::getLevel).distinct().collect(Collectors.toList()); + for (Integer roleLevel : roleLevels) { + checkRoleLevels(roleLevel); } + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); + // 删除角色 + systemRoleMapper.deleteByIds(ids); + // 删除角色部门关联数据、角色菜单关联数据 + systemRoleDeptService.batchDeleteRoleDept(ids); + systemRoleMenuService.batchDeleteRoleMenu(ids); + } - /** - * 查询全部角色 - */ - public List listAllRole() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.orderByAsc(SystemRoleTb::getLevel); - return systemRoleMapper.selectList(wrapper); + /** + * 导出数据 + * + * @param roles 待导出的数据 + * @param response / + */ + public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemRoleVo role : roles) { + Map map = new LinkedHashMap<>(); + map.put("角色名称", role.getName()); + map.put("角色级别", role.getLevel()); + map.put("描述", role.getDescription()); + map.put("创建日期", role.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 根据条件查询全部角色 - * - * @param args 条件 - * @return - */ - public List queryRoleByArgs(SystemQueryRoleArgs args) { - // 查询角色基本信息 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - 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); - if (args != null && args.getSize() != null) { - Page rolePage = new Page<>(args.getPage(), args.getSize()); - Page page = systemRoleMapper.selectPage(rolePage, wrapper); - List roles = page.getRecords(); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); - } else { - List roles = systemRoleMapper.selectList(wrapper); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); - } + /** + * 查询全部角色 + */ + public List listAllRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(SystemRoleTb::getLevel); + return systemRoleMapper.selectList(wrapper); + } + + /** + * 根据条件查询全部角色 + * + * @param args 条件 + * @return / + */ + public List queryRoleByArgs(SystemQueryRoleArgs args) { + // 查询角色基本信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + } } - - /** - * 分页查询角色 - * - * @param args 条件 - * @param page 分页参数 - * @return - */ - public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { - args.setOffset(page.offset()); - List roles = this.queryRoleByArgs(args); - Long total = this.countRoleByArgs(args); - return KitPageUtil.toPage(roles, total); + wrapper.orderByAsc(SystemRoleTb::getLevel); + if (args != null && args.getSize() != null) { + Page rolePage = new Page<>(args.getPage(), args.getSize()); + Page page = systemRoleMapper.selectPage(rolePage, wrapper); + List roles = page.getRecords(); + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); + } else { + List roles = systemRoleMapper.selectList(wrapper); + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); } + } - /** - * 根据用户ID查询 - * - * @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); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + /** + * 分页查询角色 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { + args.setOffset(page.offset()); + List roles = this.queryRoleByArgs(args); + Long total = this.countRoleByArgs(args); + return KitPageUtil.toPage(roles, total); + } + + + /** + * 获取用户权限信息 + * + * @param user 用户信息 + * @return 权限信息 + */ + public List buildUserRolePermissions(SystemUserTb 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()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) + .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } - /** - * 根据角色查询角色级别 - * - * @param roles / - * @return / - */ - public Integer getDeptLevelByRoles(Set roles) { - if (CollUtil.isEmpty(roles)) { - return Integer.MAX_VALUE; - } - Set roleSet = new HashSet<>(); - for (SystemRoleTb role : roles) { - roleSet.add(getRoleById(role.getId())); - } - return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserService.countUserByRoleIds(ids) > 0) { + throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); } + } - /** - * 获取用户权限信息 - * - * @param user 用户信息 - * @return 权限信息 - */ - public List buildUserRolePermissions(SystemUserTb user) { - Set permissions = new HashSet<>(); - // 如果是管理员直接返回 - if (user.getIsAdmin()) { - permissions.add("admin"); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - List roles = this.queryRoleByUsersId(user.getId()); - permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + public Long countRoleByArgs(SystemQueryRoleArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + } } + return systemRoleMapper.selectCount(wrapper); + } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserService.countUserByRoleIds(ids) > 0) { - throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); - } + public SystemRoleVo getRoleById(Long id) { + SystemRoleTb roleTb = systemRoleMapper.selectById(id); + if (roleTb == null) { + return null; } + return systemUserRoleService.convertToRoleVo(roleTb); + } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemRoleTb getRoleById(Long id) { - return systemRoleMapper.selectById(id); - } + public Dict getRoleLevel() { + return Dict.create().set("level", checkRoleLevels(null)); + } - /** - * 根据部门ID统计角色数量 - * - * @param deptIds 部门ID集合 - * @return / - */ - public Long countRoleByDeptIds(Set deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return 0L; - } - - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); - return systemRoleDeptMapper.selectCount(wrapper); - } - - /** - * 转换为SystemRoleVo并关联查询菜单和部门信息 - * - * @param role 角色基本信息 - * @return 包含关联信息的SystemRoleVo - */ - private SystemRoleVo convertToRoleVo(SystemRoleTb role) { - if (role == null) { - return null; - } - - SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); - // 查询关联的菜单信息 - Set menus = systemRoleMenuService.queryMenuByRoleIds(Collections.singleton(role.getId())); - roleVo.setMenus(menus); - - // 查询关联的部门信息 - List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); - roleVo.setDepts(new LinkedHashSet<>(depts)); - - return roleVo; - } - - public Long countRoleByArgs(SystemQueryRoleArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - 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)); - } - } - return systemRoleMapper.selectCount(wrapper); + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemUserRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } } + return min; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java new file mode 100644 index 00000000..e051ae16 --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java @@ -0,0 +1,21 @@ +package cn.odboy.system.service; + +import cn.odboy.system.dal.dataobject.SystemUserTb; +import cn.odboy.system.dal.mysql.SystemUserMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SystemUserDeptService { + + @Autowired + private SystemUserMapper systemUserMapper; + + public long countUserByDeptIds(Set deptIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserTb::getDeptId, deptIds); + return systemUserMapper.selectCount(wrapper); + } +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java index a5769ca1..90c450a6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java @@ -30,28 +30,29 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserJobService { - @Autowired private SystemUserJobMapper systemUserJobMapper; + @Autowired + private SystemUserJobMapper systemUserJobMapper; - @Transactional(rollbackFor = Exception.class) - public void batchInsertUserJob(Set jobs, Long userId) { - if (CollUtil.isNotEmpty(jobs)) { - List records = new ArrayList<>(); - for (SystemJobTb job : jobs) { - SystemUserJobTb record = new SystemUserJobTb(); - record.setUserId(userId); - record.setJobId(job.getId()); - records.add(record); - } - systemUserJobMapper.insert(records); - } + @Transactional(rollbackFor = Exception.class) + public void batchInsertUserJob(Set jobs, Long userId) { + if (CollUtil.isNotEmpty(jobs)) { + List records = new ArrayList<>(); + for (SystemJobTb job : jobs) { + SystemUserJobTb record = new SystemUserJobTb(); + record.setUserId(userId); + record.setJobId(job.getId()); + records.add(record); + } + systemUserJobMapper.insert(records); } + } - @Transactional(rollbackFor = Exception.class) - public void batchDeleteUserJob(Set userIds) { - if (CollUtil.isNotEmpty(userIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserJobTb::getUserId, userIds); - systemUserJobMapper.delete(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void batchDeleteUserJob(Set userIds) { + if (CollUtil.isNotEmpty(userIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserJobTb::getUserId, userIds); + systemUserJobMapper.delete(wrapper); } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java index b33d4eb8..b2424f97 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java @@ -15,14 +15,26 @@ */ package cn.odboy.system.service; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.system.dal.dataobject.SystemDeptTb; +import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserRoleTb; +import cn.odboy.system.dal.model.SystemRoleVo; +import cn.odboy.system.dal.model.SystemUserVo; +import cn.odboy.system.dal.mysql.SystemRoleMapper; import cn.odboy.system.dal.mysql.SystemUserRoleMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; 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.Set; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,28 +42,109 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserRoleService { - @Autowired private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - @Transactional(rollbackFor = Exception.class) - public void batchInsertUserRole(Set roles, Long userId) { - if (CollUtil.isNotEmpty(roles)) { - List records = new ArrayList<>(); - for (SystemRoleTb role : roles) { - SystemUserRoleTb record = new SystemUserRoleTb(); - record.setUserId(userId); - record.setRoleId(role.getId()); - records.add(record); - } - systemUserRoleMapper.insert(records); - } + @Transactional(rollbackFor = Exception.class) + public void batchInsertUserRole(Set roles, Long userId) { + if (CollUtil.isNotEmpty(roles)) { + List records = new ArrayList<>(); + for (SystemRoleTb role : roles) { + SystemUserRoleTb record = new SystemUserRoleTb(); + record.setUserId(userId); + record.setRoleId(role.getId()); + records.add(record); + } + systemUserRoleMapper.insert(records); } + } - @Transactional(rollbackFor = Exception.class) - public void batchDeleteUserRole(Set userIds) { - if (CollUtil.isNotEmpty(userIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserRoleTb::getUserId, userIds); - systemUserRoleMapper.delete(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void batchDeleteUserRole(Set userIds) { + if (CollUtil.isNotEmpty(userIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getUserId, userIds); + systemUserRoleMapper.delete(wrapper); } + } + + /** + * 转换为SystemRoleVo并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + public SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; + } + SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIds( + Collections.singleton(role.getId())); + roleVo.setMenus(menus); + + // 查询关联的部门信息 + List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); + roleVo.setDepts(new LinkedHashSet<>(depts)); + + return roleVo; + } + + /** + * 根据用户ID查询 + * + * @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); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + 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())); + } + return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + } + + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + public void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + this.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); + } + } } 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 62d32455..831f894c 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 @@ -17,12 +17,15 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; +import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; @@ -30,6 +33,7 @@ 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.SystemQueryUserArgs; +import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.dal.mysql.SystemDeptMapper; import cn.odboy.system.dal.mysql.SystemJobMapper; @@ -42,10 +46,10 @@ import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; +import cn.odboy.util.KitRsaEncryptUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -58,442 +62,516 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; @Service public class SystemUserService { - @Autowired - private SystemUserMapper systemUserMapper; - @Autowired - private SystemUserJobService systemUserJobService; - @Autowired - private SystemUserRoleService systemUserRoleService; - @Autowired - private SystemUserInfoDAO systemUserInfoDAO; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired - private SystemUserJobMapper systemUserJobMapper; - @Autowired - private SystemUserRoleMapper systemUserRoleMapper; - @Autowired - private SystemJobMapper systemJobMapper; - @Autowired - private SystemRoleMapper systemRoleMapper; - @Autowired - private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserJobService systemUserJobService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemEmailService systemEmailService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private SystemUserJobMapper systemUserJobMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; - /** - * 新增用户 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveUser(SystemUserVo args) { - args.setDeptId(args.getDept().getId()); - if (this.getUserByUsername(args.getUsername()) != null) { - throw new BadRequestException("用户名已存在"); - } - if (this.getUserByEmail(args.getEmail()) != null) { - throw new BadRequestException("邮箱已存在"); - } - if (this.getUserByPhone(args.getPhone()) != null) { - throw new BadRequestException("手机号已存在"); - } - systemUserMapper.insert(args); - // 保存用户岗位 - systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); - // 保存用户角色 - systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + + /** + * 新增用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveUser(SystemUserVo args) { + systemUserRoleService.checkLevel(args); + // 默认密码 123456 + args.setPassword(passwordEncoder.encode("123456")); + args.setDeptId(args.getDept().getId()); + if (this.getUserByUsername(args.getUsername()) != null) { + throw new BadRequestException("用户名已存在"); } - - /** - * 编辑用户 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserById(SystemUserVo args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = this.getUserByUsername(args.getUsername()); - SystemUserTb user2 = this.getUserByEmail(args.getEmail()); - SystemUserTb user3 = this.getUserByPhone(args.getPhone()); - if (user1 != null && !user.getId().equals(user1.getId())) { - throw new BadRequestException("用户名已存在"); - } - if (user2 != null && !user.getId().equals(user2.getId())) { - throw new BadRequestException("邮箱已存在"); - } - if (user3 != null && !user.getId().equals(user3.getId())) { - throw new BadRequestException("手机号已存在"); - } - // 如果用户被禁用, 则清除用户登录信息 - if (!args.getEnabled()) { - systemUserOnlineInfoDAO.kickOutByUsername(args.getUsername()); - } - user.setDeptId(args.getDept().getId()); - user.setUsername(args.getUsername()); - user.setEmail(args.getEmail()); - user.setEnabled(args.getEnabled()); - user.setDept(args.getDept()); - user.setPhone(args.getPhone()); - user.setNickName(args.getNickName()); - user.setGender(args.getGender()); - systemUserMapper.insertOrUpdate(user); - // 清除用户登录缓存 - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - // 更新用户岗位 - systemUserJobService.batchDeleteUserJob(Collections.singleton(args.getId())); - systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); - // 更新用户角色 - systemUserRoleService.batchDeleteUserRole(Collections.singleton(args.getId())); - systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + if (this.getUserByEmail(args.getEmail()) != null) { + throw new BadRequestException("邮箱已存在"); } - - /** - * 用户自助修改资料 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserCenterInfoById(SystemUserTb args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = this.getUserByPhone(args.getPhone()); - if (user1 != null && !user.getId().equals(user1.getId())) { - throw new BadRequestException("手机号已存在"); - } - user.setNickName(args.getNickName()); - user.setPhone(args.getPhone()); - user.setGender(args.getGender()); - systemUserMapper.insertOrUpdate(user); - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + if (this.getUserByPhone(args.getPhone()) != null) { + throw new BadRequestException("手机号已存在"); } + // 保存用户 + systemUserMapper.insert(args); + // 保存用户岗位 + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 保存用户角色 + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } - /** - * 删除用户 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeUserByIds(Set ids) { - for (Long id : ids) { - // 清理缓存 - SystemUserTb user = systemUserMapper.selectById(id); - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - } - systemUserMapper.deleteByIds(ids); - // 删除用户岗位 - systemUserJobService.batchDeleteUserJob(ids); - // 删除用户角色 - systemUserRoleService.batchDeleteUserRole(ids); + /** + * 编辑用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserById(SystemUserVo args) { + systemUserRoleService.checkLevel(args); + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = this.getUserByUsername(args.getUsername()); + SystemUserTb user2 = this.getUserByEmail(args.getEmail()); + SystemUserTb user3 = this.getUserByPhone(args.getPhone()); + if (user1 != null && !user.getId().equals(user1.getId())) { + throw new BadRequestException("用户名已存在"); } - - /** - * 修改密码 - * - * @param username 用户名 - * @param encryptPassword 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserPasswordByUsername(String username, String encryptPassword) { - systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + if (user2 != null && !user.getId().equals(user2.getId())) { + throw new BadRequestException("邮箱已存在"); } - - /** - * 重置密码 - * - * @param ids 用户id - * @param password 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void resetUserPasswordByIds(Set ids, String password) { - List users = systemUserMapper.selectByIds(ids); - // 清除缓存 - users.forEach(user -> { - // 清除缓存 - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - // 强制退出 - systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); - }); - // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(password, ids); + if (user3 != null && !user.getId().equals(user3.getId())) { + throw new BadRequestException("手机号已存在"); } - - /** - * 修改头像 - * - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public Map updateUserAvatar(MultipartFile multipartFile) { - SystemUserTb user = this.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - String username = user.getUsername(); - if (StrUtil.isBlank(username)) { - throw new BadRequestException("异常用户数据, 请联系管理员处理"); - } - // 文件大小验证 - KitFileUtil.checkSize(fileUploadPathHelper.getAvatarMaxSize(), multipartFile.getSize()); - // 验证文件上传的格式 - String image = "gif jpg png jpeg"; - String fileType = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); - if (fileType != null && !image.contains(fileType)) { - throw new BadRequestException("文件格式错误!, 仅支持 " + image + " 格式"); - } - String oldPath = user.getAvatarPath(); - File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath()); - user.setAvatarPath(Objects.requireNonNull(file).getPath()); - user.setAvatarName(file.getName()); - systemUserMapper.insertOrUpdate(user); - if (StrUtil.isNotBlank(oldPath)) { - KitFileUtil.del(oldPath); - } - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - return new HashMap<>(1) {{ - put("avatar", file.getName()); - }}; + // 如果用户被禁用, 则清除用户登录信息 + if (!args.getEnabled()) { + systemUserOnlineInfoDAO.kickOutByUsername(args.getUsername()); } + user.setDeptId(args.getDept().getId()); + user.setUsername(args.getUsername()); + user.setEmail(args.getEmail()); + user.setEnabled(args.getEnabled()); + user.setDept(args.getDept()); + user.setPhone(args.getPhone()); + user.setNickName(args.getNickName()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + // 清除用户登录缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 更新用户岗位 + systemUserJobService.batchDeleteUserJob(Collections.singleton(args.getId())); + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 更新用户角色 + systemUserRoleService.batchDeleteUserRole(Collections.singleton(args.getId())); + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } - /** - * 修改邮箱 - * - * @param username 用户名 - * @param email 邮箱 - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserEmailByUsername(String username, String email) { - systemUserMapper.updateUserEmailByUsername(username, email); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + /** + * 用户自助修改资料 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserCenterInfoById(SystemUserTb args) { + if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { + throw new BadRequestException("不能修改他人资料"); } - - /** - * 导出数据 - * - * @param users 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportUserExcel(List users, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemUserVo user : users) { - List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUsername()); - map.put("角色", roles); - map.put("部门", user.getDept().getName()); - map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); - map.put("邮箱", user.getEmail()); - map.put("状态", user.getEnabled() ? "启用" : "禁用"); - map.put("手机号码", user.getPhone()); - map.put("修改密码的时间", user.getPwdResetTime()); - map.put("创建日期", user.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = this.getUserByPhone(args.getPhone()); + if (user1 != null && !user.getId().equals(user1.getId())) { + throw new BadRequestException("手机号已存在"); } + user.setNickName(args.getNickName()); + user.setPhone(args.getPhone()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + } - /** - * 查询全部 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { - // 查询用户基本信息 - LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); - IPage userPage = systemUserMapper.selectPage(page, wrapper); - List users = userPage.getRecords(); - // 转换为SystemUserVo并关联查询 - List userVos = users.stream().map(this::convertToUserVo).collect(Collectors.toList()); - return KitPageUtil.toPage(userVos, userPage.getTotal()); + /** + * 删除用户 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeUserByIds(Set ids) { + Long currentUserId = KitSecurityHelper.getCurrentUserId(); + // 校验权限 + for (Long id : ids) { + Integer currentLevel = Collections.min( + systemUserRoleService.queryRoleByUsersId(currentUserId).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemUserRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) + .collect(Collectors.toList())); + if (currentLevel > optLevel) { + throw new BadRequestException( + "角色权限不足, 不能删除:" + this.getUserById(id).getUsername()); + } } - - /** - * 查询全部不分页 - * - * @param args 条件 - * @return / - */ - public List queryUserByArgs(SystemQueryUserArgs args) { - // 查询用户基本信息 - LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); - List users = systemUserMapper.selectList(wrapper); - // 转换为SystemUserVo并关联查询 - return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + // 清理缓存 + List usernameList = systemUserMapper.selectByIds(ids).stream().map(SystemUserTb::getUsername).distinct().collect(Collectors.toList()); + for (String username : usernameList) { + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); } + // 删除用户 + systemUserMapper.deleteByIds(ids); + // 删除用户岗位 + systemUserJobService.batchDeleteUserJob(ids); + // 删除用户角色 + systemUserRoleService.batchDeleteUserRole(ids); + } - /** - * 根据ID查询 - * - * @param id ID - * @return / - */ - public SystemUserTb getUserById(long id) { - return systemUserMapper.selectById(id); + /** + * 修改密码 + * + * @param username 用户名 + * @param args 参数 + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserPasswordByUsername(String username, SystemUpdateUserPasswordArgs args) throws Exception { + String oldPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getOldPass()); + String newPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getNewPass()); + SystemUserTb user = this.getUserByUsername(username); + if (!passwordEncoder.matches(oldPass, user.getPassword())) { + throw new BadRequestException("修改失败,旧密码错误"); } - - public List queryUserMetadataOptions(KitPageArgs pageArgs) { - SystemQueryUserArgs args = pageArgs.getArgs(); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); - wrapper.and(c -> { - c.eq(SystemUserTb::getPhone, args.getBlurry()); - c.or(); - c.eq(SystemUserTb::getEmail, args.getBlurry()); - c.or(); - c.like(SystemUserTb::getUsername, args.getBlurry()); - c.or(); - c.like(SystemUserTb::getNickName, args.getBlurry()); - }); - return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> { - Map ext = new HashMap<>(1); - ext.put("id", m.getId()); - ext.put("deptId", m.getDeptId()); - ext.put("email", m.getEmail()); - ext.put("phone", m.getPhone()); - return KitSelectOptionVo.builder().label(m.getNickName()).value(String.valueOf(m.getId())).ext(ext).build(); - }).collect(Collectors.toList()); + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); } + String encryptPassword = passwordEncoder.encode(newPass); + systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } - /** - * 根据岗位ID统计用户数量 - * - * @param jobIds 岗位ID集合 - * @return / - */ - public Long countUserByJobIds(Set jobIds) { - if (CollUtil.isEmpty(jobIds)) { - return 0L; - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserJobTb::getJobId, jobIds); - return systemUserJobMapper.selectCount(wrapper); + /** + * 重置密码 + * + * @param ids 用户id + */ + @Transactional(rollbackFor = Exception.class) + public void resetUserPasswordByIds(Set ids) { + String defaultPwd = passwordEncoder.encode("123456"); + List users = systemUserMapper.selectByIds(ids); + // 清除缓存 + for (SystemUserTb user : users) { + // 清除缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 强制退出 + systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); } + // 重置密码 + systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids); + } - /** - * 根据角色ID统计用户数量 - * - * @param roleIds 角色ID集合 - * @return / - */ - public Long countUserByRoleIds(Set roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return 0L; - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserRoleTb::getRoleId, roleIds); - return systemUserRoleMapper.selectCount(wrapper); + /** + * 修改头像 + * + * @param multipartFile 文件 + * @return / + */ + @Transactional(rollbackFor = Exception.class) + public Map updateUserAvatar(MultipartFile multipartFile) { + SystemUserTb user = this.getUserByUsername(KitSecurityHelper.getCurrentUsername()); + String username = user.getUsername(); + if (StrUtil.isBlank(username)) { + throw new BadRequestException("异常用户数据, 请联系管理员处理"); } - - /** - * 构建用户查询条件 - * - * @param args 查询条件 - * @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; + // 文件大小验证 + KitFileUtil.checkSize(fileUploadPathHelper.getAvatarMaxSize(), multipartFile.getSize()); + // 验证文件上传的格式 + String image = "gif jpg png jpeg"; + String fileType = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); + if (fileType != null && !image.contains(fileType)) { + throw new BadRequestException("文件格式错误!, 仅支持 " + image + " 格式"); } - - /** - * 转换为SystemUserVo并关联查询部门、角色、岗位信息 - * - * @param user 用户基本信息 - * @return 包含关联信息的SystemUserVo - */ - private SystemUserVo convertToUserVo(SystemUserTb user) { - if (user == null) { - return null; - } - SystemUserVo userVo = BeanUtil.copyProperties(user, SystemUserVo.class); - - // 查询关联的部门信息 - if (user.getDeptId() != null) { - SystemDeptTb dept = systemDeptMapper.selectById(user.getDeptId()); - userVo.setDept(dept); - } - - // 查询关联的岗位信息 - LambdaQueryWrapper jobWrapper = new LambdaQueryWrapper<>(); - jobWrapper.eq(SystemUserJobTb::getUserId, user.getId()); - List userJobs = systemUserJobMapper.selectList(jobWrapper); - if (CollUtil.isNotEmpty(userJobs)) { - Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); - List jobs = systemJobMapper.selectByIds(jobIds); - userVo.setJobs(new LinkedHashSet<>(jobs)); - } - - // 查询关联的角色信息 - LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); - roleWrapper.eq(SystemUserRoleTb::getUserId, user.getId()); - List userRoles = systemUserRoleMapper.selectList(roleWrapper); - if (CollUtil.isNotEmpty(userRoles)) { - Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); - List roles = systemRoleMapper.selectByIds(roleIds); - userVo.setRoles(new LinkedHashSet<>(roles)); - } - - return userVo; + String oldPath = user.getAvatarPath(); + File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath()); + user.setAvatarPath(Objects.requireNonNull(file).getPath()); + user.setAvatarName(file.getName()); + systemUserMapper.insertOrUpdate(user); + if (StrUtil.isNotBlank(oldPath)) { + KitFileUtil.del(oldPath); } + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + return new HashMap<>(1) {{ + put("avatar", file.getName()); + }}; + } - public SystemUserTb getUserByUsername(String username) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.selectOne(wrapper); + /** + * 修改邮箱 + * + * @param username 用户名 + * @param args 参数 + * @param code 验证码 + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserEmailByUsername(String username, SystemUserTb args, String code) throws Exception { + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); + SystemUserTb user = this.getUserByUsername(username); + if (!passwordEncoder.matches(password, user.getPassword())) { + throw new BadRequestException("密码错误"); } + systemEmailService.checkEmailCaptchaV1(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); + systemUserMapper.updateUserEmailByUsername(username, args.getEmail()); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } - public SystemUserVo getUserVoByUsername(String username) { - return this.convertToUserVo(this.getUserByUsername(username)); + /** + * 导出数据 + * + * @param users 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportUserExcel(List users, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemUserVo user : users) { + List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUsername()); + map.put("角色", roles); + map.put("部门", user.getDept().getName()); + map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); + map.put("邮箱", user.getEmail()); + map.put("状态", user.getEnabled() ? "启用" : "禁用"); + map.put("手机号码", user.getPhone()); + map.put("修改密码的时间", user.getPwdResetTime()); + map.put("创建日期", user.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - public long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return systemUserMapper.selectCount(wrapper); - } + /** + * 查询全部 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + IPage userPage = systemUserMapper.selectPage(page, wrapper); + List users = userPage.getRecords(); + // 转换为SystemUserVo并关联查询 + List userVos = users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + return KitPageUtil.toPage(userVos, userPage.getTotal()); + } - public SystemUserTb getUserByEmail(String email) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getEmail, email); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.selectOne(wrapper); - } + /** + * 查询全部不分页 + * + * @param args 条件 + * @return / + */ + public List queryUserByArgs(SystemQueryUserArgs args) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + List users = systemUserMapper.selectList(wrapper); + // 转换为SystemUserVo并关联查询 + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } - public SystemUserTb getUserByPhone(String phone) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getPhone, phone); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.selectOne(wrapper); + /** + * 根据ID查询 + * + * @param id ID + * @return / + */ + public SystemUserTb getUserById(long id) { + return systemUserMapper.selectById(id); + } + + public List queryUserMetadataOptions(KitPageArgs pageArgs) { + SystemQueryUserArgs args = pageArgs.getArgs(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); + wrapper.and(c -> { + c.eq(SystemUserTb::getPhone, args.getBlurry()); + c.or(); + c.eq(SystemUserTb::getEmail, args.getBlurry()); + c.or(); + c.like(SystemUserTb::getUsername, args.getBlurry()); + c.or(); + c.like(SystemUserTb::getNickName, args.getBlurry()); + }); + return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> { + Map ext = new HashMap<>(1); + ext.put("id", m.getId()); + ext.put("deptId", m.getDeptId()); + ext.put("email", m.getEmail()); + ext.put("phone", m.getPhone()); + return KitSelectOptionVo.builder().label(m.getNickName()).value(String.valueOf(m.getId())).ext(ext).build(); + }).collect(Collectors.toList()); + } + + /** + * 根据岗位ID统计用户数量 + * + * @param jobIds 岗位ID集合 + * @return / + */ + public Long countUserByJobIds(Set jobIds) { + if (CollUtil.isEmpty(jobIds)) { + return 0L; } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserJobTb::getJobId, jobIds); + return systemUserJobMapper.selectCount(wrapper); + } + + /** + * 根据角色ID统计用户数量 + * + * @param roleIds 角色ID集合 + * @return / + */ + public Long countUserByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return 0L; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getRoleId, roleIds); + return systemUserRoleMapper.selectCount(wrapper); + } + + /** + * 构建用户查询条件 + * + * @param args 查询条件 + * @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并关联查询部门、角色、岗位信息 + * + * @param user 用户基本信息 + * @return 包含关联信息的SystemUserVo + */ + private SystemUserVo convertToUserVo(SystemUserTb user) { + if (user == null) { + return null; + } + SystemUserVo userVo = BeanUtil.copyProperties(user, SystemUserVo.class); + // 查询关联的部门信息 + if (user.getDeptId() != null) { + SystemDeptTb dept = systemDeptMapper.selectById(user.getDeptId()); + userVo.setDept(dept); + } + // 查询关联的岗位信息 + LambdaQueryWrapper jobWrapper = new LambdaQueryWrapper<>(); + jobWrapper.eq(SystemUserJobTb::getUserId, user.getId()); + List userJobs = systemUserJobMapper.selectList(jobWrapper); + if (CollUtil.isNotEmpty(userJobs)) { + Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); + List jobs = systemJobMapper.selectByIds(jobIds); + userVo.setJobs(new LinkedHashSet<>(jobs)); + } + // 查询关联的角色信息 + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.eq(SystemUserRoleTb::getUserId, user.getId()); + List userRoles = systemUserRoleMapper.selectList(roleWrapper); + if (CollUtil.isNotEmpty(userRoles)) { + Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + userVo.setRoles(new LinkedHashSet<>(roles)); + } + return userVo; + } + + public SystemUserTb getUserByUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } + + public SystemUserVo getUserVoByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username)); + } + + public SystemUserTb getUserByEmail(String email) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getEmail, email); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } + + public SystemUserTb getUserByPhone(String phone) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getPhone, phone); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } + + public KitPageResult aggregationSearchUserByArgs(Page page, SystemQueryUserArgs args, String currentUsername) { + if (!ObjectUtils.isEmpty(args.getDeptId())) { + args.getDeptIds().add(args.getDeptId()); + // 先查找是否存在子节点 + List data = systemDeptService.listDeptByPid(args.getDeptId()); + // 然后把子节点的ID都加入到集合中 + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); + } + // 数据权限 + List dataScopes = systemDataService.queryDeptIdByArgs( + this.getUserByUsername(currentUsername)); + // args.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollectionUtils.isEmpty(args.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { + // 取交集 + args.getDeptIds().retainAll(dataScopes); + if (!CollectionUtil.isEmpty(args.getDeptIds())) { + return this.searchUserByArgs(args, page); + } + } else { + // 否则取并集 + args.getDeptIds().addAll(dataScopes); + return this.searchUserByArgs(args, page); + } + return KitPageUtil.emptyData(); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java index cc329d4b..4c8c629e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java @@ -36,13 +36,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -60,117 +60,121 @@ import org.springframework.web.multipart.MultipartFile; public class SystemOssStorageServiceImpl extends ServiceImpl implements SystemOssStorageService { - @Autowired private MinioRepository minioRepository; - @Autowired private AppProperties properties; - @Autowired private KitFileLocalUploadHelper fileLocalUploadHelper; - @Autowired private SystemOssStorageMapper systemOssStorageMapper; + @Autowired + private MinioRepository minioRepository; + @Autowired + private AppProperties properties; + @Autowired + private KitFileLocalUploadHelper fileLocalUploadHelper; + @Autowired + private SystemOssStorageMapper systemOssStorageMapper; - @Override - public KitPageResult searchOssStorage(SystemQueryStorageArgs args, - Page page) { - IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); - IPage convert = ossStorageTbs.convert(c -> { - SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); - return storageVo; - }); - return KitPageUtil.toPage(convert); - } + @Override + public KitPageResult searchOssStorage(SystemQueryStorageArgs args, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); + IPage convert = ossStorageTbs.convert(c -> { + SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + return storageVo; + }); + return KitPageUtil.toPage(convert); + } - private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args != null) { - 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())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper); + private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + 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())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemOssStorageTb::getId); + return systemOssStorageMapper.selectPage(page, wrapper); + } - @Override - public List queryOssStorage(SystemQueryStorageArgs args) { - // 防止刷数据 - Page page = new Page<>(1, 500); - return searchOssStorage(args, page).getContent(); - } + @Override + public List queryOssStorage(SystemQueryStorageArgs args) { + // 防止刷数据 + Page page = new Page<>(1, 500); + return searchOssStorage(args, page).getContent(); + } - @Override - public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemOssStorageVo ossStorage : ossStorages) { - Map map = new LinkedHashMap<>(); - map.put("服务类型", ossStorage.getServiceType()); - map.put("服务地址", ossStorage.getEndpoint()); - map.put("存储桶名称", ossStorage.getBucketName()); - map.put("文件名称", ossStorage.getFileName()); - map.put("文件大小", ossStorage.getFileSizeDesc()); - map.put("文件类型", ossStorage.getFileMime()); - map.put("创建人", ossStorage.getCreateBy()); - map.put("创建日期", ossStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + @Override + public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemOssStorageVo ossStorage : ossStorages) { + Map map = new LinkedHashMap<>(); + map.put("服务类型", ossStorage.getServiceType()); + map.put("服务地址", ossStorage.getEndpoint()); + map.put("存储桶名称", ossStorage.getBucketName()); + map.put("文件名称", ossStorage.getFileName()); + map.put("文件大小", ossStorage.getFileSizeDesc()); + map.put("文件类型", ossStorage.getFileMime()); + map.put("创建人", ossStorage.getCreateBy()); + map.put("创建日期", ossStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - @Override - @Transactional(rollbackFor = Exception.class) - public String uploadFile(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - if (StrUtil.isBlank(originalFilename)) { - throw new BadRequestException("文件名不能为空"); - } - StorageOSSModel ossConfig = properties.getOss(); - long fileSize = file.getSize(); - String contentType = file.getContentType(); - KitFileUtil.checkSize(ossConfig.getMaxSize(), fileSize); - // 按天分组 - String nowDateStr = KitDateUtil.getNowDateStr(); - // 上传到本地临时目录 - File tempFile = KitFileUtil.upload(file, fileLocalUploadHelper.getPath() + nowDateStr + File.separator); - if (tempFile == null) { - throw new BadRequestException("上传失败"); - } - // 校验文件md5, 看是否已存在云端(不确定, 可能云端已经删除, 但是正常来说云端是不允许私自删除的, 所以这里忽略云端不存在的情况) - String md5 = KitFileUtil.getMd5(tempFile); - SystemOssStorageTb systemOssStorageTb = this.getOssStorageByMd5(md5); - if (systemOssStorageTb != null) { - // 重新生成7天链接 - return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); - } - // 上传到OSS - SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); - if (storageTb == null) { - throw new BadRequestException("文件上传失败"); - } - save(storageTb); - return minioRepository.generatePreviewUrl(storageTb.getObjectName()); + @Override + @Transactional(rollbackFor = Exception.class) + public String uploadFile(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + if (StrUtil.isBlank(originalFilename)) { + throw new BadRequestException("文件名不能为空"); } + StorageOSSModel ossConfig = properties.getOss(); + long fileSize = file.getSize(); + String contentType = file.getContentType(); + KitFileUtil.checkSize(ossConfig.getMaxSize(), fileSize); + // 按天分组 + String nowDateStr = KitDateUtil.getNowDateStr(); + // 上传到本地临时目录 + File tempFile = KitFileUtil.upload(file, fileLocalUploadHelper.getPath() + nowDateStr + File.separator); + if (tempFile == null) { + throw new BadRequestException("上传失败"); + } + // 校验文件md5, 看是否已存在云端(不确定, 可能云端已经删除, 但是正常来说云端是不允许私自删除的, 所以这里忽略云端不存在的情况) + String md5 = KitFileUtil.getMd5(tempFile); + SystemOssStorageTb systemOssStorageTb = this.getOssStorageByMd5(md5); + if (systemOssStorageTb != null) { + // 重新生成7天链接 + return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); + } + // 上传到OSS + SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); + if (storageTb == null) { + throw new BadRequestException("文件上传失败"); + } + save(storageTb); + return minioRepository.generatePreviewUrl(storageTb.getObjectName()); + } - /** - * 多选删除 - * - * @param ids / - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteFileByIds(Long[] ids) { - for (Long id : ids) { - SystemOssStorageTb storage = getById(id); - minioRepository.removeBucketFile(storage.getObjectName()); - removeById(storage); - } + /** + * 多选删除 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteFileByIds(Long[] ids) { + for (Long id : ids) { + SystemOssStorageTb storage = getById(id); + minioRepository.removeBucketFile(storage.getObjectName()); + removeById(storage); } + } - private SystemOssStorageTb getOssStorageByMd5(String md5) { - return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); - } + private SystemOssStorageTb getOssStorageByMd5(String md5) { + return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml index 5c7d528c..cacbc511 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml @@ -1,18 +1,18 @@ - + diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java index 2afa6062..afb31f2a 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java @@ -15,38 +15,17 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.annotation.AnonymousPostMapping; -import cn.odboy.constant.CaptchaCodeEnum; -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.dal.model.SystemUserInfoVo; -import cn.odboy.system.dal.model.SystemUserJwtVo; import cn.odboy.system.dal.model.SystemUserLoginArgs; -import cn.odboy.system.dal.redis.SystemCacheKey; -import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; -import cn.odboy.system.framework.permission.core.handler.TokenProvider; -import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; -import cn.odboy.util.KitRsaEncryptUtil; -import com.wf.captcha.base.Captcha; +import cn.odboy.system.service.SystemAuthService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -63,97 +42,34 @@ import org.springframework.web.bind.annotation.RestController; public class SystemAuthController { @Autowired - private KitRedisHelper redisHelper; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private TokenProvider tokenProvider; - @Autowired - private AppProperties properties; - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private UserDetailsHandler userDetailsService; + private SystemAuthService systemAuthService; @ApiOperation("登录授权") @AnonymousPostMapping(value = "/login") public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, HttpServletRequest request) throws Exception { - // 密码解密 - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); - // 查询验证码 - String code = redisHelper.get(loginRequest.getUuid(), String.class); - // 清除验证码 - redisHelper.del(loginRequest.getUuid()); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); - } - if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { - throw new BadRequestException("验证码错误"); - } - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); - } - Authentication authentication = - new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - Map authInfo = new HashMap<>(2) {{ - put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); - }}; - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); - } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return ResponseEntity.ok(authInfo); + Map loginInfo = systemAuthService.doLogin(loginRequest, request); + return ResponseEntity.ok(loginInfo); } @ApiOperation("获取用户信息") @PostMapping(value = "/info") public ResponseEntity getUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); - SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); + SystemUserInfoVo userInfoVo = systemAuthService.getCurrentUserInfoVo(); return ResponseEntity.ok(userInfoVo); } @ApiOperation("获取验证码") @AnonymousPostMapping(value = "/captcha/getImage") public ResponseEntity> getCode() { - // 获取运算的结果 - Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); - String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); - //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 - String captchaValue = captcha.text(); - if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && - captchaValue.contains(SystemConst.SYMBOL_DOT)) { - captchaValue = captchaValue.split("\\.")[0]; - } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), - TimeUnit.MINUTES); - // 验证码信息 - Map imgResult = new HashMap(2) {{ - put("img", captcha.toBase64()); - put("uuid", uuid); - }}; + Map imgResult = systemAuthService.getCaptchaInfo(); return ResponseEntity.ok(imgResult); } @ApiOperation("退出登录") @AnonymousPostMapping(value = "/logout") public ResponseEntity logout(HttpServletRequest request) { - String token = tokenProvider.getToken(request); - systemUserOnlineInfoDAO.logoutByToken(token); + systemAuthService.doLogout(request); return ResponseEntity.ok(null); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java index 46a22b1f..2edf0bfb 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java @@ -15,7 +15,6 @@ */ package cn.odboy.system.controller; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.service.SystemEmailService; @@ -55,11 +54,7 @@ public class SystemCaptchaController { @ApiOperation("验证码验证") @PostMapping(value = "/checkEmailCaptcha") public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { - SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); - if (biEnum == null) { - throw new BadRequestException("不支持的业务"); - } - systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); + systemEmailService.checkEmailCaptcha(args); return ResponseEntity.ok(null); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java index 08ff6145..27055947 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java @@ -58,8 +58,7 @@ public class SystemDeptController { @PreAuthorize("@el.check('user:list','dept:list')") public ResponseEntity> queryDept( @Validated @RequestBody KitPageArgs pageArgs) throws Exception { - SystemQueryDeptArgs args = pageArgs.getArgs(); - List depts = systemDeptService.queryAllDeptByArgs(args, true); + List depts = systemDeptService.queryAllDeptByArgs(pageArgs.getArgs(), true); return ResponseEntity.ok(KitPageUtil.toPage(depts)); } @@ -91,11 +90,7 @@ public class SystemDeptController { @PostMapping(value = "/removeDeptByIds") @PreAuthorize("@el.check('dept:del')") public ResponseEntity removeDeptByIds(@RequestBody Set ids) { - // 获取部门, 和其所有子部门 - Set depts = systemDeptService.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - systemDeptService.verifyBindRelationByIds(depts); - systemDeptService.deleteDeptByIds(depts); + systemDeptService.deleteDeptByIds(ids); return ResponseEntity.ok(null); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java index c8698ab0..d8d67e40 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java @@ -66,8 +66,7 @@ public class SystemDictController { public ResponseEntity> queryDictByArgs( @Validated @RequestBody KitPageArgs pageArgs) { Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - SystemQueryDictArgs args = pageArgs.getArgs(); - return ResponseEntity.ok(systemDictService.searchDict(args, page)); + return ResponseEntity.ok(systemDictService.searchDict(pageArgs.getArgs(), page)); } @ApiOperation("新增字典") diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java index 8f46e722..eea619d6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java @@ -25,7 +25,6 @@ import cn.odboy.system.service.SystemDictDetailService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; @@ -58,19 +57,14 @@ public class SystemDictDetailController { @PostMapping(value = "/queryDictDetailByArgs") public ResponseEntity> queryDictDetailByArgs( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryDictDetailArgs args = pageArgs.getArgs(); Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - return ResponseEntity.ok(systemDictDetailService.searchDictDetail(args, page)); + return ResponseEntity.ok(systemDictDetailService.searchDictDetail(pageArgs.getArgs(), page)); } @ApiOperation("查询多个字典详情") @GetMapping(value = "/getDictDetailMaps") public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, systemDictDetailService.listDictDetailByName(name)); - } + Map> dictMap = systemDictDetailService.getDictDetailMap(dictName); return ResponseEntity.ok(dictMap); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java index f1df2b33..2405f4d2 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java @@ -57,9 +57,8 @@ public class SystemJobController { @PreAuthorize("@el.check('job:list','user:list')") public ResponseEntity> queryJobByArgs( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryJobArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemJobService.searchJobByArgs(args, page)); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemJobService.searchJobByArgs(pageArgs.getArgs(), page)); } @ApiOperation("查询岗位") @@ -90,8 +89,6 @@ public class SystemJobController { @PostMapping(value = "/removeJobByIds") @PreAuthorize("@el.check('job:del')") public ResponseEntity removeJobByIds(@RequestBody Set ids) { - // 验证是否被用户关联 - systemJobService.verifyBindRelationByIds(ids); systemJobService.deleteJobByIds(ids); return ResponseEntity.ok(null); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java index 7e38470f..95f14073 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java @@ -17,12 +17,9 @@ package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.constant.FileTypeEnum; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemLocalStorageTb; import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.service.SystemLocalStorageService; -import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -53,9 +50,8 @@ public class SystemLocalStorageController { @PreAuthorize("@el.check('storage:list')") public ResponseEntity> queryLocalStorage( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryStorageArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(localStorageService.searchLocalStorage(args, page)); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(localStorageService.searchLocalStorage(pageArgs.getArgs(), page)); } @ApiOperation("导出数据") @@ -76,12 +72,7 @@ public class SystemLocalStorageController { @ApiOperation("上传图片") @PostMapping("/uploadPicture") public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { - // 判断文件是否为图片 - String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); - if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { - throw new BadRequestException("只能上传图片"); - } - SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); + SystemLocalStorageTb localStorage = localStorageService.uploadPictureV1(file); return ResponseEntity.ok(localStorage); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java index e05581cb..446452a8 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java @@ -15,7 +15,6 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.collection.CollectionUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; @@ -23,17 +22,12 @@ import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.model.SystemMenuVo; import cn.odboy.system.dal.model.SystemQueryMenuArgs; import cn.odboy.system.dal.mysql.SystemMenuMapper; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemMenuService; import cn.odboy.util.KitPageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -66,27 +60,23 @@ public class SystemMenuController { @PostMapping(value = "/buildMenus") @ApiOperation("获取前端所需菜单") public ResponseEntity> buildMenus() { - List menuList = systemMenuService.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); - List menus = systemMenuService.buildMenuTree(menuList); - return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); + List systemMenuVos = systemMenuService.buildFrontMenus(); + return ResponseEntity.ok(systemMenuVos); } @ApiOperation("返回全部的菜单") @PostMapping(value = "/queryMenuListByPid") @PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { - return ResponseEntity.ok(systemMenuService.listMenuByPid(pid)); + List systemMenuTbs = systemMenuService.listMenuByPid(pid); + return ResponseEntity.ok(systemMenuTbs); } @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") @PostMapping(value = "/queryChildMenuSet") @PreAuthorize("@el.check('menu:list','roles:list')") public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { - Set menuSet = new HashSet<>(); - List menuList = systemMenuService.listMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = systemMenuService.queryChildMenuByArgs(menuList, menuSet); - Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); + Set ids = systemMenuService.listChildMenuSetByMenuId(id); return ResponseEntity.ok(ids); } @@ -103,8 +93,7 @@ public class SystemMenuController { @PreAuthorize("@el.check('menu:list')") public ResponseEntity> queryAllMenu( @Validated @RequestBody KitPageArgs pageArgs) throws Exception { - SystemQueryMenuArgs args = pageArgs.getArgs(); - List menuList = systemMenuService.queryAllMenu(args, true); + List menuList = systemMenuService.queryAllMenu(pageArgs.getArgs(), true); return ResponseEntity.ok(KitPageUtil.toPage(menuList)); } @@ -112,23 +101,8 @@ public class SystemMenuController { @PostMapping("/queryMenuSuperior") @PreAuthorize("@el.check('menu:list')") public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { - Set menus; - if (CollectionUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(systemMenuService.listMenuByIds(ids)); - for (SystemMenuTb menu : menus) { - List menuList = systemMenuService.querySuperiorMenuByArgs(menu, new ArrayList<>()); - for (SystemMenuTb data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); - } - return ResponseEntity.ok(systemMenuService.listMenuByPid(null)); + List systemMenuTbs = systemMenuService.listMenuSuperior(ids); + return ResponseEntity.ok(systemMenuTbs); } @ApiOperation("新增菜单") diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java index 6ecb1ec9..3bf61526 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java @@ -19,12 +19,12 @@ import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.model.SystemUserOnlineVo; import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.util.KitDesEncryptUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; +import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -49,28 +49,24 @@ public class SystemOnlineController { @PostMapping @PreAuthorize("@el.check()") public ResponseEntity> queryOnlineUser( - @Validated @RequestBody KitPageArgs args) { - IPage page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); + @Validated @RequestBody KitPageArgs pageArgs) { + IPage page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(pageArgs.getArgs(), page)); } @ApiOperation("导出数据") @GetMapping(value = "/download") @PreAuthorize("@el.check()") public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { - systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( - systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); + List userOnlineVos = systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username); + systemUserOnlineInfoDAO.downloadUserOnlineModelExcel(userOnlineVos, response); } @ApiOperation("踢出用户") @PostMapping(value = "/kickOutUser") @PreAuthorize("@el.check()") public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { - for (String token : keys) { - // 解密Key - token = KitDesEncryptUtil.desDecrypt(token); - systemUserOnlineInfoDAO.logoutByToken(token); - } + systemUserOnlineInfoDAO.kickOutUser(keys); return ResponseEntity.ok(null); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java index 9f214d97..032c29b9 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java @@ -53,9 +53,8 @@ public class SystemOssStorageController { @PreAuthorize("@el.check('storage:list')") public ResponseEntity> queryOssStorage( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryStorageArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemOssStorageService.searchOssStorage(args, page)); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemOssStorageService.searchOssStorage(pageArgs.getArgs(), page)); } @ApiOperation("导出数据") diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java index 51dc185f..cb70923e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java @@ -17,8 +17,6 @@ package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.context.KitSpringBeanHolder; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemQuartzJobTb; import cn.odboy.system.dal.dataobject.SystemQuartzLogTb; import cn.odboy.system.dal.model.SystemQueryQuartzJobArgs; @@ -57,9 +55,8 @@ public class SystemQuartzJobController { @PreAuthorize("@el.check('quartzJob:list')") public ResponseEntity> queryQuartzJobByCrud( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryQuartzJobArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemQuartzJobService.searchQuartzJobByArgs(args, page)); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemQuartzJobService.searchQuartzJobByArgs(pageArgs.getArgs(), page)); } @ApiOperation("导出任务数据") @@ -88,11 +85,6 @@ public class SystemQuartzJobController { @PostMapping(value = "/createQuartzJob") @PreAuthorize("@el.check('quartzJob:add')") public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); systemQuartzJobService.createJob(args); return ResponseEntity.ok(null); } @@ -102,8 +94,6 @@ public class SystemQuartzJobController { @PreAuthorize("@el.check('quartzJob:edit')") public ResponseEntity updateQuartzJob( @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); systemQuartzJobService.updateQuartzJobResumeCron(args); return ResponseEntity.ok(null); } @@ -131,17 +121,4 @@ public class SystemQuartzJobController { systemQuartzJobService.deleteJobByIds(ids); return ResponseEntity.ok(null); } - - /** - * 验证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/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java index 31ae76cf..564f74d6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java @@ -18,21 +18,17 @@ package cn.odboy.system.controller; import cn.hutool.core.lang.Dict; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleVo; -import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemRoleService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -55,7 +51,7 @@ public class SystemRoleController { @ApiOperation("获取单个role") @PostMapping(value = "/queryRoleById") @PreAuthorize("@el.check('roles:list')") - public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { + public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); } @@ -78,22 +74,20 @@ public class SystemRoleController { @PreAuthorize("@el.check('roles:list')") public ResponseEntity> queryRoleByArgs( @Validated @RequestBody KitPageArgs pageArgs) { - SystemQueryRoleArgs args = pageArgs.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemRoleService.searchRoleByArgs(args, page)); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page)); } @ApiOperation("获取用户级别") @PostMapping(value = "/queryRoleLevel") public ResponseEntity queryRoleLevel() { - return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); + return ResponseEntity.ok(systemRoleService.getRoleLevel()); } @ApiOperation("新增角色") @PostMapping(value = "/saveRole") @PreAuthorize("@el.check('roles:add')") public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); systemRoleService.saveRole(args); return ResponseEntity.ok(null); } @@ -102,7 +96,6 @@ public class SystemRoleController { @PostMapping(value = "/modifyRoleById") @PreAuthorize("@el.check('roles:edit')") public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { - checkRoleLevels(args.getLevel()); systemRoleService.updateRoleById(args); return ResponseEntity.ok(null); } @@ -111,8 +104,6 @@ public class SystemRoleController { @PostMapping(value = "/modifyBindMenuById") @PreAuthorize("@el.check('roles:edit')") public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleVo args) { - SystemRoleTb role = systemRoleService.getRoleById(args.getId()); - checkRoleLevels(role.getLevel()); systemRoleService.updateBindMenuById(args); return ResponseEntity.ok(null); } @@ -121,30 +112,7 @@ public class SystemRoleController { @PostMapping(value = "/removeRoleByIds") @PreAuthorize("@el.check('roles:del')") public ResponseEntity removeRoleByIds(@RequestBody Set ids) { - for (Long id : ids) { - SystemRoleTb role = systemRoleService.getRoleById(id); - checkRoleLevels(role.getLevel()); - } - // 验证是否被用户关联 - systemRoleService.verifyBindRelationByIds(ids); systemRoleService.deleteRoleByIds(ids); return ResponseEntity.ok(null); } - - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList()); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } - } - return min; - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java index 54e198cb..0fe9a296 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java @@ -15,15 +15,9 @@ */ package cn.odboy.system.controller; -import cn.hutool.core.collection.CollectionUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; -import cn.odboy.framework.exception.BadRequestException; -import cn.odboy.framework.properties.AppProperties; -import cn.odboy.system.constant.SystemCaptchaBizEnum; -import cn.odboy.system.dal.dataobject.SystemDeptTb; -import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; @@ -31,26 +25,17 @@ import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemDataService; import cn.odboy.system.service.SystemDeptService; -import cn.odboy.system.service.SystemEmailService; -import cn.odboy.system.service.SystemRoleService; import cn.odboy.system.service.SystemUserService; -import cn.odboy.util.KitPageUtil; -import cn.odboy.util.KitRsaEncryptUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -66,20 +51,13 @@ import org.springframework.web.multipart.MultipartFile; @RequestMapping("/api/user") public class SystemUserController { - @Autowired - private PasswordEncoder passwordEncoder; @Autowired private SystemUserService systemUserService; @Autowired private SystemDataService systemDataService; @Autowired private SystemDeptService systemDeptService; - @Autowired - private SystemRoleService systemRoleService; - @Autowired - private SystemEmailService systemEmailService; - @Autowired - private AppProperties properties; + @ApiOperation("导出用户数据") @GetMapping(value = "/download") @@ -91,42 +69,16 @@ public class SystemUserController { @ApiOperation("查询用户") @PostMapping @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserByArgs( - @Validated @RequestBody KitPageArgs pageArgs) { + public ResponseEntity> queryUserByArgs(@Validated @RequestBody KitPageArgs pageArgs) { + String currentUsername = KitSecurityHelper.getCurrentUsername(); Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - SystemQueryUserArgs args = pageArgs.getArgs(); - if (!ObjectUtils.isEmpty(args.getDeptId())) { - args.getDeptIds().add(args.getDeptId()); - // 先查找是否存在子节点 - List data = systemDeptService.listDeptByPid(args.getDeptId()); - // 然后把子节点的ID都加入到集合中 - args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); - } - // 数据权限 - List dataScopes = systemDataService.queryDeptIdByArgs( - systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername())); - // args.getDeptIds() 不为空并且数据权限不为空则取交集 - if (!CollectionUtils.isEmpty(args.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { - // 取交集 - args.getDeptIds().retainAll(dataScopes); - if (!CollectionUtil.isEmpty(args.getDeptIds())) { - return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); - } - } else { - // 否则取并集 - args.getDeptIds().addAll(dataScopes); - return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); - } - return ResponseEntity.ok(KitPageUtil.emptyData()); + return ResponseEntity.ok(systemUserService.aggregationSearchUserByArgs(page, pageArgs.getArgs(), currentUsername)); } @ApiOperation("新增用户") @PostMapping(value = "/saveUser") @PreAuthorize("@el.check('user:add')") public ResponseEntity saveUser(@Validated @RequestBody SystemUserVo args) { - checkLevel(args); - // 默认密码 123456 - args.setPassword(passwordEncoder.encode("123456")); systemUserService.saveUser(args); return ResponseEntity.ok(null); } @@ -135,18 +87,13 @@ public class SystemUserController { @PostMapping(value = "/modifyUserById") @PreAuthorize("@el.check('user:edit')") public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { - checkLevel(args); systemUserService.updateUserById(args); return ResponseEntity.ok(null); } @ApiOperation("修改用户:个人中心") @PostMapping(value = "modifyUserCenterInfoById") - public ResponseEntity modifyUserCenterInfoById( - @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); - } + public ResponseEntity modifyUserCenterInfoById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { systemUserService.updateUserCenterInfoById(args); return ResponseEntity.ok(null); } @@ -155,46 +102,22 @@ public class SystemUserController { @PostMapping(value = "/removeUserByIds") @PreAuthorize("@el.check('user:del')") public ResponseEntity removeUserByIds(@RequestBody Set ids) { - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = Collections.min( - systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) - .collect(Collectors.toList())); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); - } - } systemUserService.removeUserByIds(ids); return ResponseEntity.ok(null); } @ApiOperation("修改密码") @PostMapping(value = "/modifyUserPasswordByUsername") - public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) - throws Exception { - String oldPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); - String newPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(oldPass, user.getPassword())) { - throw new BadRequestException("修改失败,旧密码错误"); - } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - systemUserService.updateUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); + public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) throws Exception { + String currentUsername = KitSecurityHelper.getCurrentUsername(); + systemUserService.updateUserPasswordByUsername(currentUsername, passVo); return ResponseEntity.ok(null); } @ApiOperation("重置密码") @PostMapping(value = "/resetUserPasswordByIds") public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { - String defaultPwd = passwordEncoder.encode("123456"); - systemUserService.resetUserPasswordByIds(ids, defaultPwd); + systemUserService.resetUserPasswordByIds(ids); return ResponseEntity.ok(null); } @@ -206,34 +129,12 @@ public class SystemUserController { @ApiOperation("修改邮箱") @PostMapping(value = "/modifyUserEmailByUsername/{code}") - public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) - throws Exception { - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(password, user.getPassword())) { - throw new BadRequestException("密码错误"); - } - systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserService.updateUserEmailByUsername(user.getUsername(), args.getEmail()); + public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) throws Exception { + String currentUsername = KitSecurityHelper.getCurrentUsername(); + systemUserService.updateUserEmailByUsername(currentUsername, args, code); return ResponseEntity.ok(null); } - /** - * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 - * - * @param args / - */ - private void checkLevel(SystemUserVo args) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); - } - } - @ApiOperation("查询用户基础数据") @PostMapping(value = "/queryUserMetadataOptions") @PreAuthorize("@el.check('user:list')") diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java index 44a34ff3..6eda0e19 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java @@ -15,14 +15,9 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemDeptTb; -import cn.odboy.system.dal.model.SystemQueryDeptArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; import org.apache.ibatis.annotations.Mapper; /** diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java index a6f8fc0e..30b2c4e4 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java @@ -30,5 +30,6 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemDictDetailMapper extends BaseMapper { + IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java index a8fa3642..097da24b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java @@ -15,14 +15,9 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemUserTb; -import cn.odboy.system.dal.model.SystemQueryUserArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; import java.util.Set; import org.apache.ibatis.annotations.Mapper; 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 63af4ff4..7973494b 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 @@ -20,6 +20,7 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -157,4 +158,12 @@ public class SystemUserOnlineInfoDAO { public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { return redisHelper.get(key, SystemUserOnlineVo.class); } + + public void kickOutUser(Set keys) throws Exception { + for (String token : keys) { + // 解密Key + token = KitDesEncryptUtil.desDecrypt(token); + this.logoutByToken(token); + } + } } 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 new file mode 100644 index 00000000..a5b0a510 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java @@ -0,0 +1,117 @@ +package cn.odboy.system.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.odboy.constant.CaptchaCodeEnum; +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.dal.model.SystemUserInfoVo; +import cn.odboy.system.dal.model.SystemUserJwtVo; +import cn.odboy.system.dal.model.SystemUserLoginArgs; +import cn.odboy.system.dal.redis.SystemCacheKey; +import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; +import cn.odboy.system.framework.permission.core.handler.TokenProvider; +import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; +import cn.odboy.util.KitRsaEncryptUtil; +import com.wf.captcha.base.Captcha; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class SystemAuthService { + + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; + + public Map doLogin(SystemUserLoginArgs loginRequest, HttpServletRequest request) throws Exception { + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); + // 查询验证码 + String code = redisHelper.get(loginRequest.getUuid(), String.class); + // 清除验证码 + redisHelper.del(loginRequest.getUuid()); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); + } + if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { + throw new BadRequestException("验证码错误"); + } + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); + // 验证用户密码 + if (!passwordEncoder.matches(password, jwtUser.getPassword())) { + throw new BadRequestException("登录密码错误"); + } + Authentication authentication = + new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map authInfo = new HashMap<>(2) {{ + put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); + }}; + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return authInfo; + } + + public SystemUserInfoVo getCurrentUserInfoVo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); + return BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); + } + + public Map getCaptchaInfo() { + // 获取运算的结果 + Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); + String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); + //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 + String captchaValue = captcha.text(); + if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && + captchaValue.contains(SystemConst.SYMBOL_DOT)) { + captchaValue = captchaValue.split("\\.")[0]; + } + // 保存 + redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), + TimeUnit.MINUTES); + // 验证码信息 + return new HashMap<>(2) {{ + put("img", captcha.toBase64()); + put("uuid", uuid); + }}; + } + + 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/SystemDataService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDataService.java index 1d757f42..20ad9dc6 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 @@ -37,7 +37,7 @@ import org.springframework.stereotype.Service; public class SystemDataService { @Autowired - private SystemRoleService systemRoleService; + private SystemUserRoleService systemUserRoleService; @Autowired private SystemDeptService systemDeptService; @Autowired @@ -52,7 +52,7 @@ public class SystemDataService { public List queryDeptIdByArgs(SystemUserTb user) { List deptIds = new ArrayList<>(); // 查询用户角色 - List roleList = systemRoleService.queryRoleByUsersId(user.getId()); + List roleList = systemUserRoleService.queryRoleByUsersId(user.getId()); // 获取对应的部门ID for (SystemRoleTb role : roleList) { SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); 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 1d383c2c..293c415a 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 @@ -57,9 +57,9 @@ public class SystemDeptService { @Autowired private SystemDeptMapper systemDeptMapper; @Autowired - private SystemUserService systemUserService; + private SystemUserDeptService systemUserDeptService; @Autowired - private SystemRoleService systemRoleService; + private SystemRoleDeptService systemRoleDeptService; /** * 创建 @@ -95,11 +95,15 @@ public class SystemDeptService { /** * 删除 * - * @param deptSet / + * @param ids / */ @Transactional(rollbackFor = Exception.class) - public void deleteDeptByIds(Set deptSet) { - for (SystemDeptTb dept : deptSet) { + public void deleteDeptByIds(Set ids) { + // 获取部门, 和其所有子部门 + Set depts = this.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + this.verifyBindRelationByIds(depts); + for (SystemDeptTb dept : depts) { systemDeptMapper.deleteById(dept.getId()); this.updateDeptSubCnt(dept.getPid()); } @@ -347,10 +351,10 @@ public class SystemDeptService { */ public void verifyBindRelationByIds(Set deptSet) { Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - if (systemUserService.countUserByDeptIds(deptIds) > 0) { + if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); } - if (systemRoleService.countRoleByDeptIds(deptIds) > 0) { + if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java index a6d60314..a9266e9c 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java @@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -134,4 +135,13 @@ public class SystemDictDetailService { return detailVo; }).collect(Collectors.toList()); } + + public Map> getDictDetailMap(String dictName) { + String[] names = dictName.split("[,, ]"); + Map> dictMap = new HashMap<>(16); + for (String name : names) { + dictMap.put(name, this.listDictDetailByName(name)); + } + return dictMap; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java index 514146bb..1971ceb9 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemEmailService.java @@ -24,6 +24,7 @@ import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.dataobject.SystemEmailConfigTb; +import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.dal.model.SystemSendEmailArgs; import cn.odboy.system.dal.mysql.SystemEmailConfigMapper; import cn.odboy.util.KitDesEncryptUtil; @@ -112,7 +113,7 @@ public class SystemEmailService { /** * 校验邮箱验证码 */ - public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { + 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)) { @@ -153,4 +154,12 @@ public class SystemEmailService { SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; } + + public void checkEmailCaptcha(SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); + } + this.checkEmailCaptchaV1(biEnum, args.getEmail(), args.getCode()); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java index 6f2ffdac..10fe05c5 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemJobService.java @@ -84,6 +84,8 @@ public class SystemJobService { */ @Transactional(rollbackFor = Exception.class) public void deleteJobByIds(Set ids) { + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); systemJobMapper.deleteByIds(ids); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java index a5bf2bcd..74e2e712 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemLocalStorageService.java @@ -21,6 +21,8 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; +import cn.odboy.constant.FileTypeEnum; +import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; @@ -180,4 +182,14 @@ public class SystemLocalStorageService { this.injectQueryParams(args, wrapper); return systemLocalStorageMapper.selectList(wrapper); } + + + public SystemLocalStorageTb uploadPictureV1(MultipartFile file) { + // 判断文件是否为图片 + String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); + if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { + throw new BadRequestException("只能上传图片"); + } + return KitSpringBeanHolder.getBean(SystemLocalStorageService.class).uploadFile(null, file); + } } 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 97a3e406..890e1f0c 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 @@ -31,6 +31,7 @@ import cn.odboy.system.dal.model.SystemQueryMenuArgs; import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -40,6 +41,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -64,6 +66,8 @@ public class SystemMenuService { private SystemRoleService systemRoleService; @Autowired private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemUserRoleService systemUserRoleService; /** * 创建 @@ -251,7 +255,7 @@ public class SystemMenuService { * @return / */ public List listMenuByUserId(Long currentUserId) { - List roles = systemRoleService.queryRoleByUsersId(currentUserId); + List roles = systemUserRoleService.queryRoleByUsersId(currentUserId); Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); } @@ -454,4 +458,41 @@ public class SystemMenuService { wrapper.orderByAsc(SystemMenuTb::getMenuSort); return systemMenuMapper.selectList(wrapper); } + + public List buildFrontMenus() { + List menuList = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); + List menus = this.buildMenuTree(menuList); + return this.buildMenuVo(menus); + } + + public Set listChildMenuSetByMenuId(Long id) { + Set menuSet = new HashSet<>(); + List menuList = this.listMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + return menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); + } + + public List listMenuSuperior(List ids) { + Set menus; + List systemMenuTbs; + if (CollectionUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(this.listMenuByIds(ids)); + for (SystemMenuTb menu : menus) { + List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); + for (SystemMenuTb data : menuList) { + if (data.getId().equals(menu.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } + } + menus.addAll(menuList); + } + // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); + systemMenuTbs = this.buildMenuTree(new ArrayList<>(menus)); + } else { + systemMenuTbs = this.listMenuByPid(null); + } + return systemMenuTbs; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java index 67319e12..45ac67f8 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java @@ -20,6 +20,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; +import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.dal.dataobject.SystemQuartzJobTb; @@ -58,6 +59,19 @@ 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,请重新输入!"); + } + } + /** * 创建 * @@ -65,6 +79,11 @@ public class SystemQuartzJobService { */ @Transactional(rollbackFor = Exception.class) public void createJob(SystemQuartzJobTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); + } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); if (!CronExpression.isValidExpression(args.getCronExpression())) { throw new BadRequestException("cron表达式格式错误"); } @@ -79,6 +98,8 @@ public class SystemQuartzJobService { */ @Transactional(rollbackFor = Exception.class) public void updateQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); if (!CronExpression.isValidExpression(args.getCronExpression())) { throw new BadRequestException("cron表达式格式错误"); } 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 eee4ce81..4e81616a 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 @@ -76,4 +76,20 @@ public class SystemRoleDeptService { List deptIds = systemRoleDeptTbs.stream().map(SystemRoleDeptTb::getDeptId).collect(Collectors.toList()); return systemDeptMapper.selectByIds(deptIds); } + + /** + * 根据部门ID统计角色数量 + * + * @param deptIds 部门ID集合 + * @return / + */ + public Long countRoleByDeptIds(Set deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return 0L; + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); + return systemRoleDeptMapper.selectCount(wrapper); + } } 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 7df90004..47e8378d 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 @@ -18,24 +18,19 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; -import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemMenuTb; -import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; -import cn.odboy.system.dal.dataobject.SystemRoleMenuTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleCodeVo; import cn.odboy.system.dal.model.SystemRoleVo; -import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; import cn.odboy.system.dal.mysql.SystemRoleMapper; -import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; -import cn.odboy.system.dal.mysql.SystemUserRoleMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -45,7 +40,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -57,6 +51,7 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleService { + @Autowired private SystemRoleMapper systemRoleMapper; @Autowired @@ -64,11 +59,9 @@ public class SystemRoleService { @Autowired private SystemRoleDeptService systemRoleDeptService; @Autowired - private SystemRoleDeptMapper systemRoleDeptMapper; - @Autowired - private SystemUserRoleMapper systemUserRoleMapper; - @Autowired private SystemUserService systemUserService; + @Autowired + private SystemUserRoleService systemUserRoleService; /** * 创建 @@ -77,6 +70,7 @@ public class SystemRoleService { */ @Transactional(rollbackFor = Exception.class) public void saveRole(SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); if (this.getRoleByName(args.getName()) != null) { throw new BadRequestException("角色名称已存在"); } @@ -100,6 +94,7 @@ public class SystemRoleService { */ @Transactional(rollbackFor = Exception.class) public void updateRoleById(SystemRoleVo args) { + checkRoleLevels(args.getLevel()); SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class); SystemRoleTb role1 = this.getRoleByName(args.getName()); if (role1 != null && !role1.getId().equals(role.getId())) { @@ -123,14 +118,16 @@ public class SystemRoleService { /** * 修改绑定的菜单 * - * @param role / + * @param args / */ - public void updateBindMenuById(SystemRoleVo role) { + public void updateBindMenuById(SystemRoleVo args) { + SystemRoleTb role = systemRoleMapper.selectById(args.getId()); + checkRoleLevels(role.getLevel()); // 更新菜单 systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); // 判断是否为空 - if (CollUtil.isNotEmpty(role.getMenus())) { - systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); + if (CollUtil.isNotEmpty(args.getMenus())) { + systemRoleMenuService.batchInsertRoleMenu(args.getMenus(), role.getId()); } } @@ -141,6 +138,13 @@ public class SystemRoleService { */ @Transactional(rollbackFor = Exception.class) public void deleteRoleByIds(Set ids) { + List roleLevels = systemRoleMapper.selectByIds(ids).stream().map(SystemRoleTb::getLevel).distinct().collect(Collectors.toList()); + for (Integer roleLevel : roleLevels) { + checkRoleLevels(roleLevel); + } + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); + // 删除角色 systemRoleMapper.deleteByIds(ids); // 删除角色部门关联数据、角色菜单关联数据 systemRoleDeptService.batchDeleteRoleDept(ids); @@ -152,7 +156,6 @@ public class SystemRoleService { * * @param roles 待导出的数据 * @param response / - * @throws IOException */ public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); @@ -180,7 +183,7 @@ public class SystemRoleService { * 根据条件查询全部角色 * * @param args 条件 - * @return + * @return / */ public List queryRoleByArgs(SystemQueryRoleArgs args) { // 查询角色基本信息 @@ -199,10 +202,10 @@ public class SystemRoleService { Page rolePage = new Page<>(args.getPage(), args.getSize()); Page page = systemRoleMapper.selectPage(rolePage, wrapper); List roles = page.getRecords(); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); } else { List roles = systemRoleMapper.selectList(wrapper); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); } } @@ -211,7 +214,7 @@ public class SystemRoleService { * * @param args 条件 * @param page 分页参数 - * @return + * @return / */ public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { args.setOffset(page.offset()); @@ -220,41 +223,6 @@ public class SystemRoleService { return KitPageUtil.toPage(roles, total); } - /** - * 根据用户ID查询 - * - * @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); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); - } - - /** - * 根据角色查询角色级别 - * - * @param roles / - * @return / - */ - public Integer getDeptLevelByRoles(Set roles) { - if (CollUtil.isEmpty(roles)) { - return Integer.MAX_VALUE; - } - Set roleSet = new HashSet<>(); - for (SystemRoleTb role : roles) { - roleSet.add(getRoleById(role.getId())); - } - return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); - } /** * 获取用户权限信息 @@ -269,7 +237,7 @@ public class SystemRoleService { permissions.add("admin"); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); } - List roles = this.queryRoleByUsersId(user.getId()); + List roles = systemUserRoleService.queryRoleByUsersId(user.getId()); permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); @@ -286,56 +254,6 @@ public class SystemRoleService { } } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemRoleTb getRoleById(Long id) { - return systemRoleMapper.selectById(id); - } - - /** - * 根据部门ID统计角色数量 - * - * @param deptIds 部门ID集合 - * @return / - */ - public Long countRoleByDeptIds(Set deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return 0L; - } - - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); - return systemRoleDeptMapper.selectCount(wrapper); - } - - /** - * 转换为SystemRoleVo并关联查询菜单和部门信息 - * - * @param role 角色基本信息 - * @return 包含关联信息的SystemRoleVo - */ - private SystemRoleVo convertToRoleVo(SystemRoleTb role) { - if (role == null) { - return null; - } - - SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); - // 查询关联的菜单信息 - Set menus = systemRoleMenuService.queryMenuByRoleIds( - Collections.singleton(role.getId())); - roleVo.setMenus(menus); - - // 查询关联的部门信息 - List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); - roleVo.setDepts(new LinkedHashSet<>(depts)); - - return roleVo; - } - public Long countRoleByArgs(SystemQueryRoleArgs args) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (args != null) { @@ -349,4 +267,33 @@ public class SystemRoleService { } return systemRoleMapper.selectCount(wrapper); } + + public SystemRoleVo getRoleById(Long id) { + SystemRoleTb roleTb = systemRoleMapper.selectById(id); + if (roleTb == null) { + return null; + } + return systemUserRoleService.convertToRoleVo(roleTb); + } + + public Dict getRoleLevel() { + return Dict.create().set("level", checkRoleLevels(null)); + } + + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemUserRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } + } + return min; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java new file mode 100644 index 00000000..e051ae16 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserDeptService.java @@ -0,0 +1,21 @@ +package cn.odboy.system.service; + +import cn.odboy.system.dal.dataobject.SystemUserTb; +import cn.odboy.system.dal.mysql.SystemUserMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class SystemUserDeptService { + + @Autowired + private SystemUserMapper systemUserMapper; + + public long countUserByDeptIds(Set deptIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserTb::getDeptId, deptIds); + return systemUserMapper.selectCount(wrapper); + } +} 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 41a35584..b2424f97 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 @@ -15,14 +15,26 @@ */ package cn.odboy.system.service; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.system.dal.dataobject.SystemDeptTb; +import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserRoleTb; +import cn.odboy.system.dal.model.SystemRoleVo; +import cn.odboy.system.dal.model.SystemUserVo; +import cn.odboy.system.dal.mysql.SystemRoleMapper; import cn.odboy.system.dal.mysql.SystemUserRoleMapper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; 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.Set; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,8 +42,14 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserRoleService { + @Autowired + private SystemRoleMapper systemRoleMapper; @Autowired private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; @Transactional(rollbackFor = Exception.class) public void batchInsertUserRole(Set roles, Long userId) { @@ -55,4 +73,78 @@ public class SystemUserRoleService { systemUserRoleMapper.delete(wrapper); } } + + /** + * 转换为SystemRoleVo并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + public SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; + } + SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIds( + Collections.singleton(role.getId())); + roleVo.setMenus(menus); + + // 查询关联的部门信息 + List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); + roleVo.setDepts(new LinkedHashSet<>(depts)); + + return roleVo; + } + + /** + * 根据用户ID查询 + * + * @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); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + 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())); + } + return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + } + + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + public void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + this.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); + } + } } 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 218a94f9..9ebcb7c9 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 @@ -17,12 +17,15 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; +import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; @@ -30,6 +33,7 @@ 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.SystemQueryUserArgs; +import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.dal.mysql.SystemDeptMapper; import cn.odboy.system.dal.mysql.SystemJobMapper; @@ -42,6 +46,7 @@ import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; +import cn.odboy.util.KitRsaEncryptUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -59,8 +64,11 @@ import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; @Service @@ -69,10 +77,22 @@ public class SystemUserService { @Autowired private SystemUserMapper systemUserMapper; @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired private SystemUserJobService systemUserJobService; @Autowired private SystemUserRoleService systemUserRoleService; @Autowired + private SystemEmailService systemEmailService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemDataService systemDataService; + @Autowired private SystemUserInfoDAO systemUserInfoDAO; @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; @@ -83,11 +103,10 @@ public class SystemUserService { @Autowired private SystemUserRoleMapper systemUserRoleMapper; @Autowired - private SystemJobMapper systemJobMapper; + private AppProperties properties; @Autowired - private SystemRoleMapper systemRoleMapper; - @Autowired - private SystemDeptMapper systemDeptMapper; + private PasswordEncoder passwordEncoder; + /** * 新增用户 @@ -96,6 +115,9 @@ public class SystemUserService { */ @Transactional(rollbackFor = Exception.class) public void saveUser(SystemUserVo args) { + systemUserRoleService.checkLevel(args); + // 默认密码 123456 + args.setPassword(passwordEncoder.encode("123456")); args.setDeptId(args.getDept().getId()); if (this.getUserByUsername(args.getUsername()) != null) { throw new BadRequestException("用户名已存在"); @@ -106,6 +128,7 @@ public class SystemUserService { if (this.getUserByPhone(args.getPhone()) != null) { throw new BadRequestException("手机号已存在"); } + // 保存用户 systemUserMapper.insert(args); // 保存用户岗位 systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); @@ -120,6 +143,7 @@ public class SystemUserService { */ @Transactional(rollbackFor = Exception.class) public void updateUserById(SystemUserVo args) { + systemUserRoleService.checkLevel(args); SystemUserTb user = systemUserMapper.selectById(args.getId()); SystemUserTb user1 = this.getUserByUsername(args.getUsername()); SystemUserTb user2 = this.getUserByEmail(args.getEmail()); @@ -163,6 +187,9 @@ public class SystemUserService { */ @Transactional(rollbackFor = Exception.class) public void updateUserCenterInfoById(SystemUserTb args) { + if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { + throw new BadRequestException("不能修改他人资料"); + } SystemUserTb user = systemUserMapper.selectById(args.getId()); SystemUserTb user1 = this.getUserByPhone(args.getPhone()); if (user1 != null && !user.getId().equals(user1.getId())) { @@ -182,11 +209,26 @@ public class SystemUserService { */ @Transactional(rollbackFor = Exception.class) public void removeUserByIds(Set ids) { + Long currentUserId = KitSecurityHelper.getCurrentUserId(); + // 校验权限 for (Long id : ids) { - // 清理缓存 - SystemUserTb user = systemUserMapper.selectById(id); - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + Integer currentLevel = Collections.min( + systemUserRoleService.queryRoleByUsersId(currentUserId).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemUserRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) + .collect(Collectors.toList())); + if (currentLevel > optLevel) { + throw new BadRequestException( + "角色权限不足, 不能删除:" + this.getUserById(id).getUsername()); + } } + // 清理缓存 + List usernameList = systemUserMapper.selectByIds(ids).stream().map(SystemUserTb::getUsername).distinct().collect(Collectors.toList()); + for (String username : usernameList) { + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } + // 删除用户 systemUserMapper.deleteByIds(ids); // 删除用户岗位 systemUserJobService.batchDeleteUserJob(ids); @@ -197,11 +239,23 @@ public class SystemUserService { /** * 修改密码 * - * @param username 用户名 - * @param encryptPassword 密码 + * @param username 用户名 + * @param args 参数 */ @Transactional(rollbackFor = Exception.class) - public void updateUserPasswordByUsername(String username, String encryptPassword) { + public void updateUserPasswordByUsername(String username, SystemUpdateUserPasswordArgs args) throws Exception { + String oldPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getOldPass()); + String newPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getNewPass()); + SystemUserTb user = this.getUserByUsername(username); + if (!passwordEncoder.matches(oldPass, user.getPassword())) { + throw new BadRequestException("修改失败,旧密码错误"); + } + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + String encryptPassword = passwordEncoder.encode(newPass); systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); systemUserInfoDAO.deleteUserLoginInfoByUserName(username); } @@ -209,21 +263,21 @@ public class SystemUserService { /** * 重置密码 * - * @param ids 用户id - * @param password 密码 + * @param ids 用户id */ @Transactional(rollbackFor = Exception.class) - public void resetUserPasswordByIds(Set ids, String password) { + public void resetUserPasswordByIds(Set ids) { + String defaultPwd = passwordEncoder.encode("123456"); List users = systemUserMapper.selectByIds(ids); // 清除缓存 - users.forEach(user -> { + for (SystemUserTb user : users) { // 清除缓存 systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); // 强制退出 systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); - }); + } // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(password, ids); + systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids); } /** @@ -265,11 +319,19 @@ public class SystemUserService { * 修改邮箱 * * @param username 用户名 - * @param email 邮箱 + * @param args 参数 + * @param code 验证码 */ @Transactional(rollbackFor = Exception.class) - public void updateUserEmailByUsername(String username, String email) { - systemUserMapper.updateUserEmailByUsername(username, email); + public void updateUserEmailByUsername(String username, SystemUserTb args, String code) throws Exception { + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); + SystemUserTb user = this.getUserByUsername(username); + if (!passwordEncoder.matches(password, user.getPassword())) { + throw new BadRequestException("密码错误"); + } + systemEmailService.checkEmailCaptchaV1(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); + systemUserMapper.updateUserEmailByUsername(username, args.getEmail()); systemUserInfoDAO.deleteUserLoginInfoByUserName(username); } @@ -436,13 +498,11 @@ public class SystemUserService { return null; } SystemUserVo userVo = BeanUtil.copyProperties(user, SystemUserVo.class); - // 查询关联的部门信息 if (user.getDeptId() != null) { SystemDeptTb dept = systemDeptMapper.selectById(user.getDeptId()); userVo.setDept(dept); } - // 查询关联的岗位信息 LambdaQueryWrapper jobWrapper = new LambdaQueryWrapper<>(); jobWrapper.eq(SystemUserJobTb::getUserId, user.getId()); @@ -452,7 +512,6 @@ public class SystemUserService { List jobs = systemJobMapper.selectByIds(jobIds); userVo.setJobs(new LinkedHashSet<>(jobs)); } - // 查询关联的角色信息 LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); roleWrapper.eq(SystemUserRoleTb::getUserId, user.getId()); @@ -462,7 +521,6 @@ public class SystemUserService { List roles = systemRoleMapper.selectByIds(roleIds); userVo.setRoles(new LinkedHashSet<>(roles)); } - return userVo; } @@ -477,12 +535,6 @@ public class SystemUserService { return this.convertToUserVo(this.getUserByUsername(username)); } - public long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return systemUserMapper.selectCount(wrapper); - } - public SystemUserTb getUserByEmail(String email) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SystemUserTb::getEmail, email); @@ -496,4 +548,30 @@ public class SystemUserService { wrapper.eq(SystemUserTb::getEnabled, 1); return systemUserMapper.selectOne(wrapper); } + + public KitPageResult aggregationSearchUserByArgs(Page page, SystemQueryUserArgs args, String currentUsername) { + if (!ObjectUtils.isEmpty(args.getDeptId())) { + args.getDeptIds().add(args.getDeptId()); + // 先查找是否存在子节点 + List data = systemDeptService.listDeptByPid(args.getDeptId()); + // 然后把子节点的ID都加入到集合中 + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); + } + // 数据权限 + List dataScopes = systemDataService.queryDeptIdByArgs( + this.getUserByUsername(currentUsername)); + // args.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollectionUtils.isEmpty(args.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { + // 取交集 + args.getDeptIds().retainAll(dataScopes); + if (!CollectionUtil.isEmpty(args.getDeptIds())) { + return this.searchUserByArgs(args, page); + } + } else { + // 否则取并集 + args.getDeptIds().addAll(dataScopes); + return this.searchUserByArgs(args, page); + } + return KitPageUtil.emptyData(); + } } diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml index 5c7d528c..cacbc511 100644 --- a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml +++ b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml @@ -1,18 +1,18 @@ - +