From cf65b4f5ab1684da27761ce68a66d251c13fad73 Mon Sep 17 00:00:00 2001 From: Odboy Date: Wed, 14 Jan 2026 20:20:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(dict):=20=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=98=8E=E7=BB=86=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E9=87=8D=E6=9E=84=E7=B3=BB=E7=BB=9F=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/dal/dataobject/SystemDeptTb.java | 2 +- .../dal/dataobject/SystemDictDetailTb.java | 2 +- .../system/dal/dataobject/SystemDictTb.java | 4 +- .../dal/dataobject/SystemEmailConfigTb.java | 2 +- .../system/dal/dataobject/SystemJobTb.java | 6 +- .../system/dal/dataobject/SystemMenuTb.java | 4 +- .../dal/dataobject/SystemOperationLogTb.java | 2 +- .../dal/dataobject/SystemQuartzJobTb.java | 4 +- .../dal/dataobject/SystemQuartzLogTb.java | 2 +- .../system/dal/dataobject/SystemRoleTb.java | 6 +- .../system/dal/dataobject/SystemUserTb.java | 8 +- .../model/export/SystemDeptExportRowVo.java | 2 +- .../model/export/SystemDictExportRowVo.java | 2 +- .../model/export/SystemJobExportRowVo.java | 2 +- .../export/SystemLocalStorageExportRowVo.java | 2 +- .../model/export/SystemMenuExportRowVo.java | 2 +- .../export/SystemOssStorageExportRowVo.java | 2 +- .../export/SystemQuartzJobExportRowVo.java | 2 +- .../export/SystemQuartzLogExportRowVo.java | 2 +- .../model/export/SystemRoleExportRowVo.java | 2 +- .../model/export/SystemUserExportRowVo.java | 2 +- .../request/SystemCheckEmailCaptchaArgs.java | 2 +- .../model/request/SystemCreateDeptArgs.java | 4 +- .../model/request/SystemCreateDictArgs.java | 2 +- .../request/SystemCreateDictDetailArgs.java | 4 +- .../model/request/SystemCreateJobArgs.java | 4 +- .../model/request/SystemCreateRoleArgs.java | 6 +- .../model/request/SystemQueryDeptArgs.java | 2 +- .../dal/model/request/SystemQueryJobArgs.java | 4 +- .../model/request/SystemQueryMenuArgs.java | 2 +- .../request/SystemQueryQuartzJobArgs.java | 2 +- .../model/request/SystemQueryRoleArgs.java | 2 +- .../model/request/SystemQueryStorageArgs.java | 2 +- .../model/request/SystemQueryUserArgs.java | 4 +- .../model/request/SystemSendEmailArgs.java | 6 +- .../request/SystemUpdateQuartzJobArgs.java | 4 +- .../model/request/SystemUserLoginArgs.java | 2 +- .../dal/model/response/SystemDeptVo.java | 4 +- .../model/response/SystemMenuRouterVo.java | 2 +- .../dal/model/response/SystemMenuVo.java | 4 +- .../response/SystemProductLineTreeVo.java | 2 +- .../dal/model/response/SystemRoleVo.java | 4 +- .../model/response/SystemSimpleUserVo.java | 2 +- .../dal/model/response/SystemUserInfoVo.java | 4 +- .../dal/model/response/SystemUserJwtVo.java | 6 +- .../model/response/SystemUserOnlineVo.java | 2 +- .../dal/model/response/SystemUserVo.java | 8 +- .../dal/mysql/SystemDictDetailMapper.java | 6 +- .../dal/mysql/SystemRoleDeptMapper.java | 4 + .../system/dal/mysql/SystemUserJobMapper.java | 4 + .../system/dal/mysql/SystemUserMapper.java | 2 +- .../dal/mysql/SystemUserRoleMapper.java | 4 + .../dal/redis/SystemUserOnlineInfoDAO.java | 12 +- .../system/service/SystemAuthService.java | 122 +-- .../system/service/SystemCaptchaService.java | 76 +- .../system/service/SystemDataService.java | 116 +-- .../system/service/SystemDeptService.java | 816 +++++++++-------- .../service/SystemDictDetailService.java | 196 ++-- .../system/service/SystemDictService.java | 190 ++-- .../system/service/SystemEmailService.java | 220 ++--- .../system/service/SystemJobService.java | 215 +++-- .../service/SystemLocalStorageService.java | 240 ++--- .../system/service/SystemMenuService.java | 810 +++++++++-------- .../system/service/SystemMonitorService.java | 330 +++---- .../service/SystemOperationLogService.java | 19 +- .../service/SystemOssStorageService.java | 14 +- .../service/SystemQuartzJobService.java | 494 +++++----- .../system/service/SystemRoleDeptService.java | 114 ++- .../system/service/SystemRoleMenuService.java | 120 +-- .../system/service/SystemRoleService.java | 449 +++++---- .../system/service/SystemUserDeptService.java | 16 +- .../system/service/SystemUserJobService.java | 82 +- .../system/service/SystemUserRoleService.java | 220 +++-- .../system/service/SystemUserService.java | 852 +++++++++--------- .../impl/SystemMinioStorageServiceImpl.java | 191 ++-- .../mapper/SystemDictDetailMapper.xml | 39 +- .../resources/mapper/SystemRoleDeptMapper.xml | 10 + .../resources/mapper/SystemUserJobMapper.xml | 11 + .../resources/mapper/SystemUserRoleMapper.xml | 10 + .../dal/mysql/SystemDictDetailMapper.java | 6 +- .../system/service/SystemAuthService.java | 130 +-- .../system/service/SystemCaptchaService.java | 85 +- .../system/service/SystemDataService.java | 110 +-- .../system/service/SystemDeptService.java | 828 ++++++++--------- .../service/SystemDictDetailService.java | 196 ++-- .../system/service/SystemDictService.java | 190 ++-- .../system/service/SystemEmailService.java | 220 ++--- .../system/service/SystemJobService.java | 215 +++-- .../service/SystemLocalStorageService.java | 240 ++--- .../system/service/SystemMenuService.java | 809 +++++++++-------- .../system/service/SystemMonitorService.java | 330 +++---- .../service/SystemOperationLogService.java | 19 +- .../service/SystemOssStorageService.java | 14 +- .../service/SystemQuartzJobService.java | 494 +++++----- .../system/service/SystemRoleDeptService.java | 104 +-- .../system/service/SystemRoleMenuService.java | 120 +-- .../system/service/SystemRoleService.java | 446 +++++---- .../system/service/SystemUserDeptService.java | 16 +- .../system/service/SystemUserJobService.java | 80 +- .../system/service/SystemUserRoleService.java | 215 +++-- .../system/service/SystemUserService.java | 840 ++++++++--------- .../impl/SystemMinioStorageServiceImpl.java | 191 ++-- .../mapper/SystemDictDetailMapper.xml | 39 +- 103 files changed, 6109 insertions(+), 5984 deletions(-) create mode 100644 cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml create mode 100644 cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml create mode 100644 cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java index 873aa146..b7daf633 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java @@ -20,11 +20,11 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import java.util.Objects; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java index 082dae03..caab4087 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java @@ -21,9 +21,9 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotNull; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java index d25eee83..d80bffd0 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java @@ -22,10 +22,10 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java index a687fd4f..13fa3848 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java @@ -19,9 +19,9 @@ import cn.odboy.base.KitObject; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; /** * 邮件配置类,数据存覆盖式存入数据存 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java index 70f57a9b..39574cb0 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java @@ -20,11 +20,11 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.Objects; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java index 0a9f3aa3..3f7d1cd7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java @@ -21,10 +21,10 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotNull; +import java.util.Objects; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java index e32d899d..345c7887 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java @@ -23,10 +23,10 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import java.util.Date; /** *

diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java index 7df2e25e..fe865114 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java @@ -22,10 +22,10 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java index 514c28e4..3a82a0a6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java @@ -22,9 +22,9 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Date; @Data @TableName("system_quartz_log") diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java index 8372251a..342e3371 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java @@ -23,11 +23,11 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.Objects; /** * 角色 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java index 0928b5f4..b89748d3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java @@ -21,13 +21,13 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; -import java.util.Objects; +import lombok.Getter; +import lombok.Setter; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; +import java.util.Date; +import java.util.Objects; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDeptExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDeptExportRowVo.java index 02a9da71..8173a6d6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDeptExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDeptExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDictExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDictExportRowVo.java index 0cd7ff7d..a9ecf480 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDictExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemDictExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemJobExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemJobExportRowVo.java index d4e6f2cd..bfba86f8 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemJobExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemJobExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemLocalStorageExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemLocalStorageExportRowVo.java index 5148a50e..232e082b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemLocalStorageExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemLocalStorageExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemMenuExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemMenuExportRowVo.java index 21c2f4e2..8e5c4c71 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemMenuExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemMenuExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemOssStorageExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemOssStorageExportRowVo.java index da9d765d..552737ed 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemOssStorageExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemOssStorageExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzJobExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzJobExportRowVo.java index 1f35df7e..1e773828 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzJobExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzJobExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzLogExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzLogExportRowVo.java index de272d53..5f536e7a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzLogExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemQuartzLogExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemRoleExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemRoleExportRowVo.java index 549ff2e8..155b57e8 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemRoleExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemRoleExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemUserExportRowVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemUserExportRowVo.java index cb91d952..2ffcecae 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemUserExportRowVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/export/SystemUserExportRowVo.java @@ -2,9 +2,9 @@ package cn.odboy.system.dal.model.export; import cn.idev.excel.annotation.ExcelProperty; import cn.odboy.base.KitObject; -import java.util.Date; import lombok.Getter; import lombok.Setter; +import java.util.Date; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCheckEmailCaptchaArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCheckEmailCaptchaArgs.java index b5d776b1..97a0e8b3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCheckEmailCaptchaArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCheckEmailCaptchaArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; -import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDeptArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDeptArgs.java index 48f2b339..6a4db862 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDeptArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDeptArgs.java @@ -16,10 +16,10 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictArgs.java index 545425df..a18a0341 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; -import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictDetailArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictDetailArgs.java index 99eeb7c7..20b2d686 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictDetailArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateDictDetailArgs.java @@ -17,10 +17,10 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; import cn.odboy.system.dal.dataobject.SystemDictTb; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateJobArgs.java index 3a162e65..3cf210f1 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateJobArgs.java @@ -16,10 +16,10 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateRoleArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateRoleArgs.java index 4a8f6496..f9526661 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateRoleArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemCreateRoleArgs.java @@ -17,11 +17,11 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; import cn.odboy.system.dal.dataobject.SystemDeptTb; -import java.util.Set; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import java.util.Set; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryDeptArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryDeptArgs.java index 008cc29a..73b2b8c5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryDeptArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryDeptArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.util.Date; import java.util.List; -import lombok.Data; @Data public class SystemQueryDeptArgs { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryJobArgs.java index 299d1543..84dd329f 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryJobArgs.java @@ -16,10 +16,10 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; -import java.util.List; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; +import java.util.List; @Data @NoArgsConstructor diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryMenuArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryMenuArgs.java index f7a45ff9..8c2b881e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryMenuArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryMenuArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.util.Date; import java.util.List; -import lombok.Data; @Data public class SystemQueryMenuArgs { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryQuartzJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryQuartzJobArgs.java index 6aebbb30..421a34fa 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryQuartzJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryQuartzJobArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.util.Date; import java.util.List; -import lombok.Data; @Data public class SystemQueryQuartzJobArgs { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryRoleArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryRoleArgs.java index b3771982..38e0aff3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryRoleArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryRoleArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.util.Date; import java.util.List; -import lombok.Data; @Data public class SystemQueryRoleArgs { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryStorageArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryStorageArgs.java index 4e524e5d..befe3996 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryStorageArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryStorageArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.util.Date; import java.util.List; -import lombok.Data; @Data public class SystemQueryStorageArgs { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryUserArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryUserArgs.java index 42ad7160..134c29de 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryUserArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemQueryUserArgs.java @@ -17,12 +17,12 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; -import lombok.Data; -import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemSendEmailArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemSendEmailArgs.java index 3069250f..e289dd29 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemSendEmailArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemSendEmailArgs.java @@ -16,12 +16,12 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; -import java.util.List; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import java.util.List; /** * 发送邮件时,接收参数的类 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUpdateQuartzJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUpdateQuartzJobArgs.java index c568980c..dbe967f3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUpdateQuartzJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUpdateQuartzJobArgs.java @@ -16,10 +16,10 @@ package cn.odboy.system.dal.model.request; import cn.odboy.base.KitObject; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUserLoginArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUserLoginArgs.java index 1b629817..7ffa5127 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUserLoginArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/request/SystemUserLoginArgs.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.request; import io.swagger.annotations.ApiModelProperty; -import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; +import jakarta.validation.constraints.NotBlank; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemDeptVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemDeptVo.java index ae6dba88..e88f92b9 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemDeptVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemDeptVo.java @@ -3,11 +3,11 @@ package cn.odboy.system.dal.model.response; import cn.odboy.base.KitBaseUserTimeTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; import java.util.List; import java.util.Objects; import java.util.Set; -import lombok.Getter; -import lombok.Setter; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuRouterVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuRouterVo.java index d98c65ff..e2303138 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuRouterVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuRouterVo.java @@ -17,9 +17,9 @@ package cn.odboy.system.dal.model.response; import cn.odboy.base.KitObject; import io.swagger.annotations.ApiModelProperty; -import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; /** * 构建前端路由时用到 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuVo.java index 597a02af..fbb7e339 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemMenuVo.java @@ -3,11 +3,11 @@ package cn.odboy.system.dal.model.response; import cn.odboy.base.KitBaseUserTimeTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; import java.util.List; import java.util.Objects; import java.util.Set; -import lombok.Getter; -import lombok.Setter; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemProductLineTreeVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemProductLineTreeVo.java index 91527bee..417025d5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemProductLineTreeVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemProductLineTreeVo.java @@ -16,9 +16,9 @@ package cn.odboy.system.dal.model.response; import cn.odboy.base.KitObject; -import java.util.List; import lombok.Getter; import lombok.Setter; +import java.util.List; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemRoleVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemRoleVo.java index 88a34ce2..92eba2c6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemRoleVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemRoleVo.java @@ -5,10 +5,10 @@ import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import io.swagger.annotations.ApiModelProperty; -import java.util.Objects; -import java.util.Set; import lombok.Getter; import lombok.Setter; +import java.util.Objects; +import java.util.Set; @Getter @Setter diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemSimpleUserVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemSimpleUserVo.java index fd60f0c1..4b2aef64 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemSimpleUserVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemSimpleUserVo.java @@ -20,9 +20,9 @@ import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import io.swagger.annotations.ApiModelProperty; -import java.util.Set; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Set; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserInfoVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserInfoVo.java index 1d435bc4..4d4a6bff 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserInfoVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserInfoVo.java @@ -16,11 +16,11 @@ package cn.odboy.system.dal.model.response; import cn.odboy.base.KitObject; +import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import lombok.Data; -import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserJwtVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserJwtVo.java index 9d47f2ef..5f9c064c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserJwtVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserJwtVo.java @@ -17,12 +17,12 @@ package cn.odboy.system.dal.model.response; import com.alibaba.fastjson2.annotation.JSONField; import io.swagger.annotations.ApiModelProperty; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.security.core.userdetails.UserDetails; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @Getter @AllArgsConstructor diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserOnlineVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserOnlineVo.java index 90d0ad67..1d66b684 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserOnlineVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserOnlineVo.java @@ -16,8 +16,8 @@ package cn.odboy.system.dal.model.response; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; import lombok.Data; +import java.util.Date; /** * 在线用户 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java index 12559de4..3aa00bfb 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/response/SystemUserVo.java @@ -1,18 +1,18 @@ package cn.odboy.system.dal.model.response; +import cn.odboy.base.KitBaseUserTimeTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserTb; import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; import java.util.Date; import java.util.Objects; import java.util.Set; -import lombok.Getter; -import lombok.Setter; @Getter @Setter -public class SystemUserVo extends SystemUserTb { +public class SystemUserVo extends KitBaseUserTimeTb { @ApiModelProperty(value = "ID", hidden = true) private Long id; diff --git a/cutejava-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 255f4607..7771e651 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 @@ -17,11 +17,13 @@ package cn.odboy.system.dal.mysql; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.model.request.SystemQueryDictDetailArgs; +import cn.odboy.system.dal.model.response.SystemDictDetailVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; /** * 字典明细 Mapper @@ -31,5 +33,7 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface SystemDictDetailMapper extends BaseMapper { - IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); + IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); + + List listDictDetailByName(@Param("name") String name); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java index 9b568787..0d5740b4 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java @@ -15,9 +15,12 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import java.util.Set; /** * 角色部门关联 Mapper @@ -27,4 +30,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemRoleDeptMapper extends BaseMapper { + Set listUserDeptByRoleId(@Param("roleId") Long roleId); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java index b43e280f..cb38efbc 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java @@ -15,9 +15,12 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemUserJobTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import java.util.Set; /** * 用户职位关联 Mapper @@ -27,4 +30,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface SystemUserJobMapper extends BaseMapper { + Set listUserJobByUserId(@Param("userId") Long userId); } 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 4bfdd651..1676257e 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 @@ -18,8 +18,8 @@ package cn.odboy.system.dal.mysql; import cn.odboy.system.dal.dataobject.SystemUserTb; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.Set; import org.apache.ibatis.annotations.Mapper; +import java.util.Set; /** * 用户 Mapper diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java index 0a0ecf66..d3937f9c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java @@ -15,11 +15,15 @@ */ package cn.odboy.system.dal.mysql; +import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import java.util.Set; @Mapper public interface SystemUserRoleMapper extends BaseMapper { + Set listUserRoleByUserId(@Param("userId") Long userId); } 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 f172386c..88a7990e 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 @@ -15,17 +15,17 @@ import cn.odboy.util.KitIPUtil; import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; 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; @Slf4j @Component @@ -62,7 +62,7 @@ public class SystemUserOnlineInfoDAO { userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); userOnlineVo.setLoginTime(new Date()); } catch (Exception e) { - log.error(e.getMessage(), e); + log.error("保存在线用户信息失败", e); } String loginKey = tokenProvider.loginKey(token); redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); diff --git a/cutejava-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 index 5d3cc43a..feb4c08b 100644 --- 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 @@ -22,68 +22,82 @@ 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 AppProperties properties; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private TokenProvider tokenProvider; - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private UserDetailsHandler userDetailsService; - @Autowired - private SystemCaptchaService systemCaptchaService; + @Autowired + private AppProperties properties; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; + @Autowired + private SystemCaptchaService systemCaptchaService; - public SystemAuthVo doLogin(SystemUserLoginArgs loginArgs, HttpServletRequest request) throws Exception { - KitValidUtil.notNull(loginArgs); + /** + * 登录 -> TestPassed + */ + public SystemAuthVo doLogin(SystemUserLoginArgs loginArgs, HttpServletRequest request) throws Exception { + KitValidUtil.notNull(loginArgs); - // 密码解密 - String password = KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginArgs.getPassword()); - // 校验验证码 - systemCaptchaService.validate(loginArgs.getUuid(), loginArgs.getCode()); - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginArgs.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginArgs.getPassword()); + // 校验验证码 + systemCaptchaService.validate(loginArgs.getUuid(), loginArgs.getCode()); + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginArgs.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 与 用户信息 + SystemAuthVo authInfo = new SystemAuthVo(); + authInfo.setToken(String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + /// 这里是为了清空密码 + authInfo.setUser(KitBeanUtil.copyToClass(jwtUser, SystemUserInfoVo.class)); + + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginArgs.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return authInfo; } - // 登录验证 - Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - SystemAuthVo authInfo = new SystemAuthVo(); - authInfo.setToken(String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - /// 这里是为了清空密码 - authInfo.setUser(KitBeanUtil.copyToClass(jwtUser, SystemUserInfoVo.class)); - - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginArgs.getUsername()); + /** + * 获取当前登录人信息 -> TestPassed + */ + public SystemUserJwtVo getCurrentUserInfo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo)KitSecurityHelper.getCurrentUser(); + if (jwtUser.getUser() != null) { + jwtUser.getUser().setPassword(null); + } + return jwtUser; } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return authInfo; - } - public SystemUserJwtVo getCurrentUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); - if (jwtUser.getUser() != null) { - jwtUser.getUser().setPassword(null); + /** + * 退出登录 -> TestPassed + */ + public void doLogout(HttpServletRequest request) { + String token = tokenProvider.getToken(request); + systemUserOnlineInfoDAO.logoutByToken(token); } - return jwtUser; - } - - 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/SystemCaptchaService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java index 1de7cbcd..2a6776e3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java @@ -10,9 +10,9 @@ import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.dal.model.response.SystemCaptchaVo; import cn.odboy.system.dal.redis.SystemCacheKey; import com.wf.captcha.base.Captcha; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.concurrent.TimeUnit; /** * 验证码 @@ -20,40 +20,50 @@ import org.springframework.stereotype.Service; @Service public class SystemCaptchaService { - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private AppProperties properties; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; - public SystemCaptchaVo getLoginCaptcha() { - // 获取运算的结果 - 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]; + /** + * 获取登录验证码 -> TestPassed + */ + public SystemCaptchaVo getLoginCaptcha() { + // 获取运算的结果 + 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); + // 验证码信息 + SystemCaptchaVo captchaVo = new SystemCaptchaVo(); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.toBase64()); + return captchaVo; } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), TimeUnit.MINUTES); - // 验证码信息 - SystemCaptchaVo captchaVo = new SystemCaptchaVo(); - captchaVo.setUuid(uuid); - captchaVo.setImg(captcha.toBase64()); - return captchaVo; - } - public void validate(String uuid, String inputCode) { - // 查询验证码 - String code = redisHelper.get(uuid, String.class); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); + /** + * 验证验证码 -> TestPassed + * + * @param uuid 验证码uuid + * @param inputCode 用户输入的验证码 + */ + public void validate(String uuid, String inputCode) { + // 查询验证码 + String code = redisHelper.get(uuid, String.class); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); + } + // 清除验证码 + redisHelper.del(uuid); + if (StrUtil.isBlank(inputCode) || !code.equalsIgnoreCase(inputCode)) { + throw new BadRequestException("验证码错误"); + } } - // 清除验证码 - redisHelper.del(uuid); - if (StrUtil.isBlank(inputCode) || !code.equalsIgnoreCase(inputCode)) { - throw new BadRequestException("验证码错误"); - } - } } 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 caf6a3b6..fa552094 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 @@ -18,74 +18,80 @@ package cn.odboy.system.service; import cn.hutool.core.collection.CollUtil; import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; -import cn.odboy.system.dal.model.response.SystemDeptVo; -import cn.odboy.system.dal.model.response.SystemRoleVo; +import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.response.SystemUserVo; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; /** - * 数据权限 Service + * 数据权限 * * @author odboy */ @Service public class SystemDataService { - @Autowired - private SystemUserRoleService systemUserRoleService; - @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(SystemUserVo user) { - List deptIds = new ArrayList<>(); - // 查询用户角色 - List roleList = systemUserRoleService.queryRoleByUsersId(user.getId()); - // 获取对应的部门ID - for (SystemRoleVo 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<>(); - } + /** + * 获取数据权限 -> TestPassed + * + * @param user / + * @return / + */ + public List queryDeptIdByArgs(SystemUserVo user) { + List deptIds = new ArrayList<>(); + // 查询用户角色 + Set roleList = systemUserRoleService.listUserRoleByUserId(user.getId()); + // 获取对应的部门ID + for (SystemRoleTb role : roleList) { + SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); + switch (Objects.requireNonNull(dataScopeEnum)) { + case THIS_LEVEL: + Long currentDeptId = user.getDept().getId(); + deptIds.add(currentDeptId); + break; + case CUSTOMIZE: + // 优化 283ms -> 51 ms + List customDeptIds = this.queryCustomDataPermissionByArgs(deptIds, role.getId()); + deptIds.addAll(customDeptIds); + break; + default: + return new ArrayList<>(); + } + } + return deptIds.stream().distinct().collect(Collectors.toList()); } - return deptIds.stream().distinct().collect(Collectors.toList()); - } - /** - * 获取自定义的数据权限 - * - * @param deptIds 部门ID - * @param role 角色 - * @return 数据权限ID - */ - private List queryCustomDataPermissionByArgs(List deptIds, SystemRoleVo 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)); - } + /** + * 获取自定义的数据权限 -> TestPassed + * + * @param deptIds 部门ID(外部数据) + * @param roleId 角色ID + * @return 数据权限ID(所有部门ID数据) + */ + private List queryCustomDataPermissionByArgs(List deptIds, Long roleId) { + Set deptList = systemRoleDeptService.listUserDeptByRoleId(roleId); + Map> deptPidMap = + systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid)); + for (SystemDeptTb dept : deptList) { + deptIds.add(dept.getId()); + List deptChildren = deptPidMap.getOrDefault(dept.getId(), null); + if (CollUtil.isNotEmpty(deptChildren)) { + deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren, deptPidMap)); + } + } + return deptIds; } - 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 53f10b1d..f784329f 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 @@ -16,7 +16,6 @@ package cn.odboy.system.service; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; @@ -37,6 +36,10 @@ import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import jakarta.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; @@ -48,439 +51,458 @@ 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; @Service public class SystemDeptService { - @Autowired - private SystemDeptMapper systemDeptMapper; - @Autowired - private SystemUserDeptService systemUserDeptService; - @Autowired - private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserDeptService systemUserDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDept(SystemCreateDeptArgs args) { - KitValidUtil.notNull(args); - systemDeptMapper.insert(KitBeanUtil.copyToClass(args, SystemDeptTb.class)); - this.updateDeptSubCnt(args.getPid()); - } + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDept(SystemCreateDeptArgs args) { + KitValidUtil.notNull(args); - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDeptById(SystemDeptTb args) { - KitValidUtil.notNull(args); - // 旧的父部门 - Long oldPid = this.getDeptVoById(args.getId()).getPid(); - // 新的父部门 - Long newPid = args.getPid(); - if (args.getPid() != null && args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); + SystemDeptTb record = KitBeanUtil.copyToClass(args, SystemDeptTb.class); + systemDeptMapper.insert(record); + + this.updateDeptSubCnt(args.getPid()); } - SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); - args.setId(dept.getId()); - systemDeptMapper.insertOrUpdate(args); - this.updateDeptSubCnt(oldPid); - this.updateDeptSubCnt(newPid); - } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDeptByIds(Set ids) { - // 获取部门, 和其所有子部门 - Set depts = this.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - this.verifyBindRelationByIds(depts); - for (SystemDeptVo dept : depts) { - systemDeptMapper.deleteById(dept.getId()); - this.updateDeptSubCnt(dept.getPid()); - } - } - - /** - * 更新父节点中子节点数目 - * - * @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) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); - wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); - wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); - wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); - wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemDeptTb::getDeptSort); - return systemDeptMapper.selectList(wrapper); - } - - /** - * 查询所有数据 - * - * @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; + /** + * 编辑 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptById(SystemDeptTb args) { + KitValidUtil.notNull(args); + // 旧的父部门 + Long oldPid = this.getDeptById(args.getId()).getPid(); + // 新的父部门 + Long newPid = args.getPid(); + if (args.getPid() != null && args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); } - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; + SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); + args.setId(dept.getId()); + systemDeptMapper.updateById(args); + this.updateDeptSubCnt(oldPid); + this.updateDeptSubCnt(newPid); + } + + /** + * 根据部门id获取部门信息 -> TestPassed + * + * @param id 部门id + * @return / + */ + private SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDeptByIds(Set ids) { + // 获取部门, 和其所有子部门 + Set depts = this.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + this.verifyBindRelationByIds(depts); + for (SystemDeptVo dept : depts) { + systemDeptMapper.deleteById(dept.getId()); + this.updateDeptSubCnt(dept.getPid()); } - } } - // 数据权限 - args.setIds(KitSecurityHelper.getCurrentUserDataScope()); - List list = this.queryDeptByArgs(args); - // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 - if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); - } - return list; - } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemDeptVo getDeptVoById(Long id) { - return KitBeanUtil.copyToClass(systemDeptMapper.selectById(id), SystemDeptVo.class); - } - - /** - * 获取部门下所有关联的部门 - * - * @param deptTbList / - * @param depts / - */ - private void queryRelationDeptByArgs(List deptTbList, Set depts) { - for (SystemDeptVo dept : deptTbList) { - depts.add(dept); - List deptList = this.listDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } - } - } - - public List queryChildDeptIdByDeptIds(List deptList) { - List list = new ArrayList<>(); - for (SystemDeptVo systemDeptTb : deptList) { - if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = this.listDeptByPid(systemDeptTb.getId()); - if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(queryChildDeptIdByDeptIds(deptList1)); + /** + * 更新父节点中子节点数目 -> TestPassed + * + * @param deptId / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptSubCnt(Long deptId) { + if (deptId != null) { + long count = this.countDeptByPid(deptId); + systemDeptMapper.updateDeptSubCountById(count, deptId); } - list.add(systemDeptTb.getId()); - } } - return list; - } - /** - * 根据ID获取同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(this.listRootDept()); - return deptList; + private long countDeptByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return systemDeptMapper.selectCount(wrapper); } - deptList.addAll(this.listDeptByPid(dept.getPid())); - return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); - } - private List listRootDept() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); - } - - /** - * 构建树形数据 - * - * @return / - */ - public KitPageResult searchDeptTree(List ids, Boolean exclude) { - Set deptSet1 = new LinkedHashSet<>(); - for (Long id : ids) { - // 同级数据 - SystemDeptVo dept = this.getDeptVoById(id); - // 上级数据 - List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); - if (exclude) { - for (SystemDeptVo data : depts) { - if (data.getId().equals(dept.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } + /** + * 筛选出 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); + } } - // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); - } - deptSet1.addAll(depts); + return deptList; } - List deptList = new ArrayList<>(deptSet1); - // 构建部门树 - Set trees = new LinkedHashSet<>(); - Set deptSet = new LinkedHashSet<>(); - List deptNames = deptList.stream().map(SystemDeptVo::getName).collect(Collectors.toList()); - boolean isChild; - for (SystemDeptVo dept : deptList) { - isChild = false; - if (dept.getPid() == null) { - trees.add(dept); - } - for (SystemDeptVo 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); + + private List queryDeptByArgs(SystemQueryDeptArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); + wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); + wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); + wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); + wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); } - } - if (isChild) { - deptSet.add(dept); - } else if (dept.getPid() != null && !deptNames.contains(this.getDeptVoById(dept.getPid()).getName())) { - deptSet.add(dept); - } + wrapper.orderByAsc(SystemDeptTb::getDeptSort); + return systemDeptMapper.selectList(wrapper); } - if (CollectionUtil.isEmpty(trees)) { - trees = deptSet; + + /** + * 查询所有数据 + * + * @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; } - KitPageResult baseResult = new KitPageResult<>(); - baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); - baseResult.setTotalElements(deptSet.size()); - return baseResult; - } - /** - * 验证是否被角色或用户关联 - * - * @param deptSet / - */ - public void verifyBindRelationByIds(Set deptSet) { - Set deptIds = deptSet.stream().map(SystemDeptVo::getId).collect(Collectors.toSet()); - if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemDeptVo getDeptVoById(Long id) { + return KitBeanUtil.copyToClass(systemDeptMapper.selectById(id), SystemDeptVo.class); } - if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + + /** + * 获取部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + */ + private void queryRelationDeptByArgs(List deptTbList, Set depts) { + for (SystemDeptVo dept : deptTbList) { + depts.add(dept); + List deptList = this.listDeptVoByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } } - } - private List listEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return systemDeptMapper.selectList(wrapper); - } - - /** - * 遍历所有部门和子部门 - * - * @param ids / - */ - public Set traverseDeptByIdWithPids(Set ids) { - Set depts = new HashSet<>(); - for (Long id : ids) { - // 根部门 - depts.add(this.getDeptVoById(id)); - // 子部门 - List deptList = this.listDeptByPid(id); - if (CollectionUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } + private List listDeptVoByPid(Long pid) { + return KitBeanUtil.copyToList(this.listDeptByPid(pid), SystemDeptVo.class); } - return depts; - } - public List listDeptSelectDataSource() { - List depts = this.listEnabledDepts(); - return buildDeptSelectOptions(depts); - } - - private List buildDeptSelectOptions(List depts) { - // 获取所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - // 构建部门ID路径 - List pathIds = new ArrayList<>(); - buildDeptIdPath(dept, deptMap, pathIds); - // 反转路径,从顶级部门到当前部门 - Collections.reverse(pathIds); - SystemProductLineVo dto = new SystemProductLineVo(); - dto.setValue(dept.getId()); - dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); - // 保留名称路径用于显示 - dto.setLabel(buildNamePath(dept, deptMap)); - options.add(dto); + public List queryChildDeptIdByDeptIds(List deptList, Map> deptPidMap) { + List list = new ArrayList<>(); + for (SystemDeptTb systemDeptTb : deptList) { + if (systemDeptTb != null && systemDeptTb.getEnabled()) { + List deptList1 = deptPidMap.getOrDefault(systemDeptTb.getId(), null); + if (CollUtil.isNotEmpty(deptList1)) { + list.addAll(this.queryChildDeptIdByDeptIds(deptList1, deptPidMap)); + } + list.add(systemDeptTb.getId()); + } + } + return list; } - // 按部门名称路径排序 - 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); + /** + * 根据ID获取同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(this.listRootDept()); + return deptList; + } + deptList.addAll(this.listDeptVoByPid(dept.getPid())); + return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); } - } - private 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); + private List listRootDept() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemDeptTb::getPid); + return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); } - } - public List listDeptSelectProDataSource() { - 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); - } + /** + * 构建树形数据 + * + * @return / + */ + public KitPageResult searchDeptTree(List ids, Boolean exclude) { + Set deptSet1 = new LinkedHashSet<>(); + for (Long id : ids) { + // 同级数据 + SystemDeptVo dept = this.getDeptVoById(id); + // 上级数据 + List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); + if (exclude) { + for (SystemDeptVo 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); + } + List deptList = new ArrayList<>(deptSet1); + // 构建部门树 + Set trees = new LinkedHashSet<>(); + Set deptSet = new LinkedHashSet<>(); + List deptNames = deptList.stream().map(SystemDeptVo::getName).collect(Collectors.toList()); + boolean isChild; + for (SystemDeptVo dept : deptList) { + isChild = false; + if (dept.getPid() == null) { + trees.add(dept); + } + for (SystemDeptVo 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.getDeptVoById(dept.getPid()).getName())) { + deptSet.add(dept); + } + } + if (CollUtil.isEmpty(trees)) { + trees = deptSet; + } + KitPageResult baseResult = new KitPageResult<>(); + baseResult.setContent(CollUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); + baseResult.setTotalElements(deptSet.size()); + return baseResult; } - // 按排序字段排序 - 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)); - } + /** + * 验证是否被角色或用户关联 + * + * @param deptSet / + */ + public void verifyBindRelationByIds(Set deptSet) { + Set deptIds = deptSet.stream().map(SystemDeptVo::getId).collect(Collectors.toSet()); + if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); + } + if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + } } - // 子部门按排序字段排序 - 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 KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); - } - - public void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { - List systemDeptTbs = this.queryAllDeptByArgs(args, false); - List rowVos = new ArrayList<>(); - for (SystemDeptTb dataObject : systemDeptTbs) { - SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + private List listEnabledDepts() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + return systemDeptMapper.selectList(wrapper); + } + + /** + * 遍历所有部门和子部门 + * + * @param ids / + */ + public Set traverseDeptByIdWithPids(Set ids) { + Set depts = new HashSet<>(); + for (Long id : ids) { + // 根部门 + depts.add(this.getDeptVoById(id)); + // 子部门 + List deptList = this.listDeptVoByPid(id); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } + return depts; + } + + public List listDeptSelectDataSource() { + List depts = this.listEnabledDepts(); + return buildDeptSelectOptions(depts); + } + + private List buildDeptSelectOptions(List depts) { + // 获取所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + for (SystemDeptTb dept : depts) { + // 构建部门ID路径 + List pathIds = new ArrayList<>(); + buildDeptIdPath(dept, deptMap, pathIds); + // 反转路径,从顶级部门到当前部门 + Collections.reverse(pathIds); + SystemProductLineVo dto = new SystemProductLineVo(); + dto.setValue(dept.getId()); + dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); + // 保留名称路径用于显示 + dto.setLabel(buildNamePath(dept, deptMap)); + options.add(dto); + } + // 按部门名称路径排序 + options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); + return options; + } + + private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { + pathIds.add(dept.getId()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); + } + } + + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } + + private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { + pathNames.add(dept.getName()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); + } + } + + public List listDeptSelectProDataSource() { + 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 void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { + List systemDeptTbs = this.queryAllDeptByArgs(args, false); + List rowVos = new ArrayList<>(); + for (SystemDeptTb dataObject : systemDeptTbs) { + SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); + } + + public List listPidNonNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + wrapper.isNotNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); } - KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); - } } 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 19c9b210..eb12357e 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,120 +31,122 @@ import cn.odboy.util.KitValidUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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; @Service public class SystemDictDetailService { - @Autowired - private SystemDictDetailMapper systemDictDetailMapper; - @Autowired - private SystemDictMapper systemDictMapper; + @Autowired + private SystemDictDetailMapper systemDictDetailMapper; + @Autowired + private SystemDictMapper systemDictMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDictDetail(SystemCreateDictDetailArgs args) { - KitValidUtil.notNull(args); - KitValidUtil.notNull(args.getDict()); - SystemDictDetailTb dictDetail = KitBeanUtil.copyToClass(args, SystemDictDetailTb.class); - dictDetail.setDictId(args.getDict().getId()); - systemDictDetailMapper.insert(dictDetail); - } - - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDictDetailById(SystemDictDetailTb args) { - SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); - args.setId(dictDetail.getId()); - systemDictDetailMapper.insertOrUpdate(args); - } - - /** - * 删除 - * - * @param id / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDictDetailById(Long id) { - systemDictDetailMapper.deleteById(id); - } - - @Transactional(rollbackFor = Exception.class) - public void deleteDictDetailByDictIds(Set ids) { - if (CollUtil.isNotEmpty(ids)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemDictDetailTb::getDictId, ids); - systemDictDetailMapper.delete(wrapper); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDictDetail(SystemCreateDictDetailArgs args) { + KitValidUtil.notNull(args); + KitValidUtil.notNull(args.getDict()); + SystemDictDetailTb dictDetail = KitBeanUtil.copyToClass(args, SystemDictDetailTb.class); + dictDetail.setDictId(args.getDict().getId()); + systemDictDetailMapper.insert(dictDetail); } - } - private List listDictDetailByDictId(Long dictId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDictDetailTb::getDictId, dictId); - return systemDictDetailMapper.selectList(wrapper); - } + /** + * 编辑 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDictDetailById(SystemDictDetailTb args) { + SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); + args.setId(dictDetail.getId()); + systemDictDetailMapper.insertOrUpdate(args); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, Page page) { - IPage iPage = systemDictDetailMapper.selectPageByArgs(page, args).convert(i -> KitBeanUtil.copyToClass(i, SystemDictDetailVo.class)); - List dictIds = iPage.getRecords().stream().map(SystemDictDetailVo::getDictId).collect(Collectors.toList()); - Map id2ItemMap = systemDictMapper.selectByIds(dictIds).stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); - for (SystemDictDetailVo record : iPage.getRecords()) { - record.setDict(id2ItemMap.get(record.getDictId())); + /** + * 删除 -> TestPassed + * + * @param id / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictDetailById(Long id) { + systemDictDetailMapper.deleteById(id); } - return KitPageUtil.toPage(iPage); - } - /** - * 根据字典名称获取字典详情 - * - * @param name 字典名称 - * @return / - */ - public List listDictDetailByName(String name) { - if (StrUtil.isBlank(name)) { - return new ArrayList<>(); + @Transactional(rollbackFor = Exception.class) + public void deleteDictDetailByDictIds(Set ids) { + if (CollUtil.isNotEmpty(ids)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemDictDetailTb::getDictId, ids); + systemDictDetailMapper.delete(wrapper); + } } - SystemDictTb systemDictTb = systemDictMapper.getByName(name); - if (systemDictTb == null) { - return new ArrayList<>(); - } - List detailTbs = this.listDictDetailByDictId(systemDictTb.getId()); - List detailVos = KitBeanUtil.copyToList(detailTbs, SystemDictDetailVo.class); - for (SystemDictDetailVo detailVo : detailVos) { - detailVo.setDict(systemDictTb); - } - return detailVos; - } - public Map> getDictDetailMap(String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, this.listDictDetailByName(name)); + /** + * 分页查询 -> TestPassed + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, + Page page) { + IPage iPage = systemDictDetailMapper.selectPageByArgs(page, args); + List dictIds = + iPage.getRecords().stream().map(SystemDictDetailVo::getDictId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(dictIds)) { + Map id2ItemMap = + systemDictMapper.selectByIds(dictIds).stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); + for (SystemDictDetailVo record : iPage.getRecords()) { + record.setDict(id2ItemMap.get(record.getDictId())); + } + } + return KitPageUtil.toPage(iPage); + } + + /** + * 根据字典名称获取字典详情 -> TestPassed + * + * @param name 字典名称 + * @return / + */ + public List listDictDetailByName(String name) { + if (StrUtil.isBlank(name)) { + return new ArrayList<>(); + } + List detailVos = systemDictDetailMapper.listDictDetailByName(name); + if (CollUtil.isNotEmpty(detailVos)) { + SystemDictDetailVo systemDictDetailVo = detailVos.stream().findFirst().orElse(null); + if (systemDictDetailVo != null) { + SystemDictTb systemDictTb = systemDictMapper.selectById(systemDictDetailVo.getDictId()); + if (systemDictTb != null) { + for (SystemDictDetailVo detailVo : detailVos) { + detailVo.setDict(systemDictTb); + } + } + } + } + return detailVos; + } + + 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; } - 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 482bdac2..698c24a1 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,111 +29,111 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.List; -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; +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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) { - SystemDictTb dictTb = KitBeanUtil.copyToClass(args, SystemDictTb.class); - systemDictMapper.insert(dictTb); - } - - /** - * 编辑 - * - * @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 args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.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())); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDict(SystemCreateDictArgs args) { + SystemDictTb dictTb = KitBeanUtil.copyToClass(args, SystemDictTb.class); + systemDictMapper.insert(dictTb); } - } - public List queryDictByArgs(SystemQueryDictArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(args, wrapper); - return systemDictMapper.selectList(wrapper); - } + /** + * 编辑 -> TestPassed + * + * @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); + } - public void exportDictXlsx(HttpServletResponse response, SystemQueryDictArgs args) { - List systemDictTbs = this.queryDictByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemDictTb dataObject : systemDictTbs) { - List dictDetails = systemDictDetailService.listDictDetailByName(dataObject.getName()); - if (CollUtil.isEmpty(dictDetails)) { - SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVo.setLabel(""); - rowVo.setValue(""); - rowVos.add(rowVo); - continue; - } - for (SystemDictDetailVo dictDetail : dictDetails) { - SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVo.setLabel(dictDetail.getLabel()); - rowVo.setValue(dictDetail.getValue()); - rowVos.add(rowVo); - } + /** + * 删除 -> TestPassed + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictByIds(Set ids) { + // 删除字典 + systemDictMapper.deleteByIds(ids); + // 删除字典详情 + systemDictDetailService.deleteDictDetailByDictIds(ids); + } + + /** + * 分页查询 -> TestPassed + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.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())); + } + } + + public List queryDictByArgs(SystemQueryDictArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemDictMapper.selectList(wrapper); + } + + public void exportDictXlsx(HttpServletResponse response, SystemQueryDictArgs args) { + List systemDictTbs = this.queryDictByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemDictTb dataObject : systemDictTbs) { + List dictDetails = systemDictDetailService.listDictDetailByName(dataObject.getName()); + if (CollUtil.isEmpty(dictDetails)) { + SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVo.setLabel(""); + rowVo.setValue(""); + rowVos.add(rowVo); + continue; + } + for (SystemDictDetailVo dictDetail : dictDetails) { + SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVo.setLabel(dictDetail.getLabel()); + rowVo.setValue(dictDetail.getValue()); + rowVos.add(rowVo); + } + } + KitExcelExporter.exportSimple(response, "字典数据", SystemDictExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "字典数据", SystemDictExportRowVo.class, rowVos); - } } 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 6bb644f0..8fb0cca6 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 @@ -30,134 +30,134 @@ import cn.odboy.system.dal.model.request.SystemSendEmailArgs; import cn.odboy.system.dal.mysql.SystemEmailConfigMapper; import cn.odboy.util.KitDesEncryptUtil; import cn.odboy.util.KitResourceTemplateUtil; -import java.util.Collections; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; @Slf4j @Service public class SystemEmailService { - @Autowired - private SystemEmailConfigMapper systemEmailConfigMapper; - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private AppProperties properties; + @Autowired + private SystemEmailConfigMapper systemEmailConfigMapper; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; - /** - * 更新邮件配置 - * - * @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())); + /** + * 更新邮件配置 -> TestPassed + * + * @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); } - systemEmailConfigTb.setId(1L); - systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb); - } - /** - * 发送邮件 - * - * @param sendEmailRequest 邮件发送的内容 - */ - public void sendEmail(SystemSendEmailArgs sendEmailRequest) { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (systemEmailConfigTb.getId() == null) { - throw new BadRequestException("请先配置, 再操作"); + /** + * 发送邮件 -> TestPassed + * + * @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("邮件发送失败"); + } } - // 封装 - 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 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); + /** + * 校验邮箱验证码 -> TestPassed + */ + public void checkEmailCaptchaV1(SystemCaptchaBizEnum biEnum, String email, String code) { + String redisKey = biEnum.getRedisKey() + email; + String value = redisHelper.get(redisKey, String.class); + if (value == null || !value.equals(code)) { + throw new BadRequestException("无效验证码"); + } else { + redisHelper.del(redisKey); + } } - } - /** - * 发送给邮箱验证码 - */ - public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { - if (biEnum == null) { - throw new BadRequestException("biEnum必填"); + /** + * 发送给邮箱验证码 + */ + 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), SystemConst.CURRENT_APP_TITLE, content); + sendEmail(sendEmailRequest); } - 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), SystemConst.CURRENT_APP_TITLE, 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("不支持的业务"); + public void checkEmailCaptcha(SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); + } + this.checkEmailCaptchaV1(biEnum, args.getEmail(), args.getCode()); } - 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 5ef1e678..5a152bf2 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 @@ -29,130 +29,129 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.List; -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; +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @Service public class SystemJobService { - @Autowired - private SystemJobMapper systemJobMapper; - @Autowired - private SystemUserJobService systemUserJobService; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemUserJobService systemUserJobService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveJob(SystemCreateJobArgs args) { - SystemJobTb job = this.getJobByName(args.getName()); - if (job != null) { - throw new BadRequestException("职位名称已存在"); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveJob(SystemCreateJobArgs args) { + SystemJobTb job = this.getJobByName(args.getName()); + if (job != null) { + throw new BadRequestException("职位名称已存在"); + } + SystemJobTb systemJobTb = KitBeanUtil.copyToClass(args, SystemJobTb.class); + systemJobMapper.insert(systemJobTb); } - SystemJobTb systemJobTb = KitBeanUtil.copyToClass(args, SystemJobTb.class); - systemJobMapper.insert(systemJobTb); - } - /** - * 编辑 - * - * @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("职位名称已存在"); + /** + * 编辑 -> TestPassed + * + * @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.updateById(args); } - args.setId(job.getId()); - systemJobMapper.insertOrUpdate(args); - } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteJobByIds(Set ids) { - // 验证是否被用户关联 - this.verifyBindRelationByIds(ids); - systemJobMapper.deleteByIds(ids); - } - - /** - * 分页查询 - * - * @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); - } - - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserJobService.countUserByJobIds(ids) > 0) { - throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); + /** + * 删除 -> TestPassed + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); + systemJobMapper.deleteByIds(ids); } - } - 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)); - } + /** + * 分页查询 -> TestPassed + * + * @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); } - wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); - } - public void exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { - List systemJobTbs = this.queryJobByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemJobTb dataObject : systemJobTbs) { - SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 查询全部数据 -> TestPassed + */ + public List queryJobByArgs(SystemQueryJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemJobMapper.selectList(wrapper); } - KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); - } - public List listByIds(Set jobIds) { - return systemJobMapper.selectByIds(jobIds); - } + /** + * 验证是否被用户关联 -> TestPassed + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserJobService.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 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 exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { + List systemJobTbs = this.queryJobByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemJobTb dataObject : systemJobTbs) { + SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); + } + + public List listByIds(Set jobIds) { + return systemJobMapper.selectByIds(jobIds); + } } 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 ac4a7d5d..2db33d35 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 @@ -36,142 +36,142 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.io.File; -import java.util.Date; -import java.util.List; -import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.Date; +import java.util.List; @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("上传失败"); + /** + * 上传 -> TestPassed + * + * @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; + } } - 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; + + /** + * 编辑 -> TestPassed + * + * @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() + " 失败"); - } + /** + * 多选删除 -> TestPassed + * + * @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 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)); - } + /** + * 分页查询 -> TestPassed + * + * @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); } - wrapper.orderByDesc(SystemLocalStorageTb::getId); - } - 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("只能上传图片"); + 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); } - return KitSpringBeanHolder.getBean(SystemLocalStorageService.class).uploadFile(null, file); - } - public void exportLocalStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { - List systemLocalStorageTbs = this.queryLocalStorageByArgs(args); - List rowVos = KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class); - KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos); - } + 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); + } + + public void exportLocalStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { + List systemLocalStorageTbs = this.queryLocalStorageByArgs(args); + List rowVos = + KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class); + KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos); + } } 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 7986ce5c..c47ae878 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 @@ -16,7 +16,6 @@ package cn.odboy.system.service; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.framework.exception.BadRequestException; @@ -37,6 +36,10 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import jakarta.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; @@ -46,435 +49,428 @@ import java.util.List; 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; @Service public class SystemMenuService { + @Autowired + private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemUserRoleService systemUserRoleService; - @Autowired - private SystemMenuMapper systemMenuMapper; - @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(SystemTransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(SystemTransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - systemMenuMapper.insert(args); - // 计算子节点数目 - args.setSubCount(0); - // 更新父节点菜单数目 - this.updateMenuSubCnt(args.getPid()); - } - - /** - * 编辑 - * - * @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(SystemTransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(SystemTransferProtocolConst.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(this.getMenuVoById(id)); - menuSet = this.queryChildMenuByArgs(menuList, menuSet); - } - List menuIds = - menuSet.stream().map(SystemMenuVo::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(menuIds)) { - systemRoleMenuService.deleteRoleMenuByMenuIds(menuIds); - systemMenuMapper.deleteByIds(menuIds); - } - for (SystemMenuVo menu : menuSet) { - this.updateMenuSubCnt(menu.getPid()); - } - } - - private SystemMenuVo getMenuVoById(Long id) { - return KitBeanUtil.copyToClass(systemMenuMapper.selectById(id), SystemMenuVo.class); - } - - @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 args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveMenu(SystemMenuTb args) { + if (this.getMenuByTitle(args.getTitle()) != null) { + throw new BadRequestException("菜单标题已存在"); } - // 如果有查询条件, 则不指定pidIsNull - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; + if (StrUtil.isNotBlank(args.getComponentName())) { + if (this.getMenuByComponentName(args.getComponentName()) != null) { + throw new BadRequestException("菜单组件名称已存在"); + } } - } - } - return this.queryMenuByArgs(args); - } - - /** - * 根据当前用户获取菜单 - * - * @param currentUserId / - * @return / - */ - public List listMenuByUserId(Long currentUserId) { - List roles = systemUserRoleService.queryRoleByUsersId(currentUserId); - Set roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); - return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); - } - - /** - * 获取所有子节点, 包含自身ID - * - * @param menuList / - * @param menuSet / - * @return / - */ - public Set queryChildMenuByArgs(List menuList, Set menuSet) { - for (SystemMenuVo 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 KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); - } else { - menus = this.listRootMenu(); - } - return menus; - } - - /** - * 根据ID获取同级与上级数据 - * - * @param menu / - * @param menus / - * @return / - */ - public List querySuperiorMenuByArgs(SystemMenuVo menu, List menus) { - if (menu.getPid() == null) { - menus.addAll(this.listRootMenu()); - return menus; - } - menus.addAll(this.listMenuByPid(menu.getPid())); - return querySuperiorMenuByArgs(this.getMenuVoById(menu.getPid()), menus); - } - - /** - * 构建菜单树 - * - * @param menus 原始数据 - * @return / - */ - public List buildMenuTree(List menus) { - List trees = new ArrayList<>(); - Set ids = new HashSet<>(); - for (SystemMenuVo menu : menus) { - if (menu.getPid() == null) { - trees.add(menu); - } - for (SystemMenuVo 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 (Long.valueOf(0L).equals(args.getPid())) { + args.setPid(null); } - } + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTP) || args.getPath() + .toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(SystemTransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + systemMenuMapper.insert(args); + // 计算子节点数目 + args.setSubCount(0); + // 更新父节点菜单数目 + this.updateMenuSubCnt(args.getPid()); } - 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<>(); - for (SystemMenuVo menu : menus) { - if (menu != null) { - List menuList = menu.getChildren(); - SystemMenuRouterVo menuVo = new SystemMenuRouterVo(); - menuVo.setName( - ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); - // 一级目录需要加斜杠, 不然会报警告 - menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); - menuVo.setHidden(menu.getHidden()); - // 如果不是外链 + /** + * 编辑 + * + * @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(SystemTransferProtocolConst.PREFIX_HTTP) || args.getPath() + .toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(SystemTransferProtocolConst.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(this.getMenuVoById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + } + List menuIds = + menuSet.stream().map(SystemMenuVo::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(menuIds)) { + systemRoleMenuService.deleteRoleMenuByMenuIds(menuIds); + systemMenuMapper.deleteByIds(menuIds); + } + for (SystemMenuVo menu : menuSet) { + this.updateMenuSubCnt(menu.getPid()); + } + } + + private SystemMenuVo getMenuVoById(Long id) { + return KitBeanUtil.copyToClass(systemMenuMapper.selectById(id), SystemMenuVo.class); + } + + @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; + } + // 如果有查询条件, 则不指定pidIsNull + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; + } + } + } + return this.queryMenuByArgs(args); + } + + /** + * 根据当前用户获取菜单 + * + * @param currentUserId / + * @return / + */ + public List listMenuByUserId(Long currentUserId) { + List roles = systemUserRoleService.queryRoleVoByUsersId(currentUserId); + Set roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); + return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); + } + + /** + * 获取所有子节点, 包含自身ID + * + * @param menuList / + * @param menuSet / + * @return / + */ + public Set queryChildMenuByArgs(List menuList, Set menuSet) { + for (SystemMenuVo 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 KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); + } else { + menus = this.listRootMenu(); + } + return menus; + } + + /** + * 根据ID获取同级与上级数据 + * + * @param menu / + * @param menus / + * @return / + */ + public List querySuperiorMenuByArgs(SystemMenuVo menu, List menus) { + if (menu.getPid() == null) { + menus.addAll(this.listRootMenu()); + return menus; + } + menus.addAll(this.listMenuByPid(menu.getPid())); + return querySuperiorMenuByArgs(this.getMenuVoById(menu.getPid()), menus); + } + + /** + * 构建菜单树 + * + * @param menus 原始数据 + * @return / + */ + public List buildMenuTree(List menus) { + List trees = new ArrayList<>(); + Set ids = new HashSet<>(); + for (SystemMenuVo menu : menus) { + if (menu.getPid() == null) { + trees.add(menu); + } + for (SystemMenuVo 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<>(); + for (SystemMenuVo menu : menus) { + if (menu != null) { + List menuList = menu.getChildren(); + SystemMenuRouterVo menuVo = new SystemMenuRouterVo(); + 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 (CollUtil.isNotEmpty(menuList)) { + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenuVo(menuList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if (menu.getPid() == null) { + SystemMenuRouterVo 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 SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { + SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 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()); - } + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menu.getPath()); } - 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) { - SystemMenuRouterVo 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 menuVo1; } - return list; - } - /** - * 获取 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { - SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 - if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); + public List listMenuByIds(List ids) { + return KitBeanUtil.copyToList(systemMenuMapper.selectByIds(ids), SystemMenuVo.class); } - return menuVo1; - } - public List listMenuByIds(List ids) { - return KitBeanUtil.copyToList(systemMenuMapper.selectByIds(ids), SystemMenuVo.class); - } + private SystemMenuTb getMenuByComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return systemMenuMapper.selectOne(wrapper); + } - 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 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 Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return systemMenuMapper.selectCount(wrapper); - } - - private List queryMenuByArgs(SystemQueryMenuArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); - wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() + private List queryMenuByArgs(SystemQueryMenuArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); + wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() .like(SystemMenuTb::getComponentName, args.getBlurry()).or() .like(SystemMenuTb::getPermission, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } - - private List listRootMenu() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); - } - - public List buildFrontMenus() { - List originMenus = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); - List targetMenus = this.buildMenuTree(originMenus); - return this.buildMenuVo(targetMenus); - } - - public Set listChildMenuSetByMenuId(Long id) { - Set menuSet = new HashSet<>(); - List menuList = this.listMenuByPid(id); - menuSet.add(this.getMenuVoById(id)); - menuSet = this.queryChildMenuByArgs(menuList, menuSet); - return menuSet.stream().map(SystemMenuVo::getId).collect(Collectors.toSet()); - } - - public List listMenuSuperior(List ids) { - Set menus; - List systemMenuTbs; - if (CollectionUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(this.listMenuByIds(ids)); - for (SystemMenuVo menu : menus) { - List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); - for (SystemMenuVo data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - List newMenuList = new ArrayList<>(menus); - systemMenuTbs = this.buildMenuTree(newMenuList); - } else { - systemMenuTbs = this.listMenuByPid(null); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); } - return systemMenuTbs; - } - public void exportMenuXlsx(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { - List systemMenuTbs = this.queryAllMenu(args, false); - List rowVos = new ArrayList<>(); - for (SystemMenuTb dataObject : systemMenuTbs) { - SystemMenuExportRowVo rowVo = new SystemMenuExportRowVo(); - rowVo.setTitle(dataObject.getTitle()); - rowVo.setType(dataObject.getType() == null ? "目录" : dataObject.getType() == 1 ? "菜单" : "按钮"); - rowVo.setPermission(dataObject.getPermission()); - rowVo.setIFrame(dataObject.getIFrame() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); - rowVo.setHidden(dataObject.getHidden() ? SystemYesOrNoChConst.NO_STR : SystemYesOrNoChConst.YES_STR); - rowVo.setCache(dataObject.getCache() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + private List listRootMenu() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); + } + + public List buildFrontMenus() { + List originMenus = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); + List targetMenus = this.buildMenuTree(originMenus); + return this.buildMenuVo(targetMenus); + } + + public Set listChildMenuSetByMenuId(Long id) { + Set menuSet = new HashSet<>(); + List menuList = this.listMenuByPid(id); + menuSet.add(this.getMenuVoById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + return menuSet.stream().map(SystemMenuVo::getId).collect(Collectors.toSet()); + } + + public List listMenuSuperior(List ids) { + Set menus; + List systemMenuTbs; + if (CollUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(this.listMenuByIds(ids)); + for (SystemMenuVo menu : menus) { + List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); + for (SystemMenuVo 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()); + List newMenuList = new ArrayList<>(menus); + systemMenuTbs = this.buildMenuTree(newMenuList); + } else { + systemMenuTbs = this.listMenuByPid(null); + } + return systemMenuTbs; + } + + public void exportMenuXlsx(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { + List systemMenuTbs = this.queryAllMenu(args, false); + List rowVos = new ArrayList<>(); + for (SystemMenuTb dataObject : systemMenuTbs) { + SystemMenuExportRowVo rowVo = new SystemMenuExportRowVo(); + rowVo.setTitle(dataObject.getTitle()); + rowVo.setType(dataObject.getType() == null ? "目录" : dataObject.getType() == 1 ? "菜单" : "按钮"); + rowVo.setPermission(dataObject.getPermission()); + rowVo.setIFrame(dataObject.getIFrame() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); + rowVo.setHidden(dataObject.getHidden() ? SystemYesOrNoChConst.NO_STR : SystemYesOrNoChConst.YES_STR); + rowVo.setCache(dataObject.getCache() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "菜单数据", SystemMenuExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "菜单数据", SystemMenuExportRowVo.class, rowVos); - } } 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 fc019183..9dd6fc74 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 @@ -20,13 +20,6 @@ import cn.hutool.core.date.DateUtil; import cn.odboy.constant.SystemConst; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitIPUtil; -import java.lang.management.ManagementFactory; -import java.text.DecimalFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import oshi.SystemInfo; @@ -39,177 +32,184 @@ import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.FormatUtil; import oshi.util.Util; +import java.lang.management.ManagementFactory; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Slf4j @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); + /** + * 查询服务器监控信息 -> TestPassed + * + * @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 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; - } + /** + * 获取磁盘信息 + * + * @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; } - 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); + + /** + * 获取交换区信息 + * + * @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; } - 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)); + /** + * 获取内存信息 + * + * @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; } - 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; - } - - /** - * 获取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(); + /** + * 获取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; } - 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/SystemOperationLogService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java index 917696ca..337cdf16 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java @@ -14,13 +14,16 @@ import org.springframework.stereotype.Service; @Service public class SystemOperationLogService { - @Autowired - private SystemOperationLogMapper systemOperationLogMapper; + @Autowired + private SystemOperationLogMapper systemOperationLogMapper; - public IPage searchUserLog(KitPageArgs pageArgs) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemOperationLogTb::getUsername, KitSecurityHelper.getCurrentUsername()); - Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - return systemOperationLogMapper.selectPage(page, wrapper); - } + /** + * 查询用户操作日志 + */ + public IPage searchUserLog(KitPageArgs pageArgs) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemOperationLogTb::getUsername, KitSecurityHelper.getCurrentUsername()); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return systemOperationLogMapper.selectPage(page, wrapper); + } } 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 10e66194..4d60ac4c 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.request.SystemQueryStorageArgs; import cn.odboy.system.dal.model.response.SystemOssStorageVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; -import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; /** *

@@ -35,13 +35,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); - String uploadFile(MultipartFile file); + String uploadFile(MultipartFile file); - void deleteFileByIds(Long[] ids); + void deleteFileByIds(Long[] ids); - void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args); + void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java index 43784fd1..241407d9 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 @@ -38,279 +38,283 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -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; import org.springframework.transaction.annotation.Transactional; +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; @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; - /** - * 验证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,请重新输入!"); + /** + * 验证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 createJob(SystemQuartzJobVo args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void createJob(SystemQuartzJobVo args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); + } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); + } + SystemQuartzJobTb record = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insert(record); + quartzManage.addJob(args); } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); + + /** + * 修改任务并重新调度 + * + * @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 jobTb = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(jobTb); + SystemQuartzJobVo jobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class); + quartzManage.updateJobCron(jobVo); } - SystemQuartzJobTb record = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insert(record); - quartzManage.addJob(args); - } - /** - * 修改任务并重新调度 - * - * @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表达式格式错误"); + /** + * 更改定时任务状态 + * + * @param quartzJob / + */ + @Transactional(rollbackFor = Exception.class) + public void switchQuartzJobStatus(SystemQuartzJobVo quartzJob) { + // 置换暂停状态 + if (quartzJob.getIsPause()) { + quartzManage.resumeJob(quartzJob); + quartzJob.setIsPause(false); + } else { + quartzManage.pauseJob(quartzJob); + quartzJob.setIsPause(true); + } + SystemQuartzJobTb quartzJobTb = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(quartzJobTb); } - if (StrUtil.isNotBlank(args.getSubTask())) { - List tasks = Arrays.asList(args.getSubTask().split("[,,]")); - if (tasks.contains(args.getId().toString())) { - throw new BadRequestException("子任务中不能添加当前任务ID"); - } + + /** + * 立即执行定时任务 + * + * @param quartzJob / + */ + public void startQuartzJob(SystemQuartzJobVo quartzJob) { + quartzManage.runJobNow(quartzJob); } - SystemQuartzJobTb jobTb = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(jobTb); - SystemQuartzJobVo jobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class); - quartzManage.updateJobCron(jobVo); - } - /** - * 更改定时任务状态 - * - * @param quartzJob / - */ - @Transactional(rollbackFor = Exception.class) - public void switchQuartzJobStatus(SystemQuartzJobVo quartzJob) { - // 置换暂停状态 - if (quartzJob.getIsPause()) { - quartzManage.resumeJob(quartzJob); - quartzJob.setIsPause(false); - } else { - quartzManage.pauseJob(quartzJob); - quartzJob.setIsPause(true); + /** + * 删除任务 + * + * @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); + } } - SystemQuartzJobTb quartzJobTb = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(quartzJobTb); - } - /** - * 立即执行定时任务 - * - * @param quartzJob / - */ - public void startQuartzJob(SystemQuartzJobVo quartzJob) { - quartzManage.runJobNow(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 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; + } + SystemQuartzJobVo quartzJob = systemQuartzJobMapper.selectVoById(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 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; - } - SystemQuartzJobVo quartzJob = systemQuartzJobMapper.selectVoById(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 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 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 injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - KitValidUtil.notNull(args); - 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)); + private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, + LambdaQueryWrapper wrapper) { + KitValidUtil.notNull(args); + 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); } - wrapper.orderByDesc(SystemQuartzJobTb::getId); - } - private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); - wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } + 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); } - wrapper.orderByDesc(SystemQuartzLogTb::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)); - } - - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(args, wrapper); - return systemQuartzJobMapper.selectList(wrapper); - } - - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(args, wrapper); - return systemQuartzLogMapper.selectList(wrapper); - } - - public SystemQuartzJobVo getQuartzJobById(Long id) { - return KitBeanUtil.copyToClass(systemQuartzJobMapper.selectById(id), SystemQuartzJobVo.class); - } - - public List listEnableQuartzJob() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemQuartzJobTb::getIsPause, 0); - return KitBeanUtil.copyToList(systemQuartzJobMapper.selectList(wrapper), SystemQuartzJobVo.class); - } - - public void exportQuartzJobXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { - List systemQuartzJobTbs = this.queryQuartzJobByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { - SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); - rowVo.setJobName(dataObject.getJobName()); - rowVo.setBeanName(dataObject.getBeanName()); - rowVo.setMethodName(dataObject.getMethodName()); - rowVo.setParams(dataObject.getParams()); - rowVo.setCronExpression(dataObject.getCronExpression()); - rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中"); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 分页查询日志 + * + * @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)); } - KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); - } - public void exportQuartzLogXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { - List systemQuartzLogTbs = this.queryQuartzLogByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemQuartzLogTb dataObject : systemQuartzLogTbs) { - SystemQuartzLogExportRowVo rowVo = new SystemQuartzLogExportRowVo(); - rowVo.setJobName(dataObject.getJobName()); - rowVo.setBeanName(dataObject.getBeanName()); - rowVo.setMethodName(dataObject.getMethodName()); - rowVo.setParams(dataObject.getParams()); - rowVo.setCronExpression(dataObject.getCronExpression()); - rowVo.setExceptionDetail(dataObject.getExceptionDetail()); - rowVo.setTime(dataObject.getTime()); - rowVo.setStatus(dataObject.getIsSuccess() ? "成功" : "失败"); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return systemQuartzJobMapper.selectList(wrapper); + } + + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return systemQuartzLogMapper.selectList(wrapper); + } + + public SystemQuartzJobVo getQuartzJobById(Long id) { + return KitBeanUtil.copyToClass(systemQuartzJobMapper.selectById(id), SystemQuartzJobVo.class); + } + + public List listEnableQuartzJob() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemQuartzJobTb::getIsPause, 0); + return KitBeanUtil.copyToList(systemQuartzJobMapper.selectList(wrapper), SystemQuartzJobVo.class); + } + + public void exportQuartzJobXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { + List systemQuartzJobTbs = this.queryQuartzJobByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { + SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); + rowVo.setJobName(dataObject.getJobName()); + rowVo.setBeanName(dataObject.getBeanName()); + rowVo.setMethodName(dataObject.getMethodName()); + rowVo.setParams(dataObject.getParams()); + rowVo.setCronExpression(dataObject.getCronExpression()); + rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中"); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); + } + + public void exportQuartzLogXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { + List systemQuartzLogTbs = this.queryQuartzLogByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemQuartzLogTb dataObject : systemQuartzLogTbs) { + SystemQuartzLogExportRowVo rowVo = new SystemQuartzLogExportRowVo(); + rowVo.setJobName(dataObject.getJobName()); + rowVo.setBeanName(dataObject.getBeanName()); + rowVo.setMethodName(dataObject.getMethodName()); + rowVo.setParams(dataObject.getParams()); + rowVo.setCronExpression(dataObject.getCronExpression()); + rowVo.setExceptionDetail(dataObject.getExceptionDetail()); + rowVo.setTime(dataObject.getTime()); + rowVo.setStatus(dataObject.getIsSuccess() ? "成功" : "失败"); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "定时任务日志数据", SystemQuartzLogExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "定时任务日志数据", SystemQuartzLogExportRowVo.class, rowVos); - } } 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 4e81616a..7285175e 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 @@ -21,75 +21,67 @@ import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; import cn.odboy.system.dal.mysql.SystemDeptMapper; import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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 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 batchDeleteRoleDept(Set roleIds) { + if (CollUtil.isNotEmpty(roleIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getRoleId, roleIds); + systemRoleDeptMapper.delete(wrapper); + } } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); - return systemRoleDeptMapper.selectCount(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 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); + } + + /** + * 根据角色id查询部门信息 + * + * @param roleId 角色id + * @return / + */ + public Set listUserDeptByRoleId(Long roleId) { + return systemRoleDeptMapper.listUserDeptByRoleId(roleId); + } } 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 2dde9009..c86ef87b 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 @@ -23,82 +23,82 @@ import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; import cn.odboy.util.KitBeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; 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; @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 batchInsertRoleMenu(Set menus, Long roleId) { - if (CollUtil.isNotEmpty(menus)) { - List records = new ArrayList<>(); - for (SystemMenuVo 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 deleteRoleMenuByRoleId(Long roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleMenuTb::getRoleId, roleId); + 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); + @Transactional(rollbackFor = Exception.class) + public void batchInsertRoleMenu(Set menus, Long roleId) { + if (CollUtil.isNotEmpty(menus)) { + List records = new ArrayList<>(); + for (SystemMenuVo menu : menus) { + SystemRoleMenuTb record = new SystemRoleMenuTb(); + record.setMenuId(menu.getId()); + record.setRoleId(roleId); + records.add(record); + } + systemRoleMenuMapper.insert(records); + } } - } - public LinkedHashSet queryMenuByRoleIds(Set roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return new LinkedHashSet<>(); + @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); + } } - 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); - List systemMenuTbs = systemMenuMapper.selectList(menuWrapper); - List systemMenuVos = KitBeanUtil.copyToList(systemMenuTbs, SystemMenuVo.class); - return new LinkedHashSet<>(systemMenuVos); - } + 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); - @Transactional(rollbackFor = Exception.class) - public void deleteRoleMenuByMenuIds(List menuIds) { - if (CollUtil.isEmpty(menuIds)) { - return; + List systemMenuTbs = systemMenuMapper.selectList(menuWrapper); + List systemMenuVos = KitBeanUtil.copyToList(systemMenuTbs, SystemMenuVo.class); + return new LinkedHashSet<>(systemMenuVos); + } + + @Transactional(rollbackFor = Exception.class) + public void deleteRoleMenuByMenuIds(List menuIds) { + if (CollUtil.isEmpty(menuIds)) { + return; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); + systemRoleMenuMapper.delete(wrapper); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); - systemRoleMenuMapper.delete(wrapper); - } } 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 a56bc8ec..c9d52fcd 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 @@ -16,19 +16,18 @@ package cn.odboy.system.service; 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.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.export.SystemRoleExportRowVo; import cn.odboy.system.dal.model.request.SystemCreateRoleArgs; import cn.odboy.system.dal.model.request.SystemQueryRoleArgs; import cn.odboy.system.dal.model.response.SystemMenuVo; import cn.odboy.system.dal.model.response.SystemRoleCodeVo; import cn.odboy.system.dal.model.response.SystemRoleVo; +import cn.odboy.system.dal.model.response.SystemUserVo; import cn.odboy.system.dal.mysql.SystemRoleMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBeanUtil; @@ -37,268 +36,264 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; 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.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 SystemUserRoleService systemUserRoleService; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemUserRoleService systemUserRoleService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveRole(SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); - if (this.countRoleByName(args.getName()) > 0) { - throw new BadRequestException("角色名称已存在"); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveRole(SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); + if (this.countRoleByName(args.getName()) > 0) { + throw new BadRequestException("角色名称已存在"); + } + SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); + systemRoleMapper.insert(roleTb); + // 判断是否有部门数据, 若有, 则需创建关联 + if (CollUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), roleTb.getId()); + } } - SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); - systemRoleMapper.insert(roleTb); - // 判断是否有部门数据, 若有, 则需创建关联 - 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); } - } - private SystemRoleTb getRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectOne(wrapper); - } - - private long countRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectCount(wrapper); - } - - /** - * 修改 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateRoleById(SystemRoleVo args) { - checkRoleLevels(args.getLevel()); - SystemRoleTb role = this.getRoleTbById(args.getId()); - SystemRoleTb role1 = this.getRoleByName(args.getName()); - if (role1 != null && !role1.getId().equals(role.getId())) { - throw new BadRequestException("角色名称已存在"); + private long countRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectCount(wrapper); } - role.setName(args.getName()); - role.setDescription(args.getDescription()); - role.setDataScope(args.getDataScope()); - 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 args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleById(SystemRoleVo args) { + checkRoleLevels(args.getLevel()); + SystemRoleTb role = this.getRoleTbById(args.getId()); + 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.setLevel(args.getLevel()); + // 更新 + systemRoleMapper.insertOrUpdate(role); + // 删除关联部门数据 + systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); + // 判断是否有部门数据, 若有, 则需更新关联 + if (CollUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } } - } - private SystemRoleTb getRoleTbById(Long id) { - return systemRoleMapper.selectById(id); - } - - /** - * 修改绑定的菜单 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateBindMenuById(SystemRoleVo args) { - SystemRoleTb role = systemRoleMapper.selectById(args.getId()); - checkRoleLevels(role.getLevel()); - // 更新菜单 - systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); - // 判断是否为空 - Set menus = args.getMenus(); - if (CollUtil.isNotEmpty(menus)) { - systemRoleMenuService.batchInsertRoleMenu(menus, role.getId()); + private SystemRoleTb getRoleTbById(Long id) { + return systemRoleMapper.selectById(id); } - } - /** - * 删除 - * - * @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); + /** + * 修改绑定的菜单 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateBindMenuById(SystemRoleVo args) { + SystemRoleTb role = systemRoleMapper.selectById(args.getId()); + checkRoleLevels(role.getLevel()); + // 更新菜单 + systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); + // 判断是否为空 + Set menus = args.getMenus(); + if (CollUtil.isNotEmpty(menus)) { + systemRoleMenuService.batchInsertRoleMenu(menus, role.getId()); + } } - // 验证是否被用户关联 - 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 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); + } - /** - * 根据条件查询全部角色 - * - * @param args 条件 - * @param rolePage 分页参数 - * @return / - */ - public List queryRoleByArgs(SystemQueryRoleArgs args, Page rolePage) { - KitValidUtil.notNull(args); - // 查询角色基本信息 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + /** + * 查询全部角色 + */ + public List listAllRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(SystemRoleTb::getLevel); + return systemRoleMapper.selectList(wrapper); + } + + /** + * 根据条件查询全部角色 + * + * @param args 条件 + * @param rolePage 分页参数 + * @return / + */ + public List queryRoleByArgs(SystemQueryRoleArgs args, Page rolePage) { + KitValidUtil.notNull(args); + // 查询角色基本信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + 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); + List roles; + if (rolePage == null) { + roles = systemRoleMapper.selectList(wrapper); + } else { + Page page = systemRoleMapper.selectPage(rolePage, wrapper); + roles = page.getRecords(); + } + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); } - wrapper.orderByAsc(SystemRoleTb::getLevel); - List roles; - if (rolePage == null) { - roles = systemRoleMapper.selectList(wrapper); - } else { - Page page = systemRoleMapper.selectPage(rolePage, wrapper); - roles = page.getRecords(); + + /** + * 分页查询角色 + * + * @param args 条件 + * @param page 分页条件 + * @return / + */ + public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { + List roles = this.queryRoleByArgs(args, page); + Long total = this.countRoleByArgs(args); + return KitPageUtil.toPage(roles, total); } - return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); - } - /** - * 分页查询角色 - * - * @param args 条件 - * @param page 分页条件 - * @return / - */ - public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { - List roles = this.queryRoleByArgs(args, page); - 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()); + /** + * 获取用户权限信息 + * + * @param user 用户信息 + * @return 权限信息 + */ + public List buildUserRolePermissions(SystemUserVo user) { + Set permissions = new HashSet<>(); + // 如果是管理员直接返回 + if (user.getIsAdmin()) { + permissions.add("admin"); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } + List roles = systemUserRoleService.queryRoleVoByUsersId(user.getId()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) + .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); } - List roles = systemUserRoleService.queryRoleByUsersId(user.getId()); - permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserRoleService.countUserByRoleIds(ids) > 0) { - throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserRoleService.countUserByRoleIds(ids) > 0) { + throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); + } } - } - public Long countRoleByArgs(SystemQueryRoleArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + public Long countRoleByArgs(SystemQueryRoleArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + 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 systemRoleMapper.selectCount(wrapper); - } - public SystemRoleVo getRoleById(Long id) { - SystemRoleTb roleTb = systemRoleMapper.selectById(id); - if (roleTb == null) { - return null; + public SystemRoleVo getRoleById(Long id) { + SystemRoleTb roleTb = systemRoleMapper.selectById(id); + if (roleTb == null) { + return null; + } + return systemUserRoleService.convertToRoleVo(roleTb); } - return systemUserRoleService.convertToRoleVo(roleTb); - } - public Dict getCurrentUserRoleLevel() { - return Dict.create().set("level", checkRoleLevels(null)); - } - - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemUserRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleVo::getLevel).collect(Collectors.toList()); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } + public Dict getCurrentUserRoleLevel() { + return Dict.create().set("level", checkRoleLevels(null)); } - return min; - } - public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { - List systemRoleVos = this.queryRoleByArgs(args, null); - List rowVos = new ArrayList<>(); - for (SystemRoleVo dataObject : systemRoleVos) { - SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setLevel(dataObject.getLevel()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemUserRoleService.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleVo::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } + } + return min; } - KitExcelExporter.exportSimple(response, "部门数据", SystemRoleExportRowVo.class, rowVos); - } - public List listByIds(Set roleIds) { - return systemRoleMapper.selectByIds(roleIds); - } + public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { + List systemRoleVos = this.queryRoleByArgs(args, null); + List rowVos = new ArrayList<>(); + for (SystemRoleVo dataObject : systemRoleVos) { + SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setLevel(dataObject.getLevel()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "部门数据", SystemRoleExportRowVo.class, rowVos); + } + + public List listByIds(Set roleIds) { + return systemRoleMapper.selectByIds(roleIds); + } } 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 index e051ae16..986789d2 100644 --- 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 @@ -3,19 +3,19 @@ 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; +import java.util.Set; @Service public class SystemUserDeptService { - @Autowired - private SystemUserMapper systemUserMapper; + @Autowired + private SystemUserMapper systemUserMapper; - public long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return systemUserMapper.selectCount(wrapper); - } + 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 33ae7628..c0b9057e 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 @@ -20,60 +20,58 @@ import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemUserJobTb; import cn.odboy.system.dal.mysql.SystemUserJobMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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); + } } - } - /** - * 根据岗位ID统计用户数量 - * - * @param jobIds 岗位ID集合 - * @return / - */ - public Long countUserByJobIds(Set jobIds) { - if (CollUtil.isEmpty(jobIds)) { - return 0L; + /** + * 根据岗位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); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserJobTb::getJobId, jobIds); - return systemUserJobMapper.selectCount(wrapper); - } - public List listUserJobByUserId(Long userId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserJobTb::getUserId, userId); - return systemUserJobMapper.selectList(wrapper); - } + public Set listUserJobByUserId(Long userId) { + return systemUserJobMapper.listUserJobByUserId(userId); + } } diff --git a/cutejava-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 e389bda9..c53a4c7f 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 @@ -28,137 +28,135 @@ import cn.odboy.system.dal.mysql.SystemUserRoleMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; @Service public class SystemUserRoleService { - @Autowired - private SystemRoleMapper systemRoleMapper; - @Autowired - private SystemUserRoleMapper systemUserRoleMapper; - @Autowired - private SystemRoleMenuService systemRoleMenuService; - @Autowired - private SystemRoleDeptService systemRoleDeptService; + @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并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + public SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; + } + SystemRoleVo roleVo = KitBeanUtil.copyToClass(role, SystemRoleVo.class); + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIds(Collections.singleton(role.getId())); + roleVo.setMenus(menus); + // 查询关联的部门信息 + Set depts = systemRoleDeptService.listUserDeptByRoleId(role.getId()); + roleVo.setDepts(depts); + return roleVo; } - SystemRoleVo roleVo = KitBeanUtil.copyToClass(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<>(); + /** + * 根据用户ID查询 + * + * @param userId 用户ID + * @return / + */ + public List queryRoleVoByUsersId(Long userId) { + Set roles = this.listUserRoleByUserId(userId); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); } - 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; + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + public Integer getDeptLevelByRoles(Set roles) { + if (CollUtil.isEmpty(roles)) { + // 最小权限 + return Integer.MAX_VALUE; + } + List roleIds = + roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(roleIds)) { + // 最小权限 + return Integer.MAX_VALUE; + } + List roleLevels = systemRoleMapper.selectList( + new LambdaQueryWrapper().select(SystemRoleTb::getLevel).isNotNull(SystemRoleTb::getLevel) + .in(SystemRoleTb::getId, roleIds)).stream().map(SystemRoleTb::getLevel).distinct() + .collect(Collectors.toList()); + if (CollUtil.isEmpty(roleLevels)) { + // 最小权限 + return Integer.MAX_VALUE; + } + return Collections.min(roleLevels); } - 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(SystemRoleVo::getLevel).collect(Collectors.toList())); - Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + public void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + this.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream().map(SystemRoleVo::getLevel) + .collect(Collectors.toList())); + Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); + } } - } - public List listUserRoleByUserId(Long userId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserRoleTb::getUserId, userId); - return systemUserRoleMapper.selectList(wrapper); - } + public long countUserByRoleIds(Set ids) { + if (CollUtil.isEmpty(ids)) { + return 0L; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getRoleId, ids); + return systemUserRoleMapper.selectCount(wrapper); + } - public long countUserByRoleIds(Set ids) { - if (CollUtil.isEmpty(ids)) { - return 0L; + public Set listUserRoleByUserId(Long userId) { + return systemUserRoleMapper.listUserRoleByUserId(userId); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserRoleTb::getRoleId, ids); - return systemUserRoleMapper.selectCount(wrapper); - } } 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 ff0dff3e..9cb16728 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 @@ -16,7 +16,6 @@ package cn.odboy.system.service; 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; @@ -26,15 +25,13 @@ import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.constant.SystemZhConst; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.dataobject.SystemUserJobTb; -import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.export.SystemUserExportRowVo; import cn.odboy.system.dal.model.request.SystemQueryUserArgs; import cn.odboy.system.dal.model.request.SystemUpdateUserPasswordArgs; -import cn.odboy.system.dal.model.response.SystemDeptVo; import cn.odboy.system.dal.model.response.SystemRoleVo; import cn.odboy.system.dal.model.response.SystemUserVo; import cn.odboy.system.dal.mysql.SystemUserMapper; @@ -50,470 +47,465 @@ import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.ObjectUtils; +import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; 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 SystemJobService systemJobService; - @Autowired - private SystemRoleService systemRoleService; - @Autowired - private SystemDeptService systemDeptService; - @Autowired - private SystemUserJobService systemUserJobService; - @Autowired - private SystemUserRoleService systemUserRoleService; - @Autowired - private SystemEmailService systemEmailService; - @Autowired - private SystemDataService systemDataService; - @Autowired - private SystemUserInfoDAO systemUserInfoDAO; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired - private AppProperties properties; - @Autowired - private PasswordEncoder passwordEncoder; + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemUserJobService systemUserJobService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemEmailService systemEmailService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + /** + * 新增用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveUser(SystemUserVo args) { + systemUserRoleService.checkLevel(args); + SystemUserTb record = KitBeanUtil.copyToClass(args, SystemUserTb.class); + // 默认密码 123456 + record.setPassword(passwordEncoder.encode("123456")); + record.setDeptId(args.getDept().getId()); + if (this.getUserByUsername(record.getUsername()) != null) { + throw new BadRequestException("用户名已存在"); + } + if (this.getUserByEmail(record.getEmail()) != null) { + throw new BadRequestException("邮箱已存在"); + } + if (this.getUserByPhone(record.getPhone()) != null) { + throw new BadRequestException("手机号已存在"); + } + // 保存用户 + systemUserMapper.insert(record); + // 保存用户岗位 + systemUserJobService.batchInsertUserJob(args.getJobs(), record.getId()); + // 保存用户角色 + systemUserRoleService.batchInsertUserRole(args.getRoles(), record.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) { + 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("用户名已存在"); + } + 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.setPhone(args.getPhone()); + user.setNickName(args.getNickName()); + user.setGender(args.getGender()); + systemUserMapper.updateById(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("邮箱已存在"); - } - 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 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 args / + */ + @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())) { + throw new BadRequestException("手机号已存在"); + } + user.setNickName(args.getNickName()); + user.setPhone(args.getPhone()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); } - 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.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 args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserCenterInfoById(SystemUserTb args) { - if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); + /** + * 删除用户 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteUserByIds(Set ids) { + Long currentUserId = KitSecurityHelper.getCurrentUserId(); + // 校验权限 + for (Long id : ids) { + Integer currentLevel = Collections.min( + systemUserRoleService.queryRoleVoByUsersId(currentUserId).stream().map(SystemRoleVo::getLevel) + .collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemUserRoleService.queryRoleVoByUsersId(id).stream().map(SystemRoleVo::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); + // 删除用户角色 + systemUserRoleService.batchDeleteUserRole(ids); } - 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 ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteUserByIds(Set ids) { - Long currentUserId = KitSecurityHelper.getCurrentUserId(); - // 校验权限 - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemUserRoleService.queryRoleByUsersId(currentUserId).stream() - .map(SystemRoleVo::getLevel).collect(Collectors.toList())); - Integer optLevel = Collections.min( - systemUserRoleService.queryRoleByUsersId(id).stream().map(SystemRoleVo::getLevel) - .collect(Collectors.toList())); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + this.getUserById(id).getUsername()); - } + /** + * 修改密码 + * + * @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("修改失败,旧密码错误"); + } + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + String encryptPassword = passwordEncoder.encode(newPass); + systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); } - // 清理缓存 - 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); - } - /** - * 修改密码 - * - * @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("修改失败,旧密码错误"); + /** + * 重置密码 + * + * @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); } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - String encryptPassword = passwordEncoder.encode(newPass); - systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } - /** - * 重置密码 - * - * @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()); + /** + * 修改头像 + * + * @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()); + }}; } - // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids); - } - /** - * 修改头像 - * - * @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 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); } - // 文件大小验证 - 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()); - }}; - } - /** - * 修改邮箱 - * - * @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("密码错误"); + /** + * 查询全部 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + IPage userPage = systemUserMapper.selectPage(page, wrapper); + List users = userPage.getRecords(); + // 转换为SystemUserVo并关联查询 + List userVos = + users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList()); + return KitPageUtil.toPage(userVos, userPage.getTotal()); } - systemEmailService.checkEmailCaptchaV1(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserMapper.updateUserEmailByUsername(username, args.getEmail()); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } - /** - * 查询全部 - * - * @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 long countUserByArgs(SystemQueryUserArgs args) { - LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); - return systemUserMapper.selectCount(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<>(pageArgs.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()); - } - - /** - * 构建用户查询条件 - * - * @param args 查询条件 - * @return / - */ - private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args.getId() != null) { - wrapper.eq(SystemUserTb::getId, args.getId()); + public long countUserByArgs(SystemQueryUserArgs args) { + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + return systemUserMapper.selectCount(wrapper); } - 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; + /** + * 根据ID查询 + * + * @param id ID + * @return / + */ + public SystemUserTb getUserById(long id) { + return systemUserMapper.selectById(id); } - SystemUserVo userVo = KitBeanUtil.copyToClass(user, SystemUserVo.class); - // 查询关联的部门信息 - if (user.getDeptId() != null) { - SystemDeptVo dept = systemDeptService.getDeptVoById(user.getDeptId()); - userVo.setDept(dept); + + 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<>(pageArgs.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()); } - // 查询关联的岗位信息 - List userJobs = systemUserJobService.listUserJobByUserId(user.getId()); - if (CollUtil.isNotEmpty(userJobs)) { - Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); - List jobs = systemJobService.listByIds(jobIds); - userVo.setJobs(new LinkedHashSet<>(jobs)); + + /** + * 构建用户查询条件 + * + * @param args 查询条件 + * @return / + */ + private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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; } - // 查询关联的角色信息 - List userRoles = systemUserRoleService.listUserRoleByUserId(user.getId()); - if (CollUtil.isNotEmpty(userRoles)) { - Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); - List roles = systemRoleService.listByIds(roleIds); - userVo.setRoles(new LinkedHashSet<>(roles)); + + /** + * 转换为SystemUserVo并关联查询部门、角色、岗位信息 + * + * @param user 用户基本信息 + * @param includePassword 是否包含用户密码 + * @return 包含关联信息的SystemUserVo + */ + private SystemUserVo convertToUserVo(SystemUserTb user, boolean includePassword) { + if (user == null) { + return null; + } + if (!includePassword) { + // 查询用户时,清空密码 + user.setPassword(null); + } + SystemUserVo userVo = KitBeanUtil.copyToClass(user, SystemUserVo.class); + // 查询关联的部门信息 + if (user.getDeptId() != null) { + userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); + } + // 查询关联的岗位信息 + userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); + // 查询关联的角色信息 + userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); + return userVo; } - 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)); + public SystemUserTb getUserByUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); } - // 数据权限 - List dataScopes = systemDataService.queryDeptIdByArgs(this.getUserVoByUsername(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(); - } - public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) { - long totalCount = this.countUserByArgs(args); - KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount, (long pageNum, long pageSize) -> { - KitPageResult pageResult = this.searchUserByArgs(args, new Page<>(pageNum, pageSize)); - List rowVos = new ArrayList<>(); - for (SystemUserVo dataObject : pageResult.getContent()) { - SystemUserExportRowVo rowVo = new SystemUserExportRowVo(); - rowVo.setUsername(dataObject.getUsername()); - rowVo.setRoles(dataObject.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.joining(","))); - rowVo.setDept(dataObject.getDept().getName()); - rowVo.setJobs(dataObject.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.joining(","))); - rowVo.setEmail(dataObject.getEmail()); - rowVo.setStatus(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); - rowVo.setMobile(dataObject.getPhone()); - rowVo.setUpdatePwdTime(dataObject.getPwdResetTime()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); - } - return rowVos; - }); - } + public SystemUserVo getUserVoWithPasswordByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username), true); + } + + public SystemUserVo getUserVoByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username), false); + } + + 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()); + Map> deptPidMap = + systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid)); + // 然后把子节点的ID都加入到集合中 + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap)); + } + // 数据权限 + List dataScopes = systemDataService.queryDeptIdByArgs(this.getUserVoByUsername(currentUsername)); + // args.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollUtil.isEmpty(args.getDeptIds()) && !CollUtil.isEmpty(dataScopes)) { + // 取交集 + args.getDeptIds().retainAll(dataScopes); + if (!CollUtil.isEmpty(args.getDeptIds())) { + return this.searchUserByArgs(args, page); + } + } else { + // 否则取并集 + args.getDeptIds().addAll(dataScopes); + return this.searchUserByArgs(args, page); + } + return KitPageUtil.emptyData(); + } + + public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) { + long totalCount = this.countUserByArgs(args); + KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount, + (long pageNum, long pageSize) -> { + KitPageResult pageResult = this.searchUserByArgs(args, new Page<>(pageNum, pageSize)); + List rowVos = new ArrayList<>(); + for (SystemUserVo dataObject : pageResult.getContent()) { + SystemUserExportRowVo rowVo = new SystemUserExportRowVo(); + rowVo.setUsername(dataObject.getUsername()); + rowVo.setRoles( + dataObject.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.joining(","))); + rowVo.setDept(dataObject.getDept().getName()); + rowVo.setJobs( + dataObject.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.joining(","))); + rowVo.setEmail(dataObject.getEmail()); + rowVo.setStatus(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); + rowVo.setMobile(dataObject.getPhone()); + rowVo.setUpdatePwdTime(dataObject.getPwdResetTime()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + return rowVos; + }); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java index 143a32b1..ded396f3 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java @@ -39,13 +39,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 java.io.File; -import java.util.List; -import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.List; /** *

@@ -59,105 +59,110 @@ import org.springframework.web.multipart.MultipartFile; public class SystemMinioStorageServiceImpl 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); - for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + @Override + public KitPageResult searchOssStorage(SystemQueryStorageArgs args, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); + for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + } + return KitPageUtil.toPage(ossStorageTbs); } - return KitPageUtil.toPage(ossStorageTbs); - } - private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, Page page) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - 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)); + private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, + Page page) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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) + .convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class)); } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper).convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class)); - } - @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 - @Transactional(rollbackFor = Exception.class) - public String uploadFile(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - if (StrUtil.isBlank(originalFilename)) { - throw new BadRequestException("文件名不能为空"); + @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()); } - 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); + } } - } - @Override - public void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { - List systemOssStorageVos = this.queryOssStorage(args); -// KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class, -// (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class))); - List rowVos = KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class); - KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos); - } + @Override + public void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { + List systemOssStorageVos = this.queryOssStorage(args); + // KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class, + // (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class))); + List rowVos = + KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class); + KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos); + } - 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 cacbc511..ad6e4642 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,29 @@ - + + diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml new file mode 100644 index 00000000..96d2714c --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleDeptMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml new file mode 100644 index 00000000..5ffdd7f1 --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserJobMapper.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml new file mode 100644 index 00000000..177b248e --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserRoleMapper.xml @@ -0,0 +1,10 @@ + + + + + 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 ca437b0f..98aa735c 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 @@ -17,11 +17,13 @@ package cn.odboy.system.dal.mysql; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.model.request.SystemQueryDictDetailArgs; +import cn.odboy.system.dal.model.response.SystemDictDetailVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; /** * 字典明细 Mapper @@ -31,5 +33,7 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface SystemDictDetailMapper extends BaseMapper { - IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); + IPage selectPageByArgs(Page page, @Param("args") SystemQueryDictDetailArgs args); + + List listDictDetailByName(@Param("name") String name); } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java index fdaa7750..2859ac41 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemAuthService.java @@ -14,13 +14,13 @@ import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitRsaEncryptUtil; import cn.odboy.util.KitValidUtil; -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; +import javax.servlet.http.HttpServletRequest; /** * 用户认证 @@ -28,74 +28,76 @@ import org.springframework.stereotype.Service; @Service public class SystemAuthService { - @Autowired - private AppProperties properties; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private TokenProvider tokenProvider; - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private UserDetailsHandler userDetailsService; - @Autowired - private SystemCaptchaService systemCaptchaService; + @Autowired + private AppProperties properties; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; + @Autowired + private SystemCaptchaService systemCaptchaService; - /** - * 登录 - */ - public SystemAuthVo doLogin(SystemUserLoginArgs loginArgs, HttpServletRequest request) throws Exception { - KitValidUtil.notNull(loginArgs); + /** + * 登录 -> TestPassed + */ + public SystemAuthVo doLogin(SystemUserLoginArgs loginArgs, HttpServletRequest request) throws Exception { + KitValidUtil.notNull(loginArgs); - // 密码解密 - String password = KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginArgs.getPassword()); - // 校验验证码 - systemCaptchaService.validate(loginArgs.getUuid(), loginArgs.getCode()); - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginArgs.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginArgs.getPassword()); + // 校验验证码 + systemCaptchaService.validate(loginArgs.getUuid(), loginArgs.getCode()); + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginArgs.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 与 用户信息 + SystemAuthVo authInfo = new SystemAuthVo(); + authInfo.setToken(String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + /// 这里是为了清空密码 + authInfo.setUser(KitBeanUtil.copyToClass(jwtUser, SystemUserInfoVo.class)); + + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginArgs.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return authInfo; } - // 登录验证 - Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - SystemAuthVo authInfo = new SystemAuthVo(); - authInfo.setToken(String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - /// 这里是为了清空密码 - authInfo.setUser(KitBeanUtil.copyToClass(jwtUser, SystemUserInfoVo.class)); - - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginArgs.getUsername()); + /** + * 获取当前登录人信息 -> TestPassed + */ + public SystemUserJwtVo getCurrentUserInfo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo)KitSecurityHelper.getCurrentUser(); + if (jwtUser.getUser() != null) { + jwtUser.getUser().setPassword(null); + } + return jwtUser; } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return authInfo; - } - /** - * 获取当前登录人信息 - */ - public SystemUserJwtVo getCurrentUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); - if (jwtUser.getUser() != null) { - jwtUser.getUser().setPassword(null); + /** + * 退出登录 -> TestPassed + */ + public void doLogout(HttpServletRequest request) { + String token = tokenProvider.getToken(request); + systemUserOnlineInfoDAO.logoutByToken(token); } - return jwtUser; - } - - /** - * 退出登录 - */ - public void doLogout(HttpServletRequest request) { - String token = tokenProvider.getToken(request); - systemUserOnlineInfoDAO.logoutByToken(token); - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java index 44a6e777..2a6776e3 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemCaptchaService.java @@ -10,9 +10,9 @@ import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.system.dal.model.response.SystemCaptchaVo; import cn.odboy.system.dal.redis.SystemCacheKey; import com.wf.captcha.base.Captcha; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.concurrent.TimeUnit; /** * 验证码 @@ -20,49 +20,50 @@ import org.springframework.stereotype.Service; @Service public class SystemCaptchaService { - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private AppProperties properties; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; - /** - * 获取登录验证码 - */ - public SystemCaptchaVo getLoginCaptcha() { - // 获取运算的结果 - 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]; + /** + * 获取登录验证码 -> TestPassed + */ + public SystemCaptchaVo getLoginCaptcha() { + // 获取运算的结果 + 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); + // 验证码信息 + SystemCaptchaVo captchaVo = new SystemCaptchaVo(); + captchaVo.setUuid(uuid); + captchaVo.setImg(captcha.toBase64()); + return captchaVo; } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), TimeUnit.MINUTES); - // 验证码信息 - SystemCaptchaVo captchaVo = new SystemCaptchaVo(); - captchaVo.setUuid(uuid); - captchaVo.setImg(captcha.toBase64()); - return captchaVo; - } - /** - * 验证验证码 - * - * @param uuid 验证码uuid - * @param inputCode 用户输入的验证码 - */ - public void validate(String uuid, String inputCode) { - // 查询验证码 - String code = redisHelper.get(uuid, String.class); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); + /** + * 验证验证码 -> TestPassed + * + * @param uuid 验证码uuid + * @param inputCode 用户输入的验证码 + */ + public void validate(String uuid, String inputCode) { + // 查询验证码 + String code = redisHelper.get(uuid, String.class); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); + } + // 清除验证码 + redisHelper.del(uuid); + if (StrUtil.isBlank(inputCode) || !code.equalsIgnoreCase(inputCode)) { + throw new BadRequestException("验证码错误"); + } } - // 清除验证码 - redisHelper.del(uuid); - if (StrUtil.isBlank(inputCode) || !code.equalsIgnoreCase(inputCode)) { - throw new BadRequestException("验证码错误"); - } - } } 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 07ad023a..bc83e539 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 @@ -20,14 +20,14 @@ import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.response.SystemUserVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; /** * 数据权限 @@ -37,61 +37,61 @@ import org.springframework.stereotype.Service; @Service public class SystemDataService { - @Autowired - private SystemUserRoleService systemUserRoleService; - @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(SystemUserVo user) { - List deptIds = new ArrayList<>(); - // 查询用户角色 - Set roleList = systemUserRoleService.listUserRoleByUserId(user.getId()); - // 获取对应的部门ID - for (SystemRoleTb role : roleList) { - SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); - switch (Objects.requireNonNull(dataScopeEnum)) { - case THIS_LEVEL: - Long currentDeptId = user.getDept().getId(); - deptIds.add(currentDeptId); - break; - case CUSTOMIZE: - // 优化 283ms -> 51 ms - List customDeptIds = this.queryCustomDataPermissionV2ByArgs(deptIds, role.getId()); - deptIds.addAll(customDeptIds); - break; - default: - return new ArrayList<>(); - } + /** + * 获取数据权限 -> TestPassed + * + * @param user / + * @return / + */ + public List queryDeptIdByArgs(SystemUserVo user) { + List deptIds = new ArrayList<>(); + // 查询用户角色 + Set roleList = systemUserRoleService.listUserRoleByUserId(user.getId()); + // 获取对应的部门ID + for (SystemRoleTb role : roleList) { + SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); + switch (Objects.requireNonNull(dataScopeEnum)) { + case THIS_LEVEL: + Long currentDeptId = user.getDept().getId(); + deptIds.add(currentDeptId); + break; + case CUSTOMIZE: + // 优化 283ms -> 51 ms + List customDeptIds = this.queryCustomDataPermissionByArgs(deptIds, role.getId()); + deptIds.addAll(customDeptIds); + break; + default: + return new ArrayList<>(); + } + } + return deptIds.stream().distinct().collect(Collectors.toList()); } - return deptIds.stream().distinct().collect(Collectors.toList()); - } - /** - * 获取自定义的数据权限 - * - * @param deptIds 部门ID(外部数据) - * @param roleId 角色ID - * @return 数据权限ID(所有部门ID数据) - */ - private List queryCustomDataPermissionV2ByArgs(List deptIds, Long roleId) { - Set deptList = systemRoleDeptService.listUserDeptByRoleId(roleId); - Map> deptPidMap = systemDeptService.listPidNonNull().stream() - .collect(Collectors.groupingBy(SystemDeptTb::getPid)); - for (SystemDeptTb dept : deptList) { - deptIds.add(dept.getId()); - List deptChildren = deptPidMap.getOrDefault(dept.getId(), null); - if (CollUtil.isNotEmpty(deptChildren)) { - deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren, deptPidMap)); - } + /** + * 获取自定义的数据权限 -> TestPassed + * + * @param deptIds 部门ID(外部数据) + * @param roleId 角色ID + * @return 数据权限ID(所有部门ID数据) + */ + private List queryCustomDataPermissionByArgs(List deptIds, Long roleId) { + Set deptList = systemRoleDeptService.listUserDeptByRoleId(roleId); + Map> deptPidMap = + systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid)); + for (SystemDeptTb dept : deptList) { + deptIds.add(dept.getId()); + List deptChildren = deptPidMap.getOrDefault(dept.getId(), null); + if (CollUtil.isNotEmpty(deptChildren)) { + deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren, deptPidMap)); + } + } + return deptIds; } - return deptIds; - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java index 1cc24c76..e7a7f069 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 @@ -36,6 +36,10 @@ import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; @@ -47,454 +51,458 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Service public class SystemDeptService { - @Autowired - private SystemDeptMapper systemDeptMapper; - @Autowired - private SystemUserDeptService systemUserDeptService; - @Autowired - private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserDeptService systemUserDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDept(SystemCreateDeptArgs args) { - KitValidUtil.notNull(args); - systemDeptMapper.insert(KitBeanUtil.copyToClass(args, SystemDeptTb.class)); - this.updateDeptSubCnt(args.getPid()); - } + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDept(SystemCreateDeptArgs args) { + KitValidUtil.notNull(args); - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDeptById(SystemDeptTb args) { - KitValidUtil.notNull(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 record = KitBeanUtil.copyToClass(args, SystemDeptTb.class); + systemDeptMapper.insert(record); + + this.updateDeptSubCnt(args.getPid()); } - SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); - args.setId(dept.getId()); - systemDeptMapper.insertOrUpdate(args); - this.updateDeptSubCnt(oldPid); - this.updateDeptSubCnt(newPid); - } - private SystemDeptTb getDeptById(Long id) { - return systemDeptMapper.selectById(id); - } - - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDeptByIds(Set ids) { - // 获取部门, 和其所有子部门 - Set depts = this.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - this.verifyBindRelationByIds(depts); - for (SystemDeptVo dept : depts) { - systemDeptMapper.deleteById(dept.getId()); - this.updateDeptSubCnt(dept.getPid()); - } - } - - /** - * 更新父节点中子节点数目 - * - * @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) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); - wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); - wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); - wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); - wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemDeptTb::getDeptSort); - return systemDeptMapper.selectList(wrapper); - } - - /** - * 查询所有数据 - * - * @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; + /** + * 编辑 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptById(SystemDeptTb args) { + KitValidUtil.notNull(args); + // 旧的父部门 + Long oldPid = this.getDeptById(args.getId()).getPid(); + // 新的父部门 + Long newPid = args.getPid(); + if (args.getPid() != null && args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); } - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; + SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); + args.setId(dept.getId()); + systemDeptMapper.updateById(args); + this.updateDeptSubCnt(oldPid); + this.updateDeptSubCnt(newPid); + } + + /** + * 根据部门id获取部门信息 -> TestPassed + * + * @param id 部门id + * @return / + */ + private SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDeptByIds(Set ids) { + // 获取部门, 和其所有子部门 + Set depts = this.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + this.verifyBindRelationByIds(depts); + for (SystemDeptVo dept : depts) { + systemDeptMapper.deleteById(dept.getId()); + this.updateDeptSubCnt(dept.getPid()); } - } } - // 数据权限 - args.setIds(KitSecurityHelper.getCurrentUserDataScope()); - List list = this.queryDeptByArgs(args); - // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 - if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); - } - return list; - } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemDeptVo getDeptVoById(Long id) { - return KitBeanUtil.copyToClass(systemDeptMapper.selectById(id), SystemDeptVo.class); - } - - /** - * 获取部门下所有关联的部门 - * - * @param deptTbList / - * @param depts / - */ - private void queryRelationDeptByArgs(List deptTbList, Set depts) { - for (SystemDeptVo dept : deptTbList) { - depts.add(dept); - List deptList = this.listDeptVoByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } - } - } - - private List listDeptVoByPid(Long pid) { - return KitBeanUtil.copyToList(this.listDeptByPid(pid), SystemDeptVo.class); - } - - public List queryChildDeptIdByDeptIds(List deptList, Map> deptPidMap) { - List list = new ArrayList<>(); - for (SystemDeptTb systemDeptTb : deptList) { - if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = deptPidMap.getOrDefault(systemDeptTb.getId(), null); - if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(this.queryChildDeptIdByDeptIds(deptList1, deptPidMap)); + /** + * 更新父节点中子节点数目 -> TestPassed + * + * @param deptId / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptSubCnt(Long deptId) { + if (deptId != null) { + long count = this.countDeptByPid(deptId); + systemDeptMapper.updateDeptSubCountById(count, deptId); } - list.add(systemDeptTb.getId()); - } } - return list; - } - /** - * 根据ID获取同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(this.listRootDept()); - return deptList; + private long countDeptByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return systemDeptMapper.selectCount(wrapper); } - deptList.addAll(this.listDeptVoByPid(dept.getPid())); - return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); - } - private List listRootDept() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); - } - - /** - * 构建树形数据 - * - * @return / - */ - public KitPageResult searchDeptTree(List ids, Boolean exclude) { - Set deptSet1 = new LinkedHashSet<>(); - for (Long id : ids) { - // 同级数据 - SystemDeptVo dept = this.getDeptVoById(id); - // 上级数据 - List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); - if (exclude) { - for (SystemDeptVo data : depts) { - if (data.getId().equals(dept.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } + /** + * 筛选出 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); + } } - // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); - } - deptSet1.addAll(depts); + return deptList; } - List deptList = new ArrayList<>(deptSet1); - // 构建部门树 - Set trees = new LinkedHashSet<>(); - Set deptSet = new LinkedHashSet<>(); - List deptNames = deptList.stream().map(SystemDeptVo::getName).collect(Collectors.toList()); - boolean isChild; - for (SystemDeptVo dept : deptList) { - isChild = false; - if (dept.getPid() == null) { - trees.add(dept); - } - for (SystemDeptVo 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); + + private List queryDeptByArgs(SystemQueryDeptArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); + wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); + wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); + wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); + wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); } - } - if (isChild) { - deptSet.add(dept); - } else if (dept.getPid() != null && !deptNames.contains(this.getDeptVoById(dept.getPid()).getName())) { - deptSet.add(dept); - } + wrapper.orderByAsc(SystemDeptTb::getDeptSort); + return systemDeptMapper.selectList(wrapper); } - if (CollUtil.isEmpty(trees)) { - trees = deptSet; + + /** + * 查询所有数据 + * + * @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; } - KitPageResult baseResult = new KitPageResult<>(); - baseResult.setContent(CollUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); - baseResult.setTotalElements(deptSet.size()); - return baseResult; - } - /** - * 验证是否被角色或用户关联 - * - * @param deptSet / - */ - public void verifyBindRelationByIds(Set deptSet) { - Set deptIds = deptSet.stream().map(SystemDeptVo::getId).collect(Collectors.toSet()); - if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemDeptVo getDeptVoById(Long id) { + return KitBeanUtil.copyToClass(systemDeptMapper.selectById(id), SystemDeptVo.class); } - if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + + /** + * 获取部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + */ + private void queryRelationDeptByArgs(List deptTbList, Set depts) { + for (SystemDeptVo dept : deptTbList) { + depts.add(dept); + List deptList = this.listDeptVoByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } } - } - private List listEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return systemDeptMapper.selectList(wrapper); - } - - /** - * 遍历所有部门和子部门 - * - * @param ids / - */ - public Set traverseDeptByIdWithPids(Set ids) { - Set depts = new HashSet<>(); - for (Long id : ids) { - // 根部门 - depts.add(this.getDeptVoById(id)); - // 子部门 - List deptList = this.listDeptVoByPid(id); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptByArgs(deptList, depts); - } + private List listDeptVoByPid(Long pid) { + return KitBeanUtil.copyToList(this.listDeptByPid(pid), SystemDeptVo.class); } - return depts; - } - public List listDeptSelectDataSource() { - List depts = this.listEnabledDepts(); - return buildDeptSelectOptions(depts); - } - - private List buildDeptSelectOptions(List depts) { - // 获取所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - // 构建部门ID路径 - List pathIds = new ArrayList<>(); - buildDeptIdPath(dept, deptMap, pathIds); - // 反转路径,从顶级部门到当前部门 - Collections.reverse(pathIds); - SystemProductLineVo dto = new SystemProductLineVo(); - dto.setValue(dept.getId()); - dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); - // 保留名称路径用于显示 - dto.setLabel(buildNamePath(dept, deptMap)); - options.add(dto); + public List queryChildDeptIdByDeptIds(List deptList, Map> deptPidMap) { + List list = new ArrayList<>(); + for (SystemDeptTb systemDeptTb : deptList) { + if (systemDeptTb != null && systemDeptTb.getEnabled()) { + List deptList1 = deptPidMap.getOrDefault(systemDeptTb.getId(), null); + if (CollUtil.isNotEmpty(deptList1)) { + list.addAll(this.queryChildDeptIdByDeptIds(deptList1, deptPidMap)); + } + list.add(systemDeptTb.getId()); + } + } + return list; } - // 按部门名称路径排序 - 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); + /** + * 根据ID获取同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + private List querySuperiorDeptByPid(SystemDeptVo dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(this.listRootDept()); + return deptList; + } + deptList.addAll(this.listDeptVoByPid(dept.getPid())); + return querySuperiorDeptByPid(this.getDeptVoById(dept.getPid()), deptList); } - } - private 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); + private List listRootDept() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemDeptTb::getPid); + return KitBeanUtil.copyToList(systemDeptMapper.selectList(wrapper), SystemDeptVo.class); } - } - public List listDeptSelectProDataSource() { - 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); - } + /** + * 构建树形数据 + * + * @return / + */ + public KitPageResult searchDeptTree(List ids, Boolean exclude) { + Set deptSet1 = new LinkedHashSet<>(); + for (Long id : ids) { + // 同级数据 + SystemDeptVo dept = this.getDeptVoById(id); + // 上级数据 + List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); + if (exclude) { + for (SystemDeptVo 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); + } + List deptList = new ArrayList<>(deptSet1); + // 构建部门树 + Set trees = new LinkedHashSet<>(); + Set deptSet = new LinkedHashSet<>(); + List deptNames = deptList.stream().map(SystemDeptVo::getName).collect(Collectors.toList()); + boolean isChild; + for (SystemDeptVo dept : deptList) { + isChild = false; + if (dept.getPid() == null) { + trees.add(dept); + } + for (SystemDeptVo 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.getDeptVoById(dept.getPid()).getName())) { + deptSet.add(dept); + } + } + if (CollUtil.isEmpty(trees)) { + trees = deptSet; + } + KitPageResult baseResult = new KitPageResult<>(); + baseResult.setContent(CollUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); + baseResult.setTotalElements(deptSet.size()); + return baseResult; } - // 按排序字段排序 - 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)); - } + /** + * 验证是否被角色或用户关联 + * + * @param deptSet / + */ + public void verifyBindRelationByIds(Set deptSet) { + Set deptIds = deptSet.stream().map(SystemDeptVo::getId).collect(Collectors.toSet()); + if (systemUserDeptService.countUserByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); + } + if (systemRoleDeptService.countRoleByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + } } - // 子部门按排序字段排序 - 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 void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { - List systemDeptTbs = this.queryAllDeptByArgs(args, false); - List rowVos = new ArrayList<>(); - for (SystemDeptTb dataObject : systemDeptTbs) { - SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + private List listEnabledDepts() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + return systemDeptMapper.selectList(wrapper); } - KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); - } - public List listPidNonNull() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - wrapper.isNotNull(SystemDeptTb::getPid); - return systemDeptMapper.selectList(wrapper); - } + /** + * 遍历所有部门和子部门 + * + * @param ids / + */ + public Set traverseDeptByIdWithPids(Set ids) { + Set depts = new HashSet<>(); + for (Long id : ids) { + // 根部门 + depts.add(this.getDeptVoById(id)); + // 子部门 + List deptList = this.listDeptVoByPid(id); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } + return depts; + } + + public List listDeptSelectDataSource() { + List depts = this.listEnabledDepts(); + return buildDeptSelectOptions(depts); + } + + private List buildDeptSelectOptions(List depts) { + // 获取所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + for (SystemDeptTb dept : depts) { + // 构建部门ID路径 + List pathIds = new ArrayList<>(); + buildDeptIdPath(dept, deptMap, pathIds); + // 反转路径,从顶级部门到当前部门 + Collections.reverse(pathIds); + SystemProductLineVo dto = new SystemProductLineVo(); + dto.setValue(dept.getId()); + dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); + // 保留名称路径用于显示 + dto.setLabel(buildNamePath(dept, deptMap)); + options.add(dto); + } + // 按部门名称路径排序 + options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); + return options; + } + + private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { + pathIds.add(dept.getId()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); + } + } + + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } + + private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { + pathNames.add(dept.getName()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); + } + } + + public List listDeptSelectProDataSource() { + 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 void exportDeptXlsx(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { + List systemDeptTbs = this.queryAllDeptByArgs(args, false); + List rowVos = new ArrayList<>(); + for (SystemDeptTb dataObject : systemDeptTbs) { + SystemDeptExportRowVo rowVo = new SystemDeptExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "部门数据", SystemDeptExportRowVo.class, rowVos); + } + + public List listPidNonNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + wrapper.isNotNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictDetailService.java index bffcdd85..f7fac543 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,120 +31,122 @@ import cn.odboy.util.KitValidUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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; @Service public class SystemDictDetailService { - @Autowired - private SystemDictDetailMapper systemDictDetailMapper; - @Autowired - private SystemDictMapper systemDictMapper; + @Autowired + private SystemDictDetailMapper systemDictDetailMapper; + @Autowired + private SystemDictMapper systemDictMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDictDetail(SystemCreateDictDetailArgs args) { - KitValidUtil.notNull(args); - KitValidUtil.notNull(args.getDict()); - SystemDictDetailTb dictDetail = KitBeanUtil.copyToClass(args, SystemDictDetailTb.class); - dictDetail.setDictId(args.getDict().getId()); - systemDictDetailMapper.insert(dictDetail); - } - - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDictDetailById(SystemDictDetailTb args) { - SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); - args.setId(dictDetail.getId()); - systemDictDetailMapper.insertOrUpdate(args); - } - - /** - * 删除 - * - * @param id / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteDictDetailById(Long id) { - systemDictDetailMapper.deleteById(id); - } - - @Transactional(rollbackFor = Exception.class) - public void deleteDictDetailByDictIds(Set ids) { - if (CollUtil.isNotEmpty(ids)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemDictDetailTb::getDictId, ids); - systemDictDetailMapper.delete(wrapper); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDictDetail(SystemCreateDictDetailArgs args) { + KitValidUtil.notNull(args); + KitValidUtil.notNull(args.getDict()); + SystemDictDetailTb dictDetail = KitBeanUtil.copyToClass(args, SystemDictDetailTb.class); + dictDetail.setDictId(args.getDict().getId()); + systemDictDetailMapper.insert(dictDetail); } - } - private List listDictDetailByDictId(Long dictId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDictDetailTb::getDictId, dictId); - return systemDictDetailMapper.selectList(wrapper); - } + /** + * 编辑 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDictDetailById(SystemDictDetailTb args) { + SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); + args.setId(dictDetail.getId()); + systemDictDetailMapper.insertOrUpdate(args); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, Page page) { - IPage iPage = systemDictDetailMapper.selectPageByArgs(page, args).convert(i -> KitBeanUtil.copyToClass(i, SystemDictDetailVo.class)); - List dictIds = iPage.getRecords().stream().map(SystemDictDetailVo::getDictId).collect(Collectors.toList()); - Map id2ItemMap = systemDictMapper.selectByIds(dictIds).stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); - for (SystemDictDetailVo record : iPage.getRecords()) { - record.setDict(id2ItemMap.get(record.getDictId())); + /** + * 删除 -> TestPassed + * + * @param id / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictDetailById(Long id) { + systemDictDetailMapper.deleteById(id); } - return KitPageUtil.toPage(iPage); - } - /** - * 根据字典名称获取字典详情 - * - * @param name 字典名称 - * @return / - */ - public List listDictDetailByName(String name) { - if (StrUtil.isBlank(name)) { - return new ArrayList<>(); + @Transactional(rollbackFor = Exception.class) + public void deleteDictDetailByDictIds(Set ids) { + if (CollUtil.isNotEmpty(ids)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemDictDetailTb::getDictId, ids); + systemDictDetailMapper.delete(wrapper); + } } - SystemDictTb systemDictTb = systemDictMapper.getByName(name); - if (systemDictTb == null) { - return new ArrayList<>(); - } - List detailTbs = this.listDictDetailByDictId(systemDictTb.getId()); - List detailVos = KitBeanUtil.copyToList(detailTbs, SystemDictDetailVo.class); - for (SystemDictDetailVo detailVo : detailVos) { - detailVo.setDict(systemDictTb); - } - return detailVos; - } - public Map> getDictDetailMap(String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, this.listDictDetailByName(name)); + /** + * 分页查询 -> TestPassed + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, + Page page) { + IPage iPage = systemDictDetailMapper.selectPageByArgs(page, args); + List dictIds = + iPage.getRecords().stream().map(SystemDictDetailVo::getDictId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(dictIds)) { + Map id2ItemMap = + systemDictMapper.selectByIds(dictIds).stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); + for (SystemDictDetailVo record : iPage.getRecords()) { + record.setDict(id2ItemMap.get(record.getDictId())); + } + } + return KitPageUtil.toPage(iPage); + } + + /** + * 根据字典名称获取字典详情 -> TestPassed + * + * @param name 字典名称 + * @return / + */ + public List listDictDetailByName(String name) { + if (StrUtil.isBlank(name)) { + return new ArrayList<>(); + } + List detailVos = systemDictDetailMapper.listDictDetailByName(name); + if (CollUtil.isNotEmpty(detailVos)) { + SystemDictDetailVo systemDictDetailVo = detailVos.stream().findFirst().orElse(null); + if (systemDictDetailVo != null) { + SystemDictTb systemDictTb = systemDictMapper.selectById(systemDictDetailVo.getDictId()); + if (systemDictTb != null) { + for (SystemDictDetailVo detailVo : detailVos) { + detailVo.setDict(systemDictTb); + } + } + } + } + return detailVos; + } + + 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; } - return dictMap; - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java index 2432fc06..ba298b9b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDictService.java @@ -29,111 +29,111 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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) { - SystemDictTb dictTb = KitBeanUtil.copyToClass(args, SystemDictTb.class); - systemDictMapper.insert(dictTb); - } - - /** - * 编辑 - * - * @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 args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.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())); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDict(SystemCreateDictArgs args) { + SystemDictTb dictTb = KitBeanUtil.copyToClass(args, SystemDictTb.class); + systemDictMapper.insert(dictTb); } - } - public List queryDictByArgs(SystemQueryDictArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(args, wrapper); - return systemDictMapper.selectList(wrapper); - } + /** + * 编辑 -> TestPassed + * + * @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); + } - public void exportDictXlsx(HttpServletResponse response, SystemQueryDictArgs args) { - List systemDictTbs = this.queryDictByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemDictTb dataObject : systemDictTbs) { - List dictDetails = systemDictDetailService.listDictDetailByName(dataObject.getName()); - if (CollUtil.isEmpty(dictDetails)) { - SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVo.setLabel(""); - rowVo.setValue(""); - rowVos.add(rowVo); - continue; - } - for (SystemDictDetailVo dictDetail : dictDetails) { - SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVo.setLabel(dictDetail.getLabel()); - rowVo.setValue(dictDetail.getValue()); - rowVos.add(rowVo); - } + /** + * 删除 -> TestPassed + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictByIds(Set ids) { + // 删除字典 + systemDictMapper.deleteByIds(ids); + // 删除字典详情 + systemDictDetailService.deleteDictDetailByDictIds(ids); + } + + /** + * 分页查询 -> TestPassed + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.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())); + } + } + + public List queryDictByArgs(SystemQueryDictArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemDictMapper.selectList(wrapper); + } + + public void exportDictXlsx(HttpServletResponse response, SystemQueryDictArgs args) { + List systemDictTbs = this.queryDictByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemDictTb dataObject : systemDictTbs) { + List dictDetails = systemDictDetailService.listDictDetailByName(dataObject.getName()); + if (CollUtil.isEmpty(dictDetails)) { + SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVo.setLabel(""); + rowVo.setValue(""); + rowVos.add(rowVo); + continue; + } + for (SystemDictDetailVo dictDetail : dictDetails) { + SystemDictExportRowVo rowVo = new SystemDictExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVo.setLabel(dictDetail.getLabel()); + rowVo.setValue(dictDetail.getValue()); + rowVos.add(rowVo); + } + } + KitExcelExporter.exportSimple(response, "字典数据", SystemDictExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "字典数据", SystemDictExportRowVo.class, rowVos); - } } 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 2256d86f..d18e303b 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 @@ -30,134 +30,134 @@ import cn.odboy.system.dal.model.request.SystemSendEmailArgs; import cn.odboy.system.dal.mysql.SystemEmailConfigMapper; import cn.odboy.util.KitDesEncryptUtil; import cn.odboy.util.KitResourceTemplateUtil; -import java.util.Collections; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; @Slf4j @Service public class SystemEmailService { - @Autowired - private SystemEmailConfigMapper systemEmailConfigMapper; - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private AppProperties properties; + @Autowired + private SystemEmailConfigMapper systemEmailConfigMapper; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; - /** - * 更新邮件配置 - * - * @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())); + /** + * 更新邮件配置 -> TestPassed + * + * @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); } - systemEmailConfigTb.setId(1L); - systemEmailConfigMapper.insertOrUpdate(systemEmailConfigTb); - } - /** - * 发送邮件 - * - * @param sendEmailRequest 邮件发送的内容 - */ - public void sendEmail(SystemSendEmailArgs sendEmailRequest) { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (systemEmailConfigTb.getId() == null) { - throw new BadRequestException("请先配置, 再操作"); + /** + * 发送邮件 -> TestPassed + * + * @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("邮件发送失败"); + } } - // 封装 - 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 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); + /** + * 校验邮箱验证码 -> TestPassed + */ + public void checkEmailCaptchaV1(SystemCaptchaBizEnum biEnum, String email, String code) { + String redisKey = biEnum.getRedisKey() + email; + String value = redisHelper.get(redisKey, String.class); + if (value == null || !value.equals(code)) { + throw new BadRequestException("无效验证码"); + } else { + redisHelper.del(redisKey); + } } - } - /** - * 发送给邮箱验证码 - */ - public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { - if (biEnum == null) { - throw new BadRequestException("biEnum必填"); + /** + * 发送给邮箱验证码 + */ + 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), SystemConst.CURRENT_APP_TITLE, content); + sendEmail(sendEmailRequest); } - 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), SystemConst.CURRENT_APP_TITLE, 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("不支持的业务"); + public void checkEmailCaptcha(SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); + } + this.checkEmailCaptchaV1(biEnum, args.getEmail(), args.getCode()); } - 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 630a2cf4..392ffdbf 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 @@ -29,130 +29,129 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @Service public class SystemJobService { - @Autowired - private SystemJobMapper systemJobMapper; - @Autowired - private SystemUserJobService systemUserJobService; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemUserJobService systemUserJobService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveJob(SystemCreateJobArgs args) { - SystemJobTb job = this.getJobByName(args.getName()); - if (job != null) { - throw new BadRequestException("职位名称已存在"); + /** + * 创建 -> TestPassed + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveJob(SystemCreateJobArgs args) { + SystemJobTb job = this.getJobByName(args.getName()); + if (job != null) { + throw new BadRequestException("职位名称已存在"); + } + SystemJobTb systemJobTb = KitBeanUtil.copyToClass(args, SystemJobTb.class); + systemJobMapper.insert(systemJobTb); } - SystemJobTb systemJobTb = KitBeanUtil.copyToClass(args, SystemJobTb.class); - systemJobMapper.insert(systemJobTb); - } - /** - * 编辑 - * - * @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("职位名称已存在"); + /** + * 编辑 -> TestPassed + * + * @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.updateById(args); } - args.setId(job.getId()); - systemJobMapper.insertOrUpdate(args); - } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteJobByIds(Set ids) { - // 验证是否被用户关联 - this.verifyBindRelationByIds(ids); - systemJobMapper.deleteByIds(ids); - } - - /** - * 分页查询 - * - * @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); - } - - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserJobService.countUserByJobIds(ids) > 0) { - throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); + /** + * 删除 -> TestPassed + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + // 验证是否被用户关联 + this.verifyBindRelationByIds(ids); + systemJobMapper.deleteByIds(ids); } - } - 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)); - } + /** + * 分页查询 -> TestPassed + * + * @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); } - wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); - } - public void exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { - List systemJobTbs = this.queryJobByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemJobTb dataObject : systemJobTbs) { - SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 查询全部数据 -> TestPassed + */ + public List queryJobByArgs(SystemQueryJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemJobMapper.selectList(wrapper); } - KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); - } - public List listByIds(Set jobIds) { - return systemJobMapper.selectByIds(jobIds); - } + /** + * 验证是否被用户关联 -> TestPassed + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserJobService.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 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 exportJobXlsx(HttpServletResponse response, SystemQueryJobArgs args) { + List systemJobTbs = this.queryJobByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemJobTb dataObject : systemJobTbs) { + SystemJobExportRowVo rowVo = new SystemJobExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setEnabled(dataObject.getEnabled() ? "启用" : "停用"); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "岗位数据", SystemJobExportRowVo.class, rowVos); + } + + public List listByIds(Set jobIds) { + return systemJobMapper.selectByIds(jobIds); + } } 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 f0343d10..aef880cd 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 @@ -36,142 +36,142 @@ import cn.odboy.util.KitPageUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.io.File; -import java.util.Date; -import java.util.List; -import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.Date; +import java.util.List; @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("上传失败"); + /** + * 上传 -> TestPassed + * + * @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; + } } - 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; + + /** + * 编辑 -> TestPassed + * + * @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() + " 失败"); - } + /** + * 多选删除 -> TestPassed + * + * @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 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)); - } + /** + * 分页查询 -> TestPassed + * + * @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); } - wrapper.orderByDesc(SystemLocalStorageTb::getId); - } - 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("只能上传图片"); + 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); } - return KitSpringBeanHolder.getBean(SystemLocalStorageService.class).uploadFile(null, file); - } - public void exportLocalStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { - List systemLocalStorageTbs = this.queryLocalStorageByArgs(args); - List rowVos = KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class); - KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos); - } + 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); + } + + public void exportLocalStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { + List systemLocalStorageTbs = this.queryLocalStorageByArgs(args); + List rowVos = + KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class); + KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos); + } } 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 0d7fa156..470cbd1f 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 @@ -36,6 +36,10 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; @@ -45,435 +49,428 @@ import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Service public class SystemMenuService { + @Autowired + private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemUserRoleService systemUserRoleService; - @Autowired - private SystemMenuMapper systemMenuMapper; - @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(SystemTransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(SystemTransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - systemMenuMapper.insert(args); - // 计算子节点数目 - args.setSubCount(0); - // 更新父节点菜单数目 - this.updateMenuSubCnt(args.getPid()); - } - - /** - * 编辑 - * - * @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(SystemTransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(SystemTransferProtocolConst.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(this.getMenuVoById(id)); - menuSet = this.queryChildMenuByArgs(menuList, menuSet); - } - List menuIds = - menuSet.stream().map(SystemMenuVo::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(menuIds)) { - systemRoleMenuService.deleteRoleMenuByMenuIds(menuIds); - systemMenuMapper.deleteByIds(menuIds); - } - for (SystemMenuVo menu : menuSet) { - this.updateMenuSubCnt(menu.getPid()); - } - } - - private SystemMenuVo getMenuVoById(Long id) { - return KitBeanUtil.copyToClass(systemMenuMapper.selectById(id), SystemMenuVo.class); - } - - @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 args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveMenu(SystemMenuTb args) { + if (this.getMenuByTitle(args.getTitle()) != null) { + throw new BadRequestException("菜单标题已存在"); } - // 如果有查询条件, 则不指定pidIsNull - if (ObjectUtil.isNotNull(val)) { - args.setPidIsNull(null); - break; + if (StrUtil.isNotBlank(args.getComponentName())) { + if (this.getMenuByComponentName(args.getComponentName()) != null) { + throw new BadRequestException("菜单组件名称已存在"); + } } - } - } - return this.queryMenuByArgs(args); - } - - /** - * 根据当前用户获取菜单 - * - * @param currentUserId / - * @return / - */ - public List listMenuByUserId(Long currentUserId) { - List roles = systemUserRoleService.queryRoleVoByUsersId(currentUserId); - Set roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); - return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); - } - - /** - * 获取所有子节点, 包含自身ID - * - * @param menuList / - * @param menuSet / - * @return / - */ - public Set queryChildMenuByArgs(List menuList, Set menuSet) { - for (SystemMenuVo 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 KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); - } else { - menus = this.listRootMenu(); - } - return menus; - } - - /** - * 根据ID获取同级与上级数据 - * - * @param menu / - * @param menus / - * @return / - */ - public List querySuperiorMenuByArgs(SystemMenuVo menu, List menus) { - if (menu.getPid() == null) { - menus.addAll(this.listRootMenu()); - return menus; - } - menus.addAll(this.listMenuByPid(menu.getPid())); - return querySuperiorMenuByArgs(this.getMenuVoById(menu.getPid()), menus); - } - - /** - * 构建菜单树 - * - * @param menus 原始数据 - * @return / - */ - public List buildMenuTree(List menus) { - List trees = new ArrayList<>(); - Set ids = new HashSet<>(); - for (SystemMenuVo menu : menus) { - if (menu.getPid() == null) { - trees.add(menu); - } - for (SystemMenuVo 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 (Long.valueOf(0L).equals(args.getPid())) { + args.setPid(null); } - } + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTP) || args.getPath() + .toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(SystemTransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + systemMenuMapper.insert(args); + // 计算子节点数目 + args.setSubCount(0); + // 更新父节点菜单数目 + this.updateMenuSubCnt(args.getPid()); } - 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<>(); - for (SystemMenuVo menu : menus) { - if (menu != null) { - List menuList = menu.getChildren(); - SystemMenuRouterVo menuVo = new SystemMenuRouterVo(); - menuVo.setName( - ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); - // 一级目录需要加斜杠, 不然会报警告 - menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); - menuVo.setHidden(menu.getHidden()); - // 如果不是外链 + /** + * 编辑 + * + * @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(SystemTransferProtocolConst.PREFIX_HTTP) || args.getPath() + .toLowerCase().startsWith(SystemTransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(SystemTransferProtocolConst.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(this.getMenuVoById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + } + List menuIds = + menuSet.stream().map(SystemMenuVo::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(menuIds)) { + systemRoleMenuService.deleteRoleMenuByMenuIds(menuIds); + systemMenuMapper.deleteByIds(menuIds); + } + for (SystemMenuVo menu : menuSet) { + this.updateMenuSubCnt(menu.getPid()); + } + } + + private SystemMenuVo getMenuVoById(Long id) { + return KitBeanUtil.copyToClass(systemMenuMapper.selectById(id), SystemMenuVo.class); + } + + @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; + } + // 如果有查询条件, 则不指定pidIsNull + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; + } + } + } + return this.queryMenuByArgs(args); + } + + /** + * 根据当前用户获取菜单 + * + * @param currentUserId / + * @return / + */ + public List listMenuByUserId(Long currentUserId) { + List roles = systemUserRoleService.queryRoleVoByUsersId(currentUserId); + Set roleIds = roles.stream().map(SystemRoleVo::getId).collect(Collectors.toSet()); + return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); + } + + /** + * 获取所有子节点, 包含自身ID + * + * @param menuList / + * @param menuSet / + * @return / + */ + public Set queryChildMenuByArgs(List menuList, Set menuSet) { + for (SystemMenuVo 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 KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); + } else { + menus = this.listRootMenu(); + } + return menus; + } + + /** + * 根据ID获取同级与上级数据 + * + * @param menu / + * @param menus / + * @return / + */ + public List querySuperiorMenuByArgs(SystemMenuVo menu, List menus) { + if (menu.getPid() == null) { + menus.addAll(this.listRootMenu()); + return menus; + } + menus.addAll(this.listMenuByPid(menu.getPid())); + return querySuperiorMenuByArgs(this.getMenuVoById(menu.getPid()), menus); + } + + /** + * 构建菜单树 + * + * @param menus 原始数据 + * @return / + */ + public List buildMenuTree(List menus) { + List trees = new ArrayList<>(); + Set ids = new HashSet<>(); + for (SystemMenuVo menu : menus) { + if (menu.getPid() == null) { + trees.add(menu); + } + for (SystemMenuVo 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<>(); + for (SystemMenuVo menu : menus) { + if (menu != null) { + List menuList = menu.getChildren(); + SystemMenuRouterVo menuVo = new SystemMenuRouterVo(); + 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 (CollUtil.isNotEmpty(menuList)) { + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenuVo(menuList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if (menu.getPid() == null) { + SystemMenuRouterVo 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 SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { + SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 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()); - } + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menu.getPath()); } - menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); - if (CollUtil.isNotEmpty(menuList)) { - menuVo.setAlwaysShow(true); - menuVo.setRedirect("noredirect"); - menuVo.setChildren(buildMenuVo(menuList)); - // 处理是一级菜单并且没有子菜单的情况 - } else if (menu.getPid() == null) { - SystemMenuRouterVo 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 menuVo1; } - return list; - } - /** - * 获取 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuRouterVo getMenuVo(SystemMenuVo menu, SystemMenuRouterVo menuVo) { - SystemMenuRouterVo menuVo1 = new SystemMenuRouterVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 - if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); + public List listMenuByIds(List ids) { + return KitBeanUtil.copyToList(systemMenuMapper.selectByIds(ids), SystemMenuVo.class); } - return menuVo1; - } - public List listMenuByIds(List ids) { - return KitBeanUtil.copyToList(systemMenuMapper.selectByIds(ids), SystemMenuVo.class); - } + private SystemMenuTb getMenuByComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return systemMenuMapper.selectOne(wrapper); + } - 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 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 Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return systemMenuMapper.selectCount(wrapper); - } - - private List queryMenuByArgs(SystemQueryMenuArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); - wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() + private List queryMenuByArgs(SystemQueryMenuArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); + wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() .like(SystemMenuTb::getComponentName, args.getBlurry()).or() .like(SystemMenuTb::getPermission, args.getBlurry())); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), - args.getCreateTime().get(1)); - } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return systemMenuMapper.selectList(wrapper); - } - - private List listRootMenu() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); - } - - public List buildFrontMenus() { - List originMenus = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); - List targetMenus = this.buildMenuTree(originMenus); - return this.buildMenuVo(targetMenus); - } - - public Set listChildMenuSetByMenuId(Long id) { - Set menuSet = new HashSet<>(); - List menuList = this.listMenuByPid(id); - menuSet.add(this.getMenuVoById(id)); - menuSet = this.queryChildMenuByArgs(menuList, menuSet); - return menuSet.stream().map(SystemMenuVo::getId).collect(Collectors.toSet()); - } - - public List listMenuSuperior(List ids) { - Set menus; - List systemMenuTbs; - if (CollUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(this.listMenuByIds(ids)); - for (SystemMenuVo menu : menus) { - List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); - for (SystemMenuVo data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - List newMenuList = new ArrayList<>(menus); - systemMenuTbs = this.buildMenuTree(newMenuList); - } else { - systemMenuTbs = this.listMenuByPid(null); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); } - return systemMenuTbs; - } - public void exportMenuXlsx(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { - List systemMenuTbs = this.queryAllMenu(args, false); - List rowVos = new ArrayList<>(); - for (SystemMenuTb dataObject : systemMenuTbs) { - SystemMenuExportRowVo rowVo = new SystemMenuExportRowVo(); - rowVo.setTitle(dataObject.getTitle()); - rowVo.setType(dataObject.getType() == null ? "目录" : dataObject.getType() == 1 ? "菜单" : "按钮"); - rowVo.setPermission(dataObject.getPermission()); - rowVo.setIFrame(dataObject.getIFrame() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); - rowVo.setHidden(dataObject.getHidden() ? SystemYesOrNoChConst.NO_STR : SystemYesOrNoChConst.YES_STR); - rowVo.setCache(dataObject.getCache() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + private List listRootMenu() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return KitBeanUtil.copyToList(systemMenuMapper.selectList(wrapper), SystemMenuVo.class); + } + + public List buildFrontMenus() { + List originMenus = this.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); + List targetMenus = this.buildMenuTree(originMenus); + return this.buildMenuVo(targetMenus); + } + + public Set listChildMenuSetByMenuId(Long id) { + Set menuSet = new HashSet<>(); + List menuList = this.listMenuByPid(id); + menuSet.add(this.getMenuVoById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + return menuSet.stream().map(SystemMenuVo::getId).collect(Collectors.toSet()); + } + + public List listMenuSuperior(List ids) { + Set menus; + List systemMenuTbs; + if (CollUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(this.listMenuByIds(ids)); + for (SystemMenuVo menu : menus) { + List menuList = this.querySuperiorMenuByArgs(menu, new ArrayList<>()); + for (SystemMenuVo 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()); + List newMenuList = new ArrayList<>(menus); + systemMenuTbs = this.buildMenuTree(newMenuList); + } else { + systemMenuTbs = this.listMenuByPid(null); + } + return systemMenuTbs; + } + + public void exportMenuXlsx(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { + List systemMenuTbs = this.queryAllMenu(args, false); + List rowVos = new ArrayList<>(); + for (SystemMenuTb dataObject : systemMenuTbs) { + SystemMenuExportRowVo rowVo = new SystemMenuExportRowVo(); + rowVo.setTitle(dataObject.getTitle()); + rowVo.setType(dataObject.getType() == null ? "目录" : dataObject.getType() == 1 ? "菜单" : "按钮"); + rowVo.setPermission(dataObject.getPermission()); + rowVo.setIFrame(dataObject.getIFrame() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); + rowVo.setHidden(dataObject.getHidden() ? SystemYesOrNoChConst.NO_STR : SystemYesOrNoChConst.YES_STR); + rowVo.setCache(dataObject.getCache() ? SystemYesOrNoChConst.YES_STR : SystemYesOrNoChConst.NO_STR); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "菜单数据", SystemMenuExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "菜单数据", SystemMenuExportRowVo.class, rowVos); - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java index ce6e401e..a58f1636 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMonitorService.java @@ -20,13 +20,6 @@ import cn.hutool.core.date.DateUtil; import cn.odboy.constant.SystemConst; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitIPUtil; -import java.lang.management.ManagementFactory; -import java.text.DecimalFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import oshi.SystemInfo; @@ -39,177 +32,184 @@ import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.FormatUtil; import oshi.util.Util; +import java.lang.management.ManagementFactory; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Slf4j @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); + /** + * 查询服务器监控信息 -> TestPassed + * + * @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 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; - } + /** + * 获取磁盘信息 + * + * @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; } - 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); + + /** + * 获取交换区信息 + * + * @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; } - 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)); + /** + * 获取内存信息 + * + * @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; } - 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; - } - - /** - * 获取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(); + /** + * 获取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; } - 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/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java index 917696ca..337cdf16 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOperationLogService.java @@ -14,13 +14,16 @@ import org.springframework.stereotype.Service; @Service public class SystemOperationLogService { - @Autowired - private SystemOperationLogMapper systemOperationLogMapper; + @Autowired + private SystemOperationLogMapper systemOperationLogMapper; - public IPage searchUserLog(KitPageArgs pageArgs) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemOperationLogTb::getUsername, KitSecurityHelper.getCurrentUsername()); - Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); - return systemOperationLogMapper.selectPage(page, wrapper); - } + /** + * 查询用户操作日志 + */ + public IPage searchUserLog(KitPageArgs pageArgs) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemOperationLogTb::getUsername, KitSecurityHelper.getCurrentUsername()); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return systemOperationLogMapper.selectPage(page, wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java index 4b557483..5234b0a6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java @@ -21,9 +21,9 @@ import cn.odboy.system.dal.model.request.SystemQueryStorageArgs; import cn.odboy.system.dal.model.response.SystemOssStorageVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; -import javax.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.util.List; /** *

@@ -35,13 +35,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); - String uploadFile(MultipartFile file); + String uploadFile(MultipartFile file); - void deleteFileByIds(Long[] ids); + void deleteFileByIds(Long[] ids); - void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args); + void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args); } 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 e4cee023..fb2de69b 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 @@ -38,279 +38,283 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import javax.servlet.http.HttpServletResponse; import org.quartz.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; @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; - /** - * 验证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,请重新输入!"); + /** + * 验证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 createJob(SystemQuartzJobVo args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void createJob(SystemQuartzJobVo args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); + } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); + } + SystemQuartzJobTb record = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insert(record); + quartzManage.addJob(args); } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); + + /** + * 修改任务并重新调度 + * + * @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 jobTb = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(jobTb); + SystemQuartzJobVo jobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class); + quartzManage.updateJobCron(jobVo); } - SystemQuartzJobTb record = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insert(record); - quartzManage.addJob(args); - } - /** - * 修改任务并重新调度 - * - * @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表达式格式错误"); + /** + * 更改定时任务状态 + * + * @param quartzJob / + */ + @Transactional(rollbackFor = Exception.class) + public void switchQuartzJobStatus(SystemQuartzJobVo quartzJob) { + // 置换暂停状态 + if (quartzJob.getIsPause()) { + quartzManage.resumeJob(quartzJob); + quartzJob.setIsPause(false); + } else { + quartzManage.pauseJob(quartzJob); + quartzJob.setIsPause(true); + } + SystemQuartzJobTb quartzJobTb = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(quartzJobTb); } - if (StrUtil.isNotBlank(args.getSubTask())) { - List tasks = Arrays.asList(args.getSubTask().split("[,,]")); - if (tasks.contains(args.getId().toString())) { - throw new BadRequestException("子任务中不能添加当前任务ID"); - } + + /** + * 立即执行定时任务 + * + * @param quartzJob / + */ + public void startQuartzJob(SystemQuartzJobVo quartzJob) { + quartzManage.runJobNow(quartzJob); } - SystemQuartzJobTb jobTb = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(jobTb); - SystemQuartzJobVo jobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class); - quartzManage.updateJobCron(jobVo); - } - /** - * 更改定时任务状态 - * - * @param quartzJob / - */ - @Transactional(rollbackFor = Exception.class) - public void switchQuartzJobStatus(SystemQuartzJobVo quartzJob) { - // 置换暂停状态 - if (quartzJob.getIsPause()) { - quartzManage.resumeJob(quartzJob); - quartzJob.setIsPause(false); - } else { - quartzManage.pauseJob(quartzJob); - quartzJob.setIsPause(true); + /** + * 删除任务 + * + * @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); + } } - SystemQuartzJobTb quartzJobTb = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(quartzJobTb); - } - /** - * 立即执行定时任务 - * - * @param quartzJob / - */ - public void startQuartzJob(SystemQuartzJobVo quartzJob) { - quartzManage.runJobNow(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 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; + } + SystemQuartzJobVo quartzJob = systemQuartzJobMapper.selectVoById(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 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; - } - SystemQuartzJobVo quartzJob = systemQuartzJobMapper.selectVoById(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 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 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 injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - KitValidUtil.notNull(args); - 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)); + private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, + LambdaQueryWrapper wrapper) { + KitValidUtil.notNull(args); + 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); } - wrapper.orderByDesc(SystemQuartzJobTb::getId); - } - private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper wrapper) { - if (args != null) { - wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); - wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); - if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); - } + 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); } - wrapper.orderByDesc(SystemQuartzLogTb::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)); - } - - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(args, wrapper); - return systemQuartzJobMapper.selectList(wrapper); - } - - /** - * 查询全部 - * - * @param args 条件 - * @return / - */ - public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(args, wrapper); - return systemQuartzLogMapper.selectList(wrapper); - } - - public SystemQuartzJobVo getQuartzJobById(Long id) { - return KitBeanUtil.copyToClass(systemQuartzJobMapper.selectById(id), SystemQuartzJobVo.class); - } - - public List listEnableQuartzJob() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemQuartzJobTb::getIsPause, 0); - return KitBeanUtil.copyToList(systemQuartzJobMapper.selectList(wrapper), SystemQuartzJobVo.class); - } - - public void exportQuartzJobXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { - List systemQuartzJobTbs = this.queryQuartzJobByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { - SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); - rowVo.setJobName(dataObject.getJobName()); - rowVo.setBeanName(dataObject.getBeanName()); - rowVo.setMethodName(dataObject.getMethodName()); - rowVo.setParams(dataObject.getParams()); - rowVo.setCronExpression(dataObject.getCronExpression()); - rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中"); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 分页查询日志 + * + * @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)); } - KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); - } - public void exportQuartzLogXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { - List systemQuartzLogTbs = this.queryQuartzLogByArgs(args); - List rowVos = new ArrayList<>(); - for (SystemQuartzLogTb dataObject : systemQuartzLogTbs) { - SystemQuartzLogExportRowVo rowVo = new SystemQuartzLogExportRowVo(); - rowVo.setJobName(dataObject.getJobName()); - rowVo.setBeanName(dataObject.getBeanName()); - rowVo.setMethodName(dataObject.getMethodName()); - rowVo.setParams(dataObject.getParams()); - rowVo.setCronExpression(dataObject.getCronExpression()); - rowVo.setExceptionDetail(dataObject.getExceptionDetail()); - rowVo.setTime(dataObject.getTime()); - rowVo.setStatus(dataObject.getIsSuccess() ? "成功" : "失败"); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return systemQuartzJobMapper.selectList(wrapper); + } + + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return systemQuartzLogMapper.selectList(wrapper); + } + + public SystemQuartzJobVo getQuartzJobById(Long id) { + return KitBeanUtil.copyToClass(systemQuartzJobMapper.selectById(id), SystemQuartzJobVo.class); + } + + public List listEnableQuartzJob() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemQuartzJobTb::getIsPause, 0); + return KitBeanUtil.copyToList(systemQuartzJobMapper.selectList(wrapper), SystemQuartzJobVo.class); + } + + public void exportQuartzJobXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { + List systemQuartzJobTbs = this.queryQuartzJobByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { + SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); + rowVo.setJobName(dataObject.getJobName()); + rowVo.setBeanName(dataObject.getBeanName()); + rowVo.setMethodName(dataObject.getMethodName()); + rowVo.setParams(dataObject.getParams()); + rowVo.setCronExpression(dataObject.getCronExpression()); + rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中"); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); + } + + public void exportQuartzLogXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) { + List systemQuartzLogTbs = this.queryQuartzLogByArgs(args); + List rowVos = new ArrayList<>(); + for (SystemQuartzLogTb dataObject : systemQuartzLogTbs) { + SystemQuartzLogExportRowVo rowVo = new SystemQuartzLogExportRowVo(); + rowVo.setJobName(dataObject.getJobName()); + rowVo.setBeanName(dataObject.getBeanName()); + rowVo.setMethodName(dataObject.getMethodName()); + rowVo.setParams(dataObject.getParams()); + rowVo.setCronExpression(dataObject.getCronExpression()); + rowVo.setExceptionDetail(dataObject.getExceptionDetail()); + rowVo.setTime(dataObject.getTime()); + rowVo.setStatus(dataObject.getIsSuccess() ? "成功" : "失败"); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "定时任务日志数据", SystemQuartzLogExportRowVo.class, rowVos); } - KitExcelExporter.exportSimple(response, "定时任务日志数据", SystemQuartzLogExportRowVo.class, rowVos); - } } 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 172dbdb0..7285175e 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 @@ -21,67 +21,67 @@ import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; import cn.odboy.system.dal.mysql.SystemDeptMapper; import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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 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 deptIds 部门ID集合 - * @return / - */ - public Long countRoleByDeptIds(Set deptIds) { - if (CollUtil.isEmpty(deptIds)) { - return 0L; + @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); + } } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); - return systemRoleDeptMapper.selectCount(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 角色id - * @return / - */ - public Set listUserDeptByRoleId(Long roleId) { - return systemRoleDeptMapper.listUserDeptByRoleId(roleId); - } + /** + * 根据部门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); + } + + /** + * 根据角色id查询部门信息 + * + * @param roleId 角色id + * @return / + */ + public Set listUserDeptByRoleId(Long roleId) { + return systemRoleDeptMapper.listUserDeptByRoleId(roleId); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java index 2dde9009..c86ef87b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleMenuService.java @@ -23,82 +23,82 @@ import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; import cn.odboy.util.KitBeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; 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; @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 batchInsertRoleMenu(Set menus, Long roleId) { - if (CollUtil.isNotEmpty(menus)) { - List records = new ArrayList<>(); - for (SystemMenuVo 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 deleteRoleMenuByRoleId(Long roleId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleMenuTb::getRoleId, roleId); + 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); + @Transactional(rollbackFor = Exception.class) + public void batchInsertRoleMenu(Set menus, Long roleId) { + if (CollUtil.isNotEmpty(menus)) { + List records = new ArrayList<>(); + for (SystemMenuVo menu : menus) { + SystemRoleMenuTb record = new SystemRoleMenuTb(); + record.setMenuId(menu.getId()); + record.setRoleId(roleId); + records.add(record); + } + systemRoleMenuMapper.insert(records); + } } - } - public LinkedHashSet queryMenuByRoleIds(Set roleIds) { - if (CollUtil.isEmpty(roleIds)) { - return new LinkedHashSet<>(); + @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); + } } - 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); - List systemMenuTbs = systemMenuMapper.selectList(menuWrapper); - List systemMenuVos = KitBeanUtil.copyToList(systemMenuTbs, SystemMenuVo.class); - return new LinkedHashSet<>(systemMenuVos); - } + 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); - @Transactional(rollbackFor = Exception.class) - public void deleteRoleMenuByMenuIds(List menuIds) { - if (CollUtil.isEmpty(menuIds)) { - return; + List systemMenuTbs = systemMenuMapper.selectList(menuWrapper); + List systemMenuVos = KitBeanUtil.copyToList(systemMenuTbs, SystemMenuVo.class); + return new LinkedHashSet<>(systemMenuVos); + } + + @Transactional(rollbackFor = Exception.class) + public void deleteRoleMenuByMenuIds(List menuIds) { + if (CollUtil.isEmpty(menuIds)) { + return; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); + systemRoleMenuMapper.delete(wrapper); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); - systemRoleMenuMapper.delete(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 88412cd2..d22dfe52 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 @@ -36,268 +36,264 @@ import cn.odboy.util.KitValidUtil; import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; 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.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 SystemUserRoleService systemUserRoleService; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemUserRoleService systemUserRoleService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveRole(SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); - if (this.countRoleByName(args.getName()) > 0) { - throw new BadRequestException("角色名称已存在"); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveRole(SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); + if (this.countRoleByName(args.getName()) > 0) { + throw new BadRequestException("角色名称已存在"); + } + SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); + systemRoleMapper.insert(roleTb); + // 判断是否有部门数据, 若有, 则需创建关联 + if (CollUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), roleTb.getId()); + } } - SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); - systemRoleMapper.insert(roleTb); - // 判断是否有部门数据, 若有, 则需创建关联 - if (CollUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), roleTb.getId()); + + private SystemRoleTb getRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectOne(wrapper); } - } - private SystemRoleTb getRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectOne(wrapper); - } - - private long countRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectCount(wrapper); - } - - /** - * 修改 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateRoleById(SystemRoleVo args) { - checkRoleLevels(args.getLevel()); - SystemRoleTb role = this.getRoleTbById(args.getId()); - SystemRoleTb role1 = this.getRoleByName(args.getName()); - if (role1 != null && !role1.getId().equals(role.getId())) { - throw new BadRequestException("角色名称已存在"); + private long countRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectCount(wrapper); } - role.setName(args.getName()); - role.setDescription(args.getDescription()); - role.setDataScope(args.getDataScope()); - role.setLevel(args.getLevel()); - // 更新 - systemRoleMapper.insertOrUpdate(role); - // 删除关联部门数据 - systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); - // 判断是否有部门数据, 若有, 则需更新关联 - if (CollUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + + /** + * 修改 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleById(SystemRoleVo args) { + checkRoleLevels(args.getLevel()); + SystemRoleTb role = this.getRoleTbById(args.getId()); + 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.setLevel(args.getLevel()); + // 更新 + systemRoleMapper.insertOrUpdate(role); + // 删除关联部门数据 + systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); + // 判断是否有部门数据, 若有, 则需更新关联 + if (CollUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } } - } - private SystemRoleTb getRoleTbById(Long id) { - return systemRoleMapper.selectById(id); - } - - /** - * 修改绑定的菜单 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateBindMenuById(SystemRoleVo args) { - SystemRoleTb role = systemRoleMapper.selectById(args.getId()); - checkRoleLevels(role.getLevel()); - // 更新菜单 - systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); - // 判断是否为空 - Set menus = args.getMenus(); - if (CollUtil.isNotEmpty(menus)) { - systemRoleMenuService.batchInsertRoleMenu(menus, role.getId()); + private SystemRoleTb getRoleTbById(Long id) { + return systemRoleMapper.selectById(id); } - } - /** - * 删除 - * - * @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); + /** + * 修改绑定的菜单 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateBindMenuById(SystemRoleVo args) { + SystemRoleTb role = systemRoleMapper.selectById(args.getId()); + checkRoleLevels(role.getLevel()); + // 更新菜单 + systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); + // 判断是否为空 + Set menus = args.getMenus(); + if (CollUtil.isNotEmpty(menus)) { + systemRoleMenuService.batchInsertRoleMenu(menus, role.getId()); + } } - // 验证是否被用户关联 - 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 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); + } - /** - * 根据条件查询全部角色 - * - * @param args 条件 - * @param rolePage 分页参数 - * @return / - */ - public List queryRoleByArgs(SystemQueryRoleArgs args, Page rolePage) { - KitValidUtil.notNull(args); - // 查询角色基本信息 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + /** + * 查询全部角色 + */ + public List listAllRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(SystemRoleTb::getLevel); + return systemRoleMapper.selectList(wrapper); + } + + /** + * 根据条件查询全部角色 + * + * @param args 条件 + * @param rolePage 分页参数 + * @return / + */ + public List queryRoleByArgs(SystemQueryRoleArgs args, Page rolePage) { + KitValidUtil.notNull(args); + // 查询角色基本信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + 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); + List roles; + if (rolePage == null) { + roles = systemRoleMapper.selectList(wrapper); + } else { + Page page = systemRoleMapper.selectPage(rolePage, wrapper); + roles = page.getRecords(); + } + return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); } - wrapper.orderByAsc(SystemRoleTb::getLevel); - List roles; - if (rolePage == null) { - roles = systemRoleMapper.selectList(wrapper); - } else { - Page page = systemRoleMapper.selectPage(rolePage, wrapper); - roles = page.getRecords(); + + /** + * 分页查询角色 + * + * @param args 条件 + * @param page 分页条件 + * @return / + */ + public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { + List roles = this.queryRoleByArgs(args, page); + Long total = this.countRoleByArgs(args); + return KitPageUtil.toPage(roles, total); } - return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); - } - /** - * 分页查询角色 - * - * @param args 条件 - * @param page 分页条件 - * @return / - */ - public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { - List roles = this.queryRoleByArgs(args, page); - Long total = this.countRoleByArgs(args); - return KitPageUtil.toPage(roles, total); - } - - - /** - * 获取用户权限信息 - * - * @param user 用户信息 - * @return 权限信息 - */ - public List buildUserRolePermissions(SystemUserVo user) { - Set permissions = new HashSet<>(); - // 如果是管理员直接返回 - if (user.getIsAdmin()) { - permissions.add("admin"); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + /** + * 获取用户权限信息 + * + * @param user 用户信息 + * @return 权限信息 + */ + public List buildUserRolePermissions(SystemUserVo user) { + Set permissions = new HashSet<>(); + // 如果是管理员直接返回 + if (user.getIsAdmin()) { + permissions.add("admin"); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } + List roles = systemUserRoleService.queryRoleVoByUsersId(user.getId()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) + .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); } - List roles = systemUserRoleService.queryRoleVoByUsersId(user.getId()); - permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuVo::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserRoleService.countUserByRoleIds(ids) > 0) { - throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserRoleService.countUserByRoleIds(ids) > 0) { + throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); + } } - } - public Long countRoleByArgs(SystemQueryRoleArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.and(StrUtil.isNotBlank(args.getBlurry()), - c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + public Long countRoleByArgs(SystemQueryRoleArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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)); + 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 systemRoleMapper.selectCount(wrapper); - } - public SystemRoleVo getRoleById(Long id) { - SystemRoleTb roleTb = systemRoleMapper.selectById(id); - if (roleTb == null) { - return null; + public SystemRoleVo getRoleById(Long id) { + SystemRoleTb roleTb = systemRoleMapper.selectById(id); + if (roleTb == null) { + return null; + } + return systemUserRoleService.convertToRoleVo(roleTb); } - return systemUserRoleService.convertToRoleVo(roleTb); - } - public Dict getCurrentUserRoleLevel() { - return Dict.create().set("level", checkRoleLevels(null)); - } - - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemUserRoleService.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleVo::getLevel).collect(Collectors.toList()); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } + public Dict getCurrentUserRoleLevel() { + return Dict.create().set("level", checkRoleLevels(null)); } - return min; - } - public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { - List systemRoleVos = this.queryRoleByArgs(args, null); - List rowVos = new ArrayList<>(); - for (SystemRoleVo dataObject : systemRoleVos) { - SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); - rowVo.setName(dataObject.getName()); - rowVo.setLevel(dataObject.getLevel()); - rowVo.setDescription(dataObject.getDescription()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemUserRoleService.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleVo::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } + } + return min; } - KitExcelExporter.exportSimple(response, "部门数据", SystemRoleExportRowVo.class, rowVos); - } - public List listByIds(Set roleIds) { - return systemRoleMapper.selectByIds(roleIds); - } + public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { + List systemRoleVos = this.queryRoleByArgs(args, null); + List rowVos = new ArrayList<>(); + for (SystemRoleVo dataObject : systemRoleVos) { + SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); + rowVo.setName(dataObject.getName()); + rowVo.setLevel(dataObject.getLevel()); + rowVo.setDescription(dataObject.getDescription()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + KitExcelExporter.exportSimple(response, "部门数据", SystemRoleExportRowVo.class, rowVos); + } + + public List listByIds(Set roleIds) { + return systemRoleMapper.selectByIds(roleIds); + } } 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 index e051ae16..986789d2 100644 --- 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 @@ -3,19 +3,19 @@ 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; +import java.util.Set; @Service public class SystemUserDeptService { - @Autowired - private SystemUserMapper systemUserMapper; + @Autowired + private SystemUserMapper systemUserMapper; - public long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return systemUserMapper.selectCount(wrapper); - } + 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/SystemUserJobService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java index ed5c0bab..c0b9057e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java @@ -20,58 +20,58 @@ import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.dataobject.SystemUserJobTb; import cn.odboy.system.dal.mysql.SystemUserJobMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; @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); + } } - } - /** - * 根据岗位ID统计用户数量 - * - * @param jobIds 岗位ID集合 - * @return / - */ - public Long countUserByJobIds(Set jobIds) { - if (CollUtil.isEmpty(jobIds)) { - return 0L; + /** + * 根据岗位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); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserJobTb::getJobId, jobIds); - return systemUserJobMapper.selectCount(wrapper); - } - public Set listUserJobByUserId(Long userId) { - return systemUserJobMapper.listUserJobByUserId(userId); - } + public Set listUserJobByUserId(Long userId) { + return systemUserJobMapper.listUserJobByUserId(userId); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserRoleService.java index 456cc264..c53a4c7f 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 @@ -28,136 +28,135 @@ import cn.odboy.system.dal.mysql.SystemUserRoleMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -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; + @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并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + public SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; + } + SystemRoleVo roleVo = KitBeanUtil.copyToClass(role, SystemRoleVo.class); + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIds(Collections.singleton(role.getId())); + roleVo.setMenus(menus); + // 查询关联的部门信息 + Set depts = systemRoleDeptService.listUserDeptByRoleId(role.getId()); + roleVo.setDepts(depts); + return roleVo; } - SystemRoleVo roleVo = KitBeanUtil.copyToClass(role, SystemRoleVo.class); - // 查询关联的菜单信息 - Set menus = systemRoleMenuService.queryMenuByRoleIds(Collections.singleton(role.getId())); - roleVo.setMenus(menus); - // 查询关联的部门信息 - Set depts = systemRoleDeptService.listUserDeptByRoleId(role.getId()); - roleVo.setDepts(depts); - return roleVo; - } - /** - * 根据用户ID查询 - * - * @param userId 用户ID - * @return / - */ - public List queryRoleVoByUsersId(Long userId) { - Set roles = this.listUserRoleByUserId(userId); - return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); - } + /** + * 根据用户ID查询 + * + * @param userId 用户ID + * @return / + */ + public List queryRoleVoByUsersId(Long userId) { + Set roles = this.listUserRoleByUserId(userId); + 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; + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + public Integer getDeptLevelByRoles(Set roles) { + if (CollUtil.isEmpty(roles)) { + // 最小权限 + return Integer.MAX_VALUE; + } + List roleIds = + roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isEmpty(roleIds)) { + // 最小权限 + return Integer.MAX_VALUE; + } + List roleLevels = systemRoleMapper.selectList( + new LambdaQueryWrapper().select(SystemRoleTb::getLevel).isNotNull(SystemRoleTb::getLevel) + .in(SystemRoleTb::getId, roleIds)).stream().map(SystemRoleTb::getLevel).distinct() + .collect(Collectors.toList()); + if (CollUtil.isEmpty(roleLevels)) { + // 最小权限 + return Integer.MAX_VALUE; + } + return Collections.min(roleLevels); } - List roleIds = roles.stream().map(SystemRoleTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(roleIds)) { - // 最小权限 - return Integer.MAX_VALUE; - } - List roleLevels = systemRoleMapper.selectList(new LambdaQueryWrapper() - .select(SystemRoleTb::getLevel) - .isNotNull(SystemRoleTb::getLevel) - .in(SystemRoleTb::getId, roleIds) - ).stream().map(SystemRoleTb::getLevel).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(roleLevels)) { - // 最小权限 - return Integer.MAX_VALUE; - } - return Collections.min(roleLevels); - } - /** - * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 - * - * @param args / - */ - public void checkLevel(SystemUserVo args) { - Integer currentLevel = Collections.min( - this.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleVo::getLevel).collect(Collectors.toList())); - Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + public void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + this.queryRoleVoByUsersId(KitSecurityHelper.getCurrentUserId()).stream().map(SystemRoleVo::getLevel) + .collect(Collectors.toList())); + Integer optLevel = this.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); + } } - } - public long countUserByRoleIds(Set ids) { - if (CollUtil.isEmpty(ids)) { - return 0L; + public long countUserByRoleIds(Set ids) { + if (CollUtil.isEmpty(ids)) { + return 0L; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getRoleId, ids); + return systemUserRoleMapper.selectCount(wrapper); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserRoleTb::getRoleId, ids); - return systemUserRoleMapper.selectCount(wrapper); - } - public Set listUserRoleByUserId(Long userId) { - return systemUserRoleMapper.listUserRoleByUserId(userId); - } + public Set listUserRoleByUserId(Long userId) { + return systemUserRoleMapper.listUserRoleByUserId(userId); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserService.java index 9a6d1875..0943c00b 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 @@ -47,6 +47,13 @@ import cn.odboy.util.xlsx.KitExcelExporter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.ObjectUtils; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -56,456 +63,449 @@ import java.util.Map; import java.util.Objects; 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.ObjectUtils; -import org.springframework.web.multipart.MultipartFile; @Service public class SystemUserService { - @Autowired - private SystemUserMapper systemUserMapper; - @Autowired - private SystemDeptService systemDeptService; - @Autowired - private SystemUserJobService systemUserJobService; - @Autowired - private SystemUserRoleService systemUserRoleService; - @Autowired - private SystemEmailService systemEmailService; - @Autowired - private SystemDataService systemDataService; - @Autowired - private SystemUserInfoDAO systemUserInfoDAO; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired - private AppProperties properties; - @Autowired - private PasswordEncoder passwordEncoder; + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemUserJobService systemUserJobService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemEmailService systemEmailService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + /** + * 新增用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveUser(SystemUserVo args) { + systemUserRoleService.checkLevel(args); + SystemUserTb record = KitBeanUtil.copyToClass(args, SystemUserTb.class); + // 默认密码 123456 + record.setPassword(passwordEncoder.encode("123456")); + record.setDeptId(args.getDept().getId()); + if (this.getUserByUsername(record.getUsername()) != null) { + throw new BadRequestException("用户名已存在"); + } + if (this.getUserByEmail(record.getEmail()) != null) { + throw new BadRequestException("邮箱已存在"); + } + if (this.getUserByPhone(record.getPhone()) != null) { + throw new BadRequestException("手机号已存在"); + } + // 保存用户 + systemUserMapper.insert(record); + // 保存用户岗位 + systemUserJobService.batchInsertUserJob(args.getJobs(), record.getId()); + // 保存用户角色 + systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId()); + } - /** - * 新增用户 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveUser(SystemUserVo args) { - systemUserRoleService.checkLevel(args); - SystemUserTb record = KitBeanUtil.copyToClass(args, SystemUserTb.class); - // 默认密码 123456 - record.setPassword(passwordEncoder.encode("123456")); - record.setDeptId(args.getDept().getId()); - if (this.getUserByUsername(record.getUsername()) != null) { - throw new BadRequestException("用户名已存在"); + /** + * 编辑用户 + * + * @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("用户名已存在"); + } + 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.setPhone(args.getPhone()); + user.setNickName(args.getNickName()); + user.setGender(args.getGender()); + systemUserMapper.updateById(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(record.getEmail()) != null) { - throw new BadRequestException("邮箱已存在"); - } - if (this.getUserByPhone(record.getPhone()) != null) { - throw new BadRequestException("手机号已存在"); - } - // 保存用户 - systemUserMapper.insert(record); - // 保存用户岗位 - systemUserJobService.batchInsertUserJob(args.getJobs(), record.getId()); - // 保存用户角色 - systemUserRoleService.batchInsertUserRole(args.getRoles(), record.getId()); - } - /** - * 编辑用户 - * - * @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 args / + */ + @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())) { + throw new BadRequestException("手机号已存在"); + } + user.setNickName(args.getNickName()); + user.setPhone(args.getPhone()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); } - 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.setPhone(args.getPhone()); - user.setNickName(args.getNickName()); - user.setGender(args.getGender()); - systemUserMapper.updateById(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 args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateUserCenterInfoById(SystemUserTb args) { - if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); + /** + * 删除用户 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteUserByIds(Set ids) { + Long currentUserId = KitSecurityHelper.getCurrentUserId(); + // 校验权限 + for (Long id : ids) { + Integer currentLevel = Collections.min( + systemUserRoleService.queryRoleVoByUsersId(currentUserId).stream().map(SystemRoleVo::getLevel) + .collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemUserRoleService.queryRoleVoByUsersId(id).stream().map(SystemRoleVo::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); + // 删除用户角色 + systemUserRoleService.batchDeleteUserRole(ids); } - 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 ids / - */ - @Transactional(rollbackFor = Exception.class) - public void deleteUserByIds(Set ids) { - Long currentUserId = KitSecurityHelper.getCurrentUserId(); - // 校验权限 - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemUserRoleService.queryRoleVoByUsersId(currentUserId).stream() - .map(SystemRoleVo::getLevel).collect(Collectors.toList())); - Integer optLevel = Collections.min( - systemUserRoleService.queryRoleVoByUsersId(id).stream().map(SystemRoleVo::getLevel) - .collect(Collectors.toList())); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + this.getUserById(id).getUsername()); - } + /** + * 修改密码 + * + * @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("修改失败,旧密码错误"); + } + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + String encryptPassword = passwordEncoder.encode(newPass); + systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); } - // 清理缓存 - 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); - } - /** - * 修改密码 - * - * @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("修改失败,旧密码错误"); + /** + * 重置密码 + * + * @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); } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - String encryptPassword = passwordEncoder.encode(newPass); - systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } - /** - * 重置密码 - * - * @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()); + /** + * 修改头像 + * + * @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()); + }}; } - // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(defaultPwd, ids); - } - /** - * 修改头像 - * - * @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 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); } - // 文件大小验证 - 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 + " 格式"); + + /** + * 查询全部 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + IPage userPage = systemUserMapper.selectPage(page, wrapper); + List users = userPage.getRecords(); + // 转换为SystemUserVo并关联查询 + List userVos = + users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList()); + return KitPageUtil.toPage(userVos, userPage.getTotal()); } - 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); + + public long countUserByArgs(SystemQueryUserArgs args) { + LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); + return systemUserMapper.selectCount(wrapper); } - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - return new HashMap<>(1) {{ - put("avatar", file.getName()); - }}; - } - /** - * 修改邮箱 - * - * @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("密码错误"); + /** + * 根据ID查询 + * + * @param id ID + * @return / + */ + public SystemUserTb getUserById(long id) { + return systemUserMapper.selectById(id); } - systemEmailService.checkEmailCaptchaV1(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserMapper.updateUserEmailByUsername(username, args.getEmail()); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } - /** - * 查询全部 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { - // 查询用户基本信息 - LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); - IPage userPage = systemUserMapper.selectPage(page, wrapper); - List users = userPage.getRecords(); - // 转换为SystemUserVo并关联查询 - List userVos = users.stream().map(m -> this.convertToUserVo(m, false)).collect(Collectors.toList()); - return KitPageUtil.toPage(userVos, userPage.getTotal()); - } - - public long countUserByArgs(SystemQueryUserArgs args) { - LambdaQueryWrapper wrapper = this.buildUserQueryWrapper(args); - return systemUserMapper.selectCount(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<>(pageArgs.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()); - } - - /** - * 构建用户查询条件 - * - * @param args 查询条件 - * @return / - */ - private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (args.getId() != null) { - wrapper.eq(SystemUserTb::getId, args.getId()); + 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<>(pageArgs.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 (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 用户基本信息 - * @param includePassword 是否包含用户密码 - * @return 包含关联信息的SystemUserVo - */ - private SystemUserVo convertToUserVo(SystemUserTb user, boolean includePassword) { - if (user == null) { - return null; + /** + * 构建用户查询条件 + * + * @param args 查询条件 + * @return / + */ + private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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; } - if (!includePassword) { - // 查询用户时,清空密码 - user.setPassword(null); + + /** + * 转换为SystemUserVo并关联查询部门、角色、岗位信息 + * + * @param user 用户基本信息 + * @param includePassword 是否包含用户密码 + * @return 包含关联信息的SystemUserVo + */ + private SystemUserVo convertToUserVo(SystemUserTb user, boolean includePassword) { + if (user == null) { + return null; + } + if (!includePassword) { + // 查询用户时,清空密码 + user.setPassword(null); + } + SystemUserVo userVo = KitBeanUtil.copyToClass(user, SystemUserVo.class); + // 查询关联的部门信息 + if (user.getDeptId() != null) { + userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); + } + // 查询关联的岗位信息 + userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); + // 查询关联的角色信息 + userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); + return userVo; } - SystemUserVo userVo = KitBeanUtil.copyToClass(user, SystemUserVo.class); - // 查询关联的部门信息 - if (user.getDeptId() != null) { - userVo.setDept(systemDeptService.getDeptVoById(user.getDeptId())); + + public SystemUserTb getUserByUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); } - // 查询关联的岗位信息 - userVo.setJobs(systemUserJobService.listUserJobByUserId(user.getId())); - // 查询关联的角色信息 - userVo.setRoles(systemUserRoleService.listUserRoleByUserId(user.getId())); - return userVo; - } - public SystemUserTb getUserByUsername(String username) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.eq(SystemUserTb::getEnabled, 1); - return systemUserMapper.selectOne(wrapper); - } - - public SystemUserVo getUserVoWithPasswordByUsername(String username) { - return this.convertToUserVo(this.getUserByUsername(username), true); - } - - public SystemUserVo getUserVoByUsername(String username) { - return this.convertToUserVo(this.getUserByUsername(username), false); - } - - 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()); - Map> deptPidMap = systemDeptService.listPidNonNull().stream() - .collect(Collectors.groupingBy(SystemDeptTb::getPid)); - // 然后把子节点的ID都加入到集合中 - args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap)); + public SystemUserVo getUserVoWithPasswordByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username), true); } - // 数据权限 - List dataScopes = systemDataService.queryDeptIdByArgs(this.getUserVoByUsername(currentUsername)); - // args.getDeptIds() 不为空并且数据权限不为空则取交集 - if (!CollUtil.isEmpty(args.getDeptIds()) && !CollUtil.isEmpty(dataScopes)) { - // 取交集 - args.getDeptIds().retainAll(dataScopes); - if (!CollUtil.isEmpty(args.getDeptIds())) { - return this.searchUserByArgs(args, page); - } - } else { - // 否则取并集 - args.getDeptIds().addAll(dataScopes); - return this.searchUserByArgs(args, page); - } - return KitPageUtil.emptyData(); - } - public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) { - long totalCount = this.countUserByArgs(args); - KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount, (long pageNum, long pageSize) -> { - KitPageResult pageResult = this.searchUserByArgs(args, new Page<>(pageNum, pageSize)); - List rowVos = new ArrayList<>(); - for (SystemUserVo dataObject : pageResult.getContent()) { - SystemUserExportRowVo rowVo = new SystemUserExportRowVo(); - rowVo.setUsername(dataObject.getUsername()); - rowVo.setRoles(dataObject.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.joining(","))); - rowVo.setDept(dataObject.getDept().getName()); - rowVo.setJobs(dataObject.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.joining(","))); - rowVo.setEmail(dataObject.getEmail()); - rowVo.setStatus(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); - rowVo.setMobile(dataObject.getPhone()); - rowVo.setUpdatePwdTime(dataObject.getPwdResetTime()); - rowVo.setCreateTime(dataObject.getCreateTime()); - rowVos.add(rowVo); - } - return rowVos; - }); - } + public SystemUserVo getUserVoByUsername(String username) { + return this.convertToUserVo(this.getUserByUsername(username), false); + } + + 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()); + Map> deptPidMap = + systemDeptService.listPidNonNull().stream().collect(Collectors.groupingBy(SystemDeptTb::getPid)); + // 然后把子节点的ID都加入到集合中 + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data, deptPidMap)); + } + // 数据权限 + List dataScopes = systemDataService.queryDeptIdByArgs(this.getUserVoByUsername(currentUsername)); + // args.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollUtil.isEmpty(args.getDeptIds()) && !CollUtil.isEmpty(dataScopes)) { + // 取交集 + args.getDeptIds().retainAll(dataScopes); + if (!CollUtil.isEmpty(args.getDeptIds())) { + return this.searchUserByArgs(args, page); + } + } else { + // 否则取并集 + args.getDeptIds().addAll(dataScopes); + return this.searchUserByArgs(args, page); + } + return KitPageUtil.emptyData(); + } + + public void exportUserXlsx(HttpServletResponse response, SystemQueryUserArgs args) { + long totalCount = this.countUserByArgs(args); + KitExcelExporter.exportByPage(response, "用户数据", SystemUserExportRowVo.class, totalCount, + (long pageNum, long pageSize) -> { + KitPageResult pageResult = this.searchUserByArgs(args, new Page<>(pageNum, pageSize)); + List rowVos = new ArrayList<>(); + for (SystemUserVo dataObject : pageResult.getContent()) { + SystemUserExportRowVo rowVo = new SystemUserExportRowVo(); + rowVo.setUsername(dataObject.getUsername()); + rowVo.setRoles( + dataObject.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.joining(","))); + rowVo.setDept(dataObject.getDept().getName()); + rowVo.setJobs( + dataObject.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.joining(","))); + rowVo.setEmail(dataObject.getEmail()); + rowVo.setStatus(dataObject.getEnabled() ? SystemZhConst.ENABLE_STR : SystemZhConst.DISABLE_STR); + rowVo.setMobile(dataObject.getPhone()); + rowVo.setUpdatePwdTime(dataObject.getPwdResetTime()); + rowVo.setCreateTime(dataObject.getCreateTime()); + rowVos.add(rowVo); + } + return rowVos; + }); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java index 2d9c8145..5ac7dc3b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemMinioStorageServiceImpl.java @@ -39,13 +39,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 java.io.File; -import java.util.List; -import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.List; /** *

@@ -59,105 +59,110 @@ import org.springframework.web.multipart.MultipartFile; public class SystemMinioStorageServiceImpl 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); - for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + @Override + public KitPageResult searchOssStorage(SystemQueryStorageArgs args, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); + for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + } + return KitPageUtil.toPage(ossStorageTbs); } - return KitPageUtil.toPage(ossStorageTbs); - } - private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, Page page) { - KitValidUtil.notNull(args); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - 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)); + private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, + Page page) { + KitValidUtil.notNull(args); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + 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) + .convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class)); } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper).convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class)); - } - @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 - @Transactional(rollbackFor = Exception.class) - public String uploadFile(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - if (StrUtil.isBlank(originalFilename)) { - throw new BadRequestException("文件名不能为空"); + @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()); } - 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); + } } - } - @Override - public void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { - List systemOssStorageVos = this.queryOssStorage(args); -// KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class, -// (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class))); - List rowVos = KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class); - KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos); - } + @Override + public void exportOssStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) { + List systemOssStorageVos = this.queryOssStorage(args); + // KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class, + // (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class))); + List rowVos = + KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class); + KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos); + } - 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/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml index cacbc511..ad6e4642 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,29 @@ - + +