diff --git a/README.MD b/README.MD index b837ec71..33b8d2d9 100644 --- a/README.MD +++ b/README.MD @@ -24,6 +24,7 @@ - ~~常用的辅助类的类名, 以`Cs`开头~~ - 常用的辅助类的类名, 以`Kit`开头。Kit有套件、装备等意思。 - 枚举类名,以`Enum`结尾 +- 内部调用一律声明this - 拒绝过度包装 - 命名规则(Mapper or Service) - 简单查询:get + 名词 @@ -32,6 +33,7 @@ - 搜索(分页)功能:search + 名词 - 统计计数:count + By + 条件 - 存在检查:exists + By + 条件 + - 增删改:save/delete/update - 例子: 查询分页、查询列表的方法 - 分页:searchUser(args, page) - 列表:listUser + (args) @@ -44,6 +46,47 @@ - 单个:getUser + by + (args) - 统计计数:count + By + (args) +#### 编码规范:举例说明 + +1. getUser - 简单查询 + 核心: 获取单个特定实体。 + +- 输入: 通常是一个唯一标识符(如ID 123)。 +- 筛选: 非常精确,只匹配一个。 +- 返回: 单个对象或文档,包含该用户的完整/详细信息。 +- 示例: getUser(123) -> 返回 {id: 123, name: “Alice”, email: “...”} + +2. listUsers - 列表查询 + 核心: 获取一个符合简单条件的实体集合,通常是有限的、预定义的。 + +- 输入: 可能没有参数,或只有非常简单的过滤条件(如 status=‘active’)。 +- 筛选: 简单、常规。 +- 返回: 一个数组/列表,包含多个用户的基本信息(通常是摘要字段,非完整详情)。 +- 通常不分页,或隐式返回所有符合条件的(数据量预期不大)。 +- 示例: listUsers() -> 返回 [{id: 1, name: “Alice”}, {id: 2, name: “Bob”}] +- 示例: listUsers({role: ‘admin’}) -> 返回所有管理员用户的列表。 + +3. queryUsersByCondition - 复杂查询 + 核心: 基于多个、可能较复杂的条件进行筛选。 + +- 输入: 一个组合条件对象,可能涉及多个字段的比较(如 age > 18 AND department = ‘Sales’ AND joinDate < ‘2023-01-01’)。 +- 筛选: 复杂、灵活,类似数据库的WHERE子句。 +- 返回: 一个匹配条件的数组/列表。 +- 分页: 可能分页,也可能不分页。关键是它的侧重点在于复杂的“筛选”能力,而非分页机制。(这是标准,但是对于此项目来说,定为不分页的,复杂条件的,列表查询服务) +- 示例: queryUsersByCondition({minAge: 18, department: ‘Sales’, hasCertification: true}) + +4. searchUsers - 搜索(分页)功能 + 核心: 针对大量数据进行模糊匹配、全文检索,并强制包含分页机制以管理性能。 + +- 输入: + - 搜索关键词(可能对多个字段进行模糊匹配)。 + - 分页参数(pageNumber, pageSize 或 limit, offset)。 + - 可能附加的其他过滤条件。 +- 筛选: 通常包含文本搜索(如 name LIKE ‘%Al%’),结果可能按相关性排序。 +- 返回: 一个分页响应对象,而不仅仅是数组。 + - 包含:data(当前页的数据列表)、total(总匹配数)、page(当前页)、pageSize(每页大小)等元数据。 +- 示例: searchUsers({keyword: ‘Al’, page: 1, pageSize: 20}) -> 返回 {data: […], total: 45, page: 1, pageSize: 20} + #### 主要特性 - 使用最新技术栈,社区资源丰富。 diff --git a/cutejava-front/src/views/system/dict/dictDetail.vue b/cutejava-front/src/views/system/dict/dictDetail.vue index 7a6884c0..c9681a12 100644 --- a/cutejava-front/src/views/system/dict/dictDetail.vue +++ b/cutejava-front/src/views/system/dict/dictDetail.vue @@ -4,22 +4,6 @@
点击字典查看详情
- -
-
- - - -
-
diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java index 4a49586e..d0930695 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java @@ -16,12 +16,15 @@ package cn.odboy.annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import java.lang.annotation.*; - /** * Annotation for mapping HTTP {@code PATCH} requests onto specific handler methods. 支持匿名访问 PatchMapping * diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java index aeaa028f..e21e8a4a 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java @@ -16,12 +16,15 @@ package cn.odboy.annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import java.lang.annotation.*; - /** * Annotation for mapping HTTP {@code POST} requests onto specific handler methods. 支持匿名访问 PostMapping * diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java index 5f54ef12..a0a7a768 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java @@ -16,12 +16,15 @@ package cn.odboy.annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import java.lang.annotation.*; - /** * Annotation for mapping HTTP {@code PUT} requests onto specific handler methods. 支持匿名访问 PutMapping * diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java index c60e860b..dd80b505 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java @@ -30,14 +30,12 @@ public class KitArgs { @Getter @Setter public static class FindByLongId extends KitObject { - @NotNull(message = "id必填") - private Long id; + @NotNull(message = "id必填") private Long id; } @Getter @Setter public static class DeleteById extends KitObject { - @NotNull(message = "id必填") - private Long id; + @NotNull(message = "id必填") private Long id; } } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java index b37211d0..77702288 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java @@ -19,17 +19,15 @@ package cn.odboy.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import java.util.Date; - @Getter @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseCreateTimeTb extends KitObject { - @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - @TableField(fill = FieldFill.INSERT) - private Date createTime; + @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @TableField(fill = FieldFill.INSERT) private Date + createTime; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java index 468ab3e2..aa02ba20 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java @@ -19,21 +19,18 @@ package cn.odboy.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import java.util.Date; - @Getter @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseTimeTb extends KitObject { - @TableField(fill = FieldFill.INSERT) - @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; + @TableField(fill = FieldFill.INSERT) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date + createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + @TableField(fill = FieldFill.INSERT_UPDATE) @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java index 38c5aa45..b1b9e9ec 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java @@ -19,17 +19,15 @@ package cn.odboy.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; -import java.util.Date; - @Getter @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUpdateTimeTb extends KitObject { - @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) - @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java index d0cbc92f..e189efed 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java @@ -19,28 +19,23 @@ package cn.odboy.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; +import java.lang.reflect.Field; +import java.util.Date; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.builder.ToStringBuilder; import org.springframework.data.annotation.CreatedBy; -import java.lang.reflect.Field; -import java.util.Date; - @Getter @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUserCreateTimeTb extends KitObject { - @CreatedBy - @TableField(fill = FieldFill.INSERT) - @Schema(name = "创建人", hidden = true) - private String createBy; + @CreatedBy @TableField(fill = FieldFill.INSERT) @Schema(name = "创建人", hidden = true) private String createBy; - @TableField(fill = FieldFill.INSERT) - @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; + @TableField(fill = FieldFill.INSERT) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date + createTime; @Override public String toString() { @@ -58,10 +53,8 @@ public class KitBaseUserCreateTimeTb extends KitObject { } /* 分组校验 */ - public @interface Create { - } + public @interface Create {} /* 分组校验 */ - public @interface Update { - } + public @interface Update {} } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java index 824e1bc9..5d0ec87c 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java @@ -20,13 +20,12 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.LastModifiedBy; -import java.util.Date; - /** * 逻辑删除通用模型 * @@ -36,22 +35,13 @@ import java.util.Date; @Getter @Setter public class KitBaseUserTimeLogicTb extends KitObject { - @CreatedBy - @TableField(value = "create_by", fill = FieldFill.INSERT) - @Schema(name = "创建人", hidden = true) + @CreatedBy @TableField(value = "create_by", fill = FieldFill.INSERT) @Schema(name = "创建人", hidden = true) private String createBy; - @LastModifiedBy - @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) - @Schema(name = "更新人", hidden = true) - private String updateBy; - @TableField(value = "create_time", fill = FieldFill.INSERT) - @Schema(name = "创建时间", hidden = true) - private Date createTime; - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - @Schema(name = "更新时间", hidden = true) + @LastModifiedBy @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) + @Schema(name = "更新人", hidden = true) private String updateBy; + @TableField(value = "create_time", fill = FieldFill.INSERT) @Schema(name = "创建时间", hidden = true) private Date + createTime; + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @Schema(name = "更新时间", hidden = true) private Date updateTime; - @Schema(name = "数据有效性", hidden = true) - @TableLogic - @TableField("available") - private Integer available; + @Schema(name = "数据有效性", hidden = true) @TableLogic @TableField("available") private Integer available; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java index 29d74d42..0d40ff03 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java @@ -19,6 +19,8 @@ package cn.odboy.base; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; +import java.lang.reflect.Field; +import java.util.Date; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -26,30 +28,20 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.LastModifiedBy; -import java.lang.reflect.Field; -import java.util.Date; - @Getter @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUserTimeTb extends KitObject { - @CreatedBy - @TableField(fill = FieldFill.INSERT) - @Schema(name = "创建人", hidden = true) - private String createBy; + @CreatedBy @TableField(fill = FieldFill.INSERT) @Schema(name = "创建人", hidden = true) private String createBy; - @LastModifiedBy - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(name = "更新人", hidden = true) - private String updateBy; + @LastModifiedBy @TableField(fill = FieldFill.INSERT_UPDATE) @Schema(name = "更新人", hidden = true) private String + updateBy; - @TableField(fill = FieldFill.INSERT) - @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; + @TableField(fill = FieldFill.INSERT) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date + createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + @TableField(fill = FieldFill.INSERT_UPDATE) @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; @Override @@ -68,10 +60,8 @@ public class KitBaseUserTimeTb extends KitObject { } /* 分组校验 */ - public @interface Create { - } + public @interface Create {} /* 分组校验 */ - public @interface Update { - } + public @interface Update {} } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java index f4e735bf..42239538 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java @@ -26,6 +26,5 @@ import java.io.Serializable; * @date 2022-01-12 */ public class KitObject implements Serializable { - @Serial - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java index b0729525..7945eb37 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java @@ -19,12 +19,11 @@ package cn.odboy.base; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.io.Serializable; - /** * 数据分页参数 * @@ -35,13 +34,9 @@ import java.io.Serializable; @NoArgsConstructor @AllArgsConstructor public class KitPageArgs implements Serializable { - @NotNull(message = "参数page不能为空") - @Min(value = 1, message = "参数page最小值为1") - @Schema(name = "页码", example = "1") - private Integer page; - @NotNull(message = "参数size不能为空") - @Min(value = 1, message = "参数size最小值为1") - @Schema(name = "每页数据量", example = "10") - private Integer size; + @NotNull(message = "参数page不能为空") @Min(value = 1, message = "参数page最小值为1") + @Schema(name = "页码", example = "1") private Integer page; + @NotNull(message = "参数size不能为空") @Min(value = 1, message = "参数size最小值为1") + @Schema(name = "每页数据量", example = "10") private Integer size; private T args; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java index 88ee1a48..67a958c0 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java @@ -17,14 +17,13 @@ package cn.odboy.base; import com.baomidou.mybatisplus.core.metadata.IPage; +import java.util.ArrayList; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.ArrayList; -import java.util.List; - /** * 结果封装类 */ diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java index fd37e725..7f784ed3 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java @@ -16,9 +16,12 @@ package cn.odboy.base; -import lombok.*; - import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; /** * 元数据选项 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java index ef9693d6..251f917f 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java @@ -17,14 +17,13 @@ package cn.odboy.framework.context; import cn.hutool.core.util.StrUtil; +import java.net.InetAddress; +import java.net.UnknownHostException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; -import java.net.InetAddress; -import java.net.UnknownHostException; - /** * 主要目的是输出应用的服务地址 * @@ -37,7 +36,8 @@ public class BootApplication { Environment env = application.getEnvironment(); String ip = InetAddress.getLocalHost().getHostAddress(); String port = env.getProperty("server.port"); - String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" : env.getProperty("config.servlet.context-path"); + String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" + : env.getProperty("config.servlet.context-path"); log.info(""" ---------------------------------------------------------- \tApplication is running! Access URLs: diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java index 944bd124..5f7453aa 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java @@ -18,17 +18,17 @@ package cn.odboy.framework.context; import jakarta.servlet.http.HttpServletRequest; +import java.util.Objects; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import java.util.Objects; - /** * 获取 HttpServletRequest */ public class KitRequestHolder { public static HttpServletRequest getHttpServletRequest() { - return ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + return ((ServletRequestAttributes)Objects.requireNonNull( + RequestContextHolder.getRequestAttributes())).getRequest(); } } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java index 6a7b7261..c24ae120 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java @@ -16,13 +16,12 @@ package cn.odboy.framework.context; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.springframework.stereotype.Component; -import java.util.Map; - /** * 脚本工具 * diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java index a9985df6..605e42a1 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java @@ -16,6 +16,9 @@ package cn.odboy.framework.context; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; @@ -24,10 +27,6 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - @Slf4j @SuppressWarnings({"unchecked", "all"}) public class KitSpringBeanHolder implements ApplicationContextAware, DisposableBean { @@ -109,8 +108,8 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB */ private static void assertContextInjected() { if (applicationContext == null) { - throw new IllegalStateException( - "applicaitonContext属性未注入, 请在applicationContext" + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); + throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" + + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); } } @@ -139,7 +138,8 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (KitSpringBeanHolder.applicationContext != null) { - log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + KitSpringBeanHolder.applicationContext); + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + + KitSpringBeanHolder.applicationContext); } KitSpringBeanHolder.applicationContext = applicationContext; if (addCallback) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java index c1f67785..40cde9d8 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java @@ -16,7 +16,12 @@ package cn.odboy.framework.logging; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 统计执行时长 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java index bcd41cda..6d166815 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java @@ -34,15 +34,18 @@ import org.springframework.stereotype.Component; @Component public class ExecutionTimeStatisticsFaceAspect { @Around("@annotation(executionTimeStatisticsFace)") - public Object aroundFace(ProceedingJoinPoint joinPoint, ExecutionTimeStatisticsFace executionTimeStatisticsFace) throws Throwable { + public Object aroundFace(ProceedingJoinPoint joinPoint, ExecutionTimeStatisticsFace executionTimeStatisticsFace) + throws Throwable { TimeInterval timeInterval = new TimeInterval(); try { Object proceed = joinPoint.proceed(); - log.info("[{}] 接口执行成功,耗时: {} ms", executionTimeStatisticsFace.description(), timeInterval.intervalMs()); + log.info("[{}] 接口执行成功,耗时: {} ms", executionTimeStatisticsFace.description(), + timeInterval.intervalMs()); return proceed; } catch (Exception e) { if (executionTimeStatisticsFace.showErrLog()) { - log.error("[{}] 接口执行失败,耗时: {} ms", executionTimeStatisticsFace.description(), timeInterval.intervalMs(), e); + log.error("[{}] 接口执行失败,耗时: {} ms", executionTimeStatisticsFace.description(), + timeInterval.intervalMs(), e); } throw e; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java index c2c947b4..e43e36f3 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java @@ -31,8 +31,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/healthCheck") @Tag(name = "系统:健康检查接口") public class HealthCheckController { - @Autowired - private KitHealthCheckPointService kitHealthCheckPointService; + @Autowired private KitHealthCheckPointService kitHealthCheckPointService; /** * 就绪检查 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java index 97515e42..164f56f5 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java @@ -94,7 +94,8 @@ public enum DataTypeEnum { private String aliasPrefix; private String aliasSuffix; - DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, String aliasPrefix, String aliasSuffix) { + DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, + String aliasPrefix, String aliasSuffix) { this.feature = feature; this.desc = desc; this.driver = driver; diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java index 70c6abac..2a7f2e0e 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java @@ -55,13 +55,14 @@ public class MpCustomP6SpyLogger implements MessageFormattingStrategy { * @return 格式化后的sql */ @Override - public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, + String sql, String url) { // 去掉换行和多余空格 if (StrUtil.isNotBlank(sql)) { sql = sql.replaceAll("\\s+", " ").trim(); } // 格式化并加上颜色 - return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, Thread.currentThread().getName(), BLUE, - elapsed, RESET, sql); + return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, + Thread.currentThread().getName(), BLUE, elapsed, RESET, sql); } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java index 88c8402e..26d140da 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java @@ -22,9 +22,8 @@ import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; -import org.apache.ibatis.session.Configuration; - import java.util.List; +import org.apache.ibatis.session.Configuration; /** * 批量插入SQL注入器 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java index 40c239dc..0b96f6c1 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java @@ -19,9 +19,15 @@ package cn.odboy.framework.mybatisplus.config; import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties; import com.alibaba.druid.util.Utils; -import jakarta.servlet.*; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; @@ -29,13 +35,12 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.io.IOException; - @Configuration @SuppressWarnings({"unchecked", "all"}) @ConditionalOnWebApplication @AutoConfigureAfter(DruidDataSourceAutoConfigure.class) -@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", + matchIfMissing = true) public class RemoveDruidAdConfig { /** @@ -62,7 +67,8 @@ public class RemoveDruidAdConfig { } @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpServletResponse httpResponse = (HttpServletResponse)response; if (httpRequest.getRequestURI().endsWith("js/common.js")) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java index 644a89c6..c46d8ed2 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java @@ -20,7 +20,6 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - import java.util.ArrayList; import java.util.List; @@ -69,7 +68,8 @@ public class KitMpAnyQUtil { return baseMapper.selectPage(page, queryWrapper); } - public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams, Class mapperClazz) { + public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams, + Class mapperClazz) { QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); Page tPage = baseMapper.selectPage(page, queryWrapper); Page mapperTarget = new Page<>(); diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java index 6ada1734..961bdfa6 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java @@ -21,7 +21,12 @@ import cn.odboy.base.KitBaseUserTimeTb; import cn.odboy.framework.exception.BadRequestException; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.FastAutoGenerator; -import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.IDbQuery; +import com.baomidou.mybatisplus.generator.config.OutputFile; +import com.baomidou.mybatisplus.generator.config.PackageConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; @@ -29,13 +34,12 @@ import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler; -import lombok.Data; -import org.apache.ibatis.annotations.Mapper; - import java.sql.Types; import java.util.Collections; import java.util.List; import java.util.function.Consumer; +import lombok.Data; +import org.apache.ibatis.annotations.Mapper; /** * 代码生成器入口 @@ -67,14 +71,16 @@ public class KitMpCmdGenUtil { private static Consumer getEntityConfigConsumer() { return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder().enableLombok() // 如果不需要生成注解, 去掉.enableTableFieldAnnotation() - .enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel) - .idType(IdType.AUTO); + .enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel) + .columnNaming(NamingStrategy.underline_to_camel).idType(IdType.AUTO); } private static Consumer getStrategyConfigConsumer(List tableNames) { - return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter().addInclude(tableNames) + return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter() + .addInclude(tableNames) // 实体类生成策略 - .entityBuilder().superClass(KitBaseUserTimeTb.class).addIgnoreColumns("create_time", "update_time", "create_by", "update_by") + .entityBuilder().superClass(KitBaseUserTimeTb.class) + .addIgnoreColumns("create_time", "update_time", "create_by", "update_by") // 开启生成实体时生成字段注解。 // 会在实体类的属性前,添加[@TableField("nickname")] .enableTableFieldAnnotation().disableSerialVersionUID() @@ -99,13 +105,13 @@ public class KitMpCmdGenUtil { private static Consumer getGlobalConfigConsumer() { String outputDir = projectRootPath + "CodeGen"; - return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen").commentDate("yyyy-MM-dd") - .dateType(DateType.TIME_PACK); + return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen") + .commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK); } private static Consumer getStrategyConfigConsumer() { - return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class).formatMapperFileName("%sMapper") - .formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb"); + return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class) + .formatMapperFileName("%sMapper").formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb"); } private static Consumer getDataSourceConfigConsumer() { @@ -138,7 +144,8 @@ public class KitMpCmdGenUtil { this.parentModuleName = moduleName; // 1.数据库配置 DataSourceConfig.Builder dataSourceConfigBuilder = - new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, this.databasePassword).driverClassName(this.driverClassName); + new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, + this.databasePassword).driverClassName(this.driverClassName); dataSourceConfigBuilder.dbQuery(DB_QUERY); dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler()); // 1.1.快速生成器 @@ -168,7 +175,8 @@ public class KitMpCmdGenUtil { fastAutoGenerator.strategyConfig(getStrategyConfigConsumer(tableNames)); if (tablePrefix != null) { // 表前缀, 可多个 - fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix)); + fastAutoGenerator.strategyConfig( + strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix)); } // 5.1.Entity策略配置 // 生成实体时生成字段的注解, 包括@TableId注解等 @@ -178,10 +186,13 @@ public class KitMpCmdGenUtil { fastAutoGenerator.strategyConfig(getEntityConfigConsumer()); // 5.2.Controller策略配置 // 开启生成@RestController控制器 - fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); - // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I fastAutoGenerator.strategyConfig( - strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl")); + strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); + // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3 + // .Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I + fastAutoGenerator.strategyConfig( + strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService") + .formatServiceImplFileName("%sServiceImpl")); // 5.4.Mapper策略配置 // 格式化 mapper文件名,格式化xml实现类文件名称 fastAutoGenerator.strategyConfig(getStrategyConfigConsumer()); @@ -194,8 +205,9 @@ public class KitMpCmdGenUtil { if (StrUtil.isBlank(this.parentModuleName)) { throw new BadRequestException("模块名称必填"); } - return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName).moduleName(this.parentModuleName).entity("dal.dataobject") - .mapper("dal.mysql").service("service").serviceImpl("service.impl").controller("controller") + return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName) + .moduleName(this.parentModuleName).entity("dal.dataobject").mapper("dal.mysql").service("service") + .serviceImpl("service.impl").controller("controller") .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath)); } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java index f8c509c7..dc8bf54b 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java @@ -29,10 +29,13 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.extern.slf4j.Slf4j; - import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; /** * 查询条件创建工具 @@ -77,7 +80,8 @@ public class KitMpQUtil { return StrUtil.toUnderlineCase(attributeName); } - private static void handleWrapper(KitMpQuery q, QueryWrapper queryWrapper, String attributeName, Object fieldVal) { + private static void handleWrapper(KitMpQuery q, QueryWrapper queryWrapper, String attributeName, + Object fieldVal) { switch (q.type()) { case EQUAL -> queryWrapper.eq(attributeName, fieldVal); case GREATER_THAN -> queryWrapper.ge(attributeName, fieldVal); @@ -97,7 +101,8 @@ public class KitMpQUtil { } } - private static void handleInOrNotQuery(boolean b, QueryWrapper queryWrapper, String attributeName, Object fieldVal) { + private static void handleInOrNotQuery(boolean b, QueryWrapper queryWrapper, String attributeName, + Object fieldVal) { Collection wrapNotInVal = (Collection)fieldVal; if (CollectionUtil.isNotEmpty(wrapNotInVal)) { Optional anyValOptional = wrapNotInVal.stream().findAny(); @@ -122,7 +127,8 @@ public class KitMpQUtil { } } - private static void handleBetweenQuery(QueryWrapper queryWrapper, Object fieldVal, String finalAttributeName) { + private static void handleBetweenQuery(QueryWrapper queryWrapper, Object fieldVal, + String finalAttributeName) { if (fieldVal instanceof List) { List between = new ArrayList<>((List)fieldVal); int minLength = 2; @@ -182,14 +188,10 @@ public class KitMpQUtil { @TableName("test_domain") private static class TestDomain { - @NotNull(groups = KitBaseUserTimeTb.Update.class) - @TableId(value = "user_id", type = IdType.AUTO) - private Long id; - @TableField(value = "dept_id") - private Long deptId; - @NotBlank - private String username; - @NotBlank - private String nickName; + @NotNull(groups = KitBaseUserTimeTb.Update.class) @TableId(value = "user_id", type = IdType.AUTO) private Long + id; + @TableField(value = "dept_id") private Long deptId; + @NotBlank private String username; + @NotBlank private String nickName; } } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java index fed74bed..b41ad9f5 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java @@ -26,15 +26,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import org.springframework.data.domain.Pageable; - import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.ibatis.annotations.Param; +import org.springframework.data.domain.Pageable; /** * 公共抽象Mapper接口类 @@ -137,7 +136,8 @@ public interface KitMpMapper extends BaseMapper { * @param clazz 期望的对象类型 * @return IPage */ - default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper wrapper, Class clazz) { + default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper wrapper, + Class clazz) { int pageNumber = pageable.getPageNumber(); int pageSize = pageable.getPageSize(); pageNumber = pageNumber <= 0 ? 1 : pageNumber; @@ -157,7 +157,8 @@ public interface KitMpMapper extends BaseMapper { * @param clazz 期望的对象类型 * @return IPage */ - default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper wrapper, Class clazz) { + default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper wrapper, + Class clazz) { int pageNumber = pageable.getPageNumber(); int pageSize = pageable.getPageSize(); pageNumber = pageNumber <= 0 ? 1 : pageNumber; diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java index d75208ef..d8929d75 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java @@ -21,7 +21,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.IService; - import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -59,7 +58,8 @@ public interface KitMpService extends IService { KitPageResult queryClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable); - KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, Class targetClazz); + KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, + Class targetClazz); KitPageResult queryFeatureClazzPageByArgs(Q criteria, IPage pageable, Class targetClazz); diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java index 75a881f2..fc79e640 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java @@ -27,11 +27,10 @@ import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.ibatis.binding.MapperMethod; - import java.io.Serializable; import java.util.Collection; import java.util.List; +import org.apache.ibatis.binding.MapperMethod; /** * 公共抽象Mapper接口类 @@ -138,7 +137,8 @@ public class KitMpServiceImpl, T> extends ServiceImpl List queryFeatureClazzListByIds(List ids, Class targetClazz) { List entitys = this.listByIds(ids); - return entitys == null || entitys.isEmpty() ? CollUtil.newArrayList() : BeanUtil.copyToList(entitys, targetClazz); + return entitys == null || entitys.isEmpty() ? CollUtil.newArrayList() + : BeanUtil.copyToList(entitys, targetClazz); } /** @@ -209,18 +209,21 @@ public class KitMpServiceImpl, T> extends ServiceImpl KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, Class targetClazz) { + public KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, + Class targetClazz) { if (wrapper == null) { wrapper = new LambdaQueryWrapper<>(); } IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal()); + return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), + originPageData.getTotal()); } public KitPageResult queryFeatureClazzPageByArgs(Q criteria, IPage pageable, Class targetClazz) { QueryWrapper wrapper = KitMpQUtil.build(criteria); IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), originPageData.getTotal()); + return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), + originPageData.getTotal()); } public KitPageResult queryClazzPageByArgs(Q criteria, IPage pageable) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java index a6d75448..641bed53 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java @@ -16,7 +16,12 @@ package cn.odboy.framework.properties; -import cn.odboy.framework.properties.model.*; +import cn.odboy.framework.properties.model.CaptchaModel; +import cn.odboy.framework.properties.model.ContentRsaEncodeSettingModel; +import cn.odboy.framework.properties.model.JwtAuthSettingModel; +import cn.odboy.framework.properties.model.StorageOSSModel; +import cn.odboy.framework.properties.model.ThreadPoolSettingModel; +import cn.odboy.framework.properties.model.UserLoginSettingModel; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java index 480b25f0..0de54afe 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java @@ -20,13 +20,16 @@ import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitObject; import cn.odboy.constant.CaptchaCodeEnum; import cn.odboy.framework.exception.BadRequestException; -import com.wf.captcha.*; +import com.wf.captcha.ArithmeticCaptcha; +import com.wf.captcha.ChineseCaptcha; +import com.wf.captcha.ChineseGifCaptcha; +import com.wf.captcha.GifCaptcha; +import com.wf.captcha.SpecCaptcha; import com.wf.captcha.base.Captcha; +import java.awt.Font; import lombok.Getter; import lombok.Setter; -import java.awt.*; - /** * 验证码配置 * diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java index 4a8285e9..14b30340 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java @@ -17,13 +17,12 @@ package cn.odboy.framework.quartz.core; import cn.odboy.framework.context.KitSpringBeanHolder; +import java.lang.reflect.Method; +import java.util.concurrent.Callable; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ReflectionUtils; -import java.lang.reflect.Method; -import java.util.concurrent.Callable; - /** * 执行定时任务 */ @@ -33,7 +32,8 @@ public class QuartzRunnable implements Callable { private final Method method; private final String params; - public QuartzRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException { + public QuartzRunnable(String beanName, String methodName, String params) + throws NoSuchMethodException, SecurityException { this.target = KitSpringBeanHolder.getBean(beanName); this.params = params; if (StringUtils.isNotBlank(params)) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java index 404bd042..12001523 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java @@ -21,17 +21,27 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.ConvertingCursor; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisConnectionUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; -import java.util.*; -import java.util.concurrent.TimeUnit; - @Component @SuppressWarnings({"unchecked", "all"}) public class KitRedisHelper { @@ -204,8 +214,8 @@ public class KitRedisHelper { public void scanDel(String pattern) { ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); try (Cursor cursor = redisTemplate.executeWithStickyConnection( - (RedisCallback>)connection -> (Cursor)new ConvertingCursor<>(connection.scan(options), - redisTemplate.getKeySerializer()::deserialize))) { + (RedisCallback>)connection -> (Cursor)new ConvertingCursor<>( + connection.scan(options), redisTemplate.getKeySerializer()::deserialize))) { while (cursor.hasNext()) { redisTemplate.delete(cursor.next()); } @@ -293,7 +303,8 @@ public class KitRedisHelper { public List multiGet(List keys) { List list = redisTemplate.opsForValue().multiGet(Sets.newHashSet(keys)); List resultList = Lists.newArrayList(); - Optional.ofNullable(list).ifPresent(e -> list.forEach(ele -> Optional.ofNullable(ele).ifPresent(resultList::add))); + Optional.ofNullable(list) + .ifPresent(e -> list.forEach(ele -> Optional.ofNullable(ele).ifPresent(resultList::add))); return resultList; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java index 39f02286..1192857d 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java @@ -19,6 +19,10 @@ package cn.odboy.framework.redis; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONFactory; import com.alibaba.fastjson2.JSONWriter; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.MurmurHash3; import org.springframework.boot.autoconfigure.AutoConfigureBefore; @@ -39,11 +43,6 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.data.redis.serializer.StringRedisSerializer; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.HashMap; -import java.util.Map; - @Slf4j @Configuration @EnableCaching @@ -53,7 +52,8 @@ public class RedisConfiguration { * 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)
未配置可能导致, 登录失败, 反复登录等问题 */ private static final String[] WHITELIST_STR = - {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", "cn.odboy.task.dal.dataobject", "cn.odboy.task.dal.model",}; + {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", + "cn.odboy.task.dal.dataobject", "cn.odboy.task.dal.model",}; /** * 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式 @@ -62,7 +62,8 @@ public class RedisConfiguration { public RedisCacheConfiguration redisCacheConfiguration() { FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); - configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)) + configuration = configuration.serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)) .entryTtl(Duration.ofHours(2)); return configuration; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java index 82532f1b..8803ae92 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java @@ -19,6 +19,12 @@ package cn.odboy.framework.server.config; import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.properties.model.ThreadPoolSettingModel; import com.alibaba.ttl.TtlRunnable; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,17 +32,13 @@ import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; - /** * 创建自定义的线程池 */ @EnableAsync @Configuration public class AsyncTheadPoolConfig implements AsyncConfigurer { - @Autowired - private AppProperties properties; + @Autowired private AppProperties properties; /** * 自定义线程池, 用法 @Async @@ -49,8 +51,10 @@ public class AsyncTheadPoolConfig implements AsyncConfigurer { // 自定义工厂 ThreadFactory factory = r -> new Thread(r, "DefaultAsync-" + new AtomicInteger(1).getAndIncrement()); // 自定义线程池 - return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, - new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, new ThreadPoolExecutor.CallerRunsPolicy()); + return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), + asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, + new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, + new ThreadPoolExecutor.CallerRunsPolicy()); } /** diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java index 20b7f30c..4ec41f37 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java @@ -16,19 +16,19 @@ package cn.odboy.framework.server.converters; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Component; - import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; @Component public class DateStringArraysToListDateConverter implements Converter> { - private static final ThreadLocal SDF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + private static final ThreadLocal SDF = + ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); @Override public List convert(String[] source) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java index e7fe40ba..fb44c7bd 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java @@ -17,16 +17,16 @@ package cn.odboy.framework.server.converters; import cn.hutool.core.util.StrUtil; -import org.springframework.core.convert.converter.Converter; -import org.springframework.stereotype.Component; - import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; @Component public class DateStringToDateConverter implements Converter { - private static final ThreadLocal SDF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + private static final ThreadLocal SDF = + ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); @Override public Date convert(String source) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java index e33307e0..edd9eaae 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java @@ -21,6 +21,9 @@ import cn.odboy.framework.server.converters.DateStringToDateConverter; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.support.config.FastJsonConfig; import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,10 +38,6 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - /** * 跨越、静态资源映射、Http消息转换 * @@ -48,12 +47,9 @@ import java.util.List; @Configuration @EnableWebMvc public class ConfigurerAdapter implements WebMvcConfigurer { - @Autowired - private DateStringArraysToListDateConverter dateStringArraysToListDateConverter; - @Autowired - private DateStringToDateConverter dateStringToDateConverter; - @Autowired - private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired private DateStringArraysToListDateConverter dateStringArraysToListDateConverter; + @Autowired private DateStringToDateConverter dateStringToDateConverter; + @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; @Bean public CorsFilter corsFilter() { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java index f49cadfd..4676ca40 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java @@ -7,7 +7,8 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; /** - * 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used的警告 + * 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be + * used的警告 * * @author odboy * @date 2025-10-30 @@ -34,8 +35,10 @@ public class UndertowWebSocketConfig implements WebServerFactoryCustomizer { WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); - webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, bufferSize, maxPoolSize, threadLocalCacheSize)); - deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); + webSocketDeploymentInfo.setBuffers( + new DefaultByteBufferPool(false, bufferSize, maxPoolSize, threadLocalCacheSize)); + deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", + webSocketDeploymentInfo); }); } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java index 3123c732..0cdb851d 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java @@ -16,11 +16,10 @@ package cn.odboy.framework.websocket.context; -import lombok.extern.slf4j.Slf4j; - import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import lombok.extern.slf4j.Slf4j; /** * WebSocket客户端管理 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java index c9ecaf2f..ff455bba 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java @@ -17,16 +17,19 @@ package cn.odboy.framework.websocket.context; import com.alibaba.fastjson2.JSON; -import jakarta.websocket.*; +import jakarta.websocket.OnClose; +import jakarta.websocket.OnError; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.util.Objects; - @Slf4j @Component @ServerEndpoint("/websocket/{sid}") @@ -62,7 +65,8 @@ public class KitWsServer { KitWsMessage wsMessage = JSON.parseObject(message, KitWsMessage.class); String bizCode = wsMessage.getBizCode(); Object data = wsMessage.getData(); - log.info("收到来 sid={} 的信息: message={}, bizCode={}, data={}", sid, message, bizCode, JSON.toJSONString(data)); + log.info("收到来 sid={} 的信息: message={}, bizCode={}, data={}", sid, message, bizCode, + JSON.toJSONString(data)); } /** diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java index d151792a..dd3849db 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java @@ -19,6 +19,13 @@ package cn.odboy.util; import cn.odboy.annotation.AnonymousAccess; import cn.odboy.constant.RequestMethodEnum; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import lombok.experimental.UtilityClass; import org.springframework.context.ApplicationContext; import org.springframework.web.bind.annotation.RequestMethod; @@ -27,8 +34,6 @@ import org.springframework.web.servlet.mvc.condition.PathPatternsRequestConditio import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import java.util.*; - /** * 匿名标记工具 */ @@ -42,7 +47,8 @@ public class KitAnonTagUtil { * @return / */ public static Map> getAnonymousUrl(final ApplicationContext applicationContext) { - RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + RequestMappingHandlerMapping requestMappingHandlerMapping = + applicationContext.getBean(RequestMappingHandlerMapping.class); Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); Map> anonymousUrls = new HashMap<>(8); // 获取匿名标记 @@ -56,8 +62,10 @@ public class KitAnonTagUtil { HandlerMethod handlerMethod = infoEntry.getValue(); AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class); if (null != anonymousAccess && infoEntry.getKey() != null) { - List requestMethods = new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods()); - RequestMethodEnum request = RequestMethodEnum.find(requestMethods.isEmpty() ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name()); + List requestMethods = + new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods()); + RequestMethodEnum request = RequestMethodEnum.find( + requestMethods.isEmpty() ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name()); PathPatternsRequestCondition pathPatternsCondition = infoEntry.getKey().getPathPatternsCondition(); if (pathPatternsCondition != null) { switch (Objects.requireNonNull(request)) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java index 1c9370d4..2ac024e6 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java @@ -18,9 +18,8 @@ package cn.odboy.util; import cn.hutool.core.codec.Base64Encoder; import cn.hutool.core.util.IdUtil; -import lombok.experimental.UtilityClass; - import java.nio.charset.StandardCharsets; +import lombok.experimental.UtilityClass; /** * 加密令牌生成工具 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java index b03d595f..07d8ed64 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java @@ -17,10 +17,9 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; - import java.math.BigDecimal; import java.math.RoundingMode; +import lombok.experimental.UtilityClass; /** * 计算类 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java index f30de21f..4d69851d 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java @@ -19,11 +19,10 @@ package cn.odboy.util; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import jakarta.servlet.http.HttpServletRequest; -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - import java.net.InetAddress; import java.net.UnknownHostException; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; /** * 浏览器 相关 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java index 9574530e..663fe582 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java @@ -17,11 +17,10 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; - import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; +import lombok.experimental.UtilityClass; /** * 类 相关 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java index f9e22228..012b21b2 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java @@ -17,9 +17,8 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; - import java.io.Closeable; +import lombok.experimental.UtilityClass; /** * 用于关闭各种连接, 缺啥补啥 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java index cc78a7fd..0719a568 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java @@ -18,15 +18,19 @@ package cn.odboy.util; import cn.odboy.base.KitSelectOptionVo; import com.alibaba.fastjson2.JSON; -import lombok.experimental.UtilityClass; - import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import lombok.experimental.UtilityClass; /** * 集合工具 @@ -61,7 +65,8 @@ public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { * @param / * @return / */ - public static > List streamAscSort(List data, Function keyExtractor) { + public static > List streamAscSort(List data, + Function keyExtractor) { return data.stream().sorted(Comparator.comparing(keyExtractor)).toList(); } @@ -76,7 +81,8 @@ public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { * @param / * @return / */ - public static > List streamDescSort(List data, Function keyExtractor) { + public static > List streamDescSort(List data, + Function keyExtractor) { return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).toList(); } @@ -93,7 +99,8 @@ public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { * @param / * @return / */ - public static Map streamToMap(List data, Function keyMapper, Function valueMapper) { + public static Map streamToMap(List data, Function keyMapper, + Function valueMapper) { // 根据key去重再并流 return streamDistinct(data, keyMapper).stream().collect(Collectors.toMap(keyMapper, valueMapper)); } @@ -185,7 +192,8 @@ public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { * @return / */ public static BigDecimal streamBigDecimalAvg(List data) { - return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR); + return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add) + .divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR); } public static void main(String[] args) { @@ -204,7 +212,8 @@ public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { System.out.println(JSON.toJSONString(selectOptions2)); List selectOptions3 = KitCollUtil.streamDistinct(testData, KitSelectOptionVo::getValue); System.out.println(JSON.toJSONString(selectOptions3)); - Map selectMap1 = KitCollUtil.streamToMap(testData, KitSelectOptionVo::getValue, KitSelectOptionVo::getLabel); + Map selectMap1 = + KitCollUtil.streamToMap(testData, KitSelectOptionVo::getValue, KitSelectOptionVo::getLabel); System.out.println(JSON.toJSONString(selectMap1)); // 这只是一个示范 BigDecimal total1 = KitCollUtil.streamBigDecimalAdd(testData, "value"); diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java index 5384efb4..f00f1e22 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java @@ -18,9 +18,8 @@ package cn.odboy.util; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; -import lombok.experimental.UtilityClass; - import java.util.Date; +import lombok.experimental.UtilityClass; /** * 时间相关工具 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java index c5af74e6..1133c91b 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java @@ -16,14 +16,13 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; - +import java.nio.charset.StandardCharsets; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; -import java.nio.charset.StandardCharsets; +import lombok.experimental.UtilityClass; /** * DES加密 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java index 5287bc67..3b5c1812 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java @@ -17,7 +17,6 @@ package cn.odboy.util; import cn.odboy.framework.exception.BadRequestException; - import java.util.concurrent.atomic.AtomicLong; /** @@ -96,7 +95,8 @@ public final class KitDistributedIdUtil { * @param workerIdBits 机器 ID 所占位数 * @param sequenceBits 序列号所占位数 */ - public KitDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, long sequenceBits) { + public KitDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, + long sequenceBits) { this.dataCenterIdBits = dataCenterIdBits; this.workerIdBits = workerIdBits; this.sequenceBits = sequenceBits; @@ -110,7 +110,8 @@ public final class KitDistributedIdUtil { this.timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; if (dataCenterId > maxDataCenterId || dataCenterId < 0) { - throw new IllegalArgumentException("Data center ID can't be greater than " + maxDataCenterId + " or less than 0"); + throw new IllegalArgumentException( + "Data center ID can't be greater than " + maxDataCenterId + " or less than 0"); } if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException("Worker ID can't be greater than " + maxWorkerId + " or less than 0"); @@ -154,7 +155,9 @@ public final class KitDistributedIdUtil { // 如果当前时间戳小于上一次生成 ID 的时间戳, 说明时钟回拨,抛出异常 if (currentTimestamp < lastTimestamp.get()) { - throw new BadRequestException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) + " milliseconds"); + throw new BadRequestException( + "Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) + + " milliseconds"); } long lastTimestampValue = lastTimestamp.get(); @@ -165,12 +168,14 @@ public final class KitDistributedIdUtil { // 序列号溢出,等待下一毫秒 currentTimestamp = waitNextMillis(lastTimestampValue); } - return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | seq; + return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | + (workerId << workerIdShift) | seq; } else { // 时间戳改变,重置序列号 sequence.set(0L); lastTimestamp.set(currentTimestamp); - return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift); + return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | + (workerId << workerIdShift); } } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java index d732b63a..c58eecfd 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java @@ -26,13 +26,11 @@ import cn.odboy.framework.exception.BadRequestException; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; -import org.apache.poi.util.IOUtils; -import org.apache.poi.xssf.streaming.SXSSFSheet; -import org.springframework.web.multipart.MultipartFile; - -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.nio.file.Files; import java.security.MessageDigest; import java.text.DecimalFormat; @@ -41,8 +39,16 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.springframework.web.multipart.MultipartFile; -import static cn.odboy.constant.SystemConst.*; +import static cn.odboy.constant.SystemConst.SYMBOL_ADD; +import static cn.odboy.constant.SystemConst.SYMBOL_AT; +import static cn.odboy.constant.SystemConst.SYMBOL_EQUAL; +import static cn.odboy.constant.SystemConst.SYMBOL_SUBTRACT; /** * File工具类, 扩展 hutool 工具包 @@ -189,8 +195,8 @@ public final class KitFileUtil extends cn.hutool.core.io.FileUtil { map.forEach((key, value) -> { if (value instanceof String strValue) { // 检查并处理以特殊字符开头的值 - if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith( - SYMBOL_AT)) { + if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || + strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) { // 添加单引号前缀 strValue = "'" + strValue; } @@ -322,7 +328,8 @@ public final class KitFileUtil extends cn.hutool.core.io.FileUtil { * @param response / * @param file / */ - public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) { + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, + boolean deleteOnExit) { response.setCharacterEncoding(request.getCharacterEncoding()); response.setContentType("application/octet-stream"); FileInputStream fis = null; @@ -379,7 +386,8 @@ public final class KitFileUtil extends cn.hutool.core.io.FileUtil { fileName = fileName.replaceAll("^\\.+/", ""); // 保留文件名中最后一个 "." 字符,过滤掉其他 "." - fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2"); + fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + + fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2"); return fileName; } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java index 5f318219..7ce06d80 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java @@ -17,13 +17,12 @@ package cn.odboy.util; import cn.odboy.framework.context.KitSpringBeanHolder; -import lombok.experimental.UtilityClass; -import net.dreamlu.mica.ip2region.core.Ip2regionSearcher; -import net.dreamlu.mica.ip2region.core.IpInfo; - import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; +import lombok.experimental.UtilityClass; +import net.dreamlu.mica.ip2region.core.Ip2regionSearcher; +import net.dreamlu.mica.ip2region.core.IpInfo; /** * IP地址 相关 @@ -55,10 +54,12 @@ public final class KitIPUtil { try { InetAddress candidateAddress = null; // 遍历所有的网络接口 - for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements(); ) { + for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + interfaces.hasMoreElements(); ) { NetworkInterface anInterface = interfaces.nextElement(); // 在所有的接口下再遍历IP - for (Enumeration inetAddresses = anInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) { + for (Enumeration inetAddresses = anInterface.getInetAddresses(); + inetAddresses.hasMoreElements(); ) { InetAddress inetAddr = inetAddresses.nextElement(); // 排除loopback类型地址 if (!inetAddr.isLoopbackAddress()) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java index 0e97fcae..04db1aa5 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java @@ -18,10 +18,9 @@ package cn.odboy.util; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.TypeReference; -import lombok.experimental.UtilityClass; - import java.util.List; import java.util.Map; +import lombok.experimental.UtilityClass; /** * Json工具 @@ -32,13 +31,11 @@ import java.util.Map; @UtilityClass public final class KitJsonUtil { public static Map toMap(String jsonStr, Class kClass, Class vClass) { - return JSON.parseObject(jsonStr, new TypeReference<>() { - }); + return JSON.parseObject(jsonStr, new TypeReference<>() {}); } public static List toList(String jsonStr, Class vClass) { - return JSON.parseObject(jsonStr, new TypeReference<>() { - }); + return JSON.parseObject(jsonStr, new TypeReference<>() {}); } public static void main(String[] args) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java index 7ca9a785..0bb742d0 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java @@ -18,12 +18,11 @@ package cn.odboy.util; import cn.hutool.core.date.DateTime; import cn.odboy.base.KitBaseUserTimeTb; -import lombok.experimental.UtilityClass; - import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import lombok.experimental.UtilityClass; /** * List 工具 @@ -40,12 +39,14 @@ public final class KitListUtil { * @param classifier 对象T属性表达式, 比如: User::getName */ public static List distinctByArgs(List items, Function classifier) { - return items.stream().collect(Collectors.groupingBy(classifier)).values().stream().map(monitorItem -> monitorItem.iterator().next()).toList(); + return items.stream().collect(Collectors.groupingBy(classifier)).values().stream() + .map(monitorItem -> monitorItem.iterator().next()).toList(); } /** - * list转map, 保留新值 -> Map userMap = items.stream().collect(Collectors.toMap(User::getName, user -> user))
list转map, 保留旧值 -> Map userMap = users.stream().collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing)); + * list转map, 保留新值 -> Map userMap = items.stream().collect(Collectors.toMap(User::getName, user -> + * user))
list转map, 保留旧值 -> Map userMap = users.stream().collect(Collectors.toMap(User::getName, + * user -> user, (existing, replacement) -> existing)); */ public static void main(String[] args) { List entities = new ArrayList<>(); diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java index 40227de6..c5e41d16 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java @@ -20,11 +20,10 @@ import cn.odboy.base.KitPageResult; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.experimental.UtilityClass; - import java.util.ArrayList; import java.util.Collections; import java.util.List; +import lombok.experimental.UtilityClass; /** * 分页工具 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java index d62cf1de..3310ae53 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java @@ -34,7 +34,8 @@ import lombok.experimental.UtilityClass; public class KitResourceTemplateUtil { public static String render(String moduleName, String filename, Dict params) { String path = StrUtil.isBlank(moduleName) ? "template" : "template/" + moduleName; - TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig(path, TemplateConfig.ResourceMode.CLASSPATH)); + TemplateEngine engine = + TemplateUtil.createEngine(new TemplateConfig(path, TemplateConfig.ResourceMode.CLASSPATH)); Template template = engine.getTemplate(filename); return template.render(params); } diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java index 5a44daa4..9871ccda 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java @@ -17,14 +17,13 @@ package cn.odboy.util; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.reflect.MethodSignature; - import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; /** * 返回值处理 工具 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java index 920557f0..6a6a0801 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java @@ -16,16 +16,20 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; -import java.security.*; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; +import javax.crypto.Cipher; +import lombok.experimental.UtilityClass; +import org.apache.commons.codec.binary.Base64; /** * Rsa 工具类, 公钥私钥生成, 加解密 diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java index f6b186e2..ff51f821 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java @@ -17,11 +17,10 @@ package cn.odboy.util; -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - import java.util.Calendar; import java.util.Date; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; /** * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类 @@ -35,7 +34,8 @@ public final class KitStringUtil { /** * 驼峰命名法工具 * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" */ public static String toCamelCase(String s) { if (s == null) { @@ -65,7 +65,8 @@ public final class KitStringUtil { /** * 驼峰命名法工具 * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" */ public static String toCapitalizeCamelCase(String s) { if (s == null) { @@ -78,7 +79,8 @@ public final class KitStringUtil { /** * 驼峰命名法工具 * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" + * toUnderScoreCase("helloWorld") = "hello_world" */ public static String toUnderScoreCase(String s) { if (s == null) { diff --git a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java index bc676827..6148b1ce 100644 --- a/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java +++ b/cutejava-springboot3/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java @@ -22,10 +22,9 @@ import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; import jakarta.validation.groups.Default; -import lombok.experimental.UtilityClass; - import java.util.Set; import java.util.stream.Collectors; +import lombok.experimental.UtilityClass; /** * Bean验证工具 @@ -46,7 +45,8 @@ public final class KitValidUtil { public static void validate(T object) { Set> violations = VALIDATOR.validate(object, Default.class); if (!violations.isEmpty()) { - throw new BadRequestException(violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(","))); + throw new BadRequestException( + violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(","))); } } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/pom.xml b/cutejava-springboot3/cutejava-module-system/pom.xml index a7feb437..2c613898 100644 --- a/cutejava-springboot3/cutejava-module-system/pom.xml +++ b/cutejava-springboot3/cutejava-module-system/pom.xml @@ -1,27 +1,25 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - - cutejava-module-system - 核心模块 - - - - cn.odboy - cutejava-framework - 1.4.1 - - - - io.minio - minio - 8.5.17 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-module-system + 核心模块 + + + cn.odboy + cutejava-framework + 1.4.1 + + + + io.minio + minio + 8.5.17 + + diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java index a1c7663d..333dcfda 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.constant; import lombok.AllArgsConstructor; @@ -25,42 +24,37 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum SystemCaptchaBizEnum { + /* 通过手机号码重置邮箱 */ + PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", + "通过手机号码重置邮箱"), /* 通过旧邮箱重置邮箱 */ + EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", "通过旧邮箱重置邮箱"), + /* 通过手机号码重置密码 */ + PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过手机号码重置密码"), + /* 通过邮箱重置密码 */ + EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过邮箱重置密码"); + /** + * 业务编码 + */ + private final String bizCode; + /** + * redis中的key + */ + private final String redisKey; + /** + * resources文件夹,template中的模版名称 + */ + private final String templateName; + /** + * 业务描述 + */ + private final String description; - /* 通过手机号码重置邮箱 */ - PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", "通过手机号码重置邮箱"), - - /* 通过旧邮箱重置邮箱 */ - EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", "通过旧邮箱重置邮箱"), - - /* 通过手机号码重置密码 */ - PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过手机号码重置密码"), - - /* 通过邮箱重置密码 */ - EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过邮箱重置密码"); - - /** - * 业务编码 - */ - private final String bizCode; - /** - * redis中的key - */ - private final String redisKey; - /** - * resources文件夹,template中的模版名称 - */ - private final String templateName; - /** - * 业务描述 - */ - private final String description; - - public static SystemCaptchaBizEnum getByBizCode(String bizCode) { - for (SystemCaptchaBizEnum value : SystemCaptchaBizEnum.values()) { - if (value.getBizCode().equals(bizCode)) { - return value; - } - } - return null; + public static SystemCaptchaBizEnum getByBizCode(String bizCode) { + for (SystemCaptchaBizEnum value : SystemCaptchaBizEnum.values()) { + if (value.getBizCode().equals(bizCode)) { + return value; + } } + return null; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java index 7983cf0e..bb30f72b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.constant; import lombok.AllArgsConstructor; @@ -25,25 +24,19 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum SystemDataScopeEnum { + /* 全部的数据权限 */ + ALL("全部", "全部的数据权限"), /* 自己部门的数据权限 */ + THIS_LEVEL("本级", "自己部门的数据权限"), /* 自定义的数据权限 */ + CUSTOMIZE("自定义", "自定义的数据权限"); + private final String value; + private final String description; - /* 全部的数据权限 */ - ALL("全部", "全部的数据权限"), - - /* 自己部门的数据权限 */ - THIS_LEVEL("本级", "自己部门的数据权限"), - - /* 自定义的数据权限 */ - CUSTOMIZE("自定义", "自定义的数据权限"); - - private final String value; - private final String description; - - public static SystemDataScopeEnum find(String val) { - for (SystemDataScopeEnum dataScopeEnum : SystemDataScopeEnum.values()) { - if (dataScopeEnum.getValue().equals(val)) { - return dataScopeEnum; - } - } - return null; + public static SystemDataScopeEnum find(String val) { + for (SystemDataScopeEnum dataScopeEnum : SystemDataScopeEnum.values()) { + if (dataScopeEnum.getValue().equals(val)) { + return dataScopeEnum; + } } + return null; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java index 43b37c71..02a59fe7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.constant; public interface TransferProtocolConst { - String PREFIX_HTTP = "http://"; - String PREFIX_HTTPS = "https://"; - String PREFIX_HTTPS_BAD_REQUEST = "外链必须以http://或者https://开头"; + + String PREFIX_HTTP = "http://"; + String PREFIX_HTTPS = "https://"; + String PREFIX_HTTPS_BAD_REQUEST = "外链必须以http://或者https://开头"; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java index 0b0f52b1..3d9b9e66 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.hutool.core.bean.BeanUtil; @@ -35,8 +34,11 @@ import cn.odboy.system.framework.permission.core.handler.TokenProvider; import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; import cn.odboy.util.KitRsaEncryptUtil; import com.wf.captcha.base.Captcha; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -51,105 +53,107 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - /** * 授权、根据token获取用户详细信息 */ @Slf4j @RestController @RequestMapping("/auth") -@Tag(name = "系统:系统授权接口") +@Api(tags = "系统:系统授权接口") public class SystemAuthController { - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired - private TokenProvider tokenProvider; - @Autowired - private AppProperties properties; - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private UserDetailsHandler userDetailsService; - @Operation(summary = "登录授权") - @AnonymousPostMapping(value = "/login") - public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, HttpServletRequest request) throws Exception { - // 密码解密 - String password = KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); - // 查询验证码 - String code = redisHelper.get(loginRequest.getUuid(), String.class); - // 清除验证码 - redisHelper.del(loginRequest.getUuid()); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); - } - if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { - throw new BadRequestException("验证码错误"); - } - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); - } - Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - Map authInfo = new HashMap<>(2) {{ - put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); - }}; - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); - } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return ResponseEntity.ok(authInfo); - } + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; - @Operation(summary = "获取用户信息") - @PostMapping(value = "/info") - public ResponseEntity getUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); - SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); - return ResponseEntity.ok(userInfoVo); + @ApiOperation("登录授权") + @AnonymousPostMapping(value = "/login") + public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, + HttpServletRequest request) throws Exception { + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); + // 查询验证码 + String code = redisHelper.get(loginRequest.getUuid(), String.class); + // 清除验证码 + redisHelper.del(loginRequest.getUuid()); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); } + if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { + throw new BadRequestException("验证码错误"); + } + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); + // 验证用户密码 + if (!passwordEncoder.matches(password, jwtUser.getPassword())) { + throw new BadRequestException("登录密码错误"); + } + Authentication authentication = + new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map authInfo = new HashMap<>(2) {{ + put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); + }}; + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return ResponseEntity.ok(authInfo); + } - @Operation(summary = "获取验证码") - @AnonymousPostMapping(value = "/captcha/getImage") - public ResponseEntity> getCode() { - // 获取运算的结果 - Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); - String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); - //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 - String captchaValue = captcha.text(); - if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(SystemConst.SYMBOL_DOT)) { - captchaValue = captchaValue.split("\\.")[0]; - } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), TimeUnit.MINUTES); - // 验证码信息 - Map imgResult = new HashMap<>(2) {{ - put("img", captcha.toBase64()); - put("uuid", uuid); - }}; - return ResponseEntity.ok(imgResult); - } + @ApiOperation("获取用户信息") + @PostMapping(value = "/info") + public ResponseEntity getUserInfo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); + SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); + return ResponseEntity.ok(userInfoVo); + } - @Operation(summary = "退出登录") - @AnonymousPostMapping(value = "/logout") - public ResponseEntity logout(HttpServletRequest request) { - String token = tokenProvider.getToken(request); - systemUserOnlineInfoDAO.logoutByToken(token); - return ResponseEntity.ok(null); + @ApiOperation("获取验证码") + @AnonymousPostMapping(value = "/captcha/getImage") + public ResponseEntity> getCode() { + // 获取运算的结果 + Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); + String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); + //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 + String captchaValue = captcha.text(); + if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && + captchaValue.contains(SystemConst.SYMBOL_DOT)) { + captchaValue = captchaValue.split("\\.")[0]; } + // 保存 + redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), + TimeUnit.MINUTES); + // 验证码信息 + Map imgResult = new HashMap(2) {{ + put("img", captcha.toBase64()); + put("uuid", uuid); + }}; + return ResponseEntity.ok(imgResult); + } + + @ApiOperation("退出登录") + @AnonymousPostMapping(value = "/logout") + public ResponseEntity logout(HttpServletRequest request) { + String token = tokenProvider.getToken(request); + systemUserOnlineInfoDAO.logoutByToken(token); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java index 8e136cef..98fa7c20 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java @@ -13,49 +13,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.constant.SystemCaptchaBizEnum; import cn.odboy.system.dal.model.SystemCheckEmailCaptchaArgs; import cn.odboy.system.service.SystemEmailService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/captcha") -@Tag(name = "系统:验证码管理") +@Api(tags = "系统:验证码管理") public class SystemCaptchaController { - @Autowired - private SystemEmailService systemEmailService; - @Operation(summary = "重置邮箱, 发送验证码") - @PostMapping(value = "/sendResetEmailCaptcha") - public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); - return ResponseEntity.ok(null); - } + @Autowired + private SystemEmailService systemEmailService; - @Operation(summary = "重置密码,发送验证码") - @PostMapping(value = "/sendResetPasswordCaptcha") - public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); - return ResponseEntity.ok(null); - } + @ApiOperation("重置邮箱, 发送验证码") + @PostMapping(value = "/sendResetEmailCaptcha") + public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); + return ResponseEntity.ok(null); + } - @Operation(summary = "验证码验证") - @PostMapping(value = "/checkEmailCaptcha") - public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { - SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); - if (biEnum == null) { - throw new BadRequestException("不支持的业务"); - } - systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); - return ResponseEntity.ok(null); + @ApiOperation("重置密码,发送验证码") + @PostMapping(value = "/sendResetPasswordCaptcha") + public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); + return ResponseEntity.ok(null); + } + + @ApiOperation("验证码验证") + @PostMapping(value = "/checkEmailCaptcha") + public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); } + systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java index f35ac21b..ffb123a7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.system.service.SystemDeptService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -27,23 +26,24 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:组件数据源") +@Api(tags = "系统:组件数据源") @RequestMapping("/api/component") public class SystemComponentController { - @Autowired - private SystemDeptService systemDeptService; - @Operation(summary = "查询部门下拉选择数据源") - @PostMapping(value = "/queryDeptSelectDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); - } + @Autowired + private SystemDeptService systemDeptService; - @Operation(summary = "查询部门下拉选择Pro数据源") - @PostMapping(value = "/queryDeptSelectProDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectProDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); - } + @ApiOperation("查询部门下拉选择数据源") + @PostMapping(value = "/queryDeptSelectDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); + } + + @ApiOperation("查询部门下拉选择Pro数据源") + @PostMapping(value = "/queryDeptSelectProDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectProDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java index 35abc201..cb155658 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -23,93 +22,100 @@ import cn.odboy.system.dal.model.SystemCreateDeptArgs; import cn.odboy.system.dal.model.SystemQueryDeptArgs; import cn.odboy.system.service.SystemDeptService; import cn.odboy.util.KitPageUtil; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:部门管理") +@Api(tags = "系统:部门管理") @RequestMapping("/api/dept") public class SystemDeptController { - @Autowired - private SystemDeptService systemDeptService; - @Operation(summary = "导出部门数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dept:list')") - public void exportDept(HttpServletResponse response, SystemQueryDeptArgs criteria) throws Exception { - systemDeptService.exportDeptExcel(systemDeptService.queryAllDept(criteria, false), response); - } + @Autowired + private SystemDeptService systemDeptService; - @Operation(summary = "查询部门") - @PostMapping - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDept(@Validated @RequestBody KitPageArgs args) throws Exception { - SystemQueryDeptArgs criteria = args.getArgs(); - List depts = systemDeptService.queryAllDept(criteria, true); - return ResponseEntity.ok(KitPageUtil.toPage(depts)); - } + @ApiOperation("导出部门数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dept:list')") + public void exportDept(HttpServletResponse response, SystemQueryDeptArgs criteria) throws Exception { + systemDeptService.exportDeptExcel(systemDeptService.queryAllDept(criteria, false), response); + } - @Operation(summary = "查询部门:根据ID获取同级与上级数据") - @PostMapping("/queryDeptSuperiorTree") - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, - @RequestParam(defaultValue = "false") Boolean exclude) { - Set deptSet = new LinkedHashSet<>(); - for (Long id : ids) { - // 同级数据 - SystemDeptTb dept = systemDeptService.getDeptById(id); - // 上级数据 - List depts = systemDeptService.querySuperiorDeptListByPid(dept, new ArrayList<>()); - if (exclude) { - for (SystemDeptTb data : depts) { - if (data.getId().equals(dept.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - depts = depts.stream().filter(i -> !ids.contains(i.getId())).toList(); - } - deptSet.addAll(depts); + @ApiOperation("查询部门") + @PostMapping + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDept( + @Validated @RequestBody KitPageArgs args) throws Exception { + SystemQueryDeptArgs criteria = args.getArgs(); + List depts = systemDeptService.queryAllDept(criteria, true); + return ResponseEntity.ok(KitPageUtil.toPage(depts)); + } + + @ApiOperation("查询部门:根据ID获取同级与上级数据") + @PostMapping("/queryDeptSuperiorTree") + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, + @RequestParam(defaultValue = "false") Boolean exclude) { + Set deptSet = new LinkedHashSet<>(); + for (Long id : ids) { + // 同级数据 + SystemDeptTb dept = systemDeptService.getDeptById(id); + // 上级数据 + List depts = systemDeptService.querySuperiorDeptListByPid(dept, new ArrayList<>()); + if (exclude) { + for (SystemDeptTb data : depts) { + if (data.getId().equals(dept.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } } - return ResponseEntity.ok(systemDeptService.buildDeptTree(new ArrayList<>(deptSet))); + // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); + } + deptSet.addAll(depts); } + return ResponseEntity.ok(systemDeptService.buildDeptTree(new ArrayList<>(deptSet))); + } - @Operation(summary = "新增部门") - @PostMapping(value = "/saveDept") - @PreAuthorize("@el.check('dept:add')") - public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { - systemDeptService.saveDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增部门") + @PostMapping(value = "/saveDept") + @PreAuthorize("@el.check('dept:add')") + public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { + systemDeptService.saveDept(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改部门") - @PostMapping(value = "/modifyDept") - @PreAuthorize("@el.check('dept:edit')") - public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { - systemDeptService.updateDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改部门") + @PostMapping(value = "/modifyDept") + @PreAuthorize("@el.check('dept:edit')") + public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { + systemDeptService.updateDept(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除部门") - @PostMapping(value = "/removeDeptByIds") - @PreAuthorize("@el.check('dept:del')") - public ResponseEntity removeDeptByIds(@RequestBody Set ids) { - // 获取部门, 和其所有子部门 - Set depts = systemDeptService.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - systemDeptService.verifyBindRelationByIds(depts); - systemDeptService.removeDeptByIds(depts); - return ResponseEntity.ok(null); - } + @ApiOperation("删除部门") + @PostMapping(value = "/removeDeptByIds") + @PreAuthorize("@el.check('dept:del')") + public ResponseEntity removeDeptByIds(@RequestBody Set ids) { + // 获取部门, 和其所有子部门 + Set depts = systemDeptService.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + systemDeptService.verifyBindRelationByIds(depts); + systemDeptService.removeDeptByIds(depts); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java index d22d6a9a..66c3819b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -23,75 +22,80 @@ import cn.odboy.system.dal.model.SystemCreateDictArgs; import cn.odboy.system.dal.model.SystemQueryDictArgs; import cn.odboy.system.service.SystemDictService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; +import java.util.List; +import java.util.Set; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:字典管理") +@Api(tags = "系统:字典管理") @RequestMapping("/api/dict") public class SystemDictController { - @Autowired - private SystemDictService systemDictService; - @Operation(summary = "导出字典数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dict:list')") - public void exportDict(HttpServletResponse response, SystemQueryDictArgs criteria) throws IOException { - systemDictService.exportDictExcel(systemDictService.queryDictByArgs(criteria), response); - } + @Autowired + private SystemDictService systemDictService; - @Operation(summary = "查询字典") - @PostMapping(value = "/queryAllDict") - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryAllDict() { - return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); - } + @ApiOperation("导出字典数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dict:list')") + public void exportDict(HttpServletResponse response, SystemQueryDictArgs criteria) throws IOException { + systemDictService.exportDictExcel(systemDictService.queryDictByArgs(criteria), response); + } - @Operation(summary = "查询字典") - @PostMapping - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryDictByArgs(@Validated @RequestBody KitPageArgs args) { - Page page; - SystemQueryDictArgs criteria = args.getArgs(); - if (args.getSize() != null) { - page = new Page<>(args.getPage(), args.getSize()); - } else { - page = new Page<>(criteria.getPage(), criteria.getSize()); - } - return ResponseEntity.ok(systemDictService.queryDictByArgs(criteria, page)); - } + @ApiOperation("查询字典") + @PostMapping(value = "/queryAllDict") + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryAllDict() { + return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); + } - @Operation(summary = "新增字典") - @PostMapping(value = "/saveDict") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { - systemDictService.saveDict(args); - return ResponseEntity.ok(null); + @ApiOperation("查询字典") + @PostMapping + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryDictByArgs( + @Validated @RequestBody KitPageArgs args) { + Page page; + SystemQueryDictArgs criteria = args.getArgs(); + if (args.getSize() != null) { + page = new Page<>(args.getPage(), args.getSize()); + } else { + page = new Page<>(criteria.getPage(), criteria.getSize()); } + return ResponseEntity.ok(systemDictService.queryDictByArgs(criteria, page)); + } - @Operation(summary = "修改字典") - @PostMapping(value = "/modifyDictById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { - systemDictService.modifyDictById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典") + @PostMapping(value = "/saveDict") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { + systemDictService.saveDict(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除字典") - @PostMapping(value = "/removeDictByIds") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictByIds(@RequestBody Set ids) { - systemDictService.removeDictByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典") + @PostMapping(value = "/modifyDictById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { + systemDictService.modifyDictById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除字典") + @PostMapping(value = "/removeDictByIds") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictByIds(@RequestBody Set ids) { + systemDictService.removeDictByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java index cd5f9fe7..8ec086c4 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java @@ -13,81 +13,89 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.model.SystemCreateDictDetailArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.service.SystemDictDetailService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:字典详情管理") +@Api(tags = "系统:字典详情管理") @RequestMapping("/api/dictDetail") public class SystemDictDetailController { - @Autowired - private SystemDictDetailService systemDictDetailService; - @Operation(summary = "查询字典详情") - @PostMapping - public ResponseEntity> queryDictDetailByCrud(@Validated @RequestBody KitPageArgs args) { - return queryDictDetailByArgs(args); - } + @Autowired + private SystemDictDetailService systemDictDetailService; - @Operation(summary = "查询字典详情") - @PostMapping(value = "/queryDictDetailByArgs") - public ResponseEntity> queryDictDetailByArgs(@Validated @RequestBody KitPageArgs args) { - SystemQueryDictDetailArgs criteria = args.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemDictDetailService.queryDictDetailByArgs(criteria, page)); - } + @ApiOperation("查询字典详情") + @PostMapping + public ResponseEntity> queryDictDetailByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryDictDetailByArgs(args); + } - @Operation(summary = "查询多个字典详情") - @GetMapping(value = "/getDictDetailMaps") - public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, systemDictDetailService.queryDictDetailByName(name)); - } - return ResponseEntity.ok(dictMap); - } + @ApiOperation("查询字典详情") + @PostMapping(value = "/queryDictDetailByArgs") + public ResponseEntity> queryDictDetailByArgs( + @Validated @RequestBody KitPageArgs args) { + SystemQueryDictDetailArgs criteria = args.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemDictDetailService.queryDictDetailByArgs(criteria, page)); + } - @Operation(summary = "新增字典详情") - @PostMapping(value = "/saveDictDetail") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { - systemDictDetailService.saveDictDetail(args); - return ResponseEntity.ok(null); + @ApiOperation("查询多个字典详情") + @GetMapping(value = "/getDictDetailMaps") + public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { + String[] names = dictName.split("[,, ]"); + Map> dictMap = new HashMap<>(16); + for (String name : names) { + dictMap.put(name, systemDictDetailService.queryDictDetailByName(name)); } + return ResponseEntity.ok(dictMap); + } - @Operation(summary = "修改字典详情") - @PostMapping(value = "/modifyDictDetailById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictDetailById(@Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { - systemDictDetailService.modifyDictDetailById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典详情") + @PostMapping(value = "/saveDictDetail") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { + systemDictDetailService.saveDictDetail(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除字典详情") - @PostMapping(value = "/removeDictDetailById") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { - systemDictDetailService.removeDictDetailById(args.getId()); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典详情") + @PostMapping(value = "/modifyDictDetailById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictDetailById( + @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { + systemDictDetailService.modifyDictDetailById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除字典详情") + @PostMapping(value = "/removeDictDetailById") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { + systemDictDetailService.removeDictDetailById(args.getId()); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java index 197fdfb3..85a08725 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.system.dal.dataobject.SystemEmailConfigTb; import cn.odboy.system.dal.model.SystemSendEmailArgs; import cn.odboy.system.service.SystemEmailService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -34,28 +33,30 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("api/email") -@Tag(name = "工具:邮件管理") +@Api(tags = "工具:邮件管理") public class SystemEmailController { - @Autowired - private SystemEmailService systemEmailService; - @Operation(summary = "查询配置") - @PostMapping(value = "/getLastEmailConfig") - public ResponseEntity getLastEmailConfig() { - return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); - } + @Autowired + private SystemEmailService systemEmailService; - @Operation(summary = "配置邮件") - @PostMapping(value = "/modifyEmailConfig") - public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) throws Exception { - systemEmailService.modifyEmailConfig(emailConfig); - return ResponseEntity.ok(null); - } + @ApiOperation("查询配置") + @PostMapping(value = "/getLastEmailConfig") + public ResponseEntity getLastEmailConfig() { + return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); + } - @Operation(summary = "发送邮件") - @PostMapping(value = "/sendEmail") - public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { - systemEmailService.sendEmail(sendEmailRequest); - return ResponseEntity.ok(null); - } + @ApiOperation("配置邮件") + @PostMapping(value = "/modifyEmailConfig") + public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) + throws Exception { + systemEmailService.modifyEmailConfig(emailConfig); + return ResponseEntity.ok(null); + } + + @ApiOperation("发送邮件") + @PostMapping(value = "/sendEmail") + public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { + systemEmailService.sendEmail(sendEmailRequest); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java index 5c5c4d66..422e0f51 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -23,71 +22,77 @@ import cn.odboy.system.dal.model.SystemCreateJobArgs; import cn.odboy.system.dal.model.SystemQueryJobArgs; import cn.odboy.system.service.SystemJobService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; +import java.util.Set; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:岗位管理") +@Api(tags = "系统:岗位管理") @RequestMapping("/api/job") public class SystemJobController { - @Autowired - private SystemJobService systemJobService; - @Operation(summary = "导出岗位数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('job:list')") - public void exportJob(HttpServletResponse response, SystemQueryJobArgs criteria) throws IOException { - systemJobService.exportJobExcel(systemJobService.queryJobByArgs(criteria), response); - } + @Autowired + private SystemJobService systemJobService; - @Operation(summary = "查询岗位") - @PostMapping(value = "/queryAllEnableJob") - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByArgs(@Validated @RequestBody KitPageArgs args) { - SystemQueryJobArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemJobService.queryJobByArgs(criteria, page)); - } + @ApiOperation("导出岗位数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('job:list')") + public void exportJob(HttpServletResponse response, SystemQueryJobArgs criteria) throws IOException { + systemJobService.exportJobExcel(systemJobService.queryJobByArgs(criteria), response); + } - @Operation(summary = "查询岗位") - @PostMapping - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByCrud(@Validated @RequestBody KitPageArgs args) { - return queryJobByArgs(args); - } + @ApiOperation("查询岗位") + @PostMapping(value = "/queryAllEnableJob") + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByArgs( + @Validated @RequestBody KitPageArgs args) { + SystemQueryJobArgs criteria = args.getArgs(); + Page page = new Page<>(criteria.getPage(), criteria.getSize()); + return ResponseEntity.ok(systemJobService.queryJobByArgs(criteria, page)); + } - @Operation(summary = "新增岗位") - @PostMapping(value = "/saveJob") - @PreAuthorize("@el.check('job:add')") - public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { - systemJobService.saveJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询岗位") + @PostMapping + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryJobByArgs(args); + } - @Operation(summary = "修改岗位") - @PostMapping(value = "/modifyJobById") - @PreAuthorize("@el.check('job:edit')") - public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { - systemJobService.modifyJobById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增岗位") + @PostMapping(value = "/saveJob") + @PreAuthorize("@el.check('job:add')") + public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { + systemJobService.saveJob(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除岗位") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('job:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - // 验证是否被用户关联 - systemJobService.verifyBindRelationByIds(ids); - systemJobService.removeJobByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改岗位") + @PostMapping(value = "/modifyJobById") + @PreAuthorize("@el.check('job:edit')") + public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { + systemJobService.modifyJobById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除岗位") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('job:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + // 验证是否被用户关联 + systemJobService.verifyBindRelationByIds(ids); + systemJobService.removeJobByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java index 558a4708..4298b307 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -25,73 +24,79 @@ import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.service.SystemLocalStorageService; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; - @RestController -@Tag(name = "工具:本地存储管理") +@Api(tags = "工具:本地存储管理") @RequestMapping("/api/localStorage") public class SystemLocalStorageController { - @Autowired - private SystemLocalStorageService localStorageService; - @Operation(summary = "查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryLocalStorage(@Validated @RequestBody KitPageArgs args) { - SystemQueryStorageArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(localStorageService.queryLocalStorage(criteria, page)); - } + @Autowired + private SystemLocalStorageService localStorageService; - @Operation(summary = "导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { - localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorage(criteria), response); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryLocalStorage( + @Validated @RequestBody KitPageArgs args) { + SystemQueryStorageArgs criteria = args.getArgs(); + Page page = new Page<>(criteria.getPage(), criteria.getSize()); + return ResponseEntity.ok(localStorageService.queryLocalStorage(criteria, page)); + } - @Operation(summary = "上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { - localStorageService.uploadFile(name, file); - return ResponseEntity.ok(null); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { + localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorage(criteria), response); + } - @Operation(summary = "上传图片") - @PostMapping("/uploadPicture") - public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { - // 判断文件是否为图片 - String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); - if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { - throw new BadRequestException("只能上传图片"); - } - SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); - return ResponseEntity.ok(localStorage); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { + localStorageService.uploadFile(name, file); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改文件") - @PostMapping(value = "/modifyLocalStorageById") - @PreAuthorize("@el.check('storage:edit')") - public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { - localStorageService.modifyLocalStorageById(args); - return ResponseEntity.ok(null); + @ApiOperation("上传图片") + @PostMapping("/uploadPicture") + public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { + // 判断文件是否为图片 + String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); + if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { + throw new BadRequestException("只能上传图片"); } + SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); + return ResponseEntity.ok(localStorage); + } - @Operation(summary = "多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { - localStorageService.removeFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改文件") + @PostMapping(value = "/modifyLocalStorageById") + @PreAuthorize("@el.check('storage:edit')") + public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { + localStorageService.modifyLocalStorageById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { + localStorageService.removeFileByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java index 8dae6aa5..d228f47c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.hutool.core.collection.CollectionUtil; @@ -27,124 +26,135 @@ import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemMenuService; import cn.odboy.util.KitPageUtil; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.*; -import java.util.stream.Collectors; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:菜单管理") +@Api(tags = "系统:菜单管理") @RequestMapping("/api/menu") public class SystemMenuController { - @Autowired - private SystemMenuService systemMenuService; - @Autowired - private SystemMenuMapper systemMenuMapper; - @Operation(summary = "导出菜单数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('menu:list')") - public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs criteria) throws Exception { - systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(criteria, false), response); - } + @Autowired + private SystemMenuService systemMenuService; + @Autowired + private SystemMenuMapper systemMenuMapper; - @PostMapping(value = "/buildMenus") - @Operation(summary = "获取前端所需菜单") - public ResponseEntity> buildMenus() { - List menuList = systemMenuService.queryMenuListByUserId(KitSecurityHelper.getCurrentUserId()); - List menus = systemMenuService.buildMenuTree(menuList); - return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); - } + @ApiOperation("导出菜单数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('menu:list')") + public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs criteria) throws Exception { + systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(criteria, false), response); + } - @Operation(summary = "返回全部的菜单") - @PostMapping(value = "/queryMenuListByPid") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { - return ResponseEntity.ok(systemMenuService.queryMenuByPid(pid)); - } + @PostMapping(value = "/buildMenus") + @ApiOperation("获取前端所需菜单") + public ResponseEntity> buildMenus() { + List menuList = systemMenuService.queryMenuListByUserId(KitSecurityHelper.getCurrentUserId()); + List menus = systemMenuService.buildMenuTree(menuList); + return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); + } - @Operation(summary = "根据菜单ID返回所有子节点ID, 包含自身ID") - @PostMapping(value = "/queryChildMenuSet") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { - Set menuSet = new HashSet<>(); - List menuList = systemMenuService.queryMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = systemMenuService.queryChildMenu(menuList, menuSet); - Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); - return ResponseEntity.ok(ids); - } + @ApiOperation("返回全部的菜单") + @PostMapping(value = "/queryMenuListByPid") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { + return ResponseEntity.ok(systemMenuService.queryMenuByPid(pid)); + } - @PostMapping - @Operation(summary = "查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenuByCrud(@Validated @RequestBody KitPageArgs args) throws Exception { - return queryAllMenu(args); - } + @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") + @PostMapping(value = "/queryChildMenuSet") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { + Set menuSet = new HashSet<>(); + List menuList = systemMenuService.queryMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = systemMenuService.queryChildMenu(menuList, menuSet); + Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); + return ResponseEntity.ok(ids); + } - @PostMapping(value = "/queryMenuByArgs") - @Operation(summary = "查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenu(@Validated @RequestBody KitPageArgs args) throws Exception { - SystemQueryMenuArgs criteria = args.getArgs(); - List menuList = systemMenuService.queryAllMenu(criteria, true); - return ResponseEntity.ok(KitPageUtil.toPage(menuList)); - } + @PostMapping + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenuByCrud( + @Validated @RequestBody KitPageArgs args) throws Exception { + return queryAllMenu(args); + } - @Operation(summary = "查询菜单:根据ID获取同级与上级数据") - @PostMapping("/queryMenuSuperior") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { - Set menus; - if (CollectionUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(systemMenuService.queryMenuByIds(ids)); - for (SystemMenuTb menu : menus) { - List menuList = systemMenuService.querySuperiorMenuList(menu, new ArrayList<>()); - for (SystemMenuTb data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); + @PostMapping(value = "/queryMenuByArgs") + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenu( + @Validated @RequestBody KitPageArgs args) throws Exception { + SystemQueryMenuArgs criteria = args.getArgs(); + List menuList = systemMenuService.queryAllMenu(criteria, true); + return ResponseEntity.ok(KitPageUtil.toPage(menuList)); + } + + @ApiOperation("查询菜单:根据ID获取同级与上级数据") + @PostMapping("/queryMenuSuperior") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { + Set menus; + if (CollectionUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(systemMenuService.queryMenuByIds(ids)); + for (SystemMenuTb menu : menus) { + List menuList = systemMenuService.querySuperiorMenuList(menu, new ArrayList<>()); + for (SystemMenuTb data : menuList) { + if (data.getId().equals(menu.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } } - return ResponseEntity.ok(systemMenuService.queryMenuByPid(null)); + menus.addAll(menuList); + } + // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); + return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); } + return ResponseEntity.ok(systemMenuService.queryMenuByPid(null)); + } - @Operation(summary = "新增菜单") - @PostMapping(value = "/saveMenu") - @PreAuthorize("@el.check('menu:add')") - public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - systemMenuService.saveMenu(args); - return ResponseEntity.ok(null); + @ApiOperation("新增菜单") + @PostMapping(value = "/saveMenu") + @PreAuthorize("@el.check('menu:add')") + public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + systemMenuService.saveMenu(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改菜单") - @PostMapping(value = "/modifyMenuById") - @PreAuthorize("@el.check('menu:edit')") - public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { - systemMenuService.modifyMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改菜单") + @PostMapping(value = "/modifyMenuById") + @PreAuthorize("@el.check('menu:edit')") + public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { + systemMenuService.modifyMenuById(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除菜单") - @PostMapping(value = "/removeMenuByIds") - @PreAuthorize("@el.check('menu:del')") - public ResponseEntity removeMenuByIds(@RequestBody Set ids) { - systemMenuService.removeMenuByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("删除菜单") + @PostMapping(value = "/removeMenuByIds") + @PreAuthorize("@el.check('menu:del')") + public ResponseEntity removeMenuByIds(@RequestBody Set ids) { + systemMenuService.removeMenuByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java index 4a39e7a5..dd165cd2 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.system.service.SystemMonitorService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -26,19 +26,18 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Map; - @RestController -@Tag(name = "系统-服务监控管理") +@Api(tags = "系统-服务监控管理") @RequestMapping("/api/monitor") public class SystemMonitorController { - @Autowired - private SystemMonitorService systemMonitorService; - @PostMapping(value = "/queryServerMonitorInfo") - @Operation(summary = "查询服务监控") - @PreAuthorize("@el.check('monitor:list')") - public ResponseEntity> queryServerMonitorInfo() { - return ResponseEntity.ok(systemMonitorService.queryServerMonitorInfo()); - } + @Autowired + private SystemMonitorService systemMonitorService; + + @PostMapping(value = "/queryServerMonitorInfo") + @ApiOperation("查询服务监控") + @PreAuthorize("@el.check('monitor:list')") + public ResponseEntity> queryServerMonitorInfo() { + return ResponseEntity.ok(systemMonitorService.queryServerMonitorInfo()); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java index c610cad7..95912ea5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -23,49 +22,55 @@ import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; import cn.odboy.util.KitDesEncryptUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; +import java.util.Set; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/user/online") -@Tag(name = "系统:在线用户管理") +@Api(tags = "系统:在线用户管理") public class SystemOnlineController { - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Operation(summary = "查询在线用户") - @PostMapping - @PreAuthorize("@el.check()") - public ResponseEntity> queryOnlineUser(@Validated @RequestBody KitPageArgs args) { - IPage page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); - } + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Operation(summary = "导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check()") - public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { - systemUserOnlineInfoDAO.downloadUserOnlineModelExcel(systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); - } + @ApiOperation("查询在线用户") + @PostMapping + @PreAuthorize("@el.check()") + public ResponseEntity> queryOnlineUser( + @Validated @RequestBody KitPageArgs args) { + IPage page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); + } - @Operation(summary = "踢出用户") - @PostMapping(value = "/kickOutUser") - @PreAuthorize("@el.check()") - public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { - for (String token : keys) { - // 解密Key - token = KitDesEncryptUtil.desDecrypt(token); - systemUserOnlineInfoDAO.logoutByToken(token); - } - return ResponseEntity.ok(null); + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check()") + public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { + systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( + systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); + } + + @ApiOperation("踢出用户") + @PostMapping(value = "/kickOutUser") + @PreAuthorize("@el.check()") + public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { + for (String token : keys) { + // 解密Key + token = KitDesEncryptUtil.desDecrypt(token); + systemUserOnlineInfoDAO.logoutByToken(token); } + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java index c4938c69..b4e1ec75 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -23,55 +22,61 @@ import cn.odboy.system.dal.model.SystemOssStorageVo; import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.service.SystemOssStorageService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; - @Slf4j @RestController -@Tag(name = "工具:OSS存储管理") +@Api(tags = "工具:OSS存储管理") @RequestMapping("/api/ossStorage") public class SystemOssStorageController { - @Autowired - private SystemOssStorageService systemOssStorageService; - @Operation(summary = "查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryOssStorage(@Validated @RequestBody KitPageArgs args) { - SystemQueryStorageArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemOssStorageService.queryOssStorage(criteria, page)); - } + @Autowired + private SystemOssStorageService systemOssStorageService; - @Operation(summary = "导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { - systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(criteria), response); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryOssStorage( + @Validated @RequestBody KitPageArgs args) { + SystemQueryStorageArgs criteria = args.getArgs(); + Page page = new Page<>(criteria.getPage(), criteria.getSize()); + return ResponseEntity.ok(systemOssStorageService.queryOssStorage(criteria, page)); + } - @Operation(summary = "上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { - String fileUrl = systemOssStorageService.uploadFile(file); - return ResponseEntity.ok(fileUrl); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { + systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(criteria), response); + } - @Operation(summary = "多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { - systemOssStorageService.removeFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + String fileUrl = systemOssStorageService.uploadFile(file); + return ResponseEntity.ok(fileUrl); + } + + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { + systemOssStorageService.removeFileByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java index b402d428..047d41c5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.odboy.base.KitPageArgs; @@ -26,115 +25,123 @@ import cn.odboy.system.dal.model.SystemQueryQuartzJobArgs; import cn.odboy.system.dal.model.SystemUpdateQuartzJobArgs; import cn.odboy.system.service.SystemQuartzJobService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; +import java.util.Set; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/api/quartzJob") -@Tag(name = "系统:定时任务管理") +@Api(tags = "系统:定时任务管理") public class SystemQuartzJobController { - @Autowired - private SystemQuartzJobService systemQuartzJobService; - @Operation(summary = "查询定时任务") - @PostMapping - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobByCrud(@Validated @RequestBody KitPageArgs args) { - SystemQueryQuartzJobArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemQuartzJobService.queryQuartzJobByArgs(criteria, page)); - } + @Autowired + private SystemQuartzJobService systemQuartzJobService; - @Operation(summary = "导出任务数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { - systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(criteria), response); - } + @ApiOperation("查询定时任务") + @PostMapping + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobByCrud( + @Validated @RequestBody KitPageArgs args) { + SystemQueryQuartzJobArgs criteria = args.getArgs(); + Page page = new Page<>(criteria.getPage(), criteria.getSize()); + return ResponseEntity.ok(systemQuartzJobService.queryQuartzJobByArgs(criteria, page)); + } - @Operation(summary = "导出日志数据") - @GetMapping(value = "/logs/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { - systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(criteria), response); - } + @ApiOperation("导出任务数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { + systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(criteria), response); + } - @Operation(summary = "查询任务执行日志") - @PostMapping(value = "/logs") - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemQuartzJobService.queryQuartzLogByArgs(args, page)); - } + @ApiOperation("导出日志数据") + @GetMapping(value = "/logs/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { + systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(criteria), response); + } - @Operation(summary = "新增定时任务") - @PostMapping(value = "/createQuartzJob") - @PreAuthorize("@el.check('quartzJob:add')") - public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.createJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询任务执行日志") + @PostMapping(value = "/logs") + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemQuartzJobService.queryQuartzLogByArgs(args, page)); + } - @Operation(summary = "修改定时任务") - @PutMapping - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity updateQuartzJob(@Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.modifyQuartzJobResumeCron(args); - return ResponseEntity.ok(null); + @ApiOperation("新增定时任务") + @PostMapping(value = "/createQuartzJob") + @PreAuthorize("@el.check('quartzJob:add')") + public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + systemQuartzJobService.createJob(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "更改定时任务状态") - @PostMapping(value = "/switchQuartzJobStatus/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { - systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("修改定时任务") + @PutMapping + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity updateQuartzJob( + @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + systemQuartzJobService.modifyQuartzJobResumeCron(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "执行定时任务") - @PostMapping(value = "/startQuartzJob/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity startQuartzJob(@PathVariable Long id) { - systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("更改定时任务状态") + @PostMapping(value = "/switchQuartzJobStatus/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { + systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除定时任务") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('quartzJob:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - systemQuartzJobService.removeJobByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("执行定时任务") + @PostMapping(value = "/startQuartzJob/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity startQuartzJob(@PathVariable Long id) { + systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - /** - * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - * - * @param beanName Bean名称 - */ - private void checkBean(String beanName) { - // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 - // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 - if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { - throw new BadRequestException("非法的 Bean,请重新输入!"); - } + @ApiOperation("删除定时任务") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('quartzJob:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + systemQuartzJobService.removeJobByIds(ids); + return ResponseEntity.ok(null); + } + + /** + * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + * + * @param beanName Bean名称 + */ + private void checkBean(String beanName) { + // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 + // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 + if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { + throw new BadRequestException("非法的 Bean,请重新输入!"); } + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java index c23b7b73..2088971f 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.hutool.core.lang.Dict; @@ -23,121 +22,129 @@ import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; +import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemRoleService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController -@Tag(name = "系统:角色管理") +@Api(tags = "系统:角色管理") @RequestMapping("/api/role") public class SystemRoleController { - @Autowired - private SystemRoleService systemRoleService; - @Operation(summary = "获取单个role") - @PostMapping(value = "/queryRoleById") - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { - return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); - } + @Autowired + private SystemRoleService systemRoleService; - @Operation(summary = "导出角色数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('role:list')") - public void exportRole(HttpServletResponse response, SystemQueryRoleArgs criteria) throws IOException { - systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(criteria), response); - } + @ApiOperation("获取单个role") + @PostMapping(value = "/queryRoleById") + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { + return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); + } - @Operation(summary = "返回全部的角色") - @PostMapping(value = "/queryRoleList") - @PreAuthorize("@el.check('roles:list','user:add','user:edit')") - public ResponseEntity> queryRoleList() { - return ResponseEntity.ok(systemRoleService.queryAllRole()); - } + @ApiOperation("导出角色数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('role:list')") + public void exportRole(HttpServletResponse response, SystemQueryRoleArgs criteria) throws IOException { + systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(criteria), response); + } - @Operation(summary = "查询角色") - @PostMapping - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity> queryRoleByArgs(@Validated @RequestBody KitPageArgs args) { - SystemQueryRoleArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemRoleService.queryRoleByArgs(criteria, page)); - } + @ApiOperation("返回全部的角色") + @PostMapping(value = "/queryRoleList") + @PreAuthorize("@el.check('roles:list','user:add','user:edit')") + public ResponseEntity> queryRoleList() { + return ResponseEntity.ok(systemRoleService.queryAllRole()); + } - @Operation(summary = "获取用户级别") - @PostMapping(value = "/queryRoleLevel") - public ResponseEntity queryRoleLevel() { - return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); - } + @ApiOperation("查询角色") + @PostMapping + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity> queryRoleByArgs( + @Validated @RequestBody KitPageArgs args) { + SystemQueryRoleArgs criteria = args.getArgs(); + Page page = new Page<>(criteria.getPage(), criteria.getSize()); + return ResponseEntity.ok(systemRoleService.queryRoleByArgs(criteria, page)); + } - @Operation(summary = "新增角色") - @PostMapping(value = "/saveRole") - @PreAuthorize("@el.check('roles:add')") - public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); - systemRoleService.saveRole(args); - return ResponseEntity.ok(null); - } + @ApiOperation("获取用户级别") + @PostMapping(value = "/queryRoleLevel") + public ResponseEntity queryRoleLevel() { + return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); + } - @Operation(summary = "修改角色") - @PostMapping(value = "/modifyRoleById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleTb args) { - checkRoleLevels(args.getLevel()); - systemRoleService.modifyRoleById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增角色") + @PostMapping(value = "/saveRole") + @PreAuthorize("@el.check('roles:add')") + public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); + systemRoleService.saveRole(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改角色菜单") - @PostMapping(value = "/modifyBindMenuById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleTb args) { - SystemRoleTb role = systemRoleService.getRoleById(args.getId()); - checkRoleLevels(role.getLevel()); - systemRoleService.modifyBindMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色") + @PostMapping(value = "/modifyRoleById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { + checkRoleLevels(args.getLevel()); + systemRoleService.modifyRoleById(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除角色") - @PostMapping(value = "/removeRoleByIds") - @PreAuthorize("@el.check('roles:del')") - public ResponseEntity removeRoleByIds(@RequestBody Set ids) { - for (Long id : ids) { - SystemRoleTb role = systemRoleService.getRoleById(id); - checkRoleLevels(role.getLevel()); - } - // 验证是否被用户关联 - systemRoleService.verifyBindRelationByIds(ids); - systemRoleService.removeRoleByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色菜单") + @PostMapping(value = "/modifyBindMenuById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleVo args) { + SystemRoleTb role = systemRoleService.getRoleById(args.getId()); + checkRoleLevels(role.getLevel()); + systemRoleService.modifyBindMenuById(args); + return ResponseEntity.ok(null); + } - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList(); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } - } - return min; + @ApiOperation("删除角色") + @PostMapping(value = "/removeRoleByIds") + @PreAuthorize("@el.check('roles:del')") + public ResponseEntity removeRoleByIds(@RequestBody Set ids) { + for (Long id : ids) { + SystemRoleTb role = systemRoleService.getRoleById(id); + checkRoleLevels(role.getLevel()); } + // 验证是否被用户关联 + systemRoleService.verifyBindRelationByIds(ids); + systemRoleService.removeRoleByIds(ids); + return ResponseEntity.ok(null); + } + + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } + } + return min; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java index 87efae18..29a1aee9 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.controller; import cn.hutool.core.collection.CollectionUtil; @@ -28,6 +27,7 @@ import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; +import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemDataService; import cn.odboy.system.service.SystemDeptService; @@ -37,14 +37,14 @@ import cn.odboy.system.service.SystemUserService; import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitRsaEncryptUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -61,176 +61,184 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -@Tag(name = "系统:用户管理") +@Api(tags = "系统:用户管理") @RestController @RequestMapping("/api/user") public class SystemUserController { - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private SystemUserService systemUserService; - @Autowired private SystemDataService systemDataService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemEmailService systemEmailService; - @Autowired private AppProperties properties; - @Operation(summary = "导出用户数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('user:list')") - public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs criteria) throws IOException { - systemUserService.exportUserExcel(systemUserService.queryUserByArgs(criteria), response); - } + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemEmailService systemEmailService; + @Autowired + private AppProperties properties; - @Operation(summary = "查询用户") - @PostMapping - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserByArgs( - @Validated @RequestBody KitPageArgs args) { - Page page = new Page<>(args.getPage(), args.getSize()); - SystemQueryUserArgs criteria = args.getArgs(); - if (!ObjectUtils.isEmpty(criteria.getDeptId())) { - criteria.getDeptIds().add(criteria.getDeptId()); - // 先查找是否存在子节点 - List data = systemDeptService.queryDeptByPid(criteria.getDeptId()); - // 然后把子节点的ID都加入到集合中 - criteria.getDeptIds().addAll(systemDeptService.queryChildDeptIdListByDeptIds(data)); - } - // 数据权限 - List dataScopes = systemDataService.findDeptIdListByArgs( - systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername())); - // criteria.getDeptIds() 不为空并且数据权限不为空则取交集 - if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { - // 取交集 - criteria.getDeptIds().retainAll(dataScopes); - if (!CollectionUtil.isEmpty(criteria.getDeptIds())) { - return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); - } - } else { - // 否则取并集 - criteria.getDeptIds().addAll(dataScopes); - return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); - } - return ResponseEntity.ok(KitPageUtil.emptyData()); - } + @ApiOperation("导出用户数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('user:list')") + public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs criteria) throws IOException { + systemUserService.exportUserExcel(systemUserService.queryUserByArgs(criteria), response); + } - @Operation(summary = "新增用户") - @PostMapping(value = "/saveUser") - @PreAuthorize("@el.check('user:add')") - public ResponseEntity saveUser(@Validated @RequestBody SystemUserTb args) { - checkLevel(args); - // 默认密码 123456 - args.setPassword(passwordEncoder.encode("123456")); - systemUserService.saveUser(args); - return ResponseEntity.ok(null); + @ApiOperation("查询用户") + @PostMapping + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserByArgs( + @Validated @RequestBody KitPageArgs args) { + Page page = new Page<>(args.getPage(), args.getSize()); + SystemQueryUserArgs criteria = args.getArgs(); + if (!ObjectUtils.isEmpty(criteria.getDeptId())) { + criteria.getDeptIds().add(criteria.getDeptId()); + // 先查找是否存在子节点 + List data = systemDeptService.queryDeptByPid(criteria.getDeptId()); + // 然后把子节点的ID都加入到集合中 + criteria.getDeptIds().addAll(systemDeptService.queryChildDeptIdListByDeptIds(data)); } + // 数据权限 + List dataScopes = systemDataService.findDeptIdListByArgs( + systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername())); + // criteria.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { + // 取交集 + criteria.getDeptIds().retainAll(dataScopes); + if (!CollectionUtil.isEmpty(criteria.getDeptIds())) { + return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); + } + } else { + // 否则取并集 + criteria.getDeptIds().addAll(dataScopes); + return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); + } + return ResponseEntity.ok(KitPageUtil.emptyData()); + } - @Operation(summary = "修改用户") - @PostMapping(value = "/modifyUserById") - @PreAuthorize("@el.check('user:edit')") - public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - checkLevel(args); - systemUserService.modifyUserById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增用户") + @PostMapping(value = "/saveUser") + @PreAuthorize("@el.check('user:add')") + public ResponseEntity saveUser(@Validated @RequestBody SystemUserVo args) { + checkLevel(args); + // 默认密码 123456 + args.setPassword(passwordEncoder.encode("123456")); + systemUserService.saveUser(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改用户:个人中心") - @PostMapping(value = "modifyUserCenterInfoById") - public ResponseEntity modifyUserCenterInfoById( - @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); - } - systemUserService.modifyUserCenterInfoById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改用户") + @PostMapping(value = "/modifyUserById") + @PreAuthorize("@el.check('user:edit')") + public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { + checkLevel(args); + systemUserService.modifyUserById(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "删除用户") - @PostMapping(value = "/removeUserByIds") - @PreAuthorize("@el.check('user:del')") - public ResponseEntity removeUserByIds(@RequestBody Set ids) { - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).toList()); - Integer optLevel = - Collections.min(systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel).toList()); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); - } - } - systemUserService.removeUserByIds(ids); - return ResponseEntity.ok(null); + @ApiOperation("修改用户:个人中心") + @PostMapping(value = "modifyUserCenterInfoById") + public ResponseEntity modifyUserCenterInfoById( + @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { + if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { + throw new BadRequestException("不能修改他人资料"); } + systemUserService.modifyUserCenterInfoById(args); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改密码") - @PostMapping(value = "/modifyUserPasswordByUsername") - public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) - throws Exception { - String oldPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); - String newPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(oldPass, user.getPassword())) { - throw new BadRequestException("修改失败,旧密码错误"); - } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - systemUserService.modifyUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); - return ResponseEntity.ok(null); + @ApiOperation("删除用户") + @PostMapping(value = "/removeUserByIds") + @PreAuthorize("@el.check('user:del')") + public ResponseEntity removeUserByIds(@RequestBody Set ids) { + for (Long id : ids) { + Integer currentLevel = Collections.min( + systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) + .collect(Collectors.toList())); + if (currentLevel > optLevel) { + throw new BadRequestException( + "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); + } } + systemUserService.removeUserByIds(ids); + return ResponseEntity.ok(null); + } - @Operation(summary = "重置密码") - @PostMapping(value = "/resetUserPasswordByIds") - public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { - String defaultPwd = passwordEncoder.encode("123456"); - systemUserService.resetUserPasswordByIds(ids, defaultPwd); - return ResponseEntity.ok(null); + @ApiOperation("修改密码") + @PostMapping(value = "/modifyUserPasswordByUsername") + public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) + throws Exception { + String oldPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); + String newPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); + SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); + if (!passwordEncoder.matches(oldPass, user.getPassword())) { + throw new BadRequestException("修改失败,旧密码错误"); } + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + systemUserService.modifyUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改头像") - @PostMapping(value = "/modifyUserAvatar") - public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { - return ResponseEntity.ok(systemUserService.modifyUserAvatar(avatar)); - } + @ApiOperation("重置密码") + @PostMapping(value = "/resetUserPasswordByIds") + public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { + String defaultPwd = passwordEncoder.encode("123456"); + systemUserService.resetUserPasswordByIds(ids, defaultPwd); + return ResponseEntity.ok(null); + } - @Operation(summary = "修改邮箱") - @PostMapping(value = "/modifyUserEmailByUsername/{code}") - public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) - throws Exception { - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); - SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(password, user.getPassword())) { - throw new BadRequestException("密码错误"); - } - systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserService.modifyUserEmailByUsername(user.getUsername(), args.getEmail()); - return ResponseEntity.ok(null); - } + @ApiOperation("修改头像") + @PostMapping(value = "/modifyUserAvatar") + public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { + return ResponseEntity.ok(systemUserService.modifyUserAvatar(avatar)); + } - /** - * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 - * - * @param args / - */ - private void checkLevel(SystemUserTb args) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).toList()); - Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); - } + @ApiOperation("修改邮箱") + @PostMapping(value = "/modifyUserEmailByUsername/{code}") + public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) + throws Exception { + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); + SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); + if (!passwordEncoder.matches(password, user.getPassword())) { + throw new BadRequestException("密码错误"); } + systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); + systemUserService.modifyUserEmailByUsername(user.getUsername(), args.getEmail()); + return ResponseEntity.ok(null); + } - @ApiOperation("查询用户基础数据") - @PostMapping(value = "/queryUserMetadataOptions") - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserMetadataOptions( - @Validated @RequestBody KitPageArgs args) { - List collect = systemUserService.queryUserMetadataOptions(args); - return ResponseEntity.ok(collect); + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + private void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); } + } + + @ApiOperation("查询用户基础数据") + @PostMapping(value = "/queryUserMetadataOptions") + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserMetadataOptions(@Validated @RequestBody KitPageArgs args) { + List collect = systemUserService.queryUserMetadataOptions(args); + return ResponseEntity.ok(collect); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java index 5d33d116..0bd75d4f 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 @@ -22,11 +22,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 jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import java.util.List; import java.util.Objects; import java.util.Set; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -34,46 +34,60 @@ import lombok.Setter; @Setter @TableName("system_dept") public class SystemDeptTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "dept_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "角色") private Set - roles; - @TableField(exist = false) @ApiModelProperty(value = "子部门") private List children; - @ApiModelProperty(value = "排序") private Integer deptSort; - @NotBlank @ApiModelProperty(value = "部门名称") private String name; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "上级部门") private Long pid; - @ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemDeptTb dept = (SystemDeptTb)o; - return Objects.equals(id, dept.id) && Objects.equals(name, dept.name); - } + @NotNull(groups = Update.class) + @TableId(value = "dept_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(exist = false) + @JSONField(serialize = false) + @ApiModelProperty(value = "角色") + private Set roles; + @TableField(exist = false) + @ApiModelProperty(value = "子部门") + private List children; + @ApiModelProperty(value = "排序") + private Integer deptSort; + @NotBlank + @ApiModelProperty(value = "部门名称") + private String name; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "上级部门") + private Long pid; + @ApiModelProperty(value = "子节点数目", hidden = true) + private Integer subCount = 0; - @Override - public int hashCode() { - return Objects.hash(id, name); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemDeptTb dept = (SystemDeptTb) o; + return Objects.equals(id, dept.id) && Objects.equals(name, dept.name); + } - @ApiModelProperty(value = "是否有子节点") - public Boolean getHasChildren() { - return subCount > 0; - } + @Override + public int hashCode() { + return Objects.hash(id, name); + } - @ApiModelProperty(value = "是否为叶子") - public Boolean getLeaf() { - return subCount <= 0; - } + @ApiModelProperty(value = "是否有子节点") + public Boolean getHasChildren() { + return subCount > 0; + } - @ApiModelProperty(value = "标签名称") - public String getLabel() { - return name; - } + @ApiModelProperty(value = "是否为叶子") + public Boolean getLeaf() { + return subCount <= 0; + } + + @ApiModelProperty(value = "标签名称") + public String getLabel() { + return name; + } } \ No newline at end of file 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 795774c3..082dae03 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 @@ -29,11 +29,18 @@ import lombok.Setter; @Setter @TableName("system_dict_detail") public class SystemDictDetailTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true) - @TableId(value = "id", type = IdType.AUTO) private Long id; - @TableField(value = "dict_id") @ApiModelProperty(hidden = true) private Long dictId; - @TableField(exist = false) @ApiModelProperty(value = "字典") private SystemDictTb dict; - @ApiModelProperty(value = "字典标签") private String label; - @ApiModelProperty(value = "字典值") private String value; - @ApiModelProperty(value = "排序") private Integer dictSort = 999; + + @NotNull(groups = Update.class) + @ApiModelProperty(value = "ID", hidden = true) + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @TableField(value = "dict_id") + @ApiModelProperty(hidden = true) + private Long dictId; + @ApiModelProperty(value = "字典标签") + private String label; + @ApiModelProperty(value = "字典值") + private String value; + @ApiModelProperty(value = "排序") + private Integer dictSort = 999; } \ No newline at end of file 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 ac8b02df..d25eee83 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 @@ -31,8 +31,15 @@ import lombok.Setter; @Setter @TableName("system_dict") public class SystemDictTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true) - @TableId(value = "id", type = IdType.AUTO) private Long id; - @NotBlank @ApiModelProperty(value = "名称") private String name; - @ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; + + @NotNull(groups = Update.class) + @ApiModelProperty(value = "ID", hidden = true) + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @NotBlank + @ApiModelProperty(value = "名称") + private String name; + @ApiModelProperty(value = "描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String description; } \ No newline at end of file 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 6ee37689..a687fd4f 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 @@ -30,10 +30,22 @@ import lombok.EqualsAndHashCode; @TableName("system_email_config") @EqualsAndHashCode(callSuper = false) public class SystemEmailConfigTb extends KitObject { - @TableId("config_id") private Long id; - @NotBlank @ApiModelProperty(value = "邮件服务器SMTP地址") private String host; - @NotBlank @ApiModelProperty(value = "邮件服务器 SMTP 端口") private String port; - @NotBlank @ApiModelProperty(value = "发件者用户名") private String user; - @NotBlank @ApiModelProperty(value = "密码") private String password; - @NotBlank @ApiModelProperty(value = "收件人") private String fromUser; + + @TableId("config_id") + private Long id; + @NotBlank + @ApiModelProperty(value = "邮件服务器SMTP地址") + private String host; + @NotBlank + @ApiModelProperty(value = "邮件服务器 SMTP 端口") + private String port; + @NotBlank + @ApiModelProperty(value = "发件者用户名") + private String user; + @NotBlank + @ApiModelProperty(value = "密码") + private String password; + @NotBlank + @ApiModelProperty(value = "收件人") + private String fromUser; } 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 2b36e430..70f57a9b 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 @@ -30,26 +30,35 @@ import lombok.Setter; @Setter @TableName("system_job") public class SystemJobTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @NotBlank @ApiModelProperty(value = "岗位名称") private String name; - @NotNull @ApiModelProperty(value = "岗位排序") private Long jobSort; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemJobTb job = (SystemJobTb)o; - return Objects.equals(id, job.id); - } + @NotNull(groups = Update.class) + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @NotBlank + @ApiModelProperty(value = "岗位名称") + private String name; + @NotNull + @ApiModelProperty(value = "岗位排序") + private Long jobSort; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemJobTb job = (SystemJobTb) o; + return Objects.equals(id, job.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java index 63263860..ee0d7011 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java @@ -29,16 +29,26 @@ import lombok.Setter; @Setter @TableName("system_local_storage") public class SystemLocalStorageTb extends KitBaseUserTimeTb { - @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "真实文件名") private String realName; - @ApiModelProperty(value = "文件名") private String name; - @ApiModelProperty(value = "后缀") private String suffix; - @ApiModelProperty(value = "路径") private String path; - @ApiModelProperty(value = "类型") private String type; - @ApiModelProperty(value = "大小") private String size; - @ApiModelProperty(value = "日期分组") private String dateGroup; - public void copy(SystemLocalStorageTb source) { - BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); - } + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "真实文件名") + private String realName; + @ApiModelProperty(value = "文件名") + private String name; + @ApiModelProperty(value = "后缀") + private String suffix; + @ApiModelProperty(value = "路径") + private String path; + @ApiModelProperty(value = "类型") + private String type; + @ApiModelProperty(value = "大小") + private String size; + @ApiModelProperty(value = "日期分组") + private String dateGroup; + + public void copy(SystemLocalStorageTb source) { + BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); + } } \ No newline at end of file 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 86db5f1c..1a4751fa 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 @@ -33,54 +33,74 @@ import lombok.Setter; @Setter @TableName("system_menu") public class SystemMenuTb extends KitBaseUserTimeTb { - @NotNull(groups = {Update.class}) @TableId(value = "menu_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "菜单角色") - private Set roles; - @TableField(exist = false) private List children; - @ApiModelProperty(value = "菜单标题") private String title; - @TableField(value = "name") @ApiModelProperty(value = "菜单组件名称") private String componentName; - @ApiModelProperty(value = "排序") private Integer menuSort = 999; - @ApiModelProperty(value = "组件路径") private String component; - @ApiModelProperty(value = "路由地址") private String path; - @ApiModelProperty(value = "菜单类型,目录、菜单、按钮") private Integer type; - @ApiModelProperty(value = "权限标识") private String permission; - @ApiModelProperty(value = "菜单图标") private String icon; - @ApiModelProperty(value = "缓存") private Boolean cache; - @ApiModelProperty(value = "是否隐藏") private Boolean hidden; - @ApiModelProperty(value = "上级菜单") private Long pid; - @ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0; - @ApiModelProperty(value = "外链菜单") private Boolean iFrame; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemMenuTb menu = (SystemMenuTb)o; - return Objects.equals(id, menu.id); - } + @NotNull(groups = {Update.class}) + @TableId(value = "menu_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(exist = false) + @JSONField(serialize = false) + @ApiModelProperty(value = "菜单角色") + private Set roles; + @TableField(exist = false) + private List children; + @ApiModelProperty(value = "菜单标题") + private String title; + @TableField(value = "name") + @ApiModelProperty(value = "菜单组件名称") + private String componentName; + @ApiModelProperty(value = "排序") + private Integer menuSort = 999; + @ApiModelProperty(value = "组件路径") + private String component; + @ApiModelProperty(value = "路由地址") + private String path; + @ApiModelProperty(value = "菜单类型,目录、菜单、按钮") + private Integer type; + @ApiModelProperty(value = "权限标识") + private String permission; + @ApiModelProperty(value = "菜单图标") + private String icon; + @ApiModelProperty(value = "缓存") + private Boolean cache; + @ApiModelProperty(value = "是否隐藏") + private Boolean hidden; + @ApiModelProperty(value = "上级菜单") + private Long pid; + @ApiModelProperty(value = "子节点数目", hidden = true) + private Integer subCount = 0; + @ApiModelProperty(value = "外链菜单") + private Boolean iFrame; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemMenuTb menu = (SystemMenuTb) o; + return Objects.equals(id, menu.id); + } - @ApiModelProperty(value = "是否有子节点") - public Boolean getHasChildren() { - return subCount > 0; - } + @Override + public int hashCode() { + return Objects.hash(id); + } - @ApiModelProperty(value = "是否为叶子") - public Boolean getLeaf() { - return subCount <= 0; - } + @ApiModelProperty(value = "是否有子节点") + public Boolean getHasChildren() { + return subCount > 0; + } - @ApiModelProperty(value = "标签名称") - public String getLabel() { - return title; - } + @ApiModelProperty(value = "是否为叶子") + public Boolean getLeaf() { + return subCount <= 0; + } + + @ApiModelProperty(value = "标签名称") + public String getLabel() { + return title; + } } 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 28198543..e32d899d 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 @@ -42,48 +42,61 @@ import lombok.ToString; @TableName("system_operation_log") @ApiModel(value = "SystemOperationLog对象", description = "审计日志") public class SystemOperationLogTb extends KitObject { - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Long id; - /** - * 业务名称 - */ - @TableField("biz_name") private String bizName; - /** - * 业务方法 - */ - @TableField("method") private String method; - /** - * 业务参数 - */ - @TableField("params") private String params; - /** - * 访问来源IP - */ - @TableField("request_ip") private String requestIp; - /** - * 执行时间 - */ - @TableField("execute_time") private Long executeTime; - /** - * 用户名 - */ - @TableField("username") private String username; - /** - * 访问来源地址 - */ - @TableField("address") private String address; - /** - * 浏览器信息 - */ - @TableField("browser_info") private String browserInfo; - /** - * 异常详情 - */ - @TableField("exception_detail") private String exceptionDetail; - /** - * 创建时间 - */ - @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; + + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 业务名称 + */ + @TableField("biz_name") + private String bizName; + /** + * 业务方法 + */ + @TableField("method") + private String method; + /** + * 业务参数 + */ + @TableField("params") + private String params; + /** + * 访问来源IP + */ + @TableField("request_ip") + private String requestIp; + /** + * 执行时间 + */ + @TableField("execute_time") + private Long executeTime; + /** + * 用户名 + */ + @TableField("username") + private String username; + /** + * 访问来源地址 + */ + @TableField("address") + private String address; + /** + * 浏览器信息 + */ + @TableField("browser_info") + private String browserInfo; + /** + * 异常详情 + */ + @TableField("exception_detail") + private String exceptionDetail; + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java index 442e1a0c..999af688 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java @@ -38,17 +38,44 @@ import lombok.Setter; @TableName("system_oss_storage") @ApiModel(value = "SystemOssStorage对象", description = "OSS存储") public class SystemOssStorageTb extends KitBaseUserTimeTb { - @ApiModelProperty("ID") @TableId(value = "id", type = IdType.AUTO) private Long id; - @TableField("service_type") @ApiModelProperty("类型,比如minio") private String serviceType; - @TableField("endpoint") @ApiModelProperty("服务地址") private String endpoint; - @TableField("bucket_name") @ApiModelProperty("存储桶名称") private String bucketName; - @TableField("file_name") @ApiModelProperty("完整文件名称") private String fileName; - @TableField("file_size") @ApiModelProperty("文件大小, 单位:字节") private Long fileSize; - @TableField("file_mime") @ApiModelProperty("文件类型") private String fileMime; - @ApiModelProperty("短文件名") @TableField("file_prefix") private String filePrefix; - @ApiModelProperty("文件后缀") @TableField("file_suffix") private String fileSuffix; - @TableField("file_md5") @ApiModelProperty("文件md5") private String fileMd5; - @TableField("file_url") @ApiModelProperty("文件链接") private String fileUrl; - @TableField("file_code") @ApiModelProperty("文件编码") private String fileCode; - @TableField("object_name") @ApiModelProperty("对象路径") private String objectName; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @TableField("service_type") + @ApiModelProperty("类型,比如minio") + private String serviceType; + @TableField("endpoint") + @ApiModelProperty("服务地址") + private String endpoint; + @TableField("bucket_name") + @ApiModelProperty("存储桶名称") + private String bucketName; + @TableField("file_name") + @ApiModelProperty("完整文件名称") + private String fileName; + @TableField("file_size") + @ApiModelProperty("文件大小, 单位:字节") + private Long fileSize; + @TableField("file_mime") + @ApiModelProperty("文件类型") + private String fileMime; + @ApiModelProperty("短文件名") + @TableField("file_prefix") + private String filePrefix; + @ApiModelProperty("文件后缀") + @TableField("file_suffix") + private String fileSuffix; + @TableField("file_md5") + @ApiModelProperty("文件md5") + private String fileMd5; + @TableField("file_url") + @ApiModelProperty("文件链接") + private String fileUrl; + @TableField("file_code") + @ApiModelProperty("文件编码") + private String fileCode; + @TableField("object_name") + @ApiModelProperty("对象路径") + private String objectName; } 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 71b1210b..6e46522a 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 @@ -31,19 +31,40 @@ import lombok.Setter; @Setter @TableName("system_quartz_job") public class SystemQuartzJobTb extends KitBaseUserTimeTb { - public static final String JOB_KEY = "JOB_KEY"; - @TableId(value = "id", type = IdType.AUTO) @NotNull(groups = {Update.class}) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用于子任务唯一标识", hidden = true) private String uuid; - @ApiModelProperty(value = "定时器名称") private String jobName; - @NotBlank @ApiModelProperty(value = "Bean名称") private String beanName; - @NotBlank @ApiModelProperty(value = "方法名称") private String methodName; - @ApiModelProperty(value = "参数") private String params; - @NotBlank @ApiModelProperty(value = "cron表达式") private String cronExpression; - @ApiModelProperty(value = "状态:暂停或启动") private Boolean isPause = false; - @ApiModelProperty(value = "负责人") private String personInCharge; - @ApiModelProperty(value = "报警邮箱") private String email; - @ApiModelProperty(value = "子任务") private String subTask; - @ApiModelProperty(value = "失败后暂停") private Boolean pauseAfterFailure; - @NotBlank @ApiModelProperty(value = "备注") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String - description; + + public static final String JOB_KEY = "JOB_KEY"; + @TableId(value = "id", type = IdType.AUTO) + @NotNull(groups = {Update.class}) + private Long id; + @TableField(exist = false) + @ApiModelProperty(value = "用于子任务唯一标识", hidden = true) + private String uuid; + @ApiModelProperty(value = "定时器名称") + private String jobName; + @NotBlank + @ApiModelProperty(value = "Bean名称") + private String beanName; + @NotBlank + @ApiModelProperty(value = "方法名称") + private String methodName; + @ApiModelProperty(value = "参数") + private String params; + @NotBlank + @ApiModelProperty(value = "cron表达式") + private String cronExpression; + @ApiModelProperty(value = "状态:暂停或启动") + private Boolean isPause = false; + @ApiModelProperty(value = "负责人") + private String personInCharge; + @ApiModelProperty(value = "报警邮箱") + private String email; + @ApiModelProperty(value = "子任务") + private String subTask; + @ApiModelProperty(value = "失败后暂停") + private Boolean pauseAfterFailure; + @NotBlank + @ApiModelProperty(value = "备注") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String + description; } \ No newline at end of file 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 dccffbdf..514c28e4 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 @@ -30,14 +30,27 @@ import lombok.EqualsAndHashCode; @TableName("system_quartz_log") @EqualsAndHashCode(callSuper = false) public class SystemQuartzLogTb extends KitObject { - @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "任务名称", hidden = true) private String jobName; - @ApiModelProperty(value = "bean名称", hidden = true) private String beanName; - @ApiModelProperty(value = "方法名称", hidden = true) private String methodName; - @ApiModelProperty(value = "参数", hidden = true) private String params; - @ApiModelProperty(value = "cron表达式", hidden = true) private String cronExpression; - @ApiModelProperty(value = "状态", hidden = true) private Boolean isSuccess; - @ApiModelProperty(value = "异常详情", hidden = true) private String exceptionDetail; - @ApiModelProperty(value = "执行耗时", hidden = true) private Long time; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) private Date createTime; + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "任务名称", hidden = true) + private String jobName; + @ApiModelProperty(value = "bean名称", hidden = true) + private String beanName; + @ApiModelProperty(value = "方法名称", hidden = true) + private String methodName; + @ApiModelProperty(value = "参数", hidden = true) + private String params; + @ApiModelProperty(value = "cron表达式", hidden = true) + private String cronExpression; + @ApiModelProperty(value = "状态", hidden = true) + private Boolean isSuccess; + @ApiModelProperty(value = "异常详情", hidden = true) + private String exceptionDetail; + @ApiModelProperty(value = "执行耗时", hidden = true) + private Long time; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间", hidden = true) + private Date createTime; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java index e1107881..92b7be14 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java @@ -25,6 +25,9 @@ import lombok.Setter; @Setter @TableName("system_roles_depts") public class SystemRoleDeptTb extends KitObject { - @TableField(value = "role_id") private Long roleId; - @TableField(value = "dept_id") private Long deptId; + + @TableField(value = "role_id") + private Long roleId; + @TableField(value = "dept_id") + private Long deptId; } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java index ec0d1838..ebfeb4b5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java @@ -12,6 +12,9 @@ import lombok.Setter; @Setter @TableName("system_roles_menus") public class SystemRoleMenuTb { - @TableField(value = "role_id") private Long roleId; - @TableField(value = "menu_id") private Long menuId; + + @TableField(value = "role_id") + private Long roleId; + @TableField(value = "menu_id") + private Long menuId; } 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 27f73384..bb213601 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 @@ -24,7 +24,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import java.util.Objects; -import java.util.Set; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -37,31 +36,37 @@ import lombok.Setter; @Setter @TableName("system_role") public class SystemRoleTb extends KitBaseUserTimeTb { - @NotNull(groups = {Update.class}) @TableId(value = "role_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用户", hidden = true) private Set users; - @TableField(exist = false) @ApiModelProperty(value = "菜单", hidden = true) private Set menus; - @TableField(exist = false) @ApiModelProperty(value = "部门", hidden = true) private Set depts; - @NotBlank @ApiModelProperty(value = "名称", hidden = true) private String name; - @ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义") private String dataScope = - SystemDataScopeEnum.THIS_LEVEL.getValue(); - @ApiModelProperty(value = "级别,数值越小,级别越大") private Integer level = 3; - @ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemRoleTb role = (SystemRoleTb)o; - return Objects.equals(id, role.id); - } + @NotNull(groups = {Update.class}) + @TableId(value = "role_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @NotBlank + @ApiModelProperty(value = "名称", hidden = true) + private String name; + @ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义") + private String dataScope = + SystemDataScopeEnum.THIS_LEVEL.getValue(); + @ApiModelProperty(value = "级别,数值越小,级别越大") + private Integer level = 3; + @ApiModelProperty(value = "描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String description; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemRoleTb role = (SystemRoleTb) o; + return Objects.equals(id, role.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java index e898048d..7c2c964f 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java @@ -12,6 +12,9 @@ import lombok.Setter; @Setter @TableName("system_users_jobs") public class SystemUserJobTb { - @TableField(value = "user_id") private Long userId; - @TableField(value = "job_id") private Long jobId; + + @TableField(value = "user_id") + private Long userId; + @TableField(value = "job_id") + private Long jobId; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java index c3be28bd..6d7a137b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java @@ -25,6 +25,9 @@ import lombok.Setter; @Setter @TableName("system_users_roles") public class SystemUserRoleTb extends KitObject { - @TableField(value = "user_id") private Long userId; - @TableField(value = "role_id") private Long roleId; + + @TableField(value = "user_id") + private Long userId; + @TableField(value = "role_id") + private Long roleId; } \ No newline at end of file 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 f606b6ec..c96de1be 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 @@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import java.util.Date; import java.util.Objects; -import java.util.Set; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -34,38 +33,60 @@ import lombok.Setter; @Setter @TableName("system_user") public class SystemUserTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "user_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用户角色") private Set roles; - @TableField(exist = false) @ApiModelProperty(value = "用户岗位") private Set jobs; - @TableField(value = "dept_id") @ApiModelProperty(hidden = true) private Long deptId; - @ApiModelProperty(value = "用户部门") @TableField(exist = false) private SystemDeptTb dept; - @NotBlank @ApiModelProperty(value = "用户名称") private String username; - @NotBlank @ApiModelProperty(value = "用户昵称") private String nickName; - @Email @NotBlank @ApiModelProperty(value = "邮箱") private String email; - @NotBlank @ApiModelProperty(value = "电话号码") private String phone; - @ApiModelProperty(value = "用户性别") private String gender; - @ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; - @ApiModelProperty(value = "头像存储的路径", hidden = true) private String avatarPath; - @ApiModelProperty(value = "密码") private String password; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false; - @ApiModelProperty(value = "最后修改密码的时间", hidden = true) private Date pwdResetTime; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemUserTb user = (SystemUserTb)o; - return Objects.equals(id, user.id) && Objects.equals(username, user.username); - } + @NotNull(groups = Update.class) + @TableId(value = "user_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(value = "dept_id") + @ApiModelProperty(hidden = true) + private Long deptId; + @ApiModelProperty(value = "用户部门") + @TableField(exist = false) + private SystemDeptTb dept; + @NotBlank + @ApiModelProperty(value = "用户名称") + private String username; + @NotBlank + @ApiModelProperty(value = "用户昵称") + private String nickName; + @Email + @NotBlank + @ApiModelProperty(value = "邮箱") + private String email; + @NotBlank + @ApiModelProperty(value = "电话号码") + private String phone; + @ApiModelProperty(value = "用户性别") + private String gender; + @ApiModelProperty(value = "头像真实名称", hidden = true) + private String avatarName; + @ApiModelProperty(value = "头像存储的路径", hidden = true) + private String avatarPath; + @ApiModelProperty(value = "密码") + private String password; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "是否为admin账号", hidden = true) + private Boolean isAdmin = false; + @ApiModelProperty(value = "最后修改密码的时间", hidden = true) + private Date pwdResetTime; - @Override - public int hashCode() { - return Objects.hash(id, username); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemUserTb user = (SystemUserTb) o; + return Objects.equals(id, user.id) && Objects.equals(username, user.username); + } + + @Override + public int hashCode() { + return Objects.hash(id, username); + } } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java index e4635282..a5304b3c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java @@ -23,7 +23,11 @@ import lombok.Setter; @Getter @Setter public class SystemCheckEmailCaptchaArgs extends KitObject { - @NotBlank(message = "邮箱不能为空") private String email; - @NotBlank(message = "验证码不能为空") private String code; - @NotBlank(message = "验证码业务标识不能为空") private String bizCode; + + @NotBlank(message = "邮箱不能为空") + private String email; + @NotBlank(message = "验证码不能为空") + private String code; + @NotBlank(message = "验证码业务标识不能为空") + private String bizCode; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java index df15e4e1..c9f7b1ce 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java @@ -24,10 +24,13 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDeptArgs extends KitObject { - @NotBlank(message = "部门名称必填") private String name; - @NotNull(message = "部门排序必填") private Integer deptSort; - private Boolean enabled; - private String isTop; - private Long pid; - private Integer subCount = 0; + + @NotBlank(message = "部门名称必填") + private String name; + @NotNull(message = "部门排序必填") + private Integer deptSort; + private Boolean enabled; + private String isTop; + private Long pid; + private Integer subCount = 0; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java index 9fc22c77..5f0b51c1 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java @@ -23,6 +23,8 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDictArgs extends KitObject { - @NotBlank(message = "字典名称必填") private String name; - private String description; + + @NotBlank(message = "字典名称必填") + private String name; + private String description; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java index 801ec038..42489afa 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java @@ -25,8 +25,13 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDictDetailArgs extends KitObject { - @NotNull(message = "参数dict必填") private SystemDictTb dict; - @NotBlank(message = "字典标签必填") private String label; - @NotBlank(message = "字典值必填") private String value; - @NotNull(message = "字典排序必填") private Integer dictSort; + + @NotNull(message = "参数dict必填") + private SystemDictTb dict; + @NotBlank(message = "字典标签必填") + private String label; + @NotBlank(message = "字典值必填") + private String value; + @NotNull(message = "字典排序必填") + private Integer dictSort; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java index 80666134..91f1a908 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java @@ -24,7 +24,10 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateJobArgs extends KitObject { - @NotBlank(message = "职位名称必填") private String name; - @NotNull(message = "职位排序必填") private Integer jobSort; - private Boolean enabled; + + @NotBlank(message = "职位名称必填") + private String name; + @NotNull(message = "职位排序必填") + private Integer jobSort; + private Boolean enabled; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java index 470b6927..d32fa14d 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java @@ -26,13 +26,17 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateRoleArgs extends KitObject { - @NotBlank(message = "角色名称必填") private String name; - @NotNull(message = "角色级别必填") private Integer level; - @NotBlank(message = "数据范围必填") private String dataScope; - private String description; - /** - * 关联的部门 - */ - private Long id; - private Set depts; + + @NotBlank(message = "角色名称必填") + private String name; + @NotNull(message = "角色级别必填") + private Integer level; + @NotBlank(message = "数据范围必填") + private String dataScope; + private String description; + /** + * 关联的部门 + */ + private Long id; + private Set depts; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java new file mode 100644 index 00000000..4a64efa3 --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java @@ -0,0 +1,30 @@ +/* + * Copyright 2021-2025 Odboy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemDictDetailTb; +import cn.odboy.system.dal.dataobject.SystemDictTb; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemDictDetailVo extends SystemDictDetailTb { + + @ApiModelProperty(value = "字典") + private SystemDictTb dict; +} \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java index 9075b200..a0ae90a6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java @@ -25,7 +25,11 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) public class SystemMenuMetaVo extends KitObject { - @ApiModelProperty(value = "菜单标题") private String title; - @ApiModelProperty(value = "菜单图标") private String icon; - @ApiModelProperty(value = "缓存") private Boolean noCache; + + @ApiModelProperty(value = "菜单标题") + private String title; + @ApiModelProperty(value = "菜单图标") + private String icon; + @ApiModelProperty(value = "缓存") + private Boolean noCache; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java index 78b79499..75c33b9e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java @@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemMenuVo extends KitObject { - @ApiModelProperty(value = "菜单名称") private String name; - @ApiModelProperty(value = "路径") private String path; - @ApiModelProperty(value = "隐藏状态") private Boolean hidden; - @ApiModelProperty(value = "重定向") private String redirect; - @ApiModelProperty(value = "组件") private String component; - @ApiModelProperty(value = "总是显示") private Boolean alwaysShow; - @ApiModelProperty(value = "元数据") private SystemMenuMetaVo meta; - @ApiModelProperty(value = "子路由") private List children; + + @ApiModelProperty(value = "菜单名称") + private String name; + @ApiModelProperty(value = "路径") + private String path; + @ApiModelProperty(value = "隐藏状态") + private Boolean hidden; + @ApiModelProperty(value = "重定向") + private String redirect; + @ApiModelProperty(value = "组件") + private String component; + @ApiModelProperty(value = "总是显示") + private Boolean alwaysShow; + @ApiModelProperty(value = "元数据") + private SystemMenuMetaVo meta; + @ApiModelProperty(value = "子路由") + private List children; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java index fb74d5ee..c9b02b36 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java @@ -22,5 +22,6 @@ import lombok.Setter; @Getter @Setter public class SystemOssStorageVo extends SystemOssStorageTb { - private String fileSizeDesc; + + private String fileSizeDesc; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java index faae825e..b6914b56 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java @@ -23,7 +23,8 @@ import lombok.Setter; @Getter @Setter public class SystemProductLineTreeVo extends KitObject { - private String value; - private String label; - private List children; + + private String value; + private String label; + private List children; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java index f0660519..dcc3713b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java @@ -22,16 +22,17 @@ import lombok.Setter; @Getter @Setter public class SystemProductLineVo extends KitObject { - /** - * 部门ID(select的value) - */ - private Long value; - /** - * 产品线,如"研发部/华南分部/devops组" - */ - private String label; - /** - * ID路径,如"1-2-3" - */ - private String idPath; + + /** + * 部门ID(select的value) + */ + private Long value; + /** + * 产品线,如"研发部/华南分部/devops组" + */ + private String label; + /** + * ID路径,如"1-2-3" + */ + private String idPath; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java index b6d35ad0..ebf9b33a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java @@ -22,10 +22,17 @@ import lombok.Data; @Data public class SystemQueryDeptArgs { - @ApiModelProperty(value = "部门id集合") private List ids; - @ApiModelProperty(value = "部门名称") private String name; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "上级部门") private Long pid; - @ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; - @ApiModelProperty(value = "创建时间") private List createTime; + + @ApiModelProperty(value = "部门id集合") + private List ids; + @ApiModelProperty(value = "部门名称") + private String name; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "上级部门") + private Long pid; + @ApiModelProperty(value = "PID为空查询") + private Boolean pidIsNull; + @ApiModelProperty(value = "创建时间") + private List createTime; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java index f8f5397b..7dcedb88 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java @@ -20,7 +20,11 @@ import lombok.Data; @Data public class SystemQueryDictArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java index c375f70b..8514fe81 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java @@ -23,6 +23,9 @@ import lombok.Setter; @Getter @Setter public class SystemQueryDictDetailArgs extends KitObject { - @ApiModelProperty(value = "标签") private String label; - @ApiModelProperty(value = "字典名称") private String dictName; + + @ApiModelProperty(value = "标签") + private String label; + @ApiModelProperty(value = "字典名称") + private String dictName; } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java index 01bbde18..9a5c0f31 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java @@ -24,9 +24,15 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class SystemQueryJobArgs { - @ApiModelProperty(value = "岗位名称") private String name; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "岗位名称") + private String name; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java index 3e18eb29..3794be08 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java @@ -22,8 +22,13 @@ import lombok.Data; @Data public class SystemQueryMenuArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; - @ApiModelProperty(value = "PID") private Long pid; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "PID为空查询") + private Boolean pidIsNull; + @ApiModelProperty(value = "PID") + private Long pid; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java index b6f4ad5c..86a6d78b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java @@ -22,9 +22,15 @@ import lombok.Data; @Data public class SystemQueryQuartzJobArgs { - @ApiModelProperty(value = "定时任务名称") private String jobName; - @ApiModelProperty(value = "是否成功") private Boolean isSuccess; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "定时任务名称") + private String jobName; + @ApiModelProperty(value = "是否成功") + private Boolean isSuccess; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java index 85899f47..49841012 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java @@ -22,9 +22,15 @@ import lombok.Data; @Data public class SystemQueryRoleArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; - @ApiModelProperty(value = "偏移量", hidden = true) private long offset; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; + @ApiModelProperty(value = "偏移量", hidden = true) + private long offset; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java index 88a11fdb..4dad3f32 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java @@ -22,8 +22,13 @@ import lombok.Data; @Data public class SystemQueryStorageArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java index baf59d43..cce81cc7 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java @@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemQueryUserArgs extends KitObject { - @ApiModelProperty(value = "ID") private Long id; - @ApiModelProperty(value = "多个ID") private Set deptIds = new HashSet<>(); - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "部门ID") private Long deptId; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "ID") + private Long id; + @ApiModelProperty(value = "多个ID") + private Set deptIds = new HashSet<>(); + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "部门ID") + private Long deptId; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java index 8039fef4..ebb0d609 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java @@ -28,5 +28,7 @@ import org.springframework.security.core.GrantedAuthority; @NoArgsConstructor @AllArgsConstructor public class SystemRoleCodeVo implements GrantedAuthority { - @ApiModelProperty(value = "角色名") private String authority; + + @ApiModelProperty(value = "角色名") + private String authority; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java new file mode 100644 index 00000000..90e2d2ca --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java @@ -0,0 +1,22 @@ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemDeptTb; +import cn.odboy.system.dal.dataobject.SystemMenuTb; +import cn.odboy.system.dal.dataobject.SystemRoleTb; +import cn.odboy.system.dal.dataobject.SystemUserTb; +import io.swagger.annotations.ApiModelProperty; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemRoleVo extends SystemRoleTb { + + @ApiModelProperty(value = "用户", hidden = true) + private Set users; + @ApiModelProperty(value = "菜单", hidden = true) + private Set menus; + @ApiModelProperty(value = "部门", hidden = true) + private Set depts; +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java index 6f7463c0..57af4839 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java @@ -30,7 +30,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class SystemSendEmailArgs { - @NotEmpty @ApiModelProperty(value = "收件人") private List tos; - @NotBlank @ApiModelProperty(value = "主题") private String subject; - @NotBlank @ApiModelProperty(value = "内容") private String content; + + @NotEmpty + @ApiModelProperty(value = "收件人") + private List tos; + @NotBlank + @ApiModelProperty(value = "主题") + private String subject; + @NotBlank + @ApiModelProperty(value = "内容") + private String content; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java index 3c6c33e4..0fa39e00 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java @@ -28,17 +28,30 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemSimpleUserVo extends KitObject { - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "用户角色") private Set roles; - @ApiModelProperty(value = "用户岗位") private Set jobs; - private Long deptId; - @TableField(exist = false) private SystemDeptTb dept; - @ApiModelProperty(value = "用户名称") private String username; - @ApiModelProperty(value = "用户昵称") private String nickName; - @ApiModelProperty(value = "邮箱") private String email; - @ApiModelProperty(value = "电话号码") private String phone; - @ApiModelProperty(value = "用户性别") private String gender; - @ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false; + + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "用户角色") + private Set roles; + @ApiModelProperty(value = "用户岗位") + private Set jobs; + private Long deptId; + @TableField(exist = false) + private SystemDeptTb dept; + @ApiModelProperty(value = "用户名称") + private String username; + @ApiModelProperty(value = "用户昵称") + private String nickName; + @ApiModelProperty(value = "邮箱") + private String email; + @ApiModelProperty(value = "电话号码") + private String phone; + @ApiModelProperty(value = "用户性别") + private String gender; + @ApiModelProperty(value = "头像真实名称", hidden = true) + private String avatarName; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "是否为admin账号", hidden = true) + private Boolean isAdmin = false; } \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java index 7739ac13..93cbb2ea 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java @@ -24,17 +24,23 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemUpdateQuartzJobArgs extends KitObject { - @NotNull private Long id; - private String uuid; - private String jobName; - @NotBlank private String beanName; - @NotBlank private String methodName; - private String params; - @NotBlank private String cronExpression; - private Boolean isPause = false; - private String personInCharge; - private String email; - private String subTask; - private Boolean pauseAfterFailure; - @NotBlank private String description; + + @NotNull + private Long id; + private String uuid; + private String jobName; + @NotBlank + private String beanName; + @NotBlank + private String methodName; + private String params; + @NotBlank + private String cronExpression; + private Boolean isPause = false; + private String personInCharge; + private String email; + private String subTask; + private Boolean pauseAfterFailure; + @NotBlank + private String description; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java index 12a786db..5dabd94c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java @@ -23,6 +23,9 @@ import lombok.Data; */ @Data public class SystemUpdateUserPasswordArgs { - @ApiModelProperty(value = "旧密码") private String oldPass; - @ApiModelProperty(value = "新密码") private String newPass; + + @ApiModelProperty(value = "旧密码") + private String oldPass; + @ApiModelProperty(value = "新密码") + private String newPass; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java index 377fd702..7de0b8dc 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java @@ -25,11 +25,12 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemUserInfoVo extends KitObject { - private SystemSimpleUserVo user; - private List dataScopes; - private List authorities; - public Set getRoles() { - return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); - } + private SystemSimpleUserVo user; + private List dataScopes; + private List authorities; + + public Set getRoles() { + return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java index 37e65563..2cddbaf5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java @@ -28,47 +28,51 @@ import org.springframework.security.core.userdetails.UserDetails; @Getter @AllArgsConstructor public class SystemUserJwtVo implements UserDetails { - @ApiModelProperty(value = "用户") private final SystemUserTb user; - @ApiModelProperty(value = "数据权限") private final List dataScopes; - @ApiModelProperty(value = "角色") private final List authorities; - public Set getRoles() { - return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); - } + @ApiModelProperty(value = "用户") + private final SystemUserTb user; + @ApiModelProperty(value = "数据权限") + private final List dataScopes; + @ApiModelProperty(value = "角色") + private final List authorities; - @Override - @JSONField(serialize = false) - public String getPassword() { - return user.getPassword(); - } + public Set getRoles() { + return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); + } - @Override - @JSONField(serialize = false) - public String getUsername() { - return user.getUsername(); - } + @Override + @JSONField(serialize = false) + public String getPassword() { + return user.getPassword(); + } - @Override - @JSONField(serialize = false) - public boolean isAccountNonExpired() { - return true; - } + @Override + @JSONField(serialize = false) + public String getUsername() { + return user.getUsername(); + } - @Override - @JSONField(serialize = false) - public boolean isAccountNonLocked() { - return true; - } + @Override + @JSONField(serialize = false) + public boolean isAccountNonExpired() { + return true; + } - @Override - @JSONField(serialize = false) - public boolean isCredentialsNonExpired() { - return true; - } + @Override + @JSONField(serialize = false) + public boolean isAccountNonLocked() { + return true; + } - @Override - @JSONField(serialize = false) - public boolean isEnabled() { - return user.getEnabled(); - } + @Override + @JSONField(serialize = false) + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + @JSONField(serialize = false) + public boolean isEnabled() { + return user.getEnabled(); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java index 65265065..e0ce1fb8 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java @@ -23,8 +23,15 @@ import lombok.Setter; @Getter @Setter public class SystemUserLoginArgs { - @NotBlank @ApiModelProperty(value = "用户名") private String username; - @NotBlank @ApiModelProperty(value = "密码") private String password; - @ApiModelProperty(value = "验证码") private String code; - @ApiModelProperty(value = "验证码的key") private String uuid = ""; + + @NotBlank + @ApiModelProperty(value = "用户名") + private String username; + @NotBlank + @ApiModelProperty(value = "密码") + private String password; + @ApiModelProperty(value = "验证码") + private String code; + @ApiModelProperty(value = "验证码的key") + private String uuid = ""; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java index 72aeebb9..8944c354 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java @@ -24,13 +24,23 @@ import lombok.Data; */ @Data public class SystemUserOnlineVo { - @ApiModelProperty(value = "Token编号") private String uid; - @ApiModelProperty(value = "用户名") private String userName; - @ApiModelProperty(value = "昵称") private String nickName; - @ApiModelProperty(value = "岗位") private String dept; - @ApiModelProperty(value = "浏览器") private String browser; - @ApiModelProperty(value = "IP") private String ip; - @ApiModelProperty(value = "地址") private String address; - @ApiModelProperty(value = "token") private String key; - @ApiModelProperty(value = "登录时间") private Date loginTime; + + @ApiModelProperty(value = "Token编号") + private String uid; + @ApiModelProperty(value = "用户名") + private String userName; + @ApiModelProperty(value = "昵称") + private String nickName; + @ApiModelProperty(value = "岗位") + private String dept; + @ApiModelProperty(value = "浏览器") + private String browser; + @ApiModelProperty(value = "IP") + private String ip; + @ApiModelProperty(value = "地址") + private String address; + @ApiModelProperty(value = "token") + private String key; + @ApiModelProperty(value = "登录时间") + private Date loginTime; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java new file mode 100644 index 00000000..b5463eea --- /dev/null +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java @@ -0,0 +1,19 @@ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemJobTb; +import cn.odboy.system.dal.dataobject.SystemRoleTb; +import cn.odboy.system.dal.dataobject.SystemUserTb; +import io.swagger.annotations.ApiModelProperty; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemUserVo extends SystemUserTb { + + @ApiModelProperty(value = "用户角色") + private Set roles; + @ApiModelProperty(value = "用户岗位") + private Set jobs; +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java index 1d187b30..41a88119 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java @@ -32,46 +32,52 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemDeptMapper extends BaseMapper { - default List selectDeptByPidIsNull() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return selectList(wrapper); - } - default long countDeptByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return selectCount(wrapper); - } - default List queryDeptByArgs(SystemQueryDeptArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.in(CollUtil.isNotEmpty(criteria.getIds()), SystemDeptTb::getId, criteria.getIds()); - wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemDeptTb::getName, criteria.getName()); - wrapper.eq(criteria.getEnabled() != null, SystemDeptTb::getEnabled, criteria.getEnabled()); - wrapper.eq(criteria.getPid() != null, SystemDeptTb::getPid, criteria.getPid()); - wrapper.isNull(criteria.getPidIsNull() != null, SystemDeptTb::getPid); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemDeptTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemDeptTb::getDeptSort); - return selectList(wrapper); - } - default List selectEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return selectList(wrapper); - } - default List selectDeptByPid(long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return selectList(wrapper); - } - default void updateDeptSubCountById(long count, Long deptId) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemDeptTb::getId, deptId); - wrapper.set(SystemDeptTb::getSubCount, count); - update(null, wrapper); + + default List selectDeptByPidIsNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemDeptTb::getPid); + return selectList(wrapper); + } + + default long countDeptByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return selectCount(wrapper); + } + + default List queryDeptByArgs(SystemQueryDeptArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + wrapper.in(CollUtil.isNotEmpty(criteria.getIds()), SystemDeptTb::getId, criteria.getIds()); + wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemDeptTb::getName, criteria.getName()); + wrapper.eq(criteria.getEnabled() != null, SystemDeptTb::getEnabled, criteria.getEnabled()); + wrapper.eq(criteria.getPid() != null, SystemDeptTb::getPid, criteria.getPid()); + wrapper.isNull(criteria.getPidIsNull() != null, SystemDeptTb::getPid); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemDeptTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemDeptTb::getDeptSort); + return selectList(wrapper); + } + + default List selectEnabledDepts() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + return selectList(wrapper); + } + + default List selectDeptByPid(long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return selectList(wrapper); + } + + default void updateDeptSubCountById(long count, Long deptId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemDeptTb::getId, deptId); + wrapper.set(SystemDeptTb::getSubCount, count); + update(null, wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictDetailMapper.java index 1fa77bc2..bf5d85a9 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 @@ -15,14 +15,14 @@ */ package cn.odboy.system.dal.mysql; +import cn.hutool.core.collection.CollUtil; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; -import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; /** * 字典明细 Mapper @@ -31,6 +31,16 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemDictDetailMapper extends BaseMapper { - IPage selectDictDetailByArgs(@Param("criteria") SystemQueryDictDetailArgs criteria, Page page); - List selectDictDetailByArgs(@Param("criteria") SystemQueryDictDetailArgs criteria); + + default List selectByDictId(Long dictId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDictDetailTb::getDictId, dictId); + return selectList(wrapper); + } + + default IPage selectDictDetailByArgs(List dictIds, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CollUtil.isNotEmpty(dictIds), SystemDictDetailTb::getDictId, dictIds); + return selectPage(page, wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java index 96deffe7..ee07545e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java @@ -31,20 +31,29 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemDictMapper extends BaseMapper { - default 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())); - } - } - default List selectDictByArgs(SystemQueryDictArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - return selectList(wrapper); - } - default List selectDictByArgs(SystemQueryDictArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - return selectList(page, wrapper); + + default 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())); } + } + + default List selectDictByArgs(SystemQueryDictArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + return selectList(wrapper); + } + + default List selectDictByArgs(SystemQueryDictArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + return selectList(page, wrapper); + } + + default SystemDictTb getByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDictTb::getName, name); + return selectOne(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java index d041cd4b..c1c1b926 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemEmailConfigMapper extends BaseMapper {} +public interface SystemEmailConfigMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java index e44e8663..9c1131af 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java @@ -33,32 +33,34 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemJobMapper extends BaseMapper { - default SystemJobTb getJobByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemJobTb::getName, name); - return selectOne(wrapper); - } - default void injectQueryParams(SystemQueryJobArgs criteria, LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemJobTb::getName, criteria.getName()); - wrapper.eq(criteria.getEnabled() != null, SystemJobTb::getEnabled, criteria.getEnabled()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemJobTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); - } - default IPage selectJobByArgs(SystemQueryJobArgs criteria, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(criteria, wrapper); - return selectPage(page, wrapper); - } + default SystemJobTb getJobByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemJobTb::getName, name); + return selectOne(wrapper); + } - default List selectJobByArgs(SystemQueryJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(criteria, wrapper); - return selectList(wrapper); + default void injectQueryParams(SystemQueryJobArgs criteria, LambdaQueryWrapper wrapper) { + if (criteria != null) { + wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemJobTb::getName, criteria.getName()); + wrapper.eq(criteria.getEnabled() != null, SystemJobTb::getEnabled, criteria.getEnabled()); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemJobTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); + } + + default IPage selectJobByArgs(SystemQueryJobArgs criteria, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(criteria, wrapper); + return selectPage(page, wrapper); + } + + default List selectJobByArgs(SystemQueryJobArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(criteria, wrapper); + return selectList(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java index ebee5363..bbcb5ed1 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java @@ -33,31 +33,32 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemLocalStorageMapper extends BaseMapper { - default void injectQueryParams(SystemQueryStorageArgs criteria, LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemLocalStorageTb::getName, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getSuffix, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getType, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getCreateBy, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemLocalStorageTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemLocalStorageTb::getId); - } - default List selectLocalStorageByArgs(SystemQueryStorageArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(criteria, wrapper); - return selectList(wrapper); + default void injectQueryParams(SystemQueryStorageArgs criteria, LambdaQueryWrapper wrapper) { + if (criteria != null) { + wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), + c -> c.like(SystemLocalStorageTb::getName, criteria.getBlurry()).or() + .like(SystemLocalStorageTb::getSuffix, criteria.getBlurry()).or() + .like(SystemLocalStorageTb::getType, criteria.getBlurry()).or() + .like(SystemLocalStorageTb::getCreateBy, criteria.getBlurry())); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemLocalStorageTb::getUpdateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemLocalStorageTb::getId); + } - default IPage selectLocalStorageByArgs(SystemQueryStorageArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(criteria, wrapper); - return selectPage(page, wrapper); - } + default List selectLocalStorageByArgs(SystemQueryStorageArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(criteria, wrapper); + return selectList(wrapper); + } + + default IPage selectLocalStorageByArgs(SystemQueryStorageArgs criteria, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(criteria, wrapper); + return selectPage(page, wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java index a862a54e..d685fd77 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java @@ -32,61 +32,63 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemMenuMapper extends BaseMapper { - default void updateMenuSubCntByMenuId(Long count, Long menuId) { - if (count != null) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemMenuTb::getId, menuId); - wrapper.set(SystemMenuTb::getSubCount, count); - update(wrapper); - } - } - default SystemMenuTb getMenuByComponentName(String componentName) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getComponentName, componentName); - return selectOne(wrapper); - } - default SystemMenuTb getMenuByTitle(String title) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getTitle, title); - return selectOne(wrapper); + default void updateMenuSubCntByMenuId(Long count, Long menuId) { + if (count != null) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemMenuTb::getId, menuId); + wrapper.set(SystemMenuTb::getSubCount, count); + update(wrapper); } + } - default Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return selectCount(wrapper); - } + default SystemMenuTb getMenuByComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return selectOne(wrapper); + } - default List selectMenuByArgs(SystemQueryMenuArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.isNull(criteria.getPidIsNull() != null, SystemMenuTb::getPid); - wrapper.eq(criteria.getPid() != null, SystemMenuTb::getPid, criteria.getPid()); - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemMenuTb::getTitle, criteria.getBlurry()).or() - .like(SystemMenuTb::getComponentName, criteria.getBlurry()).or() - .like(SystemMenuTb::getPermission, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemMenuTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); - } + default SystemMenuTb getMenuByTitle(String title) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getTitle, title); + return selectOne(wrapper); + } - default List selectMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); - } + default Long countMenuByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + return selectCount(wrapper); + } - default List selectMenuByPidIsNull() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); + default List selectMenuByArgs(SystemQueryMenuArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + wrapper.isNull(criteria.getPidIsNull() != null, SystemMenuTb::getPid); + wrapper.eq(criteria.getPid() != null, SystemMenuTb::getPid, criteria.getPid()); + wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), + c -> c.like(SystemMenuTb::getTitle, criteria.getBlurry()).or() + .like(SystemMenuTb::getComponentName, criteria.getBlurry()).or() + .like(SystemMenuTb::getPermission, criteria.getBlurry())); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemMenuTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return selectList(wrapper); + } + + default List selectMenuByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return selectList(wrapper); + } + + default List selectMenuByPidIsNull() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return selectList(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java index 3b2dfad3..6dc2ecab 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java @@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SystemOperationLogMapper extends BaseMapper {} +public interface SystemOperationLogMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java index 112f2494..30b893b4 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-07-15 */ @Mapper -public interface SystemOssStorageMapper extends BaseMapper {} +public interface SystemOssStorageMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java index 796e0473..333270ea 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemQuartzJobMapper extends BaseMapper {} +public interface SystemQuartzJobMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java index 4f73a9af..66091347 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemQuartzLogMapper extends BaseMapper {} +public interface SystemQuartzLogMapper extends BaseMapper { + +} 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 1c0c2ead..9b568787 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 @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemRoleDeptMapper extends BaseMapper {} +public interface SystemRoleDeptMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java index 3a6e8426..b63f4118 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java @@ -21,10 +21,7 @@ import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; -import java.util.Set; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; /** * 角色 Mapper @@ -33,22 +30,22 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemRoleMapper extends BaseMapper { - default Long countRoleByArgs(SystemQueryRoleArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or() - .like(SystemRoleTb::getDescription, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - return selectCount(wrapper); + + default Long countRoleByArgs(SystemQueryRoleArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), + c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or() + .like(SystemRoleTb::getDescription, criteria.getBlurry())); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } - List selectRoleByArgs(@Param("criteria") SystemQueryRoleArgs criteria); - List selectRoleByUserId(@Param("userId") Long userId); - List selectRoleByMenuId(@Param("menuId") Long menuId); - SystemRoleTb getRoleById(@Param("roleId") Long roleId); - Integer countRoleByDeptIds(@Param("deptIds") Set deptIds); + return selectCount(wrapper); + } + + default SystemRoleTb getRoleById(Long roleId) { + return selectById(roleId); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java index 8c63af5e..252db638 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemRoleMenuMapper extends BaseMapper {} +public interface SystemRoleMenuMapper extends BaseMapper { + +} 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 7de427cd..b43e280f 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 @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemUserJobMapper extends BaseMapper {} +public interface SystemUserJobMapper extends BaseMapper { + +} 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 4e96ca2c..4f2c7e51 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 @@ -15,61 +15,88 @@ */ package cn.odboy.system.dal.mysql; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import java.util.Set; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; +/** + * 用户 Mapper + * + * @author odboy + */ @Mapper public interface SystemUserMapper extends BaseMapper { - List selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria); - IPage selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria, Page page); - List selectUserByRoleId(@Param("roleId") Long roleId); - List selectUserByDeptId(@Param("deptId") Long deptId); - List selectUserByMenuId(@Param("menuId") Long menuId); - Long countUserByJobIds(@Param("jobIds") Set jobIds); - Long countUserByRoleIds(@Param("roleIds") Set roleIds); - SystemUserTb getUserByUsername(@Param("username") String username); - default long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return selectCount(wrapper); + + default SystemUserTb getUserByUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return selectOne(wrapper); + } + + default Long countUserByJobIds(Set jobIds) { + if (CollUtil.isEmpty(jobIds)) { + return 0L; } - default SystemUserTb getUserByEmail(String email) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getEmail, email); - wrapper.eq(SystemUserTb::getEnabled, 1); - return selectOne(wrapper); - } - default SystemUserTb getUserByPhone(String phone) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getPhone, phone); - wrapper.eq(SystemUserTb::getEnabled, 1); - return selectOne(wrapper); - } - default void updateUserPasswordByUsername(String username, String password) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); - } - default void updateUserEmailByUsername(String username, String email) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getEmail, email); - update(null, wrapper); - } - default void updateUserPasswordByUserIds(String password, Set userIds) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.in(SystemUserTb::getId, userIds); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); + // 需要通过用户岗位关联表查询,这里暂时返回0 + // 实际实现需要在Service层通过关联查询 + return 0L; + } + + default Long countUserByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return 0L; } + // 需要通过用户角色关联表查询,这里暂时返回0 + // 实际实现需要在Service层通过关联查询 + return 0L; + } + + default long countUserByDeptIds(Set deptIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserTb::getDeptId, deptIds); + return selectCount(wrapper); + } + + default SystemUserTb getUserByEmail(String email) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getEmail, email); + wrapper.eq(SystemUserTb::getEnabled, 1); + return selectOne(wrapper); + } + + default SystemUserTb getUserByPhone(String phone) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getPhone, phone); + wrapper.eq(SystemUserTb::getEnabled, 1); + return selectOne(wrapper); + } + + default void updateUserPasswordByUsername(String username, String password) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } + + default void updateUserEmailByUsername(String username, String email) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getEmail, email); + update(null, wrapper); + } + + default void updateUserPasswordByUserIds(String password, Set userIds) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(SystemUserTb::getId, userIds); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java index 4fc63b33..0a0ecf66 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 @@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SystemUserRoleMapper extends BaseMapper {} +public interface SystemUserRoleMapper extends BaseMapper { + +} diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java index d9277a4e..7a73436b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java @@ -19,50 +19,51 @@ package cn.odboy.system.dal.redis; * 关于缓存的Key集合 */ public interface SystemCacheKey { - /** - * 用户 - */ - String USER_ID = "user::id:"; - /** - * 数据 - */ - String DATA_USER = "data::user:"; - /** - * 菜单 - */ - String MENU_ID = "menu::id:"; - String MENU_USER = "menu::user:"; - /** - * 角色授权 - */ - String ROLE_AUTH = "role::auth:"; - String ROLE_USER = "role::user:"; - /** - * 角色信息 - */ - String ROLE_ID = "role::id:"; - /** - * 部门 - */ - String DEPT_ID = "dept::id:"; - /** - * 岗位 - */ - String JOB_ID = "job::id:"; - /** - * 数据字典 - */ - String DICT_NAME = "dict::name:"; - /** - * 在线用户 - */ - String ONLINE_USER = "online::token:"; - /** - * 登录验证码 - */ - String CAPTCHA_LOGIN = "captcha::login:"; - /** - * 用户信息 - */ - String USER_INFO = "user::info:"; + + /** + * 用户 + */ + String USER_ID = "user::id:"; + /** + * 数据 + */ + String DATA_USER = "data::user:"; + /** + * 菜单 + */ + String MENU_ID = "menu::id:"; + String MENU_USER = "menu::user:"; + /** + * 角色授权 + */ + String ROLE_AUTH = "role::auth:"; + String ROLE_USER = "role::user:"; + /** + * 角色信息 + */ + String ROLE_ID = "role::id:"; + /** + * 部门 + */ + String DEPT_ID = "dept::id:"; + /** + * 岗位 + */ + String JOB_ID = "job::id:"; + /** + * 数据字典 + */ + String DICT_NAME = "dict::name:"; + /** + * 在线用户 + */ + String ONLINE_USER = "online::token:"; + /** + * 登录验证码 + */ + String CAPTCHA_LOGIN = "captcha::login:"; + /** + * 用户信息 + */ + String USER_INFO = "user::info:"; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java index 05f46060..e8eb9240 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java @@ -4,50 +4,51 @@ package cn.odboy.system.dal.redis; * 关于缓存的Key集合 */ public interface SystemRedisKey { - /** - * 用户 - */ - String USER_ID = "user::id:"; - /** - * 数据 - */ - String DATA_USER = "data::user:"; - /** - * 菜单 - */ - String MENU_ID = "menu::id:"; - String MENU_USER = "menu::user:"; - /** - * 角色授权 - */ - String ROLE_AUTH = "role::auth:"; - String ROLE_USER = "role::user:"; - /** - * 角色信息 - */ - String ROLE_ID = "role::id:"; - /** - * 部门 - */ - String DEPT_ID = "dept::id:"; - /** - * 岗位 - */ - String JOB_ID = "job::id:"; - /** - * 数据字典 - */ - String DICT_NAME = "dict::name:"; - /** - * 在线用户 - */ - String ONLINE_USER = "online::token:"; - /** - * 登录验证码 - */ - String CAPTCHA_LOGIN = "captcha::login:"; - /** - * 用户信息 - */ - String USER_INFO = "user::info:"; + + /** + * 用户 + */ + String USER_ID = "user::id:"; + /** + * 数据 + */ + String DATA_USER = "data::user:"; + /** + * 菜单 + */ + String MENU_ID = "menu::id:"; + String MENU_USER = "menu::user:"; + /** + * 角色授权 + */ + String ROLE_AUTH = "role::auth:"; + String ROLE_USER = "role::user:"; + /** + * 角色信息 + */ + String ROLE_ID = "role::id:"; + /** + * 部门 + */ + String DEPT_ID = "dept::id:"; + /** + * 岗位 + */ + String JOB_ID = "job::id:"; + /** + * 数据字典 + */ + String DICT_NAME = "dict::name:"; + /** + * 在线用户 + */ + String ONLINE_USER = "online::token:"; + /** + * 登录验证码 + */ + String CAPTCHA_LOGIN = "captcha::login:"; + /** + * 用户信息 + */ + String USER_INFO = "user::info:"; } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java index a2e40f5e..aea97b10 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java @@ -13,46 +13,48 @@ import org.springframework.stereotype.Component; */ @Component public class SystemUserInfoDAO { - @Autowired private KitRedisHelper redisHelper; - /** - * 添加缓存到Redis - * - * @param userName 用户名 - */ - @Async - public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { - if (StrUtil.isNotEmpty(userName)) { - // 添加数据, 避免数据同时过期(2小时左右) - long time = 7200 + RandomUtil.randomInt(900, 1800); - redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); - } - } + @Autowired + private KitRedisHelper redisHelper; - /** - * 清理用户缓存信息 用户信息变更时 - * - * @param userName 用户名 - */ - @Async - public void deleteUserLoginInfoByUserName(String userName) { - if (StrUtil.isNotEmpty(userName)) { - // 清除数据 - redisHelper.del(SystemRedisKey.USER_INFO + userName); - } + /** + * 添加缓存到Redis + * + * @param userName 用户名 + */ + @Async + public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { + if (StrUtil.isNotEmpty(userName)) { + // 添加数据, 避免数据同时过期(2小时左右) + long time = 7200 + RandomUtil.randomInt(900, 1800); + redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); } + } - /** - * 返回用户缓存 - * - * @param username 用户名 - * @return UserJwtVo - */ - public SystemUserJwtVo getUserLoginInfoByUserName(String username) { - if (StrUtil.isNotEmpty(username)) { - // 获取数据 - return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); - } - return null; + /** + * 清理用户缓存信息 用户信息变更时 + * + * @param userName 用户名 + */ + @Async + public void deleteUserLoginInfoByUserName(String userName) { + if (StrUtil.isNotEmpty(userName)) { + // 清除数据 + redisHelper.del(SystemRedisKey.USER_INFO + userName); } + } + + /** + * 返回用户缓存 + * + * @param username 用户名 + * @return UserJwtVo + */ + public SystemUserJwtVo getUserLoginInfoByUserName(String username) { + if (StrUtil.isNotEmpty(username)) { + // 获取数据 + return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); + } + return null; + } } 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 410d151a..61c76b75 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java @@ -13,8 +13,6 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitIPUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -23,6 +21,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; 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; @@ -31,129 +31,130 @@ import org.springframework.stereotype.Component; @Component @AllArgsConstructor public class SystemUserOnlineInfoDAO { - private final AppProperties properties; - private final TokenProvider tokenProvider; - private final KitRedisHelper redisHelper; - /** - * 保存在线用户信息 - * - * @param userJwtVo / - * @param token / - * @param request / - */ - public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { - String dept = userJwtVo.getUser().getDept().getName(); - String ip = KitBrowserUtil.getIp(request); - String id = tokenProvider.getId(token); - String version = KitBrowserUtil.getVersion(request); - String address = KitIPUtil.getCityInfo(ip); - SystemUserOnlineVo userOnlineVo = null; - try { - userOnlineVo = new SystemUserOnlineVo(); - userOnlineVo.setUid(id); - userOnlineVo.setUserName(userJwtVo.getUsername()); - userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); - userOnlineVo.setDept(dept); - userOnlineVo.setBrowser(version); - userOnlineVo.setIp(ip); - userOnlineVo.setAddress(address); - userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); - userOnlineVo.setLoginTime(new Date()); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - String loginKey = tokenProvider.loginKey(token); - redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); - } + private final AppProperties properties; + private final TokenProvider tokenProvider; + private final KitRedisHelper redisHelper; - /** - * 退出登录 - * - * @param token / - */ - public void logoutByToken(String token) { - String loginKey = tokenProvider.loginKey(token); - redisHelper.del(loginKey); + /** + * 保存在线用户信息 + * + * @param userJwtVo / + * @param token / + * @param request / + */ + public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { + String dept = userJwtVo.getUser().getDept().getName(); + String ip = KitBrowserUtil.getIp(request); + String id = tokenProvider.getId(token); + String version = KitBrowserUtil.getVersion(request); + String address = KitIPUtil.getCityInfo(ip); + SystemUserOnlineVo userOnlineVo = null; + try { + userOnlineVo = new SystemUserOnlineVo(); + userOnlineVo.setUid(id); + userOnlineVo.setUserName(userJwtVo.getUsername()); + userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); + userOnlineVo.setDept(dept); + userOnlineVo.setBrowser(version); + userOnlineVo.setIp(ip); + userOnlineVo.setAddress(address); + userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); + userOnlineVo.setLoginTime(new Date()); + } catch (Exception e) { + log.error(e.getMessage(), e); } + String loginKey = tokenProvider.loginKey(token); + redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); + } - /** - * 导出 - * - * @param all / - * @param response / - * @throws IOException / - */ - public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemUserOnlineVo user : all) { - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUserName()); - map.put("部门", user.getDept()); - map.put("登录IP", user.getIp()); - map.put("登录地点", user.getAddress()); - map.put("浏览器", user.getBrowser()); - map.put("登录日期", user.getLoginTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + /** + * 退出登录 + * + * @param token / + */ + public void logoutByToken(String token) { + String loginKey = tokenProvider.loginKey(token); + redisHelper.del(loginKey); + } - /** - * 根据用户名强退用户 - * - * @param username / - */ - public void kickOutByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; - redisHelper.scanDel(loginKey); + /** + * 导出 + * + * @param all / + * @param response / + * @throws IOException / + */ + public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemUserOnlineVo user : all) { + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUserName()); + map.put("部门", user.getDept()); + map.put("登录IP", user.getIp()); + map.put("登录地点", user.getAddress()); + map.put("浏览器", user.getBrowser()); + map.put("登录日期", user.getLoginTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param onlineVo / - * @param pageable / - * @return / - */ - public KitPageResult queryUserOnlineModelPage(SystemUserOnlineVo onlineVo, - IPage pageable) { - String username = null; - if (onlineVo != null) { - username = onlineVo.getUserName(); - } - List onlineUserList = queryUserOnlineModelListByUsername(username); - List paging = - KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); - return KitPageUtil.toPage(paging, onlineUserList.size()); - } + /** + * 根据用户名强退用户 + * + * @param username / + */ + public void kickOutByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; + redisHelper.scanDel(loginKey); + } - /** - * 查询全部数据,不分页 - * - * @param username / - * @return / - */ - public List queryUserOnlineModelListByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); - List keys = redisHelper.scan(loginKey + "*"); - Collections.reverse(keys); - List onlineUserList = new ArrayList<>(); - for (String key : keys) { - onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); - } - onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); - return onlineUserList; + /** + * 查询全部数据 + * + * @param onlineVo / + * @param pageable / + * @return / + */ + public KitPageResult queryUserOnlineModelPage(SystemUserOnlineVo onlineVo, + IPage pageable) { + String username = null; + if (onlineVo != null) { + username = onlineVo.getUserName(); } + List onlineUserList = queryUserOnlineModelListByUsername(username); + List paging = + KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); + return KitPageUtil.toPage(paging, onlineUserList.size()); + } - /** - * 查询用户 - * - * @param key / - * @return / - */ - public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { - return redisHelper.get(key, SystemUserOnlineVo.class); + /** + * 查询全部数据,不分页 + * + * @param username / + * @return / + */ + public List queryUserOnlineModelListByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); + List keys = redisHelper.scan(loginKey + "*"); + Collections.reverse(keys); + List onlineUserList = new ArrayList<>(); + for (String key : keys) { + onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); } + onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); + return onlineUserList; + } + + /** + * 查询用户 + * + * @param key / + * @return / + */ + public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { + return redisHelper.get(key, SystemUserOnlineVo.class); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java index e27b8159..4fa147e4 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java @@ -16,7 +16,12 @@ package cn.odboy.system.framework.bizlock; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; /** diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java index ac091709..a3f16d59 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java @@ -18,6 +18,7 @@ package cn.odboy.system.framework.bizlock; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.redis.KitRedisHelper; +import java.lang.reflect.Method; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -28,8 +29,6 @@ import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.stereotype.Component; -import java.lang.reflect.Method; - @Aspect @Component public class BizLockAspect { @@ -60,7 +59,8 @@ public class BizLockAspect { private String parseLockKey(ProceedingJoinPoint joinPoint, BizLock bizLock) { // 如果key为空,使用默认格式: bizName:方法名 if (bizLock.key().isEmpty()) { - return String.format("%s:%s", bizLock.bizName(), ((MethodSignature)joinPoint.getSignature()).getMethod().getName()); + return String.format("%s:%s", bizLock.bizName(), + ((MethodSignature)joinPoint.getSignature()).getMethod().getName()); } // 解析SpEL表达式 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java index 33d37709..e43e2e82 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java @@ -19,11 +19,10 @@ package cn.odboy.system.framework.mybatisplus; import cn.hutool.core.date.DateTime; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import java.util.Date; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; -import java.util.Date; - @Component public class MpMetaObjectHandler implements MetaObjectHandler { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java index 6de423fe..c318a2a8 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java @@ -16,7 +16,12 @@ package cn.odboy.system.framework.operalog; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 捕捉操作日志 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java index a6a293d9..30f67f52 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java @@ -28,6 +28,7 @@ import cn.odboy.util.KitIPUtil; import com.alibaba.fastjson2.JSON; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -36,8 +37,6 @@ import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.lang.reflect.Method; - /** * 捕捉操作日志 * @@ -48,8 +47,7 @@ import java.lang.reflect.Method; @Aspect @Component public class OperationLogAspect { - @Autowired - private SystemOperationLogMapper systemOperationLogMapper; + @Autowired private SystemOperationLogMapper systemOperationLogMapper; @Around("@annotation(operationLog)") public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { @@ -83,7 +81,8 @@ public class OperationLogAspect { } } - private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, TimeInterval timeInterval) { + private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, + TimeInterval timeInterval) { long executeTime = timeInterval.intervalMs(); MethodSignature signature = (MethodSignature)joinPoint.getSignature(); String bizName = annotation.bizName(); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java index 3fbee830..21cfbdaf 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java @@ -15,7 +15,12 @@ */ package cn.odboy.system.framework.operalog.annotaions; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 捕捉操作日志 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java index 9cbfb440..076b05bb 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java @@ -28,6 +28,7 @@ import cn.odboy.util.KitIPUtil; import com.alibaba.fastjson2.JSON; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -36,8 +37,6 @@ import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.lang.reflect.Method; - /** * 捕捉操作日志 * @@ -48,8 +47,7 @@ import java.lang.reflect.Method; @Aspect @Component public class SystemOperationLogAspect { - @Autowired - private SystemOperationLogMapper systemOperationLogMapper; + @Autowired private SystemOperationLogMapper systemOperationLogMapper; @Around("@annotation(operationLog)") public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { @@ -85,7 +83,8 @@ public class SystemOperationLogAspect { } } - private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, TimeInterval timeInterval) { + private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, + TimeInterval timeInterval) { long executeTime = timeInterval.intervalMs(); MethodSignature signature = (MethodSignature)joinPoint.getSignature(); String bizName = annotation.bizName(); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java index 6947737e..c077f96d 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java @@ -17,11 +17,10 @@ package cn.odboy.system.framework.permission.config; import cn.odboy.system.framework.permission.core.KitSecurityHelper; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.stereotype.Service; - import java.util.Arrays; import java.util.List; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Service; @Service(value = "el") public class AuthorityConfig { @@ -34,7 +33,8 @@ public class AuthorityConfig { */ public Boolean check(String... permissions) { // 获取当前用户的所有权限 - List roleList = KitSecurityHelper.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).toList(); + List roleList = + KitSecurityHelper.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).toList(); // 判断当前用户的所有权限是否包含接口上定义的权限 return roleList.contains("admin") || Arrays.stream(permissions).anyMatch(roleList::contains); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java index e412aaeb..f0861025 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java @@ -23,6 +23,8 @@ import cn.odboy.system.framework.permission.core.handler.JwtAuthenticationEntryP import cn.odboy.system.framework.permission.core.handler.TokenFilter; import cn.odboy.system.framework.permission.core.handler.TokenProvider; import cn.odboy.util.KitAnonTagUtil; +import java.util.Map; +import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -40,24 +42,15 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.filter.CorsFilter; -import java.util.Map; -import java.util.Set; - @Configuration @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SpringSecurityConfig { - @Autowired - private TokenProvider tokenProvider; - @Autowired - private CorsFilter corsFilter; - @Autowired - private JwtAuthenticationEntryPoint authenticationErrorHandler; - @Autowired - private JwtAccessDeniedHandler jwtAccessDeniedHandler; - @Autowired - private ApplicationContext applicationContext; - @Autowired - private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired private TokenProvider tokenProvider; + @Autowired private CorsFilter corsFilter; + @Autowired private JwtAuthenticationEntryPoint authenticationErrorHandler; + @Autowired private JwtAccessDeniedHandler jwtAccessDeniedHandler; + @Autowired private ApplicationContext applicationContext; + @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; @Bean public GrantedAuthorityDefaults grantedAuthorityDefaults() { @@ -81,20 +74,23 @@ public class SpringSecurityConfig { return httpSecurity // 禁用 CSRF - .csrf(AbstractHttpConfigurer::disable).addFilter(corsFilter).addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class) + .csrf(AbstractHttpConfigurer::disable).addFilter(corsFilter) + .addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class) // 授权异常 .exceptionHandling( - exceptionHandling -> exceptionHandling.authenticationEntryPoint(authenticationErrorHandler).accessDeniedHandler(jwtAccessDeniedHandler)) + exceptionHandling -> exceptionHandling.authenticationEntryPoint(authenticationErrorHandler) + .accessDeniedHandler(jwtAccessDeniedHandler)) // 防止iframe 造成跨域 .headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) // 不创建会话 - .sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .sessionManagement( + sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authorizeRequests -> authorizeRequests // 静态资源等等 .requestMatchers(HttpMethod.GET, "*.html", "*.css", "*.js", "/websocket/**").permitAll() // Knife4j 和 OpenAPI 相关路径 - .requestMatchers("/doc.html", "/webjars/**", "/v3/api-docs", "/v3/api-docs/**", "/swagger-resources", "/swagger-resources/**", - "/configuration/ui", "/configuration/security").permitAll() + .requestMatchers("/doc.html", "/webjars/**", "/v3/api-docs", "/v3/api-docs/**", "/swagger-resources", + "/swagger-resources/**", "/configuration/ui", "/configuration/security").permitAll() // 文件 .requestMatchers("/avatar/**").permitAll().requestMatchers("/file/**").permitAll() // 阿里巴巴 druid @@ -103,15 +99,20 @@ public class SpringSecurityConfig { .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() // 自定义匿名访问所有url放行:允许匿名和带Token访问,细腻化到每个 Request 类型 // GET - .requestMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.GET, + anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])).permitAll() // POST - .requestMatchers(HttpMethod.POST, anonymousUrls.get(RequestMethodEnum.POST.getType()).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.POST, + anonymousUrls.get(RequestMethodEnum.POST.getType()).toArray(new String[0])).permitAll() // PUT - .requestMatchers(HttpMethod.PUT, anonymousUrls.get(RequestMethodEnum.PUT.getType()).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.PUT, + anonymousUrls.get(RequestMethodEnum.PUT.getType()).toArray(new String[0])).permitAll() // PATCH - .requestMatchers(HttpMethod.PATCH, anonymousUrls.get(RequestMethodEnum.PATCH.getType()).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.PATCH, + anonymousUrls.get(RequestMethodEnum.PATCH.getType()).toArray(new String[0])).permitAll() // DELETE - .requestMatchers(HttpMethod.DELETE, anonymousUrls.get(RequestMethodEnum.DELETE.getType()).toArray(new String[0])).permitAll() + .requestMatchers(HttpMethod.DELETE, + anonymousUrls.get(RequestMethodEnum.DELETE.getType()).toArray(new String[0])).permitAll() // 所有类型的接口都放行 .requestMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll() // 所有请求都需要认证 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java index 4aa01885..9d9b6eb5 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java @@ -26,6 +26,8 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import jakarta.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -33,9 +35,6 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import java.util.List; -import java.util.Objects; - /** * 获取当前登录的用户 */ @@ -122,7 +121,8 @@ public class KitSecurityHelper { * @return / */ public static String getToken() { - HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull( + RequestContextHolder.getRequestAttributes())).getRequest(); String bearerToken = request.getHeader(SystemConst.HEADER_NAME); if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { // 去掉令牌前缀 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java index 32bd3504..c7fb9f1a 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java @@ -20,23 +20,24 @@ import cn.odboy.framework.exception.handler.ApiError; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; -import java.io.IOException; - @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { @Override - public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException { //当用户在没有授权的情况下访问受保护的REST资源时,将调用此方法发送403 Forbidden响应 response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("application/json;charset=UTF-8"); ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString(ApiError.error(HttpStatus.FORBIDDEN.value(), "禁止访问,您没有权限访问此资源")); + String jsonResponse = objectMapper.writeValueAsString( + ApiError.error(HttpStatus.FORBIDDEN.value(), "禁止访问,您没有权限访问此资源")); response.getWriter().write(jsonResponse); } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java index d3235743..474f8640 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java @@ -20,26 +20,27 @@ import cn.odboy.framework.exception.handler.ApiError; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; -import java.io.IOException; - @Slf4j @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws IOException { // 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应 int code = HttpStatus.UNAUTHORIZED.value(); response.setStatus(code); response.setContentType("application/json;charset=UTF-8"); ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString(ApiError.error(HttpStatus.UNAUTHORIZED.value(), "登录状态已过期,请重新登录")); + String jsonResponse = objectMapper.writeValueAsString( + ApiError.error(HttpStatus.UNAUTHORIZED.value(), "登录状态已过期,请重新登录")); response.getWriter().write(jsonResponse); } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java index dba2ec68..46ab61de 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java @@ -25,14 +25,13 @@ import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; +import java.io.IOException; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.StringUtils; import org.springframework.web.filter.GenericFilterBean; -import java.io.IOException; - @Slf4j public class TokenFilter extends GenericFilterBean { private final TokenProvider tokenProvider; @@ -48,7 +47,8 @@ public class TokenFilter extends GenericFilterBean { } @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws ServletException, IOException { HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; String token = resolveToken(httpServletRequest); // 对于 Token 为空的不需要去查 Redis diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java index 66dc4d12..e43b48e4 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java @@ -30,6 +30,12 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.crypto.SecretKey; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -38,22 +44,13 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.User; import org.springframework.stereotype.Component; -import javax.crypto.SecretKey; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - @Slf4j @Component public class TokenProvider implements InitializingBean { public static final String AUTHORITIES_UUID_KEY = "uid"; public static final String AUTHORITIES_UID_KEY = "userId"; - @Autowired - private KitRedisHelper redisHelper; - @Autowired - private AppProperties properties; + @Autowired private KitRedisHelper redisHelper; + @Autowired private AppProperties properties; // 0.11.x版本 // private Key signingKey; // 0.12.x版本 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java index 81258bc3..2e99a56b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java @@ -24,27 +24,22 @@ import cn.odboy.system.dal.redis.SystemUserInfoDAO; import cn.odboy.system.service.SystemDataService; import cn.odboy.system.service.SystemRoleService; import cn.odboy.system.service.SystemUserService; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; -import java.util.List; - /** * TODO 通过用户名判断用户信息,并获取拥有的权限与部门 */ @Slf4j @Service("userDetailsService") public class UserDetailsHandler implements UserDetailsService { - @Autowired - private SystemRoleService systemRoleService; - @Autowired - private SystemUserService systemUserService; - @Autowired - private SystemDataService systemDataService; - @Autowired - private SystemUserInfoDAO systemUserInfoDAO; + @Autowired private SystemRoleService systemRoleService; + @Autowired private SystemUserService systemUserService; + @Autowired private SystemDataService systemDataService; + @Autowired private SystemUserInfoDAO systemUserInfoDAO; @Override public SystemUserJwtVo loadUserByUsername(String username) { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java index 19028ec1..39fff57e 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java @@ -31,16 +31,15 @@ import cn.odboy.system.dal.model.SystemSendEmailArgs; import cn.odboy.system.dal.mysql.SystemQuartzLogMapper; import cn.odboy.system.service.SystemEmailService; import cn.odboy.system.service.SystemQuartzJobService; -import lombok.extern.slf4j.Slf4j; -import org.quartz.JobExecutionContext; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.scheduling.quartz.QuartzJobBean; - import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Future; +import lombok.extern.slf4j.Slf4j; +import org.quartz.JobExecutionContext; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.quartz.QuartzJobBean; @Slf4j public class ExecutionJobBean extends QuartzJobBean { @@ -69,7 +68,8 @@ public class ExecutionJobBean extends QuartzJobBean { quartzLog.setCronExpression(quartzJob.getCronExpression()); try { // 执行任务 - QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(), quartzJob.getParams()); + QuartzRunnable task = + new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(), quartzJob.getParams()); Future future = executor.submit(task); // 忽略任务执行结果 future.get(); @@ -122,7 +122,8 @@ public class ExecutionJobBean extends QuartzJobBean { Map data = new HashMap<>(16); data.put("task", quartzJob); data.put("msg", msg); - TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + TemplateEngine engine = + TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); Template template = engine.getTemplate("SystemQuartzJobTaskAlarmTemplate.ftl"); sendEmailRequest.setContent(template.render(data)); List emails = Arrays.asList(quartzJob.getEmail().split("[,,]")); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java index e2bbe20a..44a9c411 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java @@ -19,26 +19,35 @@ package cn.odboy.system.framework.quartz; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemQuartzJobTb; import jakarta.annotation.Resource; +import java.util.Date; import lombok.extern.slf4j.Slf4j; -import org.quartz.*; +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.ObjectAlreadyExistsException; +import org.quartz.Scheduler; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; import org.quartz.impl.triggers.CronTriggerImpl; import org.springframework.stereotype.Component; -import java.util.Date; - @Slf4j @Component public class QuartzManage { private static final String JOB_NAME = "TASK_"; - @Resource - private Scheduler scheduler; + @Resource private Scheduler scheduler; public void addJob(SystemQuartzJobTb quartzJob) { try { // 构建job信息 - JobDetail jobDetail = JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build(); + JobDetail jobDetail = + JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build(); // 通过触发器名和cron 表达式创建 Trigger Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow() diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java index 7d09ce44..02215702 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java @@ -28,14 +28,14 @@ import org.springframework.context.annotation.Configuration; @Slf4j @Configuration public class OssStorageConfiguration { - @Autowired - private AppProperties properties; + @Autowired private AppProperties properties; @Bean public MinioClient minioClient() { try { OSSConfigModel minio = properties.getOss().getMinio(); - return MinioClient.builder().endpoint(minio.getEndpoint()).credentials(minio.getAccessKey(), minio.getSecretKey()).build(); + return MinioClient.builder().endpoint(minio.getEndpoint()) + .credentials(minio.getAccessKey(), minio.getSecretKey()).build(); } catch (Exception e) { log.error("创建Minio客户端失败", e); throw new BadRequestException("创建Minio客户端失败"); diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java index 92c46b4f..9dd91297 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java @@ -19,6 +19,7 @@ package cn.odboy.system.framework.storage.local; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.properties.AppProperties; import jakarta.servlet.MultipartConfigElement; +import java.io.File; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -27,15 +28,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.unit.DataSize; -import java.io.File; - @Slf4j @Configuration public class MultipartConfig { - @Value("${spring.application.name}") - private String name; - @Autowired - private AppProperties properties; + @Value("${spring.application.name}") private String name; + @Autowired private AppProperties properties; /** * 文件上传临时路径 diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java index 44f68ee7..98e5b11b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java @@ -30,30 +30,37 @@ import cn.odboy.framework.properties.model.StorageOSSModel; import cn.odboy.system.dal.dataobject.SystemOssStorageTb; import cn.odboy.util.KitDateUtil; import cn.odboy.util.KitFileUtil; -import io.minio.*; +import io.minio.BucketExistsArgs; +import io.minio.GetObjectArgs; +import io.minio.GetObjectResponse; +import io.minio.GetPresignedObjectUrlArgs; +import io.minio.ListObjectsArgs; +import io.minio.MakeBucketArgs; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import io.minio.RemoveBucketArgs; +import io.minio.RemoveObjectArgs; +import io.minio.Result; import io.minio.http.Method; import io.minio.messages.Bucket; import io.minio.messages.Item; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Component public class MinioRepository { - @Autowired - private AppProperties properties; - @Autowired - private MinioClient minioClient; + @Autowired private AppProperties properties; + @Autowired private MinioClient minioClient; /** * 检查存储bucket是否存在 @@ -136,7 +143,8 @@ public class MinioRepository { * @param md5 文件md5 * @return String 上传后的文件名,上传失败返回 null */ - public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType, String md5) { + public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType, + String md5) { StorageOSSModel ossConfig = properties.getOss(); OSSConfigModel ossMinioConfig = ossConfig.getMinio(); String type = FileTypeUtil.getType(tempFile); @@ -164,9 +172,8 @@ public class MinioRepository { systemOssStorageTb.setObjectName(objectName); try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) { - PutObjectArgs objectArgs = - PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName).stream(fileInputStream, fileSize, -1).contentType(contentType) - .build(); + PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName) + .stream(fileInputStream, fileSize, -1).contentType(contentType).build(); minioClient.putObject(objectArgs); log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename); return systemOssStorageTb; @@ -204,8 +211,8 @@ public class MinioRepository { log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); try (InputStream fileInputStream = file.getInputStream()) { PutObjectArgs objectArgs = - PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName).stream(fileInputStream, file.getSize(), -1) - .contentType(file.getContentType()).build(); + PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName) + .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); // 使用重试机制进行上传 uploadWithRetry(objectArgs, 3); log.info("文件上传成功,objectName: {}", objectName); @@ -254,7 +261,8 @@ public class MinioRepository { } try { GetPresignedObjectUrlArgs presignedUrlArgs = - GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fullFileName).method(Method.GET) + GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) + .object(fullFileName).method(Method.GET) // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 .expiry(3600 * 24 * 7).build(); String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); @@ -273,9 +281,11 @@ public class MinioRepository { * @param res HTTP 响应 */ public void download(String fileName, HttpServletResponse res) { - GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); + GetObjectArgs objectArgs = + GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); - try (GetObjectResponse response = minioClient.getObject(objectArgs); FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { + try (GetObjectResponse response = minioClient.getObject(objectArgs); + FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { byte[] buf = new byte[1024]; int len; @@ -303,7 +313,8 @@ public class MinioRepository { * @param res HTTP 响应 */ public void downloadOptimizedVersion(String fileName, HttpServletResponse res) { - GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); + GetObjectArgs objectArgs = + GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); try (GetObjectResponse response = minioClient.getObject(objectArgs)) { // 增大缓冲区 @@ -337,7 +348,8 @@ public class MinioRepository { */ public List queryAllObjects() { try { - Iterable> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); List items = new ArrayList<>(); for (Result result : results) { items.add(result.get()); @@ -357,7 +369,9 @@ public class MinioRepository { */ public boolean removeBucketFile(String fileName) { try { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build()); + minioClient.removeObject( + RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName) + .build()); log.info("删除文件成功,fileName: {}", fileName); return true; } catch (Exception e) { diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java index ff6c9e61..6c11473b 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.job; import lombok.extern.slf4j.Slf4j; @@ -23,15 +22,15 @@ import org.springframework.stereotype.Service; @Service public class TestTask { - public void run() { - log.info("run 执行成功"); - } + public void run() { + log.info("run 执行成功"); + } - public void run1(String str) { - log.info("run1 执行成功, 参数为: {}", str); - } + public void run1(String str) { + log.info("run1 执行成功, 参数为: {}", str); + } - public void run2() { - log.info("run2 执行成功"); - } + public void run2() { + log.info("run2 执行成功"); + } } 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 9547d004..453b757f 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 @@ -20,6 +20,7 @@ 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.dataobject.SystemUserTb; +import cn.odboy.system.dal.model.SystemRoleVo; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -34,53 +35,57 @@ import org.springframework.stereotype.Service; */ @Service public class SystemDataService { - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleDeptService systemRoleDeptService; - /** - * 获取数据权限 - * - * @param user / - * @return / - */ - public List findDeptIdListByArgs(SystemUserTb user) { - List deptIds = new ArrayList<>(); - // 查询用户角色 - List roleList = systemRoleService.queryRoleByUsersId(user.getId()); - // 获取对应的部门ID - for (SystemRoleTb role : roleList) { - SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); - switch (Objects.requireNonNull(dataScopeEnum)) { - case THIS_LEVEL: - deptIds.add(user.getDept().getId()); - break; - case CUSTOMIZE: - deptIds.addAll(this.findCustomDataPermissionList(deptIds, role)); - break; - default: - return new ArrayList<>(); - } - } - return deptIds.stream().distinct().collect(Collectors.toList()); - } + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 获取自定义的数据权限 - * - * @param deptIds 部门ID - * @param role 角色 - * @return 数据权限ID - */ - private List findCustomDataPermissionList(List deptIds, SystemRoleTb role) { - List deptList = systemRoleDeptService.selectDeptByRoleId(role.getId()); - for (SystemDeptTb dept : deptList) { - deptIds.add(dept.getId()); - List deptChildren = systemDeptService.queryDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptChildren)) { - deptIds.addAll(systemDeptService.queryChildDeptIdListByDeptIds(deptChildren)); - } - } - return deptIds; + /** + * 获取数据权限 + * + * @param user / + * @return / + */ + public List findDeptIdListByArgs(SystemUserTb user) { + List deptIds = new ArrayList<>(); + // 查询用户角色 + List roleList = systemRoleService.queryRoleByUsersId(user.getId()); + // 获取对应的部门ID + for (SystemRoleTb role : roleList) { + SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); + switch (Objects.requireNonNull(dataScopeEnum)) { + case THIS_LEVEL: + deptIds.add(user.getDept().getId()); + break; + case CUSTOMIZE: + deptIds.addAll(this.findCustomDataPermissionList(deptIds, role)); + break; + default: + return new ArrayList<>(); + } } + return deptIds.stream().distinct().collect(Collectors.toList()); + } + + /** + * 获取自定义的数据权限 + * + * @param deptIds 部门ID + * @param role 角色 + * @return 数据权限ID + */ + private List findCustomDataPermissionList(List deptIds, SystemRoleTb role) { + List deptList = systemRoleDeptService.selectDeptByRoleId(role.getId()); + for (SystemDeptTb dept : deptList) { + deptIds.add(dept.getId()); + List deptChildren = systemDeptService.queryDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptChildren)) { + deptIds.addAll(systemDeptService.queryChildDeptIdListByDeptIds(deptChildren)); + } + } + return deptIds; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemDeptService.java index 0514a1a2..81532f50 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 @@ -21,7 +21,6 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; @@ -35,8 +34,6 @@ import cn.odboy.system.dal.mysql.SystemUserMapper; import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -50,393 +47,398 @@ 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 SystemUserMapper systemUserMapper; - @Autowired private SystemRoleMapper systemRoleMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDept(SystemCreateDeptArgs args) { - systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); - this.updateDeptSubCnt(args.getPid()); + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemRoleService systemRoleService; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDept(SystemCreateDeptArgs args) { + systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); + this.updateDeptSubCnt(args.getPid()); + } + + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDept(SystemDeptTb args) { + // 旧的部门 + Long oldPid = this.getDeptById(args.getId()).getPid(); + Long newPid = args.getPid(); + if (args.getPid() != null && args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); } + SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); + args.setId(dept.getId()); + systemDeptMapper.insertOrUpdate(args); + this.updateDeptSubCnt(oldPid); + this.updateDeptSubCnt(newPid); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDept(SystemDeptTb args) { - // 旧的部门 - Long oldPid = this.getDeptById(args.getId()).getPid(); - Long newPid = args.getPid(); - if (args.getPid() != null && args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); + /** + * 删除 + * + * @param deptSet / + */ + @Transactional(rollbackFor = Exception.class) + public void removeDeptByIds(Set deptSet) { + for (SystemDeptTb dept : deptSet) { + systemDeptMapper.deleteById(dept.getId()); + this.updateDeptSubCnt(dept.getPid()); + } + } + + /** + * 导出数据 + * + * @param deptList 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDeptTb dept : deptList) { + Map map = new LinkedHashMap<>(); + map.put("部门名称", dept.getName()); + map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); + map.put("创建日期", dept.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 更新父节点中子节点数目 + * + * @param deptId / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptSubCnt(Long deptId) { + if (deptId != null) { + long count = systemDeptMapper.countDeptByPid(deptId); + systemDeptMapper.updateDeptSubCountById(count, deptId); + } + } + + /** + * 筛选出 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; + } + + /** + * 查询所有数据 + * + * @param criteria 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllDept(SystemQueryDeptArgs criteria, Boolean isQuery) throws Exception { + String dataScopeType = KitSecurityHelper.getDataScopeType(); + if (isQuery) { + if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { + criteria.setPidIsNull(true); + } + List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); + List fieldNames = new ArrayList<>() {{ + add("pidIsNull"); + add("enabled"); + }}; + for (Field field : fields) { + // 设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(criteria); + if (fieldNames.contains(field.getName())) { + continue; } - SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); - args.setId(dept.getId()); - systemDeptMapper.insertOrUpdate(args); - this.updateDeptSubCnt(oldPid); - this.updateDeptSubCnt(newPid); - } - - /** - * 删除 - * - * @param deptSet / - */ - @Transactional(rollbackFor = Exception.class) - public void removeDeptByIds(Set deptSet) { - for (SystemDeptTb dept : deptSet) { - systemDeptMapper.deleteById(dept.getId()); - this.updateDeptSubCnt(dept.getPid()); + if (ObjectUtil.isNotNull(val)) { + criteria.setPidIsNull(null); + break; } + } } + // 数据权限 + criteria.setIds(KitSecurityHelper.getCurrentUserDataScope()); + List list = systemDeptMapper.queryDeptByArgs(criteria); + // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 + if (StrUtil.isBlank(dataScopeType)) { + return this.deduplication(list); + } + return list; + } - /** - * 导出数据 - * - * @param deptList 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDeptTb dept : deptList) { - Map map = new LinkedHashMap<>(); - map.put("部门名称", dept.getName()); - map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); - map.put("创建日期", dept.getCreateTime()); - list.add(map); + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 根据PID查询 + * + * @param pid / + * @return / + */ + public List queryDeptByPid(long pid) { + return systemDeptMapper.selectDeptByPid(pid); + } + + /** + * 获取部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + * @return / + */ + public Set queryRelationDeptSet(List deptTbList, Set depts) { + for (SystemDeptTb dept : deptTbList) { + depts.add(dept); + List deptList = systemDeptMapper.selectDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptSet(deptList, depts); + } + } + return depts; + } + + /** + * 获取 + * + * @param deptList 、 + * @return 、 + */ + public List queryChildDeptIdListByDeptIds(List deptList) { + List list = new ArrayList<>(); + for (SystemDeptTb systemDeptTb : deptList) { + if (systemDeptTb != null && systemDeptTb.getEnabled()) { + List deptList1 = systemDeptMapper.selectDeptByPid(systemDeptTb.getId()); + if (CollUtil.isNotEmpty(deptList1)) { + list.addAll(queryChildDeptIdListByDeptIds(deptList1)); } - KitFileUtil.downloadExcel(list, response); + list.add(systemDeptTb.getId()); + } } + return list; + } - /** - * 更新父节点中子节点数目 - * - * @param deptId / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDeptSubCnt(Long deptId) { - if (deptId != null) { - long count = systemDeptMapper.countDeptByPid(deptId); - systemDeptMapper.updateDeptSubCountById(count, deptId); + /** + * 根据ID获取同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + public List querySuperiorDeptListByPid(SystemDeptTb dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(systemDeptMapper.selectDeptByPidIsNull()); + return deptList; + } + deptList.addAll(systemDeptMapper.selectDeptByPid(dept.getPid())); + return querySuperiorDeptListByPid(this.getDeptById(dept.getPid()), deptList); + } + + /** + * 构建树形数据 + * + * @param deptList / + * @return / + */ + public KitPageResult buildDeptTree(List deptList) { + Set trees = new LinkedHashSet<>(); + Set deptSet = new LinkedHashSet<>(); + List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); + boolean isChild; + for (SystemDeptTb dept : deptList) { + isChild = false; + if (dept.getPid() == null) { + trees.add(dept); + } + for (SystemDeptTb it : deptList) { + if (it.getPid() != null && dept.getId().equals(it.getPid())) { + isChild = true; + if (dept.getChildren() == null) { + dept.setChildren(new ArrayList<>()); + } + dept.getChildren().add(it); } + } + if (isChild) { + deptSet.add(dept); + } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { + deptSet.add(dept); + } } + if (CollectionUtil.isEmpty(trees)) { + trees = deptSet; + } + KitPageResult baseResult = new KitPageResult<>(); + baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); + baseResult.setTotalElements(deptSet.size()); + return baseResult; + } - /** - * 筛选出 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; + /** + * 验证是否被角色或用户关联 + * + * @param deptSet / + */ + public void verifyBindRelationByIds(Set deptSet) { + Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); + if (systemUserMapper.countUserByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); } + if (systemRoleService.countRoleByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + } + } - /** - * 查询所有数据 - * - * @param criteria 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllDept(SystemQueryDeptArgs criteria, Boolean isQuery) throws Exception { - String dataScopeType = KitSecurityHelper.getDataScopeType(); - if (isQuery) { - if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { - criteria.setPidIsNull(true); - } - List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); - List fieldNames = new ArrayList<>() {{ - add("pidIsNull"); - add("enabled"); - }}; - for (Field field : fields) { - // 设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(criteria); - if (fieldNames.contains(field.getName())) { - continue; - } - if (ObjectUtil.isNotNull(val)) { - criteria.setPidIsNull(null); - break; - } - } - } - // 数据权限 - criteria.setIds(KitSecurityHelper.getCurrentUserDataScope()); - List list = systemDeptMapper.queryDeptByArgs(criteria); - // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 - if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); - } - return list; + /** + * 遍历所有部门和子部门 + * + * @param ids / + */ + public Set traverseDeptByIdWithPids(Set ids) { + Set depts = new HashSet<>(); + for (Long id : ids) { + // 根部门 + depts.add(this.getDeptById(id)); + // 子部门 + List deptList = queryDeptByPid(id); + if (CollectionUtil.isNotEmpty(deptList)) { + depts = queryRelationDeptSet(deptList, depts); + } } + return depts; + } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemDeptTb getDeptById(Long id) { - return systemDeptMapper.selectById(id); - } + public List queryDeptSelectDataSource() { + List depts = systemDeptMapper.selectEnabledDepts(); + return buildDeptSelectOptions(depts); + } - /** - * 根据PID查询 - * - * @param pid / - * @return / - */ - public List queryDeptByPid(long pid) { - return systemDeptMapper.selectDeptByPid(pid); + 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; + } - /** - * 获取部门下所有关联的部门 - * - * @param deptTbList / - * @param depts / - * @return / - */ - public Set queryRelationDeptSet(List deptTbList, Set depts) { - for (SystemDeptTb dept : deptTbList) { - depts.add(dept); - List deptList = systemDeptMapper.selectDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptSet(deptList, depts); - } - } - return depts; + 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); } + } - /** - * 获取 - * - * @param deptList 、 - * @return 、 - */ - public List queryChildDeptIdListByDeptIds(List deptList) { - List list = new ArrayList<>(); - for (SystemDeptTb systemDeptTb : deptList) { - if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = systemDeptMapper.selectDeptByPid(systemDeptTb.getId()); - if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(queryChildDeptIdListByDeptIds(deptList1)); - } - list.add(systemDeptTb.getId()); - } - } - return list; - } + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } - /** - * 根据ID获取同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - public List querySuperiorDeptListByPid(SystemDeptTb dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(systemDeptMapper.selectDeptByPidIsNull()); - return deptList; - } - deptList.addAll(systemDeptMapper.selectDeptByPid(dept.getPid())); - return querySuperiorDeptListByPid(this.getDeptById(dept.getPid()), deptList); + private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { + pathNames.add(dept.getName()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); } + } - /** - * 构建树形数据 - * - * @param deptList / - * @return / - */ - public KitPageResult buildDeptTree(List deptList) { - Set trees = new LinkedHashSet<>(); - Set deptSet = new LinkedHashSet<>(); - List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); - boolean isChild; - for (SystemDeptTb dept : deptList) { - isChild = false; - if (dept.getPid() == null) { - trees.add(dept); - } - for (SystemDeptTb it : deptList) { - if (it.getPid() != null && dept.getId().equals(it.getPid())) { - isChild = true; - if (dept.getChildren() == null) { - dept.setChildren(new ArrayList<>()); - } - dept.getChildren().add(it); - } - } - if (isChild) { - deptSet.add(dept); - } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { - deptSet.add(dept); - } - } - if (CollectionUtil.isEmpty(trees)) { - trees = deptSet; - } - KitPageResult baseResult = new KitPageResult<>(); - baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); - baseResult.setTotalElements(deptSet.size()); - return baseResult; + public List queryDeptSelectProDataSource() { + List depts = systemDeptMapper.selectEnabledDepts(); + // 获取所有部门并按父子关系组织 + 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 deptSet / - */ - public void verifyBindRelationByIds(Set deptSet) { - Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - if (systemUserMapper.countUserByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); - } - if (systemRoleMapper.countRoleByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); - } - } - - /** - * 遍历所有部门和子部门 - * - * @param ids / - */ - public Set traverseDeptByIdWithPids(Set ids) { - Set depts = new HashSet<>(); - for (Long id : ids) { - // 根部门 - depts.add(this.getDeptById(id)); - // 子部门 - List deptList = queryDeptByPid(id); - if (CollectionUtil.isNotEmpty(deptList)) { - depts = queryRelationDeptSet(deptList, depts); - } - } - return depts; - } - - public List queryDeptSelectDataSource() { - List depts = systemDeptMapper.selectEnabledDepts(); - return buildDeptSelectOptions(depts); - } - - private List buildDeptSelectOptions(List depts) { - // 获取所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - // 构建部门ID路径 - List pathIds = new ArrayList<>(); - buildDeptIdPath(dept, deptMap, pathIds); - // 反转路径,从顶级部门到当前部门 - Collections.reverse(pathIds); - SystemProductLineVo dto = new SystemProductLineVo(); - dto.setValue(dept.getId()); - dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); - // 保留名称路径用于显示 - dto.setLabel(buildNamePath(dept, deptMap)); - options.add(dto); - } - // 按部门名称路径排序 - options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); - return options; - } - - private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { - pathIds.add(dept.getId()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); - } - } - - private String buildNamePath(SystemDeptTb dept, Map deptMap) { - List pathNames = new ArrayList<>(); - buildDeptNamePath(dept, deptMap, pathNames); - Collections.reverse(pathNames); - return String.join(" / ", pathNames); - } - - private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { - pathNames.add(dept.getName()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); - } - } - - public List queryDeptSelectProDataSource() { - List depts = systemDeptMapper.selectEnabledDepts(); - // 获取所有部门并按父子关系组织 - 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; + /** + * 递归构建部门树 + * + * @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; + } } 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 d6f1cc90..da0a281e 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 @@ -17,87 +17,137 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; +import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.model.SystemCreateDictDetailArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.dal.mysql.SystemDictDetailMapper; +import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.ArrayList; import java.util.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; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDictDetail(SystemCreateDictDetailArgs args) { - SystemDictDetailTb dictDetail = BeanUtil.copyProperties(args, SystemDictDetailTb.class); - dictDetail.setDictId(args.getDict().getId()); - systemDictDetailMapper.insert(dictDetail); + @Autowired + private SystemDictDetailMapper systemDictDetailMapper; + @Autowired + private SystemDictMapper systemDictMapper; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDictDetail(SystemCreateDictDetailArgs args) { + SystemDictDetailTb dictDetail = BeanUtil.copyProperties(args, SystemDictDetailTb.class); + dictDetail.setDictId(args.getDict().getId()); + systemDictDetailMapper.insert(dictDetail); + } + + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyDictDetailById(SystemDictDetailTb args) { + SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); + args.setId(dictDetail.getId()); + systemDictDetailMapper.insertOrUpdate(args); + } + + /** + * 删除 + * + * @param id / + */ + @Transactional(rollbackFor = Exception.class) + public void removeDictDetailById(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); + } + } + + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryDictDetailByArgs(SystemQueryDictDetailArgs args, + Page page) { + IPage iPage = new Page<>(); + List dictIds = new ArrayList<>(); + List dictTbs = new ArrayList<>(); + + if (args == null) { + dictTbs.addAll(systemDictMapper.selectList(null)); + dictIds = dictTbs.stream().map(SystemDictTb::getId).collect(Collectors.toList()); + } else { + String dictName = args.getDictName(); + if (StrUtil.isBlank(dictName)) { + return KitPageUtil.toPage(iPage); + } + SystemDictTb dictTb = systemDictMapper.getByName(dictName); + if (dictTb == null) { + return KitPageUtil.toPage(iPage); + } else { + dictIds.add(dictTb.getId()); + dictTbs.add(dictTb); + } } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyDictDetailById(SystemDictDetailTb args) { - SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); - args.setId(dictDetail.getId()); - systemDictDetailMapper.insertOrUpdate(args); + Map id2ItemMap = dictTbs.stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); + iPage = systemDictDetailMapper.selectDictDetailByArgs(dictIds, page) + .convert(i -> BeanUtil.copyProperties(i, SystemDictDetailVo.class)); + for (SystemDictDetailVo record : iPage.getRecords()) { + record.setDict(id2ItemMap.get(record.getDictId())); } + return KitPageUtil.toPage(iPage); + } - /** - * 删除 - * - * @param id / - */ - @Transactional(rollbackFor = Exception.class) - public void removeDictDetailById(Long id) { - systemDictDetailMapper.deleteById(id); + /** + * 根据字典名称获取字典详情 + * + * @param name 字典名称 + * @return / + */ + public List queryDictDetailByName(String name) { + if (StrUtil.isBlank(name)) { + return new ArrayList<>(); } + SystemDictTb systemDictTb = systemDictMapper.getByName(name); + if (systemDictTb == null) { + return new ArrayList<>(); + } + return systemDictDetailMapper.selectByDictId(systemDictTb.getId()).stream().map(m -> { + SystemDictDetailVo detailVo = BeanUtil.copyProperties(m, SystemDictDetailVo.class); + detailVo.setDict(systemDictTb); + return detailVo; + }).collect(Collectors.toList()); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryDictDetailByArgs(SystemQueryDictDetailArgs args, Page page) { - return KitPageUtil.toPage(systemDictDetailMapper.selectDictDetailByArgs(args, page)); - } - - /** - * 根据字典名称获取字典详情 - * - * @param name 字典名称 - * @return / - */ - public List queryDictDetailByName(String name) { - SystemQueryDictDetailArgs args = new SystemQueryDictDetailArgs(); - args.setDictName(name); - return systemDictDetailMapper.selectDictDetailByArgs(args); - } - - @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); - } - } } 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 951b88a4..b56aaf04 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 @@ -21,124 +21,122 @@ import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.model.SystemCreateDictArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictArgs; -import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; -import cn.odboy.system.dal.mysql.SystemDictDetailMapper; import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class SystemDictService { - @Autowired private SystemDictMapper systemDictMapper; - @Autowired private SystemDictDetailMapper systemDictDetailMapper; - @Autowired private SystemDictDetailService systemDictDetailService; + @Autowired + private SystemDictMapper systemDictMapper; + @Autowired + private SystemDictDetailService systemDictDetailService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDict(SystemCreateDictArgs args) { - systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); - } + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDict(SystemCreateDictArgs args) { + systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyDictById(SystemDictTb args) { - SystemDictTb dict = systemDictMapper.selectById(args.getId()); - dict.setName(args.getName()); - dict.setDescription(args.getDescription()); - systemDictMapper.insertOrUpdate(dict); - } + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyDictById(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 removeDictByIds(Set ids) { - // 删除字典 - systemDictMapper.deleteByIds(ids); - // 删除字典详情 - systemDictDetailService.deleteDictDetailByDictIds(ids); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeDictByIds(Set ids) { + // 删除字典 + systemDictMapper.deleteByIds(ids); + // 删除字典详情 + systemDictDetailService.deleteDictDetailByDictIds(ids); + } - /** - * 导出数据 - * - * @param dicts 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDictTb dict : dicts) { - SystemQueryDictDetailArgs args = new SystemQueryDictDetailArgs(); - args.setDictName(dict.getName()); - List dictDetails = systemDictDetailMapper.selectDictDetailByArgs(args); - if (CollectionUtil.isNotEmpty(dictDetails)) { - for (SystemDictDetailTb dictDetail : dictDetails) { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", dictDetail.getLabel()); - map.put("字典值", dictDetail.getValue()); - map.put("创建日期", dictDetail.getCreateTime()); - list.add(map); - } - } else { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", null); - map.put("字典值", null); - map.put("创建日期", dict.getCreateTime()); - list.add(map); - } + /** + * 导出数据 + * + * @param dicts 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDictTb dict : dicts) { + List dictDetails = systemDictDetailService.queryDictDetailByName(dict.getName()); + if (CollectionUtil.isNotEmpty(dictDetails)) { + for (SystemDictDetailTb dictDetail : dictDetails) { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", dictDetail.getLabel()); + map.put("字典值", dictDetail.getValue()); + map.put("创建日期", dictDetail.getCreateTime()); + list.add(map); } - KitFileUtil.downloadExcel(list, response); + } else { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", null); + map.put("字典值", null); + map.put("创建日期", dict.getCreateTime()); + list.add(map); + } } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryDictByArgs(SystemQueryDictArgs args, Page page) { - return KitPageUtil.toPage(systemDictMapper.selectDictByArgs(args, page)); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryDictByArgs(SystemQueryDictArgs args, Page page) { + return KitPageUtil.toPage(systemDictMapper.selectDictByArgs(args, page)); + } - /** - * 查询全部数据 - * - * @param args / - * @return / - */ - public List queryDictByArgs(SystemQueryDictArgs args) { - return systemDictMapper.selectDictByArgs(args); - } + /** + * 查询全部数据 + * + * @param args / + * @return / + */ + public List queryDictByArgs(SystemQueryDictArgs args) { + return systemDictMapper.selectDictByArgs(args); + } - public SystemDictTb getById(int id) { - return systemDictMapper.selectById(id); - } + public SystemDictTb getById(int id) { + return systemDictMapper.selectById(id); + } } 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 384033f2..afbf6abd 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 @@ -38,114 +38,119 @@ import org.springframework.transaction.annotation.Transactional; @Slf4j @Service public class SystemEmailService { - @Autowired private SystemEmailConfigMapper systemEmailConfigMapper; - @Autowired private KitRedisHelper redisHelper; - @Autowired private AppProperties properties; - @Value("${spring.application.title}") private String applicationTitle; - /** - * 更新邮件配置 - * - * @param emailConfig 邮箱配置 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyEmailConfig(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); - } + @Autowired + private SystemEmailConfigMapper systemEmailConfigMapper; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; + @Value("${spring.application.title}") + private String applicationTitle; - /** - * 发送邮件 - * - * @param sendEmailRequest 邮件发送的内容 - */ - public void sendEmail(SystemSendEmailArgs sendEmailRequest) { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (systemEmailConfigTb.getId() == null) { - throw new BadRequestException("请先配置, 再操作"); - } - // 封装 - MailAccount account = new MailAccount(); - // 设置用户 - String user = systemEmailConfigTb.getFromUser().split("@")[0]; - account.setUser(user); - account.setHost(systemEmailConfigTb.getHost()); - account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); - account.setAuth(true); - try { - // 对称解密 - account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); - } catch (Exception e) { - throw new BadRequestException(e.getMessage()); - } - account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); - // ssl方式发送 - account.setSslEnable(true); - // 使用STARTTLS安全连接 - account.setStarttlsEnable(true); - // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 - account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); - String content = sendEmailRequest.getContent(); - // 发送 - try { - int size = sendEmailRequest.getTos().size(); - Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) - .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) - // 关闭session - .setUseGlobalSession(false).send(); - } catch (Exception e) { - log.error("邮件发送失败", e); - throw new BadRequestException("邮件发送失败"); - } + /** + * 更新邮件配置 + * + * @param emailConfig 邮箱配置 + */ + @Transactional(rollbackFor = Exception.class) + public void modifyEmailConfig(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); + } - /** - * 校验邮箱验证码 - */ - public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { - String redisKey = biEnum.getRedisKey() + email; - String value = redisHelper.get(redisKey, String.class); - if (value == null || !value.equals(code)) { - throw new BadRequestException("无效验证码"); - } else { - redisHelper.del(redisKey); - } + /** + * 发送邮件 + * + * @param sendEmailRequest 邮件发送的内容 + */ + public void sendEmail(SystemSendEmailArgs sendEmailRequest) { + SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); + if (systemEmailConfigTb.getId() == null) { + throw new BadRequestException("请先配置, 再操作"); } + // 封装 + MailAccount account = new MailAccount(); + // 设置用户 + String user = systemEmailConfigTb.getFromUser().split("@")[0]; + account.setUser(user); + account.setHost(systemEmailConfigTb.getHost()); + account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); + account.setAuth(true); + try { + // 对称解密 + account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); + // ssl方式发送 + account.setSslEnable(true); + // 使用STARTTLS安全连接 + account.setStarttlsEnable(true); + // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 + account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); + String content = sendEmailRequest.getContent(); + // 发送 + try { + int size = sendEmailRequest.getTos().size(); + Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) + .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) + // 关闭session + .setUseGlobalSession(false).send(); + } catch (Exception e) { + log.error("邮件发送失败", e); + throw new BadRequestException("邮件发送失败"); + } + } - /** - * 发送给邮箱验证码 - */ - public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { - if (biEnum == null) { - throw new BadRequestException("biEnum必填"); - } - String content; - String redisKey = biEnum.getRedisKey() + email; - String oldCode = redisHelper.get(redisKey, String.class); - if (oldCode == null) { - String code = RandomUtil.randomNumbers(6); - // 存入缓存 - if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { - throw new BadRequestException("服务异常, 请联系网站负责人"); - } - // 存在就再次发送原来的验证码 - content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); - } else { - content = - KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); - } - SystemSendEmailArgs sendEmailRequest = - new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); - sendEmail(sendEmailRequest); + /** + * 校验邮箱验证码 + */ + public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { + String redisKey = biEnum.getRedisKey() + email; + String value = redisHelper.get(redisKey, String.class); + if (value == null || !value.equals(code)) { + throw new BadRequestException("无效验证码"); + } else { + redisHelper.del(redisKey); } + } - public SystemEmailConfigTb getLastEmailConfig() { - SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); - return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + /** + * 发送给邮箱验证码 + */ + public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { + if (biEnum == null) { + throw new BadRequestException("biEnum必填"); } + String content; + String redisKey = biEnum.getRedisKey() + email; + String oldCode = redisHelper.get(redisKey, String.class); + if (oldCode == null) { + String code = RandomUtil.randomNumbers(6); + // 存入缓存 + if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { + throw new BadRequestException("服务异常, 请联系网站负责人"); + } + // 存在就再次发送原来的验证码 + content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); + } else { + content = + KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); + } + SystemSendEmailArgs sendEmailRequest = + new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); + sendEmail(sendEmailRequest); + } + + public SystemEmailConfigTb getLastEmailConfig() { + SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); + return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + } } 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 90aae024..6ca705ad 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 @@ -26,110 +26,113 @@ import cn.odboy.system.dal.mysql.SystemUserMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class SystemJobService { - @Autowired private SystemJobMapper systemJobMapper; - @Autowired private SystemUserMapper systemUserMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveJob(SystemCreateJobArgs args) { - SystemJobTb job = systemJobMapper.getJobByName(args.getName()); - if (job != null) { - throw new BadRequestException("职位名称已存在"); - } - systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); - } + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemUserMapper systemUserMapper; - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyJobById(SystemJobTb args) { - SystemJobTb job = systemJobMapper.selectById(args.getId()); - SystemJobTb old = systemJobMapper.getJobByName(args.getName()); - if (old != null && !old.getId().equals(args.getId())) { - throw new BadRequestException("职位名称已存在"); - } - args.setId(job.getId()); - systemJobMapper.insertOrUpdate(args); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveJob(SystemCreateJobArgs args) { + SystemJobTb job = systemJobMapper.getJobByName(args.getName()); + if (job != null) { + throw new BadRequestException("职位名称已存在"); } + systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeJobByIds(Set ids) { - systemJobMapper.deleteByIds(ids); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyJobById(SystemJobTb args) { + SystemJobTb job = systemJobMapper.selectById(args.getId()); + SystemJobTb old = systemJobMapper.getJobByName(args.getName()); + if (old != null && !old.getId().equals(args.getId())) { + throw new BadRequestException("职位名称已存在"); } + args.setId(job.getId()); + systemJobMapper.insertOrUpdate(args); + } - /** - * 导出数据 - * - * @param jobs 待导出的数据 - * @param response / - * @throws IOException - */ - public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemJobTb job : jobs) { - Map map = new LinkedHashMap<>(); - map.put("岗位名称", job.getName()); - map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); - map.put("创建日期", job.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeJobByIds(Set ids) { + systemJobMapper.deleteByIds(ids); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return - */ - public KitPageResult queryJobByArgs(SystemQueryJobArgs args, Page page) { - return KitPageUtil.toPage(systemJobMapper.selectJobByArgs(args, page)); + /** + * 导出数据 + * + * @param jobs 待导出的数据 + * @param response / + * @throws IOException + */ + public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemJobTb job : jobs) { + Map map = new LinkedHashMap<>(); + map.put("岗位名称", job.getName()); + map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); + map.put("创建日期", job.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param args / - * @return / - */ - public List queryJobByArgs(SystemQueryJobArgs args) { - return systemJobMapper.selectJobByArgs(args); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return + */ + public KitPageResult queryJobByArgs(SystemQueryJobArgs args, Page page) { + return KitPageUtil.toPage(systemJobMapper.selectJobByArgs(args, page)); + } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserMapper.countUserByJobIds(ids) > 0) { - throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); - } + /** + * 查询全部数据 + * + * @param args / + * @return / + */ + public List queryJobByArgs(SystemQueryJobArgs args) { + return systemJobMapper.selectJobByArgs(args); + } + + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserMapper.countUserByJobIds(ids) > 0) { + throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); } + } } 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 cbf9cb0a..a4a99df9 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 @@ -29,7 +29,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -37,6 +36,7 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,120 +44,124 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemLocalStorageService { - @Autowired private SystemLocalStorageMapper systemLocalStorageMapper; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired private AppProperties properties; - /** - * 上传 - * - * @param name 文件名称 - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { - long size = multipartFile.getSize(); - KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); - String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); - String type = KitFileUtil.getFileType(suffix); - String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); - File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); - if (file == null) { - throw new BadRequestException("上传失败"); - } - try { - String formatSize = KitFileUtil.getSize(size); - String prefixName = - StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; - SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); - localStorage.setRealName(file.getName()); - localStorage.setName(prefixName); - localStorage.setSuffix(suffix); - localStorage.setPath(file.getPath()); - localStorage.setType(type); - localStorage.setSize(formatSize); - localStorage.setDateGroup(uploadDateStr); - systemLocalStorageMapper.insert(localStorage); - return localStorage; - } catch (Exception e) { - KitFileUtil.del(file); - throw e; - } - } + @Autowired + private SystemLocalStorageMapper systemLocalStorageMapper; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private AppProperties properties; - /** - * 编辑 - * - * @param args 文件信息 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyLocalStorageById(SystemLocalStorageTb args) { - SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); - localStorage.copy(args); - systemLocalStorageMapper.insertOrUpdate(localStorage); + /** + * 上传 + * + * @param name 文件名称 + * @param multipartFile 文件 + * @return / + */ + @Transactional(rollbackFor = Exception.class) + public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { + long size = multipartFile.getSize(); + KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); + String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); + String type = KitFileUtil.getFileType(suffix); + String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); + File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); + if (file == null) { + throw new BadRequestException("上传失败"); } + try { + String formatSize = KitFileUtil.getSize(size); + String prefixName = + StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; + SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); + localStorage.setRealName(file.getName()); + localStorage.setName(prefixName); + localStorage.setSuffix(suffix); + localStorage.setPath(file.getPath()); + localStorage.setType(type); + localStorage.setSize(formatSize); + localStorage.setDateGroup(uploadDateStr); + systemLocalStorageMapper.insert(localStorage); + return localStorage; + } catch (Exception e) { + KitFileUtil.del(file); + throw e; + } + } - /** - * 多选删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeFileByIds(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 文件信息 + */ + @Transactional(rollbackFor = Exception.class) + public void modifyLocalStorageById(SystemLocalStorageTb args) { + SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); + localStorage.copy(args); + systemLocalStorageMapper.insertOrUpdate(localStorage); + } - /** - * 导出数据 - * - * @param localStorages 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemLocalStorageTb localStorage : localStorages) { - Map map = new LinkedHashMap<>(); - map.put("文件名", localStorage.getRealName()); - map.put("备注名", localStorage.getName()); - map.put("文件类型", localStorage.getType()); - map.put("文件大小", localStorage.getSize()); - map.put("创建者", localStorage.getCreateBy()); - map.put("创建日期", localStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 多选删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeFileByIds(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 criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryLocalStorage(SystemQueryStorageArgs criteria, - Page page) { - return KitPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page)); + /** + * 导出数据 + * + * @param localStorages 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemLocalStorageTb localStorage : localStorages) { + Map map = new LinkedHashMap<>(); + map.put("文件名", localStorage.getRealName()); + map.put("备注名", localStorage.getName()); + map.put("文件类型", localStorage.getType()); + map.put("文件大小", localStorage.getSize()); + map.put("创建者", localStorage.getCreateBy()); + map.put("创建日期", localStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param criteria 条件 - * @return / - */ - public List queryLocalStorage(SystemQueryStorageArgs criteria) { - return systemLocalStorageMapper.selectLocalStorageByArgs(criteria); - } + /** + * 分页查询 + * + * @param criteria 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryLocalStorage(SystemQueryStorageArgs criteria, + Page page) { + return KitPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page)); + } + + /** + * 查询全部数据 + * + * @param criteria 条件 + * @return / + */ + public List queryLocalStorage(SystemQueryStorageArgs criteria) { + return systemLocalStorageMapper.selectLocalStorageByArgs(criteria); + } } 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 421b938b..0c9fdbf8 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 @@ -28,12 +28,12 @@ import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemMenuMetaVo; import cn.odboy.system.dal.model.SystemMenuVo; import cn.odboy.system.dal.model.SystemQueryMenuArgs; +import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -45,357 +45,363 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class SystemMenuService { - private static final String YES_STR = "是"; - private static final String NO_STR = "否"; - @Autowired private SystemMenuMapper systemMenuMapper; - @Autowired private SystemRoleMenuMapper systemRoleMenuMapper; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemRoleMenuService systemRoleMenuService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveMenu(SystemMenuTb args) { - if (systemMenuMapper.getMenuByTitle(args.getTitle()) != null) { - throw new BadRequestException("菜单标题已存在"); - } - if (StrUtil.isNotBlank(args.getComponentName())) { - if (systemMenuMapper.getMenuByComponentName(args.getComponentName()) != null) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - if (Long.valueOf(0L).equals(args.getPid())) { - args.setPid(null); - } - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - systemMenuMapper.insert(args); - // 计算子节点数目 - args.setSubCount(0); - // 更新父节点菜单数目 - this.updateMenuSubCnt(args.getPid()); + private static final String YES_STR = "是"; + private static final String NO_STR = "否"; + @Autowired + private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuMapper systemRoleMenuMapper; + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveMenu(SystemMenuTb args) { + if (systemMenuMapper.getMenuByTitle(args.getTitle()) != null) { + throw new BadRequestException("菜单标题已存在"); } - - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyMenuById(SystemMenuTb args) { - if (args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); - } - SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - SystemMenuTb menu1 = systemMenuMapper.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 = systemMenuMapper.getMenuByComponentName(args.getComponentName()); - if (menu1 != null && !menu1.getId().equals(menu.getId())) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - menu.setTitle(args.getTitle()); - menu.setComponent(args.getComponent()); - menu.setPath(args.getPath()); - menu.setIcon(args.getIcon()); - menu.setIFrame(args.getIFrame()); - menu.setPid(args.getPid()); - menu.setMenuSort(args.getMenuSort()); - menu.setCache(args.getCache()); - menu.setHidden(args.getHidden()); - menu.setComponentName(args.getComponentName()); - menu.setPermission(args.getPermission()); - menu.setType(args.getType()); - // auto fill - menu.setUpdateBy(null); - menu.setUpdateTime(null); - systemMenuMapper.insertOrUpdate(menu); - // 计算父级菜单节点数目 - this.updateMenuSubCnt(oldPid); - this.updateMenuSubCnt(newPid); + if (StrUtil.isNotBlank(args.getComponentName())) { + if (systemMenuMapper.getMenuByComponentName(args.getComponentName()) != null) { + throw new BadRequestException("菜单组件名称已存在"); + } } - - /** - * 删除 - */ - @Transactional(rollbackFor = Exception.class) - public void removeMenuByIds(Set ids) { - Set menuSet = new HashSet<>(); - for (Long id : ids) { - List menuList = this.queryMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = this.queryChildMenu(menuList, menuSet); - } - List menuIds = - menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(menuIds)) { - KitSpringBeanHolder.getBean(SystemMenuService.class).removeRoleMenuByMenuIds(menuIds); - systemMenuMapper.deleteByIds(menuIds); - } - for (SystemMenuTb menu : menuSet) { - this.updateMenuSubCnt(menu.getPid()); - } + if (Long.valueOf(0L).equals(args.getPid())) { + args.setPid(null); } + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + systemMenuMapper.insert(args); + // 计算子节点数目 + args.setSubCount(0); + // 更新父节点菜单数目 + this.updateMenuSubCnt(args.getPid()); + } - @Transactional(rollbackFor = Exception.class) - public void removeRoleMenuByMenuIds(List menuIds) { - if (CollUtil.isNotEmpty(menuIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); - systemRoleMenuMapper.delete(wrapper); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyMenuById(SystemMenuTb args) { + if (args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); + } + SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + SystemMenuTb menu1 = systemMenuMapper.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 = systemMenuMapper.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 removeMenuByIds(Set ids) { + Set menuSet = new HashSet<>(); + for (Long id : ids) { + List menuList = this.queryMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = this.queryChildMenu(menuList, menuSet); + } + List menuIds = + menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(menuIds)) { + KitSpringBeanHolder.getBean(SystemMenuService.class).removeRoleMenuByMenuIds(menuIds); + systemMenuMapper.deleteByIds(menuIds); + } + for (SystemMenuTb menu : menuSet) { + this.updateMenuSubCnt(menu.getPid()); + } + } + + @Transactional(rollbackFor = Exception.class) + public void removeRoleMenuByMenuIds(List menuIds) { + if (CollUtil.isNotEmpty(menuIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); + systemRoleMenuMapper.delete(wrapper); + } + } + + /** + * 导出 + * + * @param menus 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemMenuTb menu : menus) { + Map map = new LinkedHashMap<>(); + map.put("菜单标题", menu.getTitle()); + map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); + map.put("权限标识", menu.getPermission()); + map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); + map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); + map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); + map.put("创建日期", menu.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + @Transactional(rollbackFor = Exception.class) + public void updateMenuSubCnt(Long menuId) { + if (menuId != null) { + long count = systemMenuMapper.countMenuByPid(menuId); + systemMenuMapper.updateMenuSubCntByMenuId(count, menuId); + } + } + + /** + * 查询全部数据 + * + * @param criteria 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllMenu(SystemQueryMenuArgs criteria, Boolean isQuery) throws Exception { + if (Boolean.TRUE.equals(isQuery)) { + criteria.setPidIsNull(true); + List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); + for (Field field : fields) { + //设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(criteria); + if ("pidIsNull".equals(field.getName())) { + continue; } - } - - /** - * 导出 - * - * @param menus 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - Map map = new LinkedHashMap<>(); - map.put("菜单标题", menu.getTitle()); - map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); - map.put("权限标识", menu.getPermission()); - map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); - map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); - map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); - map.put("创建日期", menu.getCreateTime()); - list.add(map); + // 如果有查询条件, 则不指定pidIsNull + if (ObjectUtil.isNotNull(val)) { + criteria.setPidIsNull(null); + break; } - KitFileUtil.downloadExcel(list, response); + } } + return systemMenuMapper.selectMenuByArgs(criteria); + } - @Transactional(rollbackFor = Exception.class) - public void updateMenuSubCnt(Long menuId) { - if (menuId != null) { - long count = systemMenuMapper.countMenuByPid(menuId); - systemMenuMapper.updateMenuSubCntByMenuId(count, menuId); + /** + * 根据当前用户获取菜单 + * + * @param currentUserId / + * @return / + */ + public List queryMenuListByUserId(Long currentUserId) { + List roles = systemRoleService.queryRoleByUsersId(currentUserId); + Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); + return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIdsAndType(roleIds, 2)); + } + + /** + * 获取所有子节点, 包含自身ID + * + * @param menuList / + * @param menuSet / + * @return / + */ + public Set queryChildMenu(List menuList, Set menuSet) { + for (SystemMenuTb menu : menuList) { + menuSet.add(menu); + List menus = systemMenuMapper.selectMenuByPid(menu.getId()); + if (CollUtil.isNotEmpty(menus)) { + queryChildMenu(menus, menuSet); + } + } + return menuSet; + } + + /** + * 懒加载菜单数据 + * + * @param pid / + * @return / + */ + public List queryMenuByPid(Long pid) { + List menus; + if (pid != null && !pid.equals(0L)) { + menus = systemMenuMapper.selectMenuByPid(pid); + } else { + menus = systemMenuMapper.selectMenuByPidIsNull(); + } + return menus; + } + + /** + * 根据ID获取同级与上级数据 + * + * @param menu / + * @param menus / + * @return / + */ + public List querySuperiorMenuList(SystemMenuTb menu, List menus) { + if (menu.getPid() == null) { + menus.addAll(systemMenuMapper.selectMenuByPidIsNull()); + return menus; + } + menus.addAll(systemMenuMapper.selectMenuByPid(menu.getPid())); + return querySuperiorMenuList(systemMenuMapper.selectById(menu.getPid()), menus); + } + + /** + * 构建菜单树 + * + * @param menus 原始数据 + * @return / + */ + public List buildMenuTree(List menus) { + List trees = new ArrayList<>(); + Set ids = new HashSet<>(); + for (SystemMenuTb menu : menus) { + if (menu.getPid() == null) { + trees.add(menu); + } + for (SystemMenuTb it : menus) { + if (menu.getId().equals(it.getPid())) { + if (menu.getChildren() == null) { + menu.setChildren(new ArrayList<>()); + } + menu.getChildren().add(it); + ids.add(it.getId()); } + } } - - /** - * 查询全部数据 - * - * @param criteria 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllMenu(SystemQueryMenuArgs criteria, Boolean isQuery) throws Exception { - if (Boolean.TRUE.equals(isQuery)) { - criteria.setPidIsNull(true); - List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); - for (Field field : fields) { - //设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(criteria); - if ("pidIsNull".equals(field.getName())) { - continue; - } - // 如果有查询条件, 则不指定pidIsNull - if (ObjectUtil.isNotNull(val)) { - criteria.setPidIsNull(null); - break; - } - } - } - return systemMenuMapper.selectMenuByArgs(criteria); + if (CollUtil.isNotEmpty(trees)) { + trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); } + return trees; + } - /** - * 根据当前用户获取菜单 - * - * @param currentUserId / - * @return / - */ - public List queryMenuListByUserId(Long currentUserId) { - List roles = systemRoleService.queryRoleByUsersId(currentUserId); - Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); - return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIdsAndType(roleIds, 2)); - } - - /** - * 获取所有子节点, 包含自身ID - * - * @param menuList / - * @param menuSet / - * @return / - */ - public Set queryChildMenu(List menuList, Set menuSet) { - for (SystemMenuTb menu : menuList) { - menuSet.add(menu); - List menus = systemMenuMapper.selectMenuByPid(menu.getId()); - if (CollUtil.isNotEmpty(menus)) { - queryChildMenu(menus, menuSet); - } - } - return menuSet; - } - - /** - * 懒加载菜单数据 - * - * @param pid / - * @return / - */ - public List queryMenuByPid(Long pid) { - List menus; - if (pid != null && !pid.equals(0L)) { - menus = systemMenuMapper.selectMenuByPid(pid); - } else { - menus = systemMenuMapper.selectMenuByPidIsNull(); - } - return menus; - } - - /** - * 根据ID获取同级与上级数据 - * - * @param menu / - * @param menus / - * @return / - */ - public List querySuperiorMenuList(SystemMenuTb menu, List menus) { - if (menu.getPid() == null) { - menus.addAll(systemMenuMapper.selectMenuByPidIsNull()); - return menus; - } - menus.addAll(systemMenuMapper.selectMenuByPid(menu.getPid())); - return querySuperiorMenuList(systemMenuMapper.selectById(menu.getPid()), menus); - } - - /** - * 构建菜单树 - * - * @param menus 原始数据 - * @return / - */ - public List buildMenuTree(List menus) { - List trees = new ArrayList<>(); - Set ids = new HashSet<>(); - for (SystemMenuTb menu : menus) { - if (menu.getPid() == null) { - trees.add(menu); - } - for (SystemMenuTb it : menus) { - if (menu.getId().equals(it.getPid())) { - if (menu.getChildren() == null) { - menu.setChildren(new ArrayList<>()); - } - menu.getChildren().add(it); - ids.add(it.getId()); - } - } - } - if (CollUtil.isNotEmpty(trees)) { - trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); - } - return trees; - } - - /** - * 构建菜单树 - * - * @param menus / - * @return / - */ - public List buildMenuVo(List menus) { - List list = new LinkedList<>(); - menus.forEach(menu -> { - if (menu != null) { - List menuList = menu.getChildren(); - SystemMenuVo menuVo = new SystemMenuVo(); - menuVo.setName( - ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); - // 一级目录需要加斜杠, 不然会报警告 - menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); - menuVo.setHidden(menu.getHidden()); - // 如果不是外链 - if (!menu.getIFrame()) { - if (menu.getPid() == null) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); - // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 - } else if (menu.getType() == 0) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); - } else if (StrUtil.isNotBlank(menu.getComponent())) { - menuVo.setComponent(menu.getComponent()); - } - } - menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); - if (CollectionUtil.isNotEmpty(menuList)) { - menuVo.setAlwaysShow(true); - menuVo.setRedirect("noredirect"); - menuVo.setChildren(buildMenuVo(menuList)); - // 处理是一级菜单并且没有子菜单的情况 - } else if (menu.getPid() == null) { - SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); - menuVo.setName(null); - menuVo.setMeta(null); - menuVo.setComponent("Layout"); - List list1 = new ArrayList<>(); - list1.add(menuVo1); - menuVo.setChildren(list1); - } - list.add(menuVo); - } - }); - return list; - } - - /** - * 获取 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { - SystemMenuVo menuVo1 = new SystemMenuVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 + /** + * 构建菜单树 + * + * @param menus / + * @return / + */ + public List buildMenuVo(List menus) { + List list = new LinkedList<>(); + menus.forEach(menu -> { + if (menu != null) { + List menuList = menu.getChildren(); + SystemMenuVo menuVo = new SystemMenuVo(); + menuVo.setName( + ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); + // 一级目录需要加斜杠, 不然会报警告 + menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); + menuVo.setHidden(menu.getHidden()); + // 如果不是外链 if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); + if (menu.getPid() == null) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); + // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 + } else if (menu.getType() == 0) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); + } else if (StrUtil.isNotBlank(menu.getComponent())) { + menuVo.setComponent(menu.getComponent()); + } } - return menuVo1; - } + menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); + if (CollectionUtil.isNotEmpty(menuList)) { + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenuVo(menuList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if (menu.getPid() == null) { + SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); + menuVo.setName(null); + menuVo.setMeta(null); + menuVo.setComponent("Layout"); + List list1 = new ArrayList<>(); + list1.add(menuVo1); + menuVo.setChildren(list1); + } + list.add(menuVo); + } + }); + return list; + } - public List queryMenuByIds(List ids) { - return systemMenuMapper.selectByIds(ids); + /** + * 获取 MenuResponse + * + * @param menu / + * @param menuVo / + * @return / + */ + private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { + SystemMenuVo menuVo1 = new SystemMenuVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 + if (!menu.getIFrame()) { + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menu.getPath()); } + return menuVo1; + } + + public List queryMenuByIds(List ids) { + return systemMenuMapper.selectByIds(ids); + } } 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 bef3d544..a7d92fd7 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 @@ -43,172 +43,173 @@ import oshi.util.Util; @Slf4j @Service public class SystemMonitorService { - private final DecimalFormat df = new DecimalFormat("0.00"); - /** - * 查询服务器监控信息 - * - * @return Map - */ - public Map queryServerMonitorInfo() { - 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; - } + private final DecimalFormat df = new DecimalFormat("0.00"); - /** - * 获取磁盘信息 - * - * @return / - */ - private Map getDiskInfo(OperatingSystem os) { - Map diskInfo = new LinkedHashMap<>(); - FileSystem fileSystem = os.getFileSystem(); - List fsArray = fileSystem.getFileStores(); - String osName = System.getProperty("os.name"); - long available = 0, total = 0; - for (OSFileStore fs : fsArray) { - // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 - if (osName.toLowerCase().startsWith(SystemConst.WIN)) { - available += fs.getUsableSpace(); - total += fs.getTotalSpace(); - } else { - available = fs.getUsableSpace(); - total = fs.getTotalSpace(); - break; - } - } - long used = total - available; - diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); - diskInfo.put("available", KitFileUtil.getSize(available)); - diskInfo.put("used", KitFileUtil.getSize(used)); - if (total != 0) { - diskInfo.put("usageRate", df.format(used / (double)total * 100)); - } else { - diskInfo.put("usageRate", 0); - } - return diskInfo; + /** + * 查询服务器监控信息 + * + * @return Map + */ + public Map queryServerMonitorInfo() { + 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; + } - /** - * 获取交换区信息 - * - * @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 / + */ + private Map getDiskInfo(OperatingSystem os) { + Map diskInfo = new LinkedHashMap<>(); + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + String osName = System.getProperty("os.name"); + long available = 0, total = 0; + for (OSFileStore fs : fsArray) { + // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 + if (osName.toLowerCase().startsWith(SystemConst.WIN)) { + available += fs.getUsableSpace(); + total += fs.getTotalSpace(); + } else { + available = fs.getUsableSpace(); + total = fs.getTotalSpace(); + break; + } } + long used = total - available; + diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); + diskInfo.put("available", KitFileUtil.getSize(available)); + diskInfo.put("used", KitFileUtil.getSize(used)); + if (total != 0) { + diskInfo.put("usageRate", df.format(used / (double) total * 100)); + } else { + diskInfo.put("usageRate", 0); + } + return diskInfo; + } - /** - * 获取内存信息 - * - * @param memory / - * @return / - */ - private Map getMemoryInfo(GlobalMemory memory) { - Map memoryInfo = new LinkedHashMap<>(); - memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); - memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); - memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); - memoryInfo.put("usageRate", - df.format((memory.getTotal() - memory.getAvailable()) / (double)memory.getTotal() * 100)); - return memoryInfo; + /** + * 获取交换区信息 + * + * @param memory / + * @return / + */ + private Map 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; + } - /** - * 获取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; - } + /** + * 获取内存信息 + * + * @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; + } - /** - * 获取系统相关信息,系统、运行天数、系统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; + /** + * 获取Cpu相关信息 + * + * @param processor / + * @return / + */ + private Map getCpuInfo(CentralProcessor processor) { + Map cpuInfo = new LinkedHashMap<>(); + cpuInfo.put("name", processor.getProcessorIdentifier().getName()); + cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); + cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); + cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); + cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + // 默认等待300毫秒... + long time = 300; + Util.sleep(time); + long[] ticks = processor.getSystemCpuLoadTicks(); + long minCpuLoadTick = 1000; + while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) { + time += 25; + Util.sleep(25); + ticks = processor.getSystemCpuLoadTicks(); } + long user = + ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long nice = + ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long sys = + ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long idle = + ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long ioWait = + ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long irq = + ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - + prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = + ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; + cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); + cpuInfo.put("idle", df.format(100d * idle / totalCpu)); + return cpuInfo; + } + + /** + * 获取系统相关信息,系统、运行天数、系统IP + * + * @param os / + * @return / + */ + private Map getSystemInfo(OperatingSystem os) { + Map systemInfo = new LinkedHashMap<>(); + // jvm 运行时间 + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + // 计算项目运行时间 + String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); + // 系统信息 + systemInfo.put("os", os.toString()); + systemInfo.put("day", formatBetween); + systemInfo.put("ip", KitIPUtil.getLocalIp()); + return systemInfo; + } } 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 8039dfc9..4cca8d5c 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemOssStorageService.java @@ -21,9 +21,9 @@ import cn.odboy.system.dal.model.SystemOssStorageVo; import cn.odboy.system.dal.model.SystemQueryStorageArgs; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; /** @@ -35,9 +35,14 @@ import org.springframework.web.multipart.MultipartFile; * @since 2025-07-15 */ public interface SystemOssStorageService extends IService { - KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, Page page); - List queryOssStorage(SystemQueryStorageArgs criteria); - void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; - String uploadFile(MultipartFile file); - void removeFileByIds(Long[] ids); + + KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, Page page); + + List queryOssStorage(SystemQueryStorageArgs criteria); + + void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; + + String uploadFile(MultipartFile file); + + void removeFileByIds(Long[] ids); } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemQuartzJobService.java index 652c0bdf..df53f672 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 @@ -33,7 +33,6 @@ import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -41,6 +40,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import jakarta.servlet.http.HttpServletResponse; import org.quartz.CronExpression; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -48,261 +48,266 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemQuartzJobService { - @Autowired private SystemQuartzJobMapper systemQuartzJobMapper; - @Autowired private SystemQuartzLogMapper systemQuartzLogMapper; - @Autowired private QuartzManage quartzManage; - @Autowired private KitRedisHelper redisHelper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void createJob(SystemQuartzJobTb args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - systemQuartzJobMapper.insert(args); - quartzManage.addJob(args); - } + @Autowired + private SystemQuartzJobMapper systemQuartzJobMapper; + @Autowired + private SystemQuartzLogMapper systemQuartzLogMapper; + @Autowired + private QuartzManage quartzManage; + @Autowired + private KitRedisHelper redisHelper; - /** - * 修改任务并重新调度 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - if (StrUtil.isNotBlank(args.getSubTask())) { - List tasks = Arrays.asList(args.getSubTask().split("[,,]")); - if (tasks.contains(args.getId().toString())) { - throw new BadRequestException("子任务中不能添加当前任务ID"); - } - } - SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(quartzJob); - quartzManage.updateJobCron(quartzJob); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void createJob(SystemQuartzJobTb args) { + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); } + systemQuartzJobMapper.insert(args); + quartzManage.addJob(args); + } - /** - * 更改定时任务状态 - * - * @param quartzJob / - */ - @Transactional(rollbackFor = Exception.class) - public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { - // 置换暂停状态 - if (quartzJob.getIsPause()) { - quartzManage.resumeJob(quartzJob); - quartzJob.setIsPause(false); - } else { - quartzManage.pauseJob(quartzJob); - quartzJob.setIsPause(true); - } - systemQuartzJobMapper.insertOrUpdate(quartzJob); + /** + * 修改任务并重新调度 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); } + if (StrUtil.isNotBlank(args.getSubTask())) { + List tasks = Arrays.asList(args.getSubTask().split("[,,]")); + if (tasks.contains(args.getId().toString())) { + throw new BadRequestException("子任务中不能添加当前任务ID"); + } + } + SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(quartzJob); + quartzManage.updateJobCron(quartzJob); + } - /** - * 立即执行定时任务 - * - * @param quartzJob / - */ - public void startQuartzJob(SystemQuartzJobTb quartzJob) { - quartzManage.runJobNow(quartzJob); + /** + * 更改定时任务状态 + * + * @param quartzJob / + */ + @Transactional(rollbackFor = Exception.class) + public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { + // 置换暂停状态 + if (quartzJob.getIsPause()) { + quartzManage.resumeJob(quartzJob); + quartzJob.setIsPause(false); + } else { + quartzManage.pauseJob(quartzJob); + quartzJob.setIsPause(true); } + systemQuartzJobMapper.insertOrUpdate(quartzJob); + } - /** - * 删除任务 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeJobByIds(Set ids) { - for (Long id : ids) { - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); - quartzManage.deleteJob(quartzJob); - systemQuartzJobMapper.deleteById(quartzJob); - } - } + /** + * 立即执行定时任务 + * + * @param quartzJob / + */ + public void startQuartzJob(SystemQuartzJobTb quartzJob) { + quartzManage.runJobNow(quartzJob); + } - /** - * 执行子任务 - * - * @param tasks / - * @throws InterruptedException / - */ - @Transactional(rollbackFor = Exception.class) - public void startSubQuartJob(String[] tasks) throws InterruptedException { - for (String id : tasks) { - if (StrUtil.isBlank(id)) { - // 如果是手动清除子任务id, 会出现id为空字符串的问题 - continue; - } - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); - if (quartzJob == null) { - // 防止子任务不存在 - continue; - } - // 执行任务 - String uuid = IdUtil.simpleUUID(); - quartzJob.setUuid(uuid); - // 执行任务 - startQuartzJob(quartzJob); - // 获取执行状态, 如果执行失败则停止后面的子任务执行 - Boolean result = redisHelper.get(uuid, Boolean.class); - while (result == null) { - // 休眠5秒, 再次获取子任务执行情况 - Thread.sleep(5000); - result = redisHelper.get(uuid, Boolean.class); - } - if (!result) { - redisHelper.del(uuid); - break; - } - } + /** + * 删除任务 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeJobByIds(Set ids) { + for (Long id : ids) { + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); + quartzManage.deleteJob(quartzJob); + systemQuartzJobMapper.deleteById(quartzJob); } + } - /** - * 导出定时任务 - * - * @param quartzJobs 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzJobTb quartzJob : quartzJobs) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzJob.getJobName()); - map.put("Bean名称", quartzJob.getBeanName()); - map.put("执行方法", quartzJob.getMethodName()); - map.put("参数", quartzJob.getParams()); - map.put("表达式", quartzJob.getCronExpression()); - map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); - map.put("描述", quartzJob.getDescription()); - map.put("创建日期", quartzJob.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 执行子任务 + * + * @param tasks / + * @throws InterruptedException / + */ + @Transactional(rollbackFor = Exception.class) + public void startSubQuartJob(String[] tasks) throws InterruptedException { + for (String id : tasks) { + if (StrUtil.isBlank(id)) { + // 如果是手动清除子任务id, 会出现id为空字符串的问题 + continue; + } + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); + if (quartzJob == null) { + // 防止子任务不存在 + continue; + } + // 执行任务 + String uuid = IdUtil.simpleUUID(); + quartzJob.setUuid(uuid); + // 执行任务 + startQuartzJob(quartzJob); + // 获取执行状态, 如果执行失败则停止后面的子任务执行 + Boolean result = redisHelper.get(uuid, Boolean.class); + while (result == null) { + // 休眠5秒, 再次获取子任务执行情况 + Thread.sleep(5000); + result = redisHelper.get(uuid, Boolean.class); + } + if (!result) { + redisHelper.del(uuid); + break; + } } + } - /** - * 导出定时任务日志 - * - * @param queryAllLog 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzLogTb quartzLog : queryAllLog) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzLog.getJobName()); - map.put("Bean名称", quartzLog.getBeanName()); - map.put("执行方法", quartzLog.getMethodName()); - map.put("参数", quartzLog.getParams()); - map.put("表达式", quartzLog.getCronExpression()); - map.put("异常详情", quartzLog.getExceptionDetail()); - map.put("耗时/毫秒", quartzLog.getTime()); - map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); - map.put("创建日期", quartzLog.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出定时任务 + * + * @param quartzJobs 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzJobTb quartzJob : quartzJobs) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzJob.getJobName()); + map.put("Bean名称", quartzJob.getBeanName()); + map.put("执行方法", quartzJob.getMethodName()); + map.put("参数", quartzJob.getParams()); + map.put("表达式", quartzJob.getCronExpression()); + map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); + map.put("描述", quartzJob.getDescription()); + map.put("创建日期", quartzJob.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(criteria, wrapper); - return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); + /** + * 导出定时任务日志 + * + * @param queryAllLog 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzLogTb quartzLog : queryAllLog) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzLog.getJobName()); + map.put("Bean名称", quartzLog.getBeanName()); + map.put("执行方法", quartzLog.getMethodName()); + map.put("参数", quartzLog.getParams()); + map.put("表达式", quartzLog.getCronExpression()); + map.put("异常详情", quartzLog.getExceptionDetail()); + map.put("耗时/毫秒", quartzLog.getTime()); + map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); + map.put("创建日期", quartzLog.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs criteria, - LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzJobTb::getJobName, - criteria.getJobName()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzJobTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzJobTb::getId); - } + /** + * 分页查询 + * + * @param criteria 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(criteria, wrapper); + return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); + } - private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs criteria, - LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzLogTb::getJobName, - criteria.getJobName()); - wrapper.eq(criteria.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, criteria.getIsSuccess()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzLogTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzLogTb::getId); + private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs criteria, + LambdaQueryWrapper wrapper) { + if (criteria != null) { + wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzJobTb::getJobName, + criteria.getJobName()); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzJobTb::getUpdateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemQuartzJobTb::getId); + } - /** - * 分页查询日志 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(criteria, wrapper); - return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper)); + private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs criteria, + LambdaQueryWrapper wrapper) { + if (criteria != null) { + wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzLogTb::getJobName, + criteria.getJobName()); + wrapper.eq(criteria.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, criteria.getIsSuccess()); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzLogTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemQuartzLogTb::getId); + } - /** - * 查询全部 - * - * @param criteria 条件 - * @return / - */ - public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(criteria, wrapper); - return systemQuartzJobMapper.selectList(wrapper); - } + /** + * 分页查询日志 + * + * @param criteria 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(criteria, wrapper); + return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper)); + } - /** - * 查询全部 - * - * @param criteria 条件 - * @return / - */ - public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(criteria, wrapper); - return systemQuartzLogMapper.selectList(wrapper); - } + /** + * 查询全部 + * + * @param criteria 条件 + * @return / + */ + public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(criteria, wrapper); + return systemQuartzJobMapper.selectList(wrapper); + } - public SystemQuartzJobTb getQuartzJobById(Long id) { - return systemQuartzJobMapper.selectById(id); - } + /** + * 查询全部 + * + * @param criteria 条件 + * @return / + */ + public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(criteria, wrapper); + return systemQuartzLogMapper.selectList(wrapper); + } - public List queryEnableQuartzJob() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemQuartzJobTb::getIsPause, 0); - return systemQuartzJobMapper.selectList(wrapper); - } + public SystemQuartzJobTb getQuartzJobById(Long id) { + return systemQuartzJobMapper.selectById(id); + } + + public List queryEnableQuartzJob() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemQuartzJobTb::getIsPause, 0); + return systemQuartzJobMapper.selectList(wrapper); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleDeptService.java index e5e25f39..53bf44c4 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 @@ -31,46 +31,49 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleDeptService { - @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); - } - } + @Autowired + private SystemRoleDeptMapper systemRoleDeptMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; - @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); - } + @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); } + } - /** - * 根据角色id查询 - * - * @param roleId / - * @return / - */ - public List selectDeptByRoleId(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); + @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 selectDeptByRoleId(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); + } } 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 dbfd4da9..a0026224 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 @@ -32,56 +32,59 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleMenuService { - @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); + @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 (SystemMenuTb menu : menus) { + SystemRoleMenuTb record = new SystemRoleMenuTb(); + record.setMenuId(menu.getId()); + record.setRoleId(roleId); + records.add(record); + } + systemRoleMenuMapper.insert(records); + } + } + + @Transactional(rollbackFor = Exception.class) + public void batchDeleteRoleMenu(Set roleIds) { + if (CollUtil.isNotEmpty(roleIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); + systemRoleMenuMapper.delete(wrapper); + } + } + + public LinkedHashSet queryMenuByRoleIdsAndType(Set roleIds, int menuType) { + 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<>(); } - @Transactional(rollbackFor = Exception.class) - public void batchInsertRoleMenu(Set menus, Long roleId) { - if (CollUtil.isNotEmpty(menus)) { - List records = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - SystemRoleMenuTb record = new SystemRoleMenuTb(); - record.setMenuId(menu.getId()); - record.setRoleId(roleId); - records.add(record); - } - systemRoleMenuMapper.insert(records); - } - } - - @Transactional(rollbackFor = Exception.class) - public void batchDeleteRoleMenu(Set roleIds) { - if (CollUtil.isNotEmpty(roleIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - systemRoleMenuMapper.delete(wrapper); - } - } - - public LinkedHashSet queryMenuByRoleIdsAndType(Set roleIds, int menuType) { - if (CollUtil.isEmpty(roleIds)) { - return new LinkedHashSet<>(); - } - LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); - roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - List menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(menuIds)) { - return new LinkedHashSet<>(); - } - - LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); - menuWrapper.in(SystemMenuTb::getId, menuIds); - // 排除"按钮" - menuWrapper.ne(SystemMenuTb::getType, 2); - menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); - return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); - } + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.in(SystemMenuTb::getId, menuIds); + // 排除"按钮" + menuWrapper.ne(SystemMenuTb::getType, 2); + menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); + return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemRoleService.java index 3262f16a..1ab1ba51 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 @@ -24,236 +24,367 @@ import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; +import cn.odboy.system.dal.dataobject.SystemRoleMenuTb; +import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; +import cn.odboy.system.dal.dataobject.SystemUserRoleTb; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleCodeVo; +import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.dal.mysql.SystemRoleMapper; import cn.odboy.system.dal.mysql.SystemUserMapper; +import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; +import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; +import cn.odboy.system.dal.mysql.SystemUserRoleMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleService { - @Autowired private SystemRoleMapper systemRoleMapper; - @Autowired private SystemRoleMenuService systemRoleMenuService; - @Autowired private SystemUserMapper systemUserMapper; - @Autowired private SystemRoleDeptService systemRoleDeptService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveRole(SystemCreateRoleArgs args) { - if (this.getRoleByName(args.getName()) != null) { - throw new BadRequestException("角色名称已存在"); - } - systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); - // 判断是否有部门数据, 若有, 则需创建关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } - } + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemRoleMenuMapper systemRoleMenuMapper; + @Autowired + private SystemRoleDeptMapper systemRoleDeptMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; - private SystemRoleTb getRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectOne(wrapper); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveRole(SystemCreateRoleArgs args) { + if (this.getRoleByName(args.getName()) != null) { + throw new BadRequestException("角色名称已存在"); } + systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); + // 判断是否有部门数据, 若有, 则需创建关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } + } - /** - * 修改 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyRoleById(SystemRoleTb args) { - SystemRoleTb role = systemRoleMapper.selectById(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.setDepts(args.getDepts()); - role.setLevel(args.getLevel()); - // 更新 - systemRoleMapper.insertOrUpdate(role); - // 删除关联部门数据 - systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); - // 判断是否有部门数据, 若有, 则需更新关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } - } + private SystemRoleTb getRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectOne(wrapper); + } - /** - * 修改绑定的菜单 - * - * @param role / - */ - public void modifyBindMenuById(SystemRoleTb role) { - // 更新菜单 - systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); - // 判断是否为空 - if (CollUtil.isNotEmpty(role.getMenus())) { - systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); - } + /** + * 修改 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyRoleById(SystemRoleVo args) { + SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class); + SystemRoleTb role1 = this.getRoleByName(args.getName()); + if (role1 != null && !role1.getId().equals(role.getId())) { + throw new BadRequestException("角色名称已存在"); } + role.setName(args.getName()); + role.setDescription(args.getDescription()); + role.setDataScope(args.getDataScope()); + role.setDepts(args.getDepts()); + role.setLevel(args.getLevel()); + // 更新 + systemRoleMapper.insertOrUpdate(role); + // 删除关联部门数据 + systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); + // 判断是否有部门数据, 若有, 则需更新关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeRoleByIds(Set ids) { - systemRoleMapper.deleteByIds(ids); - // 删除角色部门关联数据、角色菜单关联数据 - systemRoleDeptService.batchDeleteRoleDept(ids); - systemRoleMenuService.batchDeleteRoleMenu(ids); + /** + * 修改绑定的菜单 + * + * @param role / + */ + public void modifyBindMenuById(SystemRoleVo role) { + // 更新菜单 + systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); + // 判断是否为空 + if (CollUtil.isNotEmpty(role.getMenus())) { + systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); } + } - /** - * 导出数据 - * - * @param roles 待导出的数据 - * @param response / - * @throws IOException - */ - public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemRoleTb role : roles) { - Map map = new LinkedHashMap<>(); - map.put("角色名称", role.getName()); - map.put("角色级别", role.getLevel()); - map.put("描述", role.getDescription()); - map.put("创建日期", role.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeRoleByIds(Set ids) { + systemRoleMapper.deleteByIds(ids); + // 删除角色部门关联数据、角色菜单关联数据 + systemRoleDeptService.batchDeleteRoleDept(ids); + systemRoleMenuService.batchDeleteRoleMenu(ids); + } - /** - * 查询全部角色 - * - * @return - */ - public List queryAllRole() { - return this.selectAllRole(); + /** + * 导出数据 + * + * @param roles 待导出的数据 + * @param response / + * @throws IOException + */ + public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemRoleVo role : roles) { + Map map = new LinkedHashMap<>(); + map.put("角色名称", role.getName()); + map.put("角色级别", role.getLevel()); + map.put("描述", role.getDescription()); + map.put("创建日期", role.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - private List selectAllRole() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.orderByAsc(SystemRoleTb::getLevel); - return systemRoleMapper.selectList(wrapper); - } + /** + * 查询全部角色 + * + * @return + */ + public List queryAllRole() { + return this.selectAllRole(); + } - /** - * 根据条件查询全部角色 - * - * @param criteria 条件 - * @return - */ - public List queryRoleByArgs(SystemQueryRoleArgs criteria) { - return systemRoleMapper.selectRoleByArgs(criteria); - } + private List selectAllRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(SystemRoleTb::getLevel); + return systemRoleMapper.selectList(wrapper); + } - /** - * 分页查询角色 - * - * @param criteria 条件 - * @param page 分页参数 - * @return - */ - public KitPageResult queryRoleByArgs(SystemQueryRoleArgs criteria, Page page) { - criteria.setOffset(page.offset()); - List roles = systemRoleMapper.selectRoleByArgs(criteria); - Long total = systemRoleMapper.countRoleByArgs(criteria); - return KitPageUtil.toPage(roles, total); + /** + * 根据条件查询全部角色 + * + * @param criteria 条件 + * @return + */ + public List queryRoleByArgs(SystemQueryRoleArgs criteria) { + // 查询角色基本信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), + c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or() + .like(SystemRoleTb::getDescription, criteria.getBlurry())); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemRoleTb::getLevel); + + // 分页处理 + if (criteria != null && criteria.getOffset() > 0 && criteria.getSize() != null) { + Page rolePage = new Page<>(criteria.getOffset() / criteria.getSize() + 1, criteria.getSize()); + Page page = systemRoleMapper.selectPage(rolePage, wrapper); + List roles = page.getRecords(); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } else { + List roles = systemRoleMapper.selectList(wrapper); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + } - /** - * 根据用户ID查询 - * - * @param userId 用户ID - * @return / - */ - public List queryRoleByUsersId(Long userId) { - return systemRoleMapper.selectRoleByUserId(userId); - } + /** + * 分页查询角色 + * + * @param criteria 条件 + * @param page 分页参数 + * @return + */ + public KitPageResult queryRoleByArgs(SystemQueryRoleArgs criteria, Page page) { + criteria.setOffset(page.offset()); + List roles = this.queryRoleByArgs(criteria); + Long total = systemRoleMapper.countRoleByArgs(criteria); + return KitPageUtil.toPage(roles, total); + } - /** - * 根据角色查询角色级别 - * - * @param roles / - * @return / - */ - public Integer getDeptLevelByRoles(Set roles) { - if (CollUtil.isEmpty(roles)) { - return Integer.MAX_VALUE; - } - Set roleSet = new HashSet<>(); - for (SystemRoleTb role : roles) { - roleSet.add(getRoleById(role.getId())); - } - return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + /** + * 根据用户ID查询 + * + * @param userId 用户ID + * @return / + */ + public List queryRoleByUsersId(Long userId) { + // 查询用户角色关联 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.eq(SystemUserRoleTb::getUserId, userId); + List userRoles = systemUserRoleMapper.selectList(userRoleWrapper); + + if (CollUtil.isEmpty(userRoles)) { + return new ArrayList<>(); } + + Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } - /** - * 获取用户权限信息 - * - * @param user 用户信息 - * @return 权限信息 - */ - public List buildUserRolePermissions(SystemUserTb user) { - Set permissions = new HashSet<>(); - // 如果是管理员直接返回 - if (user.getIsAdmin()) { - permissions.add("admin"); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - List roles = systemRoleMapper.selectRoleByUserId(user.getId()); - permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + public Integer getDeptLevelByRoles(Set roles) { + if (CollUtil.isEmpty(roles)) { + return Integer.MAX_VALUE; } + Set roleSet = new HashSet<>(); + for (SystemRoleTb role : roles) { + roleSet.add(getRoleById(role.getId())); + } + return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserMapper.countUserByRoleIds(ids) > 0) { - throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); - } + /** + * 获取用户权限信息 + * + * @param user 用户信息 + * @return 权限信息 + */ + public List buildUserRolePermissions(SystemUserTb user) { + Set permissions = new HashSet<>(); + // 如果是管理员直接返回 + if (user.getIsAdmin()) { + permissions.add("admin"); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); } + List roles = this.queryRoleByUsersId(user.getId()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) + .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemRoleTb getRoleById(Long id) { - return systemRoleMapper.selectById(id); + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserMapper.countUserByRoleIds(ids) > 0) { + throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); } + } + + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemRoleTb getRoleById(Long id) { + return systemRoleMapper.selectById(id); + } + + /** + * 根据ID查询角色详情(包含关联信息) + * + * @param id / + * @return / + */ + public SystemRoleVo getRoleVoById(Long id) { + SystemRoleTb role = systemRoleMapper.selectById(id); + if (role == null) { + return null; + } + return convertToRoleVo(role); + } + + /** + * 根据菜单ID查询角色 + * + * @param menuId 菜单ID + * @return / + */ + public List queryRoleByMenuId(Long menuId) { + // 查询包含该菜单的角色ID列表 + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.eq(SystemRoleMenuTb::getMenuId, menuId); + List roleMenuList = systemRoleMenuMapper.selectList(roleMenuWrapper); + + if (CollUtil.isEmpty(roleMenuList)) { + return new ArrayList<>(); + } + + Set roleIds = roleMenuList.stream().map(SystemRoleMenuTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + + /** + * 根据部门ID统计角色数量 + * + * @param deptIds 部门ID集合 + * @return / + */ + public Integer countRoleByDeptIds(Set deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return 0; + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); + return systemRoleDeptMapper.selectCount(wrapper).intValue(); + } + + /** + * 转换为SystemRoleVo并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + private SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; + } + + SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); + + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIdsAndType( + Collections.singleton(role.getId()), -1); + roleVo.setMenus(menus); + + // 查询关联的部门信息 + List depts = systemRoleDeptService.selectDeptByRoleId(role.getId()); + roleVo.setDepts(new LinkedHashSet<>(depts)); + + return roleVo; + } } 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 56e9f24c..90c450a6 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemUserJobService.java @@ -29,28 +29,30 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserJobService { - @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); - } - } + @Autowired + private SystemUserJobMapper systemUserJobMapper; - @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 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); + } + } } 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 a2e6e710..41a35584 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 @@ -29,28 +29,30 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserRoleService { - @Autowired private SystemUserRoleMapper systemUserRoleMapper; - @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); - } - } + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; - @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 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); + } + } } 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 1cf6bcae..8a2a0635 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 @@ -15,17 +15,28 @@ */ package cn.odboy.system.service; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; +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.SystemQueryUserArgs; +import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.dal.mysql.SystemUserMapper; +import cn.odboy.system.dal.mysql.SystemUserJobMapper; +import cn.odboy.system.dal.mysql.SystemUserRoleMapper; +import cn.odboy.system.dal.mysql.SystemJobMapper; +import cn.odboy.system.dal.mysql.SystemRoleMapper; +import cn.odboy.system.dal.mysql.SystemDeptMapper; import cn.odboy.system.dal.redis.SystemUserInfoDAO; import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; import cn.odboy.system.framework.permission.core.KitSecurityHelper; @@ -34,18 +45,19 @@ import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -53,288 +65,486 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemUserService { - @Autowired private SystemUserMapper systemUserMapper; - @Autowired private SystemUserJobService systemUserJobService; - @Autowired private SystemUserRoleService systemUserRoleService; - @Autowired private SystemUserInfoDAO systemUserInfoDAO; - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - /** - * 新增用户 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveUser(SystemUserTb args) { - args.setDeptId(args.getDept().getId()); - if (systemUserMapper.getUserByUsername(args.getUsername()) != null) { - throw new BadRequestException("用户名已存在"); - } - if (systemUserMapper.getUserByEmail(args.getEmail()) != null) { - throw new BadRequestException("邮箱已存在"); - } - if (systemUserMapper.getUserByPhone(args.getPhone()) != null) { - throw new BadRequestException("手机号已存在"); - } - systemUserMapper.insert(args); - // 保存用户岗位 - systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); - // 保存用户角色 - systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemUserJobService systemUserJobService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private SystemUserJobMapper systemUserJobMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; + + /** + * 新增用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveUser(SystemUserVo args) { + args.setDeptId(args.getDept().getId()); + if (systemUserMapper.getUserByUsername(args.getUsername()) != null) { + throw new BadRequestException("用户名已存在"); + } + if (systemUserMapper.getUserByEmail(args.getEmail()) != null) { + throw new BadRequestException("邮箱已存在"); + } + if (systemUserMapper.getUserByPhone(args.getPhone()) != null) { + throw new BadRequestException("手机号已存在"); + } + systemUserMapper.insert(args); + // 保存用户岗位 + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 保存用户角色 + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } + + /** + * 编辑用户 + * + * @param args / + * @throws Exception / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyUserById(SystemUserVo args) { + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = systemUserMapper.getUserByUsername(args.getUsername()); + SystemUserTb user2 = systemUserMapper.getUserByEmail(args.getEmail()); + SystemUserTb user3 = systemUserMapper.getUserByPhone(args.getPhone()); + if (user1 != null && !user.getId().equals(user1.getId())) { + throw new BadRequestException("用户名已存在"); + } + if (user2 != null && !user.getId().equals(user2.getId())) { + throw new BadRequestException("邮箱已存在"); + } + if (user3 != null && !user.getId().equals(user3.getId())) { + throw new BadRequestException("手机号已存在"); + } + // 如果用户被禁用, 则清除用户登录信息 + if (!args.getEnabled()) { + systemUserOnlineInfoDAO.kickOutByUsername(args.getUsername()); + } + user.setDeptId(args.getDept().getId()); + user.setUsername(args.getUsername()); + user.setEmail(args.getEmail()); + user.setEnabled(args.getEnabled()); + user.setDept(args.getDept()); + user.setPhone(args.getPhone()); + user.setNickName(args.getNickName()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + // 清除用户登录缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 更新用户岗位 + systemUserJobService.batchDeleteUserJob(Collections.singleton(args.getId())); + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 更新用户角色 + systemUserRoleService.batchDeleteUserRole(Collections.singleton(args.getId())); + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } + + /** + * 用户自助修改资料 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void modifyUserCenterInfoById(SystemUserTb args) { + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = systemUserMapper.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 removeUserByIds(Set ids) { + for (Long id : ids) { + // 清理缓存 + SystemUserTb user = systemUserMapper.selectById(id); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + } + systemUserMapper.deleteByIds(ids); + // 删除用户岗位 + systemUserJobService.batchDeleteUserJob(ids); + // 删除用户角色 + systemUserRoleService.batchDeleteUserRole(ids); + } + + /** + * 修改密码 + * + * @param username 用户名 + * @param encryptPassword 密码 + */ + @Transactional(rollbackFor = Exception.class) + public void modifyUserPasswordByUsername(String username, String encryptPassword) { + systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } + + /** + * 重置密码 + * + * @param ids 用户id + * @param password 密码 + */ + @Transactional(rollbackFor = Exception.class) + public void resetUserPasswordByIds(Set ids, String password) { + List users = systemUserMapper.selectByIds(ids); + // 清除缓存 + users.forEach(user -> { + // 清除缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 强制退出 + systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); + }); + // 重置密码 + systemUserMapper.updateUserPasswordByUserIds(password, ids); + } + + /** + * 修改头像 + * + * @param multipartFile 文件 + * @return / + */ + @Transactional(rollbackFor = Exception.class) + public Map modifyUserAvatar(MultipartFile multipartFile) { + SystemUserTb user = systemUserMapper.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()); + }}; + } + + /** + * 修改邮箱 + * + * @param username 用户名 + * @param email 邮箱 + */ + @Transactional(rollbackFor = Exception.class) + public void modifyUserEmailByUsername(String username, String email) { + systemUserMapper.updateUserEmailByUsername(username, email); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } + + /** + * 导出数据 + * + * @param users 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportUserExcel(List users, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemUserVo user : users) { + List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUsername()); + map.put("角色", roles); + map.put("部门", user.getDept().getName()); + map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); + map.put("邮箱", user.getEmail()); + map.put("状态", user.getEnabled() ? "启用" : "禁用"); + map.put("手机号码", user.getPhone()); + map.put("修改密码的时间", user.getPwdResetTime()); + map.put("创建日期", user.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 查询全部 + * + * @param criteria 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult queryUserByArgs(SystemQueryUserArgs criteria, Page page) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(criteria); + IPage userPage = systemUserMapper.selectPage(page, wrapper); + List users = userPage.getRecords(); + + // 转换为SystemUserVo并关联查询 + List userVos = users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + + return KitPageUtil.toPage(userVos, userPage.getTotal()); + } + + /** + * 查询全部不分页 + * + * @param criteria 条件 + * @return / + */ + public List queryUserByArgs(SystemQueryUserArgs criteria) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(criteria); + List users = systemUserMapper.selectList(wrapper); + + // 转换为SystemUserVo并关联查询 + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } + + /** + * 根据ID查询 + * + * @param id ID + * @return / + */ + public SystemUserTb getUserById(long id) { + return systemUserMapper.selectById(id); + } + + /** + * 根据用户名查询 + * + * @param username / + * @return / + */ + public SystemUserTb getUserByUsername(String username) { + return systemUserMapper.getUserByUsername(username); + } + + public List queryUserMetadataOptions(KitPageArgs args) { + SystemQueryUserArgs criteria = args.getArgs(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); + wrapper.and(c -> { + c.eq(SystemUserTb::getPhone, criteria.getBlurry()); + c.or(); + c.eq(SystemUserTb::getEmail, criteria.getBlurry()); + c.or(); + c.like(SystemUserTb::getUsername, criteria.getBlurry()); + c.or(); + c.like(SystemUserTb::getNickName, criteria.getBlurry()); + }); + return systemUserMapper.selectPage(new Page<>(criteria.getPage(), 50), wrapper).getRecords().stream().map(m -> { + Map ext = new HashMap<>(1); + ext.put("id", m.getId()); + ext.put("deptId", m.getDeptId()); + ext.put("email", m.getEmail()); + ext.put("phone", m.getPhone()); + return KitSelectOptionVo.builder().label(m.getNickName()).value(String.valueOf(m.getId())).ext(ext).build(); + }).collect(Collectors.toList()); + } + + /** + * 根据角色ID查询用户 + * + * @param roleId 角色ID + * @return / + */ + public List selectUserByRoleId(Long roleId) { + // 查询用户角色关联 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.eq(SystemUserRoleTb::getRoleId, roleId); + List userRoles = systemUserRoleMapper.selectList(userRoleWrapper); + + if (CollUtil.isEmpty(userRoles)) { + return new ArrayList<>(); } - /** - * 编辑用户 - * - * @param args / - * @throws Exception / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserById(SystemUserTb args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = systemUserMapper.getUserByUsername(args.getUsername()); - SystemUserTb user2 = systemUserMapper.getUserByEmail(args.getEmail()); - SystemUserTb user3 = systemUserMapper.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.setRoles(args.getRoles()); - user.setDept(args.getDept()); - user.setJobs(args.getJobs()); - 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()); + Set userIds = userRoles.stream().map(SystemUserRoleTb::getUserId).collect(Collectors.toSet()); + List users = systemUserMapper.selectByIds(userIds); + + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } + + /** + * 根据部门ID查询用户 + * + * @param deptId 部门ID + * @return / + */ + public List selectUserByDeptId(Long deptId) { + // 查询部门关联的角色 + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.eq(SystemUserTb::getDeptId, deptId); + List users = systemUserMapper.selectList(userWrapper); + + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } + + /** + * 根据菜单ID查询用户 + * + * @param menuId 菜单ID + * @return / + */ + public List selectUserByMenuId(Long menuId) { + // 查询菜单角色关联 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + // 这里需要通过菜单角色关联表查询,暂时简化处理 + List users = systemUserMapper.selectList(null); + + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } + + /** + * 根据岗位ID统计用户数量 + * + * @param jobIds 岗位ID集合 + * @return / + */ + public Long countUserByJobIds(Set jobIds) { + if (CollUtil.isEmpty(jobIds)) { + return 0L; } - /** - * 用户自助修改资料 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserCenterInfoById(SystemUserTb args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = systemUserMapper.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()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserJobTb::getJobId, jobIds); + return systemUserJobMapper.selectCount(wrapper); + } + + /** + * 根据角色ID统计用户数量 + * + * @param roleIds 角色ID集合 + * @return / + */ + public Long countUserByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return 0L; } - /** - * 删除用户 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeUserByIds(Set ids) { - for (Long id : ids) { - // 清理缓存 - SystemUserTb user = systemUserMapper.selectById(id); - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - } - systemUserMapper.deleteByIds(ids); - // 删除用户岗位 - systemUserJobService.batchDeleteUserJob(ids); - // 删除用户角色 - systemUserRoleService.batchDeleteUserRole(ids); - } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getRoleId, roleIds); + return systemUserRoleMapper.selectCount(wrapper); + } - /** - * 修改密码 - * - * @param username 用户名 - * @param encryptPassword 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserPasswordByUsername(String username, String encryptPassword) { - systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + /** + * 根据用户名查询用户详情(包含关联信息) + * + * @param username 用户名 + * @return / + */ + public SystemUserVo getUserVoByUsername(String username) { + SystemUserTb user = systemUserMapper.getUserByUsername(username); + if (user == null) { + return null; } + return convertToUserVo(user); + } - /** - * 重置密码 - * - * @param ids 用户id - * @param password 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void resetUserPasswordByIds(Set ids, String password) { - List users = systemUserMapper.selectByIds(ids); - // 清除缓存 - users.forEach(user -> { - // 清除缓存 - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - // 强制退出 - systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); - }); - // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(password, ids); + /** + * 构建用户查询条件 + * + * @param criteria 查询条件 + * @return / + */ + private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs criteria) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + if (criteria.getId() != null) { + wrapper.eq(SystemUserTb::getId, criteria.getId()); + } + if (criteria.getEnabled() != null) { + wrapper.eq(SystemUserTb::getEnabled, criteria.getEnabled()); + } + if (CollUtil.isNotEmpty(criteria.getDeptIds())) { + wrapper.in(SystemUserTb::getDeptId, criteria.getDeptIds()); + } + if (StrUtil.isNotBlank(criteria.getBlurry())) { + wrapper.and(w -> w.like(SystemUserTb::getUsername, criteria.getBlurry()) + .or().like(SystemUserTb::getNickName, criteria.getBlurry()) + .or().like(SystemUserTb::getEmail, criteria.getBlurry())); + } + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemUserTb::getCreateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemUserTb::getCreateTime); + return wrapper; + } - /** - * 修改头像 - * - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public Map modifyUserAvatar(MultipartFile multipartFile) { - SystemUserTb user = systemUserMapper.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()); - }}; + /** + * 转换为SystemUserVo并关联查询部门、角色、岗位信息 + * + * @param user 用户基本信息 + * @return 包含关联信息的SystemUserVo + */ + private SystemUserVo convertToUserVo(SystemUserTb user) { + if (user == null) { + return null; } - - /** - * 修改邮箱 - * - * @param username 用户名 - * @param email 邮箱 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserEmailByUsername(String username, String email) { - systemUserMapper.updateUserEmailByUsername(username, email); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + SystemUserVo userVo = BeanUtil.copyProperties(user, SystemUserVo.class); + + // 查询关联的部门信息 + if (user.getDeptId() != null) { + SystemDeptTb dept = systemDeptMapper.selectById(user.getDeptId()); + userVo.setDept(dept); } - - /** - * 导出数据 - * - * @param users 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportUserExcel(List users, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemUserTb user : users) { - List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUsername()); - map.put("角色", roles); - map.put("部门", user.getDept().getName()); - map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); - map.put("邮箱", user.getEmail()); - map.put("状态", user.getEnabled() ? "启用" : "禁用"); - map.put("手机号码", user.getPhone()); - map.put("修改密码的时间", user.getPwdResetTime()); - map.put("创建日期", user.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + + // 查询关联的岗位信息 + LambdaQueryWrapper jobWrapper = new LambdaQueryWrapper<>(); + jobWrapper.eq(SystemUserJobTb::getUserId, user.getId()); + List userJobs = systemUserJobMapper.selectList(jobWrapper); + if (CollUtil.isNotEmpty(userJobs)) { + Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); + List jobs = systemJobMapper.selectByIds(jobIds); + userVo.setJobs(new LinkedHashSet<>(jobs)); } - - /** - * 查询全部 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryUserByArgs(SystemQueryUserArgs criteria, Page page) { - IPage users = systemUserMapper.selectUserByArgs(criteria, page); - return KitPageUtil.toPage(users); - } - - /** - * 查询全部不分页 - * - * @param criteria 条件 - * @return / - */ - public List queryUserByArgs(SystemQueryUserArgs criteria) { - return systemUserMapper.selectUserByArgs(criteria); - } - - /** - * 根据ID查询 - * - * @param id ID - * @return / - */ - public SystemUserTb getUserById(long id) { - return systemUserMapper.selectById(id); - } - - /** - * 根据用户名查询 - * - * @param username / - * @return / - */ - public SystemUserTb getUserByUsername(String username) { - return systemUserMapper.getUserByUsername(username); - } - - public List queryUserMetadataOptions(KitPageArgs args) { - SystemQueryUserArgs criteria = args.getArgs(); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); - wrapper.and(c -> { - c.eq(SystemUserTb::getPhone, criteria.getBlurry()); - c.or(); - c.eq(SystemUserTb::getEmail, criteria.getBlurry()); - c.or(); - c.like(SystemUserTb::getUsername, criteria.getBlurry()); - c.or(); - c.like(SystemUserTb::getNickName, criteria.getBlurry()); - }); - return systemUserMapper.selectPage(new Page<>(criteria.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()); + + // 查询关联的角色信息 + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.eq(SystemUserRoleTb::getUserId, user.getId()); + List userRoles = systemUserRoleMapper.selectList(roleWrapper); + if (CollUtil.isNotEmpty(userRoles)) { + Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + userVo.setRoles(new LinkedHashSet<>(roles)); } + + return userVo; + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java index 72767262..cb1749fb 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java @@ -36,13 +36,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -59,117 +59,122 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemOssStorageServiceImpl extends ServiceImpl implements SystemOssStorageService { - @Autowired private MinioRepository minioRepository; - @Autowired private AppProperties properties; - @Autowired private KitFileLocalUploadHelper fileLocalUploadHelper; - @Autowired private SystemOssStorageMapper systemOssStorageMapper; - @Override - public KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, - Page page) { - IPage ossStorageTbs = this.selectOssStorageByArgs(criteria, page); - IPage convert = ossStorageTbs.convert(c -> { - SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); - return storageVo; - }); - return KitPageUtil.toPage(convert); - } + @Autowired + private MinioRepository minioRepository; + @Autowired + private AppProperties properties; + @Autowired + private KitFileLocalUploadHelper fileLocalUploadHelper; + @Autowired + private SystemOssStorageMapper systemOssStorageMapper; - private IPage selectOssStorageByArgs(SystemQueryStorageArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemOssStorageTb::getFileName, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFilePrefix, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFileMime, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFileMd5, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemOssStorageTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper); - } + @Override + public KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(criteria, page); + IPage convert = ossStorageTbs.convert(c -> { + SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + return storageVo; + }); + return KitPageUtil.toPage(convert); + } - @Override - public List queryOssStorage(SystemQueryStorageArgs criteria) { - // 防止刷数据 - Page page = new Page<>(1, 500); - return queryOssStorage(criteria, page).getContent(); + private IPage selectOssStorageByArgs(SystemQueryStorageArgs criteria, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (criteria != null) { + wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), + c -> c.like(SystemOssStorageTb::getFileName, criteria.getBlurry()).or() + .like(SystemOssStorageTb::getFilePrefix, criteria.getBlurry()).or() + .like(SystemOssStorageTb::getFileMime, criteria.getBlurry()).or() + .like(SystemOssStorageTb::getFileMd5, criteria.getBlurry())); + if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { + wrapper.between(SystemOssStorageTb::getUpdateTime, criteria.getCreateTime().get(0), + criteria.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemOssStorageTb::getId); + return systemOssStorageMapper.selectPage(page, wrapper); + } - @Override - public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemOssStorageVo ossStorage : ossStorages) { - Map map = new LinkedHashMap<>(); - map.put("服务类型", ossStorage.getServiceType()); - map.put("服务地址", ossStorage.getEndpoint()); - map.put("存储桶名称", ossStorage.getBucketName()); - map.put("文件名称", ossStorage.getFileName()); - map.put("文件大小", ossStorage.getFileSizeDesc()); - map.put("文件类型", ossStorage.getFileMime()); - map.put("创建人", ossStorage.getCreateBy()); - map.put("创建日期", ossStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + @Override + public List queryOssStorage(SystemQueryStorageArgs criteria) { + // 防止刷数据 + Page page = new Page<>(1, 500); + return queryOssStorage(criteria, page).getContent(); + } - @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.getByMd5(md5); - if (systemOssStorageTb != null) { - // 重新生成7天链接 - return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); - } - // 上传到OSS - SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); - if (storageTb == null) { - throw new BadRequestException("文件上传失败"); - } - save(storageTb); - return minioRepository.generatePreviewUrl(storageTb.getObjectName()); + @Override + public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemOssStorageVo ossStorage : ossStorages) { + Map map = new LinkedHashMap<>(); + map.put("服务类型", ossStorage.getServiceType()); + map.put("服务地址", ossStorage.getEndpoint()); + map.put("存储桶名称", ossStorage.getBucketName()); + map.put("文件名称", ossStorage.getFileName()); + map.put("文件大小", ossStorage.getFileSizeDesc()); + map.put("文件类型", ossStorage.getFileMime()); + map.put("创建人", ossStorage.getCreateBy()); + map.put("创建日期", ossStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 多选删除 - * - * @param ids / - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void removeFileByIds(Long[] ids) { - for (Long id : ids) { - SystemOssStorageTb storage = getById(id); - minioRepository.removeBucketFile(storage.getObjectName()); - removeById(storage); - } + @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.getByMd5(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()); + } - private SystemOssStorageTb getByMd5(String md5) { - return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + /** + * 多选删除 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void removeFileByIds(Long[] ids) { + for (Long id : ids) { + SystemOssStorageTb storage = getById(id); + minioRepository.removeBucketFile(storage.getObjectName()); + removeById(storage); } + } + + private SystemOssStorageTb getByMd5(String md5) { + return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + } } diff --git a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java index 48404fc3..0d443168 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java +++ b/cutejava-springboot3/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package cn.odboy.system.util; import cn.odboy.framework.exception.BadRequestException; @@ -22,9 +21,6 @@ import cn.odboy.util.KitCloseUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.google.common.collect.Lists; import com.zaxxer.hikari.HikariDataSource; -import lombok.extern.slf4j.Slf4j; - -import javax.sql.DataSource; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; @@ -35,152 +31,156 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; @Slf4j public final class KitSqlUtil { - /** - * 获取数据源 - * - * @param jdbcUrl / - * @param userName / - * @param password / - * @return DataSource - */ - private static DataSource getDataSource(String jdbcUrl, String userName, String password) { - HikariDataSource druidDataSource = new HikariDataSource(); - String className; - try { - className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); - } catch (SQLException e) { - throw new BadRequestException("Get class name error: =" + jdbcUrl); + + /** + * 获取数据源 + * + * @param jdbcUrl / + * @param userName / + * @param password / + * @return DataSource + */ + private static DataSource getDataSource(String jdbcUrl, String userName, String password) { + HikariDataSource druidDataSource = new HikariDataSource(); + String className; + try { + className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); + } catch (SQLException e) { + throw new BadRequestException("Get class name error: =" + jdbcUrl); + } + if (StringUtils.isEmpty(className)) { + DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); + if (null == dataTypeEnum) { + throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); + } + druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); + } else { + druidDataSource.setDriverClassName(className); + } + druidDataSource.setJdbcUrl(jdbcUrl); + druidDataSource.setUsername(userName); + druidDataSource.setPassword(password); + druidDataSource.setConnectionTimeout(3000); + return druidDataSource; + } + + private static Connection getConnection(String jdbcUrl, String userName, String password) { + DataSource dataSource = getDataSource(jdbcUrl, userName, password); + Connection connection = null; + try { + connection = dataSource.getConnection(); + } catch (Exception ignored) { + } + try { + int timeOut = 5; + if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { + log.info("connection is closed or invalid, retry get connection!"); + connection = dataSource.getConnection(); + } + } catch (Exception e) { + log.error("create connection error, jdbcUrl: {}", jdbcUrl); + throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); + } finally { + KitCloseUtil.close(connection); + } + return connection; + } + + private static void releaseConnection(Connection connection) { + if (null != connection) { + try { + connection.close(); + } catch (Exception e) { + log.error(e.getMessage(), e); + log.error("connection close error:" + e.getMessage()); + } + } + } + + public static boolean testConnection(String jdbcUrl, String userName, String password) { + Connection connection = null; + try { + connection = getConnection(jdbcUrl, userName, password); + if (null != connection) { + return true; + } + } catch (Exception e) { + log.info("Get connection failed:" + e.getMessage()); + } finally { + releaseConnection(connection); + } + return false; + } + + public static String executeFile(String jdbcUrl, String username, String password, File sqlFile) { + Connection connection = getConnection(jdbcUrl, username, password); + try { + batchExecute(connection, readSqlList(sqlFile)); + } catch (Exception e) { + log.error("sql脚本执行发生异常:{}", e.getMessage()); + return e.getMessage(); + } finally { + releaseConnection(connection); + } + return "success"; + } + + /** + * 批量执行sql + * + * @param connection / + * @param sqlList / + */ + public static void batchExecute(Connection connection, List sqlList) { + Statement st = null; + try { + st = connection.createStatement(); + for (String sql : sqlList) { + if (sql.endsWith(";")) { + sql = sql.substring(0, sql.length() - 1); } - if (StringUtils.isEmpty(className)) { - DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); - if (null == dataTypeEnum) { - throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); - } - druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); + st.addBatch(sql); + } + st.executeBatch(); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } finally { + KitCloseUtil.close(st); + } + } + + /** + * 将文件中的sql语句以;为单位读取到列表中 + * + * @param sqlFile / + * @return / + * @throws Exception e + */ + private static List readSqlList(File sqlFile) throws Exception { + List sqlList = Lists.newArrayList(); + StringBuilder sb = new StringBuilder(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(Files.newInputStream(sqlFile.toPath()), StandardCharsets.UTF_8))) { + String tmp; + while ((tmp = reader.readLine()) != null) { + log.info("line:{}", tmp); + if (tmp.endsWith(";")) { + sb.append(tmp); + sqlList.add(sb.toString()); + sb.delete(0, sb.length()); } else { - druidDataSource.setDriverClassName(className); + sb.append(tmp); } - druidDataSource.setJdbcUrl(jdbcUrl); - druidDataSource.setUsername(userName); - druidDataSource.setPassword(password); - druidDataSource.setConnectionTimeout(3000); - return druidDataSource; - } - - private static Connection getConnection(String jdbcUrl, String userName, String password) { - DataSource dataSource = getDataSource(jdbcUrl, userName, password); - Connection connection = null; - try { - connection = dataSource.getConnection(); - } catch (Exception ignored) { - } - try { - int timeOut = 5; - if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { - log.info("connection is closed or invalid, retry get connection!"); - connection = dataSource.getConnection(); - } - } catch (Exception e) { - log.error("create connection error, jdbcUrl: {}", jdbcUrl); - throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); - } finally { - KitCloseUtil.close(connection); - } - return connection; - } - - private static void releaseConnection(Connection connection) { - if (null != connection) { - try { - connection.close(); - } catch (Exception e) { - log.error(e.getMessage(), e); - log.error("connection close error:" + e.getMessage()); - } - } - } - - public static boolean testConnection(String jdbcUrl, String userName, String password) { - Connection connection = null; - try { - connection = getConnection(jdbcUrl, userName, password); - if (null != connection) { - return true; - } - } catch (Exception e) { - log.info("Get connection failed:" + e.getMessage()); - } finally { - releaseConnection(connection); - } - return false; - } - - public static String executeFile(String jdbcUrl, String username, String password, File sqlFile) { - Connection connection = getConnection(jdbcUrl, username, password); - try { - batchExecute(connection, readSqlList(sqlFile)); - } catch (Exception e) { - log.error("sql脚本执行发生异常:{}", e.getMessage()); - return e.getMessage(); - } finally { - releaseConnection(connection); - } - return "success"; - } - - /** - * 批量执行sql - * - * @param connection / - * @param sqlList / - */ - public static void batchExecute(Connection connection, List sqlList) { - Statement st = null; - try { - st = connection.createStatement(); - for (String sql : sqlList) { - if (sql.endsWith(";")) { - sql = sql.substring(0, sql.length() - 1); - } - st.addBatch(sql); - } - st.executeBatch(); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } finally { - KitCloseUtil.close(st); - } - } - - /** - * 将文件中的sql语句以;为单位读取到列表中 - * - * @param sqlFile / - * @return / - * @throws Exception e - */ - private static List readSqlList(File sqlFile) throws Exception { - List sqlList = Lists.newArrayList(); - StringBuilder sb = new StringBuilder(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(Files.newInputStream(sqlFile.toPath()), StandardCharsets.UTF_8))) { - String tmp; - while ((tmp = reader.readLine()) != null) { - log.info("line:{}", tmp); - if (tmp.endsWith(";")) { - sb.append(tmp); - sqlList.add(sb.toString()); - sb.delete(0, sb.length()); - } else { - sb.append(tmp); - } - } - if (!"".endsWith(sb.toString().trim())) { - sqlList.add(sb.toString()); - } - } - return sqlList; + } + if (!"".endsWith(sb.toString().trim())) { + sqlList.add(sb.toString()); + } } + return sqlList; + } } 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 deleted file mode 100644 index 211b96e8..00000000 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml deleted file mode 100644 index d99d3bee..00000000 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml b/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml deleted file mode 100644 index 6041f971..00000000 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl b/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl index b326253a..78b79672 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl @@ -1,12 +1,12 @@ - - + + -
-

尊敬的用户, 您好:

-

您正在申请邮箱验证,您的验证码为:

-

+

尊敬的用户, 您好:

+

您正在申请邮箱验证,您的验证码为:

+

${code}

-
-
-
- Copyright ©${.now?string("yyyy")} CuteJava - 后台管理系统 All Rights Reserved. -
- + Copyright ©${.now?string("yyyy")} CuteJava + 后台管理系统 All Rights Reserved.
+ diff --git a/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemQuartzJobTaskAlarmTemplate.ftl b/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemQuartzJobTaskAlarmTemplate.ftl index c5ecdbb8..8857f068 100644 --- a/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemQuartzJobTaskAlarmTemplate.ftl +++ b/cutejava-springboot3/cutejava-module-system/src/main/resources/template/SystemQuartzJobTaskAlarmTemplate.ftl @@ -1,12 +1,12 @@ - - + + -
-

任务信息:

- - - - - - - - - - - - - - - - - -
任务名称Bean名称执行方法参数内容Cron表达式描述内容
${task.jobName}${task.beanName}${task.methodName}${(task.params)!""}${task.cronExpression}${(task.description)!""}
-
-
-

异常信息:

-
任务信息:

+ + + + + + + + + + + + + + + + + +
任务名称Bean名称执行方法参数内容Cron表达式描述内容
${task.jobName}${task.beanName}${task.methodName}${(task.params)!""}${task.cronExpression}${(task.description)!""}
+
+
+

异常信息:

+
                 ${msg}
             
-
-
-
-
- Copyright ©${.now?string("yyyy")} CuteJava - 后台管理系统 All Rights Reserved. -
- + Copyright ©${.now?string("yyyy")} CuteJava + 后台管理系统 All Rights Reserved. + diff --git a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/AppRun.java b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/AppRun.java index 83f60c1a..4079272e 100644 --- a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/AppRun.java +++ b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/AppRun.java @@ -17,12 +17,11 @@ package cn.odboy; import cn.odboy.framework.context.BootApplication; +import java.net.UnknownHostException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import java.net.UnknownHostException; - @EnableCaching @SpringBootApplication public class AppRun extends BootApplication { diff --git a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/GenCode.java b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/GenCode.java index abd23ad3..013599db 100644 --- a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/GenCode.java +++ b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/GenCode.java @@ -17,7 +17,6 @@ package cn.odboy; import cn.odboy.framework.mybatisplus.core.KitMpCmdGenUtil; - import java.util.List; /** @@ -41,6 +40,7 @@ public class GenCode { } private static void genTaskCode(KitMpCmdGenUtil generator) { - generator.gen("task", "", List.of("task_instance_info", "task_instance_detail", "task_template_info", "task_instance_step_detail")); + generator.gen("task", "", + List.of("task_instance_info", "task_instance_detail", "task_template_info", "task_instance_step_detail")); } } diff --git a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java index 6e5c3ed2..25d8b693 100644 --- a/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java +++ b/cutejava-springboot3/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java @@ -24,8 +24,7 @@ import org.springframework.stereotype.Component; @Component public class HealthCheckPointer implements KitHealthCheckPointService { - @Autowired - private SystemDictService systemDictService; + @Autowired private SystemDictService systemDictService; /** * 系统准备就绪 diff --git a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java index 3b129395..c6779315 100644 --- a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java +++ b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java @@ -21,16 +21,14 @@ import cn.hutool.core.date.DateUtil; 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.Date; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import java.util.Date; - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class MyBatisMapperTests { - @Autowired - private SystemUserMapper systemUserMapper; + @Autowired private SystemUserMapper systemUserMapper; @Test public void testMapper1() { @@ -38,13 +36,16 @@ public class MyBatisMapperTests { systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, new Date())); // SELECT * FROM system_user WHERE (create_time > '2025-08-18T14:50:16.786+0800'); - systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateTime.now())); + systemUserMapper.selectList( + new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateTime.now())); // SELECT * FROM system_user WHERE (create_time > '2025-08-18 14:53:46'); - systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateUtil.formatDateTime(new Date()))); + systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, + DateUtil.formatDateTime(new Date()))); // SELECT * FROM system_user WHERE (create_time > '2025-08-18'); - systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateUtil.formatDate(new Date()))); + systemUserMapper.selectList( + new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateUtil.formatDate(new Date()))); } } diff --git a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java index aa9887f2..5523ea94 100644 --- a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java +++ b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java @@ -21,20 +21,18 @@ 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.SystemUserTb; +import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.service.SystemUserService; +import java.util.Set; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.security.crypto.password.PasswordEncoder; -import java.util.Set; - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class SystemApplicationTests { - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private SystemUserService systemUserService; + @Autowired private PasswordEncoder passwordEncoder; + @Autowired private SystemUserService systemUserService; @Test public void contextLoads() { @@ -51,7 +49,7 @@ public class SystemApplicationTests { String pwd = passwordEncoder.encode("123456"); for (int i = 100; i < 200; i++) { - SystemUserTb systemUser = new SystemUserTb(); + SystemUserVo systemUser = new SystemUserVo(); systemUser.setDept(systemDept); systemUser.setJobs(systemJobs); systemUser.setRoles(systemRoles); diff --git a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java index b022afd0..d9e21805 100644 --- a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java +++ b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java @@ -19,7 +19,10 @@ package cn.odboy.util; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockMultipartFile; -import static cn.odboy.util.KitFileUtil.*; +import static cn.odboy.util.KitFileUtil.getPrefix; +import static cn.odboy.util.KitFileUtil.getSize; +import static cn.odboy.util.KitFileUtil.getSuffix; +import static cn.odboy.util.KitFileUtil.toFile; import static org.junit.jupiter.api.Assertions.assertEquals; public class KitFileUtilTest { diff --git a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java index b17b7b6a..0610970d 100644 --- a/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java +++ b/cutejava-springboot3/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java @@ -16,14 +16,16 @@ package cn.odboy.util; +import java.text.SimpleDateFormat; +import java.util.Date; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; -import java.text.SimpleDateFormat; -import java.util.Date; - -import static cn.odboy.util.KitStringUtil.*; +import static cn.odboy.util.KitStringUtil.getWeekDay; +import static cn.odboy.util.KitStringUtil.toCamelCase; +import static cn.odboy.util.KitStringUtil.toCapitalizeCamelCase; +import static cn.odboy.util.KitStringUtil.toUnderScoreCase; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; diff --git a/cutejava-springboot3/pom.xml b/cutejava-springboot3/pom.xml index 7cde54eb..d6a3d2d6 100644 --- a/cutejava-springboot3/pom.xml +++ b/cutejava-springboot3/pom.xml @@ -19,7 +19,8 @@ org.springframework.boot spring-boot-starter-parent - 3.3.13 + + 3.5.9 diff --git a/cutejava/cutejava-framework/pom.xml b/cutejava/cutejava-framework/pom.xml index 76f380a5..fdfa62b9 100644 --- a/cutejava/cutejava-framework/pom.xml +++ b/cutejava/cutejava-framework/pom.xml @@ -1,12 +1,12 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - cutejava-framework - 公共模块 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-framework + 公共模块 \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousAccess.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousAccess.java index 19c4c75c..0180a757 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousAccess.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousAccess.java @@ -29,4 +29,6 @@ import java.lang.annotation.Target; @Documented @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) -public @interface AnonymousAccess {} +public @interface AnonymousAccess { + +} diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousDeleteMapping.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousDeleteMapping.java index fdfdc450..a6807e02 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousDeleteMapping.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousDeleteMapping.java @@ -39,32 +39,39 @@ import org.springframework.web.bind.annotation.RequestMethod; @Documented @RequestMapping(method = RequestMethod.DELETE) public @interface AnonymousDeleteMapping { - /** - * Alias for {@link RequestMapping#name}. - */ - @AliasFor(annotation = RequestMapping.class) String name() default ""; - /** - * Alias for {@link RequestMapping#value}. - */ - @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * Alias for {@link RequestMapping#path}. - */ - @AliasFor(annotation = RequestMapping.class) String[] path() default {}; - /** - * Alias for {@link RequestMapping#params}. - */ - @AliasFor(annotation = RequestMapping.class) String[] params() default {}; - /** - * Alias for {@link RequestMapping#headers}. - */ - @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; - /** - * Alias for {@link RequestMapping#consumes}. - */ - @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; - /** - * Alias for {@link RequestMapping#produces}. - */ - @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + */ + @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousGetMapping.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousGetMapping.java index de74d263..bbec2c98 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousGetMapping.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousGetMapping.java @@ -37,34 +37,41 @@ import org.springframework.web.bind.annotation.RequestMethod; @Documented @RequestMapping(method = RequestMethod.GET) public @interface AnonymousGetMapping { - /** - * Alias for {@link RequestMapping#name}. - */ - @AliasFor(annotation = RequestMapping.class) String name() default ""; - /** - * Alias for {@link RequestMapping#value}. - */ - @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * Alias for {@link RequestMapping#path}. - */ - @AliasFor(annotation = RequestMapping.class) String[] path() default {}; - /** - * Alias for {@link RequestMapping#params}. - */ - @AliasFor(annotation = RequestMapping.class) String[] params() default {}; - /** - * Alias for {@link RequestMapping#headers}. - */ - @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; - /** - * Alias for {@link RequestMapping#consumes}. - * - * @since 4.3.5 - */ - @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; - /** - * Alias for {@link RequestMapping#produces}. - */ - @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + * + * @since 4.3.5 + */ + @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java index 0f14da80..3f356a16 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPatchMapping.java @@ -39,32 +39,39 @@ import org.springframework.web.bind.annotation.RequestMethod; @Documented @RequestMapping(method = RequestMethod.PATCH) public @interface AnonymousPatchMapping { - /** - * Alias for {@link RequestMapping#name}. - */ - @AliasFor(annotation = RequestMapping.class) String name() default ""; - /** - * Alias for {@link RequestMapping#value}. - */ - @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * Alias for {@link RequestMapping#path}. - */ - @AliasFor(annotation = RequestMapping.class) String[] path() default {}; - /** - * Alias for {@link RequestMapping#params}. - */ - @AliasFor(annotation = RequestMapping.class) String[] params() default {}; - /** - * Alias for {@link RequestMapping#headers}. - */ - @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; - /** - * Alias for {@link RequestMapping#consumes}. - */ - @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; - /** - * Alias for {@link RequestMapping#produces}. - */ - @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + */ + @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java index 172e0f7f..8b399dde 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPostMapping.java @@ -39,32 +39,39 @@ import org.springframework.web.bind.annotation.RequestMethod; @Documented @RequestMapping(method = RequestMethod.POST) public @interface AnonymousPostMapping { - /** - * Alias for {@link RequestMapping#name}. - */ - @AliasFor(annotation = RequestMapping.class) String name() default ""; - /** - * Alias for {@link RequestMapping#value}. - */ - @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * Alias for {@link RequestMapping#path}. - */ - @AliasFor(annotation = RequestMapping.class) String[] path() default {}; - /** - * Alias for {@link RequestMapping#params}. - */ - @AliasFor(annotation = RequestMapping.class) String[] params() default {}; - /** - * Alias for {@link RequestMapping#headers}. - */ - @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; - /** - * Alias for {@link RequestMapping#consumes}. - */ - @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; - /** - * Alias for {@link RequestMapping#produces}. - */ - @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + */ + @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java index 320df975..6ee730b8 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/annotation/AnonymousPutMapping.java @@ -39,32 +39,39 @@ import org.springframework.web.bind.annotation.RequestMethod; @Documented @RequestMapping(method = RequestMethod.PUT) public @interface AnonymousPutMapping { - /** - * Alias for {@link RequestMapping#name}. - */ - @AliasFor(annotation = RequestMapping.class) String name() default ""; - /** - * Alias for {@link RequestMapping#value}. - */ - @AliasFor(annotation = RequestMapping.class) String[] value() default {}; - /** - * Alias for {@link RequestMapping#path}. - */ - @AliasFor(annotation = RequestMapping.class) String[] path() default {}; - /** - * Alias for {@link RequestMapping#params}. - */ - @AliasFor(annotation = RequestMapping.class) String[] params() default {}; - /** - * Alias for {@link RequestMapping#headers}. - */ - @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; - /** - * Alias for {@link RequestMapping#consumes}. - */ - @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; - /** - * Alias for {@link RequestMapping#produces}. - */ - @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; + + /** + * Alias for {@link RequestMapping#name}. + */ + @AliasFor(annotation = RequestMapping.class) String name() default ""; + + /** + * Alias for {@link RequestMapping#value}. + */ + @AliasFor(annotation = RequestMapping.class) String[] value() default {}; + + /** + * Alias for {@link RequestMapping#path}. + */ + @AliasFor(annotation = RequestMapping.class) String[] path() default {}; + + /** + * Alias for {@link RequestMapping#params}. + */ + @AliasFor(annotation = RequestMapping.class) String[] params() default {}; + + /** + * Alias for {@link RequestMapping#headers}. + */ + @AliasFor(annotation = RequestMapping.class) String[] headers() default {}; + + /** + * Alias for {@link RequestMapping#consumes}. + */ + @AliasFor(annotation = RequestMapping.class) String[] consumes() default {}; + + /** + * Alias for {@link RequestMapping#produces}. + */ + @AliasFor(annotation = RequestMapping.class) String[] produces() default {}; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java index fc531663..f517be72 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitArgs.java @@ -26,15 +26,20 @@ import lombok.Setter; * @date 2025-07-23 */ public class KitArgs { - @Getter - @Setter - public static class FindByLongId extends KitObject { - @NotNull(message = "id必填") private Long id; - } - @Getter - @Setter - public static class DeleteById extends KitObject { - @NotNull(message = "id必填") private Long id; - } + @Getter + @Setter + public static class FindByLongId extends KitObject { + + @NotNull(message = "id必填") + private Long id; + } + + @Getter + @Setter + public static class DeleteById extends KitObject { + + @NotNull(message = "id必填") + private Long id; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java index 127b9789..8c755c88 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseCreateTimeTb.java @@ -27,6 +27,8 @@ import lombok.Setter; @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseCreateTimeTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java index e67dcac6..6593aab8 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseTimeTb.java @@ -27,8 +27,11 @@ import lombok.Setter; @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseTimeTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date updateTime; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java index 5158b49b..ad290bff 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUpdateTimeTb.java @@ -27,6 +27,8 @@ import lombok.Setter; @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUpdateTimeTb extends KitObject { - @TableField(fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date updateTime; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java index 629b93c8..88430bfc 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserCreateTimeTb.java @@ -30,29 +30,38 @@ import org.springframework.data.annotation.CreatedBy; @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUserCreateTimeTb extends KitObject { - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建人", hidden = true) private String - createBy; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - @Override - public String toString() { - ToStringBuilder builder = new ToStringBuilder(this); - Field[] fields = this.getClass().getDeclaredFields(); - try { - for (Field f : fields) { - f.setAccessible(true); - builder.append(f.getName(), f.get(this)).append("\n"); - } - } catch (Exception e) { - builder.append("toString builder encounter an error"); - } - return builder.toString(); + @CreatedBy + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人", hidden = true) + private String + createBy; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this); + Field[] fields = this.getClass().getDeclaredFields(); + try { + for (Field f : fields) { + f.setAccessible(true); + builder.append(f.getName(), f.get(this)).append("\n"); + } + } catch (Exception e) { + builder.append("toString builder encounter an error"); } + return builder.toString(); + } - /* 分组校验 */ - public @interface Create {} + /* 分组校验 */ + public @interface Create { - /* 分组校验 */ - public @interface Update {} + } + + /* 分组校验 */ + public @interface Update { + + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java index abb04525..5029c76f 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeLogicTb.java @@ -34,14 +34,24 @@ import org.springframework.data.annotation.LastModifiedBy; @Getter @Setter public class KitBaseUserTimeLogicTb extends KitObject { - @CreatedBy @TableField(value = "create_by", fill = FieldFill.INSERT) - @ApiModelProperty(value = "创建人", hidden = true) private String createBy; - @LastModifiedBy @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新人", hidden = true) private String updateBy; - @TableField(value = "create_time", fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) - private Date createTime; - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间", hidden = true) private Date updateTime; - @ApiModelProperty(value = "数据有效性", hidden = true) @TableLogic @TableField("available") private Integer - available; + + @CreatedBy + @TableField(value = "create_by", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人", hidden = true) + private String createBy; + @LastModifiedBy + @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新人", hidden = true) + private String updateBy; + @TableField(value = "create_time", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间", hidden = true) + private Date createTime; + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间", hidden = true) + private Date updateTime; + @ApiModelProperty(value = "数据有效性", hidden = true) + @TableLogic + @TableField("available") + private Integer + available; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java index f255e64b..6a55d66a 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitBaseUserTimeTb.java @@ -31,33 +31,45 @@ import org.springframework.data.annotation.LastModifiedBy; @Setter @EqualsAndHashCode(callSuper = false) public class KitBaseUserTimeTb extends KitObject { - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建人", hidden = true) private String - createBy; - @LastModifiedBy @TableField(fill = FieldFill.INSERT_UPDATE) @ApiModelProperty(value = "更新人", hidden = true) - private String updateBy; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; - @Override - public String toString() { - ToStringBuilder builder = new ToStringBuilder(this); - Field[] fields = this.getClass().getDeclaredFields(); - try { - for (Field f : fields) { - f.setAccessible(true); - builder.append(f.getName(), f.get(this)).append("\n"); - } - } catch (Exception e) { - builder.append("toString builder encounter an error"); - } - return builder.toString(); + @CreatedBy + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人", hidden = true) + private String + createBy; + @LastModifiedBy + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新人", hidden = true) + private String updateBy; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date updateTime; + + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this); + Field[] fields = this.getClass().getDeclaredFields(); + try { + for (Field f : fields) { + f.setAccessible(true); + builder.append(f.getName(), f.get(this)).append("\n"); + } + } catch (Exception e) { + builder.append("toString builder encounter an error"); } + return builder.toString(); + } - /* 分组校验 */ - public @interface Create {} + /* 分组校验 */ + public @interface Create { - /* 分组校验 */ - public @interface Update {} + } + + /* 分组校验 */ + public @interface Update { + + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java index e194c30f..ada1e818 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitObject.java @@ -24,5 +24,6 @@ import java.io.Serializable; * @date 2022-01-12 */ public class KitObject implements Serializable { - private static final long serialVersionUID = 1L; + + private static final long serialVersionUID = 1L; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java index 5fb068a2..29cb001e 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageArgs.java @@ -33,9 +33,14 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class KitPageArgs implements Serializable { - @NotNull(message = "参数page不能为空") @Min(value = 1, message = "参数page最小值为1") - @ApiModelProperty(value = "页码", example = "1") private Integer page; - @NotNull(message = "参数size不能为空") @Min(value = 1, message = "参数size最小值为1") - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size; - private T args; + + @NotNull(message = "参数page不能为空") + @Min(value = 1, message = "参数page最小值为1") + @ApiModelProperty(value = "页码", example = "1") + private Integer page; + @NotNull(message = "参数size不能为空") + @Min(value = 1, message = "参数size最小值为1") + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size; + private T args; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java index 78edd50a..1f469a90 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitPageResult.java @@ -31,20 +31,21 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) public class KitPageResult extends KitObject { - private List content; - private long totalElements; - public static KitPageResult emptyListData() { - KitPageResult result = new KitPageResult<>(); - result.setTotalElements(0); - result.setContent(new ArrayList<>()); - return result; - } + private List content; + private long totalElements; - public static KitPageResult listData(IPage page) { - KitPageResult result = new KitPageResult<>(); - result.setTotalElements(page.getTotal()); - result.setContent(page.getRecords()); - return result; - } + public static KitPageResult emptyListData() { + KitPageResult result = new KitPageResult<>(); + result.setTotalElements(0); + result.setContent(new ArrayList<>()); + return result; + } + + public static KitPageResult listData(IPage page) { + KitPageResult result = new KitPageResult<>(); + result.setTotalElements(page.getTotal()); + result.setContent(page.getRecords()); + return result; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java index 84c3d64a..bfa1eaf2 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/base/KitSelectOptionVo.java @@ -34,7 +34,8 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @EqualsAndHashCode(callSuper = false) public class KitSelectOptionVo extends KitObject { - private String label; - private String value; - private Map ext; + + private String label; + private String value; + private Map ext; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/CaptchaCodeEnum.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/CaptchaCodeEnum.java index 9cfe140a..036ec0c3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/CaptchaCodeEnum.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/CaptchaCodeEnum.java @@ -19,24 +19,24 @@ package cn.odboy.constant; * 验证码配置枚举 */ public enum CaptchaCodeEnum { - /** - * 算数 - */ - ARITHMETIC, - /** - * 中文 - */ - CHINESE, - /** - * 中文闪图 - */ - CHINESE_GIF, - /** - * 闪图 - */ - GIF, - /** - * 静态 - */ - SPEC + /** + * 算数 + */ + ARITHMETIC, + /** + * 中文 + */ + CHINESE, + /** + * 中文闪图 + */ + CHINESE_GIF, + /** + * 闪图 + */ + GIF, + /** + * 静态 + */ + SPEC } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/FileTypeEnum.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/FileTypeEnum.java index 61fb6aaf..0052eabc 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/FileTypeEnum.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/FileTypeEnum.java @@ -21,8 +21,8 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum FileTypeEnum { - /* 文件类型 */ - IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他"); - private final String code; - private final String description; + /* 文件类型 */ + IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他"); + private final String code; + private final String description; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/RequestMethodEnum.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/RequestMethodEnum.java index 5dc24b39..17a0693b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/RequestMethodEnum.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/RequestMethodEnum.java @@ -21,41 +21,41 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum RequestMethodEnum { - /** - * 搜寻 @AnonymousGetMapping - */ - GET("GET"), - /** - * 搜寻 @AnonymousPostMapping - */ - POST("POST"), - /** - * 搜寻 @AnonymousPutMapping - */ - PUT("PUT"), - /** - * 搜寻 @AnonymousPatchMapping - */ - PATCH("PATCH"), - /** - * 搜寻 @AnonymousDeleteMapping - */ - DELETE("DELETE"), - /** - * 否则就是所有 Request 接口都放行 - */ - ALL("All"); - /** - * Request 类型 - */ - private final String type; + /** + * 搜寻 @AnonymousGetMapping + */ + GET("GET"), + /** + * 搜寻 @AnonymousPostMapping + */ + POST("POST"), + /** + * 搜寻 @AnonymousPutMapping + */ + PUT("PUT"), + /** + * 搜寻 @AnonymousPatchMapping + */ + PATCH("PATCH"), + /** + * 搜寻 @AnonymousDeleteMapping + */ + DELETE("DELETE"), + /** + * 否则就是所有 Request 接口都放行 + */ + ALL("All"); + /** + * Request 类型 + */ + private final String type; - public static RequestMethodEnum find(String type) { - for (RequestMethodEnum value : RequestMethodEnum.values()) { - if (value.getType().equals(type)) { - return value; - } - } - return ALL; + public static RequestMethodEnum find(String type) { + for (RequestMethodEnum value : RequestMethodEnum.values()) { + if (value.getType().equals(type)) { + return value; + } } + return ALL; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/SystemConst.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/SystemConst.java index 0773b662..286b953b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/SystemConst.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/constant/SystemConst.java @@ -19,30 +19,31 @@ package cn.odboy.constant; * 常用静态常量 */ public interface SystemConst { - /** - * win 系统 - */ - String WIN = "win"; - /** - * mac 系统 - */ - String MAC = "mac"; - /** - * 请求头名称 - */ - String HEADER_NAME = "Authorization"; - /** - * Token前缀 - */ - String TOKEN_PREFIX = "Bearer"; - /** - * 小数点 - */ - String SYMBOL_DOT = "."; - String SYMBOL_EQUAL = "="; - String SYMBOL_ADD = "+"; - String SYMBOL_SUBTRACT = "-"; - String SYMBOL_AT = "@"; - String PROPERTY_OS_NAME = "os.name"; - String OS_NAME_WINDOWS = "Windows"; + + /** + * win 系统 + */ + String WIN = "win"; + /** + * mac 系统 + */ + String MAC = "mac"; + /** + * 请求头名称 + */ + String HEADER_NAME = "Authorization"; + /** + * Token前缀 + */ + String TOKEN_PREFIX = "Bearer"; + /** + * 小数点 + */ + String SYMBOL_DOT = "."; + String SYMBOL_EQUAL = "="; + String SYMBOL_ADD = "+"; + String SYMBOL_SUBTRACT = "-"; + String SYMBOL_AT = "@"; + String PROPERTY_OS_NAME = "os.name"; + String OS_NAME_WINDOWS = "Windows"; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BeanLoadFinishListener.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BeanLoadFinishListener.java index fe53a12d..634ebce9 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BeanLoadFinishListener.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BeanLoadFinishListener.java @@ -29,8 +29,9 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class BeanLoadFinishListener implements ApplicationListener { - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - log.info("所有的Bean都加载完毕了"); - } + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + log.info("所有的Bean都加载完毕了"); + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java index 8b020a14..3b5b2ff3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/BootApplication.java @@ -31,20 +31,21 @@ import org.springframework.core.env.Environment; */ @Slf4j public class BootApplication { - protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException { - Environment env = application.getEnvironment(); - String ip = InetAddress.getLocalHost().getHostAddress(); - String port = env.getProperty("server.port"); - String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" - : env.getProperty("config.servlet.context-path"); - log.info("\n----------------------------------------------------------\n\t" + - "Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + - "External: \thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + - path + "/doc.html\n" + "----------------------------------------------------------"); - } - @Bean - public KitSpringBeanHolder springBeanHolder() { - return new KitSpringBeanHolder(); - } + protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException { + Environment env = application.getEnvironment(); + String ip = InetAddress.getLocalHost().getHostAddress(); + String port = env.getProperty("server.port"); + String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" + : env.getProperty("config.servlet.context-path"); + log.info("\n----------------------------------------------------------\n\t" + + "Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + + "External: \thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + + path + "/doc.html\n" + "----------------------------------------------------------"); + } + + @Bean + public KitSpringBeanHolder springBeanHolder() { + return new KitSpringBeanHolder(); + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java index 0eab3251..172e06fa 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitRequestHolder.java @@ -24,8 +24,9 @@ import org.springframework.web.context.request.ServletRequestAttributes; * 获取 HttpServletRequest */ public class KitRequestHolder { - public static HttpServletRequest getHttpServletRequest() { - return ((ServletRequestAttributes)Objects.requireNonNull( - RequestContextHolder.getRequestAttributes())).getRequest(); - } + + public static HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull( + RequestContextHolder.getRequestAttributes())).getRequest(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java index 413781c6..b163805c 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitScriptHelper.java @@ -30,32 +30,33 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class KitScriptHelper { - public Object evalObj(String script, Map args) { - try (Context rhino = Context.enter()) { - Scriptable scope = rhino.initStandardObjects(); - bindArgumentsToScope(scope, args); - Object result = rhino.evaluateString(scope, script, "JavaScript", 1, null); - log.info("执行结果: {}", Context.toString(result)); - return result; - } - } - private void bindArgumentsToScope(Scriptable scope, Map args) { - if (args == null) { - return; - } - for (Map.Entry entry : args.entrySet()) { - Object jsValue = Context.javaToJS(entry.getValue(), scope); - scope.put(entry.getKey().toString(), scope, jsValue); - } + public Object evalObj(String script, Map args) { + try (Context rhino = Context.enter()) { + Scriptable scope = rhino.initStandardObjects(); + bindArgumentsToScope(scope, args); + Object result = rhino.evaluateString(scope, script, "JavaScript", 1, null); + log.info("执行结果: {}", Context.toString(result)); + return result; } + } - private void bindArgumentsToScope(Scriptable scope, Object args) { - if (args == null) { - return; - } - // 单个对象参数 - Object jsValue = Context.javaToJS(args, scope); - scope.put("args", scope, jsValue); + private void bindArgumentsToScope(Scriptable scope, Map args) { + if (args == null) { + return; } + for (Map.Entry entry : args.entrySet()) { + Object jsValue = Context.javaToJS(entry.getValue(), scope); + scope.put(entry.getKey().toString(), scope, jsValue); + } + } + + private void bindArgumentsToScope(Scriptable scope, Object args) { + if (args == null) { + return; + } + // 单个对象参数 + Object jsValue = Context.javaToJS(args, scope); + scope.put("args", scope, jsValue); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java index 89d53e10..0ba9e06b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/context/KitSpringBeanHolder.java @@ -29,138 +29,141 @@ import org.springframework.stereotype.Service; @Slf4j @SuppressWarnings({"unchecked", "all"}) public class KitSpringBeanHolder implements ApplicationContextAware, DisposableBean { - private static final List CALL_BACKS = new ArrayList<>(); - private static ApplicationContext applicationContext = null; - private static boolean addCallback = true; - /** - * 针对 某些初始化方法, 在SpringContextHolder 未初始化时 提交回调方法。 在SpringContextHolder 初始化后, 进行回调使用 - * - * @param callBack 回调函数 - */ - public synchronized static void addCallBacks(CallBack callBack) { - if (addCallback) { - KitSpringBeanHolder.CALL_BACKS.add(callBack); - } else { - log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); - callBack.executor(); - } + private static final List CALL_BACKS = new ArrayList<>(); + private static ApplicationContext applicationContext = null; + private static boolean addCallback = true; + + /** + * 针对 某些初始化方法, 在SpringContextHolder 未初始化时 提交回调方法。 在SpringContextHolder 初始化后, 进行回调使用 + * + * @param callBack 回调函数 + */ + public synchronized static void addCallBacks(CallBack callBack) { + if (addCallback) { + KitSpringBeanHolder.CALL_BACKS.add(callBack); + } else { + log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); + callBack.executor(); } + } - /** - * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. - */ - public static T getBean(String name) { - assertContextInjected(); - return (T)applicationContext.getBean(name); + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(String name) { + assertContextInjected(); + return (T) applicationContext.getBean(name); + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + assertContextInjected(); + return applicationContext.getBean(requiredType); + } + + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @param defaultValue 默认值 + * @param requiredType 返回类型 + * @return / + */ + public static T getProperties(String property, T defaultValue, Class requiredType) { + T result = defaultValue; + try { + result = getBean(Environment.class).getProperty(property, requiredType); + } catch (Exception ignored) { } + return result; + } - /** - * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. - */ - public static T getBean(Class requiredType) { - assertContextInjected(); - return applicationContext.getBean(requiredType); + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @return / + */ + public static String getProperties(String property) { + return getProperties(property, null, String.class); + } + + /** + * 获取SpringBoot 配置信息 + * + * @param property 属性key + * @param requiredType 返回类型 + * @return / + */ + public static T getProperties(String property, Class requiredType) { + return getProperties(property, null, requiredType); + } + + /** + * 检查ApplicationContext不为空. + */ + private static void assertContextInjected() { + if (applicationContext == null) { + throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" + + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); } + } - /** - * 获取SpringBoot 配置信息 - * - * @param property 属性key - * @param defaultValue 默认值 - * @param requiredType 返回类型 - * @return / - */ - public static T getProperties(String property, T defaultValue, Class requiredType) { - T result = defaultValue; - try { - result = getBean(Environment.class).getProperty(property, requiredType); - } catch (Exception ignored) { - } - return result; + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + private static void clearHolder() { + log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); + applicationContext = null; + } + + /** + * 获取 @Service 的所有 bean 名称 + * + * @return / + */ + public static List getAllServiceBeanName() { + return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class))); + } + + @Override + public void destroy() { + KitSpringBeanHolder.clearHolder(); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (KitSpringBeanHolder.applicationContext != null) { + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + + KitSpringBeanHolder.applicationContext); } - - /** - * 获取SpringBoot 配置信息 - * - * @param property 属性key - * @return / - */ - public static String getProperties(String property) { - return getProperties(property, null, String.class); + KitSpringBeanHolder.applicationContext = applicationContext; + if (addCallback) { + for (CallBack callBack : KitSpringBeanHolder.CALL_BACKS) { + callBack.executor(); + } + CALL_BACKS.clear(); } + KitSpringBeanHolder.addCallback = false; + } + + interface CallBack { /** - * 获取SpringBoot 配置信息 - * - * @param property 属性key - * @param requiredType 返回类型 - * @return / + * 回调执行方法 */ - public static T getProperties(String property, Class requiredType) { - return getProperties(property, null, requiredType); - } + void executor(); /** - * 检查ApplicationContext不为空. - */ - private static void assertContextInjected() { - if (applicationContext == null) { - throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" + - ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder."); - } - } - - /** - * 清除SpringContextHolder中的ApplicationContext为Null. - */ - private static void clearHolder() { - log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); - applicationContext = null; - } - - /** - * 获取 @Service 的所有 bean 名称 + * 本回调任务名称 * * @return / */ - public static List getAllServiceBeanName() { - return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class))); - } - - @Override - public void destroy() { - KitSpringBeanHolder.clearHolder(); - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if (KitSpringBeanHolder.applicationContext != null) { - log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + - KitSpringBeanHolder.applicationContext); - } - KitSpringBeanHolder.applicationContext = applicationContext; - if (addCallback) { - for (CallBack callBack : KitSpringBeanHolder.CALL_BACKS) { - callBack.executor(); - } - CALL_BACKS.clear(); - } - KitSpringBeanHolder.addCallback = false; - } - - interface CallBack { - /** - * 回调执行方法 - */ - void executor(); - /** - * 本回调任务名称 - * - * @return / - */ - default String getCallBackName() { - return Thread.currentThread().getId() + ":" + this.getClass().getName(); - } + default String getCallBackName() { + return Thread.currentThread().getId() + ":" + this.getClass().getName(); } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/doc/SwaggerConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/doc/SwaggerConfig.java index 9683484b..0e3f5307 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/doc/SwaggerConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/doc/SwaggerConfig.java @@ -53,94 +53,98 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { - @Value("${server.servlet.context-path:}") private String apiPath; - @Autowired private AppProperties properties; - @Autowired private ApplicationContext applicationContext; - /** - * 解决Springfox与SpringBoot集成后, WebMvcRequestHandlerProvider和WebFluxRequestHandlerProvider冲突问题 - * - * @return / - */ - @Bean - @SuppressWarnings({"unchecked", "all"}) - public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { - return new BeanPostProcessor() { - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { - customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); - } - return bean; - } + @Value("${server.servlet.context-path:}") + private String apiPath; + @Autowired + private AppProperties properties; + @Autowired + private ApplicationContext applicationContext; - private void customizeSpringfoxHandlerMappings( - List mappings) { - List filteredMappings = mappings.stream().filter(mapping -> mapping.getPatternParser() == null) - .collect(Collectors.toList()); - mappings.clear(); - mappings.addAll(filteredMappings); - } + /** + * 解决Springfox与SpringBoot集成后, WebMvcRequestHandlerProvider和WebFluxRequestHandlerProvider冲突问题 + * + * @return / + */ + @Bean + @SuppressWarnings({"unchecked", "all"}) + public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } - private List getHandlerMappings(Object bean) { - Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); - if (field != null) { - field.setAccessible(true); - try { - return (List)field.get(bean); - } catch (IllegalAccessException e) { - throw new IllegalStateException("Failed to access handlerMappings field", e); - } - } - return Collections.emptyList(); - } - }; - } + private void customizeSpringfoxHandlerMappings( + List mappings) { + List filteredMappings = mappings.stream().filter(mapping -> mapping.getPatternParser() == null) + .collect(Collectors.toList()); + mappings.clear(); + mappings.addAll(filteredMappings); + } - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2).enable(properties.getSwagger().getEnabled()).pathMapping("/") - .apiInfo(apiInfo()).select().paths(PathSelectors.regex("^(?!/error).*")).paths(PathSelectors.any()).build() - //添加登陆认证 - .securitySchemes(securitySchemes()).securityContexts(securityContexts()); - } + private List getHandlerMappings(Object bean) { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + if (field != null) { + field.setAccessible(true); + try { + return (List) field.get(bean); + } catch (IllegalAccessException e) { + throw new IllegalStateException("Failed to access handlerMappings field", e); + } + } + return Collections.emptyList(); + } + }; + } - private ApiInfo apiInfo() { - return new ApiInfoBuilder().description("一个简单且易上手的自动化运维平台").title("CuteJava 接口文档") - .version("1.4.1").build(); - } + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2).enable(properties.getSwagger().getEnabled()).pathMapping("/") + .apiInfo(apiInfo()).select().paths(PathSelectors.regex("^(?!/error).*")).paths(PathSelectors.any()).build() + //添加登陆认证 + .securitySchemes(securitySchemes()).securityContexts(securityContexts()); + } - private List securitySchemes() { - //设置请求头信息 - List securitySchemes = new ArrayList<>(); - ApiKey apiKey = new ApiKey(SystemConst.HEADER_NAME, SystemConst.HEADER_NAME, "header"); - securitySchemes.add(apiKey); - return securitySchemes; - } + private ApiInfo apiInfo() { + return new ApiInfoBuilder().description("一个简单且易上手的自动化运维平台").title("CuteJava 接口文档") + .version("1.4.1").build(); + } - private List securityContexts() { - //设置需要登录认证的路径 - List securityContexts = new ArrayList<>(); - securityContexts.add(getContextByPath()); - return securityContexts; - } + private List securitySchemes() { + //设置请求头信息 + List securitySchemes = new ArrayList<>(); + ApiKey apiKey = new ApiKey(SystemConst.HEADER_NAME, SystemConst.HEADER_NAME, "header"); + securitySchemes.add(apiKey); + return securitySchemes; + } - private SecurityContext getContextByPath() { - Set urls = KitAnonTagUtil.getAllAnonymousUrl(applicationContext); - urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet()); - String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$"; - return SecurityContext.builder().securityReferences(defaultAuth()) - .operationSelector(o -> o.requestMappingPattern() - // 排除不需要认证的接口 - .matches(regExp)).build(); - } + private List securityContexts() { + //设置需要登录认证的路径 + List securityContexts = new ArrayList<>(); + securityContexts.add(getContextByPath()); + return securityContexts; + } - private List defaultAuth() { - List securityReferences = new ArrayList<>(); - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes)); - return securityReferences; - } + private SecurityContext getContextByPath() { + Set urls = KitAnonTagUtil.getAllAnonymousUrl(applicationContext); + urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet()); + String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$"; + return SecurityContext.builder().securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern() + // 排除不需要认证的接口 + .matches(regExp)).build(); + } + + private List defaultAuth() { + List securityReferences = new ArrayList<>(); + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes)); + return securityReferences; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/BadRequestException.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/BadRequestException.java index edb80bfe..b934a4e8 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/BadRequestException.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/BadRequestException.java @@ -15,29 +15,30 @@ */ package cn.odboy.framework.exception; +import static org.springframework.http.HttpStatus.BAD_REQUEST; + import lombok.Getter; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.BAD_REQUEST; - /** * 统一异常处理 */ @Getter public class BadRequestException extends RuntimeException { - private Integer status = BAD_REQUEST.value(); - public BadRequestException(String msg) { - super(msg); - } + private Integer status = BAD_REQUEST.value(); - public BadRequestException(HttpStatus status, String msg) { - super(msg); - this.status = status.value(); - } + public BadRequestException(String msg) { + super(msg); + } - public BadRequestException(Throwable cause) { - super(cause.getMessage()); - this.status = BAD_REQUEST.value(); - } + public BadRequestException(HttpStatus status, String msg) { + super(msg); + this.status = status.value(); + } + + public BadRequestException(Throwable cause) { + super(cause.getMessage()); + this.status = BAD_REQUEST.value(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/ServerException.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/ServerException.java index 9a71814d..6d9e28fc 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/ServerException.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/ServerException.java @@ -15,26 +15,27 @@ */ package cn.odboy.framework.exception; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + import lombok.Getter; import org.springframework.http.HttpStatus; -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; - @Getter public class ServerException extends RuntimeException { - private Integer status = INTERNAL_SERVER_ERROR.value(); - public ServerException(String msg) { - super(msg); - } + private Integer status = INTERNAL_SERVER_ERROR.value(); - public ServerException(HttpStatus status, String msg) { - super(msg); - this.status = status.value(); - } + public ServerException(String msg) { + super(msg); + } - public ServerException(Throwable cause) { - super(cause.getMessage()); - this.status = INTERNAL_SERVER_ERROR.value(); - } + public ServerException(HttpStatus status, String msg) { + super(msg); + this.status = status.value(); + } + + public ServerException(Throwable cause) { + super(cause.getMessage()); + this.status = INTERNAL_SERVER_ERROR.value(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/ApiError.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/ApiError.java index 4cacdf3c..cbe0b08c 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/ApiError.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/ApiError.java @@ -19,24 +19,25 @@ import lombok.Data; @Data public final class ApiError { - private Integer status = 400; - private Long timestamp; - private String message; - private ApiError() { - timestamp = System.currentTimeMillis(); - } + private Integer status = 400; + private Long timestamp; + private String message; - public static ApiError error(final String message) { - ApiError apiError = new ApiError(); - apiError.setMessage(message); - return apiError; - } + private ApiError() { + timestamp = System.currentTimeMillis(); + } - public static ApiError error(final Integer status, final String message) { - ApiError apiError = new ApiError(); - apiError.setStatus(status); - apiError.setMessage(message); - return apiError; - } + public static ApiError error(final String message) { + ApiError apiError = new ApiError(); + apiError.setMessage(message); + return apiError; + } + + public static ApiError error(final Integer status, final String message) { + ApiError apiError = new ApiError(); + apiError.setStatus(status); + apiError.setMessage(message); + return apiError; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/GlobalExceptionHandler.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/GlobalExceptionHandler.java index da62c889..f1b69c5f 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/GlobalExceptionHandler.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/exception/handler/GlobalExceptionHandler.java @@ -35,56 +35,57 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { - /** - * 处理所有不可知的异常 - */ - @ExceptionHandler(Throwable.class) - public ResponseEntity handleException(Throwable e) { - // 打印堆栈信息 - log.error(ExceptionUtil.stacktraceToString(e)); - return buildResponseEntity(ApiError.error(e.getMessage())); - } - /** - * BadCredentialsException - */ - @ExceptionHandler(BadCredentialsException.class) - public ResponseEntity badCredentialsException(BadCredentialsException e) { - // 打印堆栈信息 - String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage(); - log.error(message); - return buildResponseEntity(ApiError.error(message)); - } + /** + * 处理所有不可知的异常 + */ + @ExceptionHandler(Throwable.class) + public ResponseEntity handleException(Throwable e) { + // 打印堆栈信息 + log.error(ExceptionUtil.stacktraceToString(e)); + return buildResponseEntity(ApiError.error(e.getMessage())); + } - /** - * 处理自定义异常 - */ - @ExceptionHandler(value = BadRequestException.class) - public ResponseEntity badRequestException(BadRequestException e) { - // 打印堆栈信息 - log.error(ExceptionUtil.stacktraceToString(e)); - return buildResponseEntity(ApiError.error(e.getStatus(), e.getMessage())); - } + /** + * BadCredentialsException + */ + @ExceptionHandler(BadCredentialsException.class) + public ResponseEntity badCredentialsException(BadCredentialsException e) { + // 打印堆栈信息 + String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage(); + log.error(message); + return buildResponseEntity(ApiError.error(message)); + } - /** - * 处理所有接口数据验证异常 - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - // 打印堆栈信息 - log.error(ExceptionUtil.stacktraceToString(e)); - ObjectError objectError = e.getBindingResult().getAllErrors().get(0); - String message = objectError.getDefaultMessage(); - if (objectError instanceof FieldError) { - message = ((FieldError)objectError).getField() + ": " + message; - } - return buildResponseEntity(ApiError.error(message)); - } + /** + * 处理自定义异常 + */ + @ExceptionHandler(value = BadRequestException.class) + public ResponseEntity badRequestException(BadRequestException e) { + // 打印堆栈信息 + log.error(ExceptionUtil.stacktraceToString(e)); + return buildResponseEntity(ApiError.error(e.getStatus(), e.getMessage())); + } - /** - * 统一返回 - */ - private ResponseEntity buildResponseEntity(ApiError apiError) { - return new ResponseEntity<>(apiError, HttpStatus.valueOf(apiError.getStatus())); + /** + * 处理所有接口数据验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + // 打印堆栈信息 + log.error(ExceptionUtil.stacktraceToString(e)); + ObjectError objectError = e.getBindingResult().getAllErrors().get(0); + String message = objectError.getDefaultMessage(); + if (objectError instanceof FieldError) { + message = ((FieldError) objectError).getField() + ": " + message; } + return buildResponseEntity(ApiError.error(message)); + } + + /** + * 统一返回 + */ + private ResponseEntity buildResponseEntity(ApiError apiError) { + return new ResponseEntity<>(apiError, HttpStatus.valueOf(apiError.getStatus())); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java index 8892b533..a2397e62 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFace.java @@ -32,12 +32,14 @@ import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ExecutionTimeStatisticsFace { - /** - * 接口描述 - */ - String description(); - /** - * 是否展示异常日志 - */ - boolean showErrLog() default true; + + /** + * 接口描述 + */ + String description(); + + /** + * 是否展示异常日志 + */ + boolean showErrLog() default true; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java index 334a4581..57e707af 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/logging/ExecutionTimeStatisticsFaceAspect.java @@ -32,21 +32,22 @@ import org.springframework.stereotype.Component; @Aspect @Component public class ExecutionTimeStatisticsFaceAspect { - @Around("@annotation(executionTimeStatisticsFace)") - public Object aroundFace(ProceedingJoinPoint joinPoint, ExecutionTimeStatisticsFace executionTimeStatisticsFace) - throws Throwable { - TimeInterval timeInterval = new TimeInterval(); - try { - Object proceed = joinPoint.proceed(); - log.info("[{}] 接口执行成功,耗时: {} ms", executionTimeStatisticsFace.description(), - timeInterval.intervalMs()); - return proceed; - } catch (Exception e) { - if (executionTimeStatisticsFace.showErrLog()) { - log.error("[{}] 接口执行失败,耗时: {} ms", executionTimeStatisticsFace.description(), - timeInterval.intervalMs(), e); - } - throw e; - } + + @Around("@annotation(executionTimeStatisticsFace)") + public Object aroundFace(ProceedingJoinPoint joinPoint, ExecutionTimeStatisticsFace executionTimeStatisticsFace) + throws Throwable { + TimeInterval timeInterval = new TimeInterval(); + try { + Object proceed = joinPoint.proceed(); + log.info("[{}] 接口执行成功,耗时: {} ms", executionTimeStatisticsFace.description(), + timeInterval.intervalMs()); + return proceed; + } catch (Exception e) { + if (executionTimeStatisticsFace.showErrLog()) { + log.error("[{}] 接口执行失败,耗时: {} ms", executionTimeStatisticsFace.description(), + timeInterval.intervalMs(), e); + } + throw e; } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java index 3ef405c3..1d9801aa 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/controller/HealthCheckController.java @@ -30,28 +30,30 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/healthCheck") @Api(tags = "系统:健康检查接口") public class HealthCheckController { - @Autowired private KitHealthCheckPointService kitHealthCheckPointService; - /** - * 就绪检查 - */ - @AnonymousGetMapping(value = "/readiness") - public ResponseEntity doReadiness() { - return kitHealthCheckPointService.doReadiness(); - } + @Autowired + private KitHealthCheckPointService kitHealthCheckPointService; - /** - * 存活检查 - */ - @AnonymousGetMapping(value = "/liveness") - public ResponseEntity doLiveness() { - return kitHealthCheckPointService.doLiveness(); - } - // /** - // * 访问首页提示 - // */ - // @AnonymousGetMapping("/") - // public String index() { - // return "success"; - // } + /** + * 就绪检查 + */ + @AnonymousGetMapping(value = "/readiness") + public ResponseEntity doReadiness() { + return kitHealthCheckPointService.doReadiness(); + } + + /** + * 存活检查 + */ + @AnonymousGetMapping(value = "/liveness") + public ResponseEntity doLiveness() { + return kitHealthCheckPointService.doLiveness(); + } + // /** + // * 访问首页提示 + // */ + // @AnonymousGetMapping("/") + // public String index() { + // return "success"; + // } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/service/KitHealthCheckPointService.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/service/KitHealthCheckPointService.java index 0be89fe5..da42e71b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/service/KitHealthCheckPointService.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/monitor/service/KitHealthCheckPointService.java @@ -18,12 +18,14 @@ package cn.odboy.framework.monitor.service; import org.springframework.http.ResponseEntity; public interface KitHealthCheckPointService { - /** - * 就绪检查 - */ - ResponseEntity doReadiness(); - /** - * 存活检查 - */ - ResponseEntity doLiveness(); + + /** + * 就绪检查 + */ + ResponseEntity doReadiness(); + + /** + * 存活检查 + */ + ResponseEntity doLiveness(); } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java index ebc17e56..b39f078d 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/DataTypeEnum.java @@ -24,129 +24,129 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @SuppressWarnings({"unchecked", "all"}) public enum DataTypeEnum { - /** - * mysql - */ - MYSQL("mysql", "mysql", "com.mysql.jdbc.Driver", "`", "`", "'", "'"), - /** - * oracle - */ - ORACLE("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""), - /** - * sql config - */ - SQLSERVER("sqlserver", "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""), - /** - * h2 - */ - H2("h2", "h2", "org.h2.Driver", "`", "`", "\"", "\""), - /** - * phoenix - */ - PHOENIX("phoenix", "hbase phoenix", "org.apache.phoenix.jdbc.PhoenixDriver", "", "", "\"", "\""), - /** - * mongo - */ - MONGODB("mongo", "mongodb", "mongodb.jdbc.MongoDriver", "`", "`", "\"", "\""), - /** - * sql4es - */ - ELASTICSEARCH("sql4es", "elasticsearch", "nl.anchormen.sql4es.jdbc.ESDriver", "", "", "'", "'"), - /** - * presto - */ - PRESTO("presto", "presto", "com.facebook.presto.jdbc.PrestoDriver", "", "", "\"", "\""), - /** - * moonbox - */ - MOONBOX("moonbox", "moonbox", "moonbox.jdbc.MbDriver", "`", "`", "`", "`"), - /** - * cassandra - */ - CASSANDRA("cassandra", "cassandra", "com.github.adejanovski.cassandra.jdbc.CassandraDriver", "", "", "'", "'"), - /** - * click house - */ - CLICKHOUSE("clickhouse", "clickhouse", "ru.yandex.clickhouse.ClickHouseDriver", "", "", "\"", "\""), - /** - * kylin - */ - KYLIN("kylin", "kylin", "org.apache.kylin.jdbc.Driver", "\"", "\"", "\"", "\""), - /** - * vertica - */ - VERTICA("vertica", "vertica", "com.vertica.jdbc.Driver", "", "", "'", "'"), - /** - * sap - */ - HANA("sap", "sap hana", "com.sap.db.jdbc.Driver", "", "", "'", "'"), - /** - * impala - */ - IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'"); - private static final String JDBC_URL_PREFIX = "jdbc:"; - private String feature; - private String desc; - private String driver; - private String keywordPrefix; - private String keywordSuffix; - private String aliasPrefix; - private String aliasSuffix; + /** + * mysql + */ + MYSQL("mysql", "mysql", "com.mysql.jdbc.Driver", "`", "`", "'", "'"), + /** + * oracle + */ + ORACLE("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""), + /** + * sql config + */ + SQLSERVER("sqlserver", "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""), + /** + * h2 + */ + H2("h2", "h2", "org.h2.Driver", "`", "`", "\"", "\""), + /** + * phoenix + */ + PHOENIX("phoenix", "hbase phoenix", "org.apache.phoenix.jdbc.PhoenixDriver", "", "", "\"", "\""), + /** + * mongo + */ + MONGODB("mongo", "mongodb", "mongodb.jdbc.MongoDriver", "`", "`", "\"", "\""), + /** + * sql4es + */ + ELASTICSEARCH("sql4es", "elasticsearch", "nl.anchormen.sql4es.jdbc.ESDriver", "", "", "'", "'"), + /** + * presto + */ + PRESTO("presto", "presto", "com.facebook.presto.jdbc.PrestoDriver", "", "", "\"", "\""), + /** + * moonbox + */ + MOONBOX("moonbox", "moonbox", "moonbox.jdbc.MbDriver", "`", "`", "`", "`"), + /** + * cassandra + */ + CASSANDRA("cassandra", "cassandra", "com.github.adejanovski.cassandra.jdbc.CassandraDriver", "", "", "'", "'"), + /** + * click house + */ + CLICKHOUSE("clickhouse", "clickhouse", "ru.yandex.clickhouse.ClickHouseDriver", "", "", "\"", "\""), + /** + * kylin + */ + KYLIN("kylin", "kylin", "org.apache.kylin.jdbc.Driver", "\"", "\"", "\"", "\""), + /** + * vertica + */ + VERTICA("vertica", "vertica", "com.vertica.jdbc.Driver", "", "", "'", "'"), + /** + * sap + */ + HANA("sap", "sap hana", "com.sap.db.jdbc.Driver", "", "", "'", "'"), + /** + * impala + */ + IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'"); + private static final String JDBC_URL_PREFIX = "jdbc:"; + private String feature; + private String desc; + private String driver; + private String keywordPrefix; + private String keywordSuffix; + private String aliasPrefix; + private String aliasSuffix; - DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, - String aliasPrefix, String aliasSuffix) { - this.feature = feature; - this.desc = desc; - this.driver = driver; - this.keywordPrefix = keywordPrefix; - this.keywordSuffix = keywordSuffix; - this.aliasPrefix = aliasPrefix; - this.aliasSuffix = aliasSuffix; - } + DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, + String aliasPrefix, String aliasSuffix) { + this.feature = feature; + this.desc = desc; + this.driver = driver; + this.keywordPrefix = keywordPrefix; + this.keywordSuffix = keywordSuffix; + this.aliasPrefix = aliasPrefix; + this.aliasSuffix = aliasSuffix; + } - public static DataTypeEnum urlOf(String jdbcUrl) { - String url = jdbcUrl.toLowerCase().trim(); - for (DataTypeEnum dataTypeEnum : values()) { - if (url.startsWith(JDBC_URL_PREFIX + dataTypeEnum.feature)) { - try { - Class aClass = Class.forName(dataTypeEnum.getDriver()); - if (null == aClass) { - throw new BadRequestException("Unable to get driver instance for jdbcUrl: " + jdbcUrl); - } - } catch (ClassNotFoundException e) { - throw new BadRequestException("Unable to get driver instance: " + jdbcUrl); - } - return dataTypeEnum; - } + public static DataTypeEnum urlOf(String jdbcUrl) { + String url = jdbcUrl.toLowerCase().trim(); + for (DataTypeEnum dataTypeEnum : values()) { + if (url.startsWith(JDBC_URL_PREFIX + dataTypeEnum.feature)) { + try { + Class aClass = Class.forName(dataTypeEnum.getDriver()); + if (null == aClass) { + throw new BadRequestException("Unable to get driver instance for jdbcUrl: " + jdbcUrl); + } + } catch (ClassNotFoundException e) { + throw new BadRequestException("Unable to get driver instance: " + jdbcUrl); } - return null; + return dataTypeEnum; + } } + return null; + } - public String getFeature() { - return feature; - } + public String getFeature() { + return feature; + } - public String getDesc() { - return desc; - } + public String getDesc() { + return desc; + } - public String getDriver() { - return driver; - } + public String getDriver() { + return driver; + } - public String getKeywordPrefix() { - return keywordPrefix; - } + public String getKeywordPrefix() { + return keywordPrefix; + } - public String getKeywordSuffix() { - return keywordSuffix; - } + public String getKeywordSuffix() { + return keywordSuffix; + } - public String getAliasPrefix() { - return aliasPrefix; - } + public String getAliasPrefix() { + return aliasPrefix; + } - public String getAliasSuffix() { - return aliasSuffix; - } + public String getAliasSuffix() { + return aliasSuffix; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQTypeEnum.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQTypeEnum.java index c51b50c4..e416831b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQTypeEnum.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQTypeEnum.java @@ -19,56 +19,56 @@ package cn.odboy.framework.mybatisplus.config; * 动态查询 枚举 */ public enum KitMpQTypeEnum { - /** - * 相等 - */ - EQUAL - /** - * 大于等于 - */ - , GREATER_THAN - /** - * 小于等于 - */ - , LESS_THAN - /** - * 中模糊查询 - */ - , INNER_LIKE - /** - * 左模糊查询 - */ - , LEFT_LIKE - /** - * 右模糊查询 - */ - , RIGHT_LIKE - /** - * 小于 - */ - , LESS_THAN_NQ - /** - * 包含 - */ - , IN - /** - * 不包含 - */ - , NOT_IN - /** - * 不等于 - */ - , NOT_EQUAL - /** - * between(注:被注解的属性一定得是数组或者集合, 长度大于等于2) - */ - , BETWEEN - /** - * 不为空 - */ - , NOT_NULL - /** - * 为空 - */ - , IS_NULL + /** + * 相等 + */ + EQUAL + /** + * 大于等于 + */ + , GREATER_THAN + /** + * 小于等于 + */ + , LESS_THAN + /** + * 中模糊查询 + */ + , INNER_LIKE + /** + * 左模糊查询 + */ + , LEFT_LIKE + /** + * 右模糊查询 + */ + , RIGHT_LIKE + /** + * 小于 + */ + , LESS_THAN_NQ + /** + * 包含 + */ + , IN + /** + * 不包含 + */ + , NOT_IN + /** + * 不等于 + */ + , NOT_EQUAL + /** + * between(注:被注解的属性一定得是数组或者集合, 长度大于等于2) + */ + , BETWEEN + /** + * 不为空 + */ + , NOT_NULL + /** + * 为空 + */ + , IS_NULL } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQuery.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQuery.java index 08dadb40..e4e25959 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQuery.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/KitMpQuery.java @@ -28,16 +28,19 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface KitMpQuery { - /** - * 基本对象的属性名 - */ - String propName() default ""; - /** - * 查询方式 - */ - KitMpQTypeEnum type() default KitMpQTypeEnum.EQUAL; - /** - * 多字段模糊搜索, 仅支持String类型字段, 多个用逗号隔开, 如@MpQuery(blurry = "email,username") - */ - String blurry() default ""; + + /** + * 基本对象的属性名 + */ + String propName() default ""; + + /** + * 查询方式 + */ + KitMpQTypeEnum type() default KitMpQTypeEnum.EQUAL; + + /** + * 多字段模糊搜索, 仅支持String类型字段, 多个用逗号隔开, 如@MpQuery(blurry = "email,username") + */ + String blurry() default ""; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java index 37fa8063..78991f7a 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpCustomP6SpyLogger.java @@ -24,44 +24,45 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class MpCustomP6SpyLogger implements MessageFormattingStrategy { - /** - * 重置颜色 - */ - private static final String RESET = "\u001B[0m"; - /** - * 红色 - */ - private static final String RED = "\u001B[31m"; - /** - * 绿色 - */ - private static final String GREEN = "\u001B[32m"; - /** - * 蓝色 - */ - private static final String BLUE = "\u001B[34m"; - /** - * 格式化 sql - * - * @param connectionId 连接id - * @param now 当前时间 - * @param elapsed 执行时长 - * @param category sql分类 - * @param prepared 预编译sql - * @param sql 执行sql - * @param url 数据库连接url - * @return 格式化后的sql - */ - @Override - public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, - String sql, String url) { - // 去掉换行和多余空格 - if (StrUtil.isNotBlank(sql)) { - sql = sql.replaceAll("\\s+", " ").trim(); - } - // 格式化并加上颜色 - return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, - Thread.currentThread().getName(), BLUE, elapsed, RESET, sql); + /** + * 重置颜色 + */ + private static final String RESET = "\u001B[0m"; + /** + * 红色 + */ + private static final String RED = "\u001B[31m"; + /** + * 绿色 + */ + private static final String GREEN = "\u001B[32m"; + /** + * 蓝色 + */ + private static final String BLUE = "\u001B[34m"; + + /** + * 格式化 sql + * + * @param connectionId 连接id + * @param now 当前时间 + * @param elapsed 执行时长 + * @param category sql分类 + * @param prepared 预编译sql + * @param sql 执行sql + * @param url 数据库连接url + * @return 格式化后的sql + */ + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, + String sql, String url) { + // 去掉换行和多余空格 + if (StrUtil.isNotBlank(sql)) { + sql = sql.replaceAll("\\s+", " ").trim(); } + // 格式化并加上颜色 + return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, + Thread.currentThread().getName(), BLUE, elapsed, RESET, sql); + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java index 71bcff71..9abb4d34 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MpInsertBatchSqlInjector.java @@ -31,13 +31,14 @@ import org.apache.ibatis.session.Configuration; * @date 2025-01-11 */ public class MpInsertBatchSqlInjector extends DefaultSqlInjector { - @Override - public List getMethodList(Configuration configuration, Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(configuration, mapperClass, tableInfo); - // 新增自定义方法, InsertBatchSomeColumn这个方法Mp没有开放出来 - methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); - // 全量更新, 包括null字段 - methodList.add(new AlwaysUpdateSomeColumnById(i -> i.getFieldFill() != FieldFill.INSERT)); - return methodList; - } + + @Override + public List getMethodList(Configuration configuration, Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(configuration, mapperClass, tableInfo); + // 新增自定义方法, InsertBatchSomeColumn这个方法Mp没有开放出来 + methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); + // 全量更新, 包括null字段 + methodList.add(new AlwaysUpdateSomeColumnById(i -> i.getFieldFill() != FieldFill.INSERT)); + return methodList; + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MybatisPlusConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MybatisPlusConfig.java index b119884d..1337e07f 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MybatisPlusConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/MybatisPlusConfig.java @@ -27,28 +27,29 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class MybatisPlusConfig { - @Bean - public MybatisPlusInterceptor paginationInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // MySQL的分页拦截器 - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); - paginationInnerInterceptor.setMaxLimit(500L); - /// 这个配置会导致:当分页没数据时, 游标从0开始,会导致无论page为什么值,就算分页超出最大页数,依然能够查询到 - /// paginationInnerInterceptor.setOverflow(true); - paginationInnerInterceptor.setOptimizeJoin(true); - interceptor.addInnerInterceptor(paginationInnerInterceptor); - // 乐观锁 - interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); - // 防全表更新与删除 - interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); - return interceptor; - } - /** - * Mapper支持批量插入 - */ - @Bean - public MpInsertBatchSqlInjector insertBatchSqlInjector() { - return new MpInsertBatchSqlInjector(); - } + @Bean + public MybatisPlusInterceptor paginationInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // MySQL的分页拦截器 + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); + paginationInnerInterceptor.setMaxLimit(500L); + /// 这个配置会导致:当分页没数据时, 游标从0开始,会导致无论page为什么值,就算分页超出最大页数,依然能够查询到 + /// paginationInnerInterceptor.setOverflow(true); + paginationInnerInterceptor.setOptimizeJoin(true); + interceptor.addInnerInterceptor(paginationInnerInterceptor); + // 乐观锁 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + // 防全表更新与删除 + interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + return interceptor; + } + + /** + * Mapper支持批量插入 + */ + @Bean + public MpInsertBatchSqlInjector insertBatchSqlInjector() { + return new MpInsertBatchSqlInjector(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java index f5abd6e0..2247f06f 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/config/RemoveDruidAdConfig.java @@ -41,52 +41,53 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true) public class RemoveDruidAdConfig { - /** - * 方法名: removeDruidAdFilterRegistrationBean 方法描述 除去页面底部的广告 - * - * @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties - * @return org.springframework.boot.web.servlet.FilterRegistrationBean - */ - @Bean - public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) { - // 获取web监控页面的参数 - DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); - // 提取common.js的配置路径 - String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; - String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); - final String filePath = "support/http/resources/js/common.js"; - //创建filter进行过滤 - Filter filter = new Filter() { - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest)request; - HttpServletResponse httpResponse = (HttpServletResponse)response; - if (httpRequest.getRequestURI().endsWith("js/common.js")) { - // 获取common.js - String text = Utils.readFromResource(filePath); - // 正则替换banner, 除去底部的广告信息 - text = text.replaceAll("
", ""); - text = text.replaceAll("powered by.*?shrek.wang", ""); - httpResponse.setContentType("application/javascript"); - httpResponse.setCharacterEncoding("UTF-8"); - httpResponse.getWriter().write(text); - } else { - chain.doFilter(request, response); - } - } + /** + * 方法名: removeDruidAdFilterRegistrationBean 方法描述 除去页面底部的广告 + * + * @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties + * @return org.springframework.boot.web.servlet.FilterRegistrationBean + */ + @Bean + public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + //创建filter进行过滤 + Filter filter = new Filter() { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } - @Override - public void destroy() { - } - }; - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(filter); - registrationBean.addUrlPatterns(commonJsPattern); - return registrationBean; - } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + if (httpRequest.getRequestURI().endsWith("js/common.js")) { + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered by.*?shrek.wang", ""); + httpResponse.setContentType("application/javascript"); + httpResponse.setCharacterEncoding("UTF-8"); + httpResponse.getWriter().write(text); + } else { + chain.doFilter(request, response); + } + } + + @Override + public void destroy() { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java index e33d4a33..96e5bd87 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpAnyQUtil.java @@ -29,53 +29,54 @@ import java.util.List; * @date 2025-05-15 */ public class KitMpAnyQUtil { - public static T selectOne(BaseMapper baseMapper, Object queryParams) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - return baseMapper.selectOne(queryWrapper); - } - public static M selectOne(BaseMapper baseMapper, Object queryParams, Class mapperClazz) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - T mapperTarget = baseMapper.selectOne(queryWrapper); - if (mapperTarget == null) { - return null; - } - return BeanUtil.copyProperties(mapperTarget, mapperClazz); - } + public static T selectOne(BaseMapper baseMapper, Object queryParams) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + return baseMapper.selectOne(queryWrapper); + } - public static List selectList(BaseMapper baseMapper, Object queryParams) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - return baseMapper.selectList(queryWrapper); + public static M selectOne(BaseMapper baseMapper, Object queryParams, Class mapperClazz) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + T mapperTarget = baseMapper.selectOne(queryWrapper); + if (mapperTarget == null) { + return null; } + return BeanUtil.copyProperties(mapperTarget, mapperClazz); + } - public static List selectList(BaseMapper baseMapper, Object queryParams, Class mapperClazz) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - List mapperTarget = baseMapper.selectList(queryWrapper); - if (mapperTarget == null) { - return new ArrayList<>(); - } - return BeanUtil.copyToList(mapperTarget, mapperClazz); - } + public static List selectList(BaseMapper baseMapper, Object queryParams) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + return baseMapper.selectList(queryWrapper); + } - public static Long selectCount(BaseMapper baseMapper, Object queryParams) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - return baseMapper.selectCount(queryWrapper); + public static List selectList(BaseMapper baseMapper, Object queryParams, Class mapperClazz) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + List mapperTarget = baseMapper.selectList(queryWrapper); + if (mapperTarget == null) { + return new ArrayList<>(); } + return BeanUtil.copyToList(mapperTarget, mapperClazz); + } - public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - return baseMapper.selectPage(page, queryWrapper); - } + public static Long selectCount(BaseMapper baseMapper, Object queryParams) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + return baseMapper.selectCount(queryWrapper); + } - public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams, - Class mapperClazz) { - QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); - Page tPage = baseMapper.selectPage(page, queryWrapper); - Page mapperTarget = new Page<>(); - mapperTarget.setRecords(BeanUtil.copyToList(tPage.getRecords(), mapperClazz)); - mapperTarget.setTotal(tPage.getTotal()); - mapperTarget.setSize(tPage.getSize()); - mapperTarget.setCurrent(tPage.getCurrent()); - return mapperTarget; - } + public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + return baseMapper.selectPage(page, queryWrapper); + } + + public static Page selectPage(BaseMapper baseMapper, Page page, Object queryParams, + Class mapperClazz) { + QueryWrapper queryWrapper = KitMpQUtil.build(queryParams); + Page tPage = baseMapper.selectPage(page, queryWrapper); + Page mapperTarget = new Page<>(); + mapperTarget.setRecords(BeanUtil.copyToList(tPage.getRecords(), mapperClazz)); + mapperTarget.setTotal(tPage.getTotal()); + mapperTarget.setSize(tPage.getSize()); + mapperTarget.setCurrent(tPage.getCurrent()); + return mapperTarget; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java index 46fb5d7d..c24f1b46 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpCmdGenUtil.java @@ -48,165 +48,166 @@ import org.apache.ibatis.annotations.Mapper; */ @Data public class KitMpCmdGenUtil { - // 项目根路径。生成结果 C:\Users\Administrator\Documents\GitHub\cutejava\cutejava - private static final String projectRootPath = System.getProperty("user.dir") + "/"; - /** - * 数据库类型 MySQL - */ - private static final IDbQuery DB_QUERY = new MySqlQuery(); - /** - * 类型转换 - */ - private static final String TYPE_TINY_INT = "tinyint"; - private static final String TYPE_DATETIME = "datetime"; - private static final String TYPE_DATE = "date"; - private String databaseUrl; - private String databaseUsername; - private String databasePassword; - private String driverClassName; - private String parentPackageName = "cn.odboy"; - private String parentModuleName; - private static Consumer getEntityConfigConsumer() { - return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder().enableLombok() - // 如果不需要生成注解, 去掉.enableTableFieldAnnotation() - .enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel) - .columnNaming(NamingStrategy.underline_to_camel).idType(IdType.AUTO); - } + // 项目根路径。生成结果 C:\Users\Administrator\Documents\GitHub\cutejava\cutejava + private static final String projectRootPath = System.getProperty("user.dir") + "/"; + /** + * 数据库类型 MySQL + */ + private static final IDbQuery DB_QUERY = new MySqlQuery(); + /** + * 类型转换 + */ + private static final String TYPE_TINY_INT = "tinyint"; + private static final String TYPE_DATETIME = "datetime"; + private static final String TYPE_DATE = "date"; + private String databaseUrl; + private String databaseUsername; + private String databasePassword; + private String driverClassName; + private String parentPackageName = "cn.odboy"; + private String parentModuleName; - private static Consumer getStrategyConfigConsumer(List tableNames) { - return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter() - .addInclude(tableNames) - // 实体类生成策略 - .entityBuilder().superClass(KitBaseUserTimeTb.class) - .addIgnoreColumns("create_time", "update_time", "create_by", "update_by") - // 开启生成实体时生成字段注解。 - // 会在实体类的属性前,添加[@TableField("nickname")] - .enableTableFieldAnnotation().disableSerialVersionUID() - // 阶段2:Mapper策略配置 - .mapperBuilder() - // 开启 @Mapper 注解。 - // 会在mapper接口上添加注解[@Mapper] - // .enableMapperAnnotation() - // 启用 BaseResultMap 生成。 - // 会在mapper.xml文件生成[通用查询映射结果]配置。 - // .enableBaseResultMap() - // 启用 BaseColumnList。 - // 会在mapper.xml文件生成[通用查询结果列 ]配置 - // .enableBaseColumnList() - // 阶段4:Controller策略配置 - .controllerBuilder() - // 会在控制类中加[@RestController]注解。 - .enableRestStyle() - // 开启驼峰转连字符 - .enableHyphenStyle().build(); - } + private static Consumer getEntityConfigConsumer() { + return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder().enableLombok() + // 如果不需要生成注解, 去掉.enableTableFieldAnnotation() + .enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel) + .columnNaming(NamingStrategy.underline_to_camel).idType(IdType.AUTO); + } - private static Consumer getGlobalConfigConsumer() { - String outputDir = projectRootPath + "CodeGen"; - return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen") - .commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK); - } + private static Consumer getStrategyConfigConsumer(List tableNames) { + return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter() + .addInclude(tableNames) + // 实体类生成策略 + .entityBuilder().superClass(KitBaseUserTimeTb.class) + .addIgnoreColumns("create_time", "update_time", "create_by", "update_by") + // 开启生成实体时生成字段注解。 + // 会在实体类的属性前,添加[@TableField("nickname")] + .enableTableFieldAnnotation().disableSerialVersionUID() + // 阶段2:Mapper策略配置 + .mapperBuilder() + // 开启 @Mapper 注解。 + // 会在mapper接口上添加注解[@Mapper] + // .enableMapperAnnotation() + // 启用 BaseResultMap 生成。 + // 会在mapper.xml文件生成[通用查询映射结果]配置。 + // .enableBaseResultMap() + // 启用 BaseColumnList。 + // 会在mapper.xml文件生成[通用查询结果列 ]配置 + // .enableBaseColumnList() + // 阶段4:Controller策略配置 + .controllerBuilder() + // 会在控制类中加[@RestController]注解。 + .enableRestStyle() + // 开启驼峰转连字符 + .enableHyphenStyle().build(); + } - private static Consumer getStrategyConfigConsumer() { - return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class) - .formatMapperFileName("%sMapper").formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb"); - } + private static Consumer getGlobalConfigConsumer() { + String outputDir = projectRootPath + "CodeGen"; + return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen") + .commentDate("yyyy-MM-dd").dateType(DateType.TIME_PACK); + } - private static Consumer getDataSourceConfigConsumer() { - return builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> { - int typeCode = metaInfo.getJdbcType().TYPE_CODE; - if (typeCode == Types.SMALLINT) { - return DbColumnType.INTEGER; - } - if (typeCode == Types.DATE) { - return DbColumnType.DATE; - } - if (typeCode == Types.TIME) { - return DbColumnType.DATE; - } - if (typeCode == Types.TIMESTAMP) { - return DbColumnType.DATE; - } - return typeRegistry.getColumnType(metaInfo); - }); - } + private static Consumer getStrategyConfigConsumer() { + return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class) + .formatMapperFileName("%sMapper").formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb"); + } - /** - * 代码生成函数 - * - * @param moduleName 模块名称 - * @param tablePrefix 表前缀(可空) - * @param tableNames 表名称, 多个用逗号分隔 - */ - public void gen(String moduleName, String tablePrefix, List tableNames) { - this.parentModuleName = moduleName; - // 1.数据库配置 - DataSourceConfig.Builder dataSourceConfigBuilder = - new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, - this.databasePassword).driverClassName(this.driverClassName); - dataSourceConfigBuilder.dbQuery(DB_QUERY); - dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler()); - // 1.1.快速生成器 - FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder); - // 2.全局配置 - // 自定义类型转换 - fastAutoGenerator.dataSourceConfig(getDataSourceConfigConsumer()); - // 覆盖已生成文件 - // 添加swagger注解 - // 设置注释的作者 - // 设置注释的日期格式 - // 使用java8新的时间类型 - fastAutoGenerator.globalConfig(getGlobalConfigConsumer()); - // 3.包配置 - // 设置父包名 - // 设置父包模块名 - // 设置MVC下各个模块的包名 - // 设置XML资源文件的目录 - fastAutoGenerator.packageConfig(getPackageConfigConsumer()); - // 4.模板配置 - // 使用Freemarker引擎模板, 默认的是Velocity引擎模板 - AbstractTemplateEngine templateEngine = new FreemarkerTemplateEngine(); - fastAutoGenerator.templateEngine(templateEngine); - // 5.策略配置 - // 设置需要生成的表名 - // 设置过滤表前缀 - fastAutoGenerator.strategyConfig(getStrategyConfigConsumer(tableNames)); - if (tablePrefix != null) { - // 表前缀, 可多个 - fastAutoGenerator.strategyConfig( - strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix)); - } - // 5.1.Entity策略配置 - // 生成实体时生成字段的注解, 包括@TableId注解等 - // 数据库表和字段映射到实体的命名策略, 为下划线转驼峰 - // 全局主键类型为None - // 实体名称格式化为XXXEntity - fastAutoGenerator.strategyConfig(getEntityConfigConsumer()); - // 5.2.Controller策略配置 - // 开启生成@RestController控制器 - fastAutoGenerator.strategyConfig( - strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); - // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3 - // .Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I - fastAutoGenerator.strategyConfig( - strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService") - .formatServiceImplFileName("%sServiceImpl")); - // 5.4.Mapper策略配置 - // 格式化 mapper文件名,格式化xml实现类文件名称 - fastAutoGenerator.strategyConfig(getStrategyConfigConsumer()); - // 6.生成代码 - fastAutoGenerator.execute(); - } + private static Consumer getDataSourceConfigConsumer() { + return builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> { + int typeCode = metaInfo.getJdbcType().TYPE_CODE; + if (typeCode == Types.SMALLINT) { + return DbColumnType.INTEGER; + } + if (typeCode == Types.DATE) { + return DbColumnType.DATE; + } + if (typeCode == Types.TIME) { + return DbColumnType.DATE; + } + if (typeCode == Types.TIMESTAMP) { + return DbColumnType.DATE; + } + return typeRegistry.getColumnType(metaInfo); + }); + } - private Consumer getPackageConfigConsumer() { - String mapperPath = projectRootPath + "CodeGen/resources/mapper"; - if (StrUtil.isBlank(this.parentModuleName)) { - throw new BadRequestException("模块名称必填"); - } - return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName) - .moduleName(this.parentModuleName).entity("dal.dataobject").mapper("dal.mysql").service("service") - .serviceImpl("service.impl").controller("controller") - .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath)); + /** + * 代码生成函数 + * + * @param moduleName 模块名称 + * @param tablePrefix 表前缀(可空) + * @param tableNames 表名称, 多个用逗号分隔 + */ + public void gen(String moduleName, String tablePrefix, List tableNames) { + this.parentModuleName = moduleName; + // 1.数据库配置 + DataSourceConfig.Builder dataSourceConfigBuilder = + new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, + this.databasePassword).driverClassName(this.driverClassName); + dataSourceConfigBuilder.dbQuery(DB_QUERY); + dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler()); + // 1.1.快速生成器 + FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder); + // 2.全局配置 + // 自定义类型转换 + fastAutoGenerator.dataSourceConfig(getDataSourceConfigConsumer()); + // 覆盖已生成文件 + // 添加swagger注解 + // 设置注释的作者 + // 设置注释的日期格式 + // 使用java8新的时间类型 + fastAutoGenerator.globalConfig(getGlobalConfigConsumer()); + // 3.包配置 + // 设置父包名 + // 设置父包模块名 + // 设置MVC下各个模块的包名 + // 设置XML资源文件的目录 + fastAutoGenerator.packageConfig(getPackageConfigConsumer()); + // 4.模板配置 + // 使用Freemarker引擎模板, 默认的是Velocity引擎模板 + AbstractTemplateEngine templateEngine = new FreemarkerTemplateEngine(); + fastAutoGenerator.templateEngine(templateEngine); + // 5.策略配置 + // 设置需要生成的表名 + // 设置过滤表前缀 + fastAutoGenerator.strategyConfig(getStrategyConfigConsumer(tableNames)); + if (tablePrefix != null) { + // 表前缀, 可多个 + fastAutoGenerator.strategyConfig( + strategyConfigBuilder -> strategyConfigBuilder.addTablePrefix(tablePrefix)); } + // 5.1.Entity策略配置 + // 生成实体时生成字段的注解, 包括@TableId注解等 + // 数据库表和字段映射到实体的命名策略, 为下划线转驼峰 + // 全局主键类型为None + // 实体名称格式化为XXXEntity + fastAutoGenerator.strategyConfig(getEntityConfigConsumer()); + // 5.2.Controller策略配置 + // 开启生成@RestController控制器 + fastAutoGenerator.strategyConfig( + strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle()); + // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3 + // .Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I + fastAutoGenerator.strategyConfig( + strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService") + .formatServiceImplFileName("%sServiceImpl")); + // 5.4.Mapper策略配置 + // 格式化 mapper文件名,格式化xml实现类文件名称 + fastAutoGenerator.strategyConfig(getStrategyConfigConsumer()); + // 6.生成代码 + fastAutoGenerator.execute(); + } + + private Consumer getPackageConfigConsumer() { + String mapperPath = projectRootPath + "CodeGen/resources/mapper"; + if (StrUtil.isBlank(this.parentModuleName)) { + throw new BadRequestException("模块名称必填"); + } + return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName) + .moduleName(this.parentModuleName).entity("dal.dataobject").mapper("dal.mysql").service("service") + .serviceImpl("service.impl").controller("controller") + .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath)); + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java index c2c909df..ae95afd5 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/KitMpQUtil.java @@ -42,183 +42,190 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class KitMpQUtil { - public static QueryWrapper build(Q query) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (query == null) { - return queryWrapper; - } - Class clazz = query.getClass(); - try { - List fields = getAllFields(clazz, new ArrayList<>()); - for (Field field : fields) { - if (!field.canAccess(query)) { - field.setAccessible(true); - KitMpQuery q = field.getAnnotation(KitMpQuery.class); - if (q != null) { - String attributeName = getAttributeName(q, field); - Object fieldVal = field.get(query); - if (ObjectUtil.isNull(fieldVal) || "".equals(fieldVal)) { - continue; - } - if (StrUtil.isNotBlank(q.blurry())) { - handleBlurryQuery(queryWrapper, q.blurry(), fieldVal); - continue; - } - handleWrapper(q, queryWrapper, attributeName, fieldVal); - } - field.setAccessible(false); - } + + public static QueryWrapper build(Q query) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (query == null) { + return queryWrapper; + } + Class clazz = query.getClass(); + try { + List fields = getAllFields(clazz, new ArrayList<>()); + for (Field field : fields) { + if (!field.canAccess(query)) { + field.setAccessible(true); + KitMpQuery q = field.getAnnotation(KitMpQuery.class); + if (q != null) { + String attributeName = getAttributeName(q, field); + Object fieldVal = field.get(query); + if (ObjectUtil.isNull(fieldVal) || "".equals(fieldVal)) { + continue; } - } catch (Exception e) { - log.error("Failed to build query wrapper for class: {}", clazz.getName(), e); - } - return queryWrapper; - } - - private static String getAttributeName(KitMpQuery q, Field field) { - String attributeName = StrUtil.isBlank(q.propName()) ? field.getName() : q.propName(); - return StrUtil.toUnderlineCase(attributeName); - } - - private static void handleWrapper(KitMpQuery q, QueryWrapper queryWrapper, String attributeName, - Object fieldVal) { - switch (q.type()) { - case EQUAL: - queryWrapper.eq(attributeName, fieldVal); - break; - case GREATER_THAN: - queryWrapper.ge(attributeName, fieldVal); - break; - case LESS_THAN: - queryWrapper.le(attributeName, fieldVal); - break; - case LESS_THAN_NQ: - queryWrapper.lt(attributeName, fieldVal); - break; - case INNER_LIKE: - queryWrapper.like(attributeName, fieldVal); - break; - case LEFT_LIKE: - queryWrapper.likeLeft(attributeName, fieldVal); - break; - case RIGHT_LIKE: - queryWrapper.likeRight(attributeName, fieldVal); - break; - case IN: - handleInOrNotQuery(true, queryWrapper, attributeName, fieldVal); - break; - case NOT_IN: - handleInOrNotQuery(false, queryWrapper, attributeName, fieldVal); - break; - case NOT_EQUAL: - queryWrapper.ne(attributeName, fieldVal); - break; - case NOT_NULL: - queryWrapper.isNotNull(attributeName); - break; - case IS_NULL: - queryWrapper.isNull(attributeName); - break; - case BETWEEN: - handleBetweenQuery(queryWrapper, fieldVal, attributeName); - break; - default: - break; - } - } - - private static void handleInOrNotQuery(boolean b, QueryWrapper queryWrapper, String attributeName, - Object fieldVal) { - Collection wrapNotInVal = (Collection)fieldVal; - if (CollectionUtil.isNotEmpty(wrapNotInVal)) { - Optional anyValOptional = wrapNotInVal.stream().findAny(); - if (anyValOptional.isPresent()) { - Object o = anyValOptional.get(); - if (o instanceof Long) { - if (b) { - queryWrapper.in(attributeName, fieldVal); - } else { - queryWrapper.notIn(attributeName, fieldVal); - } - } else if (o instanceof Integer) { - if (b) { - queryWrapper.in(attributeName, fieldVal); - } else { - queryWrapper.notIn(attributeName, fieldVal); - } - } else { - throw new BadRequestException("InOrNotIn查询参数类型的对象属性值必须是Long/Integer类型集合"); - } + if (StrUtil.isNotBlank(q.blurry())) { + handleBlurryQuery(queryWrapper, q.blurry(), fieldVal); + continue; } + handleWrapper(q, queryWrapper, attributeName, fieldVal); + } + field.setAccessible(false); } + } + } catch (Exception e) { + log.error("Failed to build query wrapper for class: {}", clazz.getName(), e); } + return queryWrapper; + } - private static void handleBetweenQuery(QueryWrapper queryWrapper, Object fieldVal, - String finalAttributeName) { - if (fieldVal instanceof List) { - List between = new ArrayList<>((List)fieldVal); - int minLength = 2; - if (CollectionUtil.isNotEmpty(between) && between.size() >= minLength) { - queryWrapper.between(finalAttributeName, between.get(0), between.get(1)); - } else { - throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= 2"); - } + private static String getAttributeName(KitMpQuery q, Field field) { + String attributeName = StrUtil.isBlank(q.propName()) ? field.getName() : q.propName(); + return StrUtil.toUnderlineCase(attributeName); + } + + private static void handleWrapper(KitMpQuery q, QueryWrapper queryWrapper, String attributeName, + Object fieldVal) { + switch (q.type()) { + case EQUAL: + queryWrapper.eq(attributeName, fieldVal); + break; + case GREATER_THAN: + queryWrapper.ge(attributeName, fieldVal); + break; + case LESS_THAN: + queryWrapper.le(attributeName, fieldVal); + break; + case LESS_THAN_NQ: + queryWrapper.lt(attributeName, fieldVal); + break; + case INNER_LIKE: + queryWrapper.like(attributeName, fieldVal); + break; + case LEFT_LIKE: + queryWrapper.likeLeft(attributeName, fieldVal); + break; + case RIGHT_LIKE: + queryWrapper.likeRight(attributeName, fieldVal); + break; + case IN: + handleInOrNotQuery(true, queryWrapper, attributeName, fieldVal); + break; + case NOT_IN: + handleInOrNotQuery(false, queryWrapper, attributeName, fieldVal); + break; + case NOT_EQUAL: + queryWrapper.ne(attributeName, fieldVal); + break; + case NOT_NULL: + queryWrapper.isNotNull(attributeName); + break; + case IS_NULL: + queryWrapper.isNull(attributeName); + break; + case BETWEEN: + handleBetweenQuery(queryWrapper, fieldVal, attributeName); + break; + default: + break; + } + } + + private static void handleInOrNotQuery(boolean b, QueryWrapper queryWrapper, String attributeName, + Object fieldVal) { + Collection wrapNotInVal = (Collection) fieldVal; + if (CollectionUtil.isNotEmpty(wrapNotInVal)) { + Optional anyValOptional = wrapNotInVal.stream().findAny(); + if (anyValOptional.isPresent()) { + Object o = anyValOptional.get(); + if (o instanceof Long) { + if (b) { + queryWrapper.in(attributeName, fieldVal); + } else { + queryWrapper.notIn(attributeName, fieldVal); + } + } else if (o instanceof Integer) { + if (b) { + queryWrapper.in(attributeName, fieldVal); + } else { + queryWrapper.notIn(attributeName, fieldVal); + } } else { - throw new BadRequestException("BETWEEN类型的对象必须是一个List子集合"); + throw new BadRequestException("InOrNotIn查询参数类型的对象属性值必须是Long/Integer类型集合"); } + } } + } - /** - * 模糊多字段 - * - * @param queryWrapper / - * @param blurry / - * @param fieldVal / - * @param / - */ - private static void handleBlurryQuery(QueryWrapper queryWrapper, String blurry, Object fieldVal) { - List blurryList = - Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList()); - queryWrapper.and(wrapper -> { - for (String blurryItem : blurryList) { - String column = StrUtil.toUnderlineCase(blurryItem); - wrapper.or(); - wrapper.like(column, fieldVal.toString()); - } - }); + private static void handleBetweenQuery(QueryWrapper queryWrapper, Object fieldVal, + String finalAttributeName) { + if (fieldVal instanceof List) { + List between = new ArrayList<>((List) fieldVal); + int minLength = 2; + if (CollectionUtil.isNotEmpty(between) && between.size() >= minLength) { + queryWrapper.between(finalAttributeName, between.get(0), between.get(1)); + } else { + throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= 2"); + } + } else { + throw new BadRequestException("BETWEEN类型的对象必须是一个List子集合"); } + } - public static List getAllFields(Class clazz, List fields) { - if (clazz != null) { - fields.addAll(Arrays.asList(clazz.getDeclaredFields())); - getAllFields(clazz.getSuperclass(), fields); - } - return fields; - } + /** + * 模糊多字段 + * + * @param queryWrapper / + * @param blurry / + * @param fieldVal / + * @param / + */ + private static void handleBlurryQuery(QueryWrapper queryWrapper, String blurry, Object fieldVal) { + List blurryList = + Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList()); + queryWrapper.and(wrapper -> { + for (String blurryItem : blurryList) { + String column = StrUtil.toUnderlineCase(blurryItem); + wrapper.or(); + wrapper.like(column, fieldVal.toString()); + } + }); + } - public static void main(String[] args) { - QueryWrapper query = new QueryWrapper(); - query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2)); - query.eq("id", 1); - query.orderByDesc("id"); - System.err.println("getSqlSelect================================="); - System.err.println(query.getSqlSelect()); - System.err.println("getSqlSegment================================="); - System.err.println(query.getSqlSegment()); - System.err.println("getSqlComment================================="); - System.err.println(query.getSqlComment()); - System.err.println("getSqlSet================================="); - System.err.println(query.getSqlSet()); - System.err.println("getTargetSql================================="); - System.err.println(query.getTargetSql()); + public static List getAllFields(Class clazz, List fields) { + if (clazz != null) { + fields.addAll(Arrays.asList(clazz.getDeclaredFields())); + getAllFields(clazz.getSuperclass(), fields); } + return fields; + } - @TableName("test_domain") - private static class TestDomain { - @NotNull(groups = KitBaseUserTimeTb.Update.class) @TableId(value = "user_id", type = IdType.AUTO) private Long - id; - @TableField(value = "dept_id") private Long deptId; - @NotBlank private String username; - @NotBlank private String nickName; - } + public static void main(String[] args) { + QueryWrapper query = new QueryWrapper(); + query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2)); + query.eq("id", 1); + query.orderByDesc("id"); + System.err.println("getSqlSelect================================="); + System.err.println(query.getSqlSelect()); + System.err.println("getSqlSegment================================="); + System.err.println(query.getSqlSegment()); + System.err.println("getSqlComment================================="); + System.err.println(query.getSqlComment()); + System.err.println("getSqlSet================================="); + System.err.println(query.getSqlSet()); + System.err.println("getTargetSql================================="); + System.err.println(query.getTargetSql()); + } + + @TableName("test_domain") + private static class TestDomain { + + @NotNull(groups = KitBaseUserTimeTb.Update.class) + @TableId(value = "user_id", type = IdType.AUTO) + private Long + id; + @TableField(value = "dept_id") + private Long deptId; + @NotBlank + private String username; + @NotBlank + private String nickName; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java index c644c42d..9ddaf900 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpMapper.java @@ -41,139 +41,147 @@ import org.springframework.data.domain.Pageable; * @date 2022-04-03 */ public interface KitMpMapper extends BaseMapper { - /** - * 批量插入 - * - * @param entityList List - * @return 影响的行数 - */ - int insertBatchSomeColumn(List entityList); - /** - * 根据id全量更新 - * - * @param entity E - * @return 影响的行数 - */ - int alwaysUpdateSomeColumnById(@Param("et") E entity); - /** - * 获取字典 - * - * @param wrapper LambdaQueryWrapper - * @param keyName 键对应的列名称 - * @param valueName 值对应的列名称 - * @return Map - */ - default Map getMapWithKv(LambdaQueryWrapper wrapper, String keyName, String valueName) { - Map result = new ConcurrentHashMap<>(1); - List list = this.selectList(wrapper); - if (CollUtil.isEmpty(list)) { - return new HashMap<>(3); - } - E tempObj = list.stream().findFirst().orElse(null); - if (tempObj == null) { - return new HashMap<>(3); - } - Field[] fields = ReflectUtil.getFields(tempObj.getClass()); - for (E e : list) { - Field keyField = null; - Field valueField = null; - for (Field field : fields) { - String fieldName = field.getName(); - if (fieldName.equals(keyName)) { - keyField = field; - } else if (fieldName.equals(valueName)) { - valueField = field; - break; - } - } - String fieldKey = String.valueOf(ReflectUtil.getFieldValue(e, keyField)); - Object fieldValue = ReflectUtil.getFieldValue(e, valueField); - if (fieldKey != null) { - result.put(fieldKey, fieldValue); - } - } - return result; + + /** + * 批量插入 + * + * @param entityList List + * @return 影响的行数 + */ + int insertBatchSomeColumn(List entityList); + + /** + * 根据id全量更新 + * + * @param entity E + * @return 影响的行数 + */ + int alwaysUpdateSomeColumnById(@Param("et") E entity); + + /** + * 获取字典 + * + * @param wrapper LambdaQueryWrapper + * @param keyName 键对应的列名称 + * @param valueName 值对应的列名称 + * @return Map + */ + default Map getMapWithKv(LambdaQueryWrapper wrapper, String keyName, String valueName) { + Map result = new ConcurrentHashMap<>(1); + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return new HashMap<>(3); } - /** - * 条件查询列表, 并返回期望的对象 - * - * @param wrapper LambdaQueryWrapper - * @param clazz 期望的对象类型 - * @return List - */ - default List queryFeatureClazzList(LambdaQueryWrapper wrapper, Class clazz) { - List list = this.selectList(wrapper); - if (CollUtil.isEmpty(list)) { - return new ArrayList<>(); - } - return BeanUtil.copyToList(list, clazz); + E tempObj = list.stream().findFirst().orElse(null); + if (tempObj == null) { + return new HashMap<>(3); } - /** - * 条件查询列表, 并返回期望的对象 - * - * @param wrapper LambdaQueryWrapper - * @param clazz 期望的对象类型 - * @return List - */ - default List queryFeatureClazzList(LambdaQueryChainWrapper wrapper, Class clazz) { - List list = wrapper.list(); - if (CollUtil.isEmpty(list)) { - return new ArrayList<>(); + Field[] fields = ReflectUtil.getFields(tempObj.getClass()); + for (E e : list) { + Field keyField = null; + Field valueField = null; + for (Field field : fields) { + String fieldName = field.getName(); + if (fieldName.equals(keyName)) { + keyField = field; + } else if (fieldName.equals(valueName)) { + valueField = field; + break; } - return BeanUtil.copyToList(list, clazz); + } + String fieldKey = String.valueOf(ReflectUtil.getFieldValue(e, keyField)); + Object fieldValue = ReflectUtil.getFieldValue(e, valueField); + if (fieldKey != null) { + result.put(fieldKey, fieldValue); + } } - /** - * 条件查询分页列表, 并返回期望的对象 - * - * @param pageable 分页参数 - * @param wrapper LambdaQueryWrapper wrapper - * @param clazz 期望的对象类型 - * @return IPage - */ - default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper wrapper, - Class clazz) { - int pageNumber = pageable.getPageNumber(); - int pageSize = pageable.getPageSize(); - pageNumber = pageNumber <= 0 ? 1 : pageNumber; - pageSize = pageSize <= 0 ? 10 : pageSize; - IPage pageInfo = this.selectPage(new Page<>(pageNumber, pageSize), wrapper); - if (CollUtil.isEmpty(pageInfo.getRecords())) { - return new KitPageResult<>(new ArrayList<>(), pageInfo.getTotal()); - } - return new KitPageResult<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); + return result; + } + + /** + * 条件查询列表, 并返回期望的对象 + * + * @param wrapper LambdaQueryWrapper + * @param clazz 期望的对象类型 + * @return List + */ + default List queryFeatureClazzList(LambdaQueryWrapper wrapper, Class clazz) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); } - /** - * 条件查询分页列表, 并返回期望的对象 - * - * @param pageable 分页参数 - * @param wrapper LambdaQueryWrapper wrapper - * @param clazz 期望的对象类型 - * @return IPage - */ - default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper wrapper, - Class clazz) { - int pageNumber = pageable.getPageNumber(); - int pageSize = pageable.getPageSize(); - pageNumber = pageNumber <= 0 ? 1 : pageNumber; - pageSize = pageSize <= 0 ? 10 : pageSize; - IPage pageInfo = wrapper.page(new Page<>(pageNumber, pageSize)); - if (CollUtil.isEmpty(pageInfo.getRecords())) { - return KitPageUtil.emptyListData(); - } - return new KitPageResult<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); + return BeanUtil.copyToList(list, clazz); + } + + /** + * 条件查询列表, 并返回期望的对象 + * + * @param wrapper LambdaQueryWrapper + * @param clazz 期望的对象类型 + * @return List + */ + default List queryFeatureClazzList(LambdaQueryChainWrapper wrapper, Class clazz) { + List list = wrapper.list(); + if (CollUtil.isEmpty(list)) { + return new ArrayList<>(); } - /** - * 获取目标类 - * - * @param wrapper LambdaQueryChainWrapper wrapper - * @param clazz 期望的对象类型 - * @return T - */ - default T getFeatureClazz(LambdaQueryChainWrapper wrapper, Class clazz) { - E e = this.selectOne(wrapper); - if (e == null) { - return null; - } - return BeanUtil.copyProperties(e, clazz); + return BeanUtil.copyToList(list, clazz); + } + + /** + * 条件查询分页列表, 并返回期望的对象 + * + * @param pageable 分页参数 + * @param wrapper LambdaQueryWrapper wrapper + * @param clazz 期望的对象类型 + * @return IPage + */ + default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryWrapper wrapper, + Class clazz) { + int pageNumber = pageable.getPageNumber(); + int pageSize = pageable.getPageSize(); + pageNumber = pageNumber <= 0 ? 1 : pageNumber; + pageSize = pageSize <= 0 ? 10 : pageSize; + IPage pageInfo = this.selectPage(new Page<>(pageNumber, pageSize), wrapper); + if (CollUtil.isEmpty(pageInfo.getRecords())) { + return new KitPageResult<>(new ArrayList<>(), pageInfo.getTotal()); } + return new KitPageResult<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); + } + + /** + * 条件查询分页列表, 并返回期望的对象 + * + * @param pageable 分页参数 + * @param wrapper LambdaQueryWrapper wrapper + * @param clazz 期望的对象类型 + * @return IPage + */ + default KitPageResult queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper wrapper, + Class clazz) { + int pageNumber = pageable.getPageNumber(); + int pageSize = pageable.getPageSize(); + pageNumber = pageNumber <= 0 ? 1 : pageNumber; + pageSize = pageSize <= 0 ? 10 : pageSize; + IPage pageInfo = wrapper.page(new Page<>(pageNumber, pageSize)); + if (CollUtil.isEmpty(pageInfo.getRecords())) { + return KitPageUtil.emptyListData(); + } + return new KitPageResult<>(BeanUtil.copyToList(pageInfo.getRecords(), clazz), pageInfo.getTotal()); + } + + /** + * 获取目标类 + * + * @param wrapper LambdaQueryChainWrapper wrapper + * @param clazz 期望的对象类型 + * @return T + */ + default T getFeatureClazz(LambdaQueryChainWrapper wrapper, Class clazz) { + E e = this.selectOne(wrapper); + if (e == null) { + return null; + } + return BeanUtil.copyProperties(e, clazz); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java index a3d2450b..5610b2f5 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpService.java @@ -31,23 +31,41 @@ import java.util.List; * @date 2022-04-03 */ public interface KitMpService extends IService { - int saveFeatureClazz(G resources); - int saveFeatureClazzList(List resources); - int modifyFeatureClazzById(G resources); - boolean modifyFeatureClazzListById(Collection resources, int batchSize); - G queryFeatureClazzById(Serializable id, Class targetClazz); - T queryClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn); - G queryFeatureClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn, Class clazz); - List queryFeatureClazzListByIds(List ids, Class targetClazz); - List queryClazzListByArgs(Q criteria); - List queryClazzListByArgs(LambdaQueryWrapper wrapper); - List queryFeatureClazzListByArgs(Q criteria, Class targetClazz); - List queryFeatureClazzListByArgs(LambdaQueryWrapper wrapper, Class targetClazz); - KitPageResult queryClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable); - KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, - Class targetClazz); - KitPageResult queryFeatureClazzPageByArgs(Q criteria, IPage pageable, Class targetClazz); - KitPageResult queryClazzPageByArgs(Q criteria, IPage pageable); - int modifyClazzByArgs(LambdaQueryWrapper wrapper, T entity); - int removeClazzByArgs(LambdaQueryWrapper wrapper); + + int saveFeatureClazz(G resources); + + int saveFeatureClazzList(List resources); + + int modifyFeatureClazzById(G resources); + + boolean modifyFeatureClazzListById(Collection resources, int batchSize); + + G queryFeatureClazzById(Serializable id, Class targetClazz); + + T queryClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn); + + G queryFeatureClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn, Class clazz); + + List queryFeatureClazzListByIds(List ids, Class targetClazz); + + List queryClazzListByArgs(Q args); + + List queryClazzListByArgs(LambdaQueryWrapper wrapper); + + List queryFeatureClazzListByArgs(Q args, Class targetClazz); + + List queryFeatureClazzListByArgs(LambdaQueryWrapper wrapper, Class targetClazz); + + KitPageResult queryClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable); + + KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, + Class targetClazz); + + KitPageResult queryFeatureClazzPageByArgs(Q args, IPage pageable, Class targetClazz); + + KitPageResult queryClazzPageByArgs(Q args, IPage pageable); + + int modifyClazzByArgs(LambdaQueryWrapper wrapper, T entity); + + int removeClazzByArgs(LambdaQueryWrapper wrapper); } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java index 70f5da5e..a51853bc 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/mybatisplus/core/interfaces/KitMpServiceImpl.java @@ -38,221 +38,222 @@ import org.apache.ibatis.binding.MapperMethod; * @date 2022-04-03 */ public class KitMpServiceImpl, T> extends ServiceImpl { - /** - * 快速插入 - * - * @param resources / - */ - public int saveFeatureClazz(G resources) { - return getBaseMapper().insert(BeanUtil.copyProperties(resources, this.getEntityClass())); - } - /** - * 快速批量插入 - * - * @param resources / - */ - public int saveFeatureClazzList(List resources) { - return getBaseMapper().insertBatchSomeColumn(BeanUtil.copyToList(resources, this.getEntityClass())); - } + /** + * 快速插入 + * + * @param resources / + */ + public int saveFeatureClazz(G resources) { + return getBaseMapper().insert(BeanUtil.copyProperties(resources, this.getEntityClass())); + } - /** - * 快速更新 - * - * @param resources / - */ - public int modifyFeatureClazzById(G resources) { - return getBaseMapper().updateById(BeanUtil.copyProperties(resources, this.getEntityClass())); - } + /** + * 快速批量插入 + * + * @param resources / + */ + public int saveFeatureClazzList(List resources) { + return getBaseMapper().insertBatchSomeColumn(BeanUtil.copyToList(resources, this.getEntityClass())); + } - /** - * 快速批量更新 - * - * @param resources / - * @param batchSize 每批数量 - */ - public boolean modifyFeatureClazzListById(Collection resources, int batchSize) { - String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE_BY_ID); - return this.executeBatch(resources, batchSize, (sqlSession, entity) -> { - MapperMethod.ParamMap param = new MapperMethod.ParamMap<>(); - param.put("et", BeanUtil.copyProperties(entity, this.getEntityClass())); - sqlSession.update(sqlStatement, param); - }); - } + /** + * 快速更新 + * + * @param resources / + */ + public int modifyFeatureClazzById(G resources) { + return getBaseMapper().updateById(BeanUtil.copyProperties(resources, this.getEntityClass())); + } - /** - * 通过id查询 - * - * @param id / - * @param targetClazz 目标类型 - */ - public G queryFeatureClazzById(Serializable id, Class targetClazz) { - T entity = this.getById(id); - return entity == null ? null : BeanUtil.copyProperties(entity, targetClazz); - } + /** + * 快速批量更新 + * + * @param resources / + * @param batchSize 每批数量 + */ + public boolean modifyFeatureClazzListById(Collection resources, int batchSize) { + String sqlStatement = this.getSqlStatement(SqlMethod.UPDATE_BY_ID); + return this.executeBatch(resources, batchSize, (sqlSession, entity) -> { + MapperMethod.ParamMap param = new MapperMethod.ParamMap<>(); + param.put("et", BeanUtil.copyProperties(entity, this.getEntityClass())); + sqlSession.update(sqlStatement, param); + }); + } - /** - * 查一条数据 - * - * @param wrapper 制造条件 - */ - public T queryClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn) { - if (orderColumn == null) { - throw new BadRequestException("参数orderColumn(排序的列)必填"); - } - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - wrapper.last("limit 1"); - wrapper.orderByDesc(orderColumn); - List ts = baseMapper.selectList(wrapper); - if (ts.isEmpty()) { - return null; - } - return ts.stream().findFirst().get(); - } + /** + * 通过id查询 + * + * @param id / + * @param targetClazz 目标类型 + */ + public G queryFeatureClazzById(Serializable id, Class targetClazz) { + T entity = this.getById(id); + return entity == null ? null : BeanUtil.copyProperties(entity, targetClazz); + } - public G queryFeatureClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn, Class clazz) { - if (orderColumn == null) { - throw new BadRequestException("参数orderColumn(排序的列)必填"); - } - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - wrapper.last("limit 1"); - wrapper.orderByDesc(orderColumn); - List ts = baseMapper.selectList(wrapper); - if (ts.isEmpty()) { - return null; - } - return BeanUtil.copyProperties(ts.stream().findFirst().get(), clazz); + /** + * 查一条数据 + * + * @param wrapper 制造条件 + */ + public T queryClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn) { + if (orderColumn == null) { + throw new BadRequestException("参数orderColumn(排序的列)必填"); } + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); + } + wrapper.last("limit 1"); + wrapper.orderByDesc(orderColumn); + List ts = baseMapper.selectList(wrapper); + if (ts.isEmpty()) { + return null; + } + return ts.stream().findFirst().get(); + } - /** - * 通过id集合查询 - * - * @param ids / - * @param targetClazz 目标类型 - */ - public List queryFeatureClazzListByIds(List ids, Class targetClazz) { - List entitys = this.listByIds(ids); - return entitys == null || entitys.isEmpty() ? CollUtil.newArrayList() - : BeanUtil.copyToList(entitys, targetClazz); + public G queryFeatureClazzByArgs(LambdaQueryWrapper wrapper, SFunction orderColumn, Class clazz) { + if (orderColumn == null) { + throw new BadRequestException("参数orderColumn(排序的列)必填"); } + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); + } + wrapper.last("limit 1"); + wrapper.orderByDesc(orderColumn); + List ts = baseMapper.selectList(wrapper); + if (ts.isEmpty()) { + return null; + } + return BeanUtil.copyProperties(ts.stream().findFirst().get(), clazz); + } - /** - * 查有关的数据 - * - * @param criteria 动态条件 - */ - public List queryClazzListByArgs(Q criteria) { - QueryWrapper predicate = KitMpQUtil.build(criteria); - return baseMapper.selectList(predicate); - } + /** + * 通过id集合查询 + * + * @param ids / + * @param targetClazz 目标类型 + */ + public List queryFeatureClazzListByIds(List ids, Class targetClazz) { + List entitys = this.listByIds(ids); + return entitys == null || entitys.isEmpty() ? CollUtil.newArrayList() + : BeanUtil.copyToList(entitys, targetClazz); + } - /** - * 查有关的数据 - * - * @param wrapper 制造条件 - */ - public List queryClazzListByArgs(LambdaQueryWrapper wrapper) { - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - return baseMapper.selectList(wrapper); - } + /** + * 查有关的数据 + * + * @param args 动态条件 + */ + public List queryClazzListByArgs(Q args) { + QueryWrapper predicate = KitMpQUtil.build(args); + return baseMapper.selectList(predicate); + } - /** - * 查有关的数据并转成目标类型的数据 - * - * @param criteria 动态条件 - * @param targetClazz 目标类型 - */ - public List queryFeatureClazzListByArgs(Q criteria, Class targetClazz) { - QueryWrapper predicate = KitMpQUtil.build(criteria); - List data = baseMapper.selectList(predicate); - return BeanUtil.copyToList(data, targetClazz); + /** + * 查有关的数据 + * + * @param wrapper 制造条件 + */ + public List queryClazzListByArgs(LambdaQueryWrapper wrapper) { + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); } + return baseMapper.selectList(wrapper); + } - /** - * 查有关的数据并转换为目标类型 - * - * @param wrapper 制造条件 - * @param targetClazz 目标类型 - */ - public List queryFeatureClazzListByArgs(LambdaQueryWrapper wrapper, Class targetClazz) { - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - return BeanUtil.copyToList(baseMapper.selectList(wrapper), targetClazz); - } + /** + * 查有关的数据并转成目标类型的数据 + * + * @param args 动态条件 + * @param targetClazz 目标类型 + */ + public List queryFeatureClazzListByArgs(Q args, Class targetClazz) { + QueryWrapper predicate = KitMpQUtil.build(args); + List data = baseMapper.selectList(predicate); + return BeanUtil.copyToList(data, targetClazz); + } - /** - * 查有关的分页数据 - * - * @param wrapper 制造条件 - * @param pageable 分页参数 - */ - public KitPageResult queryClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable) { - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(originPageData.getRecords(), originPageData.getTotal()); + /** + * 查有关的数据并转换为目标类型 + * + * @param wrapper 制造条件 + * @param targetClazz 目标类型 + */ + public List queryFeatureClazzListByArgs(LambdaQueryWrapper wrapper, Class targetClazz) { + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); } + return BeanUtil.copyToList(baseMapper.selectList(wrapper), targetClazz); + } - /** - * 查有关的分页数据 - * - * @param wrapper 制造条件 - * @param pageable 分页参数 - * @param targetClazz 目标类型 - */ - public KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, - Class targetClazz) { - if (wrapper == null) { - wrapper = new LambdaQueryWrapper<>(); - } - IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), - originPageData.getTotal()); + /** + * 查有关的分页数据 + * + * @param wrapper 制造条件 + * @param pageable 分页参数 + */ + public KitPageResult queryClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable) { + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); } + IPage originPageData = baseMapper.selectPage(pageable, wrapper); + return new KitPageResult<>(originPageData.getRecords(), originPageData.getTotal()); + } - public KitPageResult queryFeatureClazzPageByArgs(Q criteria, IPage pageable, Class targetClazz) { - QueryWrapper wrapper = KitMpQUtil.build(criteria); - IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), - originPageData.getTotal()); + /** + * 查有关的分页数据 + * + * @param wrapper 制造条件 + * @param pageable 分页参数 + * @param targetClazz 目标类型 + */ + public KitPageResult queryFeatureClazzPageByArgs(LambdaQueryWrapper wrapper, IPage pageable, + Class targetClazz) { + if (wrapper == null) { + wrapper = new LambdaQueryWrapper<>(); } + IPage originPageData = baseMapper.selectPage(pageable, wrapper); + return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), + originPageData.getTotal()); + } - public KitPageResult queryClazzPageByArgs(Q criteria, IPage pageable) { - QueryWrapper wrapper = KitMpQUtil.build(criteria); - IPage originPageData = baseMapper.selectPage(pageable, wrapper); - return new KitPageResult<>(originPageData.getRecords(), originPageData.getTotal()); - } + public KitPageResult queryFeatureClazzPageByArgs(Q args, IPage pageable, Class targetClazz) { + QueryWrapper wrapper = KitMpQUtil.build(args); + IPage originPageData = baseMapper.selectPage(pageable, wrapper); + return new KitPageResult<>(BeanUtil.copyToList(originPageData.getRecords(), targetClazz), + originPageData.getTotal()); + } - /** - * 条件更新 - * - * @param wrapper 制造条件 - * @param entity 更新内容 - */ - public int modifyClazzByArgs(LambdaQueryWrapper wrapper, T entity) { - if (wrapper == null) { - throw new BadRequestException("参数wrapper必填"); - } - return baseMapper.update(entity, wrapper); - } + public KitPageResult queryClazzPageByArgs(Q args, IPage pageable) { + QueryWrapper wrapper = KitMpQUtil.build(args); + IPage originPageData = baseMapper.selectPage(pageable, wrapper); + return new KitPageResult<>(originPageData.getRecords(), originPageData.getTotal()); + } - /** - * 条件删除 - * - * @param wrapper 制造条件 - */ - public int removeClazzByArgs(LambdaQueryWrapper wrapper) { - if (wrapper == null) { - throw new BadRequestException("参数wrapper必填"); - } - return baseMapper.delete(wrapper); + /** + * 条件更新 + * + * @param wrapper 制造条件 + * @param entity 更新内容 + */ + public int modifyClazzByArgs(LambdaQueryWrapper wrapper, T entity) { + if (wrapper == null) { + throw new BadRequestException("参数wrapper必填"); } + return baseMapper.update(entity, wrapper); + } + + /** + * 条件删除 + * + * @param wrapper 制造条件 + */ + public int removeClazzByArgs(LambdaQueryWrapper wrapper) { + if (wrapper == null) { + throw new BadRequestException("参数wrapper必填"); + } + return baseMapper.delete(wrapper); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java index 8a2c8f5c..0b44e3ff 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/AppProperties.java @@ -36,11 +36,12 @@ import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "app") public class AppProperties { - private ContentRsaEncodeSettingModel rsa; - private JwtAuthSettingModel jwt; - private UserLoginSettingModel login; - private SwaggerApiDocSettingModel swagger; - private ThreadPoolSettingModel asyncTaskPool; - private CaptchaModel captcha; - private StorageOSSModel oss; + + private ContentRsaEncodeSettingModel rsa; + private JwtAuthSettingModel jwt; + private UserLoginSettingModel login; + private SwaggerApiDocSettingModel swagger; + private ThreadPoolSettingModel asyncTaskPool; + private CaptchaModel captcha; + private StorageOSSModel oss; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/CaptchaModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/CaptchaModel.java index 43a576e0..8597949b 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/CaptchaModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/CaptchaModel.java @@ -22,8 +22,9 @@ import lombok.Setter; @Getter @Setter public class CaptchaModel extends KitObject { - /** - * 验证码有效时间, 单位: 秒 - */ - private Long expireTime; + + /** + * 验证码有效时间, 单位: 秒 + */ + private Long expireTime; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ContentRsaEncodeSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ContentRsaEncodeSettingModel.java index 8314996b..a16001ff 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ContentRsaEncodeSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ContentRsaEncodeSettingModel.java @@ -25,5 +25,6 @@ import lombok.Setter; @Getter @Setter public class ContentRsaEncodeSettingModel extends KitObject { - private String privateKey; + + private String privateKey; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/JwtAuthSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/JwtAuthSettingModel.java index df2f75cf..679f9d4c 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/JwtAuthSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/JwtAuthSettingModel.java @@ -25,20 +25,21 @@ import lombok.Setter; @Getter @Setter public class JwtAuthSettingModel extends KitObject { - /** - * 必须使用最少88位的Base64对该令牌进行编码 - */ - private String base64Secret; - /** - * 令牌过期时间 此处单位/毫秒 - */ - private Long tokenValidityInSeconds; - /** - * token 续期检查 - */ - private Long detect; - /** - * 续期时间 - */ - private Long renew; + + /** + * 必须使用最少88位的Base64对该令牌进行编码 + */ + private String base64Secret; + /** + * 令牌过期时间 此处单位/毫秒 + */ + private Long tokenValidityInSeconds; + /** + * token 续期检查 + */ + private Long detect; + /** + * 续期时间 + */ + private Long renew; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/OSSConfigModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/OSSConfigModel.java index 5a0e846f..25d775c9 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/OSSConfigModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/OSSConfigModel.java @@ -22,20 +22,21 @@ import lombok.Setter; @Getter @Setter public class OSSConfigModel extends KitObject { - /** - * 服务地址 - */ - private String endpoint; - /** - * 存储桶名称 - */ - private String bucketName; - /** - * Access Key - */ - private String accessKey; - /** - * Secret Key - */ - private String secretKey; + + /** + * 服务地址 + */ + private String endpoint; + /** + * 存储桶名称 + */ + private String bucketName; + /** + * Access Key + */ + private String accessKey; + /** + * Secret Key + */ + private String secretKey; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/StorageOSSModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/StorageOSSModel.java index e9675120..0d3d1da7 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/StorageOSSModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/StorageOSSModel.java @@ -21,9 +21,10 @@ import lombok.Setter; @Getter @Setter public class StorageOSSModel { - /** - * 上传大小, 单位: M - */ - private Long maxSize; - private OSSConfigModel minio; + + /** + * 上传大小, 单位: M + */ + private Long maxSize; + private OSSConfigModel minio; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/SwaggerApiDocSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/SwaggerApiDocSettingModel.java index 75e3d49a..fd5630b1 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/SwaggerApiDocSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/SwaggerApiDocSettingModel.java @@ -26,5 +26,6 @@ import lombok.Setter; @Getter @Setter public class SwaggerApiDocSettingModel extends KitObject { - private Boolean enabled; + + private Boolean enabled; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ThreadPoolSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ThreadPoolSettingModel.java index 5131ddcb..e5d37ec3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ThreadPoolSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/ThreadPoolSettingModel.java @@ -28,20 +28,21 @@ import lombok.Setter; @Getter @Setter public class ThreadPoolSettingModel extends KitObject { - /** - * 核心线程池大小 - */ - private int corePoolSize; - /** - * 最大线程数 - */ - private int maxPoolSize; - /** - * 活跃时间 - */ - private int keepAliveSeconds; - /** - * 队列容量 - */ - private int queueCapacity; + + /** + * 核心线程池大小 + */ + private int corePoolSize; + /** + * 最大线程数 + */ + private int maxPoolSize; + /** + * 活跃时间 + */ + private int keepAliveSeconds; + /** + * 队列容量 + */ + private int queueCapacity; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java index 77e9c0fc..93fd140a 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginCaptchaSettingModel.java @@ -37,88 +37,90 @@ import lombok.Setter; @Getter @Setter public class UserLoginCaptchaSettingModel extends KitObject { - private CaptchaCodeEnum codeType; - /** - * 验证码有效期 分钟 - */ - private Long expiration = 5L; - /** - * 验证码内容长度 - */ - private int length = 4; - /** - * 验证码宽度 - */ - private int width = 111; - /** - * 验证码高度 - */ - private int height = 36; - /** - * 验证码字体 - */ - private String fontName; - /** - * 字体大小 - */ - private int fontSize = 25; - /** - * 依据配置信息生产验证码 - * - * @return / - */ - public Captcha getCaptcha() { - Captcha captcha; - switch (codeType) { - case ARITHMETIC: - // 算术类型 https://gitee.com/whvse/EasyCaptcha - captcha = new FixedArithmeticCaptcha(width, height); - // 几位数运算, 默认是两位 - captcha.setLen(length); - break; - case CHINESE: - captcha = new ChineseCaptcha(width, height); - captcha.setLen(length); - break; - case CHINESE_GIF: - captcha = new ChineseGifCaptcha(width, height); - captcha.setLen(length); - break; - case GIF: - captcha = new GifCaptcha(width, height); - captcha.setLen(length); - break; - case SPEC: - captcha = new SpecCaptcha(width, height); - captcha.setLen(length); - break; - default: - throw new BadRequestException("验证码配置信息错误!正确配置查看 LoginCodeEnum "); - } - if (StrUtil.isNotBlank(fontName)) { - captcha.setFont(new Font(fontName, Font.PLAIN, fontSize)); - } - return captcha; + private CaptchaCodeEnum codeType; + /** + * 验证码有效期 分钟 + */ + private Long expiration = 5L; + /** + * 验证码内容长度 + */ + private int length = 4; + /** + * 验证码宽度 + */ + private int width = 111; + /** + * 验证码高度 + */ + private int height = 36; + /** + * 验证码字体 + */ + private String fontName; + /** + * 字体大小 + */ + private int fontSize = 25; + + /** + * 依据配置信息生产验证码 + * + * @return / + */ + public Captcha getCaptcha() { + Captcha captcha; + switch (codeType) { + case ARITHMETIC: + // 算术类型 https://gitee.com/whvse/EasyCaptcha + captcha = new FixedArithmeticCaptcha(width, height); + // 几位数运算, 默认是两位 + captcha.setLen(length); + break; + case CHINESE: + captcha = new ChineseCaptcha(width, height); + captcha.setLen(length); + break; + case CHINESE_GIF: + captcha = new ChineseGifCaptcha(width, height); + captcha.setLen(length); + break; + case GIF: + captcha = new GifCaptcha(width, height); + captcha.setLen(length); + break; + case SPEC: + captcha = new SpecCaptcha(width, height); + captcha.setLen(length); + break; + default: + throw new BadRequestException("验证码配置信息错误!正确配置查看 LoginCodeEnum "); + } + if (StrUtil.isNotBlank(fontName)) { + captcha.setFont(new Font(fontName, Font.PLAIN, fontSize)); + } + return captcha; + } + + static class FixedArithmeticCaptcha extends ArithmeticCaptcha { + + public FixedArithmeticCaptcha(int width, int height) { + super(width, height); } - static class FixedArithmeticCaptcha extends ArithmeticCaptcha { - public FixedArithmeticCaptcha(int width, int height) { - super(width, height); - } - - @Override - protected char[] alphas() { - // 生成随机数字和运算符 - int n1 = num(1, 10), n2 = num(1, 10); - int opt = num(3); - // 计算结果 - int res = new int[] {n1 + n2, n1 - n2, n1 * n2}[opt]; - // 转换为字符运算符 - char optChar = "+-x".charAt(opt); - this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2)); - this.chars = String.valueOf(res); - return chars.toCharArray(); - } + @Override + protected char[] alphas() { + // 生成随机数字和运算符 + int n1 = num(1, 10), n2 = num(1, 10); + int opt = num(3); + // 计算结果 + int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt]; + // 转换为字符运算符 + char optChar = "+-x".charAt(opt); + this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2)); + this.chars = String.valueOf(res); + return chars.toCharArray(); } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginSettingModel.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginSettingModel.java index 7519d0ee..2fecb694 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginSettingModel.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/properties/model/UserLoginSettingModel.java @@ -27,9 +27,10 @@ import lombok.Setter; @Getter @Setter public class UserLoginSettingModel extends KitObject { - /** - * 账号单用户 登录 - */ - private boolean single = false; - private UserLoginCaptchaSettingModel captchaSetting; + + /** + * 账号单用户 登录 + */ + private boolean single = false; + private UserLoginCaptchaSettingModel captchaSetting; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/config/QuartzConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/config/QuartzConfig.java index 2ef9afc5..47f76dbd 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/config/QuartzConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/config/QuartzConfig.java @@ -32,30 +32,32 @@ import org.springframework.stereotype.Component; @Configuration @Scope("singleton") public class QuartzConfig { - /** - * 解决Job中注入Spring Bean为null的问题 - */ - @Component("quartzJobFactory") - public static class QuartzJobFactory extends AdaptableJobFactory { - private final AutowireCapableBeanFactory autowireCapableBeanFactory; - @Autowired - public QuartzJobFactory(AutowireCapableBeanFactory autowireCapableBeanFactory) { - this.autowireCapableBeanFactory = autowireCapableBeanFactory; - } + /** + * 解决Job中注入Spring Bean为null的问题 + */ + @Component("quartzJobFactory") + public static class QuartzJobFactory extends AdaptableJobFactory { - @NonNull - @Override - protected Object createJobInstance(@NonNull TriggerFiredBundle triggerFiredBundle) throws Exception { - try { - // 调用父类的方法, 把Job注入Spring中 - Object jobInstance = super.createJobInstance(triggerFiredBundle); - autowireCapableBeanFactory.autowireBean(jobInstance); - return jobInstance; - } catch (Exception e) { - log.error("Job注入Spring失败, {}", triggerFiredBundle, e); - throw e; - } - } + private final AutowireCapableBeanFactory autowireCapableBeanFactory; + + @Autowired + public QuartzJobFactory(AutowireCapableBeanFactory autowireCapableBeanFactory) { + this.autowireCapableBeanFactory = autowireCapableBeanFactory; } + + @NonNull + @Override + protected Object createJobInstance(@NonNull TriggerFiredBundle triggerFiredBundle) throws Exception { + try { + // 调用父类的方法, 把Job注入Spring中 + Object jobInstance = super.createJobInstance(triggerFiredBundle); + autowireCapableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } catch (Exception e) { + log.error("Job注入Spring失败, {}", triggerFiredBundle, e); + throw e; + } + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java index ae613bf8..04ebfe66 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/quartz/core/QuartzRunnable.java @@ -27,29 +27,30 @@ import org.springframework.util.ReflectionUtils; */ @Slf4j public class QuartzRunnable implements Callable { - private final Object target; - private final Method method; - private final String params; - public QuartzRunnable(String beanName, String methodName, String params) - throws NoSuchMethodException, SecurityException { - this.target = KitSpringBeanHolder.getBean(beanName); - this.params = params; - if (StringUtils.isNotBlank(params)) { - this.method = target.getClass().getDeclaredMethod(methodName, String.class); - } else { - this.method = target.getClass().getDeclaredMethod(methodName); - } - } + private final Object target; + private final Method method; + private final String params; - @Override - @SuppressWarnings({"unchecked", "all"}) - public Object call() throws Exception { - ReflectionUtils.makeAccessible(method); - if (StringUtils.isNotBlank(params)) { - return method.invoke(target, params); - } else { - return method.invoke(target); - } + public QuartzRunnable(String beanName, String methodName, String params) + throws NoSuchMethodException, SecurityException { + this.target = KitSpringBeanHolder.getBean(beanName); + this.params = params; + if (StringUtils.isNotBlank(params)) { + this.method = target.getClass().getDeclaredMethod(methodName, String.class); + } else { + this.method = target.getClass().getDeclaredMethod(methodName); } + } + + @Override + @SuppressWarnings({"unchecked", "all"}) + public Object call() throws Exception { + ReflectionUtils.makeAccessible(method); + if (StringUtils.isNotBlank(params)) { + return method.invoke(target, params); + } else { + return method.invoke(target); + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java index ddcd52a4..65f696b5 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/KitRedisHelper.java @@ -45,802 +45,803 @@ import org.springframework.stereotype.Component; @Component @SuppressWarnings({"unchecked", "all"}) public class KitRedisHelper { - private static final Logger log = LoggerFactory.getLogger(KitRedisHelper.class); - private RedisTemplate redisTemplate; - public KitRedisHelper(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - this.redisTemplate.setKeySerializer(new StringRedisSerializer()); - this.redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + private static final Logger log = LoggerFactory.getLogger(KitRedisHelper.class); + private RedisTemplate redisTemplate; + + public KitRedisHelper(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + this.redisTemplate.setKeySerializer(new StringRedisSerializer()); + this.redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) 注意:这里将会替换原有的时间 + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + return true; + } - /** - * 指定缓存失效时间 - * - * @param key 键 - * @param time 时间(秒) 注意:这里将会替换原有的时间 - */ - public boolean expire(String key, long time) { - try { - if (time > 0) { - redisTemplate.expire(key, time, TimeUnit.SECONDS); - } - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) 注意:这里将会替换原有的时间 + * @param timeUnit 单位 + */ + public boolean expire(String key, long time, TimeUnit timeUnit) { + try { + if (time > 0) { + redisTemplate.expire(key, time, timeUnit); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + public void del(String... keys) { + if (keys != null && keys.length > 0) { + if (keys.length == 1) { + boolean result = redisTemplate.delete(keys[0]); + log.debug("--------------------------------------------"); + log.debug(new StringBuilder("删除缓存:").append(keys[0]).append(", 结果:").append(result).toString()); + log.debug("--------------------------------------------"); + } else { + Set keySet = new HashSet<>(); + for (String key : keys) { + if (redisTemplate.hasKey(key)) { + keySet.add(key); + } } + long count = redisTemplate.delete(keySet); + log.debug("--------------------------------------------"); + log.debug("成功删除缓存:" + keySet.toString()); + log.debug("缓存删除数量:" + count + "个"); + log.debug("--------------------------------------------"); + } + } + } + + /** + * 批量模糊删除key + * + * @param pattern + */ + public void scanDel(String pattern) { + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + try (Cursor cursor = redisTemplate.executeWithStickyConnection( + (RedisCallback>) connection -> (Cursor) new ConvertingCursor<>( + connection.scan(options), redisTemplate.getKeySerializer()::deserialize))) { + while (cursor.hasNext()) { + redisTemplate.delete(cursor.next()); + } + } + } + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public T get(String key, Class clazz) { + Object value = key == null ? null : redisTemplate.opsForValue().get(key); + if (value == null) { + return null; + } + // 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型 by + if (!clazz.isInstance(value)) { + return JSON.parseObject(value.toString(), clazz); + } else if (clazz.isInstance(value)) { + return clazz.cast(value); + } else { + return null; + } + } + + /** + * 普通缓存获取 + * + * @param key 键 + * @param clazz 列表中元素的类型 + * @return 值 + */ + public List getList(String key, Class clazz) { + Object value = key == null ? null : redisTemplate.opsForValue().get(key); + if (value == null) { + return null; + } + if (value instanceof List) { + List list = (List) value; + // 检查每个元素是否为指定类型 + if (list.stream().allMatch(clazz::isInstance)) { + return list.stream().map(clazz::cast).collect(Collectors.toList()); + } + } + return null; + } + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public String getStr(String key) { + if (StrUtil.isBlank(key)) { + return null; + } + Object value = redisTemplate.opsForValue().get(key); + if (value == null) { + return null; + } else { + return String.valueOf(value); + } + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + List list = redisTemplate.opsForValue().multiGet(Sets.newHashSet(keys)); + List resultList = Lists.newArrayList(); + Optional.ofNullable(list) + .ifPresent(e -> list.forEach(ele -> Optional.ofNullable(ele).ifPresent(resultList::add))); + return resultList; + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + int attempt = 0; + while (attempt < 3) { + try { + redisTemplate.opsForValue().set(key, value); return true; + } catch (Exception e) { + attempt++; + log.error("Attempt {} failed: {}", attempt, e.getMessage(), e); + } } + return false; + } - /** - * 指定缓存失效时间 - * - * @param key 键 - * @param time 时间(秒) 注意:这里将会替换原有的时间 - * @param timeUnit 单位 - */ - public boolean expire(String key, long time, TimeUnit timeUnit) { - try { - if (time > 0) { - redisTemplate.expire(key, time, timeUnit); - } - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - return true; + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期, 注意:这里将会替换原有的时间 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 根据 key 获取过期时间 - * - * @param key 键 不能为null - * @return 时间(秒) 返回0代表为永久有效 - */ - public long getExpire(Object key) { - return redisTemplate.getExpire(key, TimeUnit.SECONDS); + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间,注意:这里将会替换原有的时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time, TimeUnit timeUnit) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } + // ================================Map================================= - /** - * 查找匹配key - * - * @param pattern key - * @return / - */ - public List scan(String pattern) { - ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(); - while (cursor.hasNext()) { - result.add(new String(cursor.next())); - } - try { - RedisConnectionUtils.releaseConnection(rc, factory); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - return result; - } + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } - /** - * 分页查询 key - * - * @param patternKey key - * @param page 页码 - * @param size 每页数目 - * @return / - */ - public List findKeysForPage(String patternKey, int page, int size) { - ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); - RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); - RedisConnection rc = Objects.requireNonNull(factory).getConnection(); - Cursor cursor = rc.scan(options); - List result = new ArrayList<>(size); - int tmpIndex = 0; - int fromIndex = page * size; - int toIndex = page * size + size; - while (cursor.hasNext()) { - if (tmpIndex >= fromIndex && tmpIndex < toIndex) { - result.add(new String(cursor.next())); - tmpIndex++; - continue; - } - // 获取到满足条件的数据后,就可以退出了 - if (tmpIndex >= toIndex) { - break; - } - tmpIndex++; - cursor.next(); - } - try { - RedisConnectionUtils.releaseConnection(rc, factory); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - return result; - } + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } - /** - * 判断key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public boolean hasKey(String key) { - try { - return redisTemplate.hasKey(key); - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 删除缓存 - * - * @param key 可以传一个值 或多个 - */ - public void del(String... keys) { - if (keys != null && keys.length > 0) { - if (keys.length == 1) { - boolean result = redisTemplate.delete(keys[0]); - log.debug("--------------------------------------------"); - log.debug(new StringBuilder("删除缓存:").append(keys[0]).append(", 结果:").append(result).toString()); - log.debug("--------------------------------------------"); - } else { - Set keySet = new HashSet<>(); - for (String key : keys) { - if (redisTemplate.hasKey(key)) { - keySet.add(key); - } - } - long count = redisTemplate.delete(keySet); - log.debug("--------------------------------------------"); - log.debug("成功删除缓存:" + keySet.toString()); - log.debug("缓存删除数量:" + count + "个"); - log.debug("--------------------------------------------"); - } - } + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 批量模糊删除key - * - * @param pattern - */ - public void scanDel(String pattern) { - ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); - try (Cursor cursor = redisTemplate.executeWithStickyConnection( - (RedisCallback>)connection -> (Cursor)new ConvertingCursor<>( - connection.scan(options), redisTemplate.getKeySerializer()::deserialize))) { - while (cursor.hasNext()) { - redisTemplate.delete(cursor.next()); - } - } + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } - // ============================String============================= + } - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public Object get(String key) { - return key == null ? null : redisTemplate.opsForValue().get(key); + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public T get(String key, Class clazz) { - Object value = key == null ? null : redisTemplate.opsForValue().get(key); - if (value == null) { - return null; - } - // 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型 by - if (!clazz.isInstance(value)) { - return JSON.parseObject(value.toString(), clazz); - } else if (clazz.isInstance(value)) { - return clazz.cast(value); - } else { - return null; - } - } + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } - /** - * 普通缓存获取 - * - * @param key 键 - * @param clazz 列表中元素的类型 - * @return 值 - */ - public List getList(String key, Class clazz) { - Object value = key == null ? null : redisTemplate.opsForValue().get(key); - if (value == null) { - return null; - } - if (value instanceof List) { - List list = (List)value; - // 检查每个元素是否为指定类型 - if (list.stream().allMatch(clazz::isInstance)) { - return list.stream().map(clazz::cast).collect(Collectors.toList()); - } - } - return null; - } + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } - /** - * 普通缓存获取 - * - * @param key 键 - * @return 值 - */ - public String getStr(String key) { - if (StrUtil.isBlank(key)) { - return null; - } - Object value = redisTemplate.opsForValue().get(key); - if (value == null) { - return null; - } else { - return String.valueOf(value); - } - } + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } - /** - * 批量获取 - * - * @param keys - * @return - */ - public List multiGet(List keys) { - List list = redisTemplate.opsForValue().multiGet(Sets.newHashSet(keys)); - List resultList = Lists.newArrayList(); - Optional.ofNullable(list) - .ifPresent(e -> list.forEach(ele -> Optional.ofNullable(ele).ifPresent(resultList::add))); - return resultList; - } + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + // ============================set============================= - /** - * 普通缓存放入 - * - * @param key 键 - * @param value 值 - * @return true成功 false失败 - */ - public boolean set(String key, Object value) { - int attempt = 0; - while (attempt < 3) { - try { - redisTemplate.opsForValue().set(key, value); - return true; - } catch (Exception e) { - attempt++; - log.error("Attempt {} failed: {}", attempt, e.getMessage(), e); - } - } - return false; + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; } + } - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期, 注意:这里将会替换原有的时间 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time) { - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 普通缓存放入并设置时间 - * - * @param key 键 - * @param value 值 - * @param time 时间,注意:这里将会替换原有的时间 - * @param timeUnit 类型 - * @return true成功 false 失败 - */ - public boolean set(String key, Object value, long time, TimeUnit timeUnit) { - try { - if (time > 0) { - redisTemplate.opsForValue().set(key, value, time, timeUnit); - } else { - set(key, value); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } - // ================================Map================================= + } - /** - * HashGet - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return 值 - */ - public Object hget(String key, String item) { - return redisTemplate.opsForHash().get(key, item); + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) 注意:这里将会替换原有的时间 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } + } - /** - * 获取hashKey对应的所有键值 - * - * @param key 键 - * @return 对应的多个键值 - */ - public Map hmget(String key) { - return redisTemplate.opsForHash().entries(key); + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } + } - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @return true 成功 false 失败 - */ - public boolean hmset(String key, Map map) { - try { - redisTemplate.opsForHash().putAll(key, map); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } + } + // ===============================list================================= - /** - * HashSet - * - * @param key 键 - * @param map 对应多个键值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true成功 false失败 - */ - public boolean hmset(String key, Map map, long time) { - try { - redisTemplate.opsForHash().putAll(key, map); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; } + } - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value) { - try { - redisTemplate.opsForHash().put(key, item, value); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } + } - /** - * 向一张hash表中放入数据,如果不存在将创建 - * - * @param key 键 - * @param item 项 - * @param value 值 - * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 - * @return true 成功 false失败 - */ - public boolean hset(String key, String item, Object value, long time) { - try { - redisTemplate.opsForHash().put(key, item, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; } + } - /** - * 删除hash表中的值 - * - * @param key 键 不能为null - * @param item 项 可以使多个 不能为null - */ - public void hdel(String key, Object... item) { - redisTemplate.opsForHash().delete(key, item); + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 判断hash表中是否有该项的值 - * - * @param key 键 不能为null - * @param item 项 不能为null - * @return true 存在 false不存在 - */ - public boolean hHasKey(String key, String item) { - return redisTemplate.opsForHash().hasKey(key, item); + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) 注意:这里将会替换原有的时间 + * @return + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * hash递增 如果不存在,就会创建一个 并把新增后的值返回 - * - * @param key 键 - * @param item 项 - * @param by 要增加几(大于0) - * @return - */ - public double hincr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, by); + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * hash递减 - * - * @param key 键 - * @param item 项 - * @param by 要减少记(小于0) - * @return - */ - public double hdecr(String key, String item, double by) { - return redisTemplate.opsForHash().increment(key, item, -by); + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) 注意:这里将会替换原有的时间 + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } - // ============================set============================= + } - /** - * 根据key获取Set中的所有值 - * - * @param key 键 - * @return - */ - public Set sGet(String key) { - try { - return redisTemplate.opsForSet().members(key); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; } + } - /** - * 根据value从一个set中查询,是否存在 - * - * @param key 键 - * @param value 值 - * @return true 存在 false不存在 - */ - public boolean sHasKey(String key, Object value) { - try { - return redisTemplate.opsForSet().isMember(key, value); - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + try { + return redisTemplate.opsForList().remove(key, count, value); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; } + } - /** - * 将数据放入set缓存 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSet(String key, Object... values) { - try { - return redisTemplate.opsForSet().add(key, values); - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } + /** + * @param prefix 前缀 + * @param ids id + */ + public void delByKeys(String prefix, Set ids) { + Set keys = new HashSet<>(); + for (Long id : ids) { + keys.addAll(redisTemplate.keys(new StringBuffer(prefix).append(id).toString())); } + long count = redisTemplate.delete(keys); + } + // ============================incr============================= - /** - * 将set数据放入缓存 - * - * @param key 键 - * @param time 时间(秒) 注意:这里将会替换原有的时间 - * @param values 值 可以是多个 - * @return 成功个数 - */ - public long sSetAndTime(String key, long time, Object... values) { - try { - Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) { - expire(key, time); - } - return count; - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } - } + /** + * 递增 + * + * @param key + * @return + */ + public Long increment(String key) { + return redisTemplate.opsForValue().increment(key); + } - /** - * 获取set缓存的长度 - * - * @param key 键 - * @return - */ - public long sGetSetSize(String key) { - try { - return redisTemplate.opsForSet().size(key); - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } - } + /** + * 递减 + * + * @param key + * @return + */ + public Long decrement(String key) { + return redisTemplate.opsForValue().decrement(key); + } - /** - * 移除值为value的 - * - * @param key 键 - * @param values 值 可以是多个 - * @return 移除的个数 - */ - public long setRemove(String key, Object... values) { - try { - Long count = redisTemplate.opsForSet().remove(key, values); - return count; - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } + // ============================校验============================= + public boolean isHealth() { + try { + redisTemplate.getConnectionFactory().getConnection().ping(); + return true; + } catch (Exception e) { + log.error("Redis health check failed: {}", e.getMessage(), e); + return false; } - // ===============================list================================= + } - /** - * 获取list缓存的内容 - * - * @param key 键 - * @param start 开始 - * @param end 结束 0 到 -1代表所有值 - * @return - */ - public List lGet(String key, long start, long end) { - try { - return redisTemplate.opsForList().range(key, start, end); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * 获取list缓存的长度 - * - * @param key 键 - * @return - */ - public long lGetListSize(String key) { - try { - return redisTemplate.opsForList().size(key); - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } - } - - /** - * 通过索引 获取list中的值 - * - * @param key 键 - * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 - * @return - */ - public Object lGetIndex(String key, long index) { - try { - return redisTemplate.opsForList().index(key, index); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, Object value) { - try { - redisTemplate.opsForList().rightPush(key, value); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) 注意:这里将会替换原有的时间 - * @return - */ - public boolean lSet(String key, Object value, long time) { - try { - redisTemplate.opsForList().rightPush(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @return - */ - public boolean lSet(String key, List value) { - try { - redisTemplate.opsForList().rightPushAll(key, value); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - } - - /** - * 将list放入缓存 - * - * @param key 键 - * @param value 值 - * @param time 时间(秒) 注意:这里将会替换原有的时间 - * @return - */ - public boolean lSet(String key, List value, long time) { - try { - redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) { - expire(key, time); - } - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - } - - /** - * 根据索引修改list中的某条数据 - * - * @param key 键 - * @param index 索引 - * @param value 值 - * @return / - */ - public boolean lUpdateIndex(String key, long index, Object value) { - try { - redisTemplate.opsForList().set(key, index, value); - return true; - } catch (Exception e) { - log.error(e.getMessage(), e); - return false; - } - } - - /** - * 移除N个值为value - * - * @param key 键 - * @param count 移除多少个 - * @param value 值 - * @return 移除的个数 - */ - public long lRemove(String key, long count, Object value) { - try { - return redisTemplate.opsForList().remove(key, count, value); - } catch (Exception e) { - log.error(e.getMessage(), e); - return 0; - } - } - - /** - * @param prefix 前缀 - * @param ids id - */ - public void delByKeys(String prefix, Set ids) { - Set keys = new HashSet<>(); - for (Long id : ids) { - keys.addAll(redisTemplate.keys(new StringBuffer(prefix).append(id).toString())); - } - long count = redisTemplate.delete(keys); - } - // ============================incr============================= - - /** - * 递增 - * - * @param key - * @return - */ - public Long increment(String key) { - return redisTemplate.opsForValue().increment(key); - } - - /** - * 递减 - * - * @param key - * @return - */ - public Long decrement(String key) { - return redisTemplate.opsForValue().decrement(key); - } - - // ============================校验============================= - public boolean isHealth() { - try { - redisTemplate.getConnectionFactory().getConnection().ping(); - return true; - } catch (Exception e) { - log.error("Redis health check failed: {}", e.getMessage(), e); - return false; - } - } - - /** - * 仅当键不存在时设置值(原子操作) - * - * @param key 键 - * @param value 值 - * @param timeout 过期时间 - * @param unit 时间单位 - * @return 如果设置成功返回true,否则返回false - */ - public Boolean setIfAbsent(String key, Object value, long timeout, TimeUnit unit) { - try { - String stringValue = ObjUtil.toString(value); - // 使用Redis的SETNX命令实现原子性操作 - Boolean success = redisTemplate.opsForValue().setIfAbsent(key, stringValue, timeout, unit); - return success != null && success; - } catch (Exception e) { - log.error("Redis setIfAbsent操作失败, key: {}", key, e); - return false; - } + /** + * 仅当键不存在时设置值(原子操作) + * + * @param key 键 + * @param value 值 + * @param timeout 过期时间 + * @param unit 时间单位 + * @return 如果设置成功返回true,否则返回false + */ + public Boolean setIfAbsent(String key, Object value, long timeout, TimeUnit unit) { + try { + String stringValue = ObjUtil.toString(value); + // 使用Redis的SETNX命令实现原子性操作 + Boolean success = redisTemplate.opsForValue().setIfAbsent(key, stringValue, timeout, unit); + return success != null && success; + } catch (Exception e) { + log.error("Redis setIfAbsent操作失败, key: {}", key, e); + return false; } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java index 4157d8f4..9cbe4099 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/redis/RedisConfiguration.java @@ -48,148 +48,150 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; @EnableCaching @AutoConfigureBefore(RedisAutoConfiguration.class) public class RedisConfiguration extends CachingConfigurerSupport { - /** - * 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)
未配置可能导致, 登录失败, 反复登录等问题 - */ - private static final String[] WHITELIST_STR = - {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", - "cn.odboy.task.dal.dataobject", "cn.odboy.task.dal.model",}; - /** - * 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式 - */ - @Bean - public RedisCacheConfiguration redisCacheConfiguration() { - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); - RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); - configuration = configuration.serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)) - .entryTtl(Duration.ofHours(2)); - return configuration; + /** + * 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)
未配置可能导致, 登录失败, 反复登录等问题 + */ + private static final String[] WHITELIST_STR = + {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", + "cn.odboy.task.dal.dataobject", "cn.odboy.task.dal.model",}; + + /** + * 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式 + */ + @Bean + public RedisCacheConfiguration redisCacheConfiguration() { + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); + configuration = configuration.serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)) + .entryTtl(Duration.ofHours(2)); + return configuration; + } + + @Bean(name = "redisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + // 指定 key 和 value 的序列化方案 + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + // value值的序列化采用fastJsonRedisSerializer + template.setValueSerializer(fastJsonRedisSerializer); + template.setHashValueSerializer(fastJsonRedisSerializer); + // 设置fastJson的序列化白名单 + for (String pack : WHITELIST_STR) { + JSONFactory.getDefaultObjectReaderProvider().addAutoTypeAccept(pack); } + // key的序列化采用StringRedisSerializer + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + template.setConnectionFactory(redisConnectionFactory); + return template; + } - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { - RedisTemplate template = new RedisTemplate<>(); - // 指定 key 和 value 的序列化方案 - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); - // value值的序列化采用fastJsonRedisSerializer - template.setValueSerializer(fastJsonRedisSerializer); - template.setHashValueSerializer(fastJsonRedisSerializer); - // 设置fastJson的序列化白名单 - for (String pack : WHITELIST_STR) { - JSONFactory.getDefaultObjectReaderProvider().addAutoTypeAccept(pack); - } - // key的序列化采用StringRedisSerializer - template.setKeySerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - template.setConnectionFactory(redisConnectionFactory); - return template; + /** + * 缓存管理器 + * + * @param redisConnectionFactory / + * @return 缓存管理器 + */ + @Bean + public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheConfiguration config = redisCacheConfiguration(); + return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build(); + } + + /** + * 自定义缓存key生成策略 + */ + @Bean + @Override + public KeyGenerator keyGenerator() { + return (target, method, params) -> { + Map container = new HashMap<>(8); + Class targetClassClass = target.getClass(); + // 类地址 + container.put("class", targetClassClass.toGenericString()); + // 方法名称 + container.put("methodName", method.getName()); + // 包名称 + container.put("package", targetClassClass.getPackage()); + // 参数列表 + for (int i = 0; i < params.length; i++) { + container.put(String.valueOf(i), params[i]); + } + // 转为JSON字符串 + String jsonString = JSON.toJSONString(container); + // 使用 MurmurHash 生成 hash + return Integer.toHexString(MurmurHash3.hash32x86(jsonString.getBytes())); + }; + } + + @Bean + @SuppressWarnings({"unchecked", "all"}) + public CacheErrorHandler errorHandler() { + return new SimpleCacheErrorHandler() { + @Override + public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) { + // 处理缓存读取错误 + log.error("Cache Get Error: {}", exception.getMessage()); + } + + @Override + public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) { + // 处理缓存写入错误 + log.error("Cache Put Error: {}", exception.getMessage()); + } + + @Override + public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) { + // 处理缓存删除错误 + log.error("Cache Evict Error: {}", exception.getMessage()); + } + + @Override + public void handleCacheClearError(RuntimeException exception, Cache cache) { + // 处理缓存清除错误 + log.error("Cache Clear Error: {}", exception.getMessage()); + } + }; + } + + /** + * Value 序列化 + * + * @param + */ + static class FastJsonRedisSerializer implements RedisSerializer { + + private final Class clazz; + + FastJsonRedisSerializer(Class clazz) { + super(); + this.clazz = clazz; } /** - * 缓存管理器 - * - * @param redisConnectionFactory / - * @return 缓存管理器 + * 序列化 */ - @Bean - public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { - RedisCacheConfiguration config = redisCacheConfiguration(); - return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build(); - } - - /** - * 自定义缓存key生成策略 - */ - @Bean @Override - public KeyGenerator keyGenerator() { - return (target, method, params) -> { - Map container = new HashMap<>(8); - Class targetClassClass = target.getClass(); - // 类地址 - container.put("class", targetClassClass.toGenericString()); - // 方法名称 - container.put("methodName", method.getName()); - // 包名称 - container.put("package", targetClassClass.getPackage()); - // 参数列表 - for (int i = 0; i < params.length; i++) { - container.put(String.valueOf(i), params[i]); - } - // 转为JSON字符串 - String jsonString = JSON.toJSONString(container); - // 使用 MurmurHash 生成 hash - return Integer.toHexString(MurmurHash3.hash32x86(jsonString.getBytes())); - }; - } - - @Bean - @SuppressWarnings({"unchecked", "all"}) - public CacheErrorHandler errorHandler() { - return new SimpleCacheErrorHandler() { - @Override - public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) { - // 处理缓存读取错误 - log.error("Cache Get Error: {}", exception.getMessage()); - } - - @Override - public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) { - // 处理缓存写入错误 - log.error("Cache Put Error: {}", exception.getMessage()); - } - - @Override - public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) { - // 处理缓存删除错误 - log.error("Cache Evict Error: {}", exception.getMessage()); - } - - @Override - public void handleCacheClearError(RuntimeException exception, Cache cache) { - // 处理缓存清除错误 - log.error("Cache Clear Error: {}", exception.getMessage()); - } - }; + public byte[] serialize(T t) throws SerializationException { + if (t == null) { + return new byte[0]; + } + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(StandardCharsets.UTF_8); } /** - * Value 序列化 - * - * @param + * 反序列化 */ - static class FastJsonRedisSerializer implements RedisSerializer { - private final Class clazz; - - FastJsonRedisSerializer(Class clazz) { - super(); - this.clazz = clazz; - } - - /** - * 序列化 - */ - @Override - public byte[] serialize(T t) throws SerializationException { - if (t == null) { - return new byte[0]; - } - return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(StandardCharsets.UTF_8); - } - - /** - * 反序列化 - */ - @Override - public T deserialize(byte[] bytes) throws SerializationException { - if (bytes == null || bytes.length == 0) { - return null; - } - String str = new String(bytes, StandardCharsets.UTF_8); - // 移除对 SupportAutoType 的使用 - return JSON.parseObject(str, clazz); - } + @Override + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes == null || bytes.length == 0) { + return null; + } + String str = new String(bytes, StandardCharsets.UTF_8); + // 移除对 SupportAutoType 的使用 + return JSON.parseObject(str, clazz); } + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java index bef07249..a058ed55 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/config/AsyncTheadPoolConfig.java @@ -37,62 +37,64 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @EnableAsync @Configuration public class AsyncTheadPoolConfig implements AsyncConfigurer { - @Autowired private AppProperties properties; - /** - * 自定义线程池, 用法 @Async - * - * @return Executor - */ - @Override - public Executor getAsyncExecutor() { - ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); - // 自定义工厂 - ThreadFactory factory = r -> new Thread(r, "DefaultAsync-" + new AtomicInteger(1).getAndIncrement()); - // 自定义线程池 - return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), - asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, - new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, - new ThreadPoolExecutor.CallerRunsPolicy()); - } + @Autowired + private AppProperties properties; - /** - * 自定义线程池, 用法, 注入到类中使用 - */ - @Bean("taskAsync") - public ThreadPoolTaskExecutor taskAsync() { - ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); - // 用法 private ThreadPoolTaskExecutor taskExecutor - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(asyncTaskPool.getCorePoolSize()); - executor.setMaxPoolSize(asyncTaskPool.getMaxPoolSize()); - executor.setQueueCapacity(asyncTaskPool.getQueueCapacity()); - executor.setThreadNamePrefix("TaskAsync-"); - executor.setKeepAliveSeconds(asyncTaskPool.getKeepAliveSeconds()); - // DiscardOldestPolicy,抛弃最早的任务,将新任务加入队列。 - // AbortPolicy,拒绝执行新任务,并抛出异常。 - // CallerRunsPolicy,交由调用者线程执行新任务,如果调用者线程已关闭,则抛弃任务。 - // DiscardPolicy,直接抛弃新任务。 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); - // 设置包装器 - executor.setTaskDecorator(TtlRunnable::get); - executor.initialize(); - return executor; - } + /** + * 自定义线程池, 用法 @Async + * + * @return Executor + */ + @Override + public Executor getAsyncExecutor() { + ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); + // 自定义工厂 + ThreadFactory factory = r -> new Thread(r, "DefaultAsync-" + new AtomicInteger(1).getAndIncrement()); + // 自定义线程池 + return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), + asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS, + new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, + new ThreadPoolExecutor.CallerRunsPolicy()); + } - @Bean("longTimeTaskAsync") - public ThreadPoolTaskExecutor longTimeTaskAsync() { - ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(asyncTaskPool.getCorePoolSize()); - executor.setMaxPoolSize(asyncTaskPool.getMaxPoolSize()); - executor.setQueueCapacity(asyncTaskPool.getQueueCapacity()); - executor.setThreadNamePrefix("LongTimeTaskAsync-"); - executor.setKeepAliveSeconds(asyncTaskPool.getKeepAliveSeconds()); - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); - // 设置包装器 - executor.setTaskDecorator(TtlRunnable::get); - executor.initialize(); - return executor; - } + /** + * 自定义线程池, 用法, 注入到类中使用 + */ + @Bean("taskAsync") + public ThreadPoolTaskExecutor taskAsync() { + ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); + // 用法 private ThreadPoolTaskExecutor taskExecutor + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(asyncTaskPool.getCorePoolSize()); + executor.setMaxPoolSize(asyncTaskPool.getMaxPoolSize()); + executor.setQueueCapacity(asyncTaskPool.getQueueCapacity()); + executor.setThreadNamePrefix("TaskAsync-"); + executor.setKeepAliveSeconds(asyncTaskPool.getKeepAliveSeconds()); + // DiscardOldestPolicy,抛弃最早的任务,将新任务加入队列。 + // AbortPolicy,拒绝执行新任务,并抛出异常。 + // CallerRunsPolicy,交由调用者线程执行新任务,如果调用者线程已关闭,则抛弃任务。 + // DiscardPolicy,直接抛弃新任务。 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + // 设置包装器 + executor.setTaskDecorator(TtlRunnable::get); + executor.initialize(); + return executor; + } + + @Bean("longTimeTaskAsync") + public ThreadPoolTaskExecutor longTimeTaskAsync() { + ThreadPoolSettingModel asyncTaskPool = properties.getAsyncTaskPool(); + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(asyncTaskPool.getCorePoolSize()); + executor.setMaxPoolSize(asyncTaskPool.getMaxPoolSize()); + executor.setQueueCapacity(asyncTaskPool.getQueueCapacity()); + executor.setThreadNamePrefix("LongTimeTaskAsync-"); + executor.setKeepAliveSeconds(asyncTaskPool.getKeepAliveSeconds()); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + // 设置包装器 + executor.setTaskDecorator(TtlRunnable::get); + executor.initialize(); + return executor; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java index 03319720..06b9e9bd 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringArraysToListDateConverter.java @@ -27,20 +27,21 @@ import org.springframework.stereotype.Component; @Component public class DateStringArraysToListDateConverter implements Converter> { - private static final ThreadLocal SDF = - ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); - @Override - public List convert(String[] source) { - if (source.length == 0) { - return Collections.emptyList(); - } - return Arrays.stream(source).map(s -> { - try { - return SDF.get().parse(s); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date string: " + s); - } - }).collect(Collectors.toList()); + private static final ThreadLocal SDF = + ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + + @Override + public List convert(String[] source) { + if (source.length == 0) { + return Collections.emptyList(); } + return Arrays.stream(source).map(s -> { + try { + return SDF.get().parse(s); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date string: " + s); + } + }).collect(Collectors.toList()); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java index c6f2a671..26a02be4 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/converters/DateStringToDateConverter.java @@ -24,18 +24,19 @@ import org.springframework.stereotype.Component; @Component public class DateStringToDateConverter implements Converter { - private static final ThreadLocal SDF = - ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); - @Override - public Date convert(String source) { - if (StrUtil.isBlank(source)) { - return null; - } - try { - return SDF.get().parse(source); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date string: " + source); - } + private static final ThreadLocal SDF = + ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + + @Override + public Date convert(String source) { + if (StrUtil.isBlank(source)) { + return null; } + try { + return SDF.get().parse(source); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date string: " + source); + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java index b8804cb1..0839edd3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/ConfigurerAdapter.java @@ -46,72 +46,76 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc public class ConfigurerAdapter implements WebMvcConfigurer { - @Autowired private DateStringArraysToListDateConverter dateStringArraysToListDateConverter; - @Autowired private DateStringToDateConverter dateStringToDateConverter; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - @Bean - public CorsFilter corsFilter() { - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOriginPattern("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } + @Autowired + private DateStringArraysToListDateConverter dateStringArraysToListDateConverter; + @Autowired + private DateStringToDateConverter dateStringToDateConverter; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - String path = fileUploadPathHelper.getPath(); - String pathUtl = "file:" + path.replace("\\", "/"); - registry.addResourceHandler("/avatar/**").addResourceLocations(pathUtl).setCachePeriod(0); - registry.addResourceHandler("/file/**").addResourceLocations(pathUtl).setCachePeriod(0); - registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0); - } + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOriginPattern("*"); + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } - /** - * Http消息转换器 - */ - @Override - public void configureMessageConverters(List> converters) { - // 添加默认的 StringHttpMessageConverter - converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); - // 配置 FastJsonHttpMessageConverter - FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); - List supportMediaTypeList = new ArrayList<>(); - supportMediaTypeList.add(MediaType.APPLICATION_JSON); - FastJsonConfig config = new FastJsonConfig(); - config.setDateFormat("yyyy-MM-dd HH:mm:ss"); - // 开启引用检测, 枚举支持 - /// 是否输出值为null的字段 - // config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue); - /// 字段如果为null,输出为false,而非null - // config.setWriterFeatures(JSONWriter.Feature.WriteNullBooleanAsFalse); - /// 字段如果为null,输出为[],而非null - // config.setWriterFeatures(JSONWriter.Feature.WriteNullListAsEmpty); - /// 字符类型字段如果为null,输出为"",而非null - // config.setWriterFeatures(JSONWriter.Feature.WriteNullStringAsEmpty); - /// 太具体的数值会直接影响逻辑本身, 所以不要这个 - // config.setWriterFeatures(JSONWriter.Feature.WriteNullNumberAsZero); - /// 全局Long转字符串,会导致基础框架本身异常, 所以不要这个 - // config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString); - config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString); - config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection); - fastJsonConverter.setFastJsonConfig(config); - fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList); - fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8); - // 将 FastJsonHttpMessageConverter 添加到列表末尾 - converters.add(fastJsonConverter); - } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + String path = fileUploadPathHelper.getPath(); + String pathUtl = "file:" + path.replace("\\", "/"); + registry.addResourceHandler("/avatar/**").addResourceLocations(pathUtl).setCachePeriod(0); + registry.addResourceHandler("/file/**").addResourceLocations(pathUtl).setCachePeriod(0); + registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0); + } - /** - * 自定义时间转换器 - */ - @Override - public void addFormatters(FormatterRegistry registry) { - registry.addConverter(dateStringArraysToListDateConverter); - registry.addConverter(dateStringToDateConverter); - } + /** + * Http消息转换器 + */ + @Override + public void configureMessageConverters(List> converters) { + // 添加默认的 StringHttpMessageConverter + converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); + // 配置 FastJsonHttpMessageConverter + FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); + List supportMediaTypeList = new ArrayList<>(); + supportMediaTypeList.add(MediaType.APPLICATION_JSON); + FastJsonConfig config = new FastJsonConfig(); + config.setDateFormat("yyyy-MM-dd HH:mm:ss"); + // 开启引用检测, 枚举支持 + /// 是否输出值为null的字段 + // config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue); + /// 字段如果为null,输出为false,而非null + // config.setWriterFeatures(JSONWriter.Feature.WriteNullBooleanAsFalse); + /// 字段如果为null,输出为[],而非null + // config.setWriterFeatures(JSONWriter.Feature.WriteNullListAsEmpty); + /// 字符类型字段如果为null,输出为"",而非null + // config.setWriterFeatures(JSONWriter.Feature.WriteNullStringAsEmpty); + /// 太具体的数值会直接影响逻辑本身, 所以不要这个 + // config.setWriterFeatures(JSONWriter.Feature.WriteNullNumberAsZero); + /// 全局Long转字符串,会导致基础框架本身异常, 所以不要这个 + // config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString); + config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString); + config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection); + fastJsonConverter.setFastJsonConfig(config); + fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList); + fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8); + // 将 FastJsonHttpMessageConverter 添加到列表末尾 + converters.add(fastJsonConverter); + } + + /** + * 自定义时间转换器 + */ + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(dateStringArraysToListDateConverter); + registry.addConverter(dateStringToDateConverter); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/KitFileLocalUploadHelper.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/KitFileLocalUploadHelper.java index 0fdf1754..720ffa44 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/KitFileLocalUploadHelper.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/server/core/KitFileLocalUploadHelper.java @@ -28,35 +28,37 @@ import org.springframework.stereotype.Component; */ @Component public class KitFileLocalUploadHelper { - /** - * 单位MB - */ - private static final int AVATAR_MAX_SIZE = 5; - private static final String PATH_WINDOWS = "C:\\${appName}\\file\\"; - private static final String PATH_MAC = "/Users${username}/${appName}/file/"; - private static final String PATH_LINUX = "/home/${appName}/file/"; - @Value("${spring.application.name}") private String appName; - public String getPath() { - String os = System.getProperty("os.name"); - if (os == null) { - // 默认使用 Linux 路径作为兜底方案 - return PATH_LINUX.replace("${appName}", appName); - } - String lowerOs = os.toLowerCase(); - if (lowerOs.startsWith(SystemConst.WIN)) { - return PATH_WINDOWS.replace("${appName}", appName); - } else if (lowerOs.startsWith(SystemConst.MAC)) { - String currentUserName = KitSystemUtil.getCurrentUserName(); - if (StrUtil.isBlank(currentUserName)) { - return PATH_MAC.replace("${appName}", appName).replace("${username}", ""); - } - return PATH_MAC.replace("${appName}", appName).replace("${username}", currentUserName); - } - return PATH_LINUX.replace("${appName}", appName); - } + /** + * 单位MB + */ + private static final int AVATAR_MAX_SIZE = 5; + private static final String PATH_WINDOWS = "C:\\${appName}\\file\\"; + private static final String PATH_MAC = "/Users${username}/${appName}/file/"; + private static final String PATH_LINUX = "/home/${appName}/file/"; + @Value("${spring.application.name}") + private String appName; - public int getAvatarMaxSize() { - return AVATAR_MAX_SIZE; + public String getPath() { + String os = System.getProperty("os.name"); + if (os == null) { + // 默认使用 Linux 路径作为兜底方案 + return PATH_LINUX.replace("${appName}", appName); } + String lowerOs = os.toLowerCase(); + if (lowerOs.startsWith(SystemConst.WIN)) { + return PATH_WINDOWS.replace("${appName}", appName); + } else if (lowerOs.startsWith(SystemConst.MAC)) { + String currentUserName = KitSystemUtil.getCurrentUserName(); + if (StrUtil.isBlank(currentUserName)) { + return PATH_MAC.replace("${appName}", appName).replace("${username}", ""); + } + return PATH_MAC.replace("${appName}", appName).replace("${username}", currentUserName); + } + return PATH_LINUX.replace("${appName}", appName); + } + + public int getAvatarMaxSize() { + return AVATAR_MAX_SIZE; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java index 85e30af8..b90e0165 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/UndertowWebSocketConfig.java @@ -7,37 +7,37 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; /** - * 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be - * used的警告 + * 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used的警告 * * @author odboy * @date 2025-10-30 */ @Component public class UndertowWebSocketConfig implements WebServerFactoryCustomizer { - private int calculateThreadLocalCacheSize(int processorCount) { - // 每个I/O线程缓存2-4个缓冲区 - return Math.max(2, processorCount / 2); - } - private int calculateMaxPoolSize(int processorCount) { - // 基础值 + 根据CPU核心数调整 - int baseSize = 100; - return baseSize + (processorCount * 20); - } + private int calculateThreadLocalCacheSize(int processorCount) { + // 每个I/O线程缓存2-4个缓冲区 + return Math.max(2, processorCount / 2); + } - @Override - public void customize(UndertowServletWebServerFactory factory) { - int processorCount = Runtime.getRuntime().availableProcessors(); - int bufferSize = 1024; - int maxPoolSize = calculateMaxPoolSize(processorCount); - int threadLocalCacheSize = calculateThreadLocalCacheSize(processorCount); - factory.addDeploymentInfoCustomizers(deploymentInfo -> { - WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); - webSocketDeploymentInfo.setBuffers( - new DefaultByteBufferPool(false, bufferSize, maxPoolSize, threadLocalCacheSize)); - deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", - webSocketDeploymentInfo); - }); - } + private int calculateMaxPoolSize(int processorCount) { + // 基础值 + 根据CPU核心数调整 + int baseSize = 100; + return baseSize + (processorCount * 20); + } + + @Override + public void customize(UndertowServletWebServerFactory factory) { + int processorCount = Runtime.getRuntime().availableProcessors(); + int bufferSize = 1024; + int maxPoolSize = calculateMaxPoolSize(processorCount); + int threadLocalCacheSize = calculateThreadLocalCacheSize(processorCount); + factory.addDeploymentInfoCustomizers(deploymentInfo -> { + WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); + webSocketDeploymentInfo.setBuffers( + new DefaultByteBufferPool(false, bufferSize, maxPoolSize, threadLocalCacheSize)); + deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", + webSocketDeploymentInfo); + }); + } } \ No newline at end of file diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/WebSocketEndpointConfig.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/WebSocketEndpointConfig.java index eb51deb0..cb01e9db 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/WebSocketEndpointConfig.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/config/WebSocketEndpointConfig.java @@ -27,8 +27,9 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter; */ @Configuration public class WebSocketEndpointConfig { - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java index 67514d12..7873f8e3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsClientManager.java @@ -28,35 +28,36 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class KitWsClientManager { - /** - * concurrent包的线程安全Map, 用来存放每个客户端对应的MyWebSocket对象。(分布式必出问题) - */ - private static final Map clientMap = new ConcurrentHashMap<>(); - public static void addClient(String sid, KitWsServer wsServer) { - // 如果存在就先删除一个, 防止重复推送消息 - removeClient(sid); - clientMap.put(sid, wsServer); - } + /** + * concurrent包的线程安全Map, 用来存放每个客户端对应的MyWebSocket对象。(分布式必出问题) + */ + private static final Map clientMap = new ConcurrentHashMap<>(); - public static void removeClient(String sid) { - KitWsServer wsServer = clientMap.get(sid); - if (wsServer != null) { - try { - log.info("关闭session, sid={}", sid); - wsServer.getSession().close(); - } catch (Exception e) { - log.error("Close session failed, sid={}", sid, e); - } - clientMap.remove(sid); - } - } + public static void addClient(String sid, KitWsServer wsServer) { + // 如果存在就先删除一个, 防止重复推送消息 + removeClient(sid); + clientMap.put(sid, wsServer); + } - public static Collection getAllClient() { - return clientMap.values(); + public static void removeClient(String sid) { + KitWsServer wsServer = clientMap.get(sid); + if (wsServer != null) { + try { + log.info("关闭session, sid={}", sid); + wsServer.getSession().close(); + } catch (Exception e) { + log.error("Close session failed, sid={}", sid, e); + } + clientMap.remove(sid); } + } - public static KitWsServer getClientBySid(String sid) { - return clientMap.get(sid); - } + public static Collection getAllClient() { + return clientMap.values(); + } + + public static KitWsServer getClientBySid(String sid) { + return clientMap.get(sid); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsMessage.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsMessage.java index 2592a814..1414a861 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsMessage.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsMessage.java @@ -22,11 +22,12 @@ import lombok.Setter; @Getter @Setter public class KitWsMessage extends KitObject { - private String bizCode; - private String data; - public KitWsMessage(String bizCode, String data) { - this.bizCode = bizCode; - this.data = data; - } + private String bizCode; + private String data; + + public KitWsMessage(String bizCode, String data) { + this.bizCode = bizCode; + this.data = data; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java index c8a86607..c0ca488f 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/context/KitWsServer.java @@ -34,116 +34,117 @@ import org.springframework.stereotype.Component; @ServerEndpoint("/websocket/{sid}") @Getter public class KitWsServer { - /** - * 与某个客户端的连接会话, 需要通过它来给客户端发送数据 - */ - private Session session; - /** - * 接收sid - */ - private String sid = ""; - /** - * 连接建立成功调用的方法 - */ - @OnOpen - public void onOpen(Session session, @PathParam("sid") String sid) { - this.session = session; - // {username}#{bizCode}#{contextParams} - this.sid = sid; - KitWsClientManager.addClient(sid, this); + /** + * 与某个客户端的连接会话, 需要通过它来给客户端发送数据 + */ + private Session session; + /** + * 接收sid + */ + private String sid = ""; + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("sid") String sid) { + this.session = session; + // {username}#{bizCode}#{contextParams} + this.sid = sid; + KitWsClientManager.addClient(sid, this); + } + + /** + * 收到客户端消息后调用的方法 + * + * @param message 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String message, Session session) { + KitWsMessage wsMessage = JSON.parseObject(message, KitWsMessage.class); + String bizCode = wsMessage.getBizCode(); + Object data = wsMessage.getData(); + log.info("收到来 sid={} 的信息: message={}, bizCode={}, data={}", sid, message, bizCode, + JSON.toJSONString(data)); + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose() { + try { + KitWsClientManager.removeClient(this.sid); + } catch (Exception e) { + log.error("WebSocket onClose error, sid={}", this.sid, e); } + } - /** - * 收到客户端消息后调用的方法 - * - * @param message 客户端发送过来的消息 - */ - @OnMessage - public void onMessage(String message, Session session) { - KitWsMessage wsMessage = JSON.parseObject(message, KitWsMessage.class); - String bizCode = wsMessage.getBizCode(); - Object data = wsMessage.getData(); - log.info("收到来 sid={} 的信息: message={}, bizCode={}, data={}", sid, message, bizCode, - JSON.toJSONString(data)); + @OnError + public void onError(Session session, Throwable error) { + // log.error("WebSocket sid={} 发生错误", this.sid, error); + try { + KitWsClientManager.removeClient(this.sid); + } catch (Exception e) { + log.error("WebSocket onClose error, sid={}", this.sid, e); } + } - /** - * 连接关闭调用的方法 - */ - @OnClose - public void onClose() { - try { - KitWsClientManager.removeClient(this.sid); - } catch (Exception e) { - log.error("WebSocket onClose error, sid={}", this.sid, e); + /** + * 实现服务器主动推送 + */ + private void innerSendMessage(String message) throws IOException { + this.session.getBasicRemote().sendText(message); + } + + /** + * 精准推送消息 + */ + public void sendMessage(KitWsMessage message, @PathParam("sid") String sid) throws IOException { + String body = JSON.toJSONString(message); + // log.info("推送消息到{}, 推送内容:{}", sid, message); + try { + if (sid == null) { + sendToAll(body); + } else { + KitWsServer wsClient = KitWsClientManager.getClientBySid(sid); + if (wsClient != null) { + wsClient.innerSendMessage(body); } + } + } catch (Exception ignored) { } + } - @OnError - public void onError(Session session, Throwable error) { - // log.error("WebSocket sid={} 发生错误", this.sid, error); - try { - KitWsClientManager.removeClient(this.sid); - } catch (Exception e) { - log.error("WebSocket onClose error, sid={}", this.sid, e); - } + /** + * 群发消息 + */ + public void sendToAll(String message) { + for (KitWsServer item : KitWsClientManager.getAllClient()) { + try { + item.innerSendMessage(message); + } catch (IOException e) { + log.error("发送消息给 sid={} 失败", item.sid, e); + KitWsClientManager.removeClient(item.sid); + } } + } - /** - * 实现服务器主动推送 - */ - private void innerSendMessage(String message) throws IOException { - this.session.getBasicRemote().sendText(message); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + KitWsServer that = (KitWsServer) o; + return Objects.equals(session, that.session) && Objects.equals(sid, that.sid); + } - /** - * 精准推送消息 - */ - public void sendMessage(KitWsMessage message, @PathParam("sid") String sid) throws IOException { - String body = JSON.toJSONString(message); - // log.info("推送消息到{}, 推送内容:{}", sid, message); - try { - if (sid == null) { - sendToAll(body); - } else { - KitWsServer wsClient = KitWsClientManager.getClientBySid(sid); - if (wsClient != null) { - wsClient.innerSendMessage(body); - } - } - } catch (Exception ignored) { - } - } - - /** - * 群发消息 - */ - public void sendToAll(String message) { - for (KitWsServer item : KitWsClientManager.getAllClient()) { - try { - item.innerSendMessage(message); - } catch (IOException e) { - log.error("发送消息给 sid={} 失败", item.sid, e); - KitWsClientManager.removeClient(item.sid); - } - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - KitWsServer that = (KitWsServer)o; - return Objects.equals(session, that.session) && Objects.equals(sid, that.sid); - } - - @Override - public int hashCode() { - return Objects.hash(session, sid); - } + @Override + public int hashCode() { + return Objects.hash(session, sid); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/model/WsSidVo.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/model/WsSidVo.java index b5d5355b..df0f4132 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/model/WsSidVo.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/model/WsSidVo.java @@ -22,7 +22,8 @@ import lombok.Setter; @Getter @Setter public class WsSidVo extends KitObject { - private String username; - private String bizCode; - private String param; + + private String username; + private String bizCode; + private String param; } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/util/WsMessageUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/util/WsMessageUtil.java index ed3ab69e..bd1298a7 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/util/WsMessageUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/framework/websocket/util/WsMessageUtil.java @@ -27,16 +27,17 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public class WsMessageUtil { - public static WsSidVo parseSid(String sid) { - // sid {username}_{bizCode}_{param} - String[] sids = sid.split("_"); - if (sids.length != 3) { - throw new BadRequestException("sid格式异常"); - } - WsSidVo sidVo = new WsSidVo(); - sidVo.setUsername(sids[0]); - sidVo.setBizCode(sids[1]); - sidVo.setParam(sids[2]); - return sidVo; + + public static WsSidVo parseSid(String sid) { + // sid {username}_{bizCode}_{param} + String[] sids = sid.split("_"); + if (sids.length != 3) { + throw new BadRequestException("sid格式异常"); } + WsSidVo sidVo = new WsSidVo(); + sidVo.setUsername(sids[0]); + sidVo.setBizCode(sids[1]); + sidVo.setParam(sids[2]); + return sidVo; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java index 5dc4a612..0ba85600 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitAnonTagUtil.java @@ -37,78 +37,79 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl */ @UtilityClass public class KitAnonTagUtil { - /** - * 获取匿名标记的URL - * - * @param applicationContext / - * @return / - */ - public static Map> getAnonymousUrl(final ApplicationContext applicationContext) { - RequestMappingHandlerMapping requestMappingHandlerMapping = - (RequestMappingHandlerMapping)applicationContext.getBean("requestMappingHandlerMapping"); - Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); - Map> anonymousUrls = new HashMap<>(8); - // 获取匿名标记 - Set get = new HashSet<>(); - Set post = new HashSet<>(); - Set put = new HashSet<>(); - Set patch = new HashSet<>(); - Set delete = new HashSet<>(); - Set all = new HashSet<>(); - for (Map.Entry infoEntry : handlerMethodMap.entrySet()) { - HandlerMethod handlerMethod = infoEntry.getValue(); - AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class); - if (null != anonymousAccess && infoEntry.getKey() != null) { - List requestMethods = - new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods()); - RequestMethodEnum request = RequestMethodEnum.find( - requestMethods.isEmpty() ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name()); - PatternsRequestCondition patternsCondition = infoEntry.getKey().getPatternsCondition(); - if (patternsCondition != null) { - switch (Objects.requireNonNull(request)) { - case GET: - get.addAll(patternsCondition.getPatterns()); - break; - case POST: - post.addAll(patternsCondition.getPatterns()); - break; - case PUT: - put.addAll(patternsCondition.getPatterns()); - break; - case PATCH: - patch.addAll(patternsCondition.getPatterns()); - break; - case DELETE: - delete.addAll(patternsCondition.getPatterns()); - break; - default: - all.addAll(patternsCondition.getPatterns()); - break; - } - } - } - } - anonymousUrls.put(RequestMethodEnum.GET.getType(), get); - anonymousUrls.put(RequestMethodEnum.POST.getType(), post); - anonymousUrls.put(RequestMethodEnum.PUT.getType(), put); - anonymousUrls.put(RequestMethodEnum.PATCH.getType(), patch); - anonymousUrls.put(RequestMethodEnum.DELETE.getType(), delete); - anonymousUrls.put(RequestMethodEnum.ALL.getType(), all); - return anonymousUrls; - } - /** - * 获取所有匿名标记的URL - * - * @param applicationContext / - * @return / - */ - public static Set getAllAnonymousUrl(final ApplicationContext applicationContext) { - Set allUrl = new HashSet<>(); - Map> anonymousUrls = getAnonymousUrl(applicationContext); - for (Map.Entry> entry : anonymousUrls.entrySet()) { - allUrl.addAll(anonymousUrls.get(entry.getKey())); + /** + * 获取匿名标记的URL + * + * @param applicationContext / + * @return / + */ + public static Map> getAnonymousUrl(final ApplicationContext applicationContext) { + RequestMappingHandlerMapping requestMappingHandlerMapping = + (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping"); + Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); + Map> anonymousUrls = new HashMap<>(8); + // 获取匿名标记 + Set get = new HashSet<>(); + Set post = new HashSet<>(); + Set put = new HashSet<>(); + Set patch = new HashSet<>(); + Set delete = new HashSet<>(); + Set all = new HashSet<>(); + for (Map.Entry infoEntry : handlerMethodMap.entrySet()) { + HandlerMethod handlerMethod = infoEntry.getValue(); + AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class); + if (null != anonymousAccess && infoEntry.getKey() != null) { + List requestMethods = + new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods()); + RequestMethodEnum request = RequestMethodEnum.find( + requestMethods.isEmpty() ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name()); + PatternsRequestCondition patternsCondition = infoEntry.getKey().getPatternsCondition(); + if (patternsCondition != null) { + switch (Objects.requireNonNull(request)) { + case GET: + get.addAll(patternsCondition.getPatterns()); + break; + case POST: + post.addAll(patternsCondition.getPatterns()); + break; + case PUT: + put.addAll(patternsCondition.getPatterns()); + break; + case PATCH: + patch.addAll(patternsCondition.getPatterns()); + break; + case DELETE: + delete.addAll(patternsCondition.getPatterns()); + break; + default: + all.addAll(patternsCondition.getPatterns()); + break; + } } - return allUrl; + } } + anonymousUrls.put(RequestMethodEnum.GET.getType(), get); + anonymousUrls.put(RequestMethodEnum.POST.getType(), post); + anonymousUrls.put(RequestMethodEnum.PUT.getType(), put); + anonymousUrls.put(RequestMethodEnum.PATCH.getType(), patch); + anonymousUrls.put(RequestMethodEnum.DELETE.getType(), delete); + anonymousUrls.put(RequestMethodEnum.ALL.getType(), all); + return anonymousUrls; + } + + /** + * 获取所有匿名标记的URL + * + * @param applicationContext / + * @return / + */ + public static Set getAllAnonymousUrl(final ApplicationContext applicationContext) { + Set allUrl = new HashSet<>(); + Map> anonymousUrls = getAnonymousUrl(applicationContext); + for (Map.Entry> entry : anonymousUrls.entrySet()) { + allUrl.addAll(anonymousUrls.get(entry.getKey())); + } + return allUrl; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java index e117beb9..3947e7a9 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBase64SecretUtil.java @@ -28,20 +28,21 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitBase64SecretUtil { - public static String build() { - // 128位uuid - return Base64Encoder.encode(getLongUuid(4).getBytes(StandardCharsets.UTF_8)); - } - public static String getLongUuid(int bit) { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < bit; i++) { - result.append(IdUtil.simpleUUID()); - } - return result.toString(); - } + public static String build() { + // 128位uuid + return Base64Encoder.encode(getLongUuid(4).getBytes(StandardCharsets.UTF_8)); + } - public static void main(String[] args) { - System.out.println(build()); + public static String getLongUuid(int bit) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < bit; i++) { + result.append(IdUtil.simpleUUID()); } + return result.toString(); + } + + public static void main(String[] args) { + System.out.println(build()); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java index cbcc7a9b..d23d1685 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBigDecimalUtil.java @@ -24,124 +24,125 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitBigDecimalUtil { - /** - * 将对象转换为 BigDecimal - * - * @param obj 输入对象 - * @return 转换后的 BigDecimal - */ - private static BigDecimal toBigDecimal(Object obj) { - if (obj instanceof BigDecimal) { - return (BigDecimal)obj; - } else if (obj instanceof Long) { - return BigDecimal.valueOf((Long)obj); - } else if (obj instanceof Integer) { - return BigDecimal.valueOf((Integer)obj); - } else if (obj instanceof Double) { - return new BigDecimal(String.valueOf(obj)); - } else { - throw new IllegalArgumentException("Unsupported type"); - } - } - /** - * 加法 - * - * @param a 加数 - * @param b 加数 - * @return 两个加数的和, 保留两位小数 - */ - public static BigDecimal add(Object a, Object b) { - BigDecimal bdA = toBigDecimal(a); - BigDecimal bdB = toBigDecimal(b); - return bdA.add(bdB).setScale(2, RoundingMode.HALF_UP); + /** + * 将对象转换为 BigDecimal + * + * @param obj 输入对象 + * @return 转换后的 BigDecimal + */ + private static BigDecimal toBigDecimal(Object obj) { + if (obj instanceof BigDecimal) { + return (BigDecimal) obj; + } else if (obj instanceof Long) { + return BigDecimal.valueOf((Long) obj); + } else if (obj instanceof Integer) { + return BigDecimal.valueOf((Integer) obj); + } else if (obj instanceof Double) { + return new BigDecimal(String.valueOf(obj)); + } else { + throw new IllegalArgumentException("Unsupported type"); } + } - /** - * 减法 - * - * @param a 被减数 - * @param b 减数 - * @return 两数的差, 保留两位小数 - */ - public static BigDecimal subtract(Object a, Object b) { - BigDecimal bdA = toBigDecimal(a); - BigDecimal bdB = toBigDecimal(b); - return bdA.subtract(bdB).setScale(2, RoundingMode.HALF_UP); - } + /** + * 加法 + * + * @param a 加数 + * @param b 加数 + * @return 两个加数的和, 保留两位小数 + */ + public static BigDecimal add(Object a, Object b) { + BigDecimal bdA = toBigDecimal(a); + BigDecimal bdB = toBigDecimal(b); + return bdA.add(bdB).setScale(2, RoundingMode.HALF_UP); + } - /** - * 乘法 - * - * @param a 乘数 - * @param b 乘数 - * @return 两个乘数的积, 保留两位小数 - */ - public static BigDecimal multiply(Object a, Object b) { - BigDecimal bdA = toBigDecimal(a); - BigDecimal bdB = toBigDecimal(b); - return bdA.multiply(bdB).setScale(2, RoundingMode.HALF_UP); - } + /** + * 减法 + * + * @param a 被减数 + * @param b 减数 + * @return 两数的差, 保留两位小数 + */ + public static BigDecimal subtract(Object a, Object b) { + BigDecimal bdA = toBigDecimal(a); + BigDecimal bdB = toBigDecimal(b); + return bdA.subtract(bdB).setScale(2, RoundingMode.HALF_UP); + } - /** - * 除法 - * - * @param a 被除数 - * @param b 除数 - * @return 两数的商,保留两位小数 - */ - public static BigDecimal divide(Object a, Object b) { - BigDecimal bdA = toBigDecimal(a); - BigDecimal bdB = toBigDecimal(b); - return bdA.divide(bdB, 2, RoundingMode.HALF_UP); - } + /** + * 乘法 + * + * @param a 乘数 + * @param b 乘数 + * @return 两个乘数的积, 保留两位小数 + */ + public static BigDecimal multiply(Object a, Object b) { + BigDecimal bdA = toBigDecimal(a); + BigDecimal bdB = toBigDecimal(b); + return bdA.multiply(bdB).setScale(2, RoundingMode.HALF_UP); + } - /** - * 除法 - * - * @param a 被除数 - * @param b 除数 - * @param scale 保留小数位数 - * @return 两数的商,保留两位小数 - */ - public static BigDecimal divide(Object a, Object b, int scale) { - BigDecimal bdA = toBigDecimal(a); - BigDecimal bdB = toBigDecimal(b); - return bdA.divide(bdB, scale, RoundingMode.HALF_UP); - } + /** + * 除法 + * + * @param a 被除数 + * @param b 除数 + * @return 两数的商,保留两位小数 + */ + public static BigDecimal divide(Object a, Object b) { + BigDecimal bdA = toBigDecimal(a); + BigDecimal bdB = toBigDecimal(b); + return bdA.divide(bdB, 2, RoundingMode.HALF_UP); + } - /** - * 分转元 - * - * @param obj 分的金额 - * @return 转换后的元,保留两位小数 - */ - public static BigDecimal centsToYuan(Object obj) { - BigDecimal cents = toBigDecimal(obj); - return cents.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); - } + /** + * 除法 + * + * @param a 被除数 + * @param b 除数 + * @param scale 保留小数位数 + * @return 两数的商,保留两位小数 + */ + public static BigDecimal divide(Object a, Object b, int scale) { + BigDecimal bdA = toBigDecimal(a); + BigDecimal bdB = toBigDecimal(b); + return bdA.divide(bdB, scale, RoundingMode.HALF_UP); + } - /** - * 元转分 - * - * @param obj 元的金额 - * @return 转换后的分 - */ - public static Long yuanToCents(Object obj) { - BigDecimal yuan = toBigDecimal(obj); - return yuan.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).longValue(); - } + /** + * 分转元 + * + * @param obj 分的金额 + * @return 转换后的元,保留两位小数 + */ + public static BigDecimal centsToYuan(Object obj) { + BigDecimal cents = toBigDecimal(obj); + return cents.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + } - public static void main(String[] args) { - BigDecimal num1 = new BigDecimal("10.123"); - BigDecimal num2 = new BigDecimal("2.456"); - System.out.println("加法结果: " + add(num1, num2)); - System.out.println("减法结果: " + subtract(num1, num2)); - System.out.println("乘法结果: " + multiply(num1, num2)); - System.out.println("除法结果: " + divide(num1, num2)); - Long cents = 12345L; - System.out.println("分转元结果: " + centsToYuan(cents)); - BigDecimal yuan = new BigDecimal("123.45"); - System.out.println("元转分结果: " + yuanToCents(yuan)); - } + /** + * 元转分 + * + * @param obj 元的金额 + * @return 转换后的分 + */ + public static Long yuanToCents(Object obj) { + BigDecimal yuan = toBigDecimal(obj); + return yuan.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.HALF_UP).longValue(); + } + + public static void main(String[] args) { + BigDecimal num1 = new BigDecimal("10.123"); + BigDecimal num2 = new BigDecimal("2.456"); + System.out.println("加法结果: " + add(num1, num2)); + System.out.println("减法结果: " + subtract(num1, num2)); + System.out.println("乘法结果: " + multiply(num1, num2)); + System.out.println("除法结果: " + divide(num1, num2)); + Long cents = 12345L; + System.out.println("分转元结果: " + centsToYuan(cents)); + BigDecimal yuan = new BigDecimal("123.45"); + System.out.println("元转分结果: " + yuanToCents(yuan)); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java index 994e198d..3a0d85c4 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitBrowserUtil.java @@ -29,44 +29,45 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @UtilityClass public final class KitBrowserUtil { - private static final String UNKNOWN = "unknown"; - /** - * 获取ip地址 - */ - public static String getIp(HttpServletRequest request) { - String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); - } - if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { - ip = request.getRemoteAddr(); - } - String comma = ","; - String localhost = "127.0.0.1"; - if (ip.contains(comma)) { - ip = ip.split(",")[0]; - } - if (localhost.equals(ip)) { - // 获取本机真正的ip地址 - try { - ip = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - log.error("获取本机地址失败", e); - } - } - return ip; - } + private static final String UNKNOWN = "unknown"; - /** - * 获取浏览器 - */ - public static String getVersion(HttpServletRequest request) { - UserAgent ua = UserAgentUtil.parse(request.getHeader("User-Agent")); - String browser = ua.getBrowser().toString() + " " + ua.getVersion(); - return browser.replace(".0.0.0", ""); + /** + * 获取ip地址 + */ + public static String getIp(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + String comma = ","; + String localhost = "127.0.0.1"; + if (ip.contains(comma)) { + ip = ip.split(",")[0]; + } + if (localhost.equals(ip)) { + // 获取本机真正的ip地址 + try { + ip = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.error("获取本机地址失败", e); + } + } + return ip; + } + + /** + * 获取浏览器 + */ + public static String getVersion(HttpServletRequest request) { + UserAgent ua = UserAgentUtil.parse(request.getHeader("User-Agent")); + String browser = ua.getBrowser().toString() + " " + ua.getVersion(); + return browser.replace(".0.0.0", ""); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java index 8f8e8f6a..b9527561 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitClassUtil.java @@ -25,12 +25,13 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitClassUtil { - @SuppressWarnings({"unchecked", "all"}) - public static List getAllFields(Class clazz, List fields) { - if (clazz != null) { - fields.addAll(Arrays.asList(clazz.getDeclaredFields())); - getAllFields(clazz.getSuperclass(), fields); - } - return fields; + + @SuppressWarnings({"unchecked", "all"}) + public static List getAllFields(Class clazz, List fields) { + if (clazz != null) { + fields.addAll(Arrays.asList(clazz.getDeclaredFields())); + getAllFields(clazz.getSuperclass(), fields); } + return fields; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java index 8deb8881..41351658 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCloseUtil.java @@ -23,23 +23,24 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitCloseUtil { - public static void close(Closeable closeable) { - if (null != closeable) { - try { - closeable.close(); - } catch (Exception e) { - // 静默关闭 - } - } - } - public static void close(AutoCloseable closeable) { - if (null != closeable) { - try { - closeable.close(); - } catch (Exception e) { - // 静默关闭 - } - } + public static void close(Closeable closeable) { + if (null != closeable) { + try { + closeable.close(); + } catch (Exception e) { + // 静默关闭 + } } + } + + public static void close(AutoCloseable closeable) { + if (null != closeable) { + try { + closeable.close(); + } catch (Exception e) { + // 静默关闭 + } + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java index 7f1361a2..01ebabcc 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitCollUtil.java @@ -39,183 +39,184 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitCollUtil extends cn.hutool.core.collection.CollUtil { - private static Predicate distinctPredicate(Function keyMapper) { - Map map = new HashMap<>(3); - return (t) -> null == map.putIfAbsent(keyMapper.apply(t), true); - } - /** - * 流根据对象属性去重 - *

- * 使用方式: list = CollUtil.streamDistinct(list, Object::getXXX) - */ - public static List streamDistinct(List data, Function keyMapper) { - return data.stream().filter(distinctPredicate(keyMapper)).collect(Collectors.toList()); - } + private static Predicate distinctPredicate(Function keyMapper) { + Map map = new HashMap<>(3); + return (t) -> null == map.putIfAbsent(keyMapper.apply(t), true); + } - /** - * 流根据对象属性自然排序 - *

- * 使用方式: list = CollUtil.streamAscSort(list, Object::getXXX) - * - * @param data / - * @param keyExtractor / - * @param / - * @param / - * @return / - */ - public static > List streamAscSort(List data, - Function keyExtractor) { - return data.stream().sorted(Comparator.comparing(keyExtractor)).collect(Collectors.toList()); - } + /** + * 流根据对象属性去重 + *

+ * 使用方式: list = CollUtil.streamDistinct(list, Object::getXXX) + */ + public static List streamDistinct(List data, Function keyMapper) { + return data.stream().filter(distinctPredicate(keyMapper)).collect(Collectors.toList()); + } - /** - * 流根据对象属性倒转排序 - *

- * 使用方式: list = CollUtil.streamDescSort(list, Object::getXXX) - * - * @param data / - * @param keyExtractor / - * @param / - * @param / - * @return / - */ - public static > List streamDescSort(List data, - Function keyExtractor) { - return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).collect(Collectors.toList()); - } + /** + * 流根据对象属性自然排序 + *

+ * 使用方式: list = CollUtil.streamAscSort(list, Object::getXXX) + * + * @param data / + * @param keyExtractor / + * @param / + * @param / + * @return / + */ + public static > List streamAscSort(List data, + Function keyExtractor) { + return data.stream().sorted(Comparator.comparing(keyExtractor)).collect(Collectors.toList()); + } - /** - * 流拆分对象为键值对 - *

- * 使用方式: map = CollUtil.streamToMap(list, Object::getXXKey, Object::getXXValue) - * - * @param data / - * @param keyMapper / - * @param valueMapper / - * @param / - * @param / - * @param / - * @return / - */ - public static Map streamToMap(List data, Function keyMapper, - Function valueMapper) { - // 根据key去重再并流 - return streamDistinct(data, keyMapper).stream().collect(Collectors.toMap(keyMapper, valueMapper)); - } + /** + * 流根据对象属性倒转排序 + *

+ * 使用方式: list = CollUtil.streamDescSort(list, Object::getXXX) + * + * @param data / + * @param keyExtractor / + * @param / + * @param / + * @return / + */ + public static > List streamDescSort(List data, + Function keyExtractor) { + return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).collect(Collectors.toList()); + } - /** - * 流对List求和 - *

- * 使用方式: total = CollUtil.streamDoubleAdd(doubleList) - * - * @param data / - * @return / - */ - public static Double streamDoubleAdd(List data) { - if (KitCollUtil.isNotEmpty(data)) { - return data.stream().filter(Objects::nonNull).reduce(Double::sum).orElse(0.0); - } - return 0.0; - } + /** + * 流拆分对象为键值对 + *

+ * 使用方式: map = CollUtil.streamToMap(list, Object::getXXKey, Object::getXXValue) + * + * @param data / + * @param keyMapper / + * @param valueMapper / + * @param / + * @param / + * @param / + * @return / + */ + public static Map streamToMap(List data, Function keyMapper, + Function valueMapper) { + // 根据key去重再并流 + return streamDistinct(data, keyMapper).stream().collect(Collectors.toMap(keyMapper, valueMapper)); + } - /** - * 流对List求和 - *

- * 使用方式: total = CollUtil.streamBigDecimalAdd(doubleList) - * - * @param data / - * @return / - */ - public static BigDecimal streamBigDecimalAdd(List data) { - if (KitCollUtil.isNotEmpty(data)) { - return data.stream().filter(Objects::nonNull).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - } - return BigDecimal.ZERO; + /** + * 流对List求和 + *

+ * 使用方式: total = CollUtil.streamDoubleAdd(doubleList) + * + * @param data / + * @return / + */ + public static Double streamDoubleAdd(List data) { + if (KitCollUtil.isNotEmpty(data)) { + return data.stream().filter(Objects::nonNull).reduce(Double::sum).orElse(0.0); } + return 0.0; + } - /** - * 流对List中的某一BigDecimal属性求和 - *

- * 使用方式: total = CollUtil.streamBigDecimalAdd(list, XXX) - * - * @param data / - * @return / - */ - public static BigDecimal streamBigDecimalAdd(List data, String elementName) { - return data.stream().filter(Objects::nonNull).map(m -> { - // 反射, 取集合中各元素的某属性 - BigDecimal that; - try { - Field field = m.getClass().getDeclaredField(elementName); - field.setAccessible(true); - that = (BigDecimal)field.get(m); - } catch (Exception e) { - // 忽略异常 - that = BigDecimal.ZERO; - } - return that; - }).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + /** + * 流对List求和 + *

+ * 使用方式: total = CollUtil.streamBigDecimalAdd(doubleList) + * + * @param data / + * @return / + */ + public static BigDecimal streamBigDecimalAdd(List data) { + if (KitCollUtil.isNotEmpty(data)) { + return data.stream().filter(Objects::nonNull).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); } + return BigDecimal.ZERO; + } - /** - * 流对List取最大值 - *

- * 使用方式: max = CollUtil.streamBigDecimalMax(list) - * - * @param data / - * @return / - */ - public static BigDecimal streamBigDecimalMax(List data) { - return data.stream().filter(Objects::nonNull).reduce(BigDecimal::max).orElse(null); - } + /** + * 流对List中的某一BigDecimal属性求和 + *

+ * 使用方式: total = CollUtil.streamBigDecimalAdd(list, XXX) + * + * @param data / + * @return / + */ + public static BigDecimal streamBigDecimalAdd(List data, String elementName) { + return data.stream().filter(Objects::nonNull).map(m -> { + // 反射, 取集合中各元素的某属性 + BigDecimal that; + try { + Field field = m.getClass().getDeclaredField(elementName); + field.setAccessible(true); + that = (BigDecimal) field.get(m); + } catch (Exception e) { + // 忽略异常 + that = BigDecimal.ZERO; + } + return that; + }).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + } - /** - * 流对List取最小值 - *

- * 使用方式: max = CollUtil.streamBigDecimalMin(list) - * - * @param data / - * @return / - */ - public static BigDecimal streamBigDecimalMin(List data) { - return data.stream().filter(Objects::nonNull).reduce(BigDecimal::min).orElse(null); - } + /** + * 流对List取最大值 + *

+ * 使用方式: max = CollUtil.streamBigDecimalMax(list) + * + * @param data / + * @return / + */ + public static BigDecimal streamBigDecimalMax(List data) { + return data.stream().filter(Objects::nonNull).reduce(BigDecimal::max).orElse(null); + } - /** - * 流对List取平均值 - *

- * 使用方式: avg = CollUtil.streamBigDecimalAvg(list) - * - * @param data / - * @return / - */ - public static BigDecimal streamBigDecimalAvg(List data) { - return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add) - .divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR); - } + /** + * 流对List取最小值 + *

+ * 使用方式: max = CollUtil.streamBigDecimalMin(list) + * + * @param data / + * @return / + */ + public static BigDecimal streamBigDecimalMin(List data) { + return data.stream().filter(Objects::nonNull).reduce(BigDecimal::min).orElse(null); + } - public static void main(String[] args) { - List testData = new ArrayList<>(); - KitSelectOptionVo selectOption1 = KitSelectOptionVo.builder().label("苹果").value("apple").build(); - KitSelectOptionVo selectOption2 = KitSelectOptionVo.builder().label("苹果").value("apple").build(); - KitSelectOptionVo selectOption3 = KitSelectOptionVo.builder().label("香蕉").value("banana").build(); - KitSelectOptionVo selectOption4 = KitSelectOptionVo.builder().label("猫").value("cat").build(); - testData.add(selectOption1); - testData.add(selectOption2); - testData.add(selectOption3); - testData.add(selectOption4); - List selectOptions1 = KitCollUtil.streamAscSort(testData, KitSelectOptionVo::getValue); - System.out.println(JSON.toJSONString(selectOptions1)); - List selectOptions2 = KitCollUtil.streamDescSort(testData, KitSelectOptionVo::getValue); - System.out.println(JSON.toJSONString(selectOptions2)); - List selectOptions3 = KitCollUtil.streamDistinct(testData, KitSelectOptionVo::getValue); - System.out.println(JSON.toJSONString(selectOptions3)); - Map selectMap1 = - KitCollUtil.streamToMap(testData, KitSelectOptionVo::getValue, KitSelectOptionVo::getLabel); - System.out.println(JSON.toJSONString(selectMap1)); - // 这只是一个示范 - BigDecimal total1 = KitCollUtil.streamBigDecimalAdd(testData, "value"); - System.out.println(total1); - } + /** + * 流对List取平均值 + *

+ * 使用方式: avg = CollUtil.streamBigDecimalAvg(list) + * + * @param data / + * @return / + */ + public static BigDecimal streamBigDecimalAvg(List data) { + return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add) + .divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR); + } + + public static void main(String[] args) { + List testData = new ArrayList<>(); + KitSelectOptionVo selectOption1 = KitSelectOptionVo.builder().label("苹果").value("apple").build(); + KitSelectOptionVo selectOption2 = KitSelectOptionVo.builder().label("苹果").value("apple").build(); + KitSelectOptionVo selectOption3 = KitSelectOptionVo.builder().label("香蕉").value("banana").build(); + KitSelectOptionVo selectOption4 = KitSelectOptionVo.builder().label("猫").value("cat").build(); + testData.add(selectOption1); + testData.add(selectOption2); + testData.add(selectOption3); + testData.add(selectOption4); + List selectOptions1 = KitCollUtil.streamAscSort(testData, KitSelectOptionVo::getValue); + System.out.println(JSON.toJSONString(selectOptions1)); + List selectOptions2 = KitCollUtil.streamDescSort(testData, KitSelectOptionVo::getValue); + System.out.println(JSON.toJSONString(selectOptions2)); + List selectOptions3 = KitCollUtil.streamDistinct(testData, KitSelectOptionVo::getValue); + System.out.println(JSON.toJSONString(selectOptions3)); + Map selectMap1 = + KitCollUtil.streamToMap(testData, KitSelectOptionVo::getValue, KitSelectOptionVo::getLabel); + System.out.println(JSON.toJSONString(selectMap1)); + // 这只是一个示范 + BigDecimal total1 = KitCollUtil.streamBigDecimalAdd(testData, "value"); + System.out.println(total1); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java index 48bd63ed..2e4b1d9c 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDateUtil.java @@ -28,104 +28,105 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public class KitDateUtil { - /** - * 获取当前时间毫秒数 - * - * @return / - */ - public static String getNowDateTimeMsStr() { - return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN); - } - /** - * 获取当前时间,但不包括毫秒数 - * - * @return / - */ - public static String getNowDateTimeStr() { - return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN); - } + /** + * 获取当前时间毫秒数 + * + * @return / + */ + public static String getNowDateTimeMsStr() { + return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN); + } - /** - * 获取当前时间,但不包括毫秒数 - * - * @return / - */ - public static String getNowDateStr() { - return DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN); - } + /** + * 获取当前时间,但不包括毫秒数 + * + * @return / + */ + public static String getNowDateTimeStr() { + return DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN); + } - /** - * 格式化到毫秒 - * - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 格式化后的时间,X天X时X分X秒X毫秒 - */ - public static String formatMillsDuration(Date startTime, Date endTime) { - if (startTime == null || endTime == null) { - // 什么都不返回 - return ""; - } - long betweenSeconds = DateUtil.between(startTime, endTime, cn.hutool.core.date.DateUnit.SECOND); - long days = betweenSeconds / (24 * 60 * 60); - long hours = (betweenSeconds % (24 * 60 * 60)) / (60 * 60); - long minutes = (betweenSeconds % (60 * 60)) / 60; - long seconds = betweenSeconds % 60; - StringBuilder result = new StringBuilder(); - if (days > 0) { - result.append(days).append("天"); - } - if (hours > 0) { - result.append(hours).append("时"); - } - if (minutes > 0) { - result.append(minutes).append("分"); - } - if (seconds > 0 || result.length() == 0) { - result.append(seconds).append("秒"); - } - return result.toString(); - } + /** + * 获取当前时间,但不包括毫秒数 + * + * @return / + */ + public static String getNowDateStr() { + return DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN); + } - /** - * 格式化到秒 - * - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 格式化后的时间,X天X时X分X秒 - */ - public static String formatSecondsDuration(Date startTime, Date endTime) { - if (startTime == null || endTime == null) { - // 什么都不返回 - return ""; - } - long betweenMs = DateUtil.betweenMs(startTime, endTime); - long days = betweenMs / (24 * 60 * 60 * 1000); - long hours = (betweenMs % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000); - long minutes = (betweenMs % (60 * 60 * 1000)) / (60 * 1000); - long seconds = (betweenMs % (60 * 1000)) / 1000; - long milliseconds = betweenMs % 1000; - StringBuilder result = new StringBuilder(); - if (days > 0) { - result.append(days).append("天"); - } - if (hours > 0) { - result.append(hours).append("时"); - } - if (minutes > 0) { - result.append(minutes).append("分"); - } - if (seconds > 0) { - result.append(seconds).append("秒"); - } - if (milliseconds > 0) { - result.append(milliseconds).append("毫秒"); - } - // 如果所有单位都是0,则显示0毫秒 - if (result.length() == 0) { - result.append("0毫秒"); - } - return result.toString(); + /** + * 格式化到毫秒 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 格式化后的时间,X天X时X分X秒X毫秒 + */ + public static String formatMillsDuration(Date startTime, Date endTime) { + if (startTime == null || endTime == null) { + // 什么都不返回 + return ""; } + long betweenSeconds = DateUtil.between(startTime, endTime, cn.hutool.core.date.DateUnit.SECOND); + long days = betweenSeconds / (24 * 60 * 60); + long hours = (betweenSeconds % (24 * 60 * 60)) / (60 * 60); + long minutes = (betweenSeconds % (60 * 60)) / 60; + long seconds = betweenSeconds % 60; + StringBuilder result = new StringBuilder(); + if (days > 0) { + result.append(days).append("天"); + } + if (hours > 0) { + result.append(hours).append("时"); + } + if (minutes > 0) { + result.append(minutes).append("分"); + } + if (seconds > 0 || result.length() == 0) { + result.append(seconds).append("秒"); + } + return result.toString(); + } + + /** + * 格式化到秒 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 格式化后的时间,X天X时X分X秒 + */ + public static String formatSecondsDuration(Date startTime, Date endTime) { + if (startTime == null || endTime == null) { + // 什么都不返回 + return ""; + } + long betweenMs = DateUtil.betweenMs(startTime, endTime); + long days = betweenMs / (24 * 60 * 60 * 1000); + long hours = (betweenMs % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000); + long minutes = (betweenMs % (60 * 60 * 1000)) / (60 * 1000); + long seconds = (betweenMs % (60 * 1000)) / 1000; + long milliseconds = betweenMs % 1000; + StringBuilder result = new StringBuilder(); + if (days > 0) { + result.append(days).append("天"); + } + if (hours > 0) { + result.append(hours).append("时"); + } + if (minutes > 0) { + result.append(minutes).append("分"); + } + if (seconds > 0) { + result.append(seconds).append("秒"); + } + if (milliseconds > 0) { + result.append(milliseconds).append("毫秒"); + } + // 如果所有单位都是0,则显示0毫秒 + if (result.length() == 0) { + result.append("0毫秒"); + } + return result.toString(); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java index 7c1a988d..a2c975ee 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDesEncryptUtil.java @@ -28,66 +28,67 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitDesEncryptUtil { - private static final String STR_PARAM = "Passw0rd"; - private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); - private static DESKeySpec getDesKeySpec(String source) throws Exception { - if (source == null || source.isEmpty()) { - return null; - } - return new DESKeySpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); - } + private static final String STR_PARAM = "Passw0rd"; + private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); - /** - * 对称加密 - */ - public static String desEncrypt(String source) throws Exception { - Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); - DESKeySpec desKeySpec = getDesKeySpec(source); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - SecretKey secretKey = keyFactory.generateSecret(desKeySpec); - cipher.init(Cipher.ENCRYPT_MODE, secretKey, IV); - return byte2hex(cipher.doFinal(source.getBytes(StandardCharsets.UTF_8))).toUpperCase(); + private static DESKeySpec getDesKeySpec(String source) throws Exception { + if (source == null || source.isEmpty()) { + return null; } + return new DESKeySpec(STR_PARAM.getBytes(StandardCharsets.UTF_8)); + } - /** - * 对称解密 - */ - public static String desDecrypt(String source) throws Exception { - Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); - byte[] src = hex2byte(source.getBytes(StandardCharsets.UTF_8)); - DESKeySpec desKeySpec = getDesKeySpec(source); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - SecretKey secretKey = keyFactory.generateSecret(desKeySpec); - cipher.init(Cipher.DECRYPT_MODE, secretKey, IV); - byte[] retByte = cipher.doFinal(src); - return new String(retByte); - } + /** + * 对称加密 + */ + public static String desEncrypt(String source) throws Exception { + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + DESKeySpec desKeySpec = getDesKeySpec(source); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, IV); + return byte2hex(cipher.doFinal(source.getBytes(StandardCharsets.UTF_8))).toUpperCase(); + } - private static String byte2hex(byte[] inStr) { - String stmp; - StringBuilder out = new StringBuilder(inStr.length * 2); - for (byte b : inStr) { - stmp = Integer.toHexString(b & 0xFF); - if (stmp.length() == 1) { - out.append("0").append(stmp); - } else { - out.append(stmp); - } - } - return out.toString(); - } + /** + * 对称解密 + */ + public static String desDecrypt(String source) throws Exception { + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + byte[] src = hex2byte(source.getBytes(StandardCharsets.UTF_8)); + DESKeySpec desKeySpec = getDesKeySpec(source); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + cipher.init(Cipher.DECRYPT_MODE, secretKey, IV); + byte[] retByte = cipher.doFinal(src); + return new String(retByte); + } - private static byte[] hex2byte(byte[] b) { - int size = 2; - if ((b.length % size) != 0) { - throw new IllegalArgumentException("长度不是偶数"); - } - byte[] b2 = new byte[b.length / 2]; - for (int n = 0; n < b.length; n += size) { - String item = new String(b, n, 2); - b2[n / 2] = (byte)Integer.parseInt(item, 16); - } - return b2; + private static String byte2hex(byte[] inStr) { + String stmp; + StringBuilder out = new StringBuilder(inStr.length * 2); + for (byte b : inStr) { + stmp = Integer.toHexString(b & 0xFF); + if (stmp.length() == 1) { + out.append("0").append(stmp); + } else { + out.append(stmp); + } } + return out.toString(); + } + + private static byte[] hex2byte(byte[] b) { + int size = 2; + if ((b.length % size) != 0) { + throw new IllegalArgumentException("长度不是偶数"); + } + byte[] b2 = new byte[b.length / 2]; + for (int n = 0; n < b.length; n += size) { + String item = new String(b, n, 2); + b2[n / 2] = (byte) Integer.parseInt(item, 16); + } + return b2; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java index 55b92071..6f02d687 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitDistributedIdUtil.java @@ -25,169 +25,171 @@ import java.util.concurrent.atomic.AtomicLong; * @date 2025-04-05 */ public final class KitDistributedIdUtil { - /** - * 起始毫秒时间戳, 2020-12-30 - */ - private static final long START_TIMESTAMP = 1609314517000L; - /** - * 数据中心 ID 所占位数 - */ - private final long dataCenterIdBits; - /** - * 机器 ID 所占位数 - */ - private final long workerIdBits; - /** - * 序列号所占位数 - */ - private final long sequenceBits; - /** - * 数据中心 ID 最大值 - */ - private final long maxDataCenterId; - /** - * 机器 ID 最大值 - */ - private final long maxWorkerId; - /** - * 序列号最大值 - */ - private final long sequenceMask; - /** - * 机器 ID 向左移位数 - */ - private final long workerIdShift; - /** - * 数据中心 ID 向左移位数 - */ - private final long dataCenterIdShift; - /** - * 时间戳向左移位数 - */ - private final long timestampLeftShift; - /** - * 数据中心 ID - */ - private final long dataCenterId; - /** - * 机器 ID - */ - private final long workerId; - /** - * 序列号 - */ - private final AtomicLong sequence = new AtomicLong(0L); - /** - * 上一次生成 ID 的时间戳 - */ - private final AtomicLong lastTimestamp = new AtomicLong(-1L); - /** - * 构造函数, 初始化数据中心 ID 和机器 ID - * - * @param dataCenterId 数据中心 ID - * @param workerId 机器 ID - * @param dataCenterIdBits 数据中心 ID 所占位数 - * @param workerIdBits 机器 ID 所占位数 - * @param sequenceBits 序列号所占位数 - */ - public KitDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, - long sequenceBits) { - this.dataCenterIdBits = dataCenterIdBits; - this.workerIdBits = workerIdBits; - this.sequenceBits = sequenceBits; - this.maxDataCenterId = ~(-1L << dataCenterIdBits); - this.maxWorkerId = ~(-1L << workerIdBits); - this.sequenceMask = ~(-1L << sequenceBits); - this.workerIdShift = sequenceBits; - this.dataCenterIdShift = sequenceBits + workerIdBits; - this.timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; - if (dataCenterId > maxDataCenterId || dataCenterId < 0) { - throw new IllegalArgumentException( - "Data center ID can't be greater than " + maxDataCenterId + " or less than 0"); - } - if (workerId > maxWorkerId || workerId < 0) { - throw new IllegalArgumentException("Worker ID can't be greater than " + maxWorkerId + " or less than 0"); - } - this.dataCenterId = dataCenterId; - this.workerId = workerId; - } + /** + * 起始毫秒时间戳, 2020-12-30 + */ + private static final long START_TIMESTAMP = 1609314517000L; + /** + * 数据中心 ID 所占位数 + */ + private final long dataCenterIdBits; + /** + * 机器 ID 所占位数 + */ + private final long workerIdBits; + /** + * 序列号所占位数 + */ + private final long sequenceBits; + /** + * 数据中心 ID 最大值 + */ + private final long maxDataCenterId; + /** + * 机器 ID 最大值 + */ + private final long maxWorkerId; + /** + * 序列号最大值 + */ + private final long sequenceMask; + /** + * 机器 ID 向左移位数 + */ + private final long workerIdShift; + /** + * 数据中心 ID 向左移位数 + */ + private final long dataCenterIdShift; + /** + * 时间戳向左移位数 + */ + private final long timestampLeftShift; + /** + * 数据中心 ID + */ + private final long dataCenterId; + /** + * 机器 ID + */ + private final long workerId; + /** + * 序列号 + */ + private final AtomicLong sequence = new AtomicLong(0L); + /** + * 上一次生成 ID 的时间戳 + */ + private final AtomicLong lastTimestamp = new AtomicLong(-1L); - /** - * 获取单例实例的下一个分布式 ID - * - * @return 生成的分布式 ID - */ - public static long fastNextId() { - return InstanceHolder.INSTANCE.nextId(); + /** + * 构造函数, 初始化数据中心 ID 和机器 ID + * + * @param dataCenterId 数据中心 ID + * @param workerId 机器 ID + * @param dataCenterIdBits 数据中心 ID 所占位数 + * @param workerIdBits 机器 ID 所占位数 + * @param sequenceBits 序列号所占位数 + */ + public KitDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, + long sequenceBits) { + this.dataCenterIdBits = dataCenterIdBits; + this.workerIdBits = workerIdBits; + this.sequenceBits = sequenceBits; + this.maxDataCenterId = ~(-1L << dataCenterIdBits); + this.maxWorkerId = ~(-1L << workerIdBits); + this.sequenceMask = ~(-1L << sequenceBits); + this.workerIdShift = sequenceBits; + this.dataCenterIdShift = sequenceBits + workerIdBits; + this.timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; + if (dataCenterId > maxDataCenterId || dataCenterId < 0) { + throw new IllegalArgumentException( + "Data center ID can't be greater than " + maxDataCenterId + " or less than 0"); } + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException("Worker ID can't be greater than " + maxWorkerId + " or less than 0"); + } + this.dataCenterId = dataCenterId; + this.workerId = workerId; + } - /** - * 主方法,用于测试分布式 ID 生成 - * - * @param args 命令行参数 - */ - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - new Thread(() -> { - long id = Thread.currentThread().getId(); - for (int j = 0; j < 20; j++) { - System.out.println(id + " - " + KitDistributedIdUtil.fastNextId()); - } - }).start(); - } - } + /** + * 获取单例实例的下一个分布式 ID + * + * @return 生成的分布式 ID + */ + public static long fastNextId() { + return InstanceHolder.INSTANCE.nextId(); + } - /** - * 生成下一个分布式 ID - * - * @return 生成的分布式 ID - */ - public long nextId() { - long currentTimestamp = System.currentTimeMillis(); - // 如果当前时间戳小于上一次生成 ID 的时间戳, 说明时钟回拨,抛出异常 - if (currentTimestamp < lastTimestamp.get()) { - throw new BadRequestException( - "Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) + - " milliseconds"); - } - long lastTimestampValue = lastTimestamp.get(); - if (currentTimestamp == lastTimestampValue) { - // 同一毫秒内,序列号自增 - long seq = sequence.incrementAndGet() & sequenceMask; - if (seq == 0) { - // 序列号溢出,等待下一毫秒 - currentTimestamp = waitNextMillis(lastTimestampValue); - } - return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | - (workerId << workerIdShift) | seq; - } else { - // 时间戳改变,重置序列号 - sequence.set(0L); - lastTimestamp.set(currentTimestamp); - return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | - (workerId << workerIdShift); + /** + * 主方法,用于测试分布式 ID 生成 + * + * @param args 命令行参数 + */ + public static void main(String[] args) { + for (int i = 0; i < 10; i++) { + new Thread(() -> { + long id = Thread.currentThread().getId(); + for (int j = 0; j < 20; j++) { + System.out.println(id + " - " + KitDistributedIdUtil.fastNextId()); } + }).start(); } + } - /** - * 等待下一毫秒 - * - * @param lastTimestamp 上一次生成 ID 的时间戳 - * @return 当前时间戳 - */ - private long waitNextMillis(long lastTimestamp) { - long timestamp = System.currentTimeMillis(); - while (timestamp <= lastTimestamp) { - timestamp = System.currentTimeMillis(); - } - return timestamp; + /** + * 生成下一个分布式 ID + * + * @return 生成的分布式 ID + */ + public long nextId() { + long currentTimestamp = System.currentTimeMillis(); + // 如果当前时间戳小于上一次生成 ID 的时间戳, 说明时钟回拨,抛出异常 + if (currentTimestamp < lastTimestamp.get()) { + throw new BadRequestException( + "Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) + + " milliseconds"); } + long lastTimestampValue = lastTimestamp.get(); + if (currentTimestamp == lastTimestampValue) { + // 同一毫秒内,序列号自增 + long seq = sequence.incrementAndGet() & sequenceMask; + if (seq == 0) { + // 序列号溢出,等待下一毫秒 + currentTimestamp = waitNextMillis(lastTimestampValue); + } + return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | + (workerId << workerIdShift) | seq; + } else { + // 时间戳改变,重置序列号 + sequence.set(0L); + lastTimestamp.set(currentTimestamp); + return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | + (workerId << workerIdShift); + } + } - /** - * 单例实例持有者类 - */ - private static class InstanceHolder { - private static final KitDistributedIdUtil INSTANCE = new KitDistributedIdUtil(20, 12, 5, 5, 12); + /** + * 等待下一毫秒 + * + * @param lastTimestamp 上一次生成 ID 的时间戳 + * @return 当前时间戳 + */ + private long waitNextMillis(long lastTimestamp) { + long timestamp = System.currentTimeMillis(); + while (timestamp <= lastTimestamp) { + timestamp = System.currentTimeMillis(); } + return timestamp; + } + + /** + * 单例实例持有者类 + */ + private static class InstanceHolder { + + private static final KitDistributedIdUtil INSTANCE = new KitDistributedIdUtil(20, 12, 5, 5, 12); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java index 282c63e0..59f460e0 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitFileUtil.java @@ -15,6 +15,11 @@ */ package cn.odboy.util; +import static cn.odboy.constant.SystemConst.SYMBOL_ADD; +import static cn.odboy.constant.SystemConst.SYMBOL_AT; +import static cn.odboy.constant.SystemConst.SYMBOL_EQUAL; +import static cn.odboy.constant.SystemConst.SYMBOL_SUBTRACT; + import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.poi.excel.BigExcelWriter; @@ -45,346 +50,342 @@ import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.springframework.web.multipart.MultipartFile; -import static cn.odboy.constant.SystemConst.SYMBOL_ADD; -import static cn.odboy.constant.SystemConst.SYMBOL_AT; -import static cn.odboy.constant.SystemConst.SYMBOL_EQUAL; -import static cn.odboy.constant.SystemConst.SYMBOL_SUBTRACT; - /** * File工具类, 扩展 hutool 工具包 */ @Slf4j @UtilityClass public final class KitFileUtil extends cn.hutool.core.io.FileUtil { - /** - * 系统临时目录 - *
- * windows 包含路径分割符, 但Linux 不包含, 在windows \\==\ 前提下, 为安全起见 同意拼装 路径分割符, - *

-     *       java.io.tmpdir
-     *       windows : C:\Users/xxx\AppData\Local\Temp\
-     *       linux: /temp
-     * 
- */ - public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator; - /** - * 定义GB的计算常量 - */ - private static final int GB = 1024 * 1024 * 1024; - /** - * 定义MB的计算常量 - */ - private static final int MB = 1024 * 1024; - /** - * 定义KB的计算常量 - */ - private static final int KB = 1024; - /** - * 格式化小数 - */ - private static final DecimalFormat DF = new DecimalFormat("0.00"); - /** - * MultipartFile转File - */ - public static File toFile(MultipartFile multipartFile) { - // 获取文件名 - String fileName = multipartFile.getOriginalFilename(); - // 获取文件后缀 - String prefix = "." + getSuffix(fileName); - File file = null; + /** + * 系统临时目录 + *
+ * windows 包含路径分割符, 但Linux 不包含, 在windows \\==\ 前提下, 为安全起见 同意拼装 路径分割符, + *
+   *       java.io.tmpdir
+   *       windows : C:\Users/xxx\AppData\Local\Temp\
+   *       linux: /temp
+   * 
+ */ + public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator; + /** + * 定义GB的计算常量 + */ + private static final int GB = 1024 * 1024 * 1024; + /** + * 定义MB的计算常量 + */ + private static final int MB = 1024 * 1024; + /** + * 定义KB的计算常量 + */ + private static final int KB = 1024; + /** + * 格式化小数 + */ + private static final DecimalFormat DF = new DecimalFormat("0.00"); + + /** + * MultipartFile转File + */ + public static File toFile(MultipartFile multipartFile) { + // 获取文件名 + String fileName = multipartFile.getOriginalFilename(); + // 获取文件后缀 + String prefix = "." + getSuffix(fileName); + File file = null; + try { + // 用uuid作为文件名, 防止生成的临时文件重复 + file = new File(SYS_TEM_DIR + IdUtil.simpleUUID() + prefix); + // MultipartFile to File + multipartFile.transferTo(file); + } catch (IOException e) { + log.error("保存临时文件失败", e); + } + return file; + } + + /** + * 文件大小转换 + */ + public static String getSize(long size) { + String resultSize; + if (size / GB >= 1) { + //如果当前Byte的值大于等于1GB + resultSize = DF.format(size / (float) GB) + " GB"; + } else if (size / MB >= 1) { + //如果当前Byte的值大于等于1MB + resultSize = DF.format(size / (float) MB) + " MB"; + } else if (size / KB >= 1) { + //如果当前Byte的值大于等于1KB + resultSize = DF.format(size / (float) KB) + " KB"; + } else { + resultSize = size + " B"; + } + return resultSize; + } + + /** + * inputStream 转 File + */ + public static File inputStreamToFile(InputStream ins, String name) { + File file = new File(SYS_TEM_DIR + name); + if (file.exists()) { + return file; + } + OutputStream os = null; + try { + os = Files.newOutputStream(file.toPath()); + int bytesRead; + int len = 8192; + byte[] buffer = new byte[len]; + while ((bytesRead = ins.read(buffer, 0, len)) != -1) { + os.write(buffer, 0, bytesRead); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + KitCloseUtil.close(os); + KitCloseUtil.close(ins); + } + return file; + } + + /** + * 将文件名解析成文件的上传路径 + */ + public static File upload(MultipartFile file, String filePath) { + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssS"); + // 过滤非法文件名 + String name = getPrefix(verifyFilename(file.getOriginalFilename())); + String suffix = getSuffix(file.getOriginalFilename()); + String nowStr = "-" + format.format(date); + try { + String fileName = name + nowStr + "." + suffix; + String path = filePath + fileName; + // getCanonicalFile 可解析正确各种路径 + File dest = new File(path).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + if (!dest.getParentFile().mkdirs()) { + log.error("创建目录失败, {}", dest.getParentFile().getAbsolutePath()); + } + } + // 文件写入 + file.transferTo(dest); + return dest; + } catch (Exception e) { + log.error("文件上传失败", e); + } + return null; + } + + /** + * 导出excel + */ + public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + File file = new File(tempPath); + BigExcelWriter writer = ExcelUtil.getBigWriter(file); + // 处理数据以防止CSV注入 + List> sanitizedList = list.parallelStream().map(map -> { + Map sanitizedMap = new LinkedHashMap<>(); + map.forEach((key, value) -> { + if (value instanceof String) { + String strValue = (String) value; + // 检查并处理以特殊字符开头的值 + if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || + strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) { + // 添加单引号前缀 + strValue = "'" + strValue; + } + sanitizedMap.put(key, strValue); + } else { + sanitizedMap.put(key, value); + } + }); + return sanitizedMap; + }).collect(Collectors.toList()); + // 一次性写出内容, 使用默认样式,强制输出标题 + writer.write(sanitizedList, true); + SXSSFSheet sheet = (SXSSFSheet) writer.getSheet(); + //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 + sheet.trackAllColumnsForAutoSizing(); + //列宽自适应 + writer.autoSizeColumnAll(); + //response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); + ServletOutputStream out = response.getOutputStream(); + // 终止后删除临时文件 + file.deleteOnExit(); + writer.flush(out, true); + //此处记得关闭输出Servlet流 + IoUtil.close(out); + } + + /** + * 获取文件类型 + */ + public static String getFileType(String type) { + String documents = "txt doc pdf ppt pps xlsx xls docx"; + String voice = "mp3 wav wma mpa ram ra aac aif m4a"; + String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg"; + String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg"; + if (image.contains(type)) { + return FileTypeEnum.IMAGE.getCode(); + } else if (documents.contains(type)) { + return FileTypeEnum.DOC.getCode(); + } else if (voice.contains(type)) { + return FileTypeEnum.VOICE.getCode(); + } else if (video.contains(type)) { + return FileTypeEnum.VIDEO.getCode(); + } else { + return FileTypeEnum.OTHER.getCode(); + } + } + + /** + * 检查文件大小是否超出最大值 + */ + public static void checkSize(long maxSize, long size) { + // 1M + int len = 1024 * 1024; + if (size > (maxSize * len)) { + throw new BadRequestException("文件超出规定大小:" + maxSize + "MB"); + } + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(File file1, File file2) { + String img1Md5 = getMd5(file1); + String img2Md5 = getMd5(file2); + if (img1Md5 != null) { + return img1Md5.equals(img2Md5); + } + return false; + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(String file1Md5, String file2Md5) { + return file1Md5.equals(file2Md5); + } + + /** + * 获取文件字节数组 + */ + private static byte[] getByte(File file) { + byte[] b = new byte[(int) file.length()]; + InputStream in = null; + try { + in = Files.newInputStream(file.toPath()); + // 忽略read值 + int read = in.read(b); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } finally { + KitCloseUtil.close(in); + } + return b; + } + + /** + * 获取文件MD5值 + */ + private static String getMd5(byte[] bytes) { + // 16进制字符 + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(bytes); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + // 移位 输出字符串 + for (byte byte0 : md) { + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + log.error("获取文件MD5值失败", e); + } + return null; + } + + /** + * 下载文件 + * + * @param request / + * @param response / + * @param file / + */ + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, + boolean deleteOnExit) { + response.setCharacterEncoding(request.getCharacterEncoding()); + response.setContentType("application/octet-stream"); + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); + IOUtils.copy(fis, response.getOutputStream()); + response.flushBuffer(); + } catch (Exception e) { + log.error("下载文件失败", e); + } finally { + if (fis != null) { try { - // 用uuid作为文件名, 防止生成的临时文件重复 - file = new File(SYS_TEM_DIR + IdUtil.simpleUUID() + prefix); - // MultipartFile to File - multipartFile.transferTo(file); + fis.close(); + if (deleteOnExit) { + file.deleteOnExit(); + } } catch (IOException e) { - log.error("保存临时文件失败", e); + log.error("关闭IO流失败", e); } - return file; + } } + } - /** - * 文件大小转换 - */ - public static String getSize(long size) { - String resultSize; - if (size / GB >= 1) { - //如果当前Byte的值大于等于1GB - resultSize = DF.format(size / (float)GB) + " GB"; - } else if (size / MB >= 1) { - //如果当前Byte的值大于等于1MB - resultSize = DF.format(size / (float)MB) + " MB"; - } else if (size / KB >= 1) { - //如果当前Byte的值大于等于1KB - resultSize = DF.format(size / (float)KB) + " KB"; - } else { - resultSize = size + " B"; - } - return resultSize; + /** + * 验证并过滤非法的文件名 + * + * @param fileName 文件名 + * @return 文件名 + */ + public static String verifyFilename(String fileName) { + // 过滤掉特殊字符 + fileName = fileName.replaceAll("[\\\\/:*?\"<>|~\\s]", ""); + // 去掉文件名开头和结尾的空格和点 + fileName = fileName.trim().replaceAll("^[. ]+|[. ]+$", ""); + // 不允许文件名超过255(在Mac和Linux中)或260(在Windows中)个字符 + int maxFileNameLength = 255; + if (System.getProperty(SystemConst.PROPERTY_OS_NAME).startsWith(SystemConst.OS_NAME_WINDOWS)) { + maxFileNameLength = 260; } + if (fileName.length() > maxFileNameLength) { + fileName = fileName.substring(0, maxFileNameLength); + } + // 过滤掉控制字符 + fileName = fileName.replaceAll("[\\p{Cntrl}]", ""); + // 过滤掉 ".." 路径 + fileName = fileName.replaceAll("\\.{2,}", ""); + // 去掉文件名开头的 ".." + fileName = fileName.replaceAll("^\\.+/", ""); + // 保留文件名中最后一个 "." 字符,过滤掉其他 "." + fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + + fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2"); + return fileName; + } - /** - * inputStream 转 File - */ - public static File inputStreamToFile(InputStream ins, String name) { - File file = new File(SYS_TEM_DIR + name); - if (file.exists()) { - return file; - } - OutputStream os = null; - try { - os = Files.newOutputStream(file.toPath()); - int bytesRead; - int len = 8192; - byte[] buffer = new byte[len]; - while ((bytesRead = ins.read(buffer, 0, len)) != -1) { - os.write(buffer, 0, bytesRead); - } - } catch (Exception e) { - log.error(e.getMessage(), e); - } finally { - KitCloseUtil.close(os); - KitCloseUtil.close(ins); - } - return file; - } - - /** - * 将文件名解析成文件的上传路径 - */ - public static File upload(MultipartFile file, String filePath) { - Date date = new Date(); - SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssS"); - // 过滤非法文件名 - String name = getPrefix(verifyFilename(file.getOriginalFilename())); - String suffix = getSuffix(file.getOriginalFilename()); - String nowStr = "-" + format.format(date); - try { - String fileName = name + nowStr + "." + suffix; - String path = filePath + fileName; - // getCanonicalFile 可解析正确各种路径 - File dest = new File(path).getCanonicalFile(); - // 检测是否存在目录 - if (!dest.getParentFile().exists()) { - if (!dest.getParentFile().mkdirs()) { - log.error("创建目录失败, {}", dest.getParentFile().getAbsolutePath()); - } - } - // 文件写入 - file.transferTo(dest); - return dest; - } catch (Exception e) { - log.error("文件上传失败", e); - } - return null; - } - - /** - * 导出excel - */ - public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { - String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; - File file = new File(tempPath); - BigExcelWriter writer = ExcelUtil.getBigWriter(file); - // 处理数据以防止CSV注入 - List> sanitizedList = list.parallelStream().map(map -> { - Map sanitizedMap = new LinkedHashMap<>(); - map.forEach((key, value) -> { - if (value instanceof String) { - String strValue = (String)value; - // 检查并处理以特殊字符开头的值 - if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || - strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) { - // 添加单引号前缀 - strValue = "'" + strValue; - } - sanitizedMap.put(key, strValue); - } else { - sanitizedMap.put(key, value); - } - }); - return sanitizedMap; - }).collect(Collectors.toList()); - // 一次性写出内容, 使用默认样式,强制输出标题 - writer.write(sanitizedList, true); - SXSSFSheet sheet = (SXSSFSheet)writer.getSheet(); - //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 - sheet.trackAllColumnsForAutoSizing(); - //列宽自适应 - writer.autoSizeColumnAll(); - //response为HttpServletResponse对象 - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); - //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 - response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); - ServletOutputStream out = response.getOutputStream(); - // 终止后删除临时文件 - file.deleteOnExit(); - writer.flush(out, true); - //此处记得关闭输出Servlet流 - IoUtil.close(out); - } - - /** - * 获取文件类型 - */ - public static String getFileType(String type) { - String documents = "txt doc pdf ppt pps xlsx xls docx"; - String voice = "mp3 wav wma mpa ram ra aac aif m4a"; - String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg"; - String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg"; - if (image.contains(type)) { - return FileTypeEnum.IMAGE.getCode(); - } else if (documents.contains(type)) { - return FileTypeEnum.DOC.getCode(); - } else if (voice.contains(type)) { - return FileTypeEnum.VOICE.getCode(); - } else if (video.contains(type)) { - return FileTypeEnum.VIDEO.getCode(); - } else { - return FileTypeEnum.OTHER.getCode(); - } - } - - /** - * 检查文件大小是否超出最大值 - */ - public static void checkSize(long maxSize, long size) { - // 1M - int len = 1024 * 1024; - if (size > (maxSize * len)) { - throw new BadRequestException("文件超出规定大小:" + maxSize + "MB"); - } - } - - /** - * 判断两个文件是否相同 - */ - public static boolean check(File file1, File file2) { - String img1Md5 = getMd5(file1); - String img2Md5 = getMd5(file2); - if (img1Md5 != null) { - return img1Md5.equals(img2Md5); - } - return false; - } - - /** - * 判断两个文件是否相同 - */ - public static boolean check(String file1Md5, String file2Md5) { - return file1Md5.equals(file2Md5); - } - - /** - * 获取文件字节数组 - */ - private static byte[] getByte(File file) { - byte[] b = new byte[(int)file.length()]; - InputStream in = null; - try { - in = Files.newInputStream(file.toPath()); - // 忽略read值 - int read = in.read(b); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } finally { - KitCloseUtil.close(in); - } - return b; - } - - /** - * 获取文件MD5值 - */ - private static String getMd5(byte[] bytes) { - // 16进制字符 - char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - try { - MessageDigest mdTemp = MessageDigest.getInstance("MD5"); - mdTemp.update(bytes); - byte[] md = mdTemp.digest(); - int j = md.length; - char[] str = new char[j * 2]; - int k = 0; - // 移位 输出字符串 - for (byte byte0 : md) { - str[k++] = hexDigits[byte0 >>> 4 & 0xf]; - str[k++] = hexDigits[byte0 & 0xf]; - } - return new String(str); - } catch (Exception e) { - log.error("获取文件MD5值失败", e); - } - return null; - } - - /** - * 下载文件 - * - * @param request / - * @param response / - * @param file / - */ - public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, - boolean deleteOnExit) { - response.setCharacterEncoding(request.getCharacterEncoding()); - response.setContentType("application/octet-stream"); - FileInputStream fis = null; - try { - fis = new FileInputStream(file); - response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); - IOUtils.copy(fis, response.getOutputStream()); - response.flushBuffer(); - } catch (Exception e) { - log.error("下载文件失败", e); - } finally { - if (fis != null) { - try { - fis.close(); - if (deleteOnExit) { - file.deleteOnExit(); - } - } catch (IOException e) { - log.error("关闭IO流失败", e); - } - } - } - } - - /** - * 验证并过滤非法的文件名 - * - * @param fileName 文件名 - * @return 文件名 - */ - public static String verifyFilename(String fileName) { - // 过滤掉特殊字符 - fileName = fileName.replaceAll("[\\\\/:*?\"<>|~\\s]", ""); - // 去掉文件名开头和结尾的空格和点 - fileName = fileName.trim().replaceAll("^[. ]+|[. ]+$", ""); - // 不允许文件名超过255(在Mac和Linux中)或260(在Windows中)个字符 - int maxFileNameLength = 255; - if (System.getProperty(SystemConst.PROPERTY_OS_NAME).startsWith(SystemConst.OS_NAME_WINDOWS)) { - maxFileNameLength = 260; - } - if (fileName.length() > maxFileNameLength) { - fileName = fileName.substring(0, maxFileNameLength); - } - // 过滤掉控制字符 - fileName = fileName.replaceAll("[\\p{Cntrl}]", ""); - // 过滤掉 ".." 路径 - fileName = fileName.replaceAll("\\.{2,}", ""); - // 去掉文件名开头的 ".." - fileName = fileName.replaceAll("^\\.+/", ""); - // 保留文件名中最后一个 "." 字符,过滤掉其他 "." - fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + - fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2"); - return fileName; - } - - public static String getMd5(File file) { - return getMd5(getByte(file)); - } + public static String getMd5(File file) { + return getMd5(getByte(file)); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java index 2cf6a207..6d651fe3 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitIPUtil.java @@ -28,61 +28,62 @@ import net.dreamlu.mica.ip2region.core.IpInfo; */ @UtilityClass public final class KitIPUtil { - /** - * 注入bean - */ - private final static Ip2regionSearcher IP_SEARCHER = KitSpringBeanHolder.getBean(Ip2regionSearcher.class); - /** - * 根据ip获取详细地址 - */ - public static String getCityInfo(String ip) { - IpInfo ipInfo = IP_SEARCHER.memorySearch(ip); - if (ipInfo != null) { - return ipInfo.getAddress(); - } - return null; - } + /** + * 注入bean + */ + private final static Ip2regionSearcher IP_SEARCHER = KitSpringBeanHolder.getBean(Ip2regionSearcher.class); - /** - * 获取当前机器的IP - * - * @return / - */ - public static String getLocalIp() { - try { - InetAddress candidateAddress = null; - // 遍历所有的网络接口 - for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); - interfaces.hasMoreElements(); ) { - NetworkInterface anInterface = interfaces.nextElement(); - // 在所有的接口下再遍历IP - for (Enumeration inetAddresses = anInterface.getInetAddresses(); - inetAddresses.hasMoreElements(); ) { - InetAddress inetAddr = inetAddresses.nextElement(); - // 排除loopback类型地址 - if (!inetAddr.isLoopbackAddress()) { - if (inetAddr.isSiteLocalAddress()) { - // 如果是site-local地址, 就是它了 - return inetAddr.getHostAddress(); - } else if (candidateAddress == null) { - // site-local类型的地址未被发现, 先记录候选地址 - candidateAddress = inetAddr; - } - } - } - } - if (candidateAddress != null) { - return candidateAddress.getHostAddress(); - } - // 如果没有发现 non-loopback地址.只能用最次选的方案 - InetAddress jdkSuppliedAddress = InetAddress.getLocalHost(); - if (jdkSuppliedAddress == null) { - return ""; - } - return jdkSuppliedAddress.getHostAddress(); - } catch (Exception e) { - return ""; - } + /** + * 根据ip获取详细地址 + */ + public static String getCityInfo(String ip) { + IpInfo ipInfo = IP_SEARCHER.memorySearch(ip); + if (ipInfo != null) { + return ipInfo.getAddress(); } + return null; + } + + /** + * 获取当前机器的IP + * + * @return / + */ + public static String getLocalIp() { + try { + InetAddress candidateAddress = null; + // 遍历所有的网络接口 + for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); + interfaces.hasMoreElements(); ) { + NetworkInterface anInterface = interfaces.nextElement(); + // 在所有的接口下再遍历IP + for (Enumeration inetAddresses = anInterface.getInetAddresses(); + inetAddresses.hasMoreElements(); ) { + InetAddress inetAddr = inetAddresses.nextElement(); + // 排除loopback类型地址 + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + // 如果是site-local地址, 就是它了 + return inetAddr.getHostAddress(); + } else if (candidateAddress == null) { + // site-local类型的地址未被发现, 先记录候选地址 + candidateAddress = inetAddr; + } + } + } + } + if (candidateAddress != null) { + return candidateAddress.getHostAddress(); + } + // 如果没有发现 non-loopback地址.只能用最次选的方案 + InetAddress jdkSuppliedAddress = InetAddress.getLocalHost(); + if (jdkSuppliedAddress == null) { + return ""; + } + return jdkSuppliedAddress.getHostAddress(); + } catch (Exception e) { + return ""; + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java index 23aa8ed9..8b8fc9d5 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitJsonUtil.java @@ -29,18 +29,21 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitJsonUtil { - public static Map toMap(String jsonStr, Class kClass, Class vClass) { - return JSON.parseObject(jsonStr, new TypeReference>() {}); - } - public static List toList(String jsonStr, Class vClass) { - return JSON.parseObject(jsonStr, new TypeReference>() {}); - } + public static Map toMap(String jsonStr, Class kClass, Class vClass) { + return JSON.parseObject(jsonStr, new TypeReference>() { + }); + } - public static void main(String[] args) { - String mapStr = "{\"key1\":\"value1\", \"key2\":\"value2\"}"; - System.err.println(KitJsonUtil.toMap(mapStr, String.class, String.class)); - String listStr = "[\"value1\", \"value2\"]"; - System.err.println(KitJsonUtil.toList(listStr, String.class)); - } + public static List toList(String jsonStr, Class vClass) { + return JSON.parseObject(jsonStr, new TypeReference>() { + }); + } + + public static void main(String[] args) { + String mapStr = "{\"key1\":\"value1\", \"key2\":\"value2\"}"; + System.err.println(KitJsonUtil.toMap(mapStr, String.class, String.class)); + String listStr = "[\"value1\", \"value2\"]"; + System.err.println(KitJsonUtil.toList(listStr, String.class)); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java index fc587574..ca212ef4 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitListUtil.java @@ -31,38 +31,38 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitListUtil { - /** - * 根据对象T的属性去重 - * - * @param items 对象T集合 - * @param classifier 对象T属性表达式, 比如: User::getName - */ - public static List distinctByArgs(List items, Function classifier) { - return items.stream().collect(Collectors.groupingBy(classifier)).values().stream() - .map(monitorItem -> monitorItem.iterator().next()).collect(Collectors.toList()); - } - /** - * list转map, 保留新值 -> Map userMap = items.stream().collect(Collectors.toMap(User::getName, user -> - * user))
list转map, 保留旧值 -> Map userMap = users.stream().collect(Collectors.toMap(User::getName, - * user -> user, (existing, replacement) -> existing)); - */ - public static void main(String[] args) { - List entities = new ArrayList<>(); - int total = 50; - for (int i = 0; i < total; i++) { - KitBaseUserTimeTb entity = new KitBaseUserTimeTb(); - if (i % 2 == 0) { - entity.setCreateBy("odboy"); - } else { - entity.setCreateBy("admin"); - } - entity.setUpdateBy("admin"); - entity.setCreateTime(DateTime.now().toTimestamp()); - entity.setUpdateTime(DateTime.now().toTimestamp()); - entities.add(entity); - } - List entities1 = KitListUtil.distinctByArgs(entities, KitBaseUserTimeTb::getCreateBy); - System.err.println(entities1); + /** + * 根据对象T的属性去重 + * + * @param items 对象T集合 + * @param classifier 对象T属性表达式, 比如: User::getName + */ + public static List distinctByArgs(List items, Function classifier) { + return items.stream().collect(Collectors.groupingBy(classifier)).values().stream() + .map(monitorItem -> monitorItem.iterator().next()).collect(Collectors.toList()); + } + + /** + * list转map, 保留新值 -> Map userMap = items.stream().collect(Collectors.toMap(User::getName, user -> user))
list转map, 保留旧值 -> Map userMap = users.stream().collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing)); + */ + public static void main(String[] args) { + List entities = new ArrayList<>(); + int total = 50; + for (int i = 0; i < total; i++) { + KitBaseUserTimeTb entity = new KitBaseUserTimeTb(); + if (i % 2 == 0) { + entity.setCreateBy("odboy"); + } else { + entity.setCreateBy("admin"); + } + entity.setUpdateBy("admin"); + entity.setCreateTime(DateTime.now().toTimestamp()); + entity.setUpdateTime(DateTime.now().toTimestamp()); + entities.add(entity); } + List entities1 = KitListUtil.distinctByArgs(entities, KitBaseUserTimeTb::getCreateBy); + System.err.println(entities1); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitLogFmtUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitLogFmtUtil.java index 2f5e984c..022b77c6 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitLogFmtUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitLogFmtUtil.java @@ -25,26 +25,27 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitLogFmtUtil { - /** - * 替换字符串中的占位符 {} 为传入的参数 - * - * @param message 消息模板 - * @param args 替换占位符的参数 - * @return 替换后的消息 - */ - public static String format(String message, Object... args) { - if (message == null || args == null || args.length == 0) { - return message; - } - // 使用 String.format 替换占位符 - return String.format(message.replace("{}", "%s"), args); - } - public static void main(String[] args) { - // 示例用法 - String messageTemplate = "获取dingtalk accessToken失败, code={}, message={}"; - String formattedMessage = format(messageTemplate, 400, "Bad Request"); - // 输出: 获取dingtalk accessToken失败, code=400, message=Bad Request - System.out.println(formattedMessage); + /** + * 替换字符串中的占位符 {} 为传入的参数 + * + * @param message 消息模板 + * @param args 替换占位符的参数 + * @return 替换后的消息 + */ + public static String format(String message, Object... args) { + if (message == null || args == null || args.length == 0) { + return message; } + // 使用 String.format 替换占位符 + return String.format(message.replace("{}", "%s"), args); + } + + public static void main(String[] args) { + // 示例用法 + String messageTemplate = "获取dingtalk accessToken失败, code={}, message={}"; + String formattedMessage = format(messageTemplate, 400, "Bad Request"); + // 输出: 获取dingtalk accessToken失败, code=400, message=Bad Request + System.out.println(formattedMessage); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java index f0541ef1..f1d888aa 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitPageUtil.java @@ -31,58 +31,59 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitPageUtil extends cn.hutool.core.util.PageUtil { - /** - * List 分页 - */ - public static List softPaging(long page, long size, List list) { - int pageIndex = Math.toIntExact(page - 1); - int fromIndex = Math.toIntExact(pageIndex * size); - int toIndex = Math.toIntExact(pageIndex * size + size); - if (fromIndex > list.size()) { - return Collections.emptyList(); - } else if (toIndex >= list.size()) { - return list.subList(fromIndex, list.size()); - } else { - return list.subList(fromIndex, toIndex); - } - } - /** - * Page 数据处理 - */ - public static KitPageResult toPage(IPage page) { - return new KitPageResult<>(page.getRecords(), page.getTotal()); + /** + * List 分页 + */ + public static List softPaging(long page, long size, List list) { + int pageIndex = Math.toIntExact(page - 1); + int fromIndex = Math.toIntExact(pageIndex * size); + int toIndex = Math.toIntExact(pageIndex * size + size); + if (fromIndex > list.size()) { + return Collections.emptyList(); + } else if (toIndex >= list.size()) { + return list.subList(fromIndex, list.size()); + } else { + return list.subList(fromIndex, toIndex); } + } - /** - * 自定义分页 - */ - public static KitPageResult toPage(List list) { - return new KitPageResult<>(list, list.size()); - } + /** + * Page 数据处理 + */ + public static KitPageResult toPage(IPage page) { + return new KitPageResult<>(page.getRecords(), page.getTotal()); + } - /** - * 返回空数据 - */ - public static KitPageResult emptyListData() { - return new KitPageResult<>(new ArrayList<>(), 0); - } + /** + * 自定义分页 + */ + public static KitPageResult toPage(List list) { + return new KitPageResult<>(list, list.size()); + } - /** - * 返回空数据 - */ - public static KitPageResult emptyData() { - return new KitPageResult<>(null, 0); - } + /** + * 返回空数据 + */ + public static KitPageResult emptyListData() { + return new KitPageResult<>(new ArrayList<>(), 0); + } - /** - * 自定义分页 - */ - public static KitPageResult toPage(List list, long totalElements) { - return new KitPageResult<>(list, totalElements); - } + /** + * 返回空数据 + */ + public static KitPageResult emptyData() { + return new KitPageResult<>(null, 0); + } - public static Page getCount(BaseMapper baseMapper) { - return new Page<>(1, baseMapper.selectCount(null)); - } + /** + * 自定义分页 + */ + public static KitPageResult toPage(List list, long totalElements) { + return new KitPageResult<>(list, totalElements); + } + + public static Page getCount(BaseMapper baseMapper) { + return new Page<>(1, baseMapper.selectCount(null)); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java index f78a1f5f..66b5b4d2 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitResourceTemplateUtil.java @@ -31,11 +31,12 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public class KitResourceTemplateUtil { - public static String render(String moduleName, String filename, Dict params) { - String path = StrUtil.isBlank(moduleName) ? "template" : "template/" + moduleName; - TemplateEngine engine = - TemplateUtil.createEngine(new TemplateConfig(path, TemplateConfig.ResourceMode.CLASSPATH)); - Template template = engine.getTemplate(filename); - return template.render(params); - } + + public static String render(String moduleName, String filename, Dict params) { + String path = StrUtil.isBlank(moduleName) ? "template" : "template/" + moduleName; + TemplateEngine engine = + TemplateUtil.createEngine(new TemplateConfig(path, TemplateConfig.ResourceMode.CLASSPATH)); + Template template = engine.getTemplate(filename); + return template.render(params); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java index 56b46ec3..73dfaaef 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitReturnValueHandleUtil.java @@ -30,41 +30,42 @@ import org.aspectj.lang.reflect.MethodSignature; * @date 2025-05-08 */ public class KitReturnValueHandleUtil { - public static Object getDefaultValue(ProceedingJoinPoint joinPoint) { - MethodSignature signature = (MethodSignature)joinPoint.getSignature(); - Method method = signature.getMethod(); - // 获取目标方法的返回值类型 - Class returnType = method.getReturnType(); - if (returnType.isArray()) { - return getEmptyArray(returnType); - } else if (List.class.isAssignableFrom(returnType)) { - return Collections.emptyList(); - } else if (Set.class.isAssignableFrom(returnType)) { - return Collections.emptySet(); - } else if (Collection.class.isAssignableFrom(returnType)) { - // 默认返回空 List - return Collections.emptyList(); - } else { - // 普通对象返回 null - return null; - } - } - /** - * 根据数组类型返回空数组 - */ - private static Object getEmptyArray(Class arrayType) { - if (arrayType == int[].class) { - return new int[0]; - } else if (arrayType == long[].class) { - return new long[0]; - } else if (arrayType == double[].class) { - return new double[0]; - } else if (arrayType == String[].class) { - return new String[0]; - } else { - // 其他引用类型数组 - return java.lang.reflect.Array.newInstance(arrayType.getComponentType(), 0); - } + public static Object getDefaultValue(ProceedingJoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + // 获取目标方法的返回值类型 + Class returnType = method.getReturnType(); + if (returnType.isArray()) { + return getEmptyArray(returnType); + } else if (List.class.isAssignableFrom(returnType)) { + return Collections.emptyList(); + } else if (Set.class.isAssignableFrom(returnType)) { + return Collections.emptySet(); + } else if (Collection.class.isAssignableFrom(returnType)) { + // 默认返回空 List + return Collections.emptyList(); + } else { + // 普通对象返回 null + return null; } + } + + /** + * 根据数组类型返回空数组 + */ + private static Object getEmptyArray(Class arrayType) { + if (arrayType == int[].class) { + return new int[0]; + } else if (arrayType == long[].class) { + return new long[0]; + } else if (arrayType == double[].class) { + return new double[0]; + } else if (arrayType == String[].class) { + return new String[0]; + } else { + // 其他引用类型数组 + return java.lang.reflect.Array.newInstance(arrayType.getComponentType(), 0); + } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java index 4d742de3..ce715058 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitRsaEncryptUtil.java @@ -35,181 +35,183 @@ import org.apache.commons.codec.binary.Base64; */ @UtilityClass public final class KitRsaEncryptUtil { - private static final String SRC = "123456"; - public static void main(String[] args) throws Exception { - System.out.println("\n"); - RsaKeyPair keyPair = generateKeyPair(); - System.out.println("公钥:" + keyPair.getPublicKey()); - System.out.println("私钥:" + keyPair.getPrivateKey()); - System.out.println("\n"); - test1(keyPair); - System.out.println("\n"); - test2(keyPair); - System.out.println("\n"); + private static final String SRC = "123456"; + + public static void main(String[] args) throws Exception { + System.out.println("\n"); + RsaKeyPair keyPair = generateKeyPair(); + System.out.println("公钥:" + keyPair.getPublicKey()); + System.out.println("私钥:" + keyPair.getPrivateKey()); + System.out.println("\n"); + test1(keyPair); + System.out.println("\n"); + test2(keyPair); + System.out.println("\n"); + } + + /** + * 公钥加密私钥解密 + */ + private static void test1(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 公钥加密私钥解密开始 *****************"); + String text1 = encryptByPublicKey(keyPair.getPublicKey(), KitRsaEncryptUtil.SRC); + String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1); + System.out.println("加密前:" + KitRsaEncryptUtil.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (KitRsaEncryptUtil.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致, 解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 公钥加密私钥解密结束 *****************"); + } + + /** + * 私钥加密公钥解密 + * + * @throws Exception / + */ + private static void test2(RsaKeyPair keyPair) throws Exception { + System.out.println("***************** 私钥加密公钥解密开始 *****************"); + String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), KitRsaEncryptUtil.SRC); + String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1); + System.out.println("加密前:" + KitRsaEncryptUtil.SRC); + System.out.println("加密后:" + text1); + System.out.println("解密后:" + text2); + if (KitRsaEncryptUtil.SRC.equals(text2)) { + System.out.println("解密字符串和原始字符串一致,解密成功"); + } else { + System.out.println("解密字符串和原始字符串不一致,解密失败"); + } + System.out.println("***************** 私钥加密公钥解密结束 *****************"); + } + + /** + * 公钥解密 + * + * @param publicKeyText 公钥 + * @param text 待解密的信息 + * @return / + * @throws Exception / + */ + public static String decryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + byte[] result = doLongerCipherFinal(Cipher.DECRYPT_MODE, cipher, Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 私钥加密 + * + * @param privateKeyText 私钥 + * @param text 待加密的信息 + * @return / + * @throws Exception / + */ + public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + byte[] result = doLongerCipherFinal(Cipher.ENCRYPT_MODE, cipher, text.getBytes()); + return Base64.encodeBase64String(result); + } + + /** + * 私钥解密 + * + * @param privateKeyText 私钥 + * @param text 待解密的文本 + * @return / + * @throws Exception / + */ + public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] result = doLongerCipherFinal(Cipher.DECRYPT_MODE, cipher, Base64.decodeBase64(text)); + return new String(result); + } + + /** + * 公钥加密 + * + * @param publicKeyText 公钥 + * @param text 待加密的文本 + * @return / + */ + public static String encryptByPublicKey(String publicKeyText, String text) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] result = doLongerCipherFinal(Cipher.ENCRYPT_MODE, cipher, text.getBytes()); + return Base64.encodeBase64String(result); + } + + private static byte[] doLongerCipherFinal(int opMode, Cipher cipher, byte[] source) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + if (opMode == Cipher.DECRYPT_MODE) { + out.write(cipher.doFinal(source)); + } else { + int offset = 0; + int totalSize = source.length; + while (totalSize - offset > 0) { + int size = Math.min(cipher.getOutputSize(0) - 11, totalSize - offset); + out.write(cipher.doFinal(source, offset, size)); + offset += size; + } + } + out.close(); + return out.toByteArray(); + } + + /** + * 构建RSA密钥对 + * + * @return / + * @throws NoSuchAlgorithmException / + */ + public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + keyPairGenerator.initialize(1024); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); + String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); + String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); + return new RsaKeyPair(publicKeyString, privateKeyString); + } + + /** + * RSA密钥对对象 + */ + public static class RsaKeyPair { + + private final String publicKey; + private final String privateKey; + + public RsaKeyPair(String publicKey, String privateKey) { + this.publicKey = publicKey; + this.privateKey = privateKey; } - /** - * 公钥加密私钥解密 - */ - private static void test1(RsaKeyPair keyPair) throws Exception { - System.out.println("***************** 公钥加密私钥解密开始 *****************"); - String text1 = encryptByPublicKey(keyPair.getPublicKey(), KitRsaEncryptUtil.SRC); - String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1); - System.out.println("加密前:" + KitRsaEncryptUtil.SRC); - System.out.println("加密后:" + text1); - System.out.println("解密后:" + text2); - if (KitRsaEncryptUtil.SRC.equals(text2)) { - System.out.println("解密字符串和原始字符串一致, 解密成功"); - } else { - System.out.println("解密字符串和原始字符串不一致,解密失败"); - } - System.out.println("***************** 公钥加密私钥解密结束 *****************"); + public String getPublicKey() { + return publicKey; } - /** - * 私钥加密公钥解密 - * - * @throws Exception / - */ - private static void test2(RsaKeyPair keyPair) throws Exception { - System.out.println("***************** 私钥加密公钥解密开始 *****************"); - String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), KitRsaEncryptUtil.SRC); - String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1); - System.out.println("加密前:" + KitRsaEncryptUtil.SRC); - System.out.println("加密后:" + text1); - System.out.println("解密后:" + text2); - if (KitRsaEncryptUtil.SRC.equals(text2)) { - System.out.println("解密字符串和原始字符串一致,解密成功"); - } else { - System.out.println("解密字符串和原始字符串不一致,解密失败"); - } - System.out.println("***************** 私钥加密公钥解密结束 *****************"); - } - - /** - * 公钥解密 - * - * @param publicKeyText 公钥 - * @param text 待解密的信息 - * @return / - * @throws Exception / - */ - public static String decryptByPublicKey(String publicKeyText, String text) throws Exception { - X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.DECRYPT_MODE, publicKey); - byte[] result = doLongerCipherFinal(Cipher.DECRYPT_MODE, cipher, Base64.decodeBase64(text)); - return new String(result); - } - - /** - * 私钥加密 - * - * @param privateKeyText 私钥 - * @param text 待加密的信息 - * @return / - * @throws Exception / - */ - public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception { - PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, privateKey); - byte[] result = doLongerCipherFinal(Cipher.ENCRYPT_MODE, cipher, text.getBytes()); - return Base64.encodeBase64String(result); - } - - /** - * 私钥解密 - * - * @param privateKeyText 私钥 - * @param text 待解密的文本 - * @return / - * @throws Exception / - */ - public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception { - PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText)); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] result = doLongerCipherFinal(Cipher.DECRYPT_MODE, cipher, Base64.decodeBase64(text)); - return new String(result); - } - - /** - * 公钥加密 - * - * @param publicKeyText 公钥 - * @param text 待加密的文本 - * @return / - */ - public static String encryptByPublicKey(String publicKeyText, String text) throws Exception { - X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText)); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); - Cipher cipher = Cipher.getInstance("RSA"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] result = doLongerCipherFinal(Cipher.ENCRYPT_MODE, cipher, text.getBytes()); - return Base64.encodeBase64String(result); - } - - private static byte[] doLongerCipherFinal(int opMode, Cipher cipher, byte[] source) throws Exception { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - if (opMode == Cipher.DECRYPT_MODE) { - out.write(cipher.doFinal(source)); - } else { - int offset = 0; - int totalSize = source.length; - while (totalSize - offset > 0) { - int size = Math.min(cipher.getOutputSize(0) - 11, totalSize - offset); - out.write(cipher.doFinal(source, offset, size)); - offset += size; - } - } - out.close(); - return out.toByteArray(); - } - - /** - * 构建RSA密钥对 - * - * @return / - * @throws NoSuchAlgorithmException / - */ - public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException { - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); - keyPairGenerator.initialize(1024); - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic(); - RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate(); - String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); - String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); - return new RsaKeyPair(publicKeyString, privateKeyString); - } - - /** - * RSA密钥对对象 - */ - public static class RsaKeyPair { - private final String publicKey; - private final String privateKey; - - public RsaKeyPair(String publicKey, String privateKey) { - this.publicKey = publicKey; - this.privateKey = privateKey; - } - - public String getPublicKey() { - return publicKey; - } - - public String getPrivateKey() { - return privateKey; - } + public String getPrivateKey() { + return privateKey; } + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java index 27d3580c..059cbd47 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitStringUtil.java @@ -26,92 +26,90 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @UtilityClass public final class KitStringUtil { - private static final char SEPARATOR = '_'; - /** - * 驼峰命名法工具 - * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" - * toUnderScoreCase("helloWorld") = "hello_world" - */ - public static String toCamelCase(String s) { - if (s == null) { - return null; - } - s = s.toLowerCase(); - StringBuilder sb = new StringBuilder(s.length()); - boolean upperCase = false; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == SEPARATOR) { - upperCase = true; - } else if (upperCase) { - sb.append(Character.toUpperCase(c)); - upperCase = false; - } else { - sb.append(c); - } - } - return sb.toString(); - } + private static final char SEPARATOR = '_'; - /** - * 驼峰命名法工具 - * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" - * toUnderScoreCase("helloWorld") = "hello_world" - */ - public static String toCapitalizeCamelCase(String s) { - if (s == null) { - return null; - } - s = toCamelCase(s); - return s.substring(0, 1).toUpperCase() + s.substring(1); + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } - /** - * 驼峰命名法工具 - * - * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" - * toUnderScoreCase("helloWorld") = "hello_world" - */ - public static String toUnderScoreCase(String s) { - if (s == null) { - return null; - } - StringBuilder sb = new StringBuilder(); - boolean upperCase = false; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - boolean nextUpperCase = true; - if (i < (s.length() - 1)) { - nextUpperCase = Character.isUpperCase(s.charAt(i + 1)); - } - if ((i > 0) && Character.isUpperCase(c)) { - if (!upperCase || !nextUpperCase) { - sb.append(SEPARATOR); - } - upperCase = true; - } else { - upperCase = false; - } - sb.append(Character.toLowerCase(c)); - } - return sb.toString(); + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + */ + public static String toCapitalizeCamelCase(String s) { + if (s == null) { + return null; } + s = toCamelCase(s); + return s.substring(0, 1).toUpperCase() + s.substring(1); + } - /** - * 获得当天是周几 - */ - public static String getWeekDay() { - // String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; - String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"}; - Calendar cal = Calendar.getInstance(); - cal.setTime(new Date()); - int w = cal.get(Calendar.DAY_OF_WEEK) - 1; - if (w < 0) { - w = 0; - } - return weekDays[w]; + /** + * 驼峰命名法工具 + * + * @return toCamelCase(" hello_world ") == "helloWorld" toCapitalizeCamelCase("hello_world") == "HelloWorld" toUnderScoreCase("helloWorld") = "hello_world" + */ + public static String toUnderScoreCase(String s) { + if (s == null) { + return null; } + StringBuilder sb = new StringBuilder(); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + boolean nextUpperCase = true; + if (i < (s.length() - 1)) { + nextUpperCase = Character.isUpperCase(s.charAt(i + 1)); + } + if ((i > 0) && Character.isUpperCase(c)) { + if (!upperCase || !nextUpperCase) { + sb.append(SEPARATOR); + } + upperCase = true; + } else { + upperCase = false; + } + sb.append(Character.toLowerCase(c)); + } + return sb.toString(); + } + + /** + * 获得当天是周几 + */ + public static String getWeekDay() { + // String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitSystemUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitSystemUtil.java index 3e955496..fd967556 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitSystemUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitSystemUtil.java @@ -25,16 +25,17 @@ import oshi.hardware.CentralProcessor; * @date 2025-08-11 */ public class KitSystemUtil { - public static int getCpuCount() { - SystemInfo systemInfo = new SystemInfo(); - CentralProcessor processor = systemInfo.getHardware().getProcessor(); - return processor.getPhysicalProcessorCount(); - } - /** - * 获取当前系统的用户名 - */ - public static String getCurrentUserName() { - return System.getProperty("user.name"); - } + public static int getCpuCount() { + SystemInfo systemInfo = new SystemInfo(); + CentralProcessor processor = systemInfo.getHardware().getProcessor(); + return processor.getPhysicalProcessorCount(); + } + + /** + * 获取当前系统的用户名 + */ + public static String getCurrentUserName() { + return System.getProperty("user.name"); + } } diff --git a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java index fd1a9f10..ee7a8949 100644 --- a/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java +++ b/cutejava/cutejava-framework/src/main/java/cn/odboy/util/KitValidUtil.java @@ -33,19 +33,20 @@ import lombok.experimental.UtilityClass; */ @UtilityClass public final class KitValidUtil { - private static final Validator VALIDATOR; - static { - try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { - VALIDATOR = factory.getValidator(); - } - } + private static final Validator VALIDATOR; - public static void validate(T object) { - Set> violations = VALIDATOR.validate(object, Default.class); - if (!violations.isEmpty()) { - throw new BadRequestException( - violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(","))); - } + static { + try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + VALIDATOR = factory.getValidator(); } + } + + public static void validate(T object) { + Set> violations = VALIDATOR.validate(object, Default.class); + if (!violations.isEmpty()) { + throw new BadRequestException( + violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(","))); + } + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/pom.xml b/cutejava/cutejava-module-system/pom.xml index 1a7f874a..9f72f3fe 100644 --- a/cutejava/cutejava-module-system/pom.xml +++ b/cutejava/cutejava-module-system/pom.xml @@ -1,25 +1,25 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - cutejava-module-system - 核心模块 - - - cn.odboy - cutejava-framework - 1.4.1 - - - - io.minio - minio - 8.5.17 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-module-system + 核心模块 + + + cn.odboy + cutejava-framework + 1.4.1 + + + + io.minio + minio + 8.5.17 + + diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java index a25b865a..a33a1c11 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemCaptchaBizEnum.java @@ -24,37 +24,37 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum SystemCaptchaBizEnum { - /* 通过手机号码重置邮箱 */ - PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", - "通过手机号码重置邮箱"), /* 通过旧邮箱重置邮箱 */ - EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", "通过旧邮箱重置邮箱"), - /* 通过手机号码重置密码 */ - PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过手机号码重置密码"), - /* 通过邮箱重置密码 */ - EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过邮箱重置密码"); - /** - * 业务编码 - */ - private final String bizCode; - /** - * redis中的key - */ - private final String redisKey; - /** - * resources文件夹,template中的模版名称 - */ - private final String templateName; - /** - * 业务描述 - */ - private final String description; + /* 通过手机号码重置邮箱 */ + PHONE_RESET_EMAIL_CODE("10000", "phone_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", + "通过手机号码重置邮箱"), /* 通过旧邮箱重置邮箱 */ + EMAIL_RESET_EMAIL_CODE("10001", "email_reset_email_code_", "SystemEmailCaptchaTemplate.ftl", "通过旧邮箱重置邮箱"), + /* 通过手机号码重置密码 */ + PHONE_RESET_PWD_CODE("10002", "phone_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过手机号码重置密码"), + /* 通过邮箱重置密码 */ + EMAIL_RESET_PWD_CODE("10003", "email_reset_pwd_code_", "SystemEmailCaptchaTemplate.ftl", "通过邮箱重置密码"); + /** + * 业务编码 + */ + private final String bizCode; + /** + * redis中的key + */ + private final String redisKey; + /** + * resources文件夹,template中的模版名称 + */ + private final String templateName; + /** + * 业务描述 + */ + private final String description; - public static SystemCaptchaBizEnum getByBizCode(String bizCode) { - for (SystemCaptchaBizEnum value : SystemCaptchaBizEnum.values()) { - if (value.getBizCode().equals(bizCode)) { - return value; - } - } - return null; + public static SystemCaptchaBizEnum getByBizCode(String bizCode) { + for (SystemCaptchaBizEnum value : SystemCaptchaBizEnum.values()) { + if (value.getBizCode().equals(bizCode)) { + return value; + } } + return null; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java index 7d9dc29e..4bdff0d0 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/SystemDataScopeEnum.java @@ -24,19 +24,19 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum SystemDataScopeEnum { - /* 全部的数据权限 */ - ALL("全部", "全部的数据权限"), /* 自己部门的数据权限 */ - THIS_LEVEL("本级", "自己部门的数据权限"), /* 自定义的数据权限 */ - CUSTOMIZE("自定义", "自定义的数据权限"); - private final String value; - private final String description; + /* 全部的数据权限 */ + ALL("全部", "全部的数据权限"), /* 自己部门的数据权限 */ + THIS_LEVEL("本级", "自己部门的数据权限"), /* 自定义的数据权限 */ + CUSTOMIZE("自定义", "自定义的数据权限"); + private final String value; + private final String description; - public static SystemDataScopeEnum find(String val) { - for (SystemDataScopeEnum dataScopeEnum : SystemDataScopeEnum.values()) { - if (dataScopeEnum.getValue().equals(val)) { - return dataScopeEnum; - } - } - return null; + public static SystemDataScopeEnum find(String val) { + for (SystemDataScopeEnum dataScopeEnum : SystemDataScopeEnum.values()) { + if (dataScopeEnum.getValue().equals(val)) { + return dataScopeEnum; + } } + return null; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java index 607247a3..e6b3e168 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/constant/TransferProtocolConst.java @@ -16,7 +16,8 @@ package cn.odboy.system.constant; public interface TransferProtocolConst { - String PREFIX_HTTP = "http://"; - String PREFIX_HTTPS = "https://"; - String PREFIX_HTTPS_BAD_REQUEST = "外链必须以http://或者https://开头"; + + String PREFIX_HTTP = "http://"; + String PREFIX_HTTPS = "https://"; + String PREFIX_HTTPS_BAD_REQUEST = "外链必须以http://或者https://开头"; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java index 16800d1d..2afa6062 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemAuthController.java @@ -29,7 +29,7 @@ import cn.odboy.system.dal.model.SystemUserJwtVo; import cn.odboy.system.dal.model.SystemUserLoginArgs; import cn.odboy.system.dal.redis.SystemCacheKey; import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.framework.permission.core.handler.TokenProvider; import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler; import cn.odboy.util.KitRsaEncryptUtil; @@ -61,92 +61,99 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/auth") @Api(tags = "系统:系统授权接口") public class SystemAuthController { - @Autowired private KitRedisHelper redisHelper; - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired private TokenProvider tokenProvider; - @Autowired private AppProperties properties; - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private UserDetailsHandler userDetailsService; - @ApiOperation("登录授权") - @AnonymousPostMapping(value = "/login") - public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, - HttpServletRequest request) throws Exception { - // 密码解密 - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); - // 查询验证码 - String code = redisHelper.get(loginRequest.getUuid(), String.class); - // 清除验证码 - redisHelper.del(loginRequest.getUuid()); - if (StrUtil.isBlank(code)) { - throw new BadRequestException("验证码不存在或已过期"); - } - if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { - throw new BadRequestException("验证码错误"); - } - // 获取用户信息 - SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); - // 验证用户密码 - if (!passwordEncoder.matches(password, jwtUser.getPassword())) { - throw new BadRequestException("登录密码错误"); - } - Authentication authentication = - new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - // 生成令牌 - String token = tokenProvider.createToken(jwtUser); - // 返回 token 与 用户信息 - Map authInfo = new HashMap<>(2) {{ - put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); - put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); - }}; - if (properties.getLogin().isSingle()) { - // 踢掉之前已经登录的token - systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); - } - // 保存在线信息 - systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); - // 返回登录信息 - return ResponseEntity.ok(authInfo); - } + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private TokenProvider tokenProvider; + @Autowired + private AppProperties properties; + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private UserDetailsHandler userDetailsService; - @ApiOperation("获取用户信息") - @PostMapping(value = "/info") - public ResponseEntity getUserInfo() { - SystemUserJwtVo jwtUser = (SystemUserJwtVo)CsSecurityHelper.getCurrentUser(); - SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); - return ResponseEntity.ok(userInfoVo); + @ApiOperation("登录授权") + @AnonymousPostMapping(value = "/login") + public ResponseEntity> login(@Validated @RequestBody SystemUserLoginArgs loginRequest, + HttpServletRequest request) throws Exception { + // 密码解密 + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), loginRequest.getPassword()); + // 查询验证码 + String code = redisHelper.get(loginRequest.getUuid(), String.class); + // 清除验证码 + redisHelper.del(loginRequest.getUuid()); + if (StrUtil.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); } + if (StrUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) { + throw new BadRequestException("验证码错误"); + } + // 获取用户信息 + SystemUserJwtVo jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername()); + // 验证用户密码 + if (!passwordEncoder.matches(password, jwtUser.getPassword())) { + throw new BadRequestException("登录密码错误"); + } + Authentication authentication = + new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map authInfo = new HashMap<>(2) {{ + put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token)); + put("user", BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class)); + }}; + if (properties.getLogin().isSingle()) { + // 踢掉之前已经登录的token + systemUserOnlineInfoDAO.kickOutByUsername(loginRequest.getUsername()); + } + // 保存在线信息 + systemUserOnlineInfoDAO.saveUserJwtModelByToken(jwtUser, token, request); + // 返回登录信息 + return ResponseEntity.ok(authInfo); + } - @ApiOperation("获取验证码") - @AnonymousPostMapping(value = "/captcha/getImage") - public ResponseEntity> getCode() { - // 获取运算的结果 - Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); - String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); - //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 - String captchaValue = captcha.text(); - if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && - captchaValue.contains(SystemConst.SYMBOL_DOT)) { - captchaValue = captchaValue.split("\\.")[0]; - } - // 保存 - redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), - TimeUnit.MINUTES); - // 验证码信息 - Map imgResult = new HashMap(2) {{ - put("img", captcha.toBase64()); - put("uuid", uuid); - }}; - return ResponseEntity.ok(imgResult); - } + @ApiOperation("获取用户信息") + @PostMapping(value = "/info") + public ResponseEntity getUserInfo() { + SystemUserJwtVo jwtUser = (SystemUserJwtVo) KitSecurityHelper.getCurrentUser(); + SystemUserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, SystemUserInfoVo.class); + return ResponseEntity.ok(userInfoVo); + } - @ApiOperation("退出登录") - @AnonymousPostMapping(value = "/logout") - public ResponseEntity logout(HttpServletRequest request) { - String token = tokenProvider.getToken(request); - systemUserOnlineInfoDAO.logoutByToken(token); - return ResponseEntity.ok(null); + @ApiOperation("获取验证码") + @AnonymousPostMapping(value = "/captcha/getImage") + public ResponseEntity> getCode() { + // 获取运算的结果 + Captcha captcha = properties.getLogin().getCaptchaSetting().getCaptcha(); + String uuid = SystemCacheKey.CAPTCHA_LOGIN + IdUtil.simpleUUID(); + //当验证码类型为 arithmetic时且长度 >= 2 时, captcha.text()的结果有几率为浮点型 + String captchaValue = captcha.text(); + if (captcha.getCharType() - 1 == CaptchaCodeEnum.ARITHMETIC.ordinal() && + captchaValue.contains(SystemConst.SYMBOL_DOT)) { + captchaValue = captchaValue.split("\\.")[0]; } + // 保存 + redisHelper.set(uuid, captchaValue, properties.getLogin().getCaptchaSetting().getExpiration(), + TimeUnit.MINUTES); + // 验证码信息 + Map imgResult = new HashMap(2) {{ + put("img", captcha.toBase64()); + put("uuid", uuid); + }}; + return ResponseEntity.ok(imgResult); + } + + @ApiOperation("退出登录") + @AnonymousPostMapping(value = "/logout") + public ResponseEntity logout(HttpServletRequest request) { + String token = tokenProvider.getToken(request); + systemUserOnlineInfoDAO.logoutByToken(token); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java index 3a276fd7..46a22b1f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemCaptchaController.java @@ -34,30 +34,32 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/captcha") @Api(tags = "系统:验证码管理") public class SystemCaptchaController { - @Autowired private SystemEmailService systemEmailService; - @ApiOperation("重置邮箱, 发送验证码") - @PostMapping(value = "/sendResetEmailCaptcha") - public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); - return ResponseEntity.ok(null); - } + @Autowired + private SystemEmailService systemEmailService; - @ApiOperation("重置密码,发送验证码") - @PostMapping(value = "/sendResetPasswordCaptcha") - public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { - systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); - return ResponseEntity.ok(null); - } + @ApiOperation("重置邮箱, 发送验证码") + @PostMapping(value = "/sendResetEmailCaptcha") + public ResponseEntity sendResetEmailCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, email); + return ResponseEntity.ok(null); + } - @ApiOperation("验证码验证") - @PostMapping(value = "/checkEmailCaptcha") - public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { - SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); - if (biEnum == null) { - throw new BadRequestException("不支持的业务"); - } - systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); - return ResponseEntity.ok(null); + @ApiOperation("重置密码,发送验证码") + @PostMapping(value = "/sendResetPasswordCaptcha") + public ResponseEntity sendResetPasswordCaptcha(@RequestParam String email) { + systemEmailService.sendCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_PWD_CODE, email); + return ResponseEntity.ok(null); + } + + @ApiOperation("验证码验证") + @PostMapping(value = "/checkEmailCaptcha") + public ResponseEntity checkEmailCaptcha(@Validated @RequestBody SystemCheckEmailCaptchaArgs args) { + SystemCaptchaBizEnum biEnum = SystemCaptchaBizEnum.getByBizCode(args.getBizCode()); + if (biEnum == null) { + throw new BadRequestException("不支持的业务"); } + systemEmailService.checkEmailCaptcha(biEnum, args.getEmail(), args.getCode()); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java index 274f102f..0df7c6ff 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemComponentController.java @@ -29,19 +29,21 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:组件数据源") @RequestMapping("/api/component") public class SystemComponentController { - @Autowired private SystemDeptService systemDeptService; - @ApiOperation("查询部门下拉选择数据源") - @PostMapping(value = "/queryDeptSelectDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); - } + @Autowired + private SystemDeptService systemDeptService; - @ApiOperation("查询部门下拉选择Pro数据源") - @PostMapping(value = "/queryDeptSelectProDataSource") - @PreAuthorize("@el.check()") - public ResponseEntity queryDeptSelectProDataSource() { - return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); - } + @ApiOperation("查询部门下拉选择数据源") + @PostMapping(value = "/queryDeptSelectDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectDataSource()); + } + + @ApiOperation("查询部门下拉选择Pro数据源") + @PostMapping(value = "/queryDeptSelectProDataSource") + @PreAuthorize("@el.check()") + public ResponseEntity queryDeptSelectProDataSource() { + return ResponseEntity.ok(systemDeptService.queryDeptSelectProDataSource()); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java index 69abb618..08ff6145 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDeptController.java @@ -24,11 +24,8 @@ import cn.odboy.system.service.SystemDeptService; import cn.odboy.util.KitPageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -45,75 +42,60 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:部门管理") @RequestMapping("/api/dept") public class SystemDeptController { - @Autowired private SystemDeptService systemDeptService; - @ApiOperation("导出部门数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dept:list')") - public void exportDept(HttpServletResponse response, SystemQueryDeptArgs criteria) throws Exception { - systemDeptService.exportDeptExcel(systemDeptService.queryAllDept(criteria, false), response); - } + @Autowired + private SystemDeptService systemDeptService; - @ApiOperation("查询部门") - @PostMapping - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDept( - @Validated @RequestBody KitPageArgs args) throws Exception { - SystemQueryDeptArgs criteria = args.getArgs(); - List depts = systemDeptService.queryAllDept(criteria, true); - return ResponseEntity.ok(KitPageUtil.toPage(depts)); - } + @ApiOperation("导出部门数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dept:list')") + public void exportDept(HttpServletResponse response, SystemQueryDeptArgs args) throws Exception { + systemDeptService.exportDeptExcel(systemDeptService.queryAllDeptByArgs(args, false), response); + } - @ApiOperation("查询部门:根据ID获取同级与上级数据") - @PostMapping("/queryDeptSuperiorTree") - @PreAuthorize("@el.check('user:list','dept:list')") - public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, - @RequestParam(defaultValue = "false") Boolean exclude) { - Set deptSet = new LinkedHashSet<>(); - for (Long id : ids) { - // 同级数据 - SystemDeptTb dept = systemDeptService.getDeptById(id); - // 上级数据 - List depts = systemDeptService.querySuperiorDeptListByPid(dept, new ArrayList<>()); - if (exclude) { - for (SystemDeptTb data : depts) { - if (data.getId().equals(dept.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); - } - deptSet.addAll(depts); - } - return ResponseEntity.ok(systemDeptService.buildDeptTree(new ArrayList<>(deptSet))); - } + @ApiOperation("查询部门") + @PostMapping + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDept( + @Validated @RequestBody KitPageArgs pageArgs) throws Exception { + SystemQueryDeptArgs args = pageArgs.getArgs(); + List depts = systemDeptService.queryAllDeptByArgs(args, true); + return ResponseEntity.ok(KitPageUtil.toPage(depts)); + } - @ApiOperation("新增部门") - @PostMapping(value = "/saveDept") - @PreAuthorize("@el.check('dept:add')") - public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { - systemDeptService.saveDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询部门:根据ID获取同级与上级数据") + @PostMapping("/queryDeptSuperiorTree") + @PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity> queryDeptSuperiorTree(@RequestBody List ids, + @RequestParam(defaultValue = "false") Boolean exclude) { + return ResponseEntity.ok(systemDeptService.searchDeptTree(ids, exclude)); + } - @ApiOperation("修改部门") - @PostMapping(value = "/modifyDept") - @PreAuthorize("@el.check('dept:edit')") - public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { - systemDeptService.updateDept(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增部门") + @PostMapping(value = "/saveDept") + @PreAuthorize("@el.check('dept:add')") + public ResponseEntity saveDept(@Validated @RequestBody SystemCreateDeptArgs args) { + systemDeptService.saveDept(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除部门") - @PostMapping(value = "/removeDeptByIds") - @PreAuthorize("@el.check('dept:del')") - public ResponseEntity removeDeptByIds(@RequestBody Set ids) { - // 获取部门, 和其所有子部门 - Set depts = systemDeptService.traverseDeptByIdWithPids(ids); - // 验证是否被角色或用户关联 - systemDeptService.verifyBindRelationByIds(depts); - systemDeptService.removeDeptByIds(depts); - return ResponseEntity.ok(null); - } + @ApiOperation("修改部门") + @PostMapping(value = "/modifyDept") + @PreAuthorize("@el.check('dept:edit')") + public ResponseEntity modifyDept(@Validated(SystemDeptTb.Update.class) @RequestBody SystemDeptTb args) { + systemDeptService.updateDept(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除部门") + @PostMapping(value = "/removeDeptByIds") + @PreAuthorize("@el.check('dept:del')") + public ResponseEntity removeDeptByIds(@RequestBody Set ids) { + // 获取部门, 和其所有子部门 + Set depts = systemDeptService.traverseDeptByIdWithPids(ids); + // 验证是否被角色或用户关联 + systemDeptService.verifyBindRelationByIds(depts); + systemDeptService.deleteDeptByIds(depts); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java index 9fd5704c..c8698ab0 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictController.java @@ -42,58 +42,55 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:字典管理") @RequestMapping("/api/dict") public class SystemDictController { - @Autowired private SystemDictService systemDictService; - @ApiOperation("导出字典数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('dict:list')") - public void exportDict(HttpServletResponse response, SystemQueryDictArgs criteria) throws IOException { - systemDictService.exportDictExcel(systemDictService.queryDictByArgs(criteria), response); - } + @Autowired + private SystemDictService systemDictService; - @ApiOperation("查询字典") - @PostMapping(value = "/queryAllDict") - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryAllDict() { - return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); - } + @ApiOperation("导出字典数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('dict:list')") + public void exportDict(HttpServletResponse response, SystemQueryDictArgs args) throws IOException { + systemDictService.exportDictExcel(systemDictService.queryDictByArgs(args), response); + } - @ApiOperation("查询字典") - @PostMapping - @PreAuthorize("@el.check('dict:list')") - public ResponseEntity> queryDictByArgs( - @Validated @RequestBody KitPageArgs args) { - Page page; - SystemQueryDictArgs criteria = args.getArgs(); - if (args.getSize() != null) { - page = new Page<>(args.getPage(), args.getSize()); - } else { - page = new Page<>(criteria.getPage(), criteria.getSize()); - } - return ResponseEntity.ok(systemDictService.queryDictByArgs(criteria, page)); - } + @ApiOperation("查询字典") + @PostMapping(value = "/queryAllDict") + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryAllDict() { + return ResponseEntity.ok(systemDictService.queryDictByArgs(new SystemQueryDictArgs())); + } - @ApiOperation("新增字典") - @PostMapping(value = "/saveDict") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { - systemDictService.saveDict(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询字典") + @PostMapping + @PreAuthorize("@el.check('dict:list')") + public ResponseEntity> queryDictByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + SystemQueryDictArgs args = pageArgs.getArgs(); + return ResponseEntity.ok(systemDictService.searchDict(args, page)); + } - @ApiOperation("修改字典") - @PostMapping(value = "/modifyDictById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { - systemDictService.modifyDictById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典") + @PostMapping(value = "/saveDict") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDict(@Validated @RequestBody SystemCreateDictArgs args) { + systemDictService.saveDict(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除字典") - @PostMapping(value = "/removeDictByIds") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictByIds(@RequestBody Set ids) { - systemDictService.removeDictByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典") + @PostMapping(value = "/modifyDictById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictById(@Validated(SystemDictTb.Update.class) @RequestBody SystemDictTb args) { + systemDictService.updateDictById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除字典") + @PostMapping(value = "/removeDictByIds") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictByIds(@RequestBody Set ids) { + systemDictService.deleteDictByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java index 9c4da8f8..8f46e722 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemDictDetailController.java @@ -19,6 +19,7 @@ import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.model.SystemCreateDictDetailArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.service.SystemDictDetailService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -42,57 +43,59 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:字典详情管理") @RequestMapping("/api/dictDetail") public class SystemDictDetailController { - @Autowired private SystemDictDetailService systemDictDetailService; - @ApiOperation("查询字典详情") - @PostMapping - public ResponseEntity> queryDictDetailByCrud( - @Validated @RequestBody KitPageArgs args) { - return queryDictDetailByArgs(args); - } + @Autowired + private SystemDictDetailService systemDictDetailService; - @ApiOperation("查询字典详情") - @PostMapping(value = "/queryDictDetailByArgs") - public ResponseEntity> queryDictDetailByArgs( - @Validated @RequestBody KitPageArgs args) { - SystemQueryDictDetailArgs criteria = args.getArgs(); - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemDictDetailService.queryDictDetailByArgs(criteria, page)); - } + @ApiOperation("查询字典详情") + @PostMapping + public ResponseEntity> queryDictDetailByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryDictDetailByArgs(args); + } - @ApiOperation("查询多个字典详情") - @GetMapping(value = "/getDictDetailMaps") - public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { - String[] names = dictName.split("[,, ]"); - Map> dictMap = new HashMap<>(16); - for (String name : names) { - dictMap.put(name, systemDictDetailService.queryDictDetailByName(name)); - } - return ResponseEntity.ok(dictMap); - } + @ApiOperation("查询字典详情") + @PostMapping(value = "/queryDictDetailByArgs") + public ResponseEntity> queryDictDetailByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryDictDetailArgs args = pageArgs.getArgs(); + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + return ResponseEntity.ok(systemDictDetailService.searchDictDetail(args, page)); + } - @ApiOperation("新增字典详情") - @PostMapping(value = "/saveDictDetail") - @PreAuthorize("@el.check('dict:add')") - public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { - systemDictDetailService.saveDictDetail(args); - return ResponseEntity.ok(null); + @ApiOperation("查询多个字典详情") + @GetMapping(value = "/getDictDetailMaps") + public ResponseEntity>> getDictDetailMaps(@RequestParam String dictName) { + String[] names = dictName.split("[,, ]"); + Map> dictMap = new HashMap<>(16); + for (String name : names) { + dictMap.put(name, systemDictDetailService.listDictDetailByName(name)); } + return ResponseEntity.ok(dictMap); + } - @ApiOperation("修改字典详情") - @PostMapping(value = "/modifyDictDetailById") - @PreAuthorize("@el.check('dict:edit')") - public ResponseEntity modifyDictDetailById( - @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { - systemDictDetailService.modifyDictDetailById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增字典详情") + @PostMapping(value = "/saveDictDetail") + @PreAuthorize("@el.check('dict:add')") + public ResponseEntity saveDictDetail(@Validated @RequestBody SystemCreateDictDetailArgs args) { + systemDictDetailService.saveDictDetail(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除字典详情") - @PostMapping(value = "/removeDictDetailById") - @PreAuthorize("@el.check('dict:del')") - public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { - systemDictDetailService.removeDictDetailById(args.getId()); - return ResponseEntity.ok(null); - } + @ApiOperation("修改字典详情") + @PostMapping(value = "/modifyDictDetailById") + @PreAuthorize("@el.check('dict:edit')") + public ResponseEntity modifyDictDetailById( + @Validated(SystemDictDetailTb.Update.class) @RequestBody SystemDictDetailTb args) { + systemDictDetailService.updateDictDetailById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除字典详情") + @PostMapping(value = "/removeDictDetailById") + @PreAuthorize("@el.check('dict:del')") + public ResponseEntity removeDictDetailById(@RequestBody SystemDictDetailTb args) { + systemDictDetailService.deleteDictDetailById(args.getId()); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java index 5977e858..1192809e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemEmailController.java @@ -35,26 +35,28 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("api/email") @Api(tags = "工具:邮件管理") public class SystemEmailController { - @Autowired private SystemEmailService systemEmailService; - @ApiOperation("查询配置") - @PostMapping(value = "/getLastEmailConfig") - public ResponseEntity getLastEmailConfig() { - return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); - } + @Autowired + private SystemEmailService systemEmailService; - @ApiOperation("配置邮件") - @PostMapping(value = "/modifyEmailConfig") - public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) - throws Exception { - systemEmailService.modifyEmailConfig(emailConfig); - return ResponseEntity.ok(null); - } + @ApiOperation("查询配置") + @PostMapping(value = "/getLastEmailConfig") + public ResponseEntity getLastEmailConfig() { + return ResponseEntity.ok(systemEmailService.getLastEmailConfig()); + } - @ApiOperation("发送邮件") - @PostMapping(value = "/sendEmail") - public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { - systemEmailService.sendEmail(sendEmailRequest); - return ResponseEntity.ok(null); - } + @ApiOperation("配置邮件") + @PostMapping(value = "/modifyEmailConfig") + public ResponseEntity modifyEmailConfig(@Validated @RequestBody SystemEmailConfigTb emailConfig) + throws Exception { + systemEmailService.updateEmailConfigById(emailConfig); + return ResponseEntity.ok(null); + } + + @ApiOperation("发送邮件") + @PostMapping(value = "/sendEmail") + public ResponseEntity sendEmail(@Validated @RequestBody SystemSendEmailArgs sendEmailRequest) { + systemEmailService.sendEmail(sendEmailRequest); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java index 02880689..f1df2b33 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemJobController.java @@ -41,56 +41,58 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:岗位管理") @RequestMapping("/api/job") public class SystemJobController { - @Autowired private SystemJobService systemJobService; - @ApiOperation("导出岗位数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('job:list')") - public void exportJob(HttpServletResponse response, SystemQueryJobArgs criteria) throws IOException { - systemJobService.exportJobExcel(systemJobService.queryJobByArgs(criteria), response); - } + @Autowired + private SystemJobService systemJobService; - @ApiOperation("查询岗位") - @PostMapping(value = "/queryAllEnableJob") - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByArgs( - @Validated @RequestBody KitPageArgs args) { - SystemQueryJobArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemJobService.queryJobByArgs(criteria, page)); - } + @ApiOperation("导出岗位数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('job:list')") + public void exportJob(HttpServletResponse response, SystemQueryJobArgs args) throws IOException { + systemJobService.exportJobExcel(systemJobService.queryJobByArgs(args), response); + } - @ApiOperation("查询岗位") - @PostMapping - @PreAuthorize("@el.check('job:list','user:list')") - public ResponseEntity> queryJobByCrud( - @Validated @RequestBody KitPageArgs args) { - return queryJobByArgs(args); - } + @ApiOperation("查询岗位") + @PostMapping(value = "/queryAllEnableJob") + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryJobArgs args = pageArgs.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemJobService.searchJobByArgs(args, page)); + } - @ApiOperation("新增岗位") - @PostMapping(value = "/saveJob") - @PreAuthorize("@el.check('job:add')") - public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { - systemJobService.saveJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询岗位") + @PostMapping + @PreAuthorize("@el.check('job:list','user:list')") + public ResponseEntity> queryJobByCrud( + @Validated @RequestBody KitPageArgs args) { + return queryJobByArgs(args); + } - @ApiOperation("修改岗位") - @PostMapping(value = "/modifyJobById") - @PreAuthorize("@el.check('job:edit')") - public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { - systemJobService.modifyJobById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增岗位") + @PostMapping(value = "/saveJob") + @PreAuthorize("@el.check('job:add')") + public ResponseEntity saveJob(@Validated @RequestBody SystemCreateJobArgs args) { + systemJobService.saveJob(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除岗位") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('job:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - // 验证是否被用户关联 - systemJobService.verifyBindRelationByIds(ids); - systemJobService.removeJobByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改岗位") + @PostMapping(value = "/modifyJobById") + @PreAuthorize("@el.check('job:edit')") + public ResponseEntity modifyJobById(@Validated(SystemJobTb.Update.class) @RequestBody SystemJobTb args) { + systemJobService.updateJobById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("删除岗位") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('job:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + // 验证是否被用户关联 + systemJobService.verifyBindRelationByIds(ids); + systemJobService.deleteJobByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java index b27c1286..7e38470f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemLocalStorageController.java @@ -44,57 +44,59 @@ import org.springframework.web.multipart.MultipartFile; @Api(tags = "工具:本地存储管理") @RequestMapping("/api/localStorage") public class SystemLocalStorageController { - @Autowired private SystemLocalStorageService localStorageService; - @ApiOperation("查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryLocalStorage( - @Validated @RequestBody KitPageArgs args) { - SystemQueryStorageArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(localStorageService.queryLocalStorage(criteria, page)); - } + @Autowired + private SystemLocalStorageService localStorageService; - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { - localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorage(criteria), response); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryLocalStorage( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryStorageArgs args = pageArgs.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(localStorageService.searchLocalStorage(args, page)); + } - @ApiOperation("上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { - localStorageService.uploadFile(name, file); - return ResponseEntity.ok(null); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { + localStorageService.exportLocalStorageExcel(localStorageService.queryLocalStorageByArgs(args), response); + } - @ApiOperation("上传图片") - @PostMapping("/uploadPicture") - public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { - // 判断文件是否为图片 - String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); - if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { - throw new BadRequestException("只能上传图片"); - } - SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); - return ResponseEntity.ok(localStorage); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam String name, @RequestParam("file") MultipartFile file) { + localStorageService.uploadFile(name, file); + return ResponseEntity.ok(null); + } - @ApiOperation("修改文件") - @PostMapping(value = "/modifyLocalStorageById") - @PreAuthorize("@el.check('storage:edit')") - public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { - localStorageService.modifyLocalStorageById(args); - return ResponseEntity.ok(null); + @ApiOperation("上传图片") + @PostMapping("/uploadPicture") + public ResponseEntity uploadPicture(@RequestParam MultipartFile file) { + // 判断文件是否为图片 + String suffix = KitFileUtil.getSuffix(file.getOriginalFilename()); + if (!FileTypeEnum.IMAGE.getCode().equals(KitFileUtil.getFileType(suffix))) { + throw new BadRequestException("只能上传图片"); } + SystemLocalStorageTb localStorage = localStorageService.uploadFile(null, file); + return ResponseEntity.ok(localStorage); + } - @ApiOperation("多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { - localStorageService.removeFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改文件") + @PostMapping(value = "/modifyLocalStorageById") + @PreAuthorize("@el.check('storage:edit')") + public ResponseEntity modifyLocalStorageById(@Validated @RequestBody SystemLocalStorageTb args) { + localStorageService.updateLocalStorageById(args); + return ResponseEntity.ok(null); + } + + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity deleteFileByIds(@RequestBody Long[] ids) { + localStorageService.deleteFileByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java index 3a15f2f1..e05581cb 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMenuController.java @@ -23,7 +23,7 @@ import cn.odboy.system.dal.dataobject.SystemMenuTb; import cn.odboy.system.dal.model.SystemMenuVo; import cn.odboy.system.dal.model.SystemQueryMenuArgs; import cn.odboy.system.dal.mysql.SystemMenuMapper; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemMenuService; import cn.odboy.util.KitPageUtil; import io.swagger.annotations.Api; @@ -50,108 +50,111 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:菜单管理") @RequestMapping("/api/menu") public class SystemMenuController { - @Autowired private SystemMenuService systemMenuService; - @Autowired private SystemMenuMapper systemMenuMapper; - @ApiOperation("导出菜单数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('menu:list')") - public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs criteria) throws Exception { - systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(criteria, false), response); - } + @Autowired + private SystemMenuService systemMenuService; + @Autowired + private SystemMenuMapper systemMenuMapper; - @PostMapping(value = "/buildMenus") - @ApiOperation("获取前端所需菜单") - public ResponseEntity> buildMenus() { - List menuList = systemMenuService.queryMenuListByUserId(CsSecurityHelper.getCurrentUserId()); - List menus = systemMenuService.buildMenuTree(menuList); - return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); - } + @ApiOperation("导出菜单数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('menu:list')") + public void exportMenu(HttpServletResponse response, SystemQueryMenuArgs args) throws Exception { + systemMenuService.exportMenuExcel(systemMenuService.queryAllMenu(args, false), response); + } - @ApiOperation("返回全部的菜单") - @PostMapping(value = "/queryMenuListByPid") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { - return ResponseEntity.ok(systemMenuService.queryMenuByPid(pid)); - } + @PostMapping(value = "/buildMenus") + @ApiOperation("获取前端所需菜单") + public ResponseEntity> buildMenus() { + List menuList = systemMenuService.listMenuByUserId(KitSecurityHelper.getCurrentUserId()); + List menus = systemMenuService.buildMenuTree(menuList); + return ResponseEntity.ok(systemMenuService.buildMenuVo(menus)); + } - @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") - @PostMapping(value = "/queryChildMenuSet") - @PreAuthorize("@el.check('menu:list','roles:list')") - public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { - Set menuSet = new HashSet<>(); - List menuList = systemMenuService.queryMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = systemMenuService.queryChildMenu(menuList, menuSet); - Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); - return ResponseEntity.ok(ids); - } + @ApiOperation("返回全部的菜单") + @PostMapping(value = "/queryMenuListByPid") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryMenuListByPid(@RequestParam Long pid) { + return ResponseEntity.ok(systemMenuService.listMenuByPid(pid)); + } - @PostMapping - @ApiOperation("查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenuByCrud( - @Validated @RequestBody KitPageArgs args) throws Exception { - return queryAllMenu(args); - } + @ApiOperation("根据菜单ID返回所有子节点ID, 包含自身ID") + @PostMapping(value = "/queryChildMenuSet") + @PreAuthorize("@el.check('menu:list','roles:list')") + public ResponseEntity> queryChildMenuSet(@RequestParam Long id) { + Set menuSet = new HashSet<>(); + List menuList = systemMenuService.listMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = systemMenuService.queryChildMenuByArgs(menuList, menuSet); + Set ids = menuSet.stream().map(SystemMenuTb::getId).collect(Collectors.toSet()); + return ResponseEntity.ok(ids); + } - @PostMapping(value = "/queryMenuByArgs") - @ApiOperation("查询菜单") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryAllMenu( - @Validated @RequestBody KitPageArgs args) throws Exception { - SystemQueryMenuArgs criteria = args.getArgs(); - List menuList = systemMenuService.queryAllMenu(criteria, true); - return ResponseEntity.ok(KitPageUtil.toPage(menuList)); - } + @PostMapping + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenuByCrud( + @Validated @RequestBody KitPageArgs args) throws Exception { + return queryAllMenu(args); + } - @ApiOperation("查询菜单:根据ID获取同级与上级数据") - @PostMapping("/queryMenuSuperior") - @PreAuthorize("@el.check('menu:list')") - public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { - Set menus; - if (CollectionUtil.isNotEmpty(ids)) { - menus = new LinkedHashSet<>(systemMenuService.queryMenuByIds(ids)); - for (SystemMenuTb menu : menus) { - List menuList = systemMenuService.querySuperiorMenuList(menu, new ArrayList<>()); - for (SystemMenuTb data : menuList) { - if (data.getId().equals(menu.getPid())) { - data.setSubCount(data.getSubCount() - 1); - } - } - menus.addAll(menuList); - } - // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 - menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); - return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); + @PostMapping(value = "/queryMenuByArgs") + @ApiOperation("查询菜单") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryAllMenu( + @Validated @RequestBody KitPageArgs pageArgs) throws Exception { + SystemQueryMenuArgs args = pageArgs.getArgs(); + List menuList = systemMenuService.queryAllMenu(args, true); + return ResponseEntity.ok(KitPageUtil.toPage(menuList)); + } + + @ApiOperation("查询菜单:根据ID获取同级与上级数据") + @PostMapping("/queryMenuSuperior") + @PreAuthorize("@el.check('menu:list')") + public ResponseEntity> queryMenuSuperior(@RequestBody List ids) { + Set menus; + if (CollectionUtil.isNotEmpty(ids)) { + menus = new LinkedHashSet<>(systemMenuService.listMenuByIds(ids)); + for (SystemMenuTb menu : menus) { + List menuList = systemMenuService.querySuperiorMenuByArgs(menu, new ArrayList<>()); + for (SystemMenuTb data : menuList) { + if (data.getId().equals(menu.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } } - return ResponseEntity.ok(systemMenuService.queryMenuByPid(null)); + menus.addAll(menuList); + } + // 编辑菜单时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + menus = menus.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toSet()); + return ResponseEntity.ok(systemMenuService.buildMenuTree(new ArrayList<>(menus))); } + return ResponseEntity.ok(systemMenuService.listMenuByPid(null)); + } - @ApiOperation("新增菜单") - @PostMapping(value = "/saveMenu") - @PreAuthorize("@el.check('menu:add')") - public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - systemMenuService.saveMenu(args); - return ResponseEntity.ok(null); + @ApiOperation("新增菜单") + @PostMapping(value = "/saveMenu") + @PreAuthorize("@el.check('menu:add')") + public ResponseEntity saveMenu(@Validated @RequestBody SystemMenuTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + systemMenuService.saveMenu(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改菜单") - @PostMapping(value = "/modifyMenuById") - @PreAuthorize("@el.check('menu:edit')") - public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { - systemMenuService.modifyMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改菜单") + @PostMapping(value = "/modifyMenuById") + @PreAuthorize("@el.check('menu:edit')") + public ResponseEntity modifyMenuById(@Validated(SystemMenuTb.Update.class) @RequestBody SystemMenuTb args) { + systemMenuService.updateMenuById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除菜单") - @PostMapping(value = "/removeMenuByIds") - @PreAuthorize("@el.check('menu:del')") - public ResponseEntity removeMenuByIds(@RequestBody Set ids) { - systemMenuService.removeMenuByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("删除菜单") + @PostMapping(value = "/removeMenuByIds") + @PreAuthorize("@el.check('menu:del')") + public ResponseEntity removeMenuByIds(@RequestBody Set ids) { + systemMenuService.deleteMenuByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java index b5dfffb2..b990e531 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemMonitorController.java @@ -30,12 +30,14 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统-服务监控管理") @RequestMapping("/api/monitor") public class SystemMonitorController { - @Autowired private SystemMonitorService systemMonitorService; - @PostMapping(value = "/queryServerMonitorInfo") - @ApiOperation("查询服务监控") - @PreAuthorize("@el.check('monitor:list')") - public ResponseEntity> queryServerMonitorInfo() { - return ResponseEntity.ok(systemMonitorService.queryServerMonitorInfo()); - } + @Autowired + private SystemMonitorService systemMonitorService; + + @PostMapping(value = "/queryServerMonitorInfo") + @ApiOperation("查询服务监控") + @PreAuthorize("@el.check('monitor:list')") + public ResponseEntity> queryServerMonitorInfo() { + return ResponseEntity.ok(systemMonitorService.getServerMonitorInfo()); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java index 2a607da4..6ecb1ec9 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOnlineController.java @@ -41,34 +41,36 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/user/online") @Api(tags = "系统:在线用户管理") public class SystemOnlineController { - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @ApiOperation("查询在线用户") - @PostMapping - @PreAuthorize("@el.check()") - public ResponseEntity> queryOnlineUser( - @Validated @RequestBody KitPageArgs args) { - IPage page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); - } + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check()") - public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { - systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( - systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); - } + @ApiOperation("查询在线用户") + @PostMapping + @PreAuthorize("@el.check()") + public ResponseEntity> queryOnlineUser( + @Validated @RequestBody KitPageArgs args) { + IPage page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemUserOnlineInfoDAO.queryUserOnlineModelPage(args.getArgs(), page)); + } - @ApiOperation("踢出用户") - @PostMapping(value = "/kickOutUser") - @PreAuthorize("@el.check()") - public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { - for (String token : keys) { - // 解密Key - token = KitDesEncryptUtil.desDecrypt(token); - systemUserOnlineInfoDAO.logoutByToken(token); - } - return ResponseEntity.ok(null); + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check()") + public void exportOnlineUser(HttpServletResponse response, String username) throws IOException { + systemUserOnlineInfoDAO.downloadUserOnlineModelExcel( + systemUserOnlineInfoDAO.queryUserOnlineModelListByUsername(username), response); + } + + @ApiOperation("踢出用户") + @PostMapping(value = "/kickOutUser") + @PreAuthorize("@el.check()") + public ResponseEntity kickOutUser(@RequestBody Set keys) throws Exception { + for (String token : keys) { + // 解密Key + token = KitDesEncryptUtil.desDecrypt(token); + systemUserOnlineInfoDAO.logoutByToken(token); } + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java index ea07828d..9f214d97 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemOssStorageController.java @@ -44,37 +44,39 @@ import org.springframework.web.multipart.MultipartFile; @Api(tags = "工具:OSS存储管理") @RequestMapping("/api/ossStorage") public class SystemOssStorageController { - @Autowired private SystemOssStorageService systemOssStorageService; - @ApiOperation("查询文件") - @PostMapping - @PreAuthorize("@el.check('storage:list')") - public ResponseEntity> queryOssStorage( - @Validated @RequestBody KitPageArgs args) { - SystemQueryStorageArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemOssStorageService.queryOssStorage(criteria, page)); - } + @Autowired + private SystemOssStorageService systemOssStorageService; - @ApiOperation("导出数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('storage:list')") - public void exportFile(HttpServletResponse response, SystemQueryStorageArgs criteria) throws IOException { - systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(criteria), response); - } + @ApiOperation("查询文件") + @PostMapping + @PreAuthorize("@el.check('storage:list')") + public ResponseEntity> queryOssStorage( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryStorageArgs args = pageArgs.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemOssStorageService.searchOssStorage(args, page)); + } - @ApiOperation("上传文件") - @PostMapping(value = "/uploadFile") - @PreAuthorize("@el.check('storage:add')") - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { - String fileUrl = systemOssStorageService.uploadFile(file); - return ResponseEntity.ok(fileUrl); - } + @ApiOperation("导出数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('storage:list')") + public void exportFile(HttpServletResponse response, SystemQueryStorageArgs args) throws IOException { + systemOssStorageService.exportOssStorageExcel(systemOssStorageService.queryOssStorage(args), response); + } - @ApiOperation("多选删除") - @PostMapping(value = "/removeFileByIds") - public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { - systemOssStorageService.removeFileByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("上传文件") + @PostMapping(value = "/uploadFile") + @PreAuthorize("@el.check('storage:add')") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + String fileUrl = systemOssStorageService.uploadFile(file); + return ResponseEntity.ok(fileUrl); + } + + @ApiOperation("多选删除") + @PostMapping(value = "/removeFileByIds") + public ResponseEntity removeFileByIds(@RequestBody Long[] ids) { + systemOssStorageService.deleteFileByIds(ids); + return ResponseEntity.ok(null); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java index 4b109383..51dc185f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemQuartzJobController.java @@ -48,98 +48,100 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/quartzJob") @Api(tags = "系统:定时任务管理") public class SystemQuartzJobController { - @Autowired private SystemQuartzJobService systemQuartzJobService; - @ApiOperation("查询定时任务") - @PostMapping - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobByCrud( - @Validated @RequestBody KitPageArgs args) { - SystemQueryQuartzJobArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemQuartzJobService.queryQuartzJobByArgs(criteria, page)); - } + @Autowired + private SystemQuartzJobService systemQuartzJobService; - @ApiOperation("导出任务数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { - systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(criteria), response); - } + @ApiOperation("查询定时任务") + @PostMapping + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobByCrud( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryQuartzJobArgs args = pageArgs.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemQuartzJobService.searchQuartzJobByArgs(args, page)); + } - @ApiOperation("导出日志数据") - @GetMapping(value = "/logs/download") - @PreAuthorize("@el.check('quartzJob:list')") - public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs criteria) throws IOException { - systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(criteria), response); - } + @ApiOperation("导出任务数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJob(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { + systemQuartzJobService.exportQuartzJobExcel(systemQuartzJobService.queryQuartzJobByArgs(args), response); + } - @ApiOperation("查询任务执行日志") - @PostMapping(value = "/logs") - @PreAuthorize("@el.check('quartzJob:list')") - public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { - Page page = new Page<>(args.getPage(), args.getSize()); - return ResponseEntity.ok(systemQuartzJobService.queryQuartzLogByArgs(args, page)); - } + @ApiOperation("导出日志数据") + @GetMapping(value = "/logs/download") + @PreAuthorize("@el.check('quartzJob:list')") + public void exportQuartzJobLog(HttpServletResponse response, SystemQueryQuartzJobArgs args) throws IOException { + systemQuartzJobService.exportQuartzLogExcel(systemQuartzJobService.queryQuartzLogByArgs(args), response); + } - @ApiOperation("新增定时任务") - @PostMapping(value = "/createQuartzJob") - @PreAuthorize("@el.check('quartzJob:add')") - public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { - if (args.getId() != null) { - throw new BadRequestException("无效参数id"); - } - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.createJob(args); - return ResponseEntity.ok(null); - } + @ApiOperation("查询任务执行日志") + @PostMapping(value = "/logs") + @PreAuthorize("@el.check('quartzJob:list')") + public ResponseEntity> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page)); + } - @ApiOperation("修改定时任务") - @PutMapping - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity updateQuartzJob( - @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { - // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - checkBean(args.getBeanName()); - systemQuartzJobService.modifyQuartzJobResumeCron(args); - return ResponseEntity.ok(null); + @ApiOperation("新增定时任务") + @PostMapping(value = "/createQuartzJob") + @PreAuthorize("@el.check('quartzJob:add')") + public ResponseEntity createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) { + if (args.getId() != null) { + throw new BadRequestException("无效参数id"); } + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + systemQuartzJobService.createJob(args); + return ResponseEntity.ok(null); + } - @ApiOperation("更改定时任务状态") - @PostMapping(value = "/switchQuartzJobStatus/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { - systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("修改定时任务") + @PutMapping + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity updateQuartzJob( + @Validated(SystemQuartzJobTb.Update.class) @RequestBody SystemUpdateQuartzJobArgs args) { + // 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + checkBean(args.getBeanName()); + systemQuartzJobService.updateQuartzJobResumeCron(args); + return ResponseEntity.ok(null); + } - @ApiOperation("执行定时任务") - @PostMapping(value = "/startQuartzJob/{id}") - @PreAuthorize("@el.check('quartzJob:edit')") - public ResponseEntity startQuartzJob(@PathVariable Long id) { - systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); - return ResponseEntity.ok(null); - } + @ApiOperation("更改定时任务状态") + @PostMapping(value = "/switchQuartzJobStatus/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity switchQuartzJobStatus(@PathVariable Long id) { + systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - @ApiOperation("删除定时任务") - @PostMapping(value = "/removeJobByIds") - @PreAuthorize("@el.check('quartzJob:del')") - public ResponseEntity removeJobByIds(@RequestBody Set ids) { - systemQuartzJobService.removeJobByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("执行定时任务") + @PostMapping(value = "/startQuartzJob/{id}") + @PreAuthorize("@el.check('quartzJob:edit')") + public ResponseEntity startQuartzJob(@PathVariable Long id) { + systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id)); + return ResponseEntity.ok(null); + } - /** - * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 - * - * @param beanName Bean名称 - */ - private void checkBean(String beanName) { - // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 - // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 - if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { - throw new BadRequestException("非法的 Bean,请重新输入!"); - } + @ApiOperation("删除定时任务") + @PostMapping(value = "/removeJobByIds") + @PreAuthorize("@el.check('quartzJob:del')") + public ResponseEntity removeJobByIds(@RequestBody Set ids) { + systemQuartzJobService.deleteJobByIds(ids); + return ResponseEntity.ok(null); + } + + /** + * 验证Bean是不是合法的, 合法的定时任务 Bean 需要用 @Service 定义 + * + * @param beanName Bean名称 + */ + private void checkBean(String beanName) { + // 避免调用攻击者可以从SpringContextHolder获得控制jdbcTemplate类 + // 并使用getDeclaredMethod调用jdbcTemplate的queryForMap函数,执行任意sql命令。 + if (!KitSpringBeanHolder.getAllServiceBeanName().contains(beanName)) { + throw new BadRequestException("非法的 Bean,请重新输入!"); } + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java index 27399661..31ae76cf 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemRoleController.java @@ -22,7 +22,8 @@ import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.dal.model.SystemRoleVo; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemRoleService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; @@ -47,101 +48,103 @@ import org.springframework.web.bind.annotation.RestController; @Api(tags = "系统:角色管理") @RequestMapping("/api/role") public class SystemRoleController { - @Autowired private SystemRoleService systemRoleService; - @ApiOperation("获取单个role") - @PostMapping(value = "/queryRoleById") - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { - return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); - } + @Autowired + private SystemRoleService systemRoleService; - @ApiOperation("导出角色数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('role:list')") - public void exportRole(HttpServletResponse response, SystemQueryRoleArgs criteria) throws IOException { - systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(criteria), response); - } + @ApiOperation("获取单个role") + @PostMapping(value = "/queryRoleById") + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity queryRoleById(@RequestBody SystemRoleTb args) { + return ResponseEntity.ok(systemRoleService.getRoleById(args.getId())); + } - @ApiOperation("返回全部的角色") - @PostMapping(value = "/queryRoleList") - @PreAuthorize("@el.check('roles:list','user:add','user:edit')") - public ResponseEntity> queryRoleList() { - return ResponseEntity.ok(systemRoleService.queryAllRole()); - } + @ApiOperation("导出角色数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('role:list')") + public void exportRole(HttpServletResponse response, SystemQueryRoleArgs args) throws IOException { + systemRoleService.exportRoleExcel(systemRoleService.queryRoleByArgs(args), response); + } - @ApiOperation("查询角色") - @PostMapping - @PreAuthorize("@el.check('roles:list')") - public ResponseEntity> queryRoleByArgs( - @Validated @RequestBody KitPageArgs args) { - SystemQueryRoleArgs criteria = args.getArgs(); - Page page = new Page<>(criteria.getPage(), criteria.getSize()); - return ResponseEntity.ok(systemRoleService.queryRoleByArgs(criteria, page)); - } + @ApiOperation("返回全部的角色") + @PostMapping(value = "/queryRoleList") + @PreAuthorize("@el.check('roles:list','user:add','user:edit')") + public ResponseEntity> queryRoleList() { + return ResponseEntity.ok(systemRoleService.listAllRole()); + } - @ApiOperation("获取用户级别") - @PostMapping(value = "/queryRoleLevel") - public ResponseEntity queryRoleLevel() { - return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); - } + @ApiOperation("查询角色") + @PostMapping + @PreAuthorize("@el.check('roles:list')") + public ResponseEntity> queryRoleByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + SystemQueryRoleArgs args = pageArgs.getArgs(); + Page page = new Page<>(args.getPage(), args.getSize()); + return ResponseEntity.ok(systemRoleService.searchRoleByArgs(args, page)); + } - @ApiOperation("新增角色") - @PostMapping(value = "/saveRole") - @PreAuthorize("@el.check('roles:add')") - public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { - checkRoleLevels(args.getLevel()); - systemRoleService.saveRole(args); - return ResponseEntity.ok(null); - } + @ApiOperation("获取用户级别") + @PostMapping(value = "/queryRoleLevel") + public ResponseEntity queryRoleLevel() { + return ResponseEntity.ok(Dict.create().set("level", checkRoleLevels(null))); + } - @ApiOperation("修改角色") - @PostMapping(value = "/modifyRoleById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleTb args) { - checkRoleLevels(args.getLevel()); - systemRoleService.modifyRoleById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增角色") + @PostMapping(value = "/saveRole") + @PreAuthorize("@el.check('roles:add')") + public ResponseEntity saveRole(@Validated @RequestBody SystemCreateRoleArgs args) { + checkRoleLevels(args.getLevel()); + systemRoleService.saveRole(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改角色菜单") - @PostMapping(value = "/modifyBindMenuById") - @PreAuthorize("@el.check('roles:edit')") - public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleTb args) { - SystemRoleTb role = systemRoleService.getRoleById(args.getId()); - checkRoleLevels(role.getLevel()); - systemRoleService.modifyBindMenuById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色") + @PostMapping(value = "/modifyRoleById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyRoleById(@Validated(SystemRoleTb.Update.class) @RequestBody SystemRoleVo args) { + checkRoleLevels(args.getLevel()); + systemRoleService.updateRoleById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除角色") - @PostMapping(value = "/removeRoleByIds") - @PreAuthorize("@el.check('roles:del')") - public ResponseEntity removeRoleByIds(@RequestBody Set ids) { - for (Long id : ids) { - SystemRoleTb role = systemRoleService.getRoleById(id); - checkRoleLevels(role.getLevel()); - } - // 验证是否被用户关联 - systemRoleService.verifyBindRelationByIds(ids); - systemRoleService.removeRoleByIds(ids); - return ResponseEntity.ok(null); - } + @ApiOperation("修改角色菜单") + @PostMapping(value = "/modifyBindMenuById") + @PreAuthorize("@el.check('roles:edit')") + public ResponseEntity modifyBindMenuById(@RequestBody SystemRoleVo args) { + SystemRoleTb role = systemRoleService.getRoleById(args.getId()); + checkRoleLevels(role.getLevel()); + systemRoleService.updateBindMenuById(args); + return ResponseEntity.ok(null); + } - /** - * 检查用户的角色级别 - * - * @return / - */ - private int checkRoleLevels(Integer level) { - List levels = systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList()); - int min = Collections.min(levels); - if (level != null) { - if (level < min) { - throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); - } - } - return min; + @ApiOperation("删除角色") + @PostMapping(value = "/removeRoleByIds") + @PreAuthorize("@el.check('roles:del')") + public ResponseEntity removeRoleByIds(@RequestBody Set ids) { + for (Long id : ids) { + SystemRoleTb role = systemRoleService.getRoleById(id); + checkRoleLevels(role.getLevel()); } + // 验证是否被用户关联 + systemRoleService.verifyBindRelationByIds(ids); + systemRoleService.deleteRoleByIds(ids); + return ResponseEntity.ok(null); + } + + /** + * 检查用户的角色级别 + * + * @return / + */ + private int checkRoleLevels(Integer level) { + List levels = systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList()); + int min = Collections.min(levels); + if (level != null) { + if (level < min) { + throw new BadRequestException("权限不足, 你的角色级别:" + min + ", 低于操作的角色级别:" + level); + } + } + return min; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java index e46b7ddb..54e198cb 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/controller/SystemUserController.java @@ -27,7 +27,8 @@ import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import cn.odboy.system.dal.model.SystemUpdateUserPasswordArgs; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.dal.model.SystemUserVo; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.system.service.SystemDataService; import cn.odboy.system.service.SystemDeptService; import cn.odboy.system.service.SystemEmailService; @@ -35,15 +36,12 @@ import cn.odboy.system.service.SystemRoleService; import cn.odboy.system.service.SystemUserService; import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitRsaEncryptUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; @@ -67,172 +65,180 @@ import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/api/user") public class SystemUserController { - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private SystemUserService systemUserService; - @Autowired private SystemDataService systemDataService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemEmailService systemEmailService; - @Autowired private AppProperties properties; - @ApiOperation("导出用户数据") - @GetMapping(value = "/download") - @PreAuthorize("@el.check('user:list')") - public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs criteria) throws IOException { - systemUserService.exportUserExcel(systemUserService.queryUserByArgs(criteria), response); - } + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemEmailService systemEmailService; + @Autowired + private AppProperties properties; - @ApiOperation("查询用户") - @PostMapping - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserByArgs( - @Validated @RequestBody KitPageArgs args) { - Page page = new Page<>(args.getPage(), args.getSize()); - SystemQueryUserArgs criteria = args.getArgs(); - if (!ObjectUtils.isEmpty(criteria.getDeptId())) { - criteria.getDeptIds().add(criteria.getDeptId()); - // 先查找是否存在子节点 - List data = systemDeptService.queryDeptByPid(criteria.getDeptId()); - // 然后把子节点的ID都加入到集合中 - criteria.getDeptIds().addAll(systemDeptService.queryChildDeptIdListByDeptIds(data)); - } - // 数据权限 - List dataScopes = systemDataService.findDeptIdListByArgs( - systemUserService.getUserByUsername(CsSecurityHelper.getCurrentUsername())); - // criteria.getDeptIds() 不为空并且数据权限不为空则取交集 - if (!CollectionUtils.isEmpty(criteria.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { - // 取交集 - criteria.getDeptIds().retainAll(dataScopes); - if (!CollectionUtil.isEmpty(criteria.getDeptIds())) { - return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); - } - } else { - // 否则取并集 - criteria.getDeptIds().addAll(dataScopes); - return ResponseEntity.ok(systemUserService.queryUserByArgs(criteria, page)); - } - return ResponseEntity.ok(KitPageUtil.emptyData()); - } + @ApiOperation("导出用户数据") + @GetMapping(value = "/download") + @PreAuthorize("@el.check('user:list')") + public void exportUserExcel(HttpServletResponse response, SystemQueryUserArgs args) throws IOException { + systemUserService.exportUserExcel(systemUserService.queryUserByArgs(args), response); + } - @ApiOperation("新增用户") - @PostMapping(value = "/saveUser") - @PreAuthorize("@el.check('user:add')") - public ResponseEntity saveUser(@Validated @RequestBody SystemUserTb args) { - checkLevel(args); - // 默认密码 123456 - args.setPassword(passwordEncoder.encode("123456")); - systemUserService.saveUser(args); - return ResponseEntity.ok(null); + @ApiOperation("查询用户") + @PostMapping + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserByArgs( + @Validated @RequestBody KitPageArgs pageArgs) { + Page page = new Page<>(pageArgs.getPage(), pageArgs.getSize()); + SystemQueryUserArgs args = pageArgs.getArgs(); + if (!ObjectUtils.isEmpty(args.getDeptId())) { + args.getDeptIds().add(args.getDeptId()); + // 先查找是否存在子节点 + List data = systemDeptService.listDeptByPid(args.getDeptId()); + // 然后把子节点的ID都加入到集合中 + args.getDeptIds().addAll(systemDeptService.queryChildDeptIdByDeptIds(data)); } + // 数据权限 + List dataScopes = systemDataService.queryDeptIdByArgs( + systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername())); + // args.getDeptIds() 不为空并且数据权限不为空则取交集 + if (!CollectionUtils.isEmpty(args.getDeptIds()) && !CollectionUtils.isEmpty(dataScopes)) { + // 取交集 + args.getDeptIds().retainAll(dataScopes); + if (!CollectionUtil.isEmpty(args.getDeptIds())) { + return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); + } + } else { + // 否则取并集 + args.getDeptIds().addAll(dataScopes); + return ResponseEntity.ok(systemUserService.searchUserByArgs(args, page)); + } + return ResponseEntity.ok(KitPageUtil.emptyData()); + } - @ApiOperation("修改用户") - @PostMapping(value = "/modifyUserById") - @PreAuthorize("@el.check('user:edit')") - public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - checkLevel(args); - systemUserService.modifyUserById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("新增用户") + @PostMapping(value = "/saveUser") + @PreAuthorize("@el.check('user:add')") + public ResponseEntity saveUser(@Validated @RequestBody SystemUserVo args) { + checkLevel(args); + // 默认密码 123456 + args.setPassword(passwordEncoder.encode("123456")); + systemUserService.saveUser(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改用户:个人中心") - @PostMapping(value = "modifyUserCenterInfoById") - public ResponseEntity modifyUserCenterInfoById( - @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { - if (!args.getId().equals(CsSecurityHelper.getCurrentUserId())) { - throw new BadRequestException("不能修改他人资料"); - } - systemUserService.modifyUserCenterInfoById(args); - return ResponseEntity.ok(null); - } + @ApiOperation("修改用户") + @PostMapping(value = "/modifyUserById") + @PreAuthorize("@el.check('user:edit')") + public ResponseEntity modifyUserById(@Validated(SystemUserTb.Update.class) @RequestBody SystemUserVo args) { + checkLevel(args); + systemUserService.updateUserById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("删除用户") - @PostMapping(value = "/removeUserByIds") - @PreAuthorize("@el.check('user:del')") - public ResponseEntity removeUserByIds(@RequestBody Set ids) { - for (Long id : ids) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = Collections.min( - systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) - .collect(Collectors.toList())); - if (currentLevel > optLevel) { - throw new BadRequestException( - "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); - } - } - systemUserService.removeUserByIds(ids); - return ResponseEntity.ok(null); + @ApiOperation("修改用户:个人中心") + @PostMapping(value = "modifyUserCenterInfoById") + public ResponseEntity modifyUserCenterInfoById( + @Validated(SystemUserTb.Update.class) @RequestBody SystemUserTb args) { + if (!args.getId().equals(KitSecurityHelper.getCurrentUserId())) { + throw new BadRequestException("不能修改他人资料"); } + systemUserService.updateUserCenterInfoById(args); + return ResponseEntity.ok(null); + } - @ApiOperation("修改密码") - @PostMapping(value = "/modifyUserPasswordByUsername") - public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) - throws Exception { - String oldPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); - String newPass = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); - SystemUserTb user = systemUserService.getUserByUsername(CsSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(oldPass, user.getPassword())) { - throw new BadRequestException("修改失败,旧密码错误"); - } - if (passwordEncoder.matches(newPass, user.getPassword())) { - throw new BadRequestException("新密码不能与旧密码相同"); - } - systemUserService.modifyUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); - return ResponseEntity.ok(null); + @ApiOperation("删除用户") + @PostMapping(value = "/removeUserByIds") + @PreAuthorize("@el.check('user:del')") + public ResponseEntity removeUserByIds(@RequestBody Set ids) { + for (Long id : ids) { + Integer currentLevel = Collections.min( + systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = Collections.min( + systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel) + .collect(Collectors.toList())); + if (currentLevel > optLevel) { + throw new BadRequestException( + "角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); + } } + systemUserService.removeUserByIds(ids); + return ResponseEntity.ok(null); + } - @ApiOperation("重置密码") - @PostMapping(value = "/resetUserPasswordByIds") - public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { - String defaultPwd = passwordEncoder.encode("123456"); - systemUserService.resetUserPasswordByIds(ids, defaultPwd); - return ResponseEntity.ok(null); + @ApiOperation("修改密码") + @PostMapping(value = "/modifyUserPasswordByUsername") + public ResponseEntity modifyUserPasswordByUsername(@RequestBody SystemUpdateUserPasswordArgs passVo) + throws Exception { + String oldPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getOldPass()); + String newPass = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), passVo.getNewPass()); + SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); + if (!passwordEncoder.matches(oldPass, user.getPassword())) { + throw new BadRequestException("修改失败,旧密码错误"); } + if (passwordEncoder.matches(newPass, user.getPassword())) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + systemUserService.updateUserPasswordByUsername(user.getUsername(), passwordEncoder.encode(newPass)); + return ResponseEntity.ok(null); + } - @ApiOperation("修改头像") - @PostMapping(value = "/modifyUserAvatar") - public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { - return ResponseEntity.ok(systemUserService.modifyUserAvatar(avatar)); - } + @ApiOperation("重置密码") + @PostMapping(value = "/resetUserPasswordByIds") + public ResponseEntity resetUserPasswordByIds(@RequestBody Set ids) { + String defaultPwd = passwordEncoder.encode("123456"); + systemUserService.resetUserPasswordByIds(ids, defaultPwd); + return ResponseEntity.ok(null); + } - @ApiOperation("修改邮箱") - @PostMapping(value = "/modifyUserEmailByUsername/{code}") - public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) - throws Exception { - String password = - KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); - SystemUserTb user = systemUserService.getUserByUsername(CsSecurityHelper.getCurrentUsername()); - if (!passwordEncoder.matches(password, user.getPassword())) { - throw new BadRequestException("密码错误"); - } - systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); - systemUserService.modifyUserEmailByUsername(user.getUsername(), args.getEmail()); - return ResponseEntity.ok(null); - } + @ApiOperation("修改头像") + @PostMapping(value = "/modifyUserAvatar") + public ResponseEntity modifyUserAvatar(@RequestParam MultipartFile avatar) { + return ResponseEntity.ok(systemUserService.updateUserAvatar(avatar)); + } - /** - * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 - * - * @param args / - */ - private void checkLevel(SystemUserTb args) { - Integer currentLevel = Collections.min( - systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream() - .map(SystemRoleTb::getLevel).collect(Collectors.toList())); - Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); - if (currentLevel > optLevel) { - throw new BadRequestException("角色权限不足"); - } + @ApiOperation("修改邮箱") + @PostMapping(value = "/modifyUserEmailByUsername/{code}") + public ResponseEntity modifyUserEmailByUsername(@PathVariable String code, @RequestBody SystemUserTb args) + throws Exception { + String password = + KitRsaEncryptUtil.decryptByPrivateKey(properties.getRsa().getPrivateKey(), args.getPassword()); + SystemUserTb user = systemUserService.getUserByUsername(KitSecurityHelper.getCurrentUsername()); + if (!passwordEncoder.matches(password, user.getPassword())) { + throw new BadRequestException("密码错误"); } + systemEmailService.checkEmailCaptcha(SystemCaptchaBizEnum.EMAIL_RESET_EMAIL_CODE, args.getEmail(), code); + systemUserService.updateUserEmailByUsername(user.getUsername(), args.getEmail()); + return ResponseEntity.ok(null); + } - @ApiOperation("查询用户基础数据") - @PostMapping(value = "/queryUserMetadataOptions") - @PreAuthorize("@el.check('user:list')") - public ResponseEntity> queryUserMetadataOptions(@Validated @RequestBody KitPageArgs args) { - List collect = systemUserService.queryUserMetadataOptions(args); - return ResponseEntity.ok(collect); + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * + * @param args / + */ + private void checkLevel(SystemUserVo args) { + Integer currentLevel = Collections.min( + systemRoleService.queryRoleByUsersId(KitSecurityHelper.getCurrentUserId()).stream() + .map(SystemRoleTb::getLevel).collect(Collectors.toList())); + Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足"); } + } + + @ApiOperation("查询用户基础数据") + @PostMapping(value = "/queryUserMetadataOptions") + @PreAuthorize("@el.check('user:list')") + public ResponseEntity> queryUserMetadataOptions(@Validated @RequestBody KitPageArgs args) { + List collect = systemUserService.queryUserMetadataOptions(args); + return ResponseEntity.ok(collect); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java index dc69ed6d..a61e1ed6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDeptTb.java @@ -34,46 +34,60 @@ import lombok.Setter; @Setter @TableName("system_dept") public class SystemDeptTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "dept_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "角色") private Set - roles; - @TableField(exist = false) @ApiModelProperty(value = "子部门") private List children; - @ApiModelProperty(value = "排序") private Integer deptSort; - @NotBlank @ApiModelProperty(value = "部门名称") private String name; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "上级部门") private Long pid; - @ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemDeptTb dept = (SystemDeptTb)o; - return Objects.equals(id, dept.id) && Objects.equals(name, dept.name); - } + @NotNull(groups = Update.class) + @TableId(value = "dept_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(exist = false) + @JSONField(serialize = false) + @ApiModelProperty(value = "角色") + private Set roles; + @TableField(exist = false) + @ApiModelProperty(value = "子部门") + private List children; + @ApiModelProperty(value = "排序") + private Integer deptSort; + @NotBlank + @ApiModelProperty(value = "部门名称") + private String name; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "上级部门") + private Long pid; + @ApiModelProperty(value = "子节点数目", hidden = true) + private Integer subCount = 0; - @Override - public int hashCode() { - return Objects.hash(id, name); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemDeptTb dept = (SystemDeptTb) o; + return Objects.equals(id, dept.id) && Objects.equals(name, dept.name); + } - @ApiModelProperty(value = "是否有子节点") - public Boolean getHasChildren() { - return subCount > 0; - } + @Override + public int hashCode() { + return Objects.hash(id, name); + } - @ApiModelProperty(value = "是否为叶子") - public Boolean getLeaf() { - return subCount <= 0; - } + @ApiModelProperty(value = "是否有子节点") + public Boolean getHasChildren() { + return subCount > 0; + } - @ApiModelProperty(value = "标签名称") - public String getLabel() { - return name; - } + @ApiModelProperty(value = "是否为叶子") + public Boolean getLeaf() { + return subCount <= 0; + } + + @ApiModelProperty(value = "标签名称") + public String getLabel() { + return name; + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java index e67da9ad..1d744684 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictDetailTb.java @@ -29,11 +29,18 @@ import lombok.Setter; @Setter @TableName("system_dict_detail") public class SystemDictDetailTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true) - @TableId(value = "id", type = IdType.AUTO) private Long id; - @TableField(value = "dict_id") @ApiModelProperty(hidden = true) private Long dictId; - @TableField(exist = false) @ApiModelProperty(value = "字典") private SystemDictTb dict; - @ApiModelProperty(value = "字典标签") private String label; - @ApiModelProperty(value = "字典值") private String value; - @ApiModelProperty(value = "排序") private Integer dictSort = 999; + + @NotNull(groups = Update.class) + @ApiModelProperty(value = "ID", hidden = true) + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @TableField(value = "dict_id") + @ApiModelProperty(hidden = true) + private Long dictId; + @ApiModelProperty(value = "字典标签") + private String label; + @ApiModelProperty(value = "字典值") + private String value; + @ApiModelProperty(value = "排序") + private Integer dictSort = 999; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java index c1134916..47ca9fee 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemDictTb.java @@ -31,8 +31,15 @@ import lombok.Setter; @Setter @TableName("system_dict") public class SystemDictTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @ApiModelProperty(value = "ID", hidden = true) - @TableId(value = "id", type = IdType.AUTO) private Long id; - @NotBlank @ApiModelProperty(value = "名称") private String name; - @ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; + + @NotNull(groups = Update.class) + @ApiModelProperty(value = "ID", hidden = true) + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @NotBlank + @ApiModelProperty(value = "名称") + private String name; + @ApiModelProperty(value = "描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String description; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java index dbe5394a..2d456330 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemEmailConfigTb.java @@ -30,10 +30,22 @@ import lombok.EqualsAndHashCode; @TableName("system_email_config") @EqualsAndHashCode(callSuper = false) public class SystemEmailConfigTb extends KitObject { - @TableId("config_id") private Long id; - @NotBlank @ApiModelProperty(value = "邮件服务器SMTP地址") private String host; - @NotBlank @ApiModelProperty(value = "邮件服务器 SMTP 端口") private String port; - @NotBlank @ApiModelProperty(value = "发件者用户名") private String user; - @NotBlank @ApiModelProperty(value = "密码") private String password; - @NotBlank @ApiModelProperty(value = "收件人") private String fromUser; + + @TableId("config_id") + private Long id; + @NotBlank + @ApiModelProperty(value = "邮件服务器SMTP地址") + private String host; + @NotBlank + @ApiModelProperty(value = "邮件服务器 SMTP 端口") + private String port; + @NotBlank + @ApiModelProperty(value = "发件者用户名") + private String user; + @NotBlank + @ApiModelProperty(value = "密码") + private String password; + @NotBlank + @ApiModelProperty(value = "收件人") + private String fromUser; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java index 626f8763..3763c998 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemJobTb.java @@ -30,26 +30,35 @@ import lombok.Setter; @Setter @TableName("system_job") public class SystemJobTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @NotBlank @ApiModelProperty(value = "岗位名称") private String name; - @NotNull @ApiModelProperty(value = "岗位排序") private Long jobSort; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemJobTb job = (SystemJobTb)o; - return Objects.equals(id, job.id); - } + @NotNull(groups = Update.class) + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @NotBlank + @ApiModelProperty(value = "岗位名称") + private String name; + @NotNull + @ApiModelProperty(value = "岗位排序") + private Long jobSort; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemJobTb job = (SystemJobTb) o; + return Objects.equals(id, job.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java index f8b0f2c2..d5af935d 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemLocalStorageTb.java @@ -29,16 +29,26 @@ import lombok.Setter; @Setter @TableName("system_local_storage") public class SystemLocalStorageTb extends KitBaseUserTimeTb { - @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "真实文件名") private String realName; - @ApiModelProperty(value = "文件名") private String name; - @ApiModelProperty(value = "后缀") private String suffix; - @ApiModelProperty(value = "路径") private String path; - @ApiModelProperty(value = "类型") private String type; - @ApiModelProperty(value = "大小") private String size; - @ApiModelProperty(value = "日期分组") private String dateGroup; - public void copy(SystemLocalStorageTb source) { - BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); - } + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "真实文件名") + private String realName; + @ApiModelProperty(value = "文件名") + private String name; + @ApiModelProperty(value = "后缀") + private String suffix; + @ApiModelProperty(value = "路径") + private String path; + @ApiModelProperty(value = "类型") + private String type; + @ApiModelProperty(value = "大小") + private String size; + @ApiModelProperty(value = "日期分组") + private String dateGroup; + + public void copy(SystemLocalStorageTb source) { + BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java index 4f00ee81..96e37b42 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemMenuTb.java @@ -33,54 +33,74 @@ import lombok.Setter; @Setter @TableName("system_menu") public class SystemMenuTb extends KitBaseUserTimeTb { - @NotNull(groups = {Update.class}) @TableId(value = "menu_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @JSONField(serialize = false) @ApiModelProperty(value = "菜单角色") - private Set roles; - @TableField(exist = false) private List children; - @ApiModelProperty(value = "菜单标题") private String title; - @TableField(value = "name") @ApiModelProperty(value = "菜单组件名称") private String componentName; - @ApiModelProperty(value = "排序") private Integer menuSort = 999; - @ApiModelProperty(value = "组件路径") private String component; - @ApiModelProperty(value = "路由地址") private String path; - @ApiModelProperty(value = "菜单类型,目录、菜单、按钮") private Integer type; - @ApiModelProperty(value = "权限标识") private String permission; - @ApiModelProperty(value = "菜单图标") private String icon; - @ApiModelProperty(value = "缓存") private Boolean cache; - @ApiModelProperty(value = "是否隐藏") private Boolean hidden; - @ApiModelProperty(value = "上级菜单") private Long pid; - @ApiModelProperty(value = "子节点数目", hidden = true) private Integer subCount = 0; - @ApiModelProperty(value = "外链菜单") private Boolean iFrame; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemMenuTb menu = (SystemMenuTb)o; - return Objects.equals(id, menu.id); - } + @NotNull(groups = {Update.class}) + @TableId(value = "menu_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(exist = false) + @JSONField(serialize = false) + @ApiModelProperty(value = "菜单角色") + private Set roles; + @TableField(exist = false) + private List children; + @ApiModelProperty(value = "菜单标题") + private String title; + @TableField(value = "name") + @ApiModelProperty(value = "菜单组件名称") + private String componentName; + @ApiModelProperty(value = "排序") + private Integer menuSort = 999; + @ApiModelProperty(value = "组件路径") + private String component; + @ApiModelProperty(value = "路由地址") + private String path; + @ApiModelProperty(value = "菜单类型,目录、菜单、按钮") + private Integer type; + @ApiModelProperty(value = "权限标识") + private String permission; + @ApiModelProperty(value = "菜单图标") + private String icon; + @ApiModelProperty(value = "缓存") + private Boolean cache; + @ApiModelProperty(value = "是否隐藏") + private Boolean hidden; + @ApiModelProperty(value = "上级菜单") + private Long pid; + @ApiModelProperty(value = "子节点数目", hidden = true) + private Integer subCount = 0; + @ApiModelProperty(value = "外链菜单") + private Boolean iFrame; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemMenuTb menu = (SystemMenuTb) o; + return Objects.equals(id, menu.id); + } - @ApiModelProperty(value = "是否有子节点") - public Boolean getHasChildren() { - return subCount > 0; - } + @Override + public int hashCode() { + return Objects.hash(id); + } - @ApiModelProperty(value = "是否为叶子") - public Boolean getLeaf() { - return subCount <= 0; - } + @ApiModelProperty(value = "是否有子节点") + public Boolean getHasChildren() { + return subCount > 0; + } - @ApiModelProperty(value = "标签名称") - public String getLabel() { - return title; - } + @ApiModelProperty(value = "是否为叶子") + public Boolean getLeaf() { + return subCount <= 0; + } + + @ApiModelProperty(value = "标签名称") + public String getLabel() { + return title; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java index 57de7d72..21d8aca9 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOperationLogTb.java @@ -42,48 +42,61 @@ import lombok.ToString; @TableName("system_operation_log") @ApiModel(value = "SystemOperationLog对象", description = "审计日志") public class SystemOperationLogTb extends KitObject { - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Long id; - /** - * 业务名称 - */ - @TableField("biz_name") private String bizName; - /** - * 业务方法 - */ - @TableField("method") private String method; - /** - * 业务参数 - */ - @TableField("params") private String params; - /** - * 访问来源IP - */ - @TableField("request_ip") private String requestIp; - /** - * 执行时间 - */ - @TableField("execute_time") private Long executeTime; - /** - * 用户名 - */ - @TableField("username") private String username; - /** - * 访问来源地址 - */ - @TableField("address") private String address; - /** - * 浏览器信息 - */ - @TableField("browser_info") private String browserInfo; - /** - * 异常详情 - */ - @TableField("exception_detail") private String exceptionDetail; - /** - * 创建时间 - */ - @TableField(value = "create_time", fill = FieldFill.INSERT) private Date createTime; + + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 业务名称 + */ + @TableField("biz_name") + private String bizName; + /** + * 业务方法 + */ + @TableField("method") + private String method; + /** + * 业务参数 + */ + @TableField("params") + private String params; + /** + * 访问来源IP + */ + @TableField("request_ip") + private String requestIp; + /** + * 执行时间 + */ + @TableField("execute_time") + private Long executeTime; + /** + * 用户名 + */ + @TableField("username") + private String username; + /** + * 访问来源地址 + */ + @TableField("address") + private String address; + /** + * 浏览器信息 + */ + @TableField("browser_info") + private String browserInfo; + /** + * 异常详情 + */ + @TableField("exception_detail") + private String exceptionDetail; + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java index 5a090601..70ae5db9 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemOssStorageTb.java @@ -38,17 +38,44 @@ import lombok.Setter; @TableName("system_oss_storage") @ApiModel(value = "SystemOssStorage对象", description = "OSS存储") public class SystemOssStorageTb extends KitBaseUserTimeTb { - @ApiModelProperty("ID") @TableId(value = "id", type = IdType.AUTO) private Long id; - @TableField("service_type") @ApiModelProperty("类型,比如minio") private String serviceType; - @TableField("endpoint") @ApiModelProperty("服务地址") private String endpoint; - @TableField("bucket_name") @ApiModelProperty("存储桶名称") private String bucketName; - @TableField("file_name") @ApiModelProperty("完整文件名称") private String fileName; - @TableField("file_size") @ApiModelProperty("文件大小, 单位:字节") private Long fileSize; - @TableField("file_mime") @ApiModelProperty("文件类型") private String fileMime; - @ApiModelProperty("短文件名") @TableField("file_prefix") private String filePrefix; - @ApiModelProperty("文件后缀") @TableField("file_suffix") private String fileSuffix; - @TableField("file_md5") @ApiModelProperty("文件md5") private String fileMd5; - @TableField("file_url") @ApiModelProperty("文件链接") private String fileUrl; - @TableField("file_code") @ApiModelProperty("文件编码") private String fileCode; - @TableField("object_name") @ApiModelProperty("对象路径") private String objectName; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + @TableField("service_type") + @ApiModelProperty("类型,比如minio") + private String serviceType; + @TableField("endpoint") + @ApiModelProperty("服务地址") + private String endpoint; + @TableField("bucket_name") + @ApiModelProperty("存储桶名称") + private String bucketName; + @TableField("file_name") + @ApiModelProperty("完整文件名称") + private String fileName; + @TableField("file_size") + @ApiModelProperty("文件大小, 单位:字节") + private Long fileSize; + @TableField("file_mime") + @ApiModelProperty("文件类型") + private String fileMime; + @ApiModelProperty("短文件名") + @TableField("file_prefix") + private String filePrefix; + @ApiModelProperty("文件后缀") + @TableField("file_suffix") + private String fileSuffix; + @TableField("file_md5") + @ApiModelProperty("文件md5") + private String fileMd5; + @TableField("file_url") + @ApiModelProperty("文件链接") + private String fileUrl; + @TableField("file_code") + @ApiModelProperty("文件编码") + private String fileCode; + @TableField("object_name") + @ApiModelProperty("对象路径") + private String objectName; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java index 3bd23363..3464fab5 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzJobTb.java @@ -31,19 +31,40 @@ import lombok.Setter; @Setter @TableName("system_quartz_job") public class SystemQuartzJobTb extends KitBaseUserTimeTb { - public static final String JOB_KEY = "JOB_KEY"; - @TableId(value = "id", type = IdType.AUTO) @NotNull(groups = {Update.class}) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用于子任务唯一标识", hidden = true) private String uuid; - @ApiModelProperty(value = "定时器名称") private String jobName; - @NotBlank @ApiModelProperty(value = "Bean名称") private String beanName; - @NotBlank @ApiModelProperty(value = "方法名称") private String methodName; - @ApiModelProperty(value = "参数") private String params; - @NotBlank @ApiModelProperty(value = "cron表达式") private String cronExpression; - @ApiModelProperty(value = "状态:暂停或启动") private Boolean isPause = false; - @ApiModelProperty(value = "负责人") private String personInCharge; - @ApiModelProperty(value = "报警邮箱") private String email; - @ApiModelProperty(value = "子任务") private String subTask; - @ApiModelProperty(value = "失败后暂停") private Boolean pauseAfterFailure; - @NotBlank @ApiModelProperty(value = "备注") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String - description; + + public static final String JOB_KEY = "JOB_KEY"; + @TableId(value = "id", type = IdType.AUTO) + @NotNull(groups = {Update.class}) + private Long id; + @TableField(exist = false) + @ApiModelProperty(value = "用于子任务唯一标识", hidden = true) + private String uuid; + @ApiModelProperty(value = "定时器名称") + private String jobName; + @NotBlank + @ApiModelProperty(value = "Bean名称") + private String beanName; + @NotBlank + @ApiModelProperty(value = "方法名称") + private String methodName; + @ApiModelProperty(value = "参数") + private String params; + @NotBlank + @ApiModelProperty(value = "cron表达式") + private String cronExpression; + @ApiModelProperty(value = "状态:暂停或启动") + private Boolean isPause = false; + @ApiModelProperty(value = "负责人") + private String personInCharge; + @ApiModelProperty(value = "报警邮箱") + private String email; + @ApiModelProperty(value = "子任务") + private String subTask; + @ApiModelProperty(value = "失败后暂停") + private Boolean pauseAfterFailure; + @NotBlank + @ApiModelProperty(value = "备注") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String + description; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java index 28695494..2eebf8f3 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemQuartzLogTb.java @@ -30,14 +30,27 @@ import lombok.EqualsAndHashCode; @TableName("system_quartz_log") @EqualsAndHashCode(callSuper = false) public class SystemQuartzLogTb extends KitObject { - @TableId(value = "id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "任务名称", hidden = true) private String jobName; - @ApiModelProperty(value = "bean名称", hidden = true) private String beanName; - @ApiModelProperty(value = "方法名称", hidden = true) private String methodName; - @ApiModelProperty(value = "参数", hidden = true) private String params; - @ApiModelProperty(value = "cron表达式", hidden = true) private String cronExpression; - @ApiModelProperty(value = "状态", hidden = true) private Boolean isSuccess; - @ApiModelProperty(value = "异常详情", hidden = true) private String exceptionDetail; - @ApiModelProperty(value = "执行耗时", hidden = true) private Long time; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间", hidden = true) private Date createTime; + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "任务名称", hidden = true) + private String jobName; + @ApiModelProperty(value = "bean名称", hidden = true) + private String beanName; + @ApiModelProperty(value = "方法名称", hidden = true) + private String methodName; + @ApiModelProperty(value = "参数", hidden = true) + private String params; + @ApiModelProperty(value = "cron表达式", hidden = true) + private String cronExpression; + @ApiModelProperty(value = "状态", hidden = true) + private Boolean isSuccess; + @ApiModelProperty(value = "异常详情", hidden = true) + private String exceptionDetail; + @ApiModelProperty(value = "执行耗时", hidden = true) + private Long time; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间", hidden = true) + private Date createTime; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java index e1107881..92b7be14 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleDeptTb.java @@ -25,6 +25,9 @@ import lombok.Setter; @Setter @TableName("system_roles_depts") public class SystemRoleDeptTb extends KitObject { - @TableField(value = "role_id") private Long roleId; - @TableField(value = "dept_id") private Long deptId; + + @TableField(value = "role_id") + private Long roleId; + @TableField(value = "dept_id") + private Long deptId; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java index ec0d1838..ebfeb4b5 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleMenuTb.java @@ -12,6 +12,9 @@ import lombok.Setter; @Setter @TableName("system_roles_menus") public class SystemRoleMenuTb { - @TableField(value = "role_id") private Long roleId; - @TableField(value = "menu_id") private Long menuId; + + @TableField(value = "role_id") + private Long roleId; + @TableField(value = "menu_id") + private Long menuId; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java index cbf3eaf4..45c98226 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemRoleTb.java @@ -24,7 +24,6 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import java.util.Objects; -import java.util.Set; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import lombok.Getter; @@ -37,31 +36,37 @@ import lombok.Setter; @Setter @TableName("system_role") public class SystemRoleTb extends KitBaseUserTimeTb { - @NotNull(groups = {Update.class}) @TableId(value = "role_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用户", hidden = true) private Set users; - @TableField(exist = false) @ApiModelProperty(value = "菜单", hidden = true) private Set menus; - @TableField(exist = false) @ApiModelProperty(value = "部门", hidden = true) private Set depts; - @NotBlank @ApiModelProperty(value = "名称", hidden = true) private String name; - @ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义") private String dataScope = - SystemDataScopeEnum.THIS_LEVEL.getValue(); - @ApiModelProperty(value = "级别,数值越小,级别越大") private Integer level = 3; - @ApiModelProperty(value = "描述") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemRoleTb role = (SystemRoleTb)o; - return Objects.equals(id, role.id); - } + @NotNull(groups = {Update.class}) + @TableId(value = "role_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @NotBlank + @ApiModelProperty(value = "名称", hidden = true) + private String name; + @ApiModelProperty(value = "数据权限,全部 、 本级 、 自定义") + private String dataScope = + SystemDataScopeEnum.THIS_LEVEL.getValue(); + @ApiModelProperty(value = "级别,数值越小,级别越大") + private Integer level = 3; + @ApiModelProperty(value = "描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String description; - @Override - public int hashCode() { - return Objects.hash(id); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemRoleTb role = (SystemRoleTb) o; + return Objects.equals(id, role.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java index e898048d..7c2c964f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserJobTb.java @@ -12,6 +12,9 @@ import lombok.Setter; @Setter @TableName("system_users_jobs") public class SystemUserJobTb { - @TableField(value = "user_id") private Long userId; - @TableField(value = "job_id") private Long jobId; + + @TableField(value = "user_id") + private Long userId; + @TableField(value = "job_id") + private Long jobId; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java index c3be28bd..6d7a137b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserRoleTb.java @@ -25,6 +25,9 @@ import lombok.Setter; @Setter @TableName("system_users_roles") public class SystemUserRoleTb extends KitObject { - @TableField(value = "user_id") private Long userId; - @TableField(value = "role_id") private Long roleId; + + @TableField(value = "user_id") + private Long userId; + @TableField(value = "role_id") + private Long roleId; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java index cd9cc1e3..548042dd 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/dataobject/SystemUserTb.java @@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import java.util.Date; import java.util.Objects; -import java.util.Set; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -34,38 +33,60 @@ import lombok.Setter; @Setter @TableName("system_user") public class SystemUserTb extends KitBaseUserTimeTb { - @NotNull(groups = Update.class) @TableId(value = "user_id", type = IdType.AUTO) - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @TableField(exist = false) @ApiModelProperty(value = "用户角色") private Set roles; - @TableField(exist = false) @ApiModelProperty(value = "用户岗位") private Set jobs; - @TableField(value = "dept_id") @ApiModelProperty(hidden = true) private Long deptId; - @ApiModelProperty(value = "用户部门") @TableField(exist = false) private SystemDeptTb dept; - @NotBlank @ApiModelProperty(value = "用户名称") private String username; - @NotBlank @ApiModelProperty(value = "用户昵称") private String nickName; - @Email @NotBlank @ApiModelProperty(value = "邮箱") private String email; - @NotBlank @ApiModelProperty(value = "电话号码") private String phone; - @ApiModelProperty(value = "用户性别") private String gender; - @ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; - @ApiModelProperty(value = "头像存储的路径", hidden = true) private String avatarPath; - @ApiModelProperty(value = "密码") private String password; - @NotNull @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false; - @ApiModelProperty(value = "最后修改密码的时间", hidden = true) private Date pwdResetTime; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - SystemUserTb user = (SystemUserTb)o; - return Objects.equals(id, user.id) && Objects.equals(username, user.username); - } + @NotNull(groups = Update.class) + @TableId(value = "user_id", type = IdType.AUTO) + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @TableField(value = "dept_id") + @ApiModelProperty(hidden = true) + private Long deptId; + @ApiModelProperty(value = "用户部门") + @TableField(exist = false) + private SystemDeptTb dept; + @NotBlank + @ApiModelProperty(value = "用户名称") + private String username; + @NotBlank + @ApiModelProperty(value = "用户昵称") + private String nickName; + @Email + @NotBlank + @ApiModelProperty(value = "邮箱") + private String email; + @NotBlank + @ApiModelProperty(value = "电话号码") + private String phone; + @ApiModelProperty(value = "用户性别") + private String gender; + @ApiModelProperty(value = "头像真实名称", hidden = true) + private String avatarName; + @ApiModelProperty(value = "头像存储的路径", hidden = true) + private String avatarPath; + @ApiModelProperty(value = "密码") + private String password; + @NotNull + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "是否为admin账号", hidden = true) + private Boolean isAdmin = false; + @ApiModelProperty(value = "最后修改密码的时间", hidden = true) + private Date pwdResetTime; - @Override - public int hashCode() { - return Objects.hash(id, username); + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + SystemUserTb user = (SystemUserTb) o; + return Objects.equals(id, user.id) && Objects.equals(username, user.username); + } + + @Override + public int hashCode() { + return Objects.hash(id, username); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java index d333a318..808d178c 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCheckEmailCaptchaArgs.java @@ -23,7 +23,11 @@ import lombok.Setter; @Getter @Setter public class SystemCheckEmailCaptchaArgs extends KitObject { - @NotBlank(message = "邮箱不能为空") private String email; - @NotBlank(message = "验证码不能为空") private String code; - @NotBlank(message = "验证码业务标识不能为空") private String bizCode; + + @NotBlank(message = "邮箱不能为空") + private String email; + @NotBlank(message = "验证码不能为空") + private String code; + @NotBlank(message = "验证码业务标识不能为空") + private String bizCode; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java index d4500279..a9b74309 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDeptArgs.java @@ -24,10 +24,13 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDeptArgs extends KitObject { - @NotBlank(message = "部门名称必填") private String name; - @NotNull(message = "部门排序必填") private Integer deptSort; - private Boolean enabled; - private String isTop; - private Long pid; - private Integer subCount = 0; + + @NotBlank(message = "部门名称必填") + private String name; + @NotNull(message = "部门排序必填") + private Integer deptSort; + private Boolean enabled; + private String isTop; + private Long pid; + private Integer subCount = 0; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java index 2eb998cf..a8fec72a 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictArgs.java @@ -23,6 +23,8 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDictArgs extends KitObject { - @NotBlank(message = "字典名称必填") private String name; - private String description; + + @NotBlank(message = "字典名称必填") + private String name; + private String description; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java index aa71324b..02acd140 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateDictDetailArgs.java @@ -25,8 +25,13 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateDictDetailArgs extends KitObject { - @NotNull(message = "参数dict必填") private SystemDictTb dict; - @NotBlank(message = "字典标签必填") private String label; - @NotBlank(message = "字典值必填") private String value; - @NotNull(message = "字典排序必填") private Integer dictSort; + + @NotNull(message = "参数dict必填") + private SystemDictTb dict; + @NotBlank(message = "字典标签必填") + private String label; + @NotBlank(message = "字典值必填") + private String value; + @NotNull(message = "字典排序必填") + private Integer dictSort; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java index cda4a7e5..43fb7a13 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateJobArgs.java @@ -24,7 +24,10 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateJobArgs extends KitObject { - @NotBlank(message = "职位名称必填") private String name; - @NotNull(message = "职位排序必填") private Integer jobSort; - private Boolean enabled; + + @NotBlank(message = "职位名称必填") + private String name; + @NotNull(message = "职位排序必填") + private Integer jobSort; + private Boolean enabled; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java index 6f011475..d99fadaf 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemCreateRoleArgs.java @@ -26,13 +26,17 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemCreateRoleArgs extends KitObject { - @NotBlank(message = "角色名称必填") private String name; - @NotNull(message = "角色级别必填") private Integer level; - @NotBlank(message = "数据范围必填") private String dataScope; - private String description; - /** - * 关联的部门 - */ - private Long id; - private Set depts; + + @NotBlank(message = "角色名称必填") + private String name; + @NotNull(message = "角色级别必填") + private Integer level; + @NotBlank(message = "数据范围必填") + private String dataScope; + private String description; + /** + * 关联的部门 + */ + private Long id; + private Set depts; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java new file mode 100644 index 00000000..4a64efa3 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemDictDetailVo.java @@ -0,0 +1,30 @@ +/* + * Copyright 2021-2025 Odboy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemDictDetailTb; +import cn.odboy.system.dal.dataobject.SystemDictTb; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemDictDetailVo extends SystemDictDetailTb { + + @ApiModelProperty(value = "字典") + private SystemDictTb dict; +} \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java index 14e5cf3b..3ae49d0b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuMetaVo.java @@ -25,7 +25,11 @@ import lombok.EqualsAndHashCode; @AllArgsConstructor @EqualsAndHashCode(callSuper = false) public class SystemMenuMetaVo extends KitObject { - @ApiModelProperty(value = "菜单标题") private String title; - @ApiModelProperty(value = "菜单图标") private String icon; - @ApiModelProperty(value = "缓存") private Boolean noCache; + + @ApiModelProperty(value = "菜单标题") + private String title; + @ApiModelProperty(value = "菜单图标") + private String icon; + @ApiModelProperty(value = "缓存") + private Boolean noCache; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java index bb6540d1..d1344996 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemMenuVo.java @@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemMenuVo extends KitObject { - @ApiModelProperty(value = "菜单名称") private String name; - @ApiModelProperty(value = "路径") private String path; - @ApiModelProperty(value = "隐藏状态") private Boolean hidden; - @ApiModelProperty(value = "重定向") private String redirect; - @ApiModelProperty(value = "组件") private String component; - @ApiModelProperty(value = "总是显示") private Boolean alwaysShow; - @ApiModelProperty(value = "元数据") private SystemMenuMetaVo meta; - @ApiModelProperty(value = "子路由") private List children; + + @ApiModelProperty(value = "菜单名称") + private String name; + @ApiModelProperty(value = "路径") + private String path; + @ApiModelProperty(value = "隐藏状态") + private Boolean hidden; + @ApiModelProperty(value = "重定向") + private String redirect; + @ApiModelProperty(value = "组件") + private String component; + @ApiModelProperty(value = "总是显示") + private Boolean alwaysShow; + @ApiModelProperty(value = "元数据") + private SystemMenuMetaVo meta; + @ApiModelProperty(value = "子路由") + private List children; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java index 3e2690bd..0da271d7 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemOssStorageVo.java @@ -22,5 +22,6 @@ import lombok.Setter; @Getter @Setter public class SystemOssStorageVo extends SystemOssStorageTb { - private String fileSizeDesc; + + private String fileSizeDesc; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java index 00361c04..0f85dd05 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineTreeVo.java @@ -23,7 +23,8 @@ import lombok.Setter; @Getter @Setter public class SystemProductLineTreeVo extends KitObject { - private String value; - private String label; - private List children; + + private String value; + private String label; + private List children; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java index e0722418..a629f57e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemProductLineVo.java @@ -22,16 +22,17 @@ import lombok.Setter; @Getter @Setter public class SystemProductLineVo extends KitObject { - /** - * 部门ID(select的value) - */ - private Long value; - /** - * 产品线,如"研发部/华南分部/devops组" - */ - private String label; - /** - * ID路径,如"1-2-3" - */ - private String idPath; + + /** + * 部门ID(select的value) + */ + private Long value; + /** + * 产品线,如"研发部/华南分部/devops组" + */ + private String label; + /** + * ID路径,如"1-2-3" + */ + private String idPath; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java index 3ce12173..cc8f7ef2 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDeptArgs.java @@ -22,10 +22,17 @@ import lombok.Data; @Data public class SystemQueryDeptArgs { - @ApiModelProperty(value = "部门id集合") private List ids; - @ApiModelProperty(value = "部门名称") private String name; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "上级部门") private Long pid; - @ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; - @ApiModelProperty(value = "创建时间") private List createTime; + + @ApiModelProperty(value = "部门id集合") + private List ids; + @ApiModelProperty(value = "部门名称") + private String name; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "上级部门") + private Long pid; + @ApiModelProperty(value = "PID为空查询") + private Boolean pidIsNull; + @ApiModelProperty(value = "创建时间") + private List createTime; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java index 96bb0fd1..a1c6fb2a 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictArgs.java @@ -20,7 +20,11 @@ import lombok.Data; @Data public class SystemQueryDictArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java index 3088ba6f..f2564f3e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryDictDetailArgs.java @@ -23,6 +23,9 @@ import lombok.Setter; @Getter @Setter public class SystemQueryDictDetailArgs extends KitObject { - @ApiModelProperty(value = "标签") private String label; - @ApiModelProperty(value = "字典名称") private String dictName; + + @ApiModelProperty(value = "标签") + private String label; + @ApiModelProperty(value = "字典名称") + private String dictName; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java index fb87c125..52196992 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryJobArgs.java @@ -24,9 +24,15 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class SystemQueryJobArgs { - @ApiModelProperty(value = "岗位名称") private String name; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "岗位名称") + private String name; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java index 5bf1cd8d..bb66c1c8 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryMenuArgs.java @@ -22,8 +22,13 @@ import lombok.Data; @Data public class SystemQueryMenuArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "PID为空查询") private Boolean pidIsNull; - @ApiModelProperty(value = "PID") private Long pid; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "PID为空查询") + private Boolean pidIsNull; + @ApiModelProperty(value = "PID") + private Long pid; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java index cd0b765e..7114be74 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryQuartzJobArgs.java @@ -22,9 +22,15 @@ import lombok.Data; @Data public class SystemQueryQuartzJobArgs { - @ApiModelProperty(value = "定时任务名称") private String jobName; - @ApiModelProperty(value = "是否成功") private Boolean isSuccess; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "定时任务名称") + private String jobName; + @ApiModelProperty(value = "是否成功") + private Boolean isSuccess; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java index cc6f1759..6ce2f0df 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryRoleArgs.java @@ -22,9 +22,15 @@ import lombok.Data; @Data public class SystemQueryRoleArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; - @ApiModelProperty(value = "偏移量", hidden = true) private long offset; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; + @ApiModelProperty(value = "偏移量", hidden = true) + private long offset; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java index 5e85e06b..b13fcf91 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryStorageArgs.java @@ -22,8 +22,13 @@ import lombok.Data; @Data public class SystemQueryStorageArgs { - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java index 24e123b4..a05513dd 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemQueryUserArgs.java @@ -27,12 +27,21 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemQueryUserArgs extends KitObject { - @ApiModelProperty(value = "ID") private Long id; - @ApiModelProperty(value = "多个ID") private Set deptIds = new HashSet<>(); - @ApiModelProperty(value = "模糊查询") private String blurry; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "部门ID") private Long deptId; - @ApiModelProperty(value = "创建时间") private List createTime; - @ApiModelProperty(value = "页码", example = "1") private Integer page = 1; - @ApiModelProperty(value = "每页数据量", example = "10") private Integer size = 10; + + @ApiModelProperty(value = "ID") + private Long id; + @ApiModelProperty(value = "多个ID") + private Set deptIds = new HashSet<>(); + @ApiModelProperty(value = "模糊查询") + private String blurry; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "部门ID") + private Long deptId; + @ApiModelProperty(value = "创建时间") + private List createTime; + @ApiModelProperty(value = "页码", example = "1") + private Integer page = 1; + @ApiModelProperty(value = "每页数据量", example = "10") + private Integer size = 10; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java index 6537e1c9..62552fc1 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleCodeVo.java @@ -28,5 +28,7 @@ import org.springframework.security.core.GrantedAuthority; @NoArgsConstructor @AllArgsConstructor public class SystemRoleCodeVo implements GrantedAuthority { - @ApiModelProperty(value = "角色名") private String authority; + + @ApiModelProperty(value = "角色名") + private String authority; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java new file mode 100644 index 00000000..90e2d2ca --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemRoleVo.java @@ -0,0 +1,22 @@ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemDeptTb; +import cn.odboy.system.dal.dataobject.SystemMenuTb; +import cn.odboy.system.dal.dataobject.SystemRoleTb; +import cn.odboy.system.dal.dataobject.SystemUserTb; +import io.swagger.annotations.ApiModelProperty; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemRoleVo extends SystemRoleTb { + + @ApiModelProperty(value = "用户", hidden = true) + private Set users; + @ApiModelProperty(value = "菜单", hidden = true) + private Set menus; + @ApiModelProperty(value = "部门", hidden = true) + private Set depts; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java index 699b3cf1..4c85cf8b 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSendEmailArgs.java @@ -30,7 +30,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class SystemSendEmailArgs { - @NotEmpty @ApiModelProperty(value = "收件人") private List tos; - @NotBlank @ApiModelProperty(value = "主题") private String subject; - @NotBlank @ApiModelProperty(value = "内容") private String content; + + @NotEmpty + @ApiModelProperty(value = "收件人") + private List tos; + @NotBlank + @ApiModelProperty(value = "主题") + private String subject; + @NotBlank + @ApiModelProperty(value = "内容") + private String content; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java index f01c836d..fb5e3a75 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemSimpleUserVo.java @@ -28,17 +28,30 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemSimpleUserVo extends KitObject { - @ApiModelProperty(value = "ID", hidden = true) private Long id; - @ApiModelProperty(value = "用户角色") private Set roles; - @ApiModelProperty(value = "用户岗位") private Set jobs; - private Long deptId; - @TableField(exist = false) private SystemDeptTb dept; - @ApiModelProperty(value = "用户名称") private String username; - @ApiModelProperty(value = "用户昵称") private String nickName; - @ApiModelProperty(value = "邮箱") private String email; - @ApiModelProperty(value = "电话号码") private String phone; - @ApiModelProperty(value = "用户性别") private String gender; - @ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; - @ApiModelProperty(value = "是否启用") private Boolean enabled; - @ApiModelProperty(value = "是否为admin账号", hidden = true) private Boolean isAdmin = false; + + @ApiModelProperty(value = "ID", hidden = true) + private Long id; + @ApiModelProperty(value = "用户角色") + private Set roles; + @ApiModelProperty(value = "用户岗位") + private Set jobs; + private Long deptId; + @TableField(exist = false) + private SystemDeptTb dept; + @ApiModelProperty(value = "用户名称") + private String username; + @ApiModelProperty(value = "用户昵称") + private String nickName; + @ApiModelProperty(value = "邮箱") + private String email; + @ApiModelProperty(value = "电话号码") + private String phone; + @ApiModelProperty(value = "用户性别") + private String gender; + @ApiModelProperty(value = "头像真实名称", hidden = true) + private String avatarName; + @ApiModelProperty(value = "是否启用") + private Boolean enabled; + @ApiModelProperty(value = "是否为admin账号", hidden = true) + private Boolean isAdmin = false; } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java index f34821f4..48813084 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateQuartzJobArgs.java @@ -24,17 +24,23 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemUpdateQuartzJobArgs extends KitObject { - @NotNull private Long id; - private String uuid; - private String jobName; - @NotBlank private String beanName; - @NotBlank private String methodName; - private String params; - @NotBlank private String cronExpression; - private Boolean isPause = false; - private String personInCharge; - private String email; - private String subTask; - private Boolean pauseAfterFailure; - @NotBlank private String description; + + @NotNull + private Long id; + private String uuid; + private String jobName; + @NotBlank + private String beanName; + @NotBlank + private String methodName; + private String params; + @NotBlank + private String cronExpression; + private Boolean isPause = false; + private String personInCharge; + private String email; + private String subTask; + private Boolean pauseAfterFailure; + @NotBlank + private String description; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java index d75d0607..9070e53c 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUpdateUserPasswordArgs.java @@ -23,6 +23,9 @@ import lombok.Data; */ @Data public class SystemUpdateUserPasswordArgs { - @ApiModelProperty(value = "旧密码") private String oldPass; - @ApiModelProperty(value = "新密码") private String newPass; + + @ApiModelProperty(value = "旧密码") + private String oldPass; + @ApiModelProperty(value = "新密码") + private String newPass; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java index 50f56c55..41614581 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserInfoVo.java @@ -25,11 +25,12 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class SystemUserInfoVo extends KitObject { - private SystemSimpleUserVo user; - private List dataScopes; - private List authorities; - public Set getRoles() { - return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); - } + private SystemSimpleUserVo user; + private List dataScopes; + private List authorities; + + public Set getRoles() { + return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java index 09bec853..6e7a22df 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserJwtVo.java @@ -28,47 +28,51 @@ import org.springframework.security.core.userdetails.UserDetails; @Getter @AllArgsConstructor public class SystemUserJwtVo implements UserDetails { - @ApiModelProperty(value = "用户") private final SystemUserTb user; - @ApiModelProperty(value = "数据权限") private final List dataScopes; - @ApiModelProperty(value = "角色") private final List authorities; - public Set getRoles() { - return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); - } + @ApiModelProperty(value = "用户") + private final SystemUserTb user; + @ApiModelProperty(value = "数据权限") + private final List dataScopes; + @ApiModelProperty(value = "角色") + private final List authorities; - @Override - @JSONField(serialize = false) - public String getPassword() { - return user.getPassword(); - } + public Set getRoles() { + return authorities.stream().map(SystemRoleCodeVo::getAuthority).collect(Collectors.toSet()); + } - @Override - @JSONField(serialize = false) - public String getUsername() { - return user.getUsername(); - } + @Override + @JSONField(serialize = false) + public String getPassword() { + return user.getPassword(); + } - @Override - @JSONField(serialize = false) - public boolean isAccountNonExpired() { - return true; - } + @Override + @JSONField(serialize = false) + public String getUsername() { + return user.getUsername(); + } - @Override - @JSONField(serialize = false) - public boolean isAccountNonLocked() { - return true; - } + @Override + @JSONField(serialize = false) + public boolean isAccountNonExpired() { + return true; + } - @Override - @JSONField(serialize = false) - public boolean isCredentialsNonExpired() { - return true; - } + @Override + @JSONField(serialize = false) + public boolean isAccountNonLocked() { + return true; + } - @Override - @JSONField(serialize = false) - public boolean isEnabled() { - return user.getEnabled(); - } + @Override + @JSONField(serialize = false) + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + @JSONField(serialize = false) + public boolean isEnabled() { + return user.getEnabled(); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java index 475efdef..e93ea5c5 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserLoginArgs.java @@ -23,8 +23,15 @@ import lombok.Setter; @Getter @Setter public class SystemUserLoginArgs { - @NotBlank @ApiModelProperty(value = "用户名") private String username; - @NotBlank @ApiModelProperty(value = "密码") private String password; - @ApiModelProperty(value = "验证码") private String code; - @ApiModelProperty(value = "验证码的key") private String uuid = ""; + + @NotBlank + @ApiModelProperty(value = "用户名") + private String username; + @NotBlank + @ApiModelProperty(value = "密码") + private String password; + @ApiModelProperty(value = "验证码") + private String code; + @ApiModelProperty(value = "验证码的key") + private String uuid = ""; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java index 9f13e780..b8a56f20 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserOnlineVo.java @@ -24,13 +24,23 @@ import lombok.Data; */ @Data public class SystemUserOnlineVo { - @ApiModelProperty(value = "Token编号") private String uid; - @ApiModelProperty(value = "用户名") private String userName; - @ApiModelProperty(value = "昵称") private String nickName; - @ApiModelProperty(value = "岗位") private String dept; - @ApiModelProperty(value = "浏览器") private String browser; - @ApiModelProperty(value = "IP") private String ip; - @ApiModelProperty(value = "地址") private String address; - @ApiModelProperty(value = "token") private String key; - @ApiModelProperty(value = "登录时间") private Date loginTime; + + @ApiModelProperty(value = "Token编号") + private String uid; + @ApiModelProperty(value = "用户名") + private String userName; + @ApiModelProperty(value = "昵称") + private String nickName; + @ApiModelProperty(value = "岗位") + private String dept; + @ApiModelProperty(value = "浏览器") + private String browser; + @ApiModelProperty(value = "IP") + private String ip; + @ApiModelProperty(value = "地址") + private String address; + @ApiModelProperty(value = "token") + private String key; + @ApiModelProperty(value = "登录时间") + private Date loginTime; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java new file mode 100644 index 00000000..b5463eea --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/model/SystemUserVo.java @@ -0,0 +1,19 @@ +package cn.odboy.system.dal.model; + +import cn.odboy.system.dal.dataobject.SystemJobTb; +import cn.odboy.system.dal.dataobject.SystemRoleTb; +import cn.odboy.system.dal.dataobject.SystemUserTb; +import io.swagger.annotations.ApiModelProperty; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SystemUserVo extends SystemUserTb { + + @ApiModelProperty(value = "用户角色") + private Set roles; + @ApiModelProperty(value = "用户岗位") + private Set jobs; +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java index dcfecfd8..44a34ff3 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDeptMapper.java @@ -32,46 +32,11 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemDeptMapper extends BaseMapper { - default List selectDeptByPidIsNull() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemDeptTb::getPid); - return selectList(wrapper); - } - default long countDeptByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return selectCount(wrapper); - } - default List queryDeptByArgs(SystemQueryDeptArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.in(CollUtil.isNotEmpty(criteria.getIds()), SystemDeptTb::getId, criteria.getIds()); - wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemDeptTb::getName, criteria.getName()); - wrapper.eq(criteria.getEnabled() != null, SystemDeptTb::getEnabled, criteria.getEnabled()); - wrapper.eq(criteria.getPid() != null, SystemDeptTb::getPid, criteria.getPid()); - wrapper.isNull(criteria.getPidIsNull() != null, SystemDeptTb::getPid); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemDeptTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemDeptTb::getDeptSort); - return selectList(wrapper); - } - default List selectEnabledDepts() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getEnabled, 1); - return selectList(wrapper); - } - default List selectDeptByPid(long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemDeptTb::getPid, pid); - return selectList(wrapper); - } - default void updateDeptSubCountById(long count, Long deptId) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemDeptTb::getId, deptId); - wrapper.set(SystemDeptTb::getSubCount, count); - update(null, wrapper); - } + + default void updateDeptSubCountById(long count, Long deptId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemDeptTb::getId, deptId); + wrapper.set(SystemDeptTb::getSubCount, count); + update(null, wrapper); + } } diff --git a/cutejava/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 fb5835ed..98e35d5c 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 @@ -16,13 +16,8 @@ package cn.odboy.system.dal.mysql; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; -import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.List; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; /** * 字典明细 Mapper @@ -31,6 +26,5 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemDictDetailMapper extends BaseMapper { - IPage selectDictDetailByArgs(@Param("criteria") SystemQueryDictDetailArgs criteria, Page page); - List selectDictDetailByArgs(@Param("criteria") SystemQueryDictDetailArgs criteria); + } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java index a2905dd8..93215a6e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemDictMapper.java @@ -15,12 +15,9 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemDictTb; -import cn.odboy.system.dal.model.SystemQueryDictArgs; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import org.apache.ibatis.annotations.Mapper; @@ -31,20 +28,14 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemDictMapper extends BaseMapper { - default 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())); - } - } - default List selectDictByArgs(SystemQueryDictArgs args) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - return selectList(wrapper); - } - default List selectDictByArgs(SystemQueryDictArgs args, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(args, wrapper); - return selectList(page, wrapper); - } + + default List listAll() { + return selectList(null); + } + + default SystemDictTb getByName(String dictName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDictTb::getName, dictName); + return selectOne(wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java index f450846a..5855b161 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemEmailConfigMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemEmailConfigMapper extends BaseMapper {} +public interface SystemEmailConfigMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java index b0d68dab..0f20d2d1 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemJobMapper.java @@ -15,15 +15,8 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemJobTb; -import cn.odboy.system.dal.model.SystemQueryJobArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.List; import org.apache.ibatis.annotations.Mapper; /** @@ -33,32 +26,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemJobMapper extends BaseMapper { - default SystemJobTb getJobByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemJobTb::getName, name); - return selectOne(wrapper); - } - default void injectQueryParams(SystemQueryJobArgs criteria, LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getName()), SystemJobTb::getName, criteria.getName()); - wrapper.eq(criteria.getEnabled() != null, SystemJobTb::getEnabled, criteria.getEnabled()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemJobTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); - } - default IPage selectJobByArgs(SystemQueryJobArgs criteria, Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(criteria, wrapper); - return selectPage(page, wrapper); - } - - default List selectJobByArgs(SystemQueryJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQueryParams(criteria, wrapper); - return selectList(wrapper); - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java index caae3c85..c6ccce07 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemLocalStorageMapper.java @@ -15,15 +15,8 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemLocalStorageTb; -import cn.odboy.system.dal.model.SystemQueryStorageArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import java.util.List; import org.apache.ibatis.annotations.Mapper; /** @@ -33,31 +26,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemLocalStorageMapper extends BaseMapper { - default void injectQueryParams(SystemQueryStorageArgs criteria, LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemLocalStorageTb::getName, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getSuffix, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getType, criteria.getBlurry()).or() - .like(SystemLocalStorageTb::getCreateBy, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemLocalStorageTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemLocalStorageTb::getId); - } - default List selectLocalStorageByArgs(SystemQueryStorageArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(criteria, wrapper); - return selectList(wrapper); - } - - default IPage selectLocalStorageByArgs(SystemQueryStorageArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - injectQueryParams(criteria, wrapper); - return selectPage(page, wrapper); - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java index 6c165781..d8363107 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemMenuMapper.java @@ -15,14 +15,8 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemMenuTb; -import cn.odboy.system.dal.model.SystemQueryMenuArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; import org.apache.ibatis.annotations.Mapper; /** @@ -32,61 +26,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SystemMenuMapper extends BaseMapper { - default void updateMenuSubCntByMenuId(Long count, Long menuId) { - if (count != null) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemMenuTb::getId, menuId); - wrapper.set(SystemMenuTb::getSubCount, count); - update(wrapper); - } - } - default SystemMenuTb getMenuByComponentName(String componentName) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getComponentName, componentName); - return selectOne(wrapper); - } - default SystemMenuTb getMenuByTitle(String title) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getTitle, title); - return selectOne(wrapper); - } - - default Long countMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - return selectCount(wrapper); - } - - default List selectMenuByArgs(SystemQueryMenuArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.isNull(criteria.getPidIsNull() != null, SystemMenuTb::getPid); - wrapper.eq(criteria.getPid() != null, SystemMenuTb::getPid, criteria.getPid()); - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemMenuTb::getTitle, criteria.getBlurry()).or() - .like(SystemMenuTb::getComponentName, criteria.getBlurry()).or() - .like(SystemMenuTb::getPermission, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemMenuTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); - } - - default List selectMenuByPid(Long pid) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemMenuTb::getPid, pid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); - } - - default List selectMenuByPidIsNull() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.isNull(SystemMenuTb::getPid); - wrapper.orderByAsc(SystemMenuTb::getMenuSort); - return selectList(wrapper); - } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java index cbf16823..715d6d07 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOperationLogMapper.java @@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SystemOperationLogMapper extends BaseMapper {} +public interface SystemOperationLogMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java index 66d1a1dd..9d7af923 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemOssStorageMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-07-15 */ @Mapper -public interface SystemOssStorageMapper extends BaseMapper {} +public interface SystemOssStorageMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java index 2be2e86e..64c70147 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzJobMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemQuartzJobMapper extends BaseMapper {} +public interface SystemQuartzJobMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java index 688992e5..4435b853 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemQuartzLogMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemQuartzLogMapper extends BaseMapper {} +public interface SystemQuartzLogMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java index 96cef174..7e3993bb 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleDeptMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemRoleDeptMapper extends BaseMapper {} +public interface SystemRoleDeptMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java index 54625188..ffe20a7d 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMapper.java @@ -15,16 +15,9 @@ */ package cn.odboy.system.dal.mysql; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemRoleTb; -import cn.odboy.system.dal.model.SystemQueryRoleArgs; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; -import java.util.Set; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; /** * 角色 Mapper @@ -33,22 +26,5 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface SystemRoleMapper extends BaseMapper { - default Long countRoleByArgs(SystemQueryRoleArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemRoleTb::getName, criteria.getBlurry()).or() - .like(SystemRoleTb::getDescription, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemRoleTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - return selectCount(wrapper); - } - List selectRoleByArgs(@Param("criteria") SystemQueryRoleArgs criteria); - List selectRoleByUserId(@Param("userId") Long userId); - List selectRoleByMenuId(@Param("menuId") Long menuId); - SystemRoleTb getRoleById(@Param("roleId") Long roleId); - Integer countRoleByDeptIds(@Param("deptIds") Set deptIds); + } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java index 8acc1e5e..4d7dc633 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemRoleMenuMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemRoleMenuMapper extends BaseMapper {} +public interface SystemRoleMenuMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java index a73f8ee0..f07f5fa2 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserJobMapper.java @@ -25,4 +25,6 @@ import org.apache.ibatis.annotations.Mapper; * @author odboy */ @Mapper -public interface SystemUserJobMapper extends BaseMapper {} +public interface SystemUserJobMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java index 328f9f37..a8fa3642 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserMapper.java @@ -15,61 +15,43 @@ */ package cn.odboy.system.dal.mysql; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemQueryUserArgs; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; import java.util.Set; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; +/** + * 用户 Mapper + * + * @author odboy + */ @Mapper public interface SystemUserMapper extends BaseMapper { - List selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria); - IPage selectUserByArgs(@Param("criteria") SystemQueryUserArgs criteria, Page page); - List selectUserByRoleId(@Param("roleId") Long roleId); - List selectUserByDeptId(@Param("deptId") Long deptId); - List selectUserByMenuId(@Param("menuId") Long menuId); - Long countUserByJobIds(@Param("jobIds") Set jobIds); - Long countUserByRoleIds(@Param("roleIds") Set roleIds); - SystemUserTb getUserByUsername(@Param("username") String username); - default long countUserByDeptIds(Set deptIds) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemUserTb::getDeptId, deptIds); - return selectCount(wrapper); - } - default SystemUserTb getUserByEmail(String email) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getEmail, email); - wrapper.eq(SystemUserTb::getEnabled, 1); - return selectOne(wrapper); - } - default SystemUserTb getUserByPhone(String phone) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemUserTb::getPhone, phone); - wrapper.eq(SystemUserTb::getEnabled, 1); - return selectOne(wrapper); - } - default void updateUserPasswordByUsername(String username, String password) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); - } - default void updateUserEmailByUsername(String username, String email) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(SystemUserTb::getUsername, username); - wrapper.set(SystemUserTb::getEmail, email); - update(null, wrapper); - } - default void updateUserPasswordByUserIds(String password, Set userIds) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.in(SystemUserTb::getId, userIds); - wrapper.set(SystemUserTb::getPassword, password); - update(null, wrapper); - } + + default void updateUserPasswordByUsername(String username, String password) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } + + default void updateUserEmailByUsername(String username, String email) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.set(SystemUserTb::getEmail, email); + update(null, wrapper); + } + + default void updateUserPasswordByUserIds(String password, Set userIds) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.in(SystemUserTb::getId, userIds); + wrapper.set(SystemUserTb::getPassword, password); + update(null, wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java index 0069f695..700e6e21 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/mysql/SystemUserRoleMapper.java @@ -20,4 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SystemUserRoleMapper extends BaseMapper {} +public interface SystemUserRoleMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java index c8bb7bd9..db7bdcdb 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemCacheKey.java @@ -19,50 +19,51 @@ package cn.odboy.system.dal.redis; * 关于缓存的Key集合 */ public interface SystemCacheKey { - /** - * 用户 - */ - String USER_ID = "user::id:"; - /** - * 数据 - */ - String DATA_USER = "data::user:"; - /** - * 菜单 - */ - String MENU_ID = "menu::id:"; - String MENU_USER = "menu::user:"; - /** - * 角色授权 - */ - String ROLE_AUTH = "role::auth:"; - String ROLE_USER = "role::user:"; - /** - * 角色信息 - */ - String ROLE_ID = "role::id:"; - /** - * 部门 - */ - String DEPT_ID = "dept::id:"; - /** - * 岗位 - */ - String JOB_ID = "job::id:"; - /** - * 数据字典 - */ - String DICT_NAME = "dict::name:"; - /** - * 在线用户 - */ - String ONLINE_USER = "online::token:"; - /** - * 登录验证码 - */ - String CAPTCHA_LOGIN = "captcha::login:"; - /** - * 用户信息 - */ - String USER_INFO = "user::info:"; + + /** + * 用户 + */ + String USER_ID = "user::id:"; + /** + * 数据 + */ + String DATA_USER = "data::user:"; + /** + * 菜单 + */ + String MENU_ID = "menu::id:"; + String MENU_USER = "menu::user:"; + /** + * 角色授权 + */ + String ROLE_AUTH = "role::auth:"; + String ROLE_USER = "role::user:"; + /** + * 角色信息 + */ + String ROLE_ID = "role::id:"; + /** + * 部门 + */ + String DEPT_ID = "dept::id:"; + /** + * 岗位 + */ + String JOB_ID = "job::id:"; + /** + * 数据字典 + */ + String DICT_NAME = "dict::name:"; + /** + * 在线用户 + */ + String ONLINE_USER = "online::token:"; + /** + * 登录验证码 + */ + String CAPTCHA_LOGIN = "captcha::login:"; + /** + * 用户信息 + */ + String USER_INFO = "user::info:"; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java index 05f46060..e8eb9240 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemRedisKey.java @@ -4,50 +4,51 @@ package cn.odboy.system.dal.redis; * 关于缓存的Key集合 */ public interface SystemRedisKey { - /** - * 用户 - */ - String USER_ID = "user::id:"; - /** - * 数据 - */ - String DATA_USER = "data::user:"; - /** - * 菜单 - */ - String MENU_ID = "menu::id:"; - String MENU_USER = "menu::user:"; - /** - * 角色授权 - */ - String ROLE_AUTH = "role::auth:"; - String ROLE_USER = "role::user:"; - /** - * 角色信息 - */ - String ROLE_ID = "role::id:"; - /** - * 部门 - */ - String DEPT_ID = "dept::id:"; - /** - * 岗位 - */ - String JOB_ID = "job::id:"; - /** - * 数据字典 - */ - String DICT_NAME = "dict::name:"; - /** - * 在线用户 - */ - String ONLINE_USER = "online::token:"; - /** - * 登录验证码 - */ - String CAPTCHA_LOGIN = "captcha::login:"; - /** - * 用户信息 - */ - String USER_INFO = "user::info:"; + + /** + * 用户 + */ + String USER_ID = "user::id:"; + /** + * 数据 + */ + String DATA_USER = "data::user:"; + /** + * 菜单 + */ + String MENU_ID = "menu::id:"; + String MENU_USER = "menu::user:"; + /** + * 角色授权 + */ + String ROLE_AUTH = "role::auth:"; + String ROLE_USER = "role::user:"; + /** + * 角色信息 + */ + String ROLE_ID = "role::id:"; + /** + * 部门 + */ + String DEPT_ID = "dept::id:"; + /** + * 岗位 + */ + String JOB_ID = "job::id:"; + /** + * 数据字典 + */ + String DICT_NAME = "dict::name:"; + /** + * 在线用户 + */ + String ONLINE_USER = "online::token:"; + /** + * 登录验证码 + */ + String CAPTCHA_LOGIN = "captcha::login:"; + /** + * 用户信息 + */ + String USER_INFO = "user::info:"; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java index a2e40f5e..aea97b10 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserInfoDAO.java @@ -13,46 +13,48 @@ import org.springframework.stereotype.Component; */ @Component public class SystemUserInfoDAO { - @Autowired private KitRedisHelper redisHelper; - /** - * 添加缓存到Redis - * - * @param userName 用户名 - */ - @Async - public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { - if (StrUtil.isNotEmpty(userName)) { - // 添加数据, 避免数据同时过期(2小时左右) - long time = 7200 + RandomUtil.randomInt(900, 1800); - redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); - } - } + @Autowired + private KitRedisHelper redisHelper; - /** - * 清理用户缓存信息 用户信息变更时 - * - * @param userName 用户名 - */ - @Async - public void deleteUserLoginInfoByUserName(String userName) { - if (StrUtil.isNotEmpty(userName)) { - // 清除数据 - redisHelper.del(SystemRedisKey.USER_INFO + userName); - } + /** + * 添加缓存到Redis + * + * @param userName 用户名 + */ + @Async + public void saveUserLoginInfoByUserName(String userName, SystemUserJwtVo user) { + if (StrUtil.isNotEmpty(userName)) { + // 添加数据, 避免数据同时过期(2小时左右) + long time = 7200 + RandomUtil.randomInt(900, 1800); + redisHelper.set(SystemRedisKey.USER_INFO + userName, user, time); } + } - /** - * 返回用户缓存 - * - * @param username 用户名 - * @return UserJwtVo - */ - public SystemUserJwtVo getUserLoginInfoByUserName(String username) { - if (StrUtil.isNotEmpty(username)) { - // 获取数据 - return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); - } - return null; + /** + * 清理用户缓存信息 用户信息变更时 + * + * @param userName 用户名 + */ + @Async + public void deleteUserLoginInfoByUserName(String userName) { + if (StrUtil.isNotEmpty(userName)) { + // 清除数据 + redisHelper.del(SystemRedisKey.USER_INFO + userName); } + } + + /** + * 返回用户缓存 + * + * @param username 用户名 + * @return UserJwtVo + */ + public SystemUserJwtVo getUserLoginInfoByUserName(String username) { + if (StrUtil.isNotEmpty(username)) { + // 获取数据 + return redisHelper.get(SystemRedisKey.USER_INFO + username, SystemUserJwtVo.class); + } + return null; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java index 95b2c4f7..63af4ff4 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/dal/redis/SystemUserOnlineInfoDAO.java @@ -31,129 +31,130 @@ import org.springframework.stereotype.Component; @Component @AllArgsConstructor public class SystemUserOnlineInfoDAO { - private final AppProperties properties; - private final TokenProvider tokenProvider; - private final KitRedisHelper redisHelper; - /** - * 保存在线用户信息 - * - * @param userJwtVo / - * @param token / - * @param request / - */ - public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { - String dept = userJwtVo.getUser().getDept().getName(); - String ip = KitBrowserUtil.getIp(request); - String id = tokenProvider.getId(token); - String version = KitBrowserUtil.getVersion(request); - String address = KitIPUtil.getCityInfo(ip); - SystemUserOnlineVo userOnlineVo = null; - try { - userOnlineVo = new SystemUserOnlineVo(); - userOnlineVo.setUid(id); - userOnlineVo.setUserName(userJwtVo.getUsername()); - userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); - userOnlineVo.setDept(dept); - userOnlineVo.setBrowser(version); - userOnlineVo.setIp(ip); - userOnlineVo.setAddress(address); - userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); - userOnlineVo.setLoginTime(new Date()); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - String loginKey = tokenProvider.loginKey(token); - redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); - } + private final AppProperties properties; + private final TokenProvider tokenProvider; + private final KitRedisHelper redisHelper; - /** - * 退出登录 - * - * @param token / - */ - public void logoutByToken(String token) { - String loginKey = tokenProvider.loginKey(token); - redisHelper.del(loginKey); + /** + * 保存在线用户信息 + * + * @param userJwtVo / + * @param token / + * @param request / + */ + public void saveUserJwtModelByToken(SystemUserJwtVo userJwtVo, String token, HttpServletRequest request) { + String dept = userJwtVo.getUser().getDept().getName(); + String ip = KitBrowserUtil.getIp(request); + String id = tokenProvider.getId(token); + String version = KitBrowserUtil.getVersion(request); + String address = KitIPUtil.getCityInfo(ip); + SystemUserOnlineVo userOnlineVo = null; + try { + userOnlineVo = new SystemUserOnlineVo(); + userOnlineVo.setUid(id); + userOnlineVo.setUserName(userJwtVo.getUsername()); + userOnlineVo.setNickName(userJwtVo.getUser().getNickName()); + userOnlineVo.setDept(dept); + userOnlineVo.setBrowser(version); + userOnlineVo.setIp(ip); + userOnlineVo.setAddress(address); + userOnlineVo.setKey(KitDesEncryptUtil.desEncrypt(token)); + userOnlineVo.setLoginTime(new Date()); + } catch (Exception e) { + log.error(e.getMessage(), e); } + String loginKey = tokenProvider.loginKey(token); + redisHelper.set(loginKey, userOnlineVo, properties.getJwt().getTokenValidityInSeconds(), TimeUnit.MILLISECONDS); + } - /** - * 导出 - * - * @param all / - * @param response / - * @throws IOException / - */ - public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemUserOnlineVo user : all) { - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUserName()); - map.put("部门", user.getDept()); - map.put("登录IP", user.getIp()); - map.put("登录地点", user.getAddress()); - map.put("浏览器", user.getBrowser()); - map.put("登录日期", user.getLoginTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + /** + * 退出登录 + * + * @param token / + */ + public void logoutByToken(String token) { + String loginKey = tokenProvider.loginKey(token); + redisHelper.del(loginKey); + } - /** - * 根据用户名强退用户 - * - * @param username / - */ - public void kickOutByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; - redisHelper.scanDel(loginKey); + /** + * 导出 + * + * @param all / + * @param response / + * @throws IOException / + */ + public void downloadUserOnlineModelExcel(List all, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemUserOnlineVo user : all) { + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUserName()); + map.put("部门", user.getDept()); + map.put("登录IP", user.getIp()); + map.put("登录地点", user.getAddress()); + map.put("浏览器", user.getBrowser()); + map.put("登录日期", user.getLoginTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param onlineVo / - * @param pageable / - * @return / - */ - public KitPageResult queryUserOnlineModelPage(SystemUserOnlineVo onlineVo, - IPage pageable) { - String username = null; - if (onlineVo != null) { - username = onlineVo.getUserName(); - } - List onlineUserList = queryUserOnlineModelListByUsername(username); - List paging = - KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); - return KitPageUtil.toPage(paging, onlineUserList.size()); - } + /** + * 根据用户名强退用户 + * + * @param username / + */ + public void kickOutByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + username + "*"; + redisHelper.scanDel(loginKey); + } - /** - * 查询全部数据,不分页 - * - * @param username / - * @return / - */ - public List queryUserOnlineModelListByUsername(String username) { - String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); - List keys = redisHelper.scan(loginKey + "*"); - Collections.reverse(keys); - List onlineUserList = new ArrayList<>(); - for (String key : keys) { - onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); - } - onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); - return onlineUserList; + /** + * 查询全部数据 + * + * @param onlineVo / + * @param pageable / + * @return / + */ + public KitPageResult queryUserOnlineModelPage(SystemUserOnlineVo onlineVo, + IPage pageable) { + String username = null; + if (onlineVo != null) { + username = onlineVo.getUserName(); } + List onlineUserList = queryUserOnlineModelListByUsername(username); + List paging = + KitPageUtil.softPaging(pageable.getCurrent(), pageable.getSize(), onlineUserList); + return KitPageUtil.toPage(paging, onlineUserList.size()); + } - /** - * 查询用户 - * - * @param key / - * @return / - */ - public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { - return redisHelper.get(key, SystemUserOnlineVo.class); + /** + * 查询全部数据,不分页 + * + * @param username / + * @return / + */ + public List queryUserOnlineModelListByUsername(String username) { + String loginKey = SystemRedisKey.ONLINE_USER + (StrUtil.isBlank(username) ? "" : "*" + username); + List keys = redisHelper.scan(loginKey + "*"); + Collections.reverse(keys); + List onlineUserList = new ArrayList<>(); + for (String key : keys) { + onlineUserList.add(redisHelper.get(key, SystemUserOnlineVo.class)); } + onlineUserList.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime())); + return onlineUserList; + } + + /** + * 查询用户 + * + * @param key / + * @return / + */ + public SystemUserOnlineVo queryUserOnlineModelByKey(String key) { + return redisHelper.get(key, SystemUserOnlineVo.class); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java index d757a867..300e717f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLock.java @@ -34,24 +34,29 @@ import java.util.concurrent.TimeUnit; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface BizLock { - /** - * 业务名称 - */ - String bizName() default ""; - /** - * 锁key,支持SpEL表达式 示例: #user.id - 获取参数user的id属性 #p0 - 获取第一个参数 #root.methodName - 获取方法名 - */ - String key() default ""; - /** - * 锁持有时间(秒),默认60秒。锁的持有时间,超过这个时间锁会自动释放 - */ - long leaseTime() default 60; - /** - * 时间单位,默认为秒 - */ - TimeUnit timeUnit() default TimeUnit.SECONDS; - /** - * 获取锁失败后的异常信息 - */ - String errorMessage() default "操作太繁忙,请稍后再试"; + + /** + * 业务名称 + */ + String bizName() default ""; + + /** + * 锁key,支持SpEL表达式 示例: #user.id - 获取参数user的id属性 #p0 - 获取第一个参数 #root.methodName - 获取方法名 + */ + String key() default ""; + + /** + * 锁持有时间(秒),默认60秒。锁的持有时间,超过这个时间锁会自动释放 + */ + long leaseTime() default 60; + + /** + * 时间单位,默认为秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 获取锁失败后的异常信息 + */ + String errorMessage() default "操作太繁忙,请稍后再试"; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java index 3c2df924..cf82ccec 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/bizlock/BizLockAspect.java @@ -31,55 +31,56 @@ import org.springframework.stereotype.Component; @Aspect @Component public class BizLockAspect { - private final KitRedisHelper redisHelper; - private final ExpressionParser parser = new SpelExpressionParser(); - public BizLockAspect(KitRedisHelper redisHelper) { - this.redisHelper = redisHelper; - } + private final KitRedisHelper redisHelper; + private final ExpressionParser parser = new SpelExpressionParser(); - @Around("@annotation(bizLock)") - public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { - // 解析SpEL表达式生成最终的lockKey - String lockKey = parseLockKey(joinPoint, bizLock); - Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); - if (success == null || !success) { - throw new BadRequestException(bizLock.errorMessage()); - } - try { - return joinPoint.proceed(); - } catch (Exception e) { - throw e; - } finally { - redisHelper.del(lockKey); - } - } + public BizLockAspect(KitRedisHelper redisHelper) { + this.redisHelper = redisHelper; + } - private String parseLockKey(ProceedingJoinPoint joinPoint, BizLock bizLock) { - // 如果key为空,使用默认格式: bizName:方法名 - if (bizLock.key().isEmpty()) { - return String.format("%s:%s", bizLock.bizName(), - ((MethodSignature)joinPoint.getSignature()).getMethod().getName()); - } - // 解析SpEL表达式 - MethodSignature signature = (MethodSignature)joinPoint.getSignature(); - Method method = signature.getMethod(); - // 创建SpEL上下文 - StandardEvaluationContext context = new StandardEvaluationContext(); - // 设置方法参数 - String[] parameterNames = signature.getParameterNames(); - Object[] args = joinPoint.getArgs(); - for (int i = 0; i < parameterNames.length; i++) { - context.setVariable(parameterNames[i], args[i]); - context.setVariable("p" + i, args[i]); // 支持#p0,#p1格式 - } - // 设置方法相关信息 - context.setVariable("methodName", method.getName()); - context.setVariable("targetClass", joinPoint.getTarget().getClass().getName()); - // 解析表达式 - Expression expression = parser.parseExpression(bizLock.key()); - String value = expression.getValue(context, String.class); - // 组合最终的key: bizName:解析后的key - return String.format("%s:%s", bizLock.bizName(), value); + @Around("@annotation(bizLock)") + public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { + // 解析SpEL表达式生成最终的lockKey + String lockKey = parseLockKey(joinPoint, bizLock); + Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); + if (success == null || !success) { + throw new BadRequestException(bizLock.errorMessage()); } + try { + return joinPoint.proceed(); + } catch (Exception e) { + throw e; + } finally { + redisHelper.del(lockKey); + } + } + + private String parseLockKey(ProceedingJoinPoint joinPoint, BizLock bizLock) { + // 如果key为空,使用默认格式: bizName:方法名 + if (bizLock.key().isEmpty()) { + return String.format("%s:%s", bizLock.bizName(), + ((MethodSignature) joinPoint.getSignature()).getMethod().getName()); + } + // 解析SpEL表达式 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + // 创建SpEL上下文 + StandardEvaluationContext context = new StandardEvaluationContext(); + // 设置方法参数 + String[] parameterNames = signature.getParameterNames(); + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < parameterNames.length; i++) { + context.setVariable(parameterNames[i], args[i]); + context.setVariable("p" + i, args[i]); // 支持#p0,#p1格式 + } + // 设置方法相关信息 + context.setVariable("methodName", method.getName()); + context.setVariable("targetClass", joinPoint.getTarget().getClass().getName()); + // 解析表达式 + Expression expression = parser.parseExpression(bizLock.key()); + String value = expression.getValue(context, String.class); + // 组合最终的key: bizName:解析后的key + return String.format("%s:%s", bizLock.bizName(), value); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java index b7e8e053..00ab730a 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/mybatisplus/MpMetaObjectHandler.java @@ -16,7 +16,7 @@ package cn.odboy.system.framework.mybatisplus; import cn.hutool.core.date.DateTime; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import java.util.Date; import org.apache.ibatis.reflection.MetaObject; @@ -24,32 +24,33 @@ import org.springframework.stereotype.Component; @Component public class MpMetaObjectHandler implements MetaObjectHandler { - @Override - public void insertFill(MetaObject metaObject) { - DateTime now = DateTime.now(); - /* 创建时间 */ - this.strictInsertFill(metaObject, "createTime", Date.class, now); - this.strictInsertFill(metaObject, "updateTime", Date.class, now); - /* 操作人 */ - String username = "System"; - try { - username = CsSecurityHelper.getCurrentUsername(); - } catch (Exception ignored) { - } - this.strictInsertFill(metaObject, "createBy", String.class, username); - this.strictInsertFill(metaObject, "updateBy", String.class, username); - } - @Override - public void updateFill(MetaObject metaObject) { - /* 更新时间 */ - this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now()); - /* 操作人 */ - String username = "System"; - try { - username = CsSecurityHelper.getCurrentUsername(); - } catch (Exception ignored) { - } - this.strictUpdateFill(metaObject, "updateBy", String.class, username); + @Override + public void insertFill(MetaObject metaObject) { + DateTime now = DateTime.now(); + /* 创建时间 */ + this.strictInsertFill(metaObject, "createTime", Date.class, now); + this.strictInsertFill(metaObject, "updateTime", Date.class, now); + /* 操作人 */ + String username = "System"; + try { + username = KitSecurityHelper.getCurrentUsername(); + } catch (Exception ignored) { } + this.strictInsertFill(metaObject, "createBy", String.class, username); + this.strictInsertFill(metaObject, "updateBy", String.class, username); + } + + @Override + public void updateFill(MetaObject metaObject) { + /* 更新时间 */ + this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now()); + /* 操作人 */ + String username = "System"; + try { + username = KitSecurityHelper.getCurrentUsername(); + } catch (Exception ignored) { + } + this.strictUpdateFill(metaObject, "updateBy", String.class, username); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java index 98891f89..40513b15 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLog.java @@ -33,5 +33,6 @@ import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface OperationLog { - String bizName() default ""; + + String bizName() default ""; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java index 609c431b..66245aee 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/OperationLogAspect.java @@ -22,7 +22,7 @@ import cn.hutool.core.util.StrUtil; import cn.odboy.framework.context.KitRequestHolder; import cn.odboy.system.dal.dataobject.SystemOperationLogTb; import cn.odboy.system.dal.mysql.SystemOperationLogMapper; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBrowserUtil; import cn.odboy.util.KitIPUtil; import com.alibaba.fastjson2.JSON; @@ -47,72 +47,74 @@ import org.springframework.stereotype.Component; @Aspect @Component public class OperationLogAspect { - @Autowired private SystemOperationLogMapper systemOperationLogMapper; - @Around("@annotation(operationLog)") - public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { - return handleLog(joinPoint, operationLog); - } + @Autowired + private SystemOperationLogMapper systemOperationLogMapper; - private Object handleLog(ProceedingJoinPoint joinPoint, OperationLog annotation) throws Throwable { - TimeInterval timeInterval = new TimeInterval(); + @Around("@annotation(operationLog)") + public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { + return handleLog(joinPoint, operationLog); + } + + private Object handleLog(ProceedingJoinPoint joinPoint, OperationLog annotation) throws Throwable { + TimeInterval timeInterval = new TimeInterval(); + try { + Object result = joinPoint.proceed(); + SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); + ThreadUtil.execAsync(() -> { try { - Object result = joinPoint.proceed(); - SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); - ThreadUtil.execAsync(() -> { - try { - systemOperationLogMapper.insert(record); - } catch (Exception e) { - // 忽略 - } - }); - return result; - } catch (Throwable exception) { - SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); - record.setExceptionDetail(ExceptionUtil.stacktraceToString(exception)); - ThreadUtil.execAsync(() -> { - try { - systemOperationLogMapper.insert(record); - } catch (Exception e) { - // 忽略 - } - }); - throw exception; + systemOperationLogMapper.insert(record); + } catch (Exception e) { + // 忽略 } + }); + return result; + } catch (Throwable exception) { + SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); + record.setExceptionDetail(ExceptionUtil.stacktraceToString(exception)); + ThreadUtil.execAsync(() -> { + try { + systemOperationLogMapper.insert(record); + } catch (Exception e) { + // 忽略 + } + }); + throw exception; } + } - private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, - TimeInterval timeInterval) { - long executeTime = timeInterval.intervalMs(); - MethodSignature signature = (MethodSignature)joinPoint.getSignature(); - String bizName = annotation.bizName(); - if (StrUtil.isBlank(bizName)) { - Method method = signature.getMethod(); - ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); - if (apiOperation != null) { - bizName = apiOperation.value(); - } - } - if (StrUtil.isBlank(bizName)) { - bizName = "默认业务"; - } - String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; - Object[] args = joinPoint.getArgs(); - String params = JSON.toJSONString(args); - HttpServletRequest request = KitRequestHolder.getHttpServletRequest(); - String requestIp = KitBrowserUtil.getIp(request); - String browserInfo = KitBrowserUtil.getVersion(request); - String address = KitIPUtil.getCityInfo(requestIp); - String username = CsSecurityHelper.getCurrentUsername(); - SystemOperationLogTb record = new SystemOperationLogTb(); - record.setBizName(bizName); - record.setMethod(method); - record.setParams(params); - record.setRequestIp(requestIp); - record.setExecuteTime(executeTime); - record.setUsername(username); - record.setAddress(address); - record.setBrowserInfo(browserInfo); - return record; + private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, + TimeInterval timeInterval) { + long executeTime = timeInterval.intervalMs(); + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + String bizName = annotation.bizName(); + if (StrUtil.isBlank(bizName)) { + Method method = signature.getMethod(); + ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); + if (apiOperation != null) { + bizName = apiOperation.value(); + } } + if (StrUtil.isBlank(bizName)) { + bizName = "默认业务"; + } + String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; + Object[] args = joinPoint.getArgs(); + String params = JSON.toJSONString(args); + HttpServletRequest request = KitRequestHolder.getHttpServletRequest(); + String requestIp = KitBrowserUtil.getIp(request); + String browserInfo = KitBrowserUtil.getVersion(request); + String address = KitIPUtil.getCityInfo(requestIp); + String username = KitSecurityHelper.getCurrentUsername(); + SystemOperationLogTb record = new SystemOperationLogTb(); + record.setBizName(bizName); + record.setMethod(method); + record.setParams(params); + record.setRequestIp(requestIp); + record.setExecuteTime(executeTime); + record.setUsername(username); + record.setAddress(address); + record.setBrowserInfo(browserInfo); + return record; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java index 21cfbdaf..f5327ab0 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/annotaions/OperationLog.java @@ -33,5 +33,6 @@ import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface OperationLog { - String bizName() default ""; + + String bizName() default ""; } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java index 4d6ba8a6..3651422f 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/operalog/core/SystemOperationLogAspect.java @@ -23,7 +23,7 @@ import cn.odboy.framework.context.KitRequestHolder; import cn.odboy.system.dal.dataobject.SystemOperationLogTb; import cn.odboy.system.dal.mysql.SystemOperationLogMapper; import cn.odboy.system.framework.operalog.annotaions.OperationLog; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitBrowserUtil; import cn.odboy.util.KitIPUtil; import com.alibaba.fastjson2.JSON; @@ -48,74 +48,76 @@ import org.springframework.stereotype.Component; @Aspect @Component public class SystemOperationLogAspect { - @Autowired private SystemOperationLogMapper systemOperationLogMapper; - @Around("@annotation(operationLog)") - public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { - return handleLog(joinPoint, operationLog); - } + @Autowired + private SystemOperationLogMapper systemOperationLogMapper; - private Object handleLog(ProceedingJoinPoint joinPoint, OperationLog annotation) throws Throwable { - TimeInterval timeInterval = new TimeInterval(); + @Around("@annotation(operationLog)") + public Object operationLogCatch(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable { + return handleLog(joinPoint, operationLog); + } + + private Object handleLog(ProceedingJoinPoint joinPoint, OperationLog annotation) throws Throwable { + TimeInterval timeInterval = new TimeInterval(); + try { + Object result = joinPoint.proceed(); + SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); + ThreadUtil.execAsync(() -> { try { - Object result = joinPoint.proceed(); - SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); - ThreadUtil.execAsync(() -> { - try { - systemOperationLogMapper.insert(record); - } catch (Exception e) { - // log.error("保存审计日志失败", e); - // 忽略 - } - }); - return result; - } catch (Throwable exception) { - SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); - record.setExceptionDetail(ExceptionUtil.stacktraceToString(exception)); - ThreadUtil.execAsync(() -> { - try { - systemOperationLogMapper.insert(record); - } catch (Exception e) { - // log.error("保存审计日志失败", e); - // 忽略 - } - }); - throw exception; + systemOperationLogMapper.insert(record); + } catch (Exception e) { + // log.error("保存审计日志失败", e); + // 忽略 } + }); + return result; + } catch (Throwable exception) { + SystemOperationLogTb record = getOperationLogTb(joinPoint, annotation, timeInterval); + record.setExceptionDetail(ExceptionUtil.stacktraceToString(exception)); + ThreadUtil.execAsync(() -> { + try { + systemOperationLogMapper.insert(record); + } catch (Exception e) { + // log.error("保存审计日志失败", e); + // 忽略 + } + }); + throw exception; } + } - private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, - TimeInterval timeInterval) { - long executeTime = timeInterval.intervalMs(); - MethodSignature signature = (MethodSignature)joinPoint.getSignature(); - String bizName = annotation.bizName(); - if (StrUtil.isBlank(bizName)) { - Method method = signature.getMethod(); - ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); - if (apiOperation != null) { - bizName = apiOperation.value(); - } - } - if (StrUtil.isBlank(bizName)) { - bizName = "默认业务"; - } - String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; - Object[] args = joinPoint.getArgs(); - String params = JSON.toJSONString(args); - HttpServletRequest request = KitRequestHolder.getHttpServletRequest(); - String requestIp = KitBrowserUtil.getIp(request); - String browserInfo = KitBrowserUtil.getVersion(request); - String address = KitIPUtil.getCityInfo(requestIp); - String username = CsSecurityHelper.getCurrentUsername(); - SystemOperationLogTb record = new SystemOperationLogTb(); - record.setBizName(bizName); - record.setMethod(method); - record.setParams(params); - record.setRequestIp(requestIp); - record.setExecuteTime(executeTime); - record.setUsername(username); - record.setAddress(address); - record.setBrowserInfo(browserInfo); - return record; + private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, + TimeInterval timeInterval) { + long executeTime = timeInterval.intervalMs(); + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + String bizName = annotation.bizName(); + if (StrUtil.isBlank(bizName)) { + Method method = signature.getMethod(); + ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); + if (apiOperation != null) { + bizName = apiOperation.value(); + } } + if (StrUtil.isBlank(bizName)) { + bizName = "默认业务"; + } + String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; + Object[] args = joinPoint.getArgs(); + String params = JSON.toJSONString(args); + HttpServletRequest request = KitRequestHolder.getHttpServletRequest(); + String requestIp = KitBrowserUtil.getIp(request); + String browserInfo = KitBrowserUtil.getVersion(request); + String address = KitIPUtil.getCityInfo(requestIp); + String username = KitSecurityHelper.getCurrentUsername(); + SystemOperationLogTb record = new SystemOperationLogTb(); + record.setBizName(bizName); + record.setMethod(method); + record.setParams(params); + record.setRequestIp(requestIp); + record.setExecuteTime(executeTime); + record.setUsername(username); + record.setAddress(address); + record.setBrowserInfo(browserInfo); + return record; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java index 057f34b4..3807a828 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/AuthorityConfig.java @@ -15,7 +15,7 @@ */ package cn.odboy.system.framework.permission.config; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -24,18 +24,19 @@ import org.springframework.stereotype.Service; @Service(value = "el") public class AuthorityConfig { - /** - * 判断接口是否有权限 - * - * @param permissions 权限 - * @return / - */ - public Boolean check(String... permissions) { - // 获取当前用户的所有权限 - List roleList = - CsSecurityHelper.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority) - .collect(Collectors.toList()); - // 判断当前用户的所有权限是否包含接口上定义的权限 - return roleList.contains("admin") || Arrays.stream(permissions).anyMatch(roleList::contains); - } + + /** + * 判断接口是否有权限 + * + * @param permissions 权限 + * @return / + */ + public Boolean check(String... permissions) { + // 获取当前用户的所有权限 + List roleList = + KitSecurityHelper.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority) + .collect(Collectors.toList()); + // 判断当前用户的所有权限是否包含接口上定义的权限 + return roleList.contains("admin") || Arrays.stream(permissions).anyMatch(roleList::contains); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java index 0ba1e47a..d416582d 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/SpringSecurityConfig.java @@ -40,73 +40,80 @@ import org.springframework.web.filter.CorsFilter; @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SpringSecurityConfig { - @Autowired private TokenProvider tokenProvider; - @Autowired private CorsFilter corsFilter; - @Autowired private JwtAuthenticationEntryPoint authenticationErrorHandler; - @Autowired private JwtAccessDeniedHandler jwtAccessDeniedHandler; - @Autowired private ApplicationContext applicationContext; - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Bean - public GrantedAuthorityDefaults grantedAuthorityDefaults() { - // 去除 ROLE_ 前缀 - return new GrantedAuthorityDefaults(""); - } + @Autowired + private TokenProvider tokenProvider; + @Autowired + private CorsFilter corsFilter; + @Autowired + private JwtAuthenticationEntryPoint authenticationErrorHandler; + @Autowired + private JwtAccessDeniedHandler jwtAccessDeniedHandler; + @Autowired + private ApplicationContext applicationContext; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Bean - public PasswordEncoder passwordEncoder() { - // 密码加密方式 - return new BCryptPasswordEncoder(); - } + @Bean + public GrantedAuthorityDefaults grantedAuthorityDefaults() { + // 去除 ROLE_ 前缀 + return new GrantedAuthorityDefaults(""); + } - @Bean - protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - // 获取匿名标记 - Map> anonymousUrls = KitAnonTagUtil.getAnonymousUrl(applicationContext); - return httpSecurity - // 禁用 CSRF - .csrf().disable().addFilter(corsFilter) - // 授权异常 - .exceptionHandling().authenticationEntryPoint(authenticationErrorHandler) - .accessDeniedHandler(jwtAccessDeniedHandler) - // 防止iframe 造成跨域 - .and().headers().frameOptions().disable() - // 不创建会话 - .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests() - // 静态资源等等 - .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/websocket/**").permitAll() - // swagger 文档 - .antMatchers("/swagger-ui.html").permitAll().antMatchers("/swagger-resources/**").permitAll() - .antMatchers("/webjars/**").permitAll().antMatchers("/*/api-docs").permitAll() - // 文件 - .antMatchers("/avatar/**").permitAll().antMatchers("/file/**").permitAll() - // 阿里巴巴 druid - .antMatchers("/druid/**").permitAll() - // 放行OPTIONS请求 - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - // 自定义匿名访问所有url放行:允许匿名和带Token访问,细腻化到每个 Request 类型 - // GET - .antMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])) - .permitAll() - // POST - .antMatchers(HttpMethod.POST, anonymousUrls.get(RequestMethodEnum.POST.getType()).toArray(new String[0])) - .permitAll() - // PUT - .antMatchers(HttpMethod.PUT, anonymousUrls.get(RequestMethodEnum.PUT.getType()).toArray(new String[0])) - .permitAll() - // PATCH - .antMatchers(HttpMethod.PATCH, anonymousUrls.get(RequestMethodEnum.PATCH.getType()).toArray(new String[0])) - .permitAll() - // DELETE - .antMatchers(HttpMethod.DELETE, - anonymousUrls.get(RequestMethodEnum.DELETE.getType()).toArray(new String[0])).permitAll() - // 所有类型的接口都放行 - .antMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll() - // 所有请求都需要认证 - .anyRequest().authenticated().and().apply(securityConfigurerAdapter()).and().build(); - } + @Bean + public PasswordEncoder passwordEncoder() { + // 密码加密方式 + return new BCryptPasswordEncoder(); + } - private TokenConfigurer securityConfigurerAdapter() { - return new TokenConfigurer(tokenProvider, systemUserOnlineInfoDAO); - } + @Bean + protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + // 获取匿名标记 + Map> anonymousUrls = KitAnonTagUtil.getAnonymousUrl(applicationContext); + return httpSecurity + // 禁用 CSRF + .csrf().disable().addFilter(corsFilter) + // 授权异常 + .exceptionHandling().authenticationEntryPoint(authenticationErrorHandler) + .accessDeniedHandler(jwtAccessDeniedHandler) + // 防止iframe 造成跨域 + .and().headers().frameOptions().disable() + // 不创建会话 + .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests() + // 静态资源等等 + .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/websocket/**").permitAll() + // swagger 文档 + .antMatchers("/swagger-ui.html").permitAll().antMatchers("/swagger-resources/**").permitAll() + .antMatchers("/webjars/**").permitAll().antMatchers("/*/api-docs").permitAll() + // 文件 + .antMatchers("/avatar/**").permitAll().antMatchers("/file/**").permitAll() + // 阿里巴巴 druid + .antMatchers("/druid/**").permitAll() + // 放行OPTIONS请求 + .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() + // 自定义匿名访问所有url放行:允许匿名和带Token访问,细腻化到每个 Request 类型 + // GET + .antMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])) + .permitAll() + // POST + .antMatchers(HttpMethod.POST, anonymousUrls.get(RequestMethodEnum.POST.getType()).toArray(new String[0])) + .permitAll() + // PUT + .antMatchers(HttpMethod.PUT, anonymousUrls.get(RequestMethodEnum.PUT.getType()).toArray(new String[0])) + .permitAll() + // PATCH + .antMatchers(HttpMethod.PATCH, anonymousUrls.get(RequestMethodEnum.PATCH.getType()).toArray(new String[0])) + .permitAll() + // DELETE + .antMatchers(HttpMethod.DELETE, + anonymousUrls.get(RequestMethodEnum.DELETE.getType()).toArray(new String[0])).permitAll() + // 所有类型的接口都放行 + .antMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll() + // 所有请求都需要认证 + .anyRequest().authenticated().and().apply(securityConfigurerAdapter()).and().build(); + } + + private TokenConfigurer securityConfigurerAdapter() { + return new TokenConfigurer(tokenProvider, systemUserOnlineInfoDAO); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/TokenConfigurer.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/TokenConfigurer.java index dc5997b1..06c9183e 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/TokenConfigurer.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/config/TokenConfigurer.java @@ -24,17 +24,18 @@ import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; public class TokenConfigurer extends SecurityConfigurerAdapter { - private final TokenProvider tokenProvider; - private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - public TokenConfigurer(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) { - this.tokenProvider = tokenProvider; - this.systemUserOnlineInfoDAO = systemUserOnlineInfoDAO; - } + private final TokenProvider tokenProvider; + private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Override - public void configure(HttpSecurity http) { - TokenFilter customFilter = new TokenFilter(tokenProvider, systemUserOnlineInfoDAO); - http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); - } + public TokenConfigurer(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) { + this.tokenProvider = tokenProvider; + this.systemUserOnlineInfoDAO = systemUserOnlineInfoDAO; + } + + @Override + public void configure(HttpSecurity http) { + TokenFilter customFilter = new TokenFilter(tokenProvider, systemUserOnlineInfoDAO); + http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/CsSecurityHelper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/CsSecurityHelper.java deleted file mode 100644 index b74f602d..00000000 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/CsSecurityHelper.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2021-2025 Odboy - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.odboy.system.framework.permission.core; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.jwt.JWT; -import cn.hutool.jwt.JWTUtil; -import cn.odboy.constant.SystemConst; -import cn.odboy.framework.context.KitSpringBeanHolder; -import cn.odboy.system.constant.SystemDataScopeEnum; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; -import java.util.List; -import java.util.Objects; -import javax.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * 获取当前登录的用户 - */ -@Slf4j -@Component -public class CsSecurityHelper { - /** - * 获取当前登录的用户 - * - * @return UserDetails - */ - public static UserDetails getCurrentUser() { - UserDetailsService userDetailsService = KitSpringBeanHolder.getBean(UserDetailsService.class); - return userDetailsService.loadUserByUsername(getCurrentUsername()); - } - - /** - * 获取当前用户的数据权限 - * - * @return / - */ - public static List getCurrentUserDataScope() { - UserDetails userDetails = getCurrentUser(); - // 将 Java 对象转换为 JSONObject 对象 - JSONObject jsonObject = (JSONObject)JSON.toJSON(userDetails); - JSONArray jsonArray = jsonObject.getJSONArray("dataScopes"); - return JSON.parseArray(jsonArray.toJSONString(), Long.class); - } - - /** - * 获取数据权限级别 - * - * @return 级别 - */ - public static String getDataScopeType() { - List dataScopes = getCurrentUserDataScope(); - if (CollUtil.isEmpty(dataScopes)) { - return ""; - } - return SystemDataScopeEnum.ALL.getValue(); - } - - /** - * 获取用户ID - * - * @return 系统用户ID - */ - public static Long getCurrentUserId() { - return getCurrentUserId(getToken()); - } - - /** - * 获取用户ID - * - * @return 系统用户ID - */ - public static Long getCurrentUserId(String token) { - JWT jwt = JWTUtil.parseToken(token); - return Long.valueOf(jwt.getPayload("userId").toString()); - } - - /** - * 获取系统用户名称 - * - * @return 系统用户名称 - */ - public static String getCurrentUsername() { - return getCurrentUsername(getToken()); - } - - /** - * 获取系统用户名称 - * - * @return 系统用户名称 - */ - public static String getCurrentUsername(String token) { - JWT jwt = JWTUtil.parseToken(token); - return jwt.getPayload("sub").toString(); - } - - /** - * 获取Token - * - * @return / - */ - public static String getToken() { - HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull( - RequestContextHolder.getRequestAttributes())).getRequest(); - String bearerToken = request.getHeader(SystemConst.HEADER_NAME); - if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { - // 去掉令牌前缀 - return bearerToken.replace(SystemConst.TOKEN_PREFIX, ""); - } else { - log.debug("非法Token:{}", bearerToken); - } - return null; - } -} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java new file mode 100644 index 00000000..7a940c10 --- /dev/null +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/KitSecurityHelper.java @@ -0,0 +1,135 @@ +/* + * Copyright 2021-2025 Odboy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.odboy.system.framework.permission.core; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.jwt.JWT; +import cn.hutool.jwt.JWTUtil; +import cn.odboy.constant.SystemConst; +import cn.odboy.framework.context.KitSpringBeanHolder; +import cn.odboy.system.constant.SystemDataScopeEnum; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import java.util.List; +import java.util.Objects; +import javax.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * 获取当前登录的用户 + */ +@Slf4j +@Component +public class KitSecurityHelper { + + /** + * 获取当前登录的用户 + * + * @return UserDetails + */ + public static UserDetails getCurrentUser() { + UserDetailsService userDetailsService = KitSpringBeanHolder.getBean(UserDetailsService.class); + return userDetailsService.loadUserByUsername(getCurrentUsername()); + } + + /** + * 获取当前用户的数据权限 + * + * @return / + */ + public static List getCurrentUserDataScope() { + UserDetails userDetails = getCurrentUser(); + // 将 Java 对象转换为 JSONObject 对象 + JSONObject jsonObject = (JSONObject) JSON.toJSON(userDetails); + JSONArray jsonArray = jsonObject.getJSONArray("dataScopes"); + return JSON.parseArray(jsonArray.toJSONString(), Long.class); + } + + /** + * 获取数据权限级别 + * + * @return 级别 + */ + public static String getDataScopeType() { + List dataScopes = getCurrentUserDataScope(); + if (CollUtil.isEmpty(dataScopes)) { + return ""; + } + return SystemDataScopeEnum.ALL.getValue(); + } + + /** + * 获取用户ID + * + * @return 系统用户ID + */ + public static Long getCurrentUserId() { + return getCurrentUserId(getToken()); + } + + /** + * 获取用户ID + * + * @return 系统用户ID + */ + public static Long getCurrentUserId(String token) { + JWT jwt = JWTUtil.parseToken(token); + return Long.valueOf(jwt.getPayload("userId").toString()); + } + + /** + * 获取系统用户名称 + * + * @return 系统用户名称 + */ + public static String getCurrentUsername() { + return getCurrentUsername(getToken()); + } + + /** + * 获取系统用户名称 + * + * @return 系统用户名称 + */ + public static String getCurrentUsername(String token) { + JWT jwt = JWTUtil.parseToken(token); + return jwt.getPayload("sub").toString(); + } + + /** + * 获取Token + * + * @return / + */ + public static String getToken() { + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull( + RequestContextHolder.getRequestAttributes())).getRequest(); + String bearerToken = request.getHeader(SystemConst.HEADER_NAME); + if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { + // 去掉令牌前缀 + return bearerToken.replace(SystemConst.TOKEN_PREFIX, ""); + } else { + log.debug("非法Token:{}", bearerToken); + } + return null; + } +} diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java index a47e5869..33da3e77 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAccessDeniedHandler.java @@ -27,15 +27,16 @@ import org.springframework.stereotype.Component; @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { - @Override - public void handle(HttpServletRequest request, HttpServletResponse response, - AccessDeniedException accessDeniedException) throws IOException { - //当用户在没有授权的情况下访问受保护的REST资源时,将调用此方法发送403 Forbidden响应 - response.setStatus(HttpStatus.FORBIDDEN.value()); - response.setContentType("application/json;charset=UTF-8"); - ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString( - ApiError.error(HttpStatus.FORBIDDEN.value(), "禁止访问,您没有权限访问此资源")); - response.getWriter().write(jsonResponse); - } + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException { + //当用户在没有授权的情况下访问受保护的REST资源时,将调用此方法发送403 Forbidden响应 + response.setStatus(HttpStatus.FORBIDDEN.value()); + response.setContentType("application/json;charset=UTF-8"); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString( + ApiError.error(HttpStatus.FORBIDDEN.value(), "禁止访问,您没有权限访问此资源")); + response.getWriter().write(jsonResponse); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java index 8aec275e..e84fbdf2 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/JwtAuthenticationEntryPoint.java @@ -29,16 +29,17 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, - AuthenticationException authException) throws IOException { - // 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应 - int code = HttpStatus.UNAUTHORIZED.value(); - response.setStatus(code); - response.setContentType("application/json;charset=UTF-8"); - ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString( - ApiError.error(HttpStatus.UNAUTHORIZED.value(), "登录状态已过期,请重新登录")); - response.getWriter().write(jsonResponse); - } + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws IOException { + // 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应 + int code = HttpStatus.UNAUTHORIZED.value(); + response.setStatus(code); + response.setContentType("application/json;charset=UTF-8"); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString( + ApiError.error(HttpStatus.UNAUTHORIZED.value(), "登录状态已过期,请重新登录")); + response.getWriter().write(jsonResponse); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java index bd9df8a3..c23efa9d 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenFilter.java @@ -33,54 +33,55 @@ import org.springframework.web.filter.GenericFilterBean; @Slf4j public class TokenFilter extends GenericFilterBean { - private final TokenProvider tokenProvider; - private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - /** - * @param tokenProvider Token - * @param systemUserOnlineInfoDAO 用户在线 - */ - public TokenFilter(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) { - this.systemUserOnlineInfoDAO = systemUserOnlineInfoDAO; - this.tokenProvider = tokenProvider; - } + private final TokenProvider tokenProvider; + private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws ServletException, IOException { - HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; - String token = resolveToken(httpServletRequest); - // 对于 Token 为空的不需要去查 Redis - if (StrUtil.isNotBlank(token)) { - // 获取用户Token的Key - String loginKey = tokenProvider.loginKey(token); - SystemUserOnlineVo userOnlineVo = systemUserOnlineInfoDAO.queryUserOnlineModelByKey(loginKey); - // 判断用户在线信息是否为空 - if (userOnlineVo != null) { - // Token 续期判断 - tokenProvider.checkRenewal(token); - // 获取认证信息,设置上下文 - Authentication authentication = tokenProvider.getAuthentication(token); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - } - filterChain.doFilter(servletRequest, servletResponse); - } + /** + * @param tokenProvider Token + * @param systemUserOnlineInfoDAO 用户在线 + */ + public TokenFilter(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) { + this.systemUserOnlineInfoDAO = systemUserOnlineInfoDAO; + this.tokenProvider = tokenProvider; + } - /** - * 初步检测Token - * - * @param request / - * @return / - */ - private String resolveToken(HttpServletRequest request) { - String bearerToken = request.getHeader(SystemConst.HEADER_NAME); - if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { - // 去掉令牌前缀 - return bearerToken.replace(SystemConst.TOKEN_PREFIX + " ", ""); - } else { - log.debug("非法Token:{}", bearerToken); - } - return null; + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws ServletException, IOException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String token = resolveToken(httpServletRequest); + // 对于 Token 为空的不需要去查 Redis + if (StrUtil.isNotBlank(token)) { + // 获取用户Token的Key + String loginKey = tokenProvider.loginKey(token); + SystemUserOnlineVo userOnlineVo = systemUserOnlineInfoDAO.queryUserOnlineModelByKey(loginKey); + // 判断用户在线信息是否为空 + if (userOnlineVo != null) { + // Token 续期判断 + tokenProvider.checkRenewal(token); + // 获取认证信息,设置上下文 + Authentication authentication = tokenProvider.getAuthentication(token); + SecurityContextHolder.getContext().setAuthentication(authentication); + } } + filterChain.doFilter(servletRequest, servletResponse); + } + + /** + * 初步检测Token + * + * @param request / + * @return / + */ + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(SystemConst.HEADER_NAME); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { + // 去掉令牌前缀 + return bearerToken.replace(SystemConst.TOKEN_PREFIX + " ", ""); + } else { + log.debug("非法Token:{}", bearerToken); + } + return null; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java index 5b90e356..28659cb6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/TokenProvider.java @@ -46,118 +46,121 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TokenProvider implements InitializingBean { - public static final String AUTHORITIES_UUID_KEY = "uid"; - public static final String AUTHORITIES_UID_KEY = "userId"; - @Autowired private KitRedisHelper redisHelper; - @Autowired private AppProperties properties; + + public static final String AUTHORITIES_UUID_KEY = "uid"; + public static final String AUTHORITIES_UID_KEY = "userId"; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; + // 0.11.x版本 + // private Key signingKey; + // 0.12.x版本 + private SecretKey signingKey; + private JwtParser jwtParser; + + @Override + public void afterPropertiesSet() { + // 解码Base64密钥并创建签名密钥 + byte[] keyBytes = Decoders.BASE64.decode(properties.getJwt().getBase64Secret()); + signingKey = Keys.hmacShaKeyFor(keyBytes); // 0.11.x版本 - // private Key signingKey; + // jwtParser = Jwts.parserBuilder() + // // 使用预生成的签名密钥 + // .setSigningKey(signingKey).build(); // 0.12.x版本 - private SecretKey signingKey; - private JwtParser jwtParser; + jwtParser = Jwts.parser().verifyWith(signingKey).build(); + } - @Override - public void afterPropertiesSet() { - // 解码Base64密钥并创建签名密钥 - byte[] keyBytes = Decoders.BASE64.decode(properties.getJwt().getBase64Secret()); - signingKey = Keys.hmacShaKeyFor(keyBytes); - // 0.11.x版本 - // jwtParser = Jwts.parserBuilder() - // // 使用预生成的签名密钥 - // .setSigningKey(signingKey).build(); - // 0.12.x版本 - jwtParser = Jwts.parser().verifyWith(signingKey).build(); - } + /** + * 创建Token 设置永不过期, Token 的时间有效性转到Redis 维护 + * + * @param user / + * @return / + */ + public String createToken(SystemUserJwtVo user) { + // 设置参数 + Map claims = new HashMap<>(6); + // 设置用户ID + claims.put(AUTHORITIES_UID_KEY, user.getUser().getId()); + // 设置UUID,确保每次Token不一样 + claims.put(AUTHORITIES_UUID_KEY, IdUtil.simpleUUID()); + // 0.11.x版本 + // 直接调用 Jwts.builder() 创建新实例Add commentMore actions + // return Jwts.builder() + // // 设置自定义 Claims + // .setClaims(claims) + // // 设置主题 + // .setSubject(user.getUsername()) + // // 使用预生成的签名密钥和算法签名 + // .signWith(signingKey, SignatureAlgorithm.HS512).compact(); + // 0.12.x版本 + return Jwts.builder().claims(claims).subject(user.getUsername()).signWith(signingKey).compact(); + } - /** - * 创建Token 设置永不过期, Token 的时间有效性转到Redis 维护 - * - * @param user / - * @return / - */ - public String createToken(SystemUserJwtVo user) { - // 设置参数 - Map claims = new HashMap<>(6); - // 设置用户ID - claims.put(AUTHORITIES_UID_KEY, user.getUser().getId()); - // 设置UUID,确保每次Token不一样 - claims.put(AUTHORITIES_UUID_KEY, IdUtil.simpleUUID()); - // 0.11.x版本 - // 直接调用 Jwts.builder() 创建新实例Add commentMore actions - // return Jwts.builder() - // // 设置自定义 Claims - // .setClaims(claims) - // // 设置主题 - // .setSubject(user.getUsername()) - // // 使用预生成的签名密钥和算法签名 - // .signWith(signingKey, SignatureAlgorithm.HS512).compact(); - // 0.12.x版本 - return Jwts.builder().claims(claims).subject(user.getUsername()).signWith(signingKey).compact(); - } + /** + * 依据Token 获取鉴权信息 + * + * @param token / + * @return / + */ + Authentication getAuthentication(String token) { + Claims claims = getClaims(token); + User principal = new User(claims.getSubject(), "******", new ArrayList<>()); + return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>()); + } - /** - * 依据Token 获取鉴权信息 - * - * @param token / - * @return / - */ - Authentication getAuthentication(String token) { - Claims claims = getClaims(token); - User principal = new User(claims.getSubject(), "******", new ArrayList<>()); - return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>()); - } + public Claims getClaims(String token) { + // 0.11.x版本 + // return jwtParser.parseClaimsJws(token).getBody(); + // 0.12.x版本 + return jwtParser.parseSignedClaims(token).getPayload(); + } - public Claims getClaims(String token) { - // 0.11.x版本 - // return jwtParser.parseClaimsJws(token).getBody(); - // 0.12.x版本 - return jwtParser.parseSignedClaims(token).getPayload(); + /** + * @param token 需要检查的token + */ + public void checkRenewal(String token) { + // 判断是否续期token,计算token的过期时间 + String loginKey = loginKey(token); + long time = redisHelper.getExpire(loginKey) * 1000; + Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time); + // 判断当前时间与过期时间的时间差 + long differ = expireDate.getTime() - System.currentTimeMillis(); + // 如果在续期检查的范围内,则续期 + if (differ <= properties.getJwt().getDetect()) { + long renew = time + properties.getJwt().getRenew(); + redisHelper.expire(loginKey, renew, TimeUnit.MILLISECONDS); } + } - /** - * @param token 需要检查的token - */ - public void checkRenewal(String token) { - // 判断是否续期token,计算token的过期时间 - String loginKey = loginKey(token); - long time = redisHelper.getExpire(loginKey) * 1000; - Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int)time); - // 判断当前时间与过期时间的时间差 - long differ = expireDate.getTime() - System.currentTimeMillis(); - // 如果在续期检查的范围内,则续期 - if (differ <= properties.getJwt().getDetect()) { - long renew = time + properties.getJwt().getRenew(); - redisHelper.expire(loginKey, renew, TimeUnit.MILLISECONDS); - } + public String getToken(HttpServletRequest request) { + final String requestHeader = request.getHeader(SystemConst.HEADER_NAME); + if (requestHeader != null && requestHeader.startsWith(SystemConst.TOKEN_PREFIX)) { + return requestHeader.substring(7); } + return null; + } - public String getToken(HttpServletRequest request) { - final String requestHeader = request.getHeader(SystemConst.HEADER_NAME); - if (requestHeader != null && requestHeader.startsWith(SystemConst.TOKEN_PREFIX)) { - return requestHeader.substring(7); - } - return null; - } + /** + * 获取登录用户RedisKey + * + * @param token / + * @return key + */ + public String loginKey(String token) { + Claims claims = getClaims(token); + return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token); + } - /** - * 获取登录用户RedisKey - * - * @param token / - * @return key - */ - public String loginKey(String token) { - Claims claims = getClaims(token); - return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token); - } - - /** - * 获取会话编号 - * - * @param token / - * @return / - */ - public String getId(String token) { - Claims claims = getClaims(token); - return claims.get(AUTHORITIES_UUID_KEY, String.class); - } + /** + * 获取会话编号 + * + * @param token / + * @return / + */ + public String getId(String token) { + Claims claims = getClaims(token); + return claims.get(AUTHORITIES_UUID_KEY, String.class); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java index d16464f0..ca8a6d09 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/permission/core/handler/UserDetailsHandler.java @@ -35,30 +35,35 @@ import org.springframework.stereotype.Service; @Slf4j @Service("userDetailsService") public class UserDetailsHandler implements UserDetailsService { - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemUserService systemUserService; - @Autowired private SystemDataService systemDataService; - @Autowired private SystemUserInfoDAO systemUserInfoDAO; - @Override - public SystemUserJwtVo loadUserByUsername(String username) { - SystemUserJwtVo userJwtVo = systemUserInfoDAO.getUserLoginInfoByUserName(username); - if (userJwtVo == null) { - SystemUserTb user = systemUserService.getUserByUsername(username); - if (user == null) { - throw new BadRequestException("用户不存在"); - } else { - if (!user.getEnabled()) { - throw new BadRequestException("账号未激活"); - } - // 获取用户的权限 - List authorities = systemRoleService.buildUserRolePermissions(user); - // 初始化JwtUserDto - userJwtVo = new SystemUserJwtVo(user, systemDataService.findDeptIdListByArgs(user), authorities); - // 添加缓存数据 - systemUserInfoDAO.saveUserLoginInfoByUserName(username, userJwtVo); - } + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemDataService systemDataService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + + @Override + public SystemUserJwtVo loadUserByUsername(String username) { + SystemUserJwtVo userJwtVo = systemUserInfoDAO.getUserLoginInfoByUserName(username); + if (userJwtVo == null) { + SystemUserTb user = systemUserService.getUserByUsername(username); + if (user == null) { + throw new BadRequestException("用户不存在"); + } else { + if (!user.getEnabled()) { + throw new BadRequestException("账号未激活"); } - return userJwtVo; + // 获取用户的权限 + List authorities = systemRoleService.buildUserRolePermissions(user); + // 初始化JwtUserDto + userJwtVo = new SystemUserJwtVo(user, systemDataService.queryDeptIdByArgs(user), authorities); + // 添加缓存数据 + systemUserInfoDAO.saveUserLoginInfoByUserName(username, userJwtVo); + } } + return userJwtVo; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ActiveJobRegister.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ActiveJobRegister.java index 1f9e09c3..0090bc30 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ActiveJobRegister.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ActiveJobRegister.java @@ -27,18 +27,21 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class ActiveJobRegister implements ApplicationRunner { - @Autowired private SystemQuartzJobService systemQuartzJobService; - @Autowired private QuartzManage quartzManage; - /** - * 项目启动时重新激活启用的定时任务 - * - * @param applicationArguments / - */ - @Override - public void run(ApplicationArguments applicationArguments) { - List quartzJobs = systemQuartzJobService.queryEnableQuartzJob(); - quartzJobs.forEach(quartzManage::addJob); - log.info("Timing task injection complete"); - } + @Autowired + private SystemQuartzJobService systemQuartzJobService; + @Autowired + private QuartzManage quartzManage; + + /** + * 项目启动时重新激活启用的定时任务 + * + * @param applicationArguments / + */ + @Override + public void run(ApplicationArguments applicationArguments) { + List quartzJobs = systemQuartzJobService.listEnableQuartzJob(); + quartzJobs.forEach(quartzManage::addJob); + log.info("Timing task injection complete"); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java index ca11031a..dc88ff28 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/ExecutionJobBean.java @@ -42,89 +42,90 @@ import org.springframework.scheduling.quartz.QuartzJobBean; @Slf4j public class ExecutionJobBean extends QuartzJobBean { - /** - * 此处仅供参考,可根据任务执行情况自定义线程池参数 - */ - private final ThreadPoolTaskExecutor executor = KitSpringBeanHolder.getBean("taskAsync"); - @Override - public void executeInternal(JobExecutionContext context) { - // 获取任务 - SystemQuartzJobTb quartzJob = (SystemQuartzJobTb)context.getMergedJobDataMap().get(SystemQuartzJobTb.JOB_KEY); - // 获取spring bean - SystemQuartzLogMapper quartzLogMapper = KitSpringBeanHolder.getBean(SystemQuartzLogMapper.class); - SystemQuartzJobService systemQuartzJobService = KitSpringBeanHolder.getBean(SystemQuartzJobService.class); - KitRedisHelper redisHelper = KitSpringBeanHolder.getBean(KitRedisHelper.class); - String uuid = quartzJob.getUuid(); - SystemQuartzLogTb quartzLog = new SystemQuartzLogTb(); - quartzLog.setJobName(quartzJob.getJobName()); - quartzLog.setBeanName(quartzJob.getBeanName()); - quartzLog.setMethodName(quartzJob.getMethodName()); - quartzLog.setParams(quartzJob.getParams()); - long startTime = System.currentTimeMillis(); - quartzLog.setCronExpression(quartzJob.getCronExpression()); - try { - // 执行任务 - QuartzRunnable task = - new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(), quartzJob.getParams()); - Future future = executor.submit(task); - // 忽略任务执行结果 - future.get(); - long times = System.currentTimeMillis() - startTime; - quartzLog.setTime(times); - if (StrUtil.isNotBlank(uuid)) { - redisHelper.set(uuid, true); - } - // 任务状态 - quartzLog.setIsSuccess(true); - log.info("任务执行成功,任务名称:{}, 执行时间:{}毫秒", quartzJob.getJobName(), times); - // 判断是否存在子任务 - if (StrUtil.isNotBlank(quartzJob.getSubTask())) { - String[] tasks = quartzJob.getSubTask().split("[,,]"); - // 执行子任务 - systemQuartzJobService.startSubQuartJob(tasks); - } - } catch (Exception e) { - if (StrUtil.isNotBlank(uuid)) { - redisHelper.set(uuid, false); - } - log.error("任务执行失败,任务名称:{}", quartzJob.getJobName(), e); - long times = System.currentTimeMillis() - startTime; - quartzLog.setTime(times); - // 任务状态 0:成功 1:失败 - quartzLog.setIsSuccess(false); - quartzLog.setExceptionDetail(ExceptionUtil.stacktraceToString(e)); - // 任务如果失败了则暂停 - if (quartzJob.getPauseAfterFailure() != null && quartzJob.getPauseAfterFailure()) { - quartzJob.setIsPause(false); - // 更新状态 - systemQuartzJobService.switchQuartzJobStatus(quartzJob); - } - if (quartzJob.getEmail() != null) { - SystemEmailService emailService = KitSpringBeanHolder.getBean(SystemEmailService.class); - // 邮箱报警 - if (StrUtil.isNotBlank(quartzJob.getEmail())) { - SystemSendEmailArgs sendEmailRequest = taskAlarm(quartzJob, ExceptionUtil.stacktraceToString(e)); - emailService.sendEmail(sendEmailRequest); - } - } - } finally { - quartzLogMapper.insert(quartzLog); + /** + * 此处仅供参考,可根据任务执行情况自定义线程池参数 + */ + private final ThreadPoolTaskExecutor executor = KitSpringBeanHolder.getBean("taskAsync"); + + @Override + public void executeInternal(JobExecutionContext context) { + // 获取任务 + SystemQuartzJobTb quartzJob = (SystemQuartzJobTb) context.getMergedJobDataMap().get(SystemQuartzJobTb.JOB_KEY); + // 获取spring bean + SystemQuartzLogMapper quartzLogMapper = KitSpringBeanHolder.getBean(SystemQuartzLogMapper.class); + SystemQuartzJobService systemQuartzJobService = KitSpringBeanHolder.getBean(SystemQuartzJobService.class); + KitRedisHelper redisHelper = KitSpringBeanHolder.getBean(KitRedisHelper.class); + String uuid = quartzJob.getUuid(); + SystemQuartzLogTb quartzLog = new SystemQuartzLogTb(); + quartzLog.setJobName(quartzJob.getJobName()); + quartzLog.setBeanName(quartzJob.getBeanName()); + quartzLog.setMethodName(quartzJob.getMethodName()); + quartzLog.setParams(quartzJob.getParams()); + long startTime = System.currentTimeMillis(); + quartzLog.setCronExpression(quartzJob.getCronExpression()); + try { + // 执行任务 + QuartzRunnable task = + new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(), quartzJob.getParams()); + Future future = executor.submit(task); + // 忽略任务执行结果 + future.get(); + long times = System.currentTimeMillis() - startTime; + quartzLog.setTime(times); + if (StrUtil.isNotBlank(uuid)) { + redisHelper.set(uuid, true); + } + // 任务状态 + quartzLog.setIsSuccess(true); + log.info("任务执行成功,任务名称:{}, 执行时间:{}毫秒", quartzJob.getJobName(), times); + // 判断是否存在子任务 + if (StrUtil.isNotBlank(quartzJob.getSubTask())) { + String[] tasks = quartzJob.getSubTask().split("[,,]"); + // 执行子任务 + systemQuartzJobService.startSubQuartJob(tasks); + } + } catch (Exception e) { + if (StrUtil.isNotBlank(uuid)) { + redisHelper.set(uuid, false); + } + log.error("任务执行失败,任务名称:{}", quartzJob.getJobName(), e); + long times = System.currentTimeMillis() - startTime; + quartzLog.setTime(times); + // 任务状态 0:成功 1:失败 + quartzLog.setIsSuccess(false); + quartzLog.setExceptionDetail(ExceptionUtil.stacktraceToString(e)); + // 任务如果失败了则暂停 + if (quartzJob.getPauseAfterFailure() != null && quartzJob.getPauseAfterFailure()) { + quartzJob.setIsPause(false); + // 更新状态 + systemQuartzJobService.switchQuartzJobStatus(quartzJob); + } + if (quartzJob.getEmail() != null) { + SystemEmailService emailService = KitSpringBeanHolder.getBean(SystemEmailService.class); + // 邮箱报警 + if (StrUtil.isNotBlank(quartzJob.getEmail())) { + SystemSendEmailArgs sendEmailRequest = taskAlarm(quartzJob, ExceptionUtil.stacktraceToString(e)); + emailService.sendEmail(sendEmailRequest); } + } + } finally { + quartzLogMapper.insert(quartzLog); } + } - private SystemSendEmailArgs taskAlarm(SystemQuartzJobTb quartzJob, String msg) { - SystemSendEmailArgs sendEmailRequest = new SystemSendEmailArgs(); - sendEmailRequest.setSubject("定时任务【" + quartzJob.getJobName() + "】执行失败,请尽快处理!"); - Map data = new HashMap<>(16); - data.put("task", quartzJob); - data.put("msg", msg); - TemplateEngine engine = - TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); - Template template = engine.getTemplate("SystemQuartzJobTaskAlarmTemplate.ftl"); - sendEmailRequest.setContent(template.render(data)); - List emails = Arrays.asList(quartzJob.getEmail().split("[,,]")); - sendEmailRequest.setTos(emails); - return sendEmailRequest; - } + private SystemSendEmailArgs taskAlarm(SystemQuartzJobTb quartzJob, String msg) { + SystemSendEmailArgs sendEmailRequest = new SystemSendEmailArgs(); + sendEmailRequest.setSubject("定时任务【" + quartzJob.getJobName() + "】执行失败,请尽快处理!"); + Map data = new HashMap<>(16); + data.put("task", quartzJob); + data.put("msg", msg); + TemplateEngine engine = + TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); + Template template = engine.getTemplate("SystemQuartzJobTaskAlarmTemplate.ftl"); + sendEmailRequest.setContent(template.render(data)); + List emails = Arrays.asList(quartzJob.getEmail().split("[,,]")); + sendEmailRequest.setTos(emails); + return sendEmailRequest; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java index 39a7c5eb..96063bed 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/quartz/QuartzManage.java @@ -37,138 +37,140 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class QuartzManage { - private static final String JOB_NAME = "TASK_"; - @Resource private Scheduler scheduler; - public void addJob(SystemQuartzJobTb quartzJob) { - try { - // 构建job信息 - JobDetail jobDetail = - JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build(); - // 通过触发器名和cron 表达式创建 Trigger - Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow() - .withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression())).build(); - trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); - // 重置启动时间 - ((CronTriggerImpl)trigger).setStartTime(new Date()); - // 执行定时任务,如果是持久化的,这里会报错,捕获输出 - try { - scheduler.scheduleJob(jobDetail, trigger); - } catch (ObjectAlreadyExistsException e) { - log.warn("定时任务已存在,跳过加载"); - } - // 暂停任务 - if (quartzJob.getIsPause()) { - pauseJob(quartzJob); - } - } catch (Exception e) { - log.error("创建定时任务失败", e); - throw new BadRequestException("创建定时任务失败"); - } - } + private static final String JOB_NAME = "TASK_"; + @Resource + private Scheduler scheduler; - /** - * 更新job cron表达式 - * - * @param quartzJob / - */ - public void updateJobCron(SystemQuartzJobTb quartzJob) { - try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); - CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey); - // 如果不存在则创建一个定时任务 - if (trigger == null) { - addJob(quartzJob); - trigger = (CronTrigger)scheduler.getTrigger(triggerKey); - } - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression()); - trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); - // 重置启动时间 - ((CronTriggerImpl)trigger).setStartTime(new Date()); - trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); - scheduler.rescheduleJob(triggerKey, trigger); - // 暂停任务 - if (quartzJob.getIsPause()) { - pauseJob(quartzJob); - } - } catch (Exception e) { - log.error("更新定时任务失败", e); - throw new BadRequestException("更新定时任务失败"); - } + public void addJob(SystemQuartzJobTb quartzJob) { + try { + // 构建job信息 + JobDetail jobDetail = + JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build(); + // 通过触发器名和cron 表达式创建 Trigger + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow() + .withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression())).build(); + trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); + // 重置启动时间 + ((CronTriggerImpl) trigger).setStartTime(new Date()); + // 执行定时任务,如果是持久化的,这里会报错,捕获输出 + try { + scheduler.scheduleJob(jobDetail, trigger); + } catch (ObjectAlreadyExistsException e) { + log.warn("定时任务已存在,跳过加载"); + } + // 暂停任务 + if (quartzJob.getIsPause()) { + pauseJob(quartzJob); + } + } catch (Exception e) { + log.error("创建定时任务失败", e); + throw new BadRequestException("创建定时任务失败"); } + } - /** - * 删除一个job - * - * @param quartzJob / - */ - public void deleteJob(SystemQuartzJobTb quartzJob) { - try { - JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); - scheduler.pauseJob(jobKey); - scheduler.deleteJob(jobKey); - } catch (Exception e) { - log.error("删除定时任务失败", e); - throw new BadRequestException("删除定时任务失败"); - } + /** + * 更新job cron表达式 + * + * @param quartzJob / + */ + public void updateJobCron(SystemQuartzJobTb quartzJob) { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + } + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression()); + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 重置启动时间 + ((CronTriggerImpl) trigger).setStartTime(new Date()); + trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); + scheduler.rescheduleJob(triggerKey, trigger); + // 暂停任务 + if (quartzJob.getIsPause()) { + pauseJob(quartzJob); + } + } catch (Exception e) { + log.error("更新定时任务失败", e); + throw new BadRequestException("更新定时任务失败"); } + } - /** - * 恢复一个job - * - * @param quartzJob / - */ - public void resumeJob(SystemQuartzJobTb quartzJob) { - try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); - CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey); - // 如果不存在则创建一个定时任务 - if (trigger == null) { - addJob(quartzJob); - } - JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); - scheduler.resumeJob(jobKey); - } catch (Exception e) { - log.error("恢复定时任务失败", e); - throw new BadRequestException("恢复定时任务失败"); - } + /** + * 删除一个job + * + * @param quartzJob / + */ + public void deleteJob(SystemQuartzJobTb quartzJob) { + try { + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.pauseJob(jobKey); + scheduler.deleteJob(jobKey); + } catch (Exception e) { + log.error("删除定时任务失败", e); + throw new BadRequestException("删除定时任务失败"); } + } - /** - * 立即执行job - * - * @param quartzJob / - */ - public void runJobNow(SystemQuartzJobTb quartzJob) { - try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); - CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey); - // 如果不存在则创建一个定时任务 - if (trigger == null) { - addJob(quartzJob); - } - JobDataMap dataMap = new JobDataMap(); - dataMap.put(SystemQuartzJobTb.JOB_KEY, quartzJob); - JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); - scheduler.triggerJob(jobKey, dataMap); - } catch (Exception e) { - log.error("定时任务执行失败", e); - throw new BadRequestException("定时任务执行失败"); - } + /** + * 恢复一个job + * + * @param quartzJob / + */ + public void resumeJob(SystemQuartzJobTb quartzJob) { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + } + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.resumeJob(jobKey); + } catch (Exception e) { + log.error("恢复定时任务失败", e); + throw new BadRequestException("恢复定时任务失败"); } + } - /** - * 暂停一个job - * - * @param quartzJob / - */ - public void pauseJob(SystemQuartzJobTb quartzJob) { - try { - JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); - scheduler.pauseJob(jobKey); - } catch (Exception e) { - log.error("定时任务暂停失败", e); - throw new BadRequestException("定时任务暂停失败"); - } + /** + * 立即执行job + * + * @param quartzJob / + */ + public void runJobNow(SystemQuartzJobTb quartzJob) { + try { + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + // 如果不存在则创建一个定时任务 + if (trigger == null) { + addJob(quartzJob); + } + JobDataMap dataMap = new JobDataMap(); + dataMap.put(SystemQuartzJobTb.JOB_KEY, quartzJob); + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.triggerJob(jobKey, dataMap); + } catch (Exception e) { + log.error("定时任务执行失败", e); + throw new BadRequestException("定时任务执行失败"); } + } + + /** + * 暂停一个job + * + * @param quartzJob / + */ + public void pauseJob(SystemQuartzJobTb quartzJob) { + try { + JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); + scheduler.pauseJob(jobKey); + } catch (Exception e) { + log.error("定时任务暂停失败", e); + throw new BadRequestException("定时任务暂停失败"); + } + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java index 608c8c8e..23f954fc 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/OssStorageConfiguration.java @@ -27,17 +27,19 @@ import org.springframework.context.annotation.Configuration; @Slf4j @Configuration public class OssStorageConfiguration { - @Autowired private AppProperties properties; - @Bean - public MinioClient minioClient() { - try { - OSSConfigModel minio = properties.getOss().getMinio(); - return MinioClient.builder().endpoint(minio.getEndpoint()) - .credentials(minio.getAccessKey(), minio.getSecretKey()).build(); - } catch (Exception e) { - log.error("创建Minio客户端失败", e); - throw new BadRequestException("创建Minio客户端失败"); - } + @Autowired + private AppProperties properties; + + @Bean + public MinioClient minioClient() { + try { + OSSConfigModel minio = properties.getOss().getMinio(); + return MinioClient.builder().endpoint(minio.getEndpoint()) + .credentials(minio.getAccessKey(), minio.getSecretKey()).build(); + } catch (Exception e) { + log.error("创建Minio客户端失败", e); + throw new BadRequestException("创建Minio客户端失败"); } + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java index cb943c39..74156f46 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/local/MultipartConfig.java @@ -30,26 +30,29 @@ import org.springframework.util.unit.DataSize; @Slf4j @Configuration public class MultipartConfig { - @Value("${spring.application.name}") private String name; - @Autowired private AppProperties properties; - /** - * 文件上传临时路径 - */ - @Bean - public MultipartConfigElement multipartConfigElement() { - MultipartConfigFactory factory = new MultipartConfigFactory(); - factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); - factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); - String location = System.getProperty("user.home") + "/" + name + "/tmp"; - File tmpFile = new File(location); - if (!tmpFile.exists()) { - if (!tmpFile.mkdirs()) { - log.error("创建临时文件失败"); - throw new BadRequestException("创建临时文件失败"); - } - } - factory.setLocation(location); - return factory.createMultipartConfig(); + @Value("${spring.application.name}") + private String name; + @Autowired + private AppProperties properties; + + /** + * 文件上传临时路径 + */ + @Bean + public MultipartConfigElement multipartConfigElement() { + MultipartConfigFactory factory = new MultipartConfigFactory(); + factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); + factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); + String location = System.getProperty("user.home") + "/" + name + "/tmp"; + File tmpFile = new File(location); + if (!tmpFile.exists()) { + if (!tmpFile.mkdirs()) { + log.error("创建临时文件失败"); + throw new BadRequestException("创建临时文件失败"); + } } + factory.setLocation(location); + return factory.createMultipartConfig(); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java index 61af4ff0..8cf7e802 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/framework/storage/minio/MinioRepository.java @@ -58,312 +58,315 @@ import org.springframework.web.multipart.MultipartFile; @Slf4j @Component public class MinioRepository { - @Autowired private AppProperties properties; - @Autowired private MinioClient minioClient; - /** - * 检查存储bucket是否存在 - * - * @param bucketName Bucket 名称 - * @return boolean 存在返回 true,否则返回 false - */ - public boolean existsBucket(String bucketName) { - try { - return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); - } catch (Exception e) { - log.error("检查 bucket 是否存在失败,bucketName: {}, 错误信息", bucketName, e); - return false; - } - } + @Autowired + private AppProperties properties; + @Autowired + private MinioClient minioClient; - /** - * 创建存储bucket - * - * @param bucketName Bucket 名称 - * @return boolean 创建成功返回 true,否则返回 false - */ - public boolean createBucket(String bucketName) { - try { - if (!existsBucket(bucketName)) { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); - log.info("Bucket 创建成功,bucketName: {}", bucketName); - return true; - } else { - log.warn("Bucket 已经存在,bucketName: {}", bucketName); - } - } catch (Exception e) { - log.error("创建 bucket 失败,bucketName: {}, 错误信息", bucketName, e); - } - return false; + /** + * 检查存储bucket是否存在 + * + * @param bucketName Bucket 名称 + * @return boolean 存在返回 true,否则返回 false + */ + public boolean existsBucket(String bucketName) { + try { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } catch (Exception e) { + log.error("检查 bucket 是否存在失败,bucketName: {}, 错误信息", bucketName, e); + return false; } + } - /** - * 删除存储bucket - * - * @param bucketName Bucket 名称 - * @return boolean 删除成功返回 true,否则返回 false - */ - public boolean removeBucket(String bucketName) { - try { - if (existsBucket(bucketName)) { - minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); - log.info("Bucket 删除成功,bucketName: {}", bucketName); - return true; - } else { - log.warn("Bucket 不存在,bucketName: {}", bucketName); - } - } catch (Exception e) { - log.error("删除 bucket 失败,bucketName: {}, 错误信息", bucketName, e); - } - return false; + /** + * 创建存储bucket + * + * @param bucketName Bucket 名称 + * @return boolean 创建成功返回 true,否则返回 false + */ + public boolean createBucket(String bucketName) { + try { + if (!existsBucket(bucketName)) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + log.info("Bucket 创建成功,bucketName: {}", bucketName); + return true; + } else { + log.warn("Bucket 已经存在,bucketName: {}", bucketName); + } + } catch (Exception e) { + log.error("创建 bucket 失败,bucketName: {}, 错误信息", bucketName, e); } + return false; + } - /** - * 获取所有 bucket 列表 - * - * @return List 所有的 Bucket 列表 - */ - public List queryAllBuckets() { - try { - return minioClient.listBuckets(); - } catch (Exception e) { - log.error("获取所有 buckets 失败,错误信息", e); - } - return Collections.emptyList(); + /** + * 删除存储bucket + * + * @param bucketName Bucket 名称 + * @return boolean 删除成功返回 true,否则返回 false + */ + public boolean removeBucket(String bucketName) { + try { + if (existsBucket(bucketName)) { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + log.info("Bucket 删除成功,bucketName: {}", bucketName); + return true; + } else { + log.warn("Bucket 不存在,bucketName: {}", bucketName); + } + } catch (Exception e) { + log.error("删除 bucket 失败,bucketName: {}, 错误信息", bucketName, e); } + return false; + } - /** - * 文件上传 - * - * @param tempFile 文件 - * @param originalFilename 源文件名 - * @param fileSize 文件大小 - * @param contentType 文件类型 - * @param md5 文件md5 - * @return String 上传后的文件名,上传失败返回 null - */ - public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType, - String md5) { - StorageOSSModel ossConfig = properties.getOss(); - OSSConfigModel ossMinioConfig = ossConfig.getMinio(); - String type = FileTypeUtil.getType(tempFile); - String prefix = KitFileUtil.getPrefix(tempFile); - String suffix = KitFileUtil.getSuffix(tempFile); - String fileCode = IdUtil.fastSimpleUUID(); - String fileName = fileCode + FileUtil.getSuffix(originalFilename); - String objectName = KitDateUtil.getNowDateStr() + "/" + fileName; - log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); - String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName; - SystemOssStorageTb systemOssStorageTb = new SystemOssStorageTb(); - systemOssStorageTb.setServiceType("minio"); - systemOssStorageTb.setEndpoint(ossMinioConfig.getEndpoint()); - systemOssStorageTb.setBucketName(StrUtil.trim(ossMinioConfig.getBucketName())); - systemOssStorageTb.setFileName(originalFilename); - systemOssStorageTb.setFileSize(fileSize); - systemOssStorageTb.setFileMime(type); - systemOssStorageTb.setFilePrefix(prefix); - systemOssStorageTb.setFileSuffix(suffix); - systemOssStorageTb.setFileMd5(md5); - systemOssStorageTb.setFileUrl(fileUrl); - systemOssStorageTb.setFileCode(fileCode); - systemOssStorageTb.setObjectName(objectName); - try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) { - PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName) - .stream(fileInputStream, fileSize, -1).contentType(contentType).build(); - minioClient.putObject(objectArgs); - log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename); - return systemOssStorageTb; - } catch (Exception e) { - log.error("文件上传失败,文件名:{},错误信息", originalFilename, e); - } finally { - try { - KitFileUtil.del(tempFile); - } catch (IORuntimeException e) { - // 删除失败忽略 - } - } - return null; + /** + * 获取所有 bucket 列表 + * + * @return List 所有的 Bucket 列表 + */ + public List queryAllBuckets() { + try { + return minioClient.listBuckets(); + } catch (Exception e) { + log.error("获取所有 buckets 失败,错误信息", e); } + return Collections.emptyList(); + } - /** - * 优化文件上传 文件上传:优化版 - * - * @param file - * @return {@link String } - */ - public String optimizedUpload(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - if (StrUtil.isBlank(originalFilename)) { - throw new BadRequestException("文件名不能为空"); - } - long size = file.getSize(); - KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); - String fileName = UUID.randomUUID() + FileUtil.getSuffix(originalFilename); - // yyyy/MM/dd/fileName.xxx - String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName; - log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); - try (InputStream fileInputStream = file.getInputStream()) { - PutObjectArgs objectArgs = - PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName) - .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); - // 使用重试机制进行上传 - uploadWithRetry(objectArgs, 3); - log.info("文件上传成功,objectName: {}", objectName); - return objectName; - } catch (Exception e) { - log.error("文件上传失败,文件名:{},错误信息", originalFilename, e); - } - return null; + /** + * 文件上传 + * + * @param tempFile 文件 + * @param originalFilename 源文件名 + * @param fileSize 文件大小 + * @param contentType 文件类型 + * @param md5 文件md5 + * @return String 上传后的文件名,上传失败返回 null + */ + public SystemOssStorageTb upload(File tempFile, String originalFilename, long fileSize, String contentType, + String md5) { + StorageOSSModel ossConfig = properties.getOss(); + OSSConfigModel ossMinioConfig = ossConfig.getMinio(); + String type = FileTypeUtil.getType(tempFile); + String prefix = KitFileUtil.getPrefix(tempFile); + String suffix = KitFileUtil.getSuffix(tempFile); + String fileCode = IdUtil.fastSimpleUUID(); + String fileName = fileCode + FileUtil.getSuffix(originalFilename); + String objectName = KitDateUtil.getNowDateStr() + "/" + fileName; + log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); + String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName; + SystemOssStorageTb systemOssStorageTb = new SystemOssStorageTb(); + systemOssStorageTb.setServiceType("minio"); + systemOssStorageTb.setEndpoint(ossMinioConfig.getEndpoint()); + systemOssStorageTb.setBucketName(StrUtil.trim(ossMinioConfig.getBucketName())); + systemOssStorageTb.setFileName(originalFilename); + systemOssStorageTb.setFileSize(fileSize); + systemOssStorageTb.setFileMime(type); + systemOssStorageTb.setFilePrefix(prefix); + systemOssStorageTb.setFileSuffix(suffix); + systemOssStorageTb.setFileMd5(md5); + systemOssStorageTb.setFileUrl(fileUrl); + systemOssStorageTb.setFileCode(fileCode); + systemOssStorageTb.setObjectName(objectName); + try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) { + PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName) + .stream(fileInputStream, fileSize, -1).contentType(contentType).build(); + minioClient.putObject(objectArgs); + log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename); + return systemOssStorageTb; + } catch (Exception e) { + log.error("文件上传失败,文件名:{},错误信息", originalFilename, e); + } finally { + try { + KitFileUtil.del(tempFile); + } catch (IORuntimeException e) { + // 删除失败忽略 + } } + return null; + } - /** - * 上传重试机制 - * - * @param objectArgs 对象参数 - * @param maxRetries 最大重试次数 - * @throws Exception 例外 - */ - private void uploadWithRetry(PutObjectArgs objectArgs, int maxRetries) throws Exception { - int attempt = 0; - while (attempt < maxRetries) { - try { - minioClient.putObject(objectArgs); - return; // 上传成功,返回 - } catch (Exception e) { - attempt++; - log.warn("上传失败,第 {} 次尝试,错误信息", attempt, e); - if (attempt == maxRetries) { - throw new BadRequestException("上传失败,已达到最大重试次数"); - } - // 等待一段时间后重试 - Thread.sleep(2000); - } - } + /** + * 优化文件上传 文件上传:优化版 + * + * @param file + * @return {@link String } + */ + public String optimizedUpload(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + if (StrUtil.isBlank(originalFilename)) { + throw new BadRequestException("文件名不能为空"); } + long size = file.getSize(); + KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); + String fileName = UUID.randomUUID() + FileUtil.getSuffix(originalFilename); + // yyyy/MM/dd/fileName.xxx + String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName; + log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); + try (InputStream fileInputStream = file.getInputStream()) { + PutObjectArgs objectArgs = + PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName) + .stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); + // 使用重试机制进行上传 + uploadWithRetry(objectArgs, 3); + log.info("文件上传成功,objectName: {}", objectName); + return objectName; + } catch (Exception e) { + log.error("文件上传失败,文件名:{},错误信息", originalFilename, e); + } + return null; + } - /** - * 生成文件的预签名 URL,用于文件预览 - * - * @param fullFileName 文件完整路径 - * @return String 预签名 URL - */ - public String generatePreviewUrl(String fullFileName) { - if (StrUtil.isBlank(fullFileName)) { - log.warn("文件名为空,无法生成预签名 URL"); - return null; + /** + * 上传重试机制 + * + * @param objectArgs 对象参数 + * @param maxRetries 最大重试次数 + * @throws Exception 例外 + */ + private void uploadWithRetry(PutObjectArgs objectArgs, int maxRetries) throws Exception { + int attempt = 0; + while (attempt < maxRetries) { + try { + minioClient.putObject(objectArgs); + return; // 上传成功,返回 + } catch (Exception e) { + attempt++; + log.warn("上传失败,第 {} 次尝试,错误信息", attempt, e); + if (attempt == maxRetries) { + throw new BadRequestException("上传失败,已达到最大重试次数"); } - try { - GetPresignedObjectUrlArgs presignedUrlArgs = - GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) - .object(fullFileName).method(Method.GET) - // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 - .expiry(3600 * 24 * 7).build(); - String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); - log.info("生成预签名 URL 成功,fileName: {}, url: {}", fullFileName, url); - return url; - } catch (Exception e) { - log.error("生成预签名 URL 失败,fileName: {}", fullFileName, e); - } - return null; + // 等待一段时间后重试 + Thread.sleep(2000); + } } + } - /** - * 下载文件 - * - * @param fileName 文件名称 - * @param res HTTP 响应 - */ - public void download(String fileName, HttpServletResponse res) { - GetObjectArgs objectArgs = - GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); - try (GetObjectResponse response = minioClient.getObject(objectArgs); - FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { - byte[] buf = new byte[1024]; - int len; - while ((len = response.read(buf)) != -1) { - os.write(buf, 0, len); - } - os.flush(); - byte[] bytes = os.toByteArray(); - res.setCharacterEncoding("utf-8"); - res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); - try (ServletOutputStream stream = res.getOutputStream()) { - stream.write(bytes); - stream.flush(); - } - } catch (Exception e) { - log.error("下载文件失败,fileName: {}, 错误信息", fileName, e); - } + /** + * 生成文件的预签名 URL,用于文件预览 + * + * @param fullFileName 文件完整路径 + * @return String 预签名 URL + */ + public String generatePreviewUrl(String fullFileName) { + if (StrUtil.isBlank(fullFileName)) { + log.warn("文件名为空,无法生成预签名 URL"); + return null; } + try { + GetPresignedObjectUrlArgs presignedUrlArgs = + GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()) + .object(fullFileName).method(Method.GET) + // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 + .expiry(3600 * 24 * 7).build(); + String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); + log.info("生成预签名 URL 成功,fileName: {}, url: {}", fullFileName, url); + return url; + } catch (Exception e) { + log.error("生成预签名 URL 失败,fileName: {}", fullFileName, e); + } + return null; + } - /** - * 文件下载:优化版 - * - * @param fileName 文件名称 - * @param res HTTP 响应 - */ - public void downloadOptimizedVersion(String fileName, HttpServletResponse res) { - GetObjectArgs objectArgs = - GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); - try (GetObjectResponse response = minioClient.getObject(objectArgs)) { - // 增大缓冲区 - byte[] buf = new byte[1024 * 4]; - int len; - // 分块下载并输出到响应流 - try (ServletOutputStream stream = res.getOutputStream()) { - res.setCharacterEncoding("utf-8"); - res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); - res.setHeader("Cache-Control", "no-store"); - res.setHeader("Pragma", "no-cache"); - res.setHeader("Expires", "0"); - while ((len = response.read(buf)) != -1) { - stream.write(buf, 0, len); - // 确保实时写入 - stream.flush(); - } - log.info("文件下载成功,fileName: {}", fileName); - } - } catch (Exception e) { - log.error("下载文件失败,fileName: {}, 错误信息", fileName, e); - } + /** + * 下载文件 + * + * @param fileName 文件名称 + * @param res HTTP 响应 + */ + public void download(String fileName, HttpServletResponse res) { + GetObjectArgs objectArgs = + GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); + try (GetObjectResponse response = minioClient.getObject(objectArgs); + FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { + byte[] buf = new byte[1024]; + int len; + while ((len = response.read(buf)) != -1) { + os.write(buf, 0, len); + } + os.flush(); + byte[] bytes = os.toByteArray(); + res.setCharacterEncoding("utf-8"); + res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + try (ServletOutputStream stream = res.getOutputStream()) { + stream.write(bytes); + stream.flush(); + } + } catch (Exception e) { + log.error("下载文件失败,fileName: {}, 错误信息", fileName, e); } + } - /** - * 查看文件对象列表 - * - * @return List 文件对象列表 - */ - public List queryAllObjects() { - try { - Iterable> results = minioClient.listObjects( - ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); - List items = new ArrayList<>(); - for (Result result : results) { - items.add(result.get()); - } - return items; - } catch (Exception e) { - log.error("列出文件对象失败,错误信息", e); + /** + * 文件下载:优化版 + * + * @param fileName 文件名称 + * @param res HTTP 响应 + */ + public void downloadOptimizedVersion(String fileName, HttpServletResponse res) { + GetObjectArgs objectArgs = + GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); + try (GetObjectResponse response = minioClient.getObject(objectArgs)) { + // 增大缓冲区 + byte[] buf = new byte[1024 * 4]; + int len; + // 分块下载并输出到响应流 + try (ServletOutputStream stream = res.getOutputStream()) { + res.setCharacterEncoding("utf-8"); + res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); + res.setHeader("Cache-Control", "no-store"); + res.setHeader("Pragma", "no-cache"); + res.setHeader("Expires", "0"); + while ((len = response.read(buf)) != -1) { + stream.write(buf, 0, len); + // 确保实时写入 + stream.flush(); } - return Collections.emptyList(); + log.info("文件下载成功,fileName: {}", fileName); + } + } catch (Exception e) { + log.error("下载文件失败,fileName: {}, 错误信息", fileName, e); } + } - /** - * 删除文件 - * - * @param fileName 文件名 - * @return boolean 删除成功返回 true,否则返回 false - */ - public boolean removeBucketFile(String fileName) { - try { - minioClient.removeObject( - RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName) - .build()); - log.info("删除文件成功,fileName: {}", fileName); - return true; - } catch (Exception e) { - log.error("删除文件失败,fileName: {}, 错误信息", fileName, e); - } - return false; + /** + * 查看文件对象列表 + * + * @return List 文件对象列表 + */ + public List queryAllObjects() { + try { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).build()); + List items = new ArrayList<>(); + for (Result result : results) { + items.add(result.get()); + } + return items; + } catch (Exception e) { + log.error("列出文件对象失败,错误信息", e); } + return Collections.emptyList(); + } + + /** + * 删除文件 + * + * @param fileName 文件名 + * @return boolean 删除成功返回 true,否则返回 false + */ + public boolean removeBucketFile(String fileName) { + try { + minioClient.removeObject( + RemoveObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName) + .build()); + log.info("删除文件成功,fileName: {}", fileName); + return true; + } catch (Exception e) { + log.error("删除文件失败,fileName: {}, 错误信息", fileName, e); + } + return false; + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java index 7c0d2a6b..49559af6 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/job/TestTask.java @@ -21,15 +21,16 @@ import org.springframework.stereotype.Service; @Slf4j @Service public class TestTask { - public void run() { - log.info("run 执行成功"); - } - public void run1(String str) { - log.info("run1 执行成功, 参数为: {}", str); - } + public void run() { + log.info("run 执行成功"); + } - public void run2() { - log.info("run2 执行成功"); - } + public void run1(String str) { + log.info("run1 执行成功, 参数为: {}", str); + } + + public void run2() { + log.info("run2 执行成功"); + } } 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 02b3d453..1d757f42 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,6 +20,7 @@ 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.dataobject.SystemUserTb; +import cn.odboy.system.dal.model.SystemRoleVo; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -34,53 +35,57 @@ import org.springframework.stereotype.Service; */ @Service public class SystemDataService { - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemDeptService systemDeptService; - @Autowired private SystemRoleDeptService systemRoleDeptService; - /** - * 获取数据权限 - * - * @param user / - * @return / - */ - public List findDeptIdListByArgs(SystemUserTb user) { - List deptIds = new ArrayList<>(); - // 查询用户角色 - List roleList = systemRoleService.queryRoleByUsersId(user.getId()); - // 获取对应的部门ID - for (SystemRoleTb role : roleList) { - SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); - switch (Objects.requireNonNull(dataScopeEnum)) { - case THIS_LEVEL: - deptIds.add(user.getDept().getId()); - break; - case CUSTOMIZE: - deptIds.addAll(this.findCustomDataPermissionList(deptIds, role)); - break; - default: - return new ArrayList<>(); - } - } - return deptIds.stream().distinct().collect(Collectors.toList()); - } + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemDeptService systemDeptService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; - /** - * 获取自定义的数据权限 - * - * @param deptIds 部门ID - * @param role 角色 - * @return 数据权限ID - */ - private List findCustomDataPermissionList(List deptIds, SystemRoleTb role) { - List deptList = systemRoleDeptService.selectDeptByRoleId(role.getId()); - for (SystemDeptTb dept : deptList) { - deptIds.add(dept.getId()); - List deptChildren = systemDeptService.queryDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptChildren)) { - deptIds.addAll(systemDeptService.queryChildDeptIdListByDeptIds(deptChildren)); - } - } - return deptIds; + /** + * 获取数据权限 + * + * @param user / + * @return / + */ + public List queryDeptIdByArgs(SystemUserTb user) { + List deptIds = new ArrayList<>(); + // 查询用户角色 + List roleList = systemRoleService.queryRoleByUsersId(user.getId()); + // 获取对应的部门ID + for (SystemRoleTb role : roleList) { + SystemDataScopeEnum dataScopeEnum = SystemDataScopeEnum.find(role.getDataScope()); + switch (Objects.requireNonNull(dataScopeEnum)) { + case THIS_LEVEL: + deptIds.add(user.getDept().getId()); + break; + case CUSTOMIZE: + deptIds.addAll(this.queryCustomDataPermissionByArgs(deptIds, role)); + break; + default: + return new ArrayList<>(); + } } + return deptIds.stream().distinct().collect(Collectors.toList()); + } + + /** + * 获取自定义的数据权限 + * + * @param deptIds 部门ID + * @param role 角色 + * @return 数据权限ID + */ + private List queryCustomDataPermissionByArgs(List deptIds, SystemRoleTb role) { + List deptList = systemRoleDeptService.listDeptByRoleId(role.getId()); + for (SystemDeptTb dept : deptList) { + deptIds.add(dept.getId()); + List deptChildren = systemDeptService.listDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptChildren)) { + deptIds.addAll(systemDeptService.queryChildDeptIdByDeptIds(deptChildren)); + } + } + return deptIds; + } } diff --git a/cutejava/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 d28ad323..1d383c2c 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 @@ -21,7 +21,6 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; -import cn.odboy.framework.context.KitSpringBeanHolder; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.constant.SystemDataScopeEnum; import cn.odboy.system.dal.dataobject.SystemDeptTb; @@ -30,12 +29,10 @@ import cn.odboy.system.dal.model.SystemProductLineTreeVo; import cn.odboy.system.dal.model.SystemProductLineVo; import cn.odboy.system.dal.model.SystemQueryDeptArgs; import cn.odboy.system.dal.mysql.SystemDeptMapper; -import cn.odboy.system.dal.mysql.SystemRoleMapper; -import cn.odboy.system.dal.mysql.SystemUserMapper; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -56,387 +53,434 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemDeptService { - @Autowired private SystemDeptMapper systemDeptMapper; - @Autowired private SystemUserMapper systemUserMapper; - @Autowired private SystemRoleMapper systemRoleMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDept(SystemCreateDeptArgs args) { - systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); - this.updateDeptSubCnt(args.getPid()); + @Autowired + private SystemDeptMapper systemDeptMapper; + @Autowired + private SystemUserService systemUserService; + @Autowired + private SystemRoleService systemRoleService; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDept(SystemCreateDeptArgs args) { + systemDeptMapper.insert(BeanUtil.copyProperties(args, SystemDeptTb.class)); + this.updateDeptSubCnt(args.getPid()); + } + + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDept(SystemDeptTb args) { + // 旧的部门 + Long oldPid = this.getDeptById(args.getId()).getPid(); + Long newPid = args.getPid(); + if (args.getPid() != null && args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); } + SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); + args.setId(dept.getId()); + systemDeptMapper.insertOrUpdate(args); + this.updateDeptSubCnt(oldPid); + this.updateDeptSubCnt(newPid); + } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDept(SystemDeptTb args) { - // 旧的部门 - Long oldPid = this.getDeptById(args.getId()).getPid(); - Long newPid = args.getPid(); - if (args.getPid() != null && args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); + /** + * 删除 + * + * @param deptSet / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDeptByIds(Set deptSet) { + for (SystemDeptTb dept : deptSet) { + systemDeptMapper.deleteById(dept.getId()); + this.updateDeptSubCnt(dept.getPid()); + } + } + + /** + * 导出数据 + * + * @param deptList 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDeptTb dept : deptList) { + Map map = new LinkedHashMap<>(); + map.put("部门名称", dept.getName()); + map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); + map.put("创建日期", dept.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 更新父节点中子节点数目 + * + * @param deptId / + */ + @Transactional(rollbackFor = Exception.class) + public void updateDeptSubCnt(Long deptId) { + if (deptId != null) { + long count = this.countDeptByPid(deptId); + systemDeptMapper.updateDeptSubCountById(count, deptId); + } + } + + private long countDeptByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getPid, pid); + return systemDeptMapper.selectCount(wrapper); + } + + /** + * 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表 + */ + private List deduplication(List list) { + List deptList = new ArrayList<>(); + // 使用 Set 存储所有部门的 id + Set idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); + // 遍历部门列表, 筛选出没有父部门的部门 + for (SystemDeptTb dept : list) { + if (!idSet.contains(dept.getPid())) { + deptList.add(dept); + } + } + return deptList; + } + + private List queryDeptByArgs(SystemQueryDeptArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.in(CollUtil.isNotEmpty(args.getIds()), SystemDeptTb::getId, args.getIds()); + wrapper.like(StrUtil.isNotBlank(args.getName()), SystemDeptTb::getName, args.getName()); + wrapper.eq(args.getEnabled() != null, SystemDeptTb::getEnabled, args.getEnabled()); + wrapper.eq(args.getPid() != null, SystemDeptTb::getPid, args.getPid()); + wrapper.isNull(args.getPidIsNull() != null, SystemDeptTb::getPid); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemDeptTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemDeptTb::getDeptSort); + return systemDeptMapper.selectList(wrapper); + } + + /** + * 查询所有数据 + * + * @param args 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllDeptByArgs(SystemQueryDeptArgs args, Boolean isQuery) throws Exception { + String dataScopeType = KitSecurityHelper.getDataScopeType(); + if (isQuery) { + if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { + args.setPidIsNull(true); + } + List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); + List fieldNames = new ArrayList<>() {{ + add("pidIsNull"); + add("enabled"); + }}; + for (Field field : fields) { + // 设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(args); + if (fieldNames.contains(field.getName())) { + continue; } - SystemDeptTb dept = systemDeptMapper.selectById(args.getId()); - args.setId(dept.getId()); - systemDeptMapper.insertOrUpdate(args); - this.updateDeptSubCnt(oldPid); - this.updateDeptSubCnt(newPid); - } - - /** - * 删除 - * - * @param deptSet / - */ - @Transactional(rollbackFor = Exception.class) - public void removeDeptByIds(Set deptSet) { - for (SystemDeptTb dept : deptSet) { - systemDeptMapper.deleteById(dept.getId()); - this.updateDeptSubCnt(dept.getPid()); + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; } + } } + // 数据权限 + args.setIds(KitSecurityHelper.getCurrentUserDataScope()); + List list = this.queryDeptByArgs(args); + // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 + if (StrUtil.isBlank(dataScopeType)) { + return this.deduplication(list); + } + return list; + } - /** - * 导出数据 - * - * @param deptList 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDeptExcel(List deptList, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDeptTb dept : deptList) { - Map map = new LinkedHashMap<>(); - map.put("部门名称", dept.getName()); - map.put("部门状态", dept.getEnabled() ? "启用" : "停用"); - map.put("创建日期", dept.getCreateTime()); - list.add(map); + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemDeptTb getDeptById(Long id) { + return systemDeptMapper.selectById(id); + } + + /** + * 获取部门下所有关联的部门 + * + * @param deptTbList / + * @param depts / + * @return / + */ + private Set queryRelationDeptByArgs(List deptTbList, Set depts) { + for (SystemDeptTb dept : deptTbList) { + depts.add(dept); + List deptList = this.listDeptByPid(dept.getId()); + if (CollUtil.isNotEmpty(deptList)) { + queryRelationDeptByArgs(deptList, depts); + } + } + return depts; + } + + public List queryChildDeptIdByDeptIds(List deptList) { + List list = new ArrayList<>(); + for (SystemDeptTb systemDeptTb : deptList) { + if (systemDeptTb != null && systemDeptTb.getEnabled()) { + List deptList1 = this.listDeptByPid(systemDeptTb.getId()); + if (CollUtil.isNotEmpty(deptList1)) { + list.addAll(queryChildDeptIdByDeptIds(deptList1)); } - KitFileUtil.downloadExcel(list, response); + list.add(systemDeptTb.getId()); + } } + return list; + } - /** - * 更新父节点中子节点数目 - * - * @param deptId / - */ - @Transactional(rollbackFor = Exception.class) - public void updateDeptSubCnt(Long deptId) { - if (deptId != null) { - long count = systemDeptMapper.countDeptByPid(deptId); - systemDeptMapper.updateDeptSubCountById(count, deptId); + /** + * 根据ID获取同级与上级数据 + * + * @param dept / + * @param deptList / + * @return / + */ + private List querySuperiorDeptByPid(SystemDeptTb dept, List deptList) { + if (dept.getPid() == null) { + deptList.addAll(this.listRootDept()); + return deptList; + } + deptList.addAll(this.listDeptByPid(dept.getPid())); + return querySuperiorDeptByPid(this.getDeptById(dept.getPid()), deptList); + } + + private List listRootDept() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemDeptTb::getPid); + return systemDeptMapper.selectList(wrapper); + } + + /** + * 构建树形数据 + * + * @return / + */ + public KitPageResult searchDeptTree(List ids, Boolean exclude) { + Set deptSet1 = new LinkedHashSet<>(); + for (Long id : ids) { + // 同级数据 + SystemDeptTb dept = this.getDeptById(id); + // 上级数据 + List depts = this.querySuperiorDeptByPid(dept, new ArrayList<>()); + if (exclude) { + for (SystemDeptTb data : depts) { + if (data.getId().equals(dept.getPid())) { + data.setSubCount(data.getSubCount() - 1); + } } + // 编辑部门时不显示自己以及自己下级的数据, 避免出现PID数据环形问题 + depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); + } + deptSet1.addAll(depts); } - - /** - * 筛选出 list 中没有父部门(即 pid 不在其他部门 id 列表中的部门)的部门列表 - */ - private List deduplication(List list) { - List deptList = new ArrayList<>(); - // 使用 Set 存储所有部门的 id - Set idSet = list.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - // 遍历部门列表, 筛选出没有父部门的部门 - for (SystemDeptTb dept : list) { - if (!idSet.contains(dept.getPid())) { - deptList.add(dept); - } + ArrayList deptList = new ArrayList<>(deptSet1); + // 构建部门树 + Set trees = new LinkedHashSet<>(); + Set deptSet = new LinkedHashSet<>(); + List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); + boolean isChild; + for (SystemDeptTb dept : deptList) { + isChild = false; + if (dept.getPid() == null) { + trees.add(dept); + } + for (SystemDeptTb it : deptList) { + if (it.getPid() != null && dept.getId().equals(it.getPid())) { + isChild = true; + if (dept.getChildren() == null) { + dept.setChildren(new ArrayList<>()); + } + dept.getChildren().add(it); } - return deptList; + } + if (isChild) { + deptSet.add(dept); + } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { + deptSet.add(dept); + } } + if (CollectionUtil.isEmpty(trees)) { + trees = deptSet; + } + KitPageResult baseResult = new KitPageResult<>(); + baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); + baseResult.setTotalElements(deptSet.size()); + return baseResult; + } - /** - * 查询所有数据 - * - * @param criteria 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllDept(SystemQueryDeptArgs criteria, Boolean isQuery) throws Exception { - String dataScopeType = CsSecurityHelper.getDataScopeType(); - if (isQuery) { - if (dataScopeType.equals(SystemDataScopeEnum.ALL.getValue())) { - criteria.setPidIsNull(true); - } - List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); - List fieldNames = new ArrayList<>() {{ - add("pidIsNull"); - add("enabled"); - }}; - for (Field field : fields) { - // 设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(criteria); - if (fieldNames.contains(field.getName())) { - continue; - } - if (ObjectUtil.isNotNull(val)) { - criteria.setPidIsNull(null); - break; - } - } - } - // 数据权限 - criteria.setIds(CsSecurityHelper.getCurrentUserDataScope()); - List list = systemDeptMapper.queryDeptByArgs(criteria); - // 如果为空, 就代表为自定义权限或者本级权限, 就需要去重, 不理解可以注释掉,看查询结果 - if (StrUtil.isBlank(dataScopeType)) { - return this.deduplication(list); - } - return list; + /** + * 验证是否被角色或用户关联 + * + * @param deptSet / + */ + public void verifyBindRelationByIds(Set deptSet) { + Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); + if (systemUserService.countUserByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); } + if (systemRoleService.countRoleByDeptIds(deptIds) > 0) { + throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); + } + } - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemDeptTb getDeptById(Long id) { - return systemDeptMapper.selectById(id); - } + private List listEnabledDepts() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDeptTb::getEnabled, 1); + return systemDeptMapper.selectList(wrapper); + } - /** - * 根据PID查询 - * - * @param pid / - * @return / - */ - public List queryDeptByPid(long pid) { - return systemDeptMapper.selectDeptByPid(pid); + /** + * 遍历所有部门和子部门 + * + * @param ids / + */ + public Set traverseDeptByIdWithPids(Set ids) { + Set depts = new HashSet<>(); + for (Long id : ids) { + // 根部门 + depts.add(this.getDeptById(id)); + // 子部门 + List deptList = listDeptByPid(id); + if (CollectionUtil.isNotEmpty(deptList)) { + depts = queryRelationDeptByArgs(deptList, depts); + } } + return depts; + } - /** - * 获取部门下所有关联的部门 - * - * @param deptTbList / - * @param depts / - * @return / - */ - public Set queryRelationDeptSet(List deptTbList, Set depts) { - for (SystemDeptTb dept : deptTbList) { - depts.add(dept); - List deptList = systemDeptMapper.selectDeptByPid(dept.getId()); - if (CollUtil.isNotEmpty(deptList)) { - queryRelationDeptSet(deptList, depts); - } - } - return depts; - } + public List queryDeptSelectDataSource() { + List depts = this.listEnabledDepts(); + return buildDeptSelectOptions(depts); + } - /** - * 获取 - * - * @param deptList 、 - * @return 、 - */ - public List queryChildDeptIdListByDeptIds(List deptList) { - List list = new ArrayList<>(); - for (SystemDeptTb systemDeptTb : deptList) { - if (systemDeptTb != null && systemDeptTb.getEnabled()) { - List deptList1 = systemDeptMapper.selectDeptByPid(systemDeptTb.getId()); - if (CollUtil.isNotEmpty(deptList1)) { - list.addAll(queryChildDeptIdListByDeptIds(deptList1)); - } - list.add(systemDeptTb.getId()); - } - } - return list; + private List buildDeptSelectOptions(List depts) { + // 获取所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + for (SystemDeptTb dept : depts) { + // 构建部门ID路径 + List pathIds = new ArrayList<>(); + buildDeptIdPath(dept, deptMap, pathIds); + // 反转路径,从顶级部门到当前部门 + Collections.reverse(pathIds); + SystemProductLineVo dto = new SystemProductLineVo(); + dto.setValue(dept.getId()); + dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); + // 保留名称路径用于显示 + dto.setLabel(buildNamePath(dept, deptMap)); + options.add(dto); } + // 按部门名称路径排序 + options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); + return options; + } - /** - * 根据ID获取同级与上级数据 - * - * @param dept / - * @param deptList / - * @return / - */ - public List querySuperiorDeptListByPid(SystemDeptTb dept, List deptList) { - if (dept.getPid() == null) { - deptList.addAll(systemDeptMapper.selectDeptByPidIsNull()); - return deptList; - } - deptList.addAll(systemDeptMapper.selectDeptByPid(dept.getPid())); - return querySuperiorDeptListByPid(this.getDeptById(dept.getPid()), deptList); + private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { + pathIds.add(dept.getId()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); } + } - /** - * 构建树形数据 - * - * @param deptList / - * @return / - */ - public KitPageResult buildDeptTree(List deptList) { - Set trees = new LinkedHashSet<>(); - Set deptSet = new LinkedHashSet<>(); - List deptNames = deptList.stream().map(SystemDeptTb::getName).collect(Collectors.toList()); - boolean isChild; - for (SystemDeptTb dept : deptList) { - isChild = false; - if (dept.getPid() == null) { - trees.add(dept); - } - for (SystemDeptTb it : deptList) { - if (it.getPid() != null && dept.getId().equals(it.getPid())) { - isChild = true; - if (dept.getChildren() == null) { - dept.setChildren(new ArrayList<>()); - } - dept.getChildren().add(it); - } - } - if (isChild) { - deptSet.add(dept); - } else if (dept.getPid() != null && !deptNames.contains(this.getDeptById(dept.getPid()).getName())) { - deptSet.add(dept); - } - } - if (CollectionUtil.isEmpty(trees)) { - trees = deptSet; - } - KitPageResult baseResult = new KitPageResult<>(); - baseResult.setContent(CollectionUtil.isEmpty(trees) ? new ArrayList<>(deptSet) : new ArrayList<>(trees)); - baseResult.setTotalElements(deptSet.size()); - return baseResult; - } + private String buildNamePath(SystemDeptTb dept, Map deptMap) { + List pathNames = new ArrayList<>(); + buildDeptNamePath(dept, deptMap, pathNames); + Collections.reverse(pathNames); + return String.join(" / ", pathNames); + } - /** - * 验证是否被角色或用户关联 - * - * @param deptSet / - */ - public void verifyBindRelationByIds(Set deptSet) { - Set deptIds = deptSet.stream().map(SystemDeptTb::getId).collect(Collectors.toSet()); - if (systemUserMapper.countUserByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在用户关联,请解除后再试!"); - } - if (systemRoleMapper.countRoleByDeptIds(deptIds) > 0) { - throw new BadRequestException("所选部门存在角色关联,请解除后再试!"); - } + private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { + pathNames.add(dept.getName()); + if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { + buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); } + } - /** - * 遍历所有部门和子部门 - * - * @param ids / - */ - public Set traverseDeptByIdWithPids(Set ids) { - Set depts = new HashSet<>(); - for (Long id : ids) { - // 根部门 - depts.add(this.getDeptById(id)); - // 子部门 - List deptList = queryDeptByPid(id); - if (CollectionUtil.isNotEmpty(deptList)) { - depts = queryRelationDeptSet(deptList, depts); - } - } - return depts; + public List queryDeptSelectProDataSource() { + List depts = this.listEnabledDepts(); + // 获取所有部门并按父子关系组织 + Map deptMap = + depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); + List options = new ArrayList<>(); + // 构建树形结构 + for (SystemDeptTb dept : depts) { + // 只处理顶级部门(pid为null或0的部门) + if (dept.getPid() == null || dept.getPid() == 0) { + SystemProductLineTreeVo vo = buildDeptTreePro(dept, deptMap); + options.add(vo); + } } + // 按排序字段排序 + options.sort(Comparator.comparingInt(o -> { + Long id = Long.valueOf(o.getValue()); + return deptMap.get(id) != null ? deptMap.get(id).getDeptSort() : 0; + })); + return options; + } - public List queryDeptSelectDataSource() { - List depts = systemDeptMapper.selectEnabledDepts(); - return buildDeptSelectOptions(depts); + /** + * 递归构建部门树 + * + * @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; + } - private List buildDeptSelectOptions(List depts) { - // 获取所有部门并按父子关系组织 - Map deptMap = - depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity())); - List options = new ArrayList<>(); - for (SystemDeptTb dept : depts) { - // 构建部门ID路径 - List pathIds = new ArrayList<>(); - buildDeptIdPath(dept, deptMap, pathIds); - // 反转路径,从顶级部门到当前部门 - Collections.reverse(pathIds); - SystemProductLineVo dto = new SystemProductLineVo(); - dto.setValue(dept.getId()); - dto.setIdPath(pathIds.stream().map(String::valueOf).collect(Collectors.joining("-"))); - // 保留名称路径用于显示 - dto.setLabel(buildNamePath(dept, deptMap)); - options.add(dto); - } - // 按部门名称路径排序 - options.sort(Comparator.comparing(SystemProductLineVo::getLabel)); - return options; - } - - private void buildDeptIdPath(SystemDeptTb dept, Map deptMap, List pathIds) { - pathIds.add(dept.getId()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptIdPath(deptMap.get(dept.getPid()), deptMap, pathIds); - } - } - - private String buildNamePath(SystemDeptTb dept, Map deptMap) { - List pathNames = new ArrayList<>(); - buildDeptNamePath(dept, deptMap, pathNames); - Collections.reverse(pathNames); - return String.join(" / ", pathNames); - } - - private void buildDeptNamePath(SystemDeptTb dept, Map deptMap, List pathNames) { - pathNames.add(dept.getName()); - if (dept.getPid() != null && dept.getPid() != 0 && deptMap.containsKey(dept.getPid())) { - buildDeptNamePath(deptMap.get(dept.getPid()), deptMap, pathNames); - } - } - - public List queryDeptSelectProDataSource() { - List depts = systemDeptMapper.selectEnabledDepts(); - // 获取所有部门并按父子关系组织 - 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); + } } 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 0d073a99..88234ee1 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 @@ -17,87 +17,147 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; +import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.model.SystemCreateDictDetailArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; import cn.odboy.system.dal.mysql.SystemDictDetailMapper; +import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.ArrayList; import java.util.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 SystemDictDetailMapper systemDictDetailMapper; + @Autowired + private SystemDictMapper systemDictMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDictDetail(SystemCreateDictDetailArgs args) { - SystemDictDetailTb dictDetail = BeanUtil.copyProperties(args, SystemDictDetailTb.class); - dictDetail.setDictId(args.getDict().getId()); - systemDictDetailMapper.insert(dictDetail); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDictDetail(SystemCreateDictDetailArgs args) { + SystemDictDetailTb dictDetail = BeanUtil.copyProperties(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); + } + } + + private List listDictDetailByDictId(Long dictId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemDictDetailTb::getDictId, dictId); + return systemDictDetailMapper.selectList(wrapper); + } + + private IPage searchDictDetailByArgs(List dictIds, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CollUtil.isNotEmpty(dictIds), SystemDictDetailTb::getDictId, dictIds); + return systemDictDetailMapper.selectPage(page, wrapper); + } + + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDictDetail(SystemQueryDictDetailArgs args, + Page page) { + IPage iPage = new Page<>(); + List dictIds = new ArrayList<>(); + List dictTbs = new ArrayList<>(); + + if (args == null) { + dictTbs.addAll(systemDictMapper.listAll()); + dictIds = dictTbs.stream().map(SystemDictTb::getId).collect(Collectors.toList()); + } else { + String dictName = args.getDictName(); + if (StrUtil.isBlank(dictName)) { + return KitPageUtil.toPage(iPage); + } + SystemDictTb dictTb = systemDictMapper.getByName(dictName); + if (dictTb == null) { + return KitPageUtil.toPage(iPage); + } else { + dictIds.add(dictTb.getId()); + dictTbs.add(dictTb); + } } - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyDictDetailById(SystemDictDetailTb args) { - SystemDictDetailTb dictDetail = systemDictDetailMapper.selectById(args.getId()); - args.setId(dictDetail.getId()); - systemDictDetailMapper.insertOrUpdate(args); + Map id2ItemMap = dictTbs.stream().collect(Collectors.toMap(SystemDictTb::getId, i -> i)); + iPage = this.searchDictDetailByArgs(dictIds, page) + .convert(i -> BeanUtil.copyProperties(i, SystemDictDetailVo.class)); + for (SystemDictDetailVo record : iPage.getRecords()) { + record.setDict(id2ItemMap.get(record.getDictId())); } + return KitPageUtil.toPage(iPage); + } - /** - * 删除 - * - * @param id / - */ - @Transactional(rollbackFor = Exception.class) - public void removeDictDetailById(Long id) { - systemDictDetailMapper.deleteById(id); + /** + * 根据字典名称获取字典详情 + * + * @param name 字典名称 + * @return / + */ + public List listDictDetailByName(String name) { + if (StrUtil.isBlank(name)) { + return new ArrayList<>(); } - - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryDictDetailByArgs(SystemQueryDictDetailArgs args, Page page) { - return KitPageUtil.toPage(systemDictDetailMapper.selectDictDetailByArgs(args, page)); - } - - /** - * 根据字典名称获取字典详情 - * - * @param name 字典名称 - * @return / - */ - public List queryDictDetailByName(String name) { - SystemQueryDictDetailArgs args = new SystemQueryDictDetailArgs(); - args.setDictName(name); - return systemDictDetailMapper.selectDictDetailByArgs(args); - } - - @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<>(); } + return this.listDictDetailByDictId(systemDictTb.getId()).stream().map(m -> { + SystemDictDetailVo detailVo = BeanUtil.copyProperties(m, SystemDictDetailVo.class); + detailVo.setDict(systemDictTb); + return detailVo; + }).collect(Collectors.toList()); + } } 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 371ddb18..fafa0e92 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 @@ -17,16 +17,17 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.system.dal.dataobject.SystemDictDetailTb; import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.model.SystemCreateDictArgs; +import cn.odboy.system.dal.model.SystemDictDetailVo; import cn.odboy.system.dal.model.SystemQueryDictArgs; -import cn.odboy.system.dal.model.SystemQueryDictDetailArgs; -import cn.odboy.system.dal.mysql.SystemDictDetailMapper; import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.io.IOException; import java.util.ArrayList; @@ -41,104 +42,106 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemDictService { - @Autowired private SystemDictMapper systemDictMapper; - @Autowired private SystemDictDetailMapper systemDictDetailMapper; - @Autowired private SystemDictDetailService systemDictDetailService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveDict(SystemCreateDictArgs args) { - systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); - } + @Autowired + private SystemDictMapper systemDictMapper; + @Autowired + private SystemDictDetailService systemDictDetailService; - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyDictById(SystemDictTb args) { - SystemDictTb dict = systemDictMapper.selectById(args.getId()); - dict.setName(args.getName()); - dict.setDescription(args.getDescription()); - systemDictMapper.insertOrUpdate(dict); - } + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveDict(SystemCreateDictArgs args) { + systemDictMapper.insert(BeanUtil.copyProperties(args, SystemDictTb.class)); + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeDictByIds(Set ids) { - // 删除字典 - systemDictMapper.deleteByIds(ids); - // 删除字典详情 - systemDictDetailService.deleteDictDetailByDictIds(ids); - } + /** + * 编辑 + * + * @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 dicts 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemDictTb dict : dicts) { - SystemQueryDictDetailArgs args = new SystemQueryDictDetailArgs(); - args.setDictName(dict.getName()); - List dictDetails = systemDictDetailMapper.selectDictDetailByArgs(args); - if (CollectionUtil.isNotEmpty(dictDetails)) { - for (SystemDictDetailTb dictDetail : dictDetails) { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", dictDetail.getLabel()); - map.put("字典值", dictDetail.getValue()); - map.put("创建日期", dictDetail.getCreateTime()); - list.add(map); - } - } else { - Map map = new LinkedHashMap<>(); - map.put("字典名称", dict.getName()); - map.put("字典描述", dict.getDescription()); - map.put("字典标签", null); - map.put("字典值", null); - map.put("创建日期", dict.getCreateTime()); - list.add(map); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteDictByIds(Set ids) { + // 删除字典 + systemDictMapper.deleteByIds(ids); + // 删除字典详情 + systemDictDetailService.deleteDictDetailByDictIds(ids); + } + + /** + * 导出数据 + * + * @param dicts 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportDictExcel(List dicts, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemDictTb dict : dicts) { + List dictDetails = systemDictDetailService.listDictDetailByName(dict.getName()); + if (CollectionUtil.isNotEmpty(dictDetails)) { + for (SystemDictDetailTb dictDetail : dictDetails) { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", dictDetail.getLabel()); + map.put("字典值", dictDetail.getValue()); + map.put("创建日期", dictDetail.getCreateTime()); + list.add(map); } - KitFileUtil.downloadExcel(list, response); + } else { + Map map = new LinkedHashMap<>(); + map.put("字典名称", dict.getName()); + map.put("字典描述", dict.getDescription()); + map.put("字典标签", null); + map.put("字典值", null); + map.put("创建日期", dict.getCreateTime()); + list.add(map); + } } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryDictByArgs(SystemQueryDictArgs args, Page page) { - return KitPageUtil.toPage(systemDictMapper.selectDictByArgs(args, page)); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchDict(SystemQueryDictArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + Page selectPage = systemDictMapper.selectPage(page, wrapper); + return KitPageUtil.toPage(selectPage); + } - /** - * 查询全部数据 - * - * @param args / - * @return / - */ - public List queryDictByArgs(SystemQueryDictArgs args) { - return systemDictMapper.selectDictByArgs(args); + 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 SystemDictTb getById(int id) { - return systemDictMapper.selectById(id); - } + public List queryDictByArgs(SystemQueryDictArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + injectQueryParams(args, wrapper); + return systemDictMapper.selectList(wrapper); + } } 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 24baa3a7..514146bb 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 @@ -38,114 +38,119 @@ import org.springframework.transaction.annotation.Transactional; @Slf4j @Service public class SystemEmailService { - @Autowired private SystemEmailConfigMapper systemEmailConfigMapper; - @Autowired private KitRedisHelper redisHelper; - @Autowired private AppProperties properties; - @Value("${spring.application.title}") private String applicationTitle; - /** - * 更新邮件配置 - * - * @param emailConfig 邮箱配置 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyEmailConfig(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); - } + @Autowired + private SystemEmailConfigMapper systemEmailConfigMapper; + @Autowired + private KitRedisHelper redisHelper; + @Autowired + private AppProperties properties; + @Value("${spring.application.title}") + private String applicationTitle; - /** - * 发送邮件 - * - * @param sendEmailRequest 邮件发送的内容 - */ - public void sendEmail(SystemSendEmailArgs sendEmailRequest) { - SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); - if (systemEmailConfigTb.getId() == null) { - throw new BadRequestException("请先配置, 再操作"); - } - // 封装 - MailAccount account = new MailAccount(); - // 设置用户 - String user = systemEmailConfigTb.getFromUser().split("@")[0]; - account.setUser(user); - account.setHost(systemEmailConfigTb.getHost()); - account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); - account.setAuth(true); - try { - // 对称解密 - account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); - } catch (Exception e) { - throw new BadRequestException(e.getMessage()); - } - account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); - // ssl方式发送 - account.setSslEnable(true); - // 使用STARTTLS安全连接 - account.setStarttlsEnable(true); - // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 - account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); - String content = sendEmailRequest.getContent(); - // 发送 - try { - int size = sendEmailRequest.getTos().size(); - Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) - .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) - // 关闭session - .setUseGlobalSession(false).send(); - } catch (Exception e) { - log.error("邮件发送失败", e); - throw new BadRequestException("邮件发送失败"); - } + /** + * 更新邮件配置 + * + * @param 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); + } - /** - * 校验邮箱验证码 - */ - public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { - String redisKey = biEnum.getRedisKey() + email; - String value = redisHelper.get(redisKey, String.class); - if (value == null || !value.equals(code)) { - throw new BadRequestException("无效验证码"); - } else { - redisHelper.del(redisKey); - } + /** + * 发送邮件 + * + * @param sendEmailRequest 邮件发送的内容 + */ + public void sendEmail(SystemSendEmailArgs sendEmailRequest) { + SystemEmailConfigTb systemEmailConfigTb = getLastEmailConfig(); + if (systemEmailConfigTb.getId() == null) { + throw new BadRequestException("请先配置, 再操作"); } + // 封装 + MailAccount account = new MailAccount(); + // 设置用户 + String user = systemEmailConfigTb.getFromUser().split("@")[0]; + account.setUser(user); + account.setHost(systemEmailConfigTb.getHost()); + account.setPort(Integer.parseInt(systemEmailConfigTb.getPort())); + account.setAuth(true); + try { + // 对称解密 + account.setPass(KitDesEncryptUtil.desDecrypt(systemEmailConfigTb.getPassword())); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + account.setFrom(systemEmailConfigTb.getUser() + "<" + systemEmailConfigTb.getFromUser() + ">"); + // ssl方式发送 + account.setSslEnable(true); + // 使用STARTTLS安全连接 + account.setStarttlsEnable(true); + // 解决jdk8之后默认禁用部分tls协议, 导致邮件发送失败的问题 + account.setSslProtocols("TLSv1 TLSv1.1 TLSv1.2"); + String content = sendEmailRequest.getContent(); + // 发送 + try { + int size = sendEmailRequest.getTos().size(); + Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])) + .setTitle(sendEmailRequest.getSubject()).setContent(content).setHtml(true) + // 关闭session + .setUseGlobalSession(false).send(); + } catch (Exception e) { + log.error("邮件发送失败", e); + throw new BadRequestException("邮件发送失败"); + } + } - /** - * 发送给邮箱验证码 - */ - public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { - if (biEnum == null) { - throw new BadRequestException("biEnum必填"); - } - String content; - String redisKey = biEnum.getRedisKey() + email; - String oldCode = redisHelper.get(redisKey, String.class); - if (oldCode == null) { - String code = RandomUtil.randomNumbers(6); - // 存入缓存 - if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { - throw new BadRequestException("服务异常, 请联系网站负责人"); - } - // 存在就再次发送原来的验证码 - content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); - } else { - content = - KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); - } - SystemSendEmailArgs sendEmailRequest = - new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); - sendEmail(sendEmailRequest); + /** + * 校验邮箱验证码 + */ + public void checkEmailCaptcha(SystemCaptchaBizEnum biEnum, String email, String code) { + String redisKey = biEnum.getRedisKey() + email; + String value = redisHelper.get(redisKey, String.class); + if (value == null || !value.equals(code)) { + throw new BadRequestException("无效验证码"); + } else { + redisHelper.del(redisKey); } + } - public SystemEmailConfigTb getLastEmailConfig() { - SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); - return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + /** + * 发送给邮箱验证码 + */ + public void sendCaptcha(SystemCaptchaBizEnum biEnum, String email) { + if (biEnum == null) { + throw new BadRequestException("biEnum必填"); } + String content; + String redisKey = biEnum.getRedisKey() + email; + String oldCode = redisHelper.get(redisKey, String.class); + if (oldCode == null) { + String code = RandomUtil.randomNumbers(6); + // 存入缓存 + if (!redisHelper.set(redisKey, code, properties.getCaptcha().getExpireTime())) { + throw new BadRequestException("服务异常, 请联系网站负责人"); + } + // 存在就再次发送原来的验证码 + content = KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", code)); + } else { + content = + KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); + } + SystemSendEmailArgs sendEmailRequest = + new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); + sendEmail(sendEmailRequest); + } + + public SystemEmailConfigTb getLastEmailConfig() { + SystemEmailConfigTb systemEmailConfigTb = systemEmailConfigMapper.selectById(1L); + return systemEmailConfigTb == null ? new SystemEmailConfigTb() : systemEmailConfigTb; + } } 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 24dfaf0c..6f2ffdac 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 @@ -16,15 +16,17 @@ package cn.odboy.system.service; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.system.dal.dataobject.SystemJobTb; import cn.odboy.system.dal.model.SystemCreateJobArgs; import cn.odboy.system.dal.model.SystemQueryJobArgs; import cn.odboy.system.dal.mysql.SystemJobMapper; -import cn.odboy.system.dal.mysql.SystemUserMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.io.IOException; import java.util.ArrayList; @@ -39,97 +41,118 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemJobService { - @Autowired private SystemJobMapper systemJobMapper; - @Autowired private SystemUserMapper systemUserMapper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveJob(SystemCreateJobArgs args) { - SystemJobTb job = systemJobMapper.getJobByName(args.getName()); - if (job != null) { - throw new BadRequestException("职位名称已存在"); - } - systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); - } + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemUserService systemUserService; - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyJobById(SystemJobTb args) { - SystemJobTb job = systemJobMapper.selectById(args.getId()); - SystemJobTb old = systemJobMapper.getJobByName(args.getName()); - if (old != null && !old.getId().equals(args.getId())) { - throw new BadRequestException("职位名称已存在"); - } - args.setId(job.getId()); - systemJobMapper.insertOrUpdate(args); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveJob(SystemCreateJobArgs args) { + SystemJobTb job = this.getJobByName(args.getName()); + if (job != null) { + throw new BadRequestException("职位名称已存在"); } + systemJobMapper.insert(BeanUtil.copyProperties(args, SystemJobTb.class)); + } - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeJobByIds(Set ids) { - systemJobMapper.deleteByIds(ids); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateJobById(SystemJobTb args) { + SystemJobTb job = systemJobMapper.selectById(args.getId()); + SystemJobTb old = this.getJobByName(args.getName()); + if (old != null && !old.getId().equals(args.getId())) { + throw new BadRequestException("职位名称已存在"); } + args.setId(job.getId()); + systemJobMapper.insertOrUpdate(args); + } - /** - * 导出数据 - * - * @param jobs 待导出的数据 - * @param response / - * @throws IOException - */ - public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemJobTb job : jobs) { - Map map = new LinkedHashMap<>(); - map.put("岗位名称", job.getName()); - map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); - map.put("创建日期", job.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + systemJobMapper.deleteByIds(ids); + } - /** - * 分页查询 - * - * @param args 条件 - * @param page 分页参数 - * @return - */ - public KitPageResult queryJobByArgs(SystemQueryJobArgs args, Page page) { - return KitPageUtil.toPage(systemJobMapper.selectJobByArgs(args, page)); + /** + * 导出数据 + * + * @param jobs 待导出的数据 + * @param response / + */ + public void exportJobExcel(List jobs, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemJobTb job : jobs) { + Map map = new LinkedHashMap<>(); + map.put("岗位名称", job.getName()); + map.put("岗位状态", job.getEnabled() ? "启用" : "停用"); + map.put("创建日期", job.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param args / - * @return / - */ - public List queryJobByArgs(SystemQueryJobArgs args) { - return systemJobMapper.selectJobByArgs(args); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + */ + public KitPageResult searchJobByArgs(SystemQueryJobArgs args, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + Page selectPage = systemJobMapper.selectPage(page, wrapper); + return KitPageUtil.toPage(selectPage); + } - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserMapper.countUserByJobIds(ids) > 0) { - throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); - } + /** + * 查询全部数据 + */ + public List queryJobByArgs(SystemQueryJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemJobMapper.selectList(wrapper); + } + + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserService.countUserByJobIds(ids) > 0) { + throw new BadRequestException("所选的岗位中存在用户关联, 请解除关联再试!"); } + } + + 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); + } } 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 bb883cec..a5bf2bcd 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 @@ -15,6 +15,7 @@ */ package cn.odboy.system.service; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IORuntimeException; @@ -28,6 +29,7 @@ import cn.odboy.system.dal.model.SystemQueryStorageArgs; import cn.odboy.system.dal.mysql.SystemLocalStorageMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.io.File; import java.io.IOException; @@ -44,120 +46,138 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemLocalStorageService { - @Autowired private SystemLocalStorageMapper systemLocalStorageMapper; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - @Autowired private AppProperties properties; - /** - * 上传 - * - * @param name 文件名称 - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { - long size = multipartFile.getSize(); - KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); - String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); - String type = KitFileUtil.getFileType(suffix); - String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); - File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); - if (file == null) { - throw new BadRequestException("上传失败"); - } - try { - String formatSize = KitFileUtil.getSize(size); - String prefixName = - StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; - SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); - localStorage.setRealName(file.getName()); - localStorage.setName(prefixName); - localStorage.setSuffix(suffix); - localStorage.setPath(file.getPath()); - localStorage.setType(type); - localStorage.setSize(formatSize); - localStorage.setDateGroup(uploadDateStr); - systemLocalStorageMapper.insert(localStorage); - return localStorage; - } catch (Exception e) { - KitFileUtil.del(file); - throw e; - } - } + @Autowired + private SystemLocalStorageMapper systemLocalStorageMapper; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private AppProperties properties; - /** - * 编辑 - * - * @param args 文件信息 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyLocalStorageById(SystemLocalStorageTb args) { - SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); - localStorage.copy(args); - systemLocalStorageMapper.insertOrUpdate(localStorage); + /** + * 上传 + * + * @param name 文件名称 + * @param multipartFile 文件 + * @return / + */ + @Transactional(rollbackFor = Exception.class) + public SystemLocalStorageTb uploadFile(String name, MultipartFile multipartFile) { + long size = multipartFile.getSize(); + KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); + String suffix = KitFileUtil.getSuffix(multipartFile.getOriginalFilename()); + String type = KitFileUtil.getFileType(suffix); + String uploadDateStr = DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT); + File file = KitFileUtil.upload(multipartFile, fileUploadPathHelper.getPath() + uploadDateStr + File.separator); + if (file == null) { + throw new BadRequestException("上传失败"); } + try { + String formatSize = KitFileUtil.getSize(size); + String prefixName = + StrUtil.isBlank(name) ? KitFileUtil.getPrefix(multipartFile.getOriginalFilename()) : name; + SystemLocalStorageTb localStorage = new SystemLocalStorageTb(); + localStorage.setRealName(file.getName()); + localStorage.setName(prefixName); + localStorage.setSuffix(suffix); + localStorage.setPath(file.getPath()); + localStorage.setType(type); + localStorage.setSize(formatSize); + localStorage.setDateGroup(uploadDateStr); + systemLocalStorageMapper.insert(localStorage); + return localStorage; + } catch (Exception e) { + KitFileUtil.del(file); + throw e; + } + } - /** - * 多选删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeFileByIds(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 文件信息 + */ + @Transactional(rollbackFor = Exception.class) + public void updateLocalStorageById(SystemLocalStorageTb args) { + SystemLocalStorageTb localStorage = systemLocalStorageMapper.selectById(args.getId()); + localStorage.copy(args); + systemLocalStorageMapper.insertOrUpdate(localStorage); + } - /** - * 导出数据 - * - * @param localStorages 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemLocalStorageTb localStorage : localStorages) { - Map map = new LinkedHashMap<>(); - map.put("文件名", localStorage.getRealName()); - map.put("备注名", localStorage.getName()); - map.put("文件类型", localStorage.getType()); - map.put("文件大小", localStorage.getSize()); - map.put("创建者", localStorage.getCreateBy()); - map.put("创建日期", localStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 多选删除 + * + * @param 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 criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryLocalStorage(SystemQueryStorageArgs criteria, - Page page) { - return KitPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page)); + /** + * 导出数据 + * + * @param localStorages 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportLocalStorageExcel(List localStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemLocalStorageTb localStorage : localStorages) { + Map map = new LinkedHashMap<>(); + map.put("文件名", localStorage.getRealName()); + map.put("备注名", localStorage.getName()); + map.put("文件类型", localStorage.getType()); + map.put("文件大小", localStorage.getSize()); + map.put("创建者", localStorage.getCreateBy()); + map.put("创建日期", localStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 查询全部数据 - * - * @param criteria 条件 - * @return / - */ - public List queryLocalStorage(SystemQueryStorageArgs criteria) { - return systemLocalStorageMapper.selectLocalStorageByArgs(criteria); + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchLocalStorage(SystemQueryStorageArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + Page selectPage = systemLocalStorageMapper.selectPage(page, wrapper); + return KitPageUtil.toPage(selectPage); + } + + private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or() + .like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or() + .like(SystemLocalStorageTb::getType, args.getBlurry()).or() + .like(SystemLocalStorageTb::getCreateBy, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemLocalStorageTb::getId); + } + + public List queryLocalStorageByArgs(SystemQueryStorageArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQueryParams(args, wrapper); + return systemLocalStorageMapper.selectList(wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/SystemMenuService.java index a4269aa0..97a3e406 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 @@ -28,11 +28,13 @@ import cn.odboy.system.dal.dataobject.SystemRoleTb; import cn.odboy.system.dal.model.SystemMenuMetaVo; import cn.odboy.system.dal.model.SystemMenuVo; import cn.odboy.system.dal.model.SystemQueryMenuArgs; +import cn.odboy.system.dal.model.SystemRoleVo; import cn.odboy.system.dal.mysql.SystemMenuMapper; import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; import cn.odboy.util.KitClassUtil; import cn.odboy.util.KitFileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -51,351 +53,405 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemMenuService { - private static final String YES_STR = "是"; - private static final String NO_STR = "否"; - @Autowired private SystemMenuMapper systemMenuMapper; - @Autowired private SystemRoleMenuMapper systemRoleMenuMapper; - @Autowired private SystemRoleService systemRoleService; - @Autowired private SystemRoleMenuService systemRoleMenuService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveMenu(SystemMenuTb args) { - if (systemMenuMapper.getMenuByTitle(args.getTitle()) != null) { - throw new BadRequestException("菜单标题已存在"); - } - if (StrUtil.isNotBlank(args.getComponentName())) { - if (systemMenuMapper.getMenuByComponentName(args.getComponentName()) != null) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - if (Long.valueOf(0L).equals(args.getPid())) { - args.setPid(null); - } - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - systemMenuMapper.insert(args); - // 计算子节点数目 - args.setSubCount(0); - // 更新父节点菜单数目 - this.updateMenuSubCnt(args.getPid()); + private static final String YES_STR = "是"; + private static final String NO_STR = "否"; + @Autowired + private SystemMenuMapper systemMenuMapper; + @Autowired + private SystemRoleMenuMapper systemRoleMenuMapper; + @Autowired + private SystemRoleService systemRoleService; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveMenu(SystemMenuTb args) { + if (this.getMenuByTitle(args.getTitle()) != null) { + throw new BadRequestException("菜单标题已存在"); } - - /** - * 编辑 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyMenuById(SystemMenuTb args) { - if (args.getId().equals(args.getPid())) { - throw new BadRequestException("上级不能为自己"); - } - SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); - if (args.getIFrame()) { - if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || - args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { - throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); - } - } - SystemMenuTb menu1 = systemMenuMapper.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 = systemMenuMapper.getMenuByComponentName(args.getComponentName()); - if (menu1 != null && !menu1.getId().equals(menu.getId())) { - throw new BadRequestException("菜单组件名称已存在"); - } - } - menu.setTitle(args.getTitle()); - menu.setComponent(args.getComponent()); - menu.setPath(args.getPath()); - menu.setIcon(args.getIcon()); - menu.setIFrame(args.getIFrame()); - menu.setPid(args.getPid()); - menu.setMenuSort(args.getMenuSort()); - menu.setCache(args.getCache()); - menu.setHidden(args.getHidden()); - menu.setComponentName(args.getComponentName()); - menu.setPermission(args.getPermission()); - menu.setType(args.getType()); - // auto fill - menu.setUpdateBy(null); - menu.setUpdateTime(null); - systemMenuMapper.insertOrUpdate(menu); - // 计算父级菜单节点数目 - this.updateMenuSubCnt(oldPid); - this.updateMenuSubCnt(newPid); + if (StrUtil.isNotBlank(args.getComponentName())) { + if (this.getMenuByComponentName(args.getComponentName()) != null) { + throw new BadRequestException("菜单组件名称已存在"); + } } - - /** - * 删除 - */ - @Transactional(rollbackFor = Exception.class) - public void removeMenuByIds(Set ids) { - Set menuSet = new HashSet<>(); - for (Long id : ids) { - List menuList = this.queryMenuByPid(id); - menuSet.add(systemMenuMapper.selectById(id)); - menuSet = this.queryChildMenu(menuList, menuSet); - } - List menuIds = - menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(menuIds)) { - KitSpringBeanHolder.getBean(SystemMenuService.class).removeRoleMenuByMenuIds(menuIds); - systemMenuMapper.deleteByIds(menuIds); - } - for (SystemMenuTb menu : menuSet) { - this.updateMenuSubCnt(menu.getPid()); - } + if (Long.valueOf(0L).equals(args.getPid())) { + args.setPid(null); } + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + systemMenuMapper.insert(args); + // 计算子节点数目 + args.setSubCount(0); + // 更新父节点菜单数目 + this.updateMenuSubCnt(args.getPid()); + } - @Transactional(rollbackFor = Exception.class) - public void removeRoleMenuByMenuIds(List menuIds) { - if (CollUtil.isNotEmpty(menuIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); - systemRoleMenuMapper.delete(wrapper); + /** + * 编辑 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateMenuById(SystemMenuTb args) { + if (args.getId().equals(args.getPid())) { + throw new BadRequestException("上级不能为自己"); + } + SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); + if (args.getIFrame()) { + if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || + args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { + throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); + } + } + SystemMenuTb menu1 = this.getMenuByTitle(args.getTitle()); + if (menu1 != null && !menu1.getId().equals(menu.getId())) { + throw new BadRequestException("菜单标题已存在"); + } + if (args.getPid().equals(0L)) { + args.setPid(null); + } + // 记录的父节点ID + Long oldPid = menu.getPid(); + Long newPid = args.getPid(); + if (StrUtil.isNotBlank(args.getComponentName())) { + menu1 = this.getMenuByComponentName(args.getComponentName()); + if (menu1 != null && !menu1.getId().equals(menu.getId())) { + throw new BadRequestException("菜单组件名称已存在"); + } + } + menu.setTitle(args.getTitle()); + menu.setComponent(args.getComponent()); + menu.setPath(args.getPath()); + menu.setIcon(args.getIcon()); + menu.setIFrame(args.getIFrame()); + menu.setPid(args.getPid()); + menu.setMenuSort(args.getMenuSort()); + menu.setCache(args.getCache()); + menu.setHidden(args.getHidden()); + menu.setComponentName(args.getComponentName()); + menu.setPermission(args.getPermission()); + menu.setType(args.getType()); + // auto fill + menu.setUpdateBy(null); + menu.setUpdateTime(null); + systemMenuMapper.insertOrUpdate(menu); + // 计算父级菜单节点数目 + this.updateMenuSubCnt(oldPid); + this.updateMenuSubCnt(newPid); + } + + /** + * 删除 + */ + @Transactional(rollbackFor = Exception.class) + public void deleteMenuByIds(Set ids) { + Set menuSet = new HashSet<>(); + for (Long id : ids) { + List menuList = this.listMenuByPid(id); + menuSet.add(systemMenuMapper.selectById(id)); + menuSet = this.queryChildMenuByArgs(menuList, menuSet); + } + List menuIds = + menuSet.stream().map(SystemMenuTb::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(menuIds)) { + KitSpringBeanHolder.getBean(SystemMenuService.class).deleteRoleMenuByMenuIds(menuIds); + systemMenuMapper.deleteByIds(menuIds); + } + for (SystemMenuTb menu : menuSet) { + this.updateMenuSubCnt(menu.getPid()); + } + } + + @Transactional(rollbackFor = Exception.class) + public void deleteRoleMenuByMenuIds(List menuIds) { + if (CollUtil.isNotEmpty(menuIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getMenuId, menuIds); + systemRoleMenuMapper.delete(wrapper); + } + } + + /** + * 导出 + * + * @param menus 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemMenuTb menu : menus) { + Map map = new LinkedHashMap<>(); + map.put("菜单标题", menu.getTitle()); + map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); + map.put("权限标识", menu.getPermission()); + map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); + map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); + map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); + map.put("创建日期", menu.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + @Transactional(rollbackFor = Exception.class) + public void updateMenuSubCnt(Long menuId) { + if (menuId != null) { + long count = this.countMenuByPid(menuId); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SystemMenuTb::getId, menuId); + wrapper.set(SystemMenuTb::getSubCount, count); + systemMenuMapper.update(wrapper); + } + } + + /** + * 查询全部数据 + * + * @param args 条件 + * @param isQuery / + * @return / + * @throws Exception / + */ + public List queryAllMenu(SystemQueryMenuArgs args, Boolean isQuery) throws Exception { + if (Boolean.TRUE.equals(isQuery)) { + args.setPidIsNull(true); + List fields = KitClassUtil.getAllFields(args.getClass(), new ArrayList<>()); + for (Field field : fields) { + //设置对象的访问权限, 保证对private的属性的访问 + field.setAccessible(true); + Object val = field.get(args); + if ("pidIsNull".equals(field.getName())) { + continue; } - } - - /** - * 导出 - * - * @param menus 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportMenuExcel(List menus, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - Map map = new LinkedHashMap<>(); - map.put("菜单标题", menu.getTitle()); - map.put("菜单类型", menu.getType() == null ? "目录" : menu.getType() == 1 ? "菜单" : "按钮"); - map.put("权限标识", menu.getPermission()); - map.put("外链菜单", menu.getIFrame() ? YES_STR : NO_STR); - map.put("菜单可见", menu.getHidden() ? NO_STR : YES_STR); - map.put("是否缓存", menu.getCache() ? YES_STR : NO_STR); - map.put("创建日期", menu.getCreateTime()); - list.add(map); + // 如果有查询条件, 则不指定pidIsNull + if (ObjectUtil.isNotNull(val)) { + args.setPidIsNull(null); + break; } - KitFileUtil.downloadExcel(list, response); + } } + return this.queryMenuByArgs(args); + } - @Transactional(rollbackFor = Exception.class) - public void updateMenuSubCnt(Long menuId) { - if (menuId != null) { - long count = systemMenuMapper.countMenuByPid(menuId); - systemMenuMapper.updateMenuSubCntByMenuId(count, menuId); + /** + * 根据当前用户获取菜单 + * + * @param currentUserId / + * @return / + */ + public List listMenuByUserId(Long currentUserId) { + List roles = systemRoleService.queryRoleByUsersId(currentUserId); + Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); + return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIds(roleIds)); + } + + /** + * 获取所有子节点, 包含自身ID + * + * @param menuList / + * @param menuSet / + * @return / + */ + public Set queryChildMenuByArgs(List menuList, Set menuSet) { + for (SystemMenuTb menu : menuList) { + menuSet.add(menu); + List menus = this.listMenuByPid(menu.getId()); + if (CollUtil.isNotEmpty(menus)) { + queryChildMenuByArgs(menus, menuSet); + } + } + return menuSet; + } + + /** + * 懒加载菜单数据 + * + * @param pid / + * @return / + */ + public List listMenuByPid(Long pid) { + List menus; + if (pid != null && !pid.equals(0L)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } else { + menus = this.listRootMenu(); + } + return menus; + } + + /** + * 根据ID获取同级与上级数据 + * + * @param menu / + * @param menus / + * @return / + */ + public List querySuperiorMenuByArgs(SystemMenuTb menu, List menus) { + if (menu.getPid() == null) { + menus.addAll(this.listRootMenu()); + return menus; + } + menus.addAll(this.listMenuByPid(menu.getPid())); + return querySuperiorMenuByArgs(systemMenuMapper.selectById(menu.getPid()), menus); + } + + /** + * 构建菜单树 + * + * @param menus 原始数据 + * @return / + */ + public List buildMenuTree(List menus) { + List trees = new ArrayList<>(); + Set ids = new HashSet<>(); + for (SystemMenuTb menu : menus) { + if (menu.getPid() == null) { + trees.add(menu); + } + for (SystemMenuTb it : menus) { + if (menu.getId().equals(it.getPid())) { + if (menu.getChildren() == null) { + menu.setChildren(new ArrayList<>()); + } + menu.getChildren().add(it); + ids.add(it.getId()); } + } } - - /** - * 查询全部数据 - * - * @param criteria 条件 - * @param isQuery / - * @return / - * @throws Exception / - */ - public List queryAllMenu(SystemQueryMenuArgs criteria, Boolean isQuery) throws Exception { - if (Boolean.TRUE.equals(isQuery)) { - criteria.setPidIsNull(true); - List fields = KitClassUtil.getAllFields(criteria.getClass(), new ArrayList<>()); - for (Field field : fields) { - //设置对象的访问权限, 保证对private的属性的访问 - field.setAccessible(true); - Object val = field.get(criteria); - if ("pidIsNull".equals(field.getName())) { - continue; - } - // 如果有查询条件, 则不指定pidIsNull - if (ObjectUtil.isNotNull(val)) { - criteria.setPidIsNull(null); - break; - } - } - } - return systemMenuMapper.selectMenuByArgs(criteria); + if (CollUtil.isNotEmpty(trees)) { + trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); } + return trees; + } - /** - * 根据当前用户获取菜单 - * - * @param currentUserId / - * @return / - */ - public List queryMenuListByUserId(Long currentUserId) { - List roles = systemRoleService.queryRoleByUsersId(currentUserId); - Set roleIds = roles.stream().map(SystemRoleTb::getId).collect(Collectors.toSet()); - return new ArrayList<>(systemRoleMenuService.queryMenuByRoleIdsAndType(roleIds, 2)); - } - - /** - * 获取所有子节点, 包含自身ID - * - * @param menuList / - * @param menuSet / - * @return / - */ - public Set queryChildMenu(List menuList, Set menuSet) { - for (SystemMenuTb menu : menuList) { - menuSet.add(menu); - List menus = systemMenuMapper.selectMenuByPid(menu.getId()); - if (CollUtil.isNotEmpty(menus)) { - queryChildMenu(menus, menuSet); - } - } - return menuSet; - } - - /** - * 懒加载菜单数据 - * - * @param pid / - * @return / - */ - public List queryMenuByPid(Long pid) { - List menus; - if (pid != null && !pid.equals(0L)) { - menus = systemMenuMapper.selectMenuByPid(pid); - } else { - menus = systemMenuMapper.selectMenuByPidIsNull(); - } - return menus; - } - - /** - * 根据ID获取同级与上级数据 - * - * @param menu / - * @param menus / - * @return / - */ - public List querySuperiorMenuList(SystemMenuTb menu, List menus) { - if (menu.getPid() == null) { - menus.addAll(systemMenuMapper.selectMenuByPidIsNull()); - return menus; - } - menus.addAll(systemMenuMapper.selectMenuByPid(menu.getPid())); - return querySuperiorMenuList(systemMenuMapper.selectById(menu.getPid()), menus); - } - - /** - * 构建菜单树 - * - * @param menus 原始数据 - * @return / - */ - public List buildMenuTree(List menus) { - List trees = new ArrayList<>(); - Set ids = new HashSet<>(); - for (SystemMenuTb menu : menus) { - if (menu.getPid() == null) { - trees.add(menu); - } - for (SystemMenuTb it : menus) { - if (menu.getId().equals(it.getPid())) { - if (menu.getChildren() == null) { - menu.setChildren(new ArrayList<>()); - } - menu.getChildren().add(it); - ids.add(it.getId()); - } - } - } - if (CollUtil.isNotEmpty(trees)) { - trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList()); - } - return trees; - } - - /** - * 构建菜单树 - * - * @param menus / - * @return / - */ - public List buildMenuVo(List menus) { - List list = new LinkedList<>(); - menus.forEach(menu -> { - if (menu != null) { - List menuList = menu.getChildren(); - SystemMenuVo menuVo = new SystemMenuVo(); - menuVo.setName( - ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); - // 一级目录需要加斜杠, 不然会报警告 - menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); - menuVo.setHidden(menu.getHidden()); - // 如果不是外链 - if (!menu.getIFrame()) { - if (menu.getPid() == null) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); - // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 - } else if (menu.getType() == 0) { - menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); - } else if (StrUtil.isNotBlank(menu.getComponent())) { - menuVo.setComponent(menu.getComponent()); - } - } - menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); - if (CollectionUtil.isNotEmpty(menuList)) { - menuVo.setAlwaysShow(true); - menuVo.setRedirect("noredirect"); - menuVo.setChildren(buildMenuVo(menuList)); - // 处理是一级菜单并且没有子菜单的情况 - } else if (menu.getPid() == null) { - SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); - menuVo.setName(null); - menuVo.setMeta(null); - menuVo.setComponent("Layout"); - List list1 = new ArrayList<>(); - list1.add(menuVo1); - menuVo.setChildren(list1); - } - list.add(menuVo); - } - }); - return list; - } - - /** - * 获取 MenuResponse - * - * @param menu / - * @param menuVo / - * @return / - */ - private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { - SystemMenuVo menuVo1 = new SystemMenuVo(); - menuVo1.setMeta(menuVo.getMeta()); - // 非外链 + /** + * 构建菜单树 + * + * @param menus / + * @return / + */ + public List buildMenuVo(List menus) { + List list = new LinkedList<>(); + menus.forEach(menu -> { + if (menu != null) { + List menuList = menu.getChildren(); + SystemMenuVo menuVo = new SystemMenuVo(); + menuVo.setName( + ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle()); + // 一级目录需要加斜杠, 不然会报警告 + menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath()); + menuVo.setHidden(menu.getHidden()); + // 如果不是外链 if (!menu.getIFrame()) { - menuVo1.setPath("index"); - menuVo1.setName(menuVo.getName()); - menuVo1.setComponent(menuVo.getComponent()); - } else { - menuVo1.setPath(menu.getPath()); + if (menu.getPid() == null) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent()); + // 如果不是一级菜单,并且菜单类型为目录,则代表是多级菜单 + } else if (menu.getType() == 0) { + menuVo.setComponent(StrUtil.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent()); + } else if (StrUtil.isNotBlank(menu.getComponent())) { + menuVo.setComponent(menu.getComponent()); + } } - return menuVo1; - } + menuVo.setMeta(new SystemMenuMetaVo(menu.getTitle(), menu.getIcon(), !menu.getCache())); + if (CollectionUtil.isNotEmpty(menuList)) { + menuVo.setAlwaysShow(true); + menuVo.setRedirect("noredirect"); + menuVo.setChildren(buildMenuVo(menuList)); + // 处理是一级菜单并且没有子菜单的情况 + } else if (menu.getPid() == null) { + SystemMenuVo menuVo1 = getMenuVo(menu, menuVo); + menuVo.setName(null); + menuVo.setMeta(null); + menuVo.setComponent("Layout"); + List list1 = new ArrayList<>(); + list1.add(menuVo1); + menuVo.setChildren(list1); + } + list.add(menuVo); + } + }); + return list; + } - public List queryMenuByIds(List ids) { - return systemMenuMapper.selectByIds(ids); + /** + * 获取 MenuResponse + * + * @param menu / + * @param menuVo / + * @return / + */ + private SystemMenuVo getMenuVo(SystemMenuTb menu, SystemMenuVo menuVo) { + SystemMenuVo menuVo1 = new SystemMenuVo(); + menuVo1.setMeta(menuVo.getMeta()); + // 非外链 + if (!menu.getIFrame()) { + menuVo1.setPath("index"); + menuVo1.setName(menuVo.getName()); + menuVo1.setComponent(menuVo.getComponent()); + } else { + menuVo1.setPath(menu.getPath()); } + return menuVo1; + } + + public List listMenuByIds(List ids) { + return systemMenuMapper.selectByIds(ids); + } + + private SystemMenuTb getMenuByComponentName(String componentName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getComponentName, componentName); + return systemMenuMapper.selectOne(wrapper); + } + + private SystemMenuTb getMenuByTitle(String title) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getTitle, title); + return systemMenuMapper.selectOne(wrapper); + } + + private Long countMenuByPid(Long pid) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemMenuTb::getPid, pid); + return systemMenuMapper.selectCount(wrapper); + } + + private List queryMenuByArgs(SystemQueryMenuArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.isNull(args.getPidIsNull() != null, SystemMenuTb::getPid); + wrapper.eq(args.getPid() != null, SystemMenuTb::getPid, args.getPid()); + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemMenuTb::getTitle, args.getBlurry()).or() + .like(SystemMenuTb::getComponentName, args.getBlurry()).or() + .like(SystemMenuTb::getPermission, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemMenuTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } + + private List listRootMenu() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.isNull(SystemMenuTb::getPid); + wrapper.orderByAsc(SystemMenuTb::getMenuSort); + return systemMenuMapper.selectList(wrapper); + } } 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 46059879..ce6e401e 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 @@ -43,172 +43,173 @@ import oshi.util.Util; @Slf4j @Service public class SystemMonitorService { - private final DecimalFormat df = new DecimalFormat("0.00"); - /** - * 查询服务器监控信息 - * - * @return Map - */ - public Map queryServerMonitorInfo() { - 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; - } + private final DecimalFormat df = new DecimalFormat("0.00"); - /** - * 获取磁盘信息 - * - * @return / - */ - private Map getDiskInfo(OperatingSystem os) { - Map diskInfo = new LinkedHashMap<>(); - FileSystem fileSystem = os.getFileSystem(); - List fsArray = fileSystem.getFileStores(); - String osName = System.getProperty("os.name"); - long available = 0, total = 0; - for (OSFileStore fs : fsArray) { - // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 - if (osName.toLowerCase().startsWith(SystemConst.WIN)) { - available += fs.getUsableSpace(); - total += fs.getTotalSpace(); - } else { - available = fs.getUsableSpace(); - total = fs.getTotalSpace(); - break; - } - } - long used = total - available; - diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); - diskInfo.put("available", KitFileUtil.getSize(available)); - diskInfo.put("used", KitFileUtil.getSize(used)); - if (total != 0) { - diskInfo.put("usageRate", df.format(used / (double)total * 100)); - } else { - diskInfo.put("usageRate", 0); - } - return diskInfo; + /** + * 查询服务器监控信息 + * + * @return 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; + } - /** - * 获取交换区信息 - * - * @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 / + */ + private Map getDiskInfo(OperatingSystem os) { + Map diskInfo = new LinkedHashMap<>(); + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + String osName = System.getProperty("os.name"); + long available = 0, total = 0; + for (OSFileStore fs : fsArray) { + // windows 需要将所有磁盘分区累加, linux 和 mac 直接累加会出现磁盘重复的问题, 待修复 + if (osName.toLowerCase().startsWith(SystemConst.WIN)) { + available += fs.getUsableSpace(); + total += fs.getTotalSpace(); + } else { + available = fs.getUsableSpace(); + total = fs.getTotalSpace(); + break; + } } + long used = total - available; + diskInfo.put("total", total > 0 ? KitFileUtil.getSize(total) : "?"); + diskInfo.put("available", KitFileUtil.getSize(available)); + diskInfo.put("used", KitFileUtil.getSize(used)); + if (total != 0) { + diskInfo.put("usageRate", df.format(used / (double) total * 100)); + } else { + diskInfo.put("usageRate", 0); + } + return diskInfo; + } - /** - * 获取内存信息 - * - * @param memory / - * @return / - */ - private Map getMemoryInfo(GlobalMemory memory) { - Map memoryInfo = new LinkedHashMap<>(); - memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); - memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); - memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); - memoryInfo.put("usageRate", - df.format((memory.getTotal() - memory.getAvailable()) / (double)memory.getTotal() * 100)); - return memoryInfo; + /** + * 获取交换区信息 + * + * @param memory / + * @return / + */ + private Map 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; + } - /** - * 获取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; - } + /** + * 获取内存信息 + * + * @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; + } - /** - * 获取系统相关信息,系统、运行天数、系统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; + /** + * 获取Cpu相关信息 + * + * @param processor / + * @return / + */ + private Map getCpuInfo(CentralProcessor processor) { + Map cpuInfo = new LinkedHashMap<>(); + cpuInfo.put("name", processor.getProcessorIdentifier().getName()); + cpuInfo.put("package", processor.getPhysicalPackageCount() + "个物理CPU"); + cpuInfo.put("core", processor.getPhysicalProcessorCount() + "个物理核心"); + cpuInfo.put("coreNumber", processor.getPhysicalProcessorCount()); + cpuInfo.put("logic", processor.getLogicalProcessorCount() + "个逻辑CPU"); + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + // 默认等待300毫秒... + long time = 300; + Util.sleep(time); + long[] ticks = processor.getSystemCpuLoadTicks(); + long minCpuLoadTick = 1000; + while (Arrays.toString(prevTicks).equals(Arrays.toString(ticks)) && time < minCpuLoadTick) { + time += 25; + Util.sleep(25); + ticks = processor.getSystemCpuLoadTicks(); } + long user = + ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; + long nice = + ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; + long sys = + ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; + long idle = + ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; + long ioWait = + ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; + long irq = + ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; + long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - + prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; + long steal = + ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; + long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; + cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); + cpuInfo.put("idle", df.format(100d * idle / totalCpu)); + return cpuInfo; + } + + /** + * 获取系统相关信息,系统、运行天数、系统IP + * + * @param os / + * @return / + */ + private Map getSystemInfo(OperatingSystem os) { + Map systemInfo = new LinkedHashMap<>(); + // jvm 运行时间 + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + // 计算项目运行时间 + String formatBetween = DateUtil.formatBetween(date, new Date(), Level.HOUR); + // 系统信息 + systemInfo.put("os", os.toString()); + systemInfo.put("day", formatBetween); + systemInfo.put("ip", KitIPUtil.getLocalIp()); + return systemInfo; + } } 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 b34b3923..75569826 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 @@ -28,16 +28,21 @@ import org.springframework.web.multipart.MultipartFile; /** *

- * OSS存储 服务类 + * OSS存储接口 *

* * @author codegen * @since 2025-07-15 */ public interface SystemOssStorageService extends IService { - KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, Page page); - List queryOssStorage(SystemQueryStorageArgs criteria); - void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; - String uploadFile(MultipartFile file); - void removeFileByIds(Long[] ids); + + KitPageResult searchOssStorage(SystemQueryStorageArgs args, Page page); + + List queryOssStorage(SystemQueryStorageArgs args); + + void exportOssStorageExcel(List list, HttpServletResponse response) throws IOException; + + String uploadFile(MultipartFile file); + + void deleteFileByIds(Long[] ids); } 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 6ee37158..67319e12 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 @@ -48,261 +48,266 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemQuartzJobService { - @Autowired private SystemQuartzJobMapper systemQuartzJobMapper; - @Autowired private SystemQuartzLogMapper systemQuartzLogMapper; - @Autowired private QuartzManage quartzManage; - @Autowired private KitRedisHelper redisHelper; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void createJob(SystemQuartzJobTb args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - systemQuartzJobMapper.insert(args); - quartzManage.addJob(args); - } + @Autowired + private SystemQuartzJobMapper systemQuartzJobMapper; + @Autowired + private SystemQuartzLogMapper systemQuartzLogMapper; + @Autowired + private QuartzManage quartzManage; + @Autowired + private KitRedisHelper redisHelper; - /** - * 修改任务并重新调度 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { - if (!CronExpression.isValidExpression(args.getCronExpression())) { - throw new BadRequestException("cron表达式格式错误"); - } - if (StrUtil.isNotBlank(args.getSubTask())) { - List tasks = Arrays.asList(args.getSubTask().split("[,,]")); - if (tasks.contains(args.getId().toString())) { - throw new BadRequestException("子任务中不能添加当前任务ID"); - } - } - SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); - systemQuartzJobMapper.insertOrUpdate(quartzJob); - quartzManage.updateJobCron(quartzJob); + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void createJob(SystemQuartzJobTb args) { + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); } + systemQuartzJobMapper.insert(args); + quartzManage.addJob(args); + } - /** - * 更改定时任务状态 - * - * @param quartzJob / - */ - @Transactional(rollbackFor = Exception.class) - public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { - // 置换暂停状态 - if (quartzJob.getIsPause()) { - quartzManage.resumeJob(quartzJob); - quartzJob.setIsPause(false); - } else { - quartzManage.pauseJob(quartzJob); - quartzJob.setIsPause(true); - } - systemQuartzJobMapper.insertOrUpdate(quartzJob); + /** + * 修改任务并重新调度 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateQuartzJobResumeCron(SystemUpdateQuartzJobArgs args) { + if (!CronExpression.isValidExpression(args.getCronExpression())) { + throw new BadRequestException("cron表达式格式错误"); } + if (StrUtil.isNotBlank(args.getSubTask())) { + List tasks = Arrays.asList(args.getSubTask().split("[,,]")); + if (tasks.contains(args.getId().toString())) { + throw new BadRequestException("子任务中不能添加当前任务ID"); + } + } + SystemQuartzJobTb quartzJob = BeanUtil.copyProperties(args, SystemQuartzJobTb.class); + systemQuartzJobMapper.insertOrUpdate(quartzJob); + quartzManage.updateJobCron(quartzJob); + } - /** - * 立即执行定时任务 - * - * @param quartzJob / - */ - public void startQuartzJob(SystemQuartzJobTb quartzJob) { - quartzManage.runJobNow(quartzJob); + /** + * 更改定时任务状态 + * + * @param quartzJob / + */ + @Transactional(rollbackFor = Exception.class) + public void switchQuartzJobStatus(SystemQuartzJobTb quartzJob) { + // 置换暂停状态 + if (quartzJob.getIsPause()) { + quartzManage.resumeJob(quartzJob); + quartzJob.setIsPause(false); + } else { + quartzManage.pauseJob(quartzJob); + quartzJob.setIsPause(true); } + systemQuartzJobMapper.insertOrUpdate(quartzJob); + } - /** - * 删除任务 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeJobByIds(Set ids) { - for (Long id : ids) { - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); - quartzManage.deleteJob(quartzJob); - systemQuartzJobMapper.deleteById(quartzJob); - } - } + /** + * 立即执行定时任务 + * + * @param quartzJob / + */ + public void startQuartzJob(SystemQuartzJobTb quartzJob) { + quartzManage.runJobNow(quartzJob); + } - /** - * 执行子任务 - * - * @param tasks / - * @throws InterruptedException / - */ - @Transactional(rollbackFor = Exception.class) - public void startSubQuartJob(String[] tasks) throws InterruptedException { - for (String id : tasks) { - if (StrUtil.isBlank(id)) { - // 如果是手动清除子任务id, 会出现id为空字符串的问题 - continue; - } - SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); - if (quartzJob == null) { - // 防止子任务不存在 - continue; - } - // 执行任务 - String uuid = IdUtil.simpleUUID(); - quartzJob.setUuid(uuid); - // 执行任务 - startQuartzJob(quartzJob); - // 获取执行状态, 如果执行失败则停止后面的子任务执行 - Boolean result = redisHelper.get(uuid, Boolean.class); - while (result == null) { - // 休眠5秒, 再次获取子任务执行情况 - Thread.sleep(5000); - result = redisHelper.get(uuid, Boolean.class); - } - if (!result) { - redisHelper.del(uuid); - break; - } - } + /** + * 删除任务 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Set ids) { + for (Long id : ids) { + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(id); + quartzManage.deleteJob(quartzJob); + systemQuartzJobMapper.deleteById(quartzJob); } + } - /** - * 导出定时任务 - * - * @param quartzJobs 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzJobTb quartzJob : quartzJobs) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzJob.getJobName()); - map.put("Bean名称", quartzJob.getBeanName()); - map.put("执行方法", quartzJob.getMethodName()); - map.put("参数", quartzJob.getParams()); - map.put("表达式", quartzJob.getCronExpression()); - map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); - map.put("描述", quartzJob.getDescription()); - map.put("创建日期", quartzJob.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 执行子任务 + * + * @param tasks / + * @throws InterruptedException / + */ + @Transactional(rollbackFor = Exception.class) + public void startSubQuartJob(String[] tasks) throws InterruptedException { + for (String id : tasks) { + if (StrUtil.isBlank(id)) { + // 如果是手动清除子任务id, 会出现id为空字符串的问题 + continue; + } + SystemQuartzJobTb quartzJob = systemQuartzJobMapper.selectById(Long.parseLong(id)); + if (quartzJob == null) { + // 防止子任务不存在 + continue; + } + // 执行任务 + String uuid = IdUtil.simpleUUID(); + quartzJob.setUuid(uuid); + // 执行任务 + startQuartzJob(quartzJob); + // 获取执行状态, 如果执行失败则停止后面的子任务执行 + Boolean result = redisHelper.get(uuid, Boolean.class); + while (result == null) { + // 休眠5秒, 再次获取子任务执行情况 + Thread.sleep(5000); + result = redisHelper.get(uuid, Boolean.class); + } + if (!result) { + redisHelper.del(uuid); + break; + } } + } - /** - * 导出定时任务日志 - * - * @param queryAllLog 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemQuartzLogTb quartzLog : queryAllLog) { - Map map = new LinkedHashMap<>(); - map.put("任务名称", quartzLog.getJobName()); - map.put("Bean名称", quartzLog.getBeanName()); - map.put("执行方法", quartzLog.getMethodName()); - map.put("参数", quartzLog.getParams()); - map.put("表达式", quartzLog.getCronExpression()); - map.put("异常详情", quartzLog.getExceptionDetail()); - map.put("耗时/毫秒", quartzLog.getTime()); - map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); - map.put("创建日期", quartzLog.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); + /** + * 导出定时任务 + * + * @param quartzJobs 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzJobExcel(List quartzJobs, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzJobTb quartzJob : quartzJobs) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzJob.getJobName()); + map.put("Bean名称", quartzJob.getBeanName()); + map.put("执行方法", quartzJob.getMethodName()); + map.put("参数", quartzJob.getParams()); + map.put("表达式", quartzJob.getCronExpression()); + map.put("状态", quartzJob.getIsPause() ? "暂停中" : "运行中"); + map.put("描述", quartzJob.getDescription()); + map.put("创建日期", quartzJob.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 分页查询 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(criteria, wrapper); - return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); + /** + * 导出定时任务日志 + * + * @param queryAllLog 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportQuartzLogExcel(List queryAllLog, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemQuartzLogTb quartzLog : queryAllLog) { + Map map = new LinkedHashMap<>(); + map.put("任务名称", quartzLog.getJobName()); + map.put("Bean名称", quartzLog.getBeanName()); + map.put("执行方法", quartzLog.getMethodName()); + map.put("参数", quartzLog.getParams()); + map.put("表达式", quartzLog.getCronExpression()); + map.put("异常详情", quartzLog.getExceptionDetail()); + map.put("耗时/毫秒", quartzLog.getTime()); + map.put("状态", quartzLog.getIsSuccess() ? "成功" : "失败"); + map.put("创建日期", quartzLog.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs criteria, - LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzJobTb::getJobName, - criteria.getJobName()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzJobTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzJobTb::getId); - } + /** + * 分页查询 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchQuartzJobByArgs(SystemQueryQuartzJobArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper)); + } - private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs criteria, - LambdaQueryWrapper wrapper) { - if (criteria != null) { - wrapper.like(StrUtil.isNotBlank(criteria.getJobName()), SystemQuartzLogTb::getJobName, - criteria.getJobName()); - wrapper.eq(criteria.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, criteria.getIsSuccess()); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemQuartzLogTb::getCreateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByDesc(SystemQuartzLogTb::getId); + private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, + LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzJobTb::getJobName, + args.getJobName()); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzJobTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemQuartzJobTb::getId); + } - /** - * 分页查询日志 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(criteria, wrapper); - return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper)); + private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, + LambdaQueryWrapper wrapper) { + if (args != null) { + wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, + args.getJobName()); + wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByDesc(SystemQuartzLogTb::getId); + } - /** - * 查询全部 - * - * @param criteria 条件 - * @return / - */ - public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzJobQueryParams(criteria, wrapper); - return systemQuartzJobMapper.selectList(wrapper); - } + /** + * 分页查询日志 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchQuartzLogByArgs(SystemQueryQuartzJobArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return KitPageUtil.toPage(systemQuartzLogMapper.selectPage(page, wrapper)); + } - /** - * 查询全部 - * - * @param criteria 条件 - * @return / - */ - public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.injectQuartzLogQueryParams(criteria, wrapper); - return systemQuartzLogMapper.selectList(wrapper); - } + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzJobByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzJobQueryParams(args, wrapper); + return systemQuartzJobMapper.selectList(wrapper); + } - public SystemQuartzJobTb getQuartzJobById(Long id) { - return systemQuartzJobMapper.selectById(id); - } + /** + * 查询全部 + * + * @param args 条件 + * @return / + */ + public List queryQuartzLogByArgs(SystemQueryQuartzJobArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + this.injectQuartzLogQueryParams(args, wrapper); + return systemQuartzLogMapper.selectList(wrapper); + } - public List queryEnableQuartzJob() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemQuartzJobTb::getIsPause, 0); - return systemQuartzJobMapper.selectList(wrapper); - } + public SystemQuartzJobTb getQuartzJobById(Long id) { + return systemQuartzJobMapper.selectById(id); + } + + public List listEnableQuartzJob() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemQuartzJobTb::getIsPause, 0); + return systemQuartzJobMapper.selectList(wrapper); + } } diff --git a/cutejava/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 e5e25f39..eee4ce81 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 @@ -31,46 +31,49 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleDeptService { - @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); - } - } + @Autowired + private SystemRoleDeptMapper systemRoleDeptMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; - @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); - } + @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); } + } - /** - * 根据角色id查询 - * - * @param roleId / - * @return / - */ - public List selectDeptByRoleId(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); + @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); + } } 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 dbfd4da9..a631f3ff 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 @@ -32,56 +32,58 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleMenuService { - @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); + @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 (SystemMenuTb menu : menus) { + SystemRoleMenuTb record = new SystemRoleMenuTb(); + record.setMenuId(menu.getId()); + record.setRoleId(roleId); + records.add(record); + } + systemRoleMenuMapper.insert(records); } + } - @Transactional(rollbackFor = Exception.class) - public void batchInsertRoleMenu(Set menus, Long roleId) { - if (CollUtil.isNotEmpty(menus)) { - List records = new ArrayList<>(); - for (SystemMenuTb menu : menus) { - SystemRoleMenuTb record = new SystemRoleMenuTb(); - record.setMenuId(menu.getId()); - record.setRoleId(roleId); - records.add(record); - } - systemRoleMenuMapper.insert(records); - } + @Transactional(rollbackFor = Exception.class) + public void batchDeleteRoleMenu(Set roleIds) { + if (CollUtil.isNotEmpty(roleIds)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); + systemRoleMenuMapper.delete(wrapper); } + } - @Transactional(rollbackFor = Exception.class) - public void batchDeleteRoleMenu(Set roleIds) { - if (CollUtil.isNotEmpty(roleIds)) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - systemRoleMenuMapper.delete(wrapper); - } + public LinkedHashSet queryMenuByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return new LinkedHashSet<>(); } - - public LinkedHashSet queryMenuByRoleIdsAndType(Set roleIds, int menuType) { - if (CollUtil.isEmpty(roleIds)) { - return new LinkedHashSet<>(); - } - LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); - roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds); - List menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId) - .collect(Collectors.toList()); - if (CollUtil.isEmpty(menuIds)) { - return new LinkedHashSet<>(); - } - - LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); - menuWrapper.in(SystemMenuTb::getId, menuIds); - // 排除"按钮" - menuWrapper.ne(SystemMenuTb::getType, 2); - menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); - return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.in(SystemRoleMenuTb::getRoleId, roleIds); + List menuIds = systemRoleMenuMapper.selectList(roleMenuWrapper).stream().map(SystemRoleMenuTb::getMenuId) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(menuIds)) { + return new LinkedHashSet<>(); } + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.in(SystemMenuTb::getId, menuIds); + // 排除"按钮" + menuWrapper.ne(SystemMenuTb::getType, 2); + menuWrapper.orderByAsc(SystemMenuTb::getMenuSort); + return new LinkedHashSet<>(systemMenuMapper.selectList(menuWrapper)); + } } diff --git a/cutejava/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 9b565c14..7df90004 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 @@ -21,14 +21,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageResult; import cn.odboy.framework.exception.BadRequestException; +import cn.odboy.system.dal.dataobject.SystemDeptTb; import cn.odboy.system.dal.dataobject.SystemMenuTb; +import cn.odboy.system.dal.dataobject.SystemRoleDeptTb; +import cn.odboy.system.dal.dataobject.SystemRoleMenuTb; import cn.odboy.system.dal.dataobject.SystemRoleTb; +import cn.odboy.system.dal.dataobject.SystemUserRoleTb; import cn.odboy.system.dal.dataobject.SystemUserTb; import cn.odboy.system.dal.model.SystemCreateRoleArgs; import cn.odboy.system.dal.model.SystemQueryRoleArgs; import cn.odboy.system.dal.model.SystemRoleCodeVo; +import cn.odboy.system.dal.model.SystemRoleVo; +import cn.odboy.system.dal.mysql.SystemRoleDeptMapper; import cn.odboy.system.dal.mysql.SystemRoleMapper; -import cn.odboy.system.dal.mysql.SystemUserMapper; +import cn.odboy.system.dal.mysql.SystemRoleMenuMapper; +import cn.odboy.system.dal.mysql.SystemUserRoleMapper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -38,6 +45,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -49,211 +57,296 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemRoleService { - @Autowired private SystemRoleMapper systemRoleMapper; - @Autowired private SystemRoleMenuService systemRoleMenuService; - @Autowired private SystemUserMapper systemUserMapper; - @Autowired private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemRoleMenuService systemRoleMenuService; + @Autowired + private SystemRoleDeptService systemRoleDeptService; + @Autowired + private SystemRoleDeptMapper systemRoleDeptMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemUserService systemUserService; - /** - * 创建 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveRole(SystemCreateRoleArgs args) { - if (this.getRoleByName(args.getName()) != null) { - throw new BadRequestException("角色名称已存在"); - } - systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); - // 判断是否有部门数据, 若有, 则需创建关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } + /** + * 创建 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveRole(SystemCreateRoleArgs args) { + if (this.getRoleByName(args.getName()) != null) { + throw new BadRequestException("角色名称已存在"); + } + systemRoleMapper.insert(BeanUtil.copyProperties(args, SystemRoleTb.class)); + // 判断是否有部门数据, 若有, 则需创建关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } + } + + private SystemRoleTb getRoleByName(String name) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemRoleTb::getName, name); + return systemRoleMapper.selectOne(wrapper); + } + + /** + * 修改 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleById(SystemRoleVo args) { + SystemRoleVo role = BeanUtil.copyProperties(systemRoleMapper.selectById(args.getId()), SystemRoleVo.class); + SystemRoleTb role1 = this.getRoleByName(args.getName()); + if (role1 != null && !role1.getId().equals(role.getId())) { + throw new BadRequestException("角色名称已存在"); + } + role.setName(args.getName()); + role.setDescription(args.getDescription()); + role.setDataScope(args.getDataScope()); + role.setDepts(args.getDepts()); + role.setLevel(args.getLevel()); + // 更新 + systemRoleMapper.insertOrUpdate(role); + // 删除关联部门数据 + systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); + // 判断是否有部门数据, 若有, 则需更新关联 + if (CollectionUtil.isNotEmpty(args.getDepts())) { + systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); + } + } + + /** + * 修改绑定的菜单 + * + * @param role / + */ + public void updateBindMenuById(SystemRoleVo role) { + // 更新菜单 + systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); + // 判断是否为空 + if (CollUtil.isNotEmpty(role.getMenus())) { + systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); + } + } + + /** + * 删除 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void deleteRoleByIds(Set ids) { + systemRoleMapper.deleteByIds(ids); + // 删除角色部门关联数据、角色菜单关联数据 + systemRoleDeptService.batchDeleteRoleDept(ids); + systemRoleMenuService.batchDeleteRoleMenu(ids); + } + + /** + * 导出数据 + * + * @param roles 待导出的数据 + * @param response / + * @throws IOException + */ + public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemRoleVo role : roles) { + Map map = new LinkedHashMap<>(); + map.put("角色名称", role.getName()); + map.put("角色级别", role.getLevel()); + map.put("描述", role.getDescription()); + map.put("创建日期", role.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 查询全部角色 + */ + public List listAllRole() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByAsc(SystemRoleTb::getLevel); + return systemRoleMapper.selectList(wrapper); + } + + /** + * 根据条件查询全部角色 + * + * @param args 条件 + * @return + */ + public List queryRoleByArgs(SystemQueryRoleArgs args) { + // 查询角色基本信息 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + .like(SystemRoleTb::getDescription, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } + } + wrapper.orderByAsc(SystemRoleTb::getLevel); + if (args != null && args.getSize() != null) { + Page rolePage = new Page<>(args.getPage(), args.getSize()); + Page page = systemRoleMapper.selectPage(rolePage, wrapper); + List roles = page.getRecords(); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } else { + List roles = systemRoleMapper.selectList(wrapper); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + } + + /** + * 分页查询角色 + * + * @param args 条件 + * @param page 分页参数 + * @return + */ + public KitPageResult searchRoleByArgs(SystemQueryRoleArgs args, Page page) { + args.setOffset(page.offset()); + List roles = this.queryRoleByArgs(args); + Long total = this.countRoleByArgs(args); + return KitPageUtil.toPage(roles, total); + } + + /** + * 根据用户ID查询 + * + * @param userId 用户ID + * @return / + */ + public List queryRoleByUsersId(Long userId) { + // 查询用户角色关联 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.eq(SystemUserRoleTb::getUserId, userId); + List userRoles = systemUserRoleMapper.selectList(userRoleWrapper); + if (CollUtil.isEmpty(userRoles)) { + return new ArrayList<>(); + } + Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + return roles.stream().map(this::convertToRoleVo).collect(Collectors.toList()); + } + + /** + * 根据角色查询角色级别 + * + * @param roles / + * @return / + */ + public Integer getDeptLevelByRoles(Set roles) { + if (CollUtil.isEmpty(roles)) { + return Integer.MAX_VALUE; + } + Set roleSet = new HashSet<>(); + for (SystemRoleTb role : roles) { + roleSet.add(getRoleById(role.getId())); + } + return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); + } + + /** + * 获取用户权限信息 + * + * @param user 用户信息 + * @return 权限信息 + */ + public List buildUserRolePermissions(SystemUserTb user) { + Set permissions = new HashSet<>(); + // 如果是管理员直接返回 + if (user.getIsAdmin()) { + permissions.add("admin"); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } + List roles = this.queryRoleByUsersId(user.getId()); + permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) + .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); + } + + /** + * 验证是否被用户关联 + * + * @param ids / + */ + public void verifyBindRelationByIds(Set ids) { + if (systemUserService.countUserByRoleIds(ids) > 0) { + throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); + } + } + + /** + * 根据ID查询 + * + * @param id / + * @return / + */ + public SystemRoleTb getRoleById(Long id) { + return systemRoleMapper.selectById(id); + } + + /** + * 根据部门ID统计角色数量 + * + * @param deptIds 部门ID集合 + * @return / + */ + public Long countRoleByDeptIds(Set deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return 0L; } - private SystemRoleTb getRoleByName(String name) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SystemRoleTb::getName, name); - return systemRoleMapper.selectOne(wrapper); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemRoleDeptTb::getDeptId, deptIds); + return systemRoleDeptMapper.selectCount(wrapper); + } + + /** + * 转换为SystemRoleVo并关联查询菜单和部门信息 + * + * @param role 角色基本信息 + * @return 包含关联信息的SystemRoleVo + */ + private SystemRoleVo convertToRoleVo(SystemRoleTb role) { + if (role == null) { + return null; } - /** - * 修改 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyRoleById(SystemRoleTb args) { - SystemRoleTb role = systemRoleMapper.selectById(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.setDepts(args.getDepts()); - role.setLevel(args.getLevel()); - // 更新 - systemRoleMapper.insertOrUpdate(role); - // 删除关联部门数据 - systemRoleDeptService.batchDeleteRoleDept(Collections.singleton(args.getId())); - // 判断是否有部门数据, 若有, 则需更新关联 - if (CollectionUtil.isNotEmpty(args.getDepts())) { - systemRoleDeptService.batchInsertRoleDept(args.getDepts(), args.getId()); - } - } + SystemRoleVo roleVo = BeanUtil.copyProperties(role, SystemRoleVo.class); + // 查询关联的菜单信息 + Set menus = systemRoleMenuService.queryMenuByRoleIds( + Collections.singleton(role.getId())); + roleVo.setMenus(menus); - /** - * 修改绑定的菜单 - * - * @param role / - */ - public void modifyBindMenuById(SystemRoleTb role) { - // 更新菜单 - systemRoleMenuService.deleteRoleMenuByRoleId(role.getId()); - // 判断是否为空 - if (CollUtil.isNotEmpty(role.getMenus())) { - systemRoleMenuService.batchInsertRoleMenu(role.getMenus(), role.getId()); - } - } + // 查询关联的部门信息 + List depts = systemRoleDeptService.listDeptByRoleId(role.getId()); + roleVo.setDepts(new LinkedHashSet<>(depts)); - /** - * 删除 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeRoleByIds(Set ids) { - systemRoleMapper.deleteByIds(ids); - // 删除角色部门关联数据、角色菜单关联数据 - systemRoleDeptService.batchDeleteRoleDept(ids); - systemRoleMenuService.batchDeleteRoleMenu(ids); - } + return roleVo; + } - /** - * 导出数据 - * - * @param roles 待导出的数据 - * @param response / - * @throws IOException - */ - public void exportRoleExcel(List roles, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemRoleTb role : roles) { - Map map = new LinkedHashMap<>(); - map.put("角色名称", role.getName()); - map.put("角色级别", role.getLevel()); - map.put("描述", role.getDescription()); - map.put("创建日期", role.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } - - /** - * 查询全部角色 - * - * @return - */ - public List queryAllRole() { - return this.selectAllRole(); - } - - private List selectAllRole() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.orderByAsc(SystemRoleTb::getLevel); - return systemRoleMapper.selectList(wrapper); - } - - /** - * 根据条件查询全部角色 - * - * @param criteria 条件 - * @return - */ - public List queryRoleByArgs(SystemQueryRoleArgs criteria) { - return systemRoleMapper.selectRoleByArgs(criteria); - } - - /** - * 分页查询角色 - * - * @param criteria 条件 - * @param page 分页参数 - * @return - */ - public KitPageResult queryRoleByArgs(SystemQueryRoleArgs criteria, Page page) { - criteria.setOffset(page.offset()); - List roles = systemRoleMapper.selectRoleByArgs(criteria); - Long total = systemRoleMapper.countRoleByArgs(criteria); - return KitPageUtil.toPage(roles, total); - } - - /** - * 根据用户ID查询 - * - * @param userId 用户ID - * @return / - */ - public List queryRoleByUsersId(Long userId) { - return systemRoleMapper.selectRoleByUserId(userId); - } - - /** - * 根据角色查询角色级别 - * - * @param roles / - * @return / - */ - public Integer getDeptLevelByRoles(Set roles) { - if (CollUtil.isEmpty(roles)) { - return Integer.MAX_VALUE; - } - Set roleSet = new HashSet<>(); - for (SystemRoleTb role : roles) { - roleSet.add(getRoleById(role.getId())); - } - return Collections.min(roleSet.stream().map(SystemRoleTb::getLevel).collect(Collectors.toList())); - } - - /** - * 获取用户权限信息 - * - * @param user 用户信息 - * @return 权限信息 - */ - public List buildUserRolePermissions(SystemUserTb user) { - Set permissions = new HashSet<>(); - // 如果是管理员直接返回 - if (user.getIsAdmin()) { - permissions.add("admin"); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - List roles = systemRoleMapper.selectRoleByUserId(user.getId()); - permissions = roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); - return permissions.stream().map(SystemRoleCodeVo::new).collect(Collectors.toList()); - } - - /** - * 验证是否被用户关联 - * - * @param ids / - */ - public void verifyBindRelationByIds(Set ids) { - if (systemUserMapper.countUserByRoleIds(ids) > 0) { - throw new BadRequestException("所选角色存在用户关联, 请解除关联再试!"); - } - } - - /** - * 根据ID查询 - * - * @param id / - * @return / - */ - public SystemRoleTb getRoleById(Long id) { - return systemRoleMapper.selectById(id); + public Long countRoleByArgs(SystemQueryRoleArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemRoleTb::getName, args.getBlurry()).or() + .like(SystemRoleTb::getDescription, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemRoleTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + return systemRoleMapper.selectCount(wrapper); + } } 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 56e9f24c..90c450a6 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 @@ -29,28 +29,30 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserJobService { - @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); - } - } + @Autowired + private SystemUserJobMapper systemUserJobMapper; - @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 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); + } + } } 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 a2e6e710..41a35584 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 @@ -29,28 +29,30 @@ import org.springframework.transaction.annotation.Transactional; @Service public class SystemUserRoleService { - @Autowired private SystemUserRoleMapper systemUserRoleMapper; - @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); - } - } + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; - @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 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); + } + } } 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 e0643c60..2aa9b7bf 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 @@ -15,20 +15,31 @@ */ package cn.odboy.system.service; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.odboy.base.KitPageArgs; import cn.odboy.base.KitPageResult; import cn.odboy.base.KitSelectOptionVo; import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.server.core.KitFileLocalUploadHelper; +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.SystemQueryUserArgs; +import cn.odboy.system.dal.model.SystemUserVo; +import cn.odboy.system.dal.mysql.SystemDeptMapper; +import cn.odboy.system.dal.mysql.SystemJobMapper; +import cn.odboy.system.dal.mysql.SystemRoleMapper; +import cn.odboy.system.dal.mysql.SystemUserJobMapper; import cn.odboy.system.dal.mysql.SystemUserMapper; +import cn.odboy.system.dal.mysql.SystemUserRoleMapper; import cn.odboy.system.dal.redis.SystemUserInfoDAO; import cn.odboy.system.dal.redis.SystemUserOnlineInfoDAO; -import cn.odboy.system.framework.permission.core.CsSecurityHelper; +import cn.odboy.system.framework.permission.core.KitSecurityHelper; import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitPageUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -40,6 +51,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -53,288 +65,431 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemUserService { - @Autowired private SystemUserMapper systemUserMapper; - @Autowired private SystemUserJobService systemUserJobService; - @Autowired private SystemUserRoleService systemUserRoleService; - @Autowired private SystemUserInfoDAO systemUserInfoDAO; - @Autowired private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; - @Autowired private KitFileLocalUploadHelper fileUploadPathHelper; - /** - * 新增用户 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void saveUser(SystemUserTb args) { - args.setDeptId(args.getDept().getId()); - if (systemUserMapper.getUserByUsername(args.getUsername()) != null) { - throw new BadRequestException("用户名已存在"); - } - if (systemUserMapper.getUserByEmail(args.getEmail()) != null) { - throw new BadRequestException("邮箱已存在"); - } - if (systemUserMapper.getUserByPhone(args.getPhone()) != null) { - throw new BadRequestException("手机号已存在"); - } - systemUserMapper.insert(args); - // 保存用户岗位 - systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); - // 保存用户角色 - systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + @Autowired + private SystemUserMapper systemUserMapper; + @Autowired + private SystemUserJobService systemUserJobService; + @Autowired + private SystemUserRoleService systemUserRoleService; + @Autowired + private SystemUserInfoDAO systemUserInfoDAO; + @Autowired + private SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; + @Autowired + private KitFileLocalUploadHelper fileUploadPathHelper; + @Autowired + private SystemUserJobMapper systemUserJobMapper; + @Autowired + private SystemUserRoleMapper systemUserRoleMapper; + @Autowired + private SystemJobMapper systemJobMapper; + @Autowired + private SystemRoleMapper systemRoleMapper; + @Autowired + private SystemDeptMapper systemDeptMapper; + + /** + * 新增用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void saveUser(SystemUserVo args) { + args.setDeptId(args.getDept().getId()); + if (this.getUserByUsername(args.getUsername()) != null) { + throw new BadRequestException("用户名已存在"); + } + if (this.getUserByEmail(args.getEmail()) != null) { + throw new BadRequestException("邮箱已存在"); + } + if (this.getUserByPhone(args.getPhone()) != null) { + throw new BadRequestException("手机号已存在"); + } + systemUserMapper.insert(args); + // 保存用户岗位 + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 保存用户角色 + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } + + /** + * 编辑用户 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserById(SystemUserVo args) { + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = this.getUserByUsername(args.getUsername()); + SystemUserTb user2 = this.getUserByEmail(args.getEmail()); + SystemUserTb user3 = this.getUserByPhone(args.getPhone()); + if (user1 != null && !user.getId().equals(user1.getId())) { + throw new BadRequestException("用户名已存在"); + } + if (user2 != null && !user.getId().equals(user2.getId())) { + throw new BadRequestException("邮箱已存在"); + } + if (user3 != null && !user.getId().equals(user3.getId())) { + throw new BadRequestException("手机号已存在"); + } + // 如果用户被禁用, 则清除用户登录信息 + if (!args.getEnabled()) { + systemUserOnlineInfoDAO.kickOutByUsername(args.getUsername()); + } + user.setDeptId(args.getDept().getId()); + user.setUsername(args.getUsername()); + user.setEmail(args.getEmail()); + user.setEnabled(args.getEnabled()); + user.setDept(args.getDept()); + user.setPhone(args.getPhone()); + user.setNickName(args.getNickName()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + // 清除用户登录缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 更新用户岗位 + systemUserJobService.batchDeleteUserJob(Collections.singleton(args.getId())); + systemUserJobService.batchInsertUserJob(args.getJobs(), args.getId()); + // 更新用户角色 + systemUserRoleService.batchDeleteUserRole(Collections.singleton(args.getId())); + systemUserRoleService.batchInsertUserRole(args.getRoles(), args.getId()); + } + + /** + * 用户自助修改资料 + * + * @param args / + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserCenterInfoById(SystemUserTb args) { + SystemUserTb user = systemUserMapper.selectById(args.getId()); + SystemUserTb user1 = this.getUserByPhone(args.getPhone()); + if (user1 != null && !user.getId().equals(user1.getId())) { + throw new BadRequestException("手机号已存在"); + } + user.setNickName(args.getNickName()); + user.setPhone(args.getPhone()); + user.setGender(args.getGender()); + systemUserMapper.insertOrUpdate(user); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + } + + /** + * 删除用户 + * + * @param ids / + */ + @Transactional(rollbackFor = Exception.class) + public void removeUserByIds(Set ids) { + for (Long id : ids) { + // 清理缓存 + SystemUserTb user = systemUserMapper.selectById(id); + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + } + systemUserMapper.deleteByIds(ids); + // 删除用户岗位 + systemUserJobService.batchDeleteUserJob(ids); + // 删除用户角色 + systemUserRoleService.batchDeleteUserRole(ids); + } + + /** + * 修改密码 + * + * @param username 用户名 + * @param encryptPassword 密码 + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserPasswordByUsername(String username, String encryptPassword) { + systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } + + /** + * 重置密码 + * + * @param ids 用户id + * @param password 密码 + */ + @Transactional(rollbackFor = Exception.class) + public void resetUserPasswordByIds(Set ids, String password) { + List users = systemUserMapper.selectByIds(ids); + // 清除缓存 + users.forEach(user -> { + // 清除缓存 + systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); + // 强制退出 + systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); + }); + // 重置密码 + systemUserMapper.updateUserPasswordByUserIds(password, ids); + } + + /** + * 修改头像 + * + * @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()); + }}; + } + + /** + * 修改邮箱 + * + * @param username 用户名 + * @param email 邮箱 + */ + @Transactional(rollbackFor = Exception.class) + public void updateUserEmailByUsername(String username, String email) { + systemUserMapper.updateUserEmailByUsername(username, email); + systemUserInfoDAO.deleteUserLoginInfoByUserName(username); + } + + /** + * 导出数据 + * + * @param users 待导出的数据 + * @param response / + * @throws IOException / + */ + public void exportUserExcel(List users, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (SystemUserVo user : users) { + List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); + Map map = new LinkedHashMap<>(); + map.put("用户名", user.getUsername()); + map.put("角色", roles); + map.put("部门", user.getDept().getName()); + map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); + map.put("邮箱", user.getEmail()); + map.put("状态", user.getEnabled() ? "启用" : "禁用"); + map.put("手机号码", user.getPhone()); + map.put("修改密码的时间", user.getPwdResetTime()); + map.put("创建日期", user.getCreateTime()); + list.add(map); + } + KitFileUtil.downloadExcel(list, response); + } + + /** + * 查询全部 + * + * @param args 条件 + * @param page 分页参数 + * @return / + */ + public KitPageResult searchUserByArgs(SystemQueryUserArgs args, Page page) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + IPage userPage = systemUserMapper.selectPage(page, wrapper); + List users = userPage.getRecords(); + // 转换为SystemUserVo并关联查询 + List userVos = users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + return KitPageUtil.toPage(userVos, userPage.getTotal()); + } + + /** + * 查询全部不分页 + * + * @param args 条件 + * @return / + */ + public List queryUserByArgs(SystemQueryUserArgs args) { + // 查询用户基本信息 + LambdaQueryWrapper wrapper = buildUserQueryWrapper(args); + List users = systemUserMapper.selectList(wrapper); + // 转换为SystemUserVo并关联查询 + return users.stream().map(this::convertToUserVo).collect(Collectors.toList()); + } + + /** + * 根据ID查询 + * + * @param id ID + * @return / + */ + public SystemUserTb getUserById(long id) { + return systemUserMapper.selectById(id); + } + + public List queryUserMetadataOptions(KitPageArgs pageArgs) { + SystemQueryUserArgs args = pageArgs.getArgs(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); + wrapper.and(c -> { + c.eq(SystemUserTb::getPhone, args.getBlurry()); + c.or(); + c.eq(SystemUserTb::getEmail, args.getBlurry()); + c.or(); + c.like(SystemUserTb::getUsername, args.getBlurry()); + c.or(); + c.like(SystemUserTb::getNickName, args.getBlurry()); + }); + return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> { + Map ext = new HashMap<>(1); + ext.put("id", m.getId()); + ext.put("deptId", m.getDeptId()); + ext.put("email", m.getEmail()); + ext.put("phone", m.getPhone()); + return KitSelectOptionVo.builder().label(m.getNickName()).value(String.valueOf(m.getId())).ext(ext).build(); + }).collect(Collectors.toList()); + } + + /** + * 根据岗位ID统计用户数量 + * + * @param jobIds 岗位ID集合 + * @return / + */ + public Long countUserByJobIds(Set jobIds) { + if (CollUtil.isEmpty(jobIds)) { + return 0L; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserJobTb::getJobId, jobIds); + return systemUserJobMapper.selectCount(wrapper); + } + + /** + * 根据角色ID统计用户数量 + * + * @param roleIds 角色ID集合 + * @return / + */ + public Long countUserByRoleIds(Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return 0L; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserRoleTb::getRoleId, roleIds); + return systemUserRoleMapper.selectCount(wrapper); + } + + /** + * 构建用户查询条件 + * + * @param args 查询条件 + * @return / + */ + private LambdaQueryWrapper buildUserQueryWrapper(SystemQueryUserArgs args) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + if (args.getId() != null) { + wrapper.eq(SystemUserTb::getId, args.getId()); + } + if (args.getEnabled() != null) { + wrapper.eq(SystemUserTb::getEnabled, args.getEnabled()); + } + if (CollUtil.isNotEmpty(args.getDeptIds())) { + wrapper.in(SystemUserTb::getDeptId, args.getDeptIds()); + } + if (StrUtil.isNotBlank(args.getBlurry())) { + wrapper.and(w -> w.like(SystemUserTb::getUsername, args.getBlurry()) + .or().like(SystemUserTb::getNickName, args.getBlurry()) + .or().like(SystemUserTb::getEmail, args.getBlurry())); + } + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemUserTb::getCreateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } + } + wrapper.orderByDesc(SystemUserTb::getCreateTime); + return wrapper; + } + + /** + * 转换为SystemUserVo并关联查询部门、角色、岗位信息 + * + * @param user 用户基本信息 + * @return 包含关联信息的SystemUserVo + */ + private SystemUserVo convertToUserVo(SystemUserTb user) { + if (user == null) { + return null; + } + SystemUserVo userVo = BeanUtil.copyProperties(user, SystemUserVo.class); + + // 查询关联的部门信息 + if (user.getDeptId() != null) { + SystemDeptTb dept = systemDeptMapper.selectById(user.getDeptId()); + userVo.setDept(dept); } - /** - * 编辑用户 - * - * @param args / - * @throws Exception / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserById(SystemUserTb args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = systemUserMapper.getUserByUsername(args.getUsername()); - SystemUserTb user2 = systemUserMapper.getUserByEmail(args.getEmail()); - SystemUserTb user3 = systemUserMapper.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.setRoles(args.getRoles()); - user.setDept(args.getDept()); - user.setJobs(args.getJobs()); - 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()); + // 查询关联的岗位信息 + LambdaQueryWrapper jobWrapper = new LambdaQueryWrapper<>(); + jobWrapper.eq(SystemUserJobTb::getUserId, user.getId()); + List userJobs = systemUserJobMapper.selectList(jobWrapper); + if (CollUtil.isNotEmpty(userJobs)) { + Set jobIds = userJobs.stream().map(SystemUserJobTb::getJobId).collect(Collectors.toSet()); + List jobs = systemJobMapper.selectByIds(jobIds); + userVo.setJobs(new LinkedHashSet<>(jobs)); } - /** - * 用户自助修改资料 - * - * @param args / - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserCenterInfoById(SystemUserTb args) { - SystemUserTb user = systemUserMapper.selectById(args.getId()); - SystemUserTb user1 = systemUserMapper.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()); + // 查询关联的角色信息 + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.eq(SystemUserRoleTb::getUserId, user.getId()); + List userRoles = systemUserRoleMapper.selectList(roleWrapper); + if (CollUtil.isNotEmpty(userRoles)) { + Set roleIds = userRoles.stream().map(SystemUserRoleTb::getRoleId).collect(Collectors.toSet()); + List roles = systemRoleMapper.selectByIds(roleIds); + userVo.setRoles(new LinkedHashSet<>(roles)); } - /** - * 删除用户 - * - * @param ids / - */ - @Transactional(rollbackFor = Exception.class) - public void removeUserByIds(Set ids) { - for (Long id : ids) { - // 清理缓存 - SystemUserTb user = systemUserMapper.selectById(id); - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - } - systemUserMapper.deleteByIds(ids); - // 删除用户岗位 - systemUserJobService.batchDeleteUserJob(ids); - // 删除用户角色 - systemUserRoleService.batchDeleteUserRole(ids); - } + return userVo; + } - /** - * 修改密码 - * - * @param username 用户名 - * @param encryptPassword 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserPasswordByUsername(String username, String encryptPassword) { - systemUserMapper.updateUserPasswordByUsername(username, encryptPassword); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } + public SystemUserTb getUserByUsername(String username) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getUsername, username); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } - /** - * 重置密码 - * - * @param ids 用户id - * @param password 密码 - */ - @Transactional(rollbackFor = Exception.class) - public void resetUserPasswordByIds(Set ids, String password) { - List users = systemUserMapper.selectByIds(ids); - // 清除缓存 - users.forEach(user -> { - // 清除缓存 - systemUserInfoDAO.deleteUserLoginInfoByUserName(user.getUsername()); - // 强制退出 - systemUserOnlineInfoDAO.kickOutByUsername(user.getUsername()); - }); - // 重置密码 - systemUserMapper.updateUserPasswordByUserIds(password, ids); - } + public long countUserByDeptIds(Set deptIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SystemUserTb::getDeptId, deptIds); + return systemUserMapper.selectCount(wrapper); + } - /** - * 修改头像 - * - * @param multipartFile 文件 - * @return / - */ - @Transactional(rollbackFor = Exception.class) - public Map modifyUserAvatar(MultipartFile multipartFile) { - SystemUserTb user = systemUserMapper.getUserByUsername(CsSecurityHelper.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()); - }}; - } + public SystemUserTb getUserByEmail(String email) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getEmail, email); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } - /** - * 修改邮箱 - * - * @param username 用户名 - * @param email 邮箱 - */ - @Transactional(rollbackFor = Exception.class) - public void modifyUserEmailByUsername(String username, String email) { - systemUserMapper.updateUserEmailByUsername(username, email); - systemUserInfoDAO.deleteUserLoginInfoByUserName(username); - } - - /** - * 导出数据 - * - * @param users 待导出的数据 - * @param response / - * @throws IOException / - */ - public void exportUserExcel(List users, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (SystemUserTb user : users) { - List roles = user.getRoles().stream().map(SystemRoleTb::getName).collect(Collectors.toList()); - Map map = new LinkedHashMap<>(); - map.put("用户名", user.getUsername()); - map.put("角色", roles); - map.put("部门", user.getDept().getName()); - map.put("岗位", user.getJobs().stream().map(SystemJobTb::getName).collect(Collectors.toList())); - map.put("邮箱", user.getEmail()); - map.put("状态", user.getEnabled() ? "启用" : "禁用"); - map.put("手机号码", user.getPhone()); - map.put("修改密码的时间", user.getPwdResetTime()); - map.put("创建日期", user.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } - - /** - * 查询全部 - * - * @param criteria 条件 - * @param page 分页参数 - * @return / - */ - public KitPageResult queryUserByArgs(SystemQueryUserArgs criteria, Page page) { - IPage users = systemUserMapper.selectUserByArgs(criteria, page); - return KitPageUtil.toPage(users); - } - - /** - * 查询全部不分页 - * - * @param criteria 条件 - * @return / - */ - public List queryUserByArgs(SystemQueryUserArgs criteria) { - return systemUserMapper.selectUserByArgs(criteria); - } - - /** - * 根据ID查询 - * - * @param id ID - * @return / - */ - public SystemUserTb getUserById(long id) { - return systemUserMapper.selectById(id); - } - - /** - * 根据用户名查询 - * - * @param username / - * @return / - */ - public SystemUserTb getUserByUsername(String username) { - return systemUserMapper.getUserByUsername(username); - } - - public List queryUserMetadataOptions(KitPageArgs args) { - SystemQueryUserArgs criteria = args.getArgs(); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.select(SystemUserTb::getId, SystemUserTb::getDeptId, SystemUserTb::getEmail, SystemUserTb::getPhone); - wrapper.and(c -> { - c.eq(SystemUserTb::getPhone, criteria.getBlurry()); - c.or(); - c.eq(SystemUserTb::getEmail, criteria.getBlurry()); - c.or(); - c.like(SystemUserTb::getUsername, criteria.getBlurry()); - c.or(); - c.like(SystemUserTb::getNickName, criteria.getBlurry()); - }); - return systemUserMapper.selectPage(new Page<>(criteria.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()); - } + public SystemUserTb getUserByPhone(String phone) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SystemUserTb::getPhone, phone); + wrapper.eq(SystemUserTb::getEnabled, 1); + return systemUserMapper.selectOne(wrapper); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java index 584e37dd..2a8fc92c 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/service/impl/SystemOssStorageServiceImpl.java @@ -59,117 +59,122 @@ import org.springframework.web.multipart.MultipartFile; @Service public class SystemOssStorageServiceImpl extends ServiceImpl implements SystemOssStorageService { - @Autowired private MinioRepository minioRepository; - @Autowired private AppProperties properties; - @Autowired private KitFileLocalUploadHelper fileLocalUploadHelper; - @Autowired private SystemOssStorageMapper systemOssStorageMapper; - @Override - public KitPageResult queryOssStorage(SystemQueryStorageArgs criteria, - Page page) { - IPage ossStorageTbs = this.selectOssStorageByArgs(criteria, page); - IPage convert = ossStorageTbs.convert(c -> { - SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); - storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); - return storageVo; - }); - return KitPageUtil.toPage(convert); - } + @Autowired + private MinioRepository minioRepository; + @Autowired + private AppProperties properties; + @Autowired + private KitFileLocalUploadHelper fileLocalUploadHelper; + @Autowired + private SystemOssStorageMapper systemOssStorageMapper; - private IPage selectOssStorageByArgs(SystemQueryStorageArgs criteria, - Page page) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (criteria != null) { - wrapper.and(StrUtil.isNotBlank(criteria.getBlurry()), - c -> c.like(SystemOssStorageTb::getFileName, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFilePrefix, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFileMime, criteria.getBlurry()).or() - .like(SystemOssStorageTb::getFileMd5, criteria.getBlurry())); - if (CollUtil.isNotEmpty(criteria.getCreateTime()) && criteria.getCreateTime().size() >= 2) { - wrapper.between(SystemOssStorageTb::getUpdateTime, criteria.getCreateTime().get(0), - criteria.getCreateTime().get(1)); - } - } - wrapper.orderByAsc(SystemOssStorageTb::getId); - return systemOssStorageMapper.selectPage(page, wrapper); - } + @Override + public KitPageResult searchOssStorage(SystemQueryStorageArgs args, + Page page) { + IPage ossStorageTbs = this.selectOssStorageByArgs(args, page); + IPage convert = ossStorageTbs.convert(c -> { + SystemOssStorageVo storageVo = BeanUtil.copyProperties(c, SystemOssStorageVo.class); + storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); + return storageVo; + }); + return KitPageUtil.toPage(convert); + } - @Override - public List queryOssStorage(SystemQueryStorageArgs criteria) { - // 防止刷数据 - Page page = new Page<>(1, 500); - return queryOssStorage(criteria, page).getContent(); + private IPage selectOssStorageByArgs(SystemQueryStorageArgs args, + Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (args != null) { + wrapper.and(StrUtil.isNotBlank(args.getBlurry()), + c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or() + .like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or() + .like(SystemOssStorageTb::getFileMime, args.getBlurry()).or() + .like(SystemOssStorageTb::getFileMd5, args.getBlurry())); + if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { + wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), + args.getCreateTime().get(1)); + } } + wrapper.orderByAsc(SystemOssStorageTb::getId); + return systemOssStorageMapper.selectPage(page, wrapper); + } - @Override - public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) - throws IOException { - List> list = new ArrayList<>(); - for (SystemOssStorageVo ossStorage : ossStorages) { - Map map = new LinkedHashMap<>(); - map.put("服务类型", ossStorage.getServiceType()); - map.put("服务地址", ossStorage.getEndpoint()); - map.put("存储桶名称", ossStorage.getBucketName()); - map.put("文件名称", ossStorage.getFileName()); - map.put("文件大小", ossStorage.getFileSizeDesc()); - map.put("文件类型", ossStorage.getFileMime()); - map.put("创建人", ossStorage.getCreateBy()); - map.put("创建日期", ossStorage.getCreateTime()); - list.add(map); - } - KitFileUtil.downloadExcel(list, response); - } + @Override + public 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("文件名不能为空"); - } - 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.getByMd5(md5); - if (systemOssStorageTb != null) { - // 重新生成7天链接 - return minioRepository.generatePreviewUrl(systemOssStorageTb.getObjectName()); - } - // 上传到OSS - SystemOssStorageTb storageTb = minioRepository.upload(tempFile, originalFilename, fileSize, contentType, md5); - if (storageTb == null) { - throw new BadRequestException("文件上传失败"); - } - save(storageTb); - return minioRepository.generatePreviewUrl(storageTb.getObjectName()); + @Override + public void exportOssStorageExcel(List ossStorages, HttpServletResponse response) + throws IOException { + List> list = new ArrayList<>(); + for (SystemOssStorageVo ossStorage : ossStorages) { + Map map = new LinkedHashMap<>(); + map.put("服务类型", ossStorage.getServiceType()); + map.put("服务地址", ossStorage.getEndpoint()); + map.put("存储桶名称", ossStorage.getBucketName()); + map.put("文件名称", ossStorage.getFileName()); + map.put("文件大小", ossStorage.getFileSizeDesc()); + map.put("文件类型", ossStorage.getFileMime()); + map.put("创建人", ossStorage.getCreateBy()); + map.put("创建日期", ossStorage.getCreateTime()); + list.add(map); } + KitFileUtil.downloadExcel(list, response); + } - /** - * 多选删除 - * - * @param ids / - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void removeFileByIds(Long[] ids) { - for (Long id : ids) { - SystemOssStorageTb storage = getById(id); - minioRepository.removeBucketFile(storage.getObjectName()); - removeById(storage); - } + @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()); + } - private SystemOssStorageTb getByMd5(String md5) { - return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + /** + * 多选删除 + * + * @param ids / + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteFileByIds(Long[] ids) { + for (Long id : ids) { + SystemOssStorageTb storage = getById(id); + minioRepository.removeBucketFile(storage.getObjectName()); + removeById(storage); } + } + + private SystemOssStorageTb getOssStorageByMd5(String md5) { + return lambdaQuery().eq(SystemOssStorageTb::getFileMd5, md5).one(); + } } diff --git a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java index 58c65ebd..0d443168 100644 --- a/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java +++ b/cutejava/cutejava-module-system/src/main/java/cn/odboy/system/util/KitSqlUtil.java @@ -36,150 +36,151 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public final class KitSqlUtil { - /** - * 获取数据源 - * - * @param jdbcUrl / - * @param userName / - * @param password / - * @return DataSource - */ - private static DataSource getDataSource(String jdbcUrl, String userName, String password) { - HikariDataSource druidDataSource = new HikariDataSource(); - String className; - try { - className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); - } catch (SQLException e) { - throw new BadRequestException("Get class name error: =" + jdbcUrl); + + /** + * 获取数据源 + * + * @param jdbcUrl / + * @param userName / + * @param password / + * @return DataSource + */ + private static DataSource getDataSource(String jdbcUrl, String userName, String password) { + HikariDataSource druidDataSource = new HikariDataSource(); + String className; + try { + className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); + } catch (SQLException e) { + throw new BadRequestException("Get class name error: =" + jdbcUrl); + } + if (StringUtils.isEmpty(className)) { + DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); + if (null == dataTypeEnum) { + throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); + } + druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); + } else { + druidDataSource.setDriverClassName(className); + } + druidDataSource.setJdbcUrl(jdbcUrl); + druidDataSource.setUsername(userName); + druidDataSource.setPassword(password); + druidDataSource.setConnectionTimeout(3000); + return druidDataSource; + } + + private static Connection getConnection(String jdbcUrl, String userName, String password) { + DataSource dataSource = getDataSource(jdbcUrl, userName, password); + Connection connection = null; + try { + connection = dataSource.getConnection(); + } catch (Exception ignored) { + } + try { + int timeOut = 5; + if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { + log.info("connection is closed or invalid, retry get connection!"); + connection = dataSource.getConnection(); + } + } catch (Exception e) { + log.error("create connection error, jdbcUrl: {}", jdbcUrl); + throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); + } finally { + KitCloseUtil.close(connection); + } + return connection; + } + + private static void releaseConnection(Connection connection) { + if (null != connection) { + try { + connection.close(); + } catch (Exception e) { + log.error(e.getMessage(), e); + log.error("connection close error:" + e.getMessage()); + } + } + } + + public static boolean testConnection(String jdbcUrl, String userName, String password) { + Connection connection = null; + try { + connection = getConnection(jdbcUrl, userName, password); + if (null != connection) { + return true; + } + } catch (Exception e) { + log.info("Get connection failed:" + e.getMessage()); + } finally { + releaseConnection(connection); + } + return false; + } + + public static String executeFile(String jdbcUrl, String username, String password, File sqlFile) { + Connection connection = getConnection(jdbcUrl, username, password); + try { + batchExecute(connection, readSqlList(sqlFile)); + } catch (Exception e) { + log.error("sql脚本执行发生异常:{}", e.getMessage()); + return e.getMessage(); + } finally { + releaseConnection(connection); + } + return "success"; + } + + /** + * 批量执行sql + * + * @param connection / + * @param sqlList / + */ + public static void batchExecute(Connection connection, List sqlList) { + Statement st = null; + try { + st = connection.createStatement(); + for (String sql : sqlList) { + if (sql.endsWith(";")) { + sql = sql.substring(0, sql.length() - 1); } - if (StringUtils.isEmpty(className)) { - DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); - if (null == dataTypeEnum) { - throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); - } - druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); + st.addBatch(sql); + } + st.executeBatch(); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } finally { + KitCloseUtil.close(st); + } + } + + /** + * 将文件中的sql语句以;为单位读取到列表中 + * + * @param sqlFile / + * @return / + * @throws Exception e + */ + private static List readSqlList(File sqlFile) throws Exception { + List sqlList = Lists.newArrayList(); + StringBuilder sb = new StringBuilder(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(Files.newInputStream(sqlFile.toPath()), StandardCharsets.UTF_8))) { + String tmp; + while ((tmp = reader.readLine()) != null) { + log.info("line:{}", tmp); + if (tmp.endsWith(";")) { + sb.append(tmp); + sqlList.add(sb.toString()); + sb.delete(0, sb.length()); } else { - druidDataSource.setDriverClassName(className); + sb.append(tmp); } - druidDataSource.setJdbcUrl(jdbcUrl); - druidDataSource.setUsername(userName); - druidDataSource.setPassword(password); - druidDataSource.setConnectionTimeout(3000); - return druidDataSource; - } - - private static Connection getConnection(String jdbcUrl, String userName, String password) { - DataSource dataSource = getDataSource(jdbcUrl, userName, password); - Connection connection = null; - try { - connection = dataSource.getConnection(); - } catch (Exception ignored) { - } - try { - int timeOut = 5; - if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { - log.info("connection is closed or invalid, retry get connection!"); - connection = dataSource.getConnection(); - } - } catch (Exception e) { - log.error("create connection error, jdbcUrl: {}", jdbcUrl); - throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); - } finally { - KitCloseUtil.close(connection); - } - return connection; - } - - private static void releaseConnection(Connection connection) { - if (null != connection) { - try { - connection.close(); - } catch (Exception e) { - log.error(e.getMessage(), e); - log.error("connection close error:" + e.getMessage()); - } - } - } - - public static boolean testConnection(String jdbcUrl, String userName, String password) { - Connection connection = null; - try { - connection = getConnection(jdbcUrl, userName, password); - if (null != connection) { - return true; - } - } catch (Exception e) { - log.info("Get connection failed:" + e.getMessage()); - } finally { - releaseConnection(connection); - } - return false; - } - - public static String executeFile(String jdbcUrl, String username, String password, File sqlFile) { - Connection connection = getConnection(jdbcUrl, username, password); - try { - batchExecute(connection, readSqlList(sqlFile)); - } catch (Exception e) { - log.error("sql脚本执行发生异常:{}", e.getMessage()); - return e.getMessage(); - } finally { - releaseConnection(connection); - } - return "success"; - } - - /** - * 批量执行sql - * - * @param connection / - * @param sqlList / - */ - public static void batchExecute(Connection connection, List sqlList) { - Statement st = null; - try { - st = connection.createStatement(); - for (String sql : sqlList) { - if (sql.endsWith(";")) { - sql = sql.substring(0, sql.length() - 1); - } - st.addBatch(sql); - } - st.executeBatch(); - } catch (SQLException throwables) { - throwables.printStackTrace(); - } finally { - KitCloseUtil.close(st); - } - } - - /** - * 将文件中的sql语句以;为单位读取到列表中 - * - * @param sqlFile / - * @return / - * @throws Exception e - */ - private static List readSqlList(File sqlFile) throws Exception { - List sqlList = Lists.newArrayList(); - StringBuilder sb = new StringBuilder(); - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(Files.newInputStream(sqlFile.toPath()), StandardCharsets.UTF_8))) { - String tmp; - while ((tmp = reader.readLine()) != null) { - log.info("line:{}", tmp); - if (tmp.endsWith(";")) { - sb.append(tmp); - sqlList.add(sb.toString()); - sb.delete(0, sb.length()); - } else { - sb.append(tmp); - } - } - if (!"".endsWith(sb.toString().trim())) { - sqlList.add(sb.toString()); - } - } - return sqlList; + } + if (!"".endsWith(sb.toString().trim())) { + sqlList.add(sb.toString()); + } } + return sqlList; + } } diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml deleted file mode 100644 index 4c7a3a72..00000000 --- a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemDictDetailMapper.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml deleted file mode 100644 index f4f89959..00000000 --- a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemRoleMapper.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml b/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml deleted file mode 100644 index 4a1aec47..00000000 --- a/cutejava/cutejava-module-system/src/main/resources/mapper/SystemUserMapper.xml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cutejava/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl b/cutejava/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl index 1e4a8513..78b79672 100644 --- a/cutejava/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl +++ b/cutejava/cutejava-module-system/src/main/resources/template/SystemEmailCaptchaTemplate.ftl @@ -3,9 +3,9 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - cutejava-module-task-v1 - 任务模块:强制停止任务线程 - - - cn.odboy - cutejava-module-system - 1.4.1 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-module-task-v1 + 任务模块:强制停止任务线程 + + + cn.odboy + cutejava-module-system + 1.4.1 + + diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java index 587de031..6d207108 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java @@ -27,14 +27,14 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TaskChangeTypeEnum { - AppApply("AppApply", "申请应用"), AppContainerRestart("AppContainerRestart", "容器应用重启"), - AppContainerDeploy("AppContainerDeploy", "容器应用部署"), AppOffline("AppOffline", "应用下线"), - AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), AppUpgrade("AppUpgrade", "应用升配"), - AppDowngrade("AppDowngrade", "应用降配"), AppHostRestart("AppHostRestart", "主机应用重启"), - AppHostDeploy("AppHostDeploy", "主机应用部署"), AppContainerRollback("AppContainerRollback", "容器应用回滚"), - AppHostRollback("AppHostRollback", "主机应用回滚"), ResourceApply("ResourceApply", "申请资源"), - ResourceOffline("ResourceOffline", "资源下线"), DataChange("DataChange", "数据变更"), - HostnameApply("HostnameApply", "申请域名"), HostnameChange("HostnameChange", "域名变更"); - private final String code; - private final String name; + AppApply("AppApply", "申请应用"), AppContainerRestart("AppContainerRestart", "容器应用重启"), + AppContainerDeploy("AppContainerDeploy", "容器应用部署"), AppOffline("AppOffline", "应用下线"), + AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), AppUpgrade("AppUpgrade", "应用升配"), + AppDowngrade("AppDowngrade", "应用降配"), AppHostRestart("AppHostRestart", "主机应用重启"), + AppHostDeploy("AppHostDeploy", "主机应用部署"), AppContainerRollback("AppContainerRollback", "容器应用回滚"), + AppHostRollback("AppHostRollback", "主机应用回滚"), ResourceApply("ResourceApply", "申请资源"), + ResourceOffline("ResourceOffline", "资源下线"), DataChange("DataChange", "数据变更"), + HostnameApply("HostnameApply", "申请域名"), HostnameChange("HostnameChange", "域名变更"); + private final String code; + private final String name; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskJobKeys.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskJobKeys.java index 783c7597..1bef1a87 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskJobKeys.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskJobKeys.java @@ -7,10 +7,11 @@ package cn.odboy.task.constant; * @date 2025-10-25 */ public interface TaskJobKeys { - String ID = "id"; - String CONTEXT_NAME = "contextName"; - String LANGUAGE = "language"; - String ENV_ALIAS = "envAlias"; - String CHANGE_TYPE = "changeType"; - String RETRY_NODE_CODE = "retryNodeCode"; + + String ID = "id"; + String CONTEXT_NAME = "contextName"; + String LANGUAGE = "language"; + String ENV_ALIAS = "envAlias"; + String CHANGE_TYPE = "changeType"; + String RETRY_NODE_CODE = "retryNodeCode"; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java index 32f66b4e..ff694321 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java @@ -27,17 +27,17 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TaskStatusEnum { - Pending("pending", "未开始"), Running("running", "运行中"), Success("success", "执行成功"), - Fail("fail", "执行失败"); - private final String code; - private final String name; + Pending("pending", "未开始"), Running("running", "运行中"), Success("success", "执行成功"), + Fail("fail", "执行失败"); + private final String code; + private final String name; - public static String getDesc(String code) { - for (TaskStatusEnum taskStatusEnum : TaskStatusEnum.values()) { - if (taskStatusEnum.code.equals(code)) { - return taskStatusEnum.getName(); - } - } - return code; + public static String getDesc(String code) { + for (TaskStatusEnum taskStatusEnum : TaskStatusEnum.values()) { + if (taskStatusEnum.code.equals(code)) { + return taskStatusEnum.getName(); + } } + return code; + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/controller/TaskTestsController.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/controller/TaskTestsController.java index 4c912b9e..208fa520 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/controller/TaskTestsController.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/controller/TaskTestsController.java @@ -34,48 +34,50 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/task") public class TaskTestsController { - @Autowired private TaskManage taskManage; - @AnonymousAccess - @GetMapping(value = "/testCreate") - public ResponseEntity testCreate() { - TaskInstanceInfoTb instanceInfo = - taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", - "功能测试", null); - log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); - return ResponseEntity.ok(instanceInfo); - } + @Autowired + private TaskManage taskManage; - @AnonymousAccess - @GetMapping(value = "/testCreateAfterStop") - public ResponseEntity testCreateAfterStop() { - TaskInstanceInfoTb instanceInfo = - taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", - "功能测试", null); - log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); - ThreadUtil.execAsync(() -> { - ThreadUtil.safeSleep(5000); - taskManage.stopJob(instanceInfo.getId()); - }); - return ResponseEntity.ok(null); - } + @AnonymousAccess + @GetMapping(value = "/testCreate") + public ResponseEntity testCreate() { + TaskInstanceInfoTb instanceInfo = + taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", + "功能测试", null); + log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); + return ResponseEntity.ok(instanceInfo); + } - @AnonymousAccess - @GetMapping(value = "/testRetry") - public ResponseEntity testRetry(@RequestParam Long instanceId, @RequestParam String retryNodeCode) { - TaskInstanceInfoTb instanceInfo = taskManage.retryJob(instanceId, retryNodeCode); - log.info("任务重试成功,实例为:{}", JSON.toJSONString(instanceInfo)); - return ResponseEntity.ok(null); - } + @AnonymousAccess + @GetMapping(value = "/testCreateAfterStop") + public ResponseEntity testCreateAfterStop() { + TaskInstanceInfoTb instanceInfo = + taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", + "功能测试", null); + log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); + ThreadUtil.execAsync(() -> { + ThreadUtil.safeSleep(5000); + taskManage.stopJob(instanceInfo.getId()); + }); + return ResponseEntity.ok(null); + } - @AnonymousAccess - @GetMapping(value = "/last") - public ResponseEntity testLast() { - String contextName = "cutejava"; - String language = "java"; - String changeType = TaskChangeTypeEnum.AppContainerDeploy.getCode(); - String envAlias = "daily"; - TaskInstanceInfoVo instanceInfo = taskManage.getLastInfo(contextName, language, envAlias, changeType); - return ResponseEntity.ok(instanceInfo); - } + @AnonymousAccess + @GetMapping(value = "/testRetry") + public ResponseEntity testRetry(@RequestParam Long instanceId, @RequestParam String retryNodeCode) { + TaskInstanceInfoTb instanceInfo = taskManage.retryJob(instanceId, retryNodeCode); + log.info("任务重试成功,实例为:{}", JSON.toJSONString(instanceInfo)); + return ResponseEntity.ok(null); + } + + @AnonymousAccess + @GetMapping(value = "/last") + public ResponseEntity testLast() { + String contextName = "cutejava"; + String language = "java"; + String changeType = TaskChangeTypeEnum.AppContainerDeploy.getCode(); + String envAlias = "daily"; + TaskInstanceInfoVo instanceInfo = taskManage.getLastInfo(contextName, language, envAlias, changeType); + return ResponseEntity.ok(instanceInfo); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskJobBean.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskJobBean.java index 6d3ed05d..8631f7a0 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskJobBean.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskJobBean.java @@ -41,173 +41,175 @@ import org.springframework.scheduling.quartz.QuartzJobBean; @Slf4j public class TaskJobBean extends QuartzJobBean implements InterruptableJob { - private Thread workThread = null; - private String getBeanAlias(String code) { - if (StrUtil.isBlank(code)) { - throw new ServerException("参数code必填"); + private Thread workThread = null; + + private String getBeanAlias(String code) { + if (StrUtil.isBlank(code)) { + throw new ServerException("参数code必填"); + } + // node_init + String[] s = code.split("_"); + return Arrays.stream(s).map(StrUtil::upperFirst).collect(Collectors.joining()); + } + + @Override + public void executeInternal(JobExecutionContext context) { + this.workThread = Thread.currentThread(); + // ========================== 获取代理类 ========================== + TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class); + TaskInstanceDetailService taskInstanceDetailService = + KitSpringBeanHolder.getBean(TaskInstanceDetailService.class); + // ========================== 获取参数 ========================== + JobDataMap dataMap = context.getMergedJobDataMap(); + long id = dataMap.getLong(TaskJobKeys.ID); + // ========================== 获取任务编排模板 ========================== + TaskInstanceInfoTb taskInstanceInfoVo = taskInstanceInfoService.getById(id); + String templateInfo = taskInstanceInfoVo.getTemplate(); + List taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); + // ========================== 判断是否重试任务 ========================== + String retryNodeCode = dataMap.getString(TaskJobKeys.RETRY_NODE_CODE); + if (StrUtil.isBlank(retryNodeCode)) { + executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos); + } else { + executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, + retryNodeCode); + } + } + + /** + * 执行普通任务(非重试任务) + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 任务实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodeVos 模板节点列表 + */ + private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, + List taskTemplateNodeVos) { + // ========================== 初始化执行明细 ========================== + List taskInstanceDetails = + taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)) + .collect(Collectors.toList()); + taskInstanceDetailService.saveBatch(taskInstanceDetails); + Map codeIdMap = taskInstanceDetails.stream() + .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); + // ========================== 顺序执行 ========================== + executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, + codeIdMap); + } + + /** + * 执行重试任务 + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 任务实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodeVos 模板节点列表 + * @param retryNodeCode 重试节点编码 + */ + private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, + List taskTemplateNodeVos, String retryNodeCode) { + boolean isFound = false; + // ========================== 初始化执行明细 ========================== + List taskInstanceDetails = new ArrayList<>(); + List taskTemplateNodeRetryList = new ArrayList<>(); + for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodeVos) { + if (isFound) { + taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); + taskTemplateNodeRetryList.add(taskTemplateNodeVo); + continue; + } + if (taskTemplateNodeVo.getCode().equals(retryNodeCode)) { + if (!taskTemplateNodeVo.getRetry()) { + throw new BadRequestException("节点 '" + taskTemplateNodeVo.getName() + "' 不支持重试"); } - // node_init - String[] s = code.split("_"); - return Arrays.stream(s).map(StrUtil::upperFirst).collect(Collectors.joining()); + taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); + taskTemplateNodeRetryList.add(taskTemplateNodeVo); + isFound = true; + } } + TaskInstanceStepDetailService taskInstanceStepDetailService = + KitSpringBeanHolder.getBean(TaskInstanceStepDetailService.class); + List bizCodeList = + taskInstanceDetails.stream().map(TaskInstanceDetailTb::getBizCode).distinct().collect(Collectors.toList()); + List taskInstanceDetailTbs = + taskInstanceDetailService.queryByInstanceIdAndBizCodeList(id, bizCodeList); + List taskInstanceDetailIds = + taskInstanceDetailTbs.stream().map(TaskInstanceDetailTb::getId).collect(Collectors.toList()); + // 根据ID删除明细 + taskInstanceDetailService.removeByIds(taskInstanceDetailIds); + // 根据明细删除步骤 + taskInstanceStepDetailService.removeByInstanceDetailIds(taskInstanceDetailIds); + taskInstanceDetailService.saveBatch(taskInstanceDetails); + Map codeIdMap = taskInstanceDetails.stream() + .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); + // ========================== 顺序执行 ========================== + executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeRetryList, + codeIdMap); + } - @Override - public void executeInternal(JobExecutionContext context) { - this.workThread = Thread.currentThread(); - // ========================== 获取代理类 ========================== - TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class); - TaskInstanceDetailService taskInstanceDetailService = - KitSpringBeanHolder.getBean(TaskInstanceDetailService.class); - // ========================== 获取参数 ========================== - JobDataMap dataMap = context.getMergedJobDataMap(); - long id = dataMap.getLong(TaskJobKeys.ID); - // ========================== 获取任务编排模板 ========================== - TaskInstanceInfoTb taskInstanceInfoVo = taskInstanceInfoService.getById(id); - String templateInfo = taskInstanceInfoVo.getTemplate(); - List taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); - // ========================== 判断是否重试任务 ========================== - String retryNodeCode = dataMap.getString(TaskJobKeys.RETRY_NODE_CODE); - if (StrUtil.isBlank(retryNodeCode)) { - executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos); - } else { - executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, - retryNodeCode); - } - } + /** + * 构建任务实例明细对象 + * + * @param id 实例ID + * @param taskTemplateNodeVo 模板节点 + * @return 任务实例明细对象 + */ + private TaskInstanceDetailTb buildTaskInstanceDetail(long id, TaskTemplateNodeVo taskTemplateNodeVo) { + TaskInstanceDetailTb taskInstanceDetail = new TaskInstanceDetailTb(); + taskInstanceDetail.setInstanceId(id); + taskInstanceDetail.setFinishTime(null); + taskInstanceDetail.setBizCode(taskTemplateNodeVo.getCode()); + taskInstanceDetail.setBizName(taskTemplateNodeVo.getName()); + taskInstanceDetail.setExecuteInfo(TaskStatusEnum.Pending.getName()); + taskInstanceDetail.setExecuteStatus(TaskStatusEnum.Pending.getCode()); + return taskInstanceDetail; + } - /** - * 执行普通任务(非重试任务) - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 任务实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodeVos 模板节点列表 - */ - private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, - List taskTemplateNodeVos) { - // ========================== 初始化执行明细 ========================== - List taskInstanceDetails = - taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)) - .collect(Collectors.toList()); - taskInstanceDetailService.saveBatch(taskInstanceDetails); - Map codeIdMap = taskInstanceDetails.stream() - .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); - // ========================== 顺序执行 ========================== - executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, - codeIdMap); - } - - /** - * 执行重试任务 - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 任务实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodeVos 模板节点列表 - * @param retryNodeCode 重试节点编码 - */ - private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, - List taskTemplateNodeVos, String retryNodeCode) { - boolean isFound = false; - // ========================== 初始化执行明细 ========================== - List taskInstanceDetails = new ArrayList<>(); - List taskTemplateNodeRetryList = new ArrayList<>(); - for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodeVos) { - if (isFound) { - taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); - taskTemplateNodeRetryList.add(taskTemplateNodeVo); - continue; - } - if (taskTemplateNodeVo.getCode().equals(retryNodeCode)) { - if (!taskTemplateNodeVo.getRetry()) { - throw new BadRequestException("节点 '" + taskTemplateNodeVo.getName() + "' 不支持重试"); - } - taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); - taskTemplateNodeRetryList.add(taskTemplateNodeVo); - isFound = true; - } - } - TaskInstanceStepDetailService taskInstanceStepDetailService = - KitSpringBeanHolder.getBean(TaskInstanceStepDetailService.class); - List bizCodeList = - taskInstanceDetails.stream().map(TaskInstanceDetailTb::getBizCode).distinct().collect(Collectors.toList()); - List taskInstanceDetailTbs = - taskInstanceDetailService.queryByInstanceIdAndBizCodeList(id, bizCodeList); - List taskInstanceDetailIds = - taskInstanceDetailTbs.stream().map(TaskInstanceDetailTb::getId).collect(Collectors.toList()); - // 根据ID删除明细 - taskInstanceDetailService.removeByIds(taskInstanceDetailIds); - // 根据明细删除步骤 - taskInstanceStepDetailService.removeByInstanceDetailIds(taskInstanceDetailIds); - taskInstanceDetailService.saveBatch(taskInstanceDetails); - Map codeIdMap = taskInstanceDetails.stream() - .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); - // ========================== 顺序执行 ========================== - executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeRetryList, - codeIdMap); - } - - /** - * 构建任务实例明细对象 - * - * @param id 实例ID - * @param taskTemplateNodeVo 模板节点 - * @return 任务实例明细对象 - */ - private TaskInstanceDetailTb buildTaskInstanceDetail(long id, TaskTemplateNodeVo taskTemplateNodeVo) { - TaskInstanceDetailTb taskInstanceDetail = new TaskInstanceDetailTb(); - taskInstanceDetail.setInstanceId(id); - taskInstanceDetail.setFinishTime(null); - taskInstanceDetail.setBizCode(taskTemplateNodeVo.getCode()); - taskInstanceDetail.setBizName(taskTemplateNodeVo.getName()); - taskInstanceDetail.setExecuteInfo(TaskStatusEnum.Pending.getName()); - taskInstanceDetail.setExecuteStatus(TaskStatusEnum.Pending.getCode()); - return taskInstanceDetail; - } - - /** - * 执行任务步骤 - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodes 需要执行的任务节点列表 - * @param codeIdMap 节点编码与明细ID映射 - */ - private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, - List taskTemplateNodes, Map codeIdMap) { + /** + * 执行任务步骤 + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodes 需要执行的任务节点列表 + * @param codeIdMap 节点编码与明细ID映射 + */ + private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, + List taskTemplateNodes, Map codeIdMap) { + try { + for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { + String code = taskTemplateNodeVo.getCode(); try { - for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { - String code = taskTemplateNodeVo.getCode(); - try { - TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code)); - taskInstanceDetailService.fastStart(id, code, dataMap); - executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo); - taskInstanceDetailService.fastSuccessWithInfo(id, code, null); - } catch (Exception e) { - log.error("任务节点执行失败", e); - taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage()); - throw new ServerException(e); - } - } - taskInstanceInfoService.fastSuccessWithData(id, dataMap); + TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code)); + taskInstanceDetailService.fastStart(id, code, dataMap); + executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo); + taskInstanceDetailService.fastSuccessWithInfo(id, code, null); } catch (Exception e) { - log.error("任务执行失败", e); - taskInstanceInfoService.fastFailWithMessageData(id, e.getMessage(), dataMap); + log.error("任务节点执行失败", e); + taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage()); + throw new ServerException(e); } + } + taskInstanceInfoService.fastSuccessWithData(id, dataMap); + } catch (Exception e) { + log.error("任务执行失败", e); + taskInstanceInfoService.fastFailWithMessageData(id, e.getMessage(), dataMap); } + } - @Override - public void interrupt() { - if (workThread != null) { - workThread.stop(); - } + @Override + public void interrupt() { + if (workThread != null) { + // TODO 非正常手段 + workThread.stop(); } + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskManage.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskManage.java index f6d100fb..231f2886 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskManage.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskManage.java @@ -55,211 +55,212 @@ import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor public class TaskManage { - private final Scheduler scheduler; - private final TaskTemplateInfoService taskTemplateInfoService; - private final TaskInstanceInfoService taskInstanceInfoService; - private final TaskInstanceDetailService taskInstanceDetailService; - /** - * 创建任务单(注:同一应用同一变更类型无法并发多实例) - * - * @param contextName 上下文名称,这里特指应用名 - * @param changeTypeEnum 变更类型 - * @param language 开发语言、资源版本 - * @param envAlias 环境别名 - * @param source 来源 - * @param reason 变更原因 - * @param dataMap 任务参数 - */ - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, - String envAlias, String source, String reason, JobDataMap dataMap) { - if (StrUtil.isBlank(contextName)) { - throw new BadRequestException("参数contextName必填"); - } - if (changeTypeEnum == null) { - throw new BadRequestException("参数changeTypeEnum必填"); - } - if (StrUtil.isBlank(language)) { - throw new BadRequestException("参数language必填"); - } - if (StrUtil.isBlank(envAlias)) { - throw new BadRequestException("参数envAlias必填"); - } - if (StrUtil.isBlank(source)) { - throw new BadRequestException("参数source必填"); - } - if (dataMap == null) { - dataMap = new JobDataMap(); - } - // ========================== 获取任务编排模板 ========================== - TaskTemplateInfoVo taskInstanceInfoVo = - taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeTypeEnum.getCode()); - if (taskInstanceInfoVo == null) { - throw new BadRequestException("没有查询到任务编排模板"); - } - String templateInfo = taskInstanceInfoVo.getTemplateInfo(); - List taskTemplateNodeVos; - try { - taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); - } catch (Exception e) { - log.error("任务编排模板解析失败", e); - throw new BadRequestException("任务编排模板解析失败"); - } - if (taskTemplateNodeVos == null || taskTemplateNodeVos.isEmpty()) { - throw new BadRequestException("没有查询到任务编排明细"); - } - // ========================== 创建任务 ========================== - TaskManage taskManage = KitSpringBeanHolder.getBean(TaskManage.class); - TaskInstanceInfoTb newInstance = - taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, - templateInfo); - dataMap.put(TaskJobKeys.ID, newInstance.getId()); - // 应用名、资源类型 - dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName); - // 开发语言、资源版本 - dataMap.put(TaskJobKeys.LANGUAGE, language); - dataMap.put(TaskJobKeys.ENV_ALIAS, envAlias); - // 变更类型 - dataMap.put(TaskJobKeys.CHANGE_TYPE, changeTypeEnum.getCode()); - buildAndSchedule(changeTypeEnum.getCode(), contextName, dataMap); - return newInstance; - } + private final Scheduler scheduler; + private final TaskTemplateInfoService taskTemplateInfoService; + private final TaskInstanceInfoService taskInstanceInfoService; + private final TaskInstanceDetailService taskInstanceDetailService; - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, - String language, String envAlias, String source, String reason, JobDataMap dataMap, String templateInfo) { - TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb(); - newInstance.setContextName(contextName); - newInstance.setLanguage(language); - newInstance.setChangeType(changeTypeEnum.getCode()); - newInstance.setEnvAlias(envAlias); - newInstance.setStatus(TaskStatusEnum.Running.getCode()); - newInstance.setFinishTime(null); - newInstance.setSource(source); - newInstance.setReason(reason); - newInstance.setTemplate(templateInfo); - newInstance.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoService.save(newInstance); - return newInstance; + /** + * 创建任务单(注:同一应用同一变更类型无法并发多实例) + * + * @param contextName 上下文名称,这里特指应用名 + * @param changeTypeEnum 变更类型 + * @param language 开发语言、资源版本 + * @param envAlias 环境别名 + * @param source 来源 + * @param reason 变更原因 + * @param dataMap 任务参数 + */ + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, + String envAlias, String source, String reason, JobDataMap dataMap) { + if (StrUtil.isBlank(contextName)) { + throw new BadRequestException("参数contextName必填"); } + if (changeTypeEnum == null) { + throw new BadRequestException("参数changeTypeEnum必填"); + } + if (StrUtil.isBlank(language)) { + throw new BadRequestException("参数language必填"); + } + if (StrUtil.isBlank(envAlias)) { + throw new BadRequestException("参数envAlias必填"); + } + if (StrUtil.isBlank(source)) { + throw new BadRequestException("参数source必填"); + } + if (dataMap == null) { + dataMap = new JobDataMap(); + } + // ========================== 获取任务编排模板 ========================== + TaskTemplateInfoVo taskInstanceInfoVo = + taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeTypeEnum.getCode()); + if (taskInstanceInfoVo == null) { + throw new BadRequestException("没有查询到任务编排模板"); + } + String templateInfo = taskInstanceInfoVo.getTemplateInfo(); + List taskTemplateNodeVos; + try { + taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); + } catch (Exception e) { + log.error("任务编排模板解析失败", e); + throw new BadRequestException("任务编排模板解析失败"); + } + if (taskTemplateNodeVos == null || taskTemplateNodeVos.isEmpty()) { + throw new BadRequestException("没有查询到任务编排明细"); + } + // ========================== 创建任务 ========================== + TaskManage taskManage = KitSpringBeanHolder.getBean(TaskManage.class); + TaskInstanceInfoTb newInstance = + taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, + templateInfo); + dataMap.put(TaskJobKeys.ID, newInstance.getId()); + // 应用名、资源类型 + dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName); + // 开发语言、资源版本 + dataMap.put(TaskJobKeys.LANGUAGE, language); + dataMap.put(TaskJobKeys.ENV_ALIAS, envAlias); + // 变更类型 + dataMap.put(TaskJobKeys.CHANGE_TYPE, changeTypeEnum.getCode()); + buildAndSchedule(changeTypeEnum.getCode(), contextName, dataMap); + return newInstance; + } - private void buildAndSchedule(String changeTypeEnum, String contextName, JobDataMap dataMap) { - // ========================== 执行任务 ========================== - JobKey jobKey = JobKey.jobKey(changeTypeEnum, contextName); - TriggerKey triggerKey = TriggerKey.triggerKey(changeTypeEnum, contextName); - JobDetail jobDetail = JobBuilder.newJob(TaskJobBean.class).withIdentity(jobKey).usingJobData(dataMap).build(); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().build(); - try { - scheduler.scheduleJob(jobDetail, trigger); - } catch (ObjectAlreadyExistsException e) { - log.error("任务jobKey={},triggerKey={}任务已存在,跳过加载", jobKey.getName(), triggerKey.getName(), e); - throw new BadRequestException("任务已存在,跳过加载"); - } catch (SchedulerException e) { - log.error("任务jobKey={},triggerKey={}执行失败", jobKey.getName(), triggerKey.getName(), e); - throw new BadRequestException(e); - } - } + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, + String language, String envAlias, String source, String reason, JobDataMap dataMap, String templateInfo) { + TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb(); + newInstance.setContextName(contextName); + newInstance.setLanguage(language); + newInstance.setChangeType(changeTypeEnum.getCode()); + newInstance.setEnvAlias(envAlias); + newInstance.setStatus(TaskStatusEnum.Running.getCode()); + newInstance.setFinishTime(null); + newInstance.setSource(source); + newInstance.setReason(reason); + newInstance.setTemplate(templateInfo); + newInstance.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoService.save(newInstance); + return newInstance; + } - @Transactional(rollbackFor = Exception.class) - public void stopJob(Long instanceId) { - TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getRunningById(instanceId); - String changeType = taskInstanceInfoTb.getChangeType(); - String contextName = taskInstanceInfoTb.getContextName(); - taskInstanceInfoTb.setStatus(TaskStatusEnum.Fail.getCode()); - taskInstanceInfoTb.setErrorMessage("任务被中断"); - taskInstanceInfoTb.setFinishTime(new Date()); - taskInstanceInfoService.updateById(taskInstanceInfoTb); - try { - JobKey jobKey = JobKey.jobKey(changeType, contextName); - TriggerKey triggerKey = TriggerKey.triggerKey(changeType, contextName); - // 停止触发器 - scheduler.pauseTrigger(triggerKey); - // 移除触发器 - scheduler.unscheduleJob(triggerKey); - // 删除并中断任务 - scheduler.deleteJob(jobKey); - scheduler.interrupt(jobKey); - } catch (SchedulerException e) { - log.error("任务停止失败", e); - throw new RuntimeException(e); - } + private void buildAndSchedule(String changeTypeEnum, String contextName, JobDataMap dataMap) { + // ========================== 执行任务 ========================== + JobKey jobKey = JobKey.jobKey(changeTypeEnum, contextName); + TriggerKey triggerKey = TriggerKey.triggerKey(changeTypeEnum, contextName); + JobDetail jobDetail = JobBuilder.newJob(TaskJobBean.class).withIdentity(jobKey).usingJobData(dataMap).build(); + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().build(); + try { + scheduler.scheduleJob(jobDetail, trigger); + } catch (ObjectAlreadyExistsException e) { + log.error("任务jobKey={},triggerKey={}任务已存在,跳过加载", jobKey.getName(), triggerKey.getName(), e); + throw new BadRequestException("任务已存在,跳过加载"); + } catch (SchedulerException e) { + log.error("任务jobKey={},triggerKey={}执行失败", jobKey.getName(), triggerKey.getName(), e); + throw new BadRequestException(e); } + } - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb retryJob(Long id, String retryNodeCode) { - // ========================== 查询任务 ========================== - TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getById(id); - if (taskInstanceInfoTb == null) { - throw new BadRequestException("任务不存在"); - } - // ========================== 失败的任务才能重试 ========================== - if (TaskStatusEnum.Success.getCode().equals(taskInstanceInfoTb.getStatus())) { - throw new BadRequestException("任务已执行完毕,无法重试"); - } - // 参数重放 - JobDataMap dataMap = JSON.parseObject(taskInstanceInfoTb.getJobData(), JobDataMap.class); - if (dataMap == null) { - dataMap = new JobDataMap(); - } - taskInstanceInfoTb.setStatus(TaskStatusEnum.Running.getCode()); - taskInstanceInfoTb.setFinishTime(null); - taskInstanceInfoService.updateById(taskInstanceInfoTb); - // ========================== 执行任务 ========================== - dataMap.put(TaskJobKeys.RETRY_NODE_CODE, retryNodeCode); - String changeType = taskInstanceInfoTb.getChangeType(); - String contextName = taskInstanceInfoTb.getContextName(); - buildAndSchedule(changeType, contextName, dataMap); - return taskInstanceInfoTb; + @Transactional(rollbackFor = Exception.class) + public void stopJob(Long instanceId) { + TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getRunningById(instanceId); + String changeType = taskInstanceInfoTb.getChangeType(); + String contextName = taskInstanceInfoTb.getContextName(); + taskInstanceInfoTb.setStatus(TaskStatusEnum.Fail.getCode()); + taskInstanceInfoTb.setErrorMessage("任务被中断"); + taskInstanceInfoTb.setFinishTime(new Date()); + taskInstanceInfoService.updateById(taskInstanceInfoTb); + try { + JobKey jobKey = JobKey.jobKey(changeType, contextName); + TriggerKey triggerKey = TriggerKey.triggerKey(changeType, contextName); + // 停止触发器 + scheduler.pauseTrigger(triggerKey); + // 移除触发器 + scheduler.unscheduleJob(triggerKey); + // 删除并中断任务 + scheduler.deleteJob(jobKey); + scheduler.interrupt(jobKey); + } catch (SchedulerException e) { + log.error("任务停止失败", e); + throw new RuntimeException(e); } + } - public TaskInstanceInfoVo getLastInfo(String contextName, String language, String envAlias, String changeType) { - TaskInstanceInfoVo record = new TaskInstanceInfoVo(); - TaskInstanceInfoTb historyInstance = - taskInstanceInfoService.getLastHistoryInstance(contextName, language, envAlias, changeType); - if (historyInstance == null) { - // 仅返回模板 - TaskTemplateInfoVo templateInfo = - taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeType); - if (templateInfo == null) { - throw new BadRequestException("没有查询到任务编排模板"); - } - record.setTemplate(templateInfo.getTemplateInfo()); - return record; - } - record = BeanUtil.copyProperties(historyInstance, TaskInstanceInfoVo.class); - record.setHistory(buildNodeList(record)); - TaskInstanceInfoTb runningInstance = - taskInstanceInfoService.getLastRunningInstance(contextName, language, envAlias, changeType); - if (runningInstance != null) { - TaskInstanceInfoVo taskInstanceInfoVo = BeanUtil.copyProperties(runningInstance, TaskInstanceInfoVo.class); - record.setCurrent(buildNodeList(taskInstanceInfoVo)); - } - return record; + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb retryJob(Long id, String retryNodeCode) { + // ========================== 查询任务 ========================== + TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getById(id); + if (taskInstanceInfoTb == null) { + throw new BadRequestException("任务不存在"); } + // ========================== 失败的任务才能重试 ========================== + if (TaskStatusEnum.Success.getCode().equals(taskInstanceInfoTb.getStatus())) { + throw new BadRequestException("任务已执行完毕,无法重试"); + } + // 参数重放 + JobDataMap dataMap = JSON.parseObject(taskInstanceInfoTb.getJobData(), JobDataMap.class); + if (dataMap == null) { + dataMap = new JobDataMap(); + } + taskInstanceInfoTb.setStatus(TaskStatusEnum.Running.getCode()); + taskInstanceInfoTb.setFinishTime(null); + taskInstanceInfoService.updateById(taskInstanceInfoTb); + // ========================== 执行任务 ========================== + dataMap.put(TaskJobKeys.RETRY_NODE_CODE, retryNodeCode); + String changeType = taskInstanceInfoTb.getChangeType(); + String contextName = taskInstanceInfoTb.getContextName(); + buildAndSchedule(changeType, contextName, dataMap); + return taskInstanceInfoTb; + } - private List buildNodeList(TaskInstanceInfoVo record) { - List records = new ArrayList<>(); - // 节点明细 - List taskInstanceDetails = taskInstanceDetailService.queryByInstanceId(record.getId()); - for (TaskInstanceDetailTb taskInstanceDetail : taskInstanceDetails) { - TaskInstanceNodeVo instanceNodeVo = new TaskInstanceNodeVo(); - instanceNodeVo.setCode(taskInstanceDetail.getBizCode()); - instanceNodeVo.setName(taskInstanceDetail.getBizName()); - instanceNodeVo.setStartTime(taskInstanceDetail.getStartTime()); - instanceNodeVo.setFinishTime(taskInstanceDetail.getFinishTime()); - if (taskInstanceDetail.getFinishTime() == null) { - instanceNodeVo.setDurationDesc( - KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), new Date())); - } else { - instanceNodeVo.setDurationDesc(KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), - taskInstanceDetail.getFinishTime())); - } - instanceNodeVo.setRunningDesc(taskInstanceDetail.getExecuteInfo()); - instanceNodeVo.setStatus(taskInstanceDetail.getExecuteStatus()); - instanceNodeVo.setStatusDesc(TaskStatusEnum.getDesc(taskInstanceDetail.getExecuteStatus())); - records.add(instanceNodeVo); - } - return records; + public TaskInstanceInfoVo getLastInfo(String contextName, String language, String envAlias, String changeType) { + TaskInstanceInfoVo record = new TaskInstanceInfoVo(); + TaskInstanceInfoTb historyInstance = + taskInstanceInfoService.getLastHistoryInstance(contextName, language, envAlias, changeType); + if (historyInstance == null) { + // 仅返回模板 + TaskTemplateInfoVo templateInfo = + taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeType); + if (templateInfo == null) { + throw new BadRequestException("没有查询到任务编排模板"); + } + record.setTemplate(templateInfo.getTemplateInfo()); + return record; } + record = BeanUtil.copyProperties(historyInstance, TaskInstanceInfoVo.class); + record.setHistory(buildNodeList(record)); + TaskInstanceInfoTb runningInstance = + taskInstanceInfoService.getLastRunningInstance(contextName, language, envAlias, changeType); + if (runningInstance != null) { + TaskInstanceInfoVo taskInstanceInfoVo = BeanUtil.copyProperties(runningInstance, TaskInstanceInfoVo.class); + record.setCurrent(buildNodeList(taskInstanceInfoVo)); + } + return record; + } + + private List buildNodeList(TaskInstanceInfoVo record) { + List records = new ArrayList<>(); + // 节点明细 + List taskInstanceDetails = taskInstanceDetailService.queryByInstanceId(record.getId()); + for (TaskInstanceDetailTb taskInstanceDetail : taskInstanceDetails) { + TaskInstanceNodeVo instanceNodeVo = new TaskInstanceNodeVo(); + instanceNodeVo.setCode(taskInstanceDetail.getBizCode()); + instanceNodeVo.setName(taskInstanceDetail.getBizName()); + instanceNodeVo.setStartTime(taskInstanceDetail.getStartTime()); + instanceNodeVo.setFinishTime(taskInstanceDetail.getFinishTime()); + if (taskInstanceDetail.getFinishTime() == null) { + instanceNodeVo.setDurationDesc( + KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), new Date())); + } else { + instanceNodeVo.setDurationDesc(KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), + taskInstanceDetail.getFinishTime())); + } + instanceNodeVo.setRunningDesc(taskInstanceDetail.getExecuteInfo()); + instanceNodeVo.setStatus(taskInstanceDetail.getExecuteStatus()); + instanceNodeVo.setStatusDesc(TaskStatusEnum.getDesc(taskInstanceDetail.getExecuteStatus())); + records.add(instanceNodeVo); + } + return records; + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskStepExecutor.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskStepExecutor.java index f362f4f7..a56ec20f 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskStepExecutor.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/TaskStepExecutor.java @@ -20,11 +20,12 @@ import cn.odboy.task.dal.model.TaskTemplateNodeVo; import org.quartz.JobDataMap; public interface TaskStepExecutor { - /** - * @param instanceDetailId 任务实例明细id - * @param jobDataMap 执行参数 - * @param taskTemplateNode 任务节点信息 - */ - void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException; + + /** + * @param instanceDetailId 任务实例明细id + * @param jobDataMap 执行参数 + * @param taskTemplateNode 任务节点信息 + */ + void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java index 57e8a66c..be202e44 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java @@ -26,9 +26,10 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeBuildJava implements TaskStepExecutor { - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(2000); - } + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(2000); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java index 8194be2f..37e11fb0 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java @@ -26,9 +26,10 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeDeployJava implements TaskStepExecutor { - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(5000); - } + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(5000); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java index 2850b098..4a2adfcf 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java @@ -27,13 +27,15 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeInit implements TaskStepExecutor { - @Autowired private TaskInstanceStepDetailService stepDetailService; - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - stepDetailService.success(instanceDetailId, "开始初始化"); - stepDetailService.success(instanceDetailId, "初始化完毕后,放入了一些参数"); - jobDataMap.put("ExcuseMe", "Hello World!"); - } + @Autowired + private TaskInstanceStepDetailService stepDetailService; + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + stepDetailService.success(instanceDetailId, "开始初始化"); + stepDetailService.success(instanceDetailId, "初始化完毕后,放入了一些参数"); + jobDataMap.put("ExcuseMe", "Hello World!"); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java index 565de0b8..442aab2c 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java @@ -28,13 +28,15 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeMergeBranch implements TaskStepExecutor { - @Autowired private TaskInstanceStepDetailService stepDetailService; - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(3000); - stepDetailService.fail(instanceDetailId, "执行失败测试"); - // stepDetailService.success(instanceDetailId, "执行成功"); - } + @Autowired + private TaskInstanceStepDetailService stepDetailService; + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(3000); + stepDetailService.fail(instanceDetailId, "执行失败测试"); + // stepDetailService.success(instanceDetailId, "执行成功"); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java index a28f2814..eb040ad3 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java @@ -45,44 +45,65 @@ import lombok.ToString; @TableName("task_instance_detail") @ApiModel(value = "TaskInstanceDetailTb对象", description = "任务实例明细") public class TaskInstanceDetailTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * 任务实例id - */ - @TableField("instance_id") @ApiModelProperty("任务实例id") private Long instanceId; - /** - * 开始时间 - */ - @ApiModelProperty("开始时间") @TableField("start_time") private Date startTime; - /** - * 结束时间 - */ - @ApiModelProperty("结束时间") @TableField("finish_time") private Date finishTime; - /** - * 业务编码 - */ - @TableField("biz_code") @ApiModelProperty("业务编码") private String bizCode; - /** - * 业务名称(步骤) - */ - @TableField("biz_name") @ApiModelProperty("业务名称(步骤)") private String bizName; - /** - * 执行参数 - */ - @ApiModelProperty("执行参数") @TableField("execute_params") private String executeParams; - /** - * 执行信息 - */ - @ApiModelProperty("执行信息") @TableField("execute_info") private String executeInfo; - /** - * 执行状态(running进行中 success成功 fail失败) - */ - @TableField("execute_status") @ApiModelProperty("执行状态(running进行中 success成功 fail失败)") private String - executeStatus; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * 任务实例id + */ + @TableField("instance_id") + @ApiModelProperty("任务实例id") + private Long instanceId; + /** + * 开始时间 + */ + @ApiModelProperty("开始时间") + @TableField("start_time") + private Date startTime; + /** + * 结束时间 + */ + @ApiModelProperty("结束时间") + @TableField("finish_time") + private Date finishTime; + /** + * 业务编码 + */ + @TableField("biz_code") + @ApiModelProperty("业务编码") + private String bizCode; + /** + * 业务名称(步骤) + */ + @TableField("biz_name") + @ApiModelProperty("业务名称(步骤)") + private String bizName; + /** + * 执行参数 + */ + @ApiModelProperty("执行参数") + @TableField("execute_params") + private String executeParams; + /** + * 执行信息 + */ + @ApiModelProperty("执行信息") + @TableField("execute_info") + private String executeInfo; + /** + * 执行状态(running进行中 success成功 fail失败) + */ + @TableField("execute_status") + @ApiModelProperty("执行状态(running进行中 success成功 fail失败)") + private String + executeStatus; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java index c68f8426..bb2bb838 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java @@ -46,59 +46,90 @@ import org.springframework.data.annotation.CreatedBy; @TableName("task_instance_info") @ApiModel(value = "TaskInstanceInfoTb对象", description = "任务实例") public class TaskInstanceInfoTb extends KitObject { - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建人", hidden = true) private String - createBy; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; - /** - * id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题 - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * 名称 - */ - @ApiModelProperty("名称") @TableField("context_name") private String contextName; - /** - * 语言 - */ - @ApiModelProperty("语言") @TableField("`language`") private String language; - /** - * 变更类型 - */ - @ApiModelProperty("变更类型") @TableField("change_type") private String changeType; - /** - * 环境别名 - */ - @TableField("env_alias") @ApiModelProperty("环境别名") private String envAlias; - /** - * 状态(running进行中 success成功 fail失败) - */ - @TableField("`status`") @ApiModelProperty("状态(running进行中 success成功 fail失败)") private String status; - /** - * 完成时间 - */ - @ApiModelProperty("完成时间") @TableField("finish_time") private Date finishTime; - /** - * 来源 - */ - @ApiModelProperty("来源") @TableField("`source`") private String source; - /** - * 变更原因 - */ - @TableField("reason") @ApiModelProperty("变更原因") private String reason; - /** - * 任务模板 - */ - @TableField("template") @ApiModelProperty("template") private String template; - /** - * QuartzJob参数 - */ - @TableField("job_data") @ApiModelProperty("QuartzJob参数") private String jobData; - /** - * 异常信息 - */ - @TableField("error_message") @ApiModelProperty("异常信息") private String errorMessage; + + @CreatedBy + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人", hidden = true) + private String + createBy; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date updateTime; + /** + * id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题 + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * 名称 + */ + @ApiModelProperty("名称") + @TableField("context_name") + private String contextName; + /** + * 语言 + */ + @ApiModelProperty("语言") + @TableField("`language`") + private String language; + /** + * 变更类型 + */ + @ApiModelProperty("变更类型") + @TableField("change_type") + private String changeType; + /** + * 环境别名 + */ + @TableField("env_alias") + @ApiModelProperty("环境别名") + private String envAlias; + /** + * 状态(running进行中 success成功 fail失败) + */ + @TableField("`status`") + @ApiModelProperty("状态(running进行中 success成功 fail失败)") + private String status; + /** + * 完成时间 + */ + @ApiModelProperty("完成时间") + @TableField("finish_time") + private Date finishTime; + /** + * 来源 + */ + @ApiModelProperty("来源") + @TableField("`source`") + private String source; + /** + * 变更原因 + */ + @TableField("reason") + @ApiModelProperty("变更原因") + private String reason; + /** + * 任务模板 + */ + @TableField("template") + @ApiModelProperty("template") + private String template; + /** + * QuartzJob参数 + */ + @TableField("job_data") + @ApiModelProperty("QuartzJob参数") + private String jobData; + /** + * 异常信息 + */ + @TableField("error_message") + @ApiModelProperty("异常信息") + private String errorMessage; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java index abef4c11..04238676 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java @@ -45,23 +45,34 @@ import lombok.ToString; @TableName("task_instance_step_detail") @ApiModel(value = "TaskInstanceStepDetailTb对象", description = "") public class TaskInstanceStepDetailTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * task_instance_detail表id - */ - @TableField("instance_detail_id") @ApiModelProperty("task_instance_detail表id") private Long instanceDetailId; - /** - * 步骤描述 - */ - @TableField("step_desc") @ApiModelProperty("步骤描述") private String stepDesc; - /** - * 状态(success成功 fail失败) - */ - @TableField("step_status") @ApiModelProperty("状态(success成功 fail失败)") private String stepStatus; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * task_instance_detail表id + */ + @TableField("instance_detail_id") + @ApiModelProperty("task_instance_detail表id") + private Long instanceDetailId; + /** + * 步骤描述 + */ + @TableField("step_desc") + @ApiModelProperty("步骤描述") + private String stepDesc; + /** + * 状态(success成功 fail失败) + */ + @TableField("step_status") + @ApiModelProperty("状态(success成功 fail失败)") + private String stepStatus; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java index 70ded132..b1a3ba56 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java @@ -40,36 +40,53 @@ import lombok.ToString; @TableName("task_template_info") @ApiModel(value = "TaskTemplateInfoTb对象", description = "任务模板") public class TaskTemplateInfoTb extends KitBaseUserTimeTb { - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Long id; - /** - * 数据有效性 - */ - @TableField("available") @ApiModelProperty("数据有效性") private Boolean available; - /** - * 变更类型 - */ - @ApiModelProperty("变更类型") @TableField("change_type") private String changeType; - /** - * 流水线名称 - */ - @TableField("`name`") @ApiModelProperty("流水线名称") private String name; - /** - * 流水线描述 - */ - @ApiModelProperty("流水线描述") @TableField("`description`") private String description; - /** - * 流水线模板内容 - */ - @TableField("template") @ApiModelProperty("流水线模板内容") private String template; - /** - * 环境别名 - */ - @TableField("env_alias") @ApiModelProperty("环境别名") private String envAlias; - /** - * 应用为语言,资源为类型 - */ - @TableField("`language`") @ApiModelProperty("应用为语言,资源为类型") private String language; + + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 数据有效性 + */ + @TableField("available") + @ApiModelProperty("数据有效性") + private Boolean available; + /** + * 变更类型 + */ + @ApiModelProperty("变更类型") + @TableField("change_type") + private String changeType; + /** + * 流水线名称 + */ + @TableField("`name`") + @ApiModelProperty("流水线名称") + private String name; + /** + * 流水线描述 + */ + @ApiModelProperty("流水线描述") + @TableField("`description`") + private String description; + /** + * 流水线模板内容 + */ + @TableField("template") + @ApiModelProperty("流水线模板内容") + private String template; + /** + * 环境别名 + */ + @TableField("env_alias") + @ApiModelProperty("环境别名") + private String envAlias; + /** + * 应用为语言,资源为类型 + */ + @TableField("`language`") + @ApiModelProperty("应用为语言,资源为类型") + private String language; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java index 0072a506..5b1fcff1 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java @@ -14,12 +14,13 @@ import lombok.Setter; @Getter @Setter public class TaskInstanceInfoVo extends TaskInstanceInfoTb { - /** - * 进行中 - */ - private List current; - /** - * 历史已完成或异常 - */ - private List history; + + /** + * 进行中 + */ + private List current; + /** + * 历史已完成或异常 + */ + private List history; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java index ea1ca05a..a9dea70b 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java @@ -28,36 +28,37 @@ import lombok.Setter; @Getter @Setter public class TaskInstanceNodeVo extends KitObject { - /** - * 业务编码 - */ - protected String code; - /** - * 业务名称 - */ - protected String name; - /** - * 开始时间 - */ - protected Date startTime; - /** - * 完成时间 - */ - protected Date finishTime; - /** - * 耗时多久 - */ - protected String durationDesc; - /** - * 进行中描述 - */ - protected String runningDesc; - /** - * 节点状态编码 - */ - protected String status; - /** - * 节点状态描述 - */ - protected String statusDesc; + + /** + * 业务编码 + */ + protected String code; + /** + * 业务名称 + */ + protected String name; + /** + * 开始时间 + */ + protected Date startTime; + /** + * 完成时间 + */ + protected Date finishTime; + /** + * 耗时多久 + */ + protected String durationDesc; + /** + * 进行中描述 + */ + protected String runningDesc; + /** + * 节点状态编码 + */ + protected String status; + /** + * 节点状态描述 + */ + protected String statusDesc; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java index 3a7d0930..7028ebe2 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java @@ -22,11 +22,12 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateInfoVo extends KitObject { - private String changeType; - private String name; - private String description; - private String envAlias; - private String language; - private String contextName; - private String templateInfo; + + private String changeType; + private String name; + private String description; + private String envAlias; + private String language; + private String contextName; + private String templateInfo; } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java index a63ebb2a..3140f825 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java @@ -29,20 +29,21 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateNodeOperateButtonVo extends KitObject { - /** - * 按钮类型(service:调用某个服务并传递参数 link:带参跳转) - */ - private String type; - /** - * 按钮标题 - */ - private String title; - /** - * 按钮传递的参数 - */ - private String code; - /** - * 默认附加参数 - */ - private Map parameters = new HashMap<>(); + + /** + * 按钮类型(service:调用某个服务并传递参数 link:带参跳转) + */ + private String type; + /** + * 按钮标题 + */ + private String title; + /** + * 按钮传递的参数 + */ + private String code; + /** + * 默认附加参数 + */ + private Map parameters = new HashMap<>(); } \ No newline at end of file diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java index ffd8690b..c2189617 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java @@ -31,36 +31,37 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateNodeVo extends KitObject { - /** - * 业务编码 - */ - protected String code; - /** - * 业务类型(service:系统内置服务 rpc:远程调用) - */ - protected String type; - /** - * 业务名称 - */ - protected String name; - /** - * 是否可点击 - */ - protected Boolean click = false; - /** - * 是否可重试 - */ - protected Boolean retry = false; - /** - * 是否可点击:点击展示详情,详情内容类型 - */ - protected String detailType = ""; - /** - * 默认参数
execute: 执行调用 describe: 明细调用 - */ - protected Map parameters = new HashMap<>(); - /** - * 流水线节点控制按钮 - */ - protected List buttons = new ArrayList<>(); + + /** + * 业务编码 + */ + protected String code; + /** + * 业务类型(service:系统内置服务 rpc:远程调用) + */ + protected String type; + /** + * 业务名称 + */ + protected String name; + /** + * 是否可点击 + */ + protected Boolean click = false; + /** + * 是否可重试 + */ + protected Boolean retry = false; + /** + * 是否可点击:点击展示详情,详情内容类型 + */ + protected String detailType = ""; + /** + * 默认参数
execute: 执行调用 describe: 明细调用 + */ + protected Map parameters = new HashMap<>(); + /** + * 流水线节点控制按钮 + */ + protected List buttons = new ArrayList<>(); } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java index 9536b3dd..c79849e5 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-26 */ @Mapper -public interface TaskInstanceDetailMapper extends BaseMapper {} +public interface TaskInstanceDetailMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java index 7fb0336b..682b0b8c 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-26 */ @Mapper -public interface TaskInstanceInfoMapper extends BaseMapper {} +public interface TaskInstanceInfoMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java index 29cdf5ae..67451484 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-28 */ @Mapper -public interface TaskInstanceStepDetailMapper extends BaseMapper {} +public interface TaskInstanceStepDetailMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java index 50419cfa..3a646577 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java @@ -31,14 +31,15 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface TaskTemplateInfoMapper extends BaseMapper { - /** - * @param envAlias 环境别称 - * @param contextName 应用名称、资源类型 - * @param language 语言、版本 - * @param changeType 变更类型 - * @return / - */ - TaskTemplateInfoVo selectTemplateInfoByECL(@Param("envAlias") String envAlias, - @Param("contextName") String contextName, @Param("language") String language, - @Param("changeType") String changeType); + + /** + * @param envAlias 环境别称 + * @param contextName 应用名称、资源类型 + * @param language 语言、版本 + * @param changeType 变更类型 + * @return / + */ + TaskTemplateInfoVo selectTemplateInfoByECL(@Param("envAlias") String envAlias, + @Param("contextName") String contextName, @Param("language") String language, + @Param("changeType") String changeType); } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java index 1ab378d6..be7c69e9 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java @@ -38,72 +38,74 @@ import org.springframework.stereotype.Service; */ @Service public class TaskInstanceDetailService { - @Autowired private TaskInstanceDetailMapper taskInstanceDetailMapper; - public void fastFailWithInfo(Long instanceId, String code, String executeInfo) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, executeInfo); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Fail.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + @Autowired + private TaskInstanceDetailMapper taskInstanceDetailMapper; - public void fastSuccess(Long instanceId, String code) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Success.getName()); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastFailWithInfo(Long instanceId, String code, String executeInfo) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, executeInfo); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Fail.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public void fastSuccessWithInfo(Long instanceId, String code, String executeInfo) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, - executeInfo == null ? TaskStatusEnum.Success.getName() : executeInfo); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastSuccess(Long instanceId, String code) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Success.getName()); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public void fastStart(Long instanceId, String code, JobDataMap dataMap) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getStartTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Running.getName()); - wrapper.set(TaskInstanceDetailTb::getExecuteParams, JSON.toJSONString(dataMap)); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Running.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastSuccessWithInfo(Long instanceId, String code, String executeInfo) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, + executeInfo == null ? TaskStatusEnum.Success.getName() : executeInfo); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public List queryByInstanceIdAndBizCodeList(Long instanceId, List bizCodeList) { - if (CollUtil.isEmpty(bizCodeList)) { - return CollUtil.newArrayList(); - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.in(TaskInstanceDetailTb::getBizCode, bizCodeList); - return taskInstanceDetailMapper.selectList(wrapper); - } + public void fastStart(Long instanceId, String code, JobDataMap dataMap) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getStartTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Running.getName()); + wrapper.set(TaskInstanceDetailTb::getExecuteParams, JSON.toJSONString(dataMap)); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Running.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public List queryByInstanceId(Long instanceId) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.orderByAsc(TaskInstanceDetailTb::getId); - return taskInstanceDetailMapper.selectList(wrapper); + public List queryByInstanceIdAndBizCodeList(Long instanceId, List bizCodeList) { + if (CollUtil.isEmpty(bizCodeList)) { + return CollUtil.newArrayList(); } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.in(TaskInstanceDetailTb::getBizCode, bizCodeList); + return taskInstanceDetailMapper.selectList(wrapper); + } - public void saveBatch(List taskInstanceDetails) { - taskInstanceDetailMapper.insert(taskInstanceDetails); - } + public List queryByInstanceId(Long instanceId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.orderByAsc(TaskInstanceDetailTb::getId); + return taskInstanceDetailMapper.selectList(wrapper); + } - public void removeByIds(List taskInstanceDetailIds) { - taskInstanceDetailMapper.deleteByIds(taskInstanceDetailIds); - } + public void saveBatch(List taskInstanceDetails) { + taskInstanceDetailMapper.insert(taskInstanceDetails); + } + + public void removeByIds(List taskInstanceDetailIds) { + taskInstanceDetailMapper.deleteByIds(taskInstanceDetailIds); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java index 512755d7..97437c85 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java @@ -36,80 +36,82 @@ import org.springframework.transaction.annotation.Transactional; */ @Service public class TaskInstanceInfoService { - @Autowired private TaskInstanceInfoMapper taskInstanceInfoMapper; - public TaskInstanceInfoTb getRunningById(Long id) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getId, id); - wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - return taskInstanceInfoMapper.selectOne(wrapper); - } + @Autowired + private TaskInstanceInfoMapper taskInstanceInfoMapper; - @Transactional(rollbackFor = Exception.class) - public void fastFailWithMessage(Long id, String errorMessage) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Fail.getCode()); - updRecord.setErrorMessage(errorMessage); - taskInstanceInfoMapper.updateById(updRecord); - } + public TaskInstanceInfoTb getRunningById(Long id) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getId, id); + wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + return taskInstanceInfoMapper.selectOne(wrapper); + } - @Transactional(rollbackFor = Exception.class) - public void fastFailWithMessageData(Long id, String errorMessage, JobDataMap dataMap) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Fail.getCode()); - updRecord.setErrorMessage(errorMessage); - updRecord.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoMapper.updateById(updRecord); - } + @Transactional(rollbackFor = Exception.class) + public void fastFailWithMessage(Long id, String errorMessage) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Fail.getCode()); + updRecord.setErrorMessage(errorMessage); + taskInstanceInfoMapper.updateById(updRecord); + } - @Transactional(rollbackFor = Exception.class) - public void fastSuccessWithData(Long id, JobDataMap dataMap) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Success.getCode()); - updRecord.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoMapper.updateById(updRecord); - } + @Transactional(rollbackFor = Exception.class) + public void fastFailWithMessageData(Long id, String errorMessage, JobDataMap dataMap) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Fail.getCode()); + updRecord.setErrorMessage(errorMessage); + updRecord.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoMapper.updateById(updRecord); + } - public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, - String changeType) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); - wrapper.eq(TaskInstanceInfoTb::getLanguage, language); - wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); - wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); - wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - return taskInstanceInfoMapper.selectOne(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void fastSuccessWithData(Long id, JobDataMap dataMap) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Success.getCode()); + updRecord.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoMapper.updateById(updRecord); + } - public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, - String changeType) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); - wrapper.eq(TaskInstanceInfoTb::getLanguage, language); - wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); - wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - wrapper.last("LIMIT 1"); - return taskInstanceInfoMapper.selectOne(wrapper); - } + public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, + String changeType) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); + wrapper.eq(TaskInstanceInfoTb::getLanguage, language); + wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); + wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); + wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + return taskInstanceInfoMapper.selectOne(wrapper); + } - public void save(TaskInstanceInfoTb newInstance) { - taskInstanceInfoMapper.insert(newInstance); - } + public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, + String changeType) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); + wrapper.eq(TaskInstanceInfoTb::getLanguage, language); + wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); + wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + wrapper.last("LIMIT 1"); + return taskInstanceInfoMapper.selectOne(wrapper); + } - public TaskInstanceInfoTb getById(Long id) { - return taskInstanceInfoMapper.selectById(id); - } + public void save(TaskInstanceInfoTb newInstance) { + taskInstanceInfoMapper.insert(newInstance); + } - public void updateById(TaskInstanceInfoTb taskInstanceInfoTb) { - taskInstanceInfoMapper.updateById(taskInstanceInfoTb); - } + public TaskInstanceInfoTb getById(Long id) { + return taskInstanceInfoMapper.selectById(id); + } + + public void updateById(TaskInstanceInfoTb taskInstanceInfoTb) { + taskInstanceInfoMapper.updateById(taskInstanceInfoTb); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java index 5fc17068..6284be14 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java @@ -35,48 +35,50 @@ import org.springframework.stereotype.Service; */ @Service public class TaskInstanceStepDetailService { - @Autowired private TaskInstanceStepDetailMapper taskInstanceStepDetailMapper; - /** - * 步骤执行成功 - * - * @param instanceDetailId 任务实例明细id - * @param stepDesc 步骤描述 - */ - public void success(Long instanceDetailId, String stepDesc) { - TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); - stepDetail.setInstanceDetailId(instanceDetailId); - stepDetail.setStepDesc(stepDesc); - stepDetail.setStepStatus(TaskStatusEnum.Success.getCode()); - taskInstanceStepDetailMapper.insert(stepDetail); - } + @Autowired + private TaskInstanceStepDetailMapper taskInstanceStepDetailMapper; - /** - * 步骤执行失败 - * - * @param instanceDetailId 任务实例明细id - * @param stepDesc 步骤描述 - */ - public void fail(Long instanceDetailId, String stepDesc) { - TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); - stepDetail.setInstanceDetailId(instanceDetailId); - stepDetail.setStepDesc(stepDesc); - stepDetail.setStepStatus(TaskStatusEnum.Fail.getCode()); - taskInstanceStepDetailMapper.insert(stepDetail); - throw new BadRequestException(stepDesc); - } + /** + * 步骤执行成功 + * + * @param instanceDetailId 任务实例明细id + * @param stepDesc 步骤描述 + */ + public void success(Long instanceDetailId, String stepDesc) { + TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); + stepDetail.setInstanceDetailId(instanceDetailId); + stepDetail.setStepDesc(stepDesc); + stepDetail.setStepStatus(TaskStatusEnum.Success.getCode()); + taskInstanceStepDetailMapper.insert(stepDetail); + } - /** - * 根据明细ID删除步骤明细 - * - * @param instanceDetailIds 任务实例明细id集合 - */ - public void removeByInstanceDetailIds(List instanceDetailIds) { - if (CollUtil.isNotEmpty(instanceDetailIds)) { - return; - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds); - taskInstanceStepDetailMapper.delete(wrapper); + /** + * 步骤执行失败 + * + * @param instanceDetailId 任务实例明细id + * @param stepDesc 步骤描述 + */ + public void fail(Long instanceDetailId, String stepDesc) { + TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); + stepDetail.setInstanceDetailId(instanceDetailId); + stepDetail.setStepDesc(stepDesc); + stepDetail.setStepStatus(TaskStatusEnum.Fail.getCode()); + taskInstanceStepDetailMapper.insert(stepDetail); + throw new BadRequestException(stepDesc); + } + + /** + * 根据明细ID删除步骤明细 + * + * @param instanceDetailIds 任务实例明细id集合 + */ + public void removeByInstanceDetailIds(List instanceDetailIds) { + if (CollUtil.isNotEmpty(instanceDetailIds)) { + return; } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds); + taskInstanceStepDetailMapper.delete(wrapper); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java index 960b0716..6f0a9195 100644 --- a/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java +++ b/cutejava/cutejava-module-task-v1/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java @@ -30,10 +30,12 @@ import org.springframework.stereotype.Service; */ @Service public class TaskTemplateInfoService { - @Autowired private TaskTemplateInfoMapper taskTemplateInfoMapper; - public TaskTemplateInfoVo getTemplateInfoByECL(String envAlias, String contextName, String language, - String changeType) { - return taskTemplateInfoMapper.selectTemplateInfoByECL(envAlias, contextName, language, changeType); - } + @Autowired + private TaskTemplateInfoMapper taskTemplateInfoMapper; + + public TaskTemplateInfoVo getTemplateInfoByECL(String envAlias, String contextName, String language, + String changeType) { + return taskTemplateInfoMapper.selectTemplateInfoByECL(envAlias, contextName, language, changeType); + } } diff --git a/cutejava/cutejava-module-task-v1/src/main/resources/mapper/TaskTemplateInfoMapper.xml b/cutejava/cutejava-module-task-v1/src/main/resources/mapper/TaskTemplateInfoMapper.xml index b0f24dbd..f440ada8 100644 --- a/cutejava/cutejava-module-task-v1/src/main/resources/mapper/TaskTemplateInfoMapper.xml +++ b/cutejava/cutejava-module-task-v1/src/main/resources/mapper/TaskTemplateInfoMapper.xml @@ -1,19 +1,19 @@ - + diff --git a/cutejava/cutejava-module-task-v2/pom.xml b/cutejava/cutejava-module-task-v2/pom.xml index b5752e8f..36f6c9f3 100644 --- a/cutejava/cutejava-module-task-v2/pom.xml +++ b/cutejava/cutejava-module-task-v2/pom.xml @@ -1,19 +1,19 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - cutejava-module-task-v2 - 任务模块V2:根据任务标记停止轮询检查 - - - cn.odboy - cutejava-module-system - 1.4.1 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-module-task-v2 + 任务模块V2:根据任务标记停止轮询检查 + + + cn.odboy + cutejava-module-system + 1.4.1 + + diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java index 587de031..6d207108 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskChangeTypeEnum.java @@ -27,14 +27,14 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TaskChangeTypeEnum { - AppApply("AppApply", "申请应用"), AppContainerRestart("AppContainerRestart", "容器应用重启"), - AppContainerDeploy("AppContainerDeploy", "容器应用部署"), AppOffline("AppOffline", "应用下线"), - AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), AppUpgrade("AppUpgrade", "应用升配"), - AppDowngrade("AppDowngrade", "应用降配"), AppHostRestart("AppHostRestart", "主机应用重启"), - AppHostDeploy("AppHostDeploy", "主机应用部署"), AppContainerRollback("AppContainerRollback", "容器应用回滚"), - AppHostRollback("AppHostRollback", "主机应用回滚"), ResourceApply("ResourceApply", "申请资源"), - ResourceOffline("ResourceOffline", "资源下线"), DataChange("DataChange", "数据变更"), - HostnameApply("HostnameApply", "申请域名"), HostnameChange("HostnameChange", "域名变更"); - private final String code; - private final String name; + AppApply("AppApply", "申请应用"), AppContainerRestart("AppContainerRestart", "容器应用重启"), + AppContainerDeploy("AppContainerDeploy", "容器应用部署"), AppOffline("AppOffline", "应用下线"), + AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), AppUpgrade("AppUpgrade", "应用升配"), + AppDowngrade("AppDowngrade", "应用降配"), AppHostRestart("AppHostRestart", "主机应用重启"), + AppHostDeploy("AppHostDeploy", "主机应用部署"), AppContainerRollback("AppContainerRollback", "容器应用回滚"), + AppHostRollback("AppHostRollback", "主机应用回滚"), ResourceApply("ResourceApply", "申请资源"), + ResourceOffline("ResourceOffline", "资源下线"), DataChange("DataChange", "数据变更"), + HostnameApply("HostnameApply", "申请域名"), HostnameChange("HostnameChange", "域名变更"); + private final String code; + private final String name; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskJobKeys.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskJobKeys.java index 783c7597..1bef1a87 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskJobKeys.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskJobKeys.java @@ -7,10 +7,11 @@ package cn.odboy.task.constant; * @date 2025-10-25 */ public interface TaskJobKeys { - String ID = "id"; - String CONTEXT_NAME = "contextName"; - String LANGUAGE = "language"; - String ENV_ALIAS = "envAlias"; - String CHANGE_TYPE = "changeType"; - String RETRY_NODE_CODE = "retryNodeCode"; + + String ID = "id"; + String CONTEXT_NAME = "contextName"; + String LANGUAGE = "language"; + String ENV_ALIAS = "envAlias"; + String CHANGE_TYPE = "changeType"; + String RETRY_NODE_CODE = "retryNodeCode"; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java index 32f66b4e..ff694321 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/constant/TaskStatusEnum.java @@ -27,17 +27,17 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TaskStatusEnum { - Pending("pending", "未开始"), Running("running", "运行中"), Success("success", "执行成功"), - Fail("fail", "执行失败"); - private final String code; - private final String name; + Pending("pending", "未开始"), Running("running", "运行中"), Success("success", "执行成功"), + Fail("fail", "执行失败"); + private final String code; + private final String name; - public static String getDesc(String code) { - for (TaskStatusEnum taskStatusEnum : TaskStatusEnum.values()) { - if (taskStatusEnum.code.equals(code)) { - return taskStatusEnum.getName(); - } - } - return code; + public static String getDesc(String code) { + for (TaskStatusEnum taskStatusEnum : TaskStatusEnum.values()) { + if (taskStatusEnum.code.equals(code)) { + return taskStatusEnum.getName(); + } } + return code; + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/controller/TaskTestsController.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/controller/TaskTestsController.java index 4c912b9e..208fa520 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/controller/TaskTestsController.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/controller/TaskTestsController.java @@ -34,48 +34,50 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/task") public class TaskTestsController { - @Autowired private TaskManage taskManage; - @AnonymousAccess - @GetMapping(value = "/testCreate") - public ResponseEntity testCreate() { - TaskInstanceInfoTb instanceInfo = - taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", - "功能测试", null); - log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); - return ResponseEntity.ok(instanceInfo); - } + @Autowired + private TaskManage taskManage; - @AnonymousAccess - @GetMapping(value = "/testCreateAfterStop") - public ResponseEntity testCreateAfterStop() { - TaskInstanceInfoTb instanceInfo = - taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", - "功能测试", null); - log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); - ThreadUtil.execAsync(() -> { - ThreadUtil.safeSleep(5000); - taskManage.stopJob(instanceInfo.getId()); - }); - return ResponseEntity.ok(null); - } + @AnonymousAccess + @GetMapping(value = "/testCreate") + public ResponseEntity testCreate() { + TaskInstanceInfoTb instanceInfo = + taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", + "功能测试", null); + log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); + return ResponseEntity.ok(instanceInfo); + } - @AnonymousAccess - @GetMapping(value = "/testRetry") - public ResponseEntity testRetry(@RequestParam Long instanceId, @RequestParam String retryNodeCode) { - TaskInstanceInfoTb instanceInfo = taskManage.retryJob(instanceId, retryNodeCode); - log.info("任务重试成功,实例为:{}", JSON.toJSONString(instanceInfo)); - return ResponseEntity.ok(null); - } + @AnonymousAccess + @GetMapping(value = "/testCreateAfterStop") + public ResponseEntity testCreateAfterStop() { + TaskInstanceInfoTb instanceInfo = + taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", + "功能测试", null); + log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); + ThreadUtil.execAsync(() -> { + ThreadUtil.safeSleep(5000); + taskManage.stopJob(instanceInfo.getId()); + }); + return ResponseEntity.ok(null); + } - @AnonymousAccess - @GetMapping(value = "/last") - public ResponseEntity testLast() { - String contextName = "cutejava"; - String language = "java"; - String changeType = TaskChangeTypeEnum.AppContainerDeploy.getCode(); - String envAlias = "daily"; - TaskInstanceInfoVo instanceInfo = taskManage.getLastInfo(contextName, language, envAlias, changeType); - return ResponseEntity.ok(instanceInfo); - } + @AnonymousAccess + @GetMapping(value = "/testRetry") + public ResponseEntity testRetry(@RequestParam Long instanceId, @RequestParam String retryNodeCode) { + TaskInstanceInfoTb instanceInfo = taskManage.retryJob(instanceId, retryNodeCode); + log.info("任务重试成功,实例为:{}", JSON.toJSONString(instanceInfo)); + return ResponseEntity.ok(null); + } + + @AnonymousAccess + @GetMapping(value = "/last") + public ResponseEntity testLast() { + String contextName = "cutejava"; + String language = "java"; + String changeType = TaskChangeTypeEnum.AppContainerDeploy.getCode(); + String envAlias = "daily"; + TaskInstanceInfoVo instanceInfo = taskManage.getLastInfo(contextName, language, envAlias, changeType); + return ResponseEntity.ok(instanceInfo); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskJobBean.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskJobBean.java index 63180f0b..9d3db724 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskJobBean.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskJobBean.java @@ -41,193 +41,194 @@ import org.springframework.scheduling.quartz.QuartzJobBean; @Slf4j public class TaskJobBean extends QuartzJobBean { - private String getBeanAlias(String code) { - if (StrUtil.isBlank(code)) { - throw new ServerException("参数code必填"); + + private String getBeanAlias(String code) { + if (StrUtil.isBlank(code)) { + throw new ServerException("参数code必填"); + } + // node_init + String[] s = code.split("_"); + return Arrays.stream(s).map(StrUtil::upperFirst).collect(Collectors.joining()); + } + + @Override + public void executeInternal(JobExecutionContext context) { + // ========================== 获取代理类 ========================== + TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class); + TaskInstanceDetailService taskInstanceDetailService = + KitSpringBeanHolder.getBean(TaskInstanceDetailService.class); + // ========================== 获取参数 ========================== + JobDataMap dataMap = context.getMergedJobDataMap(); + long id = dataMap.getLong(TaskJobKeys.ID); + // ========================== 获取任务编排模板 ========================== + TaskInstanceInfoTb taskInstanceInfoVo = taskInstanceInfoService.getRunningById(id); + String templateInfo = taskInstanceInfoVo.getTemplate(); + List taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); + // ========================== 判断是否重试任务 ========================== + String retryNodeCode = dataMap.getString(TaskJobKeys.RETRY_NODE_CODE); + if (StrUtil.isBlank(retryNodeCode)) { + executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos); + } else { + executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, + retryNodeCode); + } + } + + /** + * 执行普通任务(非重试任务) + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 任务实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodeVos 模板节点列表 + */ + private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, + List taskTemplateNodeVos) { + // ========================== 初始化执行明细 ========================== + List taskInstanceDetails = + taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)) + .collect(Collectors.toList()); + taskInstanceDetailService.saveBatch(taskInstanceDetails); + Map codeIdMap = taskInstanceDetails.stream() + .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); + // ========================== 顺序执行 ========================== + executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, + codeIdMap); + } + + /** + * 执行重试任务 + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 任务实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodeVos 模板节点列表 + * @param retryNodeCode 重试节点编码 + */ + private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, + List taskTemplateNodeVos, String retryNodeCode) { + boolean isFound = false; + // ========================== 初始化执行明细 ========================== + List taskInstanceDetails = new ArrayList<>(); + List taskTemplateNodeRetryList = new ArrayList<>(); + for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodeVos) { + if (isFound) { + taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); + taskTemplateNodeRetryList.add(taskTemplateNodeVo); + continue; + } + if (taskTemplateNodeVo.getCode().equals(retryNodeCode)) { + if (!taskTemplateNodeVo.getRetry()) { + throw new BadRequestException("节点 '" + taskTemplateNodeVo.getName() + "' 不支持重试"); } - // node_init - String[] s = code.split("_"); - return Arrays.stream(s).map(StrUtil::upperFirst).collect(Collectors.joining()); + taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); + taskTemplateNodeRetryList.add(taskTemplateNodeVo); + isFound = true; + } } + TaskInstanceStepDetailService taskInstanceStepDetailService = + KitSpringBeanHolder.getBean(TaskInstanceStepDetailService.class); + List bizCodeList = + taskInstanceDetails.stream().map(TaskInstanceDetailTb::getBizCode).distinct().collect(Collectors.toList()); + List taskInstanceDetailTbs = + taskInstanceDetailService.queryByInstanceIdAndBizCodeList(id, bizCodeList); + List taskInstanceDetailIds = + taskInstanceDetailTbs.stream().map(TaskInstanceDetailTb::getId).collect(Collectors.toList()); + // 根据ID删除明细 + taskInstanceDetailService.removeByIds(taskInstanceDetailIds); + // 根据明细删除步骤 + taskInstanceStepDetailService.removeByInstanceDetailIds(taskInstanceDetailIds); + taskInstanceDetailService.saveBatch(taskInstanceDetails); + Map codeIdMap = taskInstanceDetails.stream() + .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); + // ========================== 顺序执行 ========================== + executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeRetryList, + codeIdMap); + } - @Override - public void executeInternal(JobExecutionContext context) { - // ========================== 获取代理类 ========================== - TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class); - TaskInstanceDetailService taskInstanceDetailService = - KitSpringBeanHolder.getBean(TaskInstanceDetailService.class); - // ========================== 获取参数 ========================== - JobDataMap dataMap = context.getMergedJobDataMap(); - long id = dataMap.getLong(TaskJobKeys.ID); - // ========================== 获取任务编排模板 ========================== - TaskInstanceInfoTb taskInstanceInfoVo = taskInstanceInfoService.getRunningById(id); - String templateInfo = taskInstanceInfoVo.getTemplate(); - List taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); - // ========================== 判断是否重试任务 ========================== - String retryNodeCode = dataMap.getString(TaskJobKeys.RETRY_NODE_CODE); - if (StrUtil.isBlank(retryNodeCode)) { - executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos); - } else { - executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, - retryNodeCode); + /** + * 构建任务实例明细对象 + * + * @param id 实例ID + * @param taskTemplateNodeVo 模板节点 + * @return 任务实例明细对象 + */ + private TaskInstanceDetailTb buildTaskInstanceDetail(long id, TaskTemplateNodeVo taskTemplateNodeVo) { + TaskInstanceDetailTb taskInstanceDetail = new TaskInstanceDetailTb(); + taskInstanceDetail.setInstanceId(id); + taskInstanceDetail.setFinishTime(null); + taskInstanceDetail.setBizCode(taskTemplateNodeVo.getCode()); + taskInstanceDetail.setBizName(taskTemplateNodeVo.getName()); + taskInstanceDetail.setExecuteInfo(TaskStatusEnum.Pending.getName()); + taskInstanceDetail.setExecuteStatus(TaskStatusEnum.Pending.getCode()); + return taskInstanceDetail; + } + + /** + * 执行任务步骤 + * + * @param taskInstanceInfoService 任务实例信息服务 + * @param taskInstanceDetailService 任务实例明细服务 + * @param id 实例ID + * @param dataMap 数据映射 + * @param taskTemplateNodes 需要执行的任务节点列表 + * @param codeIdMap 节点编码与明细ID映射 + */ + private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, + TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, + List taskTemplateNodes, Map codeIdMap) { + try { + boolean isTerminate = false; + for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { + String code = taskTemplateNodeVo.getCode(); + while (true) { + TaskInstanceDetailTb currentTaskInstanceNode = + taskInstanceDetailService.getOneByInstanceIdAndCode(id, code); + if (TaskStatusEnum.Fail.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { + log.info("任务节点执行失败, instanceId={}, bizCode={}", id, code); + isTerminate = true; + break; + } else if (TaskStatusEnum.Success.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { + log.info("任务节点执行成功, instanceId={}, bizCode={}", id, code); + break; + } else if (TaskStatusEnum.Pending.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { + log.info("任务节点由待执行变更为执行中, instanceId={}, bizCode={}", id, code); + try { + TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code)); + taskInstanceDetailService.fastStart(id, code, dataMap); + executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo); + taskInstanceDetailService.fastSuccessWithInfo(id, code, null); + } catch (Exception e) { + log.error("任务节点执行失败", e); + taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage()); + throw new ServerException(e); + } + break; + } else if (TaskStatusEnum.Running.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { + ThreadUtil.safeSleep(5000); + } else { + // 处理未知状态 + log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code, + currentTaskInstanceNode.getExecuteStatus()); + ThreadUtil.safeSleep(5000); + } } - } - - /** - * 执行普通任务(非重试任务) - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 任务实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodeVos 模板节点列表 - */ - private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, - List taskTemplateNodeVos) { - // ========================== 初始化执行明细 ========================== - List taskInstanceDetails = - taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)) - .collect(Collectors.toList()); - taskInstanceDetailService.saveBatch(taskInstanceDetails); - Map codeIdMap = taskInstanceDetails.stream() - .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); - // ========================== 顺序执行 ========================== - executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, - codeIdMap); - } - - /** - * 执行重试任务 - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 任务实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodeVos 模板节点列表 - * @param retryNodeCode 重试节点编码 - */ - private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, - List taskTemplateNodeVos, String retryNodeCode) { - boolean isFound = false; - // ========================== 初始化执行明细 ========================== - List taskInstanceDetails = new ArrayList<>(); - List taskTemplateNodeRetryList = new ArrayList<>(); - for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodeVos) { - if (isFound) { - taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); - taskTemplateNodeRetryList.add(taskTemplateNodeVo); - continue; - } - if (taskTemplateNodeVo.getCode().equals(retryNodeCode)) { - if (!taskTemplateNodeVo.getRetry()) { - throw new BadRequestException("节点 '" + taskTemplateNodeVo.getName() + "' 不支持重试"); - } - taskInstanceDetails.add(buildTaskInstanceDetail(id, taskTemplateNodeVo)); - taskTemplateNodeRetryList.add(taskTemplateNodeVo); - isFound = true; - } - } - TaskInstanceStepDetailService taskInstanceStepDetailService = - KitSpringBeanHolder.getBean(TaskInstanceStepDetailService.class); - List bizCodeList = - taskInstanceDetails.stream().map(TaskInstanceDetailTb::getBizCode).distinct().collect(Collectors.toList()); - List taskInstanceDetailTbs = - taskInstanceDetailService.queryByInstanceIdAndBizCodeList(id, bizCodeList); - List taskInstanceDetailIds = - taskInstanceDetailTbs.stream().map(TaskInstanceDetailTb::getId).collect(Collectors.toList()); - // 根据ID删除明细 - taskInstanceDetailService.removeByIds(taskInstanceDetailIds); - // 根据明细删除步骤 - taskInstanceStepDetailService.removeByInstanceDetailIds(taskInstanceDetailIds); - taskInstanceDetailService.saveBatch(taskInstanceDetails); - Map codeIdMap = taskInstanceDetails.stream() - .collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); - // ========================== 顺序执行 ========================== - executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeRetryList, - codeIdMap); - } - - /** - * 构建任务实例明细对象 - * - * @param id 实例ID - * @param taskTemplateNodeVo 模板节点 - * @return 任务实例明细对象 - */ - private TaskInstanceDetailTb buildTaskInstanceDetail(long id, TaskTemplateNodeVo taskTemplateNodeVo) { - TaskInstanceDetailTb taskInstanceDetail = new TaskInstanceDetailTb(); - taskInstanceDetail.setInstanceId(id); - taskInstanceDetail.setFinishTime(null); - taskInstanceDetail.setBizCode(taskTemplateNodeVo.getCode()); - taskInstanceDetail.setBizName(taskTemplateNodeVo.getName()); - taskInstanceDetail.setExecuteInfo(TaskStatusEnum.Pending.getName()); - taskInstanceDetail.setExecuteStatus(TaskStatusEnum.Pending.getCode()); - return taskInstanceDetail; - } - - /** - * 执行任务步骤 - * - * @param taskInstanceInfoService 任务实例信息服务 - * @param taskInstanceDetailService 任务实例明细服务 - * @param id 实例ID - * @param dataMap 数据映射 - * @param taskTemplateNodes 需要执行的任务节点列表 - * @param codeIdMap 节点编码与明细ID映射 - */ - private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, - TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, - List taskTemplateNodes, Map codeIdMap) { - try { - boolean isTerminate = false; - for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { - String code = taskTemplateNodeVo.getCode(); - while (true) { - TaskInstanceDetailTb currentTaskInstanceNode = - taskInstanceDetailService.getOneByInstanceIdAndCode(id, code); - if (TaskStatusEnum.Fail.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { - log.info("任务节点执行失败, instanceId={}, bizCode={}", id, code); - isTerminate = true; - break; - } else if (TaskStatusEnum.Success.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { - log.info("任务节点执行成功, instanceId={}, bizCode={}", id, code); - break; - } else if (TaskStatusEnum.Pending.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { - log.info("任务节点由待执行变更为执行中, instanceId={}, bizCode={}", id, code); - try { - TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code)); - taskInstanceDetailService.fastStart(id, code, dataMap); - executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo); - taskInstanceDetailService.fastSuccessWithInfo(id, code, null); - } catch (Exception e) { - log.error("任务节点执行失败", e); - taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage()); - throw new ServerException(e); - } - break; - } else if (TaskStatusEnum.Running.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { - ThreadUtil.safeSleep(5000); - } else { - // 处理未知状态 - log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code, - currentTaskInstanceNode.getExecuteStatus()); - ThreadUtil.safeSleep(5000); - } - } - if (isTerminate) { - break; - } - } - if (isTerminate) { - taskInstanceInfoService.fastFailWithMessageData(id, "任务执行失败", dataMap); - } else { - taskInstanceInfoService.fastSuccessWithData(id, dataMap); - } - } catch (Exception e) { - log.error("任务执行失败", e); - taskInstanceInfoService.fastFailWithMessageData(id, e.getMessage(), dataMap); + if (isTerminate) { + break; } + } + if (isTerminate) { + taskInstanceInfoService.fastFailWithMessageData(id, "任务执行失败", dataMap); + } else { + taskInstanceInfoService.fastSuccessWithData(id, dataMap); + } + } catch (Exception e) { + log.error("任务执行失败", e); + taskInstanceInfoService.fastFailWithMessageData(id, e.getMessage(), dataMap); } + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskManage.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskManage.java index 7a045fa9..31a7a163 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskManage.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskManage.java @@ -55,211 +55,212 @@ import org.springframework.transaction.annotation.Transactional; @Component @RequiredArgsConstructor public class TaskManage { - private final Scheduler scheduler; - private final TaskTemplateInfoService taskTemplateInfoService; - private final TaskInstanceInfoService taskInstanceInfoService; - private final TaskInstanceDetailService taskInstanceDetailService; - /** - * 创建任务单(注:同一应用同一变更类型无法并发多实例) - * - * @param contextName 上下文名称,这里特指应用名 - * @param changeTypeEnum 变更类型 - * @param language 开发语言、资源版本 - * @param envAlias 环境别名 - * @param source 来源 - * @param reason 变更原因 - * @param dataMap 任务参数 - */ - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, - String envAlias, String source, String reason, JobDataMap dataMap) { - if (StrUtil.isBlank(contextName)) { - throw new BadRequestException("参数contextName必填"); - } - if (changeTypeEnum == null) { - throw new BadRequestException("参数changeTypeEnum必填"); - } - if (StrUtil.isBlank(language)) { - throw new BadRequestException("参数language必填"); - } - if (StrUtil.isBlank(envAlias)) { - throw new BadRequestException("参数envAlias必填"); - } - if (StrUtil.isBlank(source)) { - throw new BadRequestException("参数source必填"); - } - if (dataMap == null) { - dataMap = new JobDataMap(); - } - // ========================== 获取任务编排模板 ========================== - TaskTemplateInfoVo taskInstanceInfoVo = - taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeTypeEnum.getCode()); - if (taskInstanceInfoVo == null) { - throw new BadRequestException("没有查询到任务编排模板"); - } - String templateInfo = taskInstanceInfoVo.getTemplateInfo(); - List taskTemplateNodeVos; - try { - taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); - } catch (Exception e) { - log.error("任务编排模板解析失败", e); - throw new BadRequestException("任务编排模板解析失败"); - } - if (taskTemplateNodeVos == null || taskTemplateNodeVos.isEmpty()) { - throw new BadRequestException("没有查询到任务编排明细"); - } - // ========================== 创建任务 ========================== - TaskManage taskManage = KitSpringBeanHolder.getBean(TaskManage.class); - TaskInstanceInfoTb newInstance = - taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, - templateInfo); - dataMap.put(TaskJobKeys.ID, newInstance.getId()); - // 应用名、资源类型 - dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName); - // 开发语言、资源版本 - dataMap.put(TaskJobKeys.LANGUAGE, language); - dataMap.put(TaskJobKeys.ENV_ALIAS, envAlias); - // 变更类型 - dataMap.put(TaskJobKeys.CHANGE_TYPE, changeTypeEnum.getCode()); - buildAndSchedule(changeTypeEnum.getCode(), contextName, dataMap); - return newInstance; - } + private final Scheduler scheduler; + private final TaskTemplateInfoService taskTemplateInfoService; + private final TaskInstanceInfoService taskInstanceInfoService; + private final TaskInstanceDetailService taskInstanceDetailService; - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, - String language, String envAlias, String source, String reason, JobDataMap dataMap, String templateInfo) { - TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb(); - newInstance.setContextName(contextName); - newInstance.setLanguage(language); - newInstance.setChangeType(changeTypeEnum.getCode()); - newInstance.setEnvAlias(envAlias); - newInstance.setStatus(TaskStatusEnum.Running.getCode()); - newInstance.setFinishTime(null); - newInstance.setSource(source); - newInstance.setReason(reason); - newInstance.setTemplate(templateInfo); - newInstance.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoService.save(newInstance); - return newInstance; + /** + * 创建任务单(注:同一应用同一变更类型无法并发多实例) + * + * @param contextName 上下文名称,这里特指应用名 + * @param changeTypeEnum 变更类型 + * @param language 开发语言、资源版本 + * @param envAlias 环境别名 + * @param source 来源 + * @param reason 变更原因 + * @param dataMap 任务参数 + */ + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, + String envAlias, String source, String reason, JobDataMap dataMap) { + if (StrUtil.isBlank(contextName)) { + throw new BadRequestException("参数contextName必填"); } + if (changeTypeEnum == null) { + throw new BadRequestException("参数changeTypeEnum必填"); + } + if (StrUtil.isBlank(language)) { + throw new BadRequestException("参数language必填"); + } + if (StrUtil.isBlank(envAlias)) { + throw new BadRequestException("参数envAlias必填"); + } + if (StrUtil.isBlank(source)) { + throw new BadRequestException("参数source必填"); + } + if (dataMap == null) { + dataMap = new JobDataMap(); + } + // ========================== 获取任务编排模板 ========================== + TaskTemplateInfoVo taskInstanceInfoVo = + taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeTypeEnum.getCode()); + if (taskInstanceInfoVo == null) { + throw new BadRequestException("没有查询到任务编排模板"); + } + String templateInfo = taskInstanceInfoVo.getTemplateInfo(); + List taskTemplateNodeVos; + try { + taskTemplateNodeVos = JSON.parseArray(templateInfo, TaskTemplateNodeVo.class); + } catch (Exception e) { + log.error("任务编排模板解析失败", e); + throw new BadRequestException("任务编排模板解析失败"); + } + if (taskTemplateNodeVos == null || taskTemplateNodeVos.isEmpty()) { + throw new BadRequestException("没有查询到任务编排明细"); + } + // ========================== 创建任务 ========================== + TaskManage taskManage = KitSpringBeanHolder.getBean(TaskManage.class); + TaskInstanceInfoTb newInstance = + taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, + templateInfo); + dataMap.put(TaskJobKeys.ID, newInstance.getId()); + // 应用名、资源类型 + dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName); + // 开发语言、资源版本 + dataMap.put(TaskJobKeys.LANGUAGE, language); + dataMap.put(TaskJobKeys.ENV_ALIAS, envAlias); + // 变更类型 + dataMap.put(TaskJobKeys.CHANGE_TYPE, changeTypeEnum.getCode()); + buildAndSchedule(changeTypeEnum.getCode(), contextName, dataMap); + return newInstance; + } - private void buildAndSchedule(String changeTypeEnum, String contextName, JobDataMap dataMap) { - // ========================== 执行任务 ========================== - JobKey jobKey = JobKey.jobKey(changeTypeEnum, contextName); - TriggerKey triggerKey = TriggerKey.triggerKey(changeTypeEnum, contextName); - JobDetail jobDetail = JobBuilder.newJob(TaskJobBean.class).withIdentity(jobKey).usingJobData(dataMap).build(); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().build(); - try { - scheduler.scheduleJob(jobDetail, trigger); - } catch (ObjectAlreadyExistsException e) { - log.error("任务jobKey={},triggerKey={}任务已存在,跳过加载", jobKey.getName(), triggerKey.getName(), e); - throw new BadRequestException("任务已存在,跳过加载"); - } catch (SchedulerException e) { - log.error("任务jobKey={},triggerKey={}执行失败", jobKey.getName(), triggerKey.getName(), e); - throw new BadRequestException(e); - } - } + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, + String language, String envAlias, String source, String reason, JobDataMap dataMap, String templateInfo) { + TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb(); + newInstance.setContextName(contextName); + newInstance.setLanguage(language); + newInstance.setChangeType(changeTypeEnum.getCode()); + newInstance.setEnvAlias(envAlias); + newInstance.setStatus(TaskStatusEnum.Running.getCode()); + newInstance.setFinishTime(null); + newInstance.setSource(source); + newInstance.setReason(reason); + newInstance.setTemplate(templateInfo); + newInstance.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoService.save(newInstance); + return newInstance; + } - @Transactional(rollbackFor = Exception.class) - public void stopJob(Long instanceId) { - TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getRunningById(instanceId); - String changeType = taskInstanceInfoTb.getChangeType(); - String contextName = taskInstanceInfoTb.getContextName(); - taskInstanceInfoTb.setStatus(TaskStatusEnum.Fail.getCode()); - taskInstanceInfoTb.setErrorMessage("任务被中断"); - taskInstanceInfoTb.setFinishTime(new Date()); - taskInstanceInfoService.updateById(taskInstanceInfoTb); - try { - JobKey jobKey = JobKey.jobKey(changeType, contextName); - TriggerKey triggerKey = TriggerKey.triggerKey(changeType, contextName); - // 停止触发器 - scheduler.pauseTrigger(triggerKey); - // 移除触发器 - scheduler.unscheduleJob(triggerKey); - // 删除任务 - scheduler.deleteJob(jobKey); - // scheduler.interrupt(jobKey); - } catch (SchedulerException e) { - log.error("任务停止失败", e); - throw new RuntimeException(e); - } + private void buildAndSchedule(String changeTypeEnum, String contextName, JobDataMap dataMap) { + // ========================== 执行任务 ========================== + JobKey jobKey = JobKey.jobKey(changeTypeEnum, contextName); + TriggerKey triggerKey = TriggerKey.triggerKey(changeTypeEnum, contextName); + JobDetail jobDetail = JobBuilder.newJob(TaskJobBean.class).withIdentity(jobKey).usingJobData(dataMap).build(); + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startNow().build(); + try { + scheduler.scheduleJob(jobDetail, trigger); + } catch (ObjectAlreadyExistsException e) { + log.error("任务jobKey={},triggerKey={}任务已存在,跳过加载", jobKey.getName(), triggerKey.getName(), e); + throw new BadRequestException("任务已存在,跳过加载"); + } catch (SchedulerException e) { + log.error("任务jobKey={},triggerKey={}执行失败", jobKey.getName(), triggerKey.getName(), e); + throw new BadRequestException(e); } + } - @Transactional(rollbackFor = Exception.class) - public TaskInstanceInfoTb retryJob(Long id, String retryNodeCode) { - // ========================== 查询任务 ========================== - TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getById(id); - if (taskInstanceInfoTb == null) { - throw new BadRequestException("任务不存在"); - } - // ========================== 失败的任务才能重试 ========================== - if (TaskStatusEnum.Success.getCode().equals(taskInstanceInfoTb.getStatus())) { - throw new BadRequestException("任务已执行完毕,无法重试"); - } - // 参数重放 - JobDataMap dataMap = JSON.parseObject(taskInstanceInfoTb.getJobData(), JobDataMap.class); - if (dataMap == null) { - dataMap = new JobDataMap(); - } - taskInstanceInfoTb.setStatus(TaskStatusEnum.Pending.getCode()); - taskInstanceInfoTb.setFinishTime(null); - taskInstanceInfoService.updateById(taskInstanceInfoTb); - // ========================== 执行任务 ========================== - dataMap.put(TaskJobKeys.RETRY_NODE_CODE, retryNodeCode); - String changeType = taskInstanceInfoTb.getChangeType(); - String contextName = taskInstanceInfoTb.getContextName(); - buildAndSchedule(changeType, contextName, dataMap); - return taskInstanceInfoTb; + @Transactional(rollbackFor = Exception.class) + public void stopJob(Long instanceId) { + TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getRunningById(instanceId); + String changeType = taskInstanceInfoTb.getChangeType(); + String contextName = taskInstanceInfoTb.getContextName(); + taskInstanceInfoTb.setStatus(TaskStatusEnum.Fail.getCode()); + taskInstanceInfoTb.setErrorMessage("任务被中断"); + taskInstanceInfoTb.setFinishTime(new Date()); + taskInstanceInfoService.updateById(taskInstanceInfoTb); + try { + JobKey jobKey = JobKey.jobKey(changeType, contextName); + TriggerKey triggerKey = TriggerKey.triggerKey(changeType, contextName); + // 停止触发器 + scheduler.pauseTrigger(triggerKey); + // 移除触发器 + scheduler.unscheduleJob(triggerKey); + // 删除任务 + scheduler.deleteJob(jobKey); + // scheduler.interrupt(jobKey); + } catch (SchedulerException e) { + log.error("任务停止失败", e); + throw new RuntimeException(e); } + } - public TaskInstanceInfoVo getLastInfo(String contextName, String language, String envAlias, String changeType) { - TaskInstanceInfoVo record = new TaskInstanceInfoVo(); - TaskInstanceInfoTb historyInstance = - taskInstanceInfoService.getLastHistoryInstance(contextName, language, envAlias, changeType); - if (historyInstance == null) { - // 仅返回模板 - TaskTemplateInfoVo templateInfo = - taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeType); - if (templateInfo == null) { - throw new BadRequestException("没有查询到任务编排模板"); - } - record.setTemplate(templateInfo.getTemplateInfo()); - return record; - } - record = BeanUtil.copyProperties(historyInstance, TaskInstanceInfoVo.class); - record.setHistory(buildNodeList(record)); - TaskInstanceInfoTb runningInstance = - taskInstanceInfoService.getLastRunningInstance(contextName, language, envAlias, changeType); - if (runningInstance != null) { - TaskInstanceInfoVo taskInstanceInfoVo = BeanUtil.copyProperties(runningInstance, TaskInstanceInfoVo.class); - record.setCurrent(buildNodeList(taskInstanceInfoVo)); - } - return record; + @Transactional(rollbackFor = Exception.class) + public TaskInstanceInfoTb retryJob(Long id, String retryNodeCode) { + // ========================== 查询任务 ========================== + TaskInstanceInfoTb taskInstanceInfoTb = taskInstanceInfoService.getById(id); + if (taskInstanceInfoTb == null) { + throw new BadRequestException("任务不存在"); } + // ========================== 失败的任务才能重试 ========================== + if (TaskStatusEnum.Success.getCode().equals(taskInstanceInfoTb.getStatus())) { + throw new BadRequestException("任务已执行完毕,无法重试"); + } + // 参数重放 + JobDataMap dataMap = JSON.parseObject(taskInstanceInfoTb.getJobData(), JobDataMap.class); + if (dataMap == null) { + dataMap = new JobDataMap(); + } + taskInstanceInfoTb.setStatus(TaskStatusEnum.Pending.getCode()); + taskInstanceInfoTb.setFinishTime(null); + taskInstanceInfoService.updateById(taskInstanceInfoTb); + // ========================== 执行任务 ========================== + dataMap.put(TaskJobKeys.RETRY_NODE_CODE, retryNodeCode); + String changeType = taskInstanceInfoTb.getChangeType(); + String contextName = taskInstanceInfoTb.getContextName(); + buildAndSchedule(changeType, contextName, dataMap); + return taskInstanceInfoTb; + } - private List buildNodeList(TaskInstanceInfoVo record) { - List records = new ArrayList<>(); - // 节点明细 - List taskInstanceDetails = taskInstanceDetailService.queryByInstanceId(record.getId()); - for (TaskInstanceDetailTb taskInstanceDetail : taskInstanceDetails) { - TaskInstanceNodeVo instanceNodeVo = new TaskInstanceNodeVo(); - instanceNodeVo.setCode(taskInstanceDetail.getBizCode()); - instanceNodeVo.setName(taskInstanceDetail.getBizName()); - instanceNodeVo.setStartTime(taskInstanceDetail.getStartTime()); - instanceNodeVo.setFinishTime(taskInstanceDetail.getFinishTime()); - if (taskInstanceDetail.getFinishTime() == null) { - instanceNodeVo.setDurationDesc( - KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), new Date())); - } else { - instanceNodeVo.setDurationDesc(KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), - taskInstanceDetail.getFinishTime())); - } - instanceNodeVo.setRunningDesc(taskInstanceDetail.getExecuteInfo()); - instanceNodeVo.setStatus(taskInstanceDetail.getExecuteStatus()); - instanceNodeVo.setStatusDesc(TaskStatusEnum.getDesc(taskInstanceDetail.getExecuteStatus())); - records.add(instanceNodeVo); - } - return records; + public TaskInstanceInfoVo getLastInfo(String contextName, String language, String envAlias, String changeType) { + TaskInstanceInfoVo record = new TaskInstanceInfoVo(); + TaskInstanceInfoTb historyInstance = + taskInstanceInfoService.getLastHistoryInstance(contextName, language, envAlias, changeType); + if (historyInstance == null) { + // 仅返回模板 + TaskTemplateInfoVo templateInfo = + taskTemplateInfoService.getTemplateInfoByECL(envAlias, contextName, language, changeType); + if (templateInfo == null) { + throw new BadRequestException("没有查询到任务编排模板"); + } + record.setTemplate(templateInfo.getTemplateInfo()); + return record; } + record = BeanUtil.copyProperties(historyInstance, TaskInstanceInfoVo.class); + record.setHistory(buildNodeList(record)); + TaskInstanceInfoTb runningInstance = + taskInstanceInfoService.getLastRunningInstance(contextName, language, envAlias, changeType); + if (runningInstance != null) { + TaskInstanceInfoVo taskInstanceInfoVo = BeanUtil.copyProperties(runningInstance, TaskInstanceInfoVo.class); + record.setCurrent(buildNodeList(taskInstanceInfoVo)); + } + return record; + } + + private List buildNodeList(TaskInstanceInfoVo record) { + List records = new ArrayList<>(); + // 节点明细 + List taskInstanceDetails = taskInstanceDetailService.queryByInstanceId(record.getId()); + for (TaskInstanceDetailTb taskInstanceDetail : taskInstanceDetails) { + TaskInstanceNodeVo instanceNodeVo = new TaskInstanceNodeVo(); + instanceNodeVo.setCode(taskInstanceDetail.getBizCode()); + instanceNodeVo.setName(taskInstanceDetail.getBizName()); + instanceNodeVo.setStartTime(taskInstanceDetail.getStartTime()); + instanceNodeVo.setFinishTime(taskInstanceDetail.getFinishTime()); + if (taskInstanceDetail.getFinishTime() == null) { + instanceNodeVo.setDurationDesc( + KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), new Date())); + } else { + instanceNodeVo.setDurationDesc(KitDateUtil.formatSecondsDuration(taskInstanceDetail.getStartTime(), + taskInstanceDetail.getFinishTime())); + } + instanceNodeVo.setRunningDesc(taskInstanceDetail.getExecuteInfo()); + instanceNodeVo.setStatus(taskInstanceDetail.getExecuteStatus()); + instanceNodeVo.setStatusDesc(TaskStatusEnum.getDesc(taskInstanceDetail.getExecuteStatus())); + records.add(instanceNodeVo); + } + return records; + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskStepExecutor.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskStepExecutor.java index f362f4f7..a56ec20f 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskStepExecutor.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/TaskStepExecutor.java @@ -20,11 +20,12 @@ import cn.odboy.task.dal.model.TaskTemplateNodeVo; import org.quartz.JobDataMap; public interface TaskStepExecutor { - /** - * @param instanceDetailId 任务实例明细id - * @param jobDataMap 执行参数 - * @param taskTemplateNode 任务节点信息 - */ - void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException; + + /** + * @param instanceDetailId 任务实例明细id + * @param jobDataMap 执行参数 + * @param taskTemplateNode 任务节点信息 + */ + void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java index 57e8a66c..be202e44 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeBuildJava.java @@ -26,9 +26,10 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeBuildJava implements TaskStepExecutor { - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(2000); - } + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(2000); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java index 8194be2f..37e11fb0 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeDeployJava.java @@ -26,9 +26,10 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeDeployJava implements TaskStepExecutor { - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(5000); - } + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(5000); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java index 2850b098..4a2adfcf 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeInit.java @@ -27,13 +27,15 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeInit implements TaskStepExecutor { - @Autowired private TaskInstanceStepDetailService stepDetailService; - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - stepDetailService.success(instanceDetailId, "开始初始化"); - stepDetailService.success(instanceDetailId, "初始化完毕后,放入了一些参数"); - jobDataMap.put("ExcuseMe", "Hello World!"); - } + @Autowired + private TaskInstanceStepDetailService stepDetailService; + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + stepDetailService.success(instanceDetailId, "开始初始化"); + stepDetailService.success(instanceDetailId, "初始化完毕后,放入了一些参数"); + jobDataMap.put("ExcuseMe", "Hello World!"); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java index 565de0b8..442aab2c 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/core/impl/TaskStepNodeMergeBranch.java @@ -28,13 +28,15 @@ import org.springframework.stereotype.Component; @Slf4j @Component public class TaskStepNodeMergeBranch implements TaskStepExecutor { - @Autowired private TaskInstanceStepDetailService stepDetailService; - @Override - public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) - throws BadRequestException { - ThreadUtil.sleep(3000); - stepDetailService.fail(instanceDetailId, "执行失败测试"); - // stepDetailService.success(instanceDetailId, "执行成功"); - } + @Autowired + private TaskInstanceStepDetailService stepDetailService; + + @Override + public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) + throws BadRequestException { + ThreadUtil.sleep(3000); + stepDetailService.fail(instanceDetailId, "执行失败测试"); + // stepDetailService.success(instanceDetailId, "执行成功"); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java index a28f2814..eb040ad3 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceDetailTb.java @@ -45,44 +45,65 @@ import lombok.ToString; @TableName("task_instance_detail") @ApiModel(value = "TaskInstanceDetailTb对象", description = "任务实例明细") public class TaskInstanceDetailTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * 任务实例id - */ - @TableField("instance_id") @ApiModelProperty("任务实例id") private Long instanceId; - /** - * 开始时间 - */ - @ApiModelProperty("开始时间") @TableField("start_time") private Date startTime; - /** - * 结束时间 - */ - @ApiModelProperty("结束时间") @TableField("finish_time") private Date finishTime; - /** - * 业务编码 - */ - @TableField("biz_code") @ApiModelProperty("业务编码") private String bizCode; - /** - * 业务名称(步骤) - */ - @TableField("biz_name") @ApiModelProperty("业务名称(步骤)") private String bizName; - /** - * 执行参数 - */ - @ApiModelProperty("执行参数") @TableField("execute_params") private String executeParams; - /** - * 执行信息 - */ - @ApiModelProperty("执行信息") @TableField("execute_info") private String executeInfo; - /** - * 执行状态(running进行中 success成功 fail失败) - */ - @TableField("execute_status") @ApiModelProperty("执行状态(running进行中 success成功 fail失败)") private String - executeStatus; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * 任务实例id + */ + @TableField("instance_id") + @ApiModelProperty("任务实例id") + private Long instanceId; + /** + * 开始时间 + */ + @ApiModelProperty("开始时间") + @TableField("start_time") + private Date startTime; + /** + * 结束时间 + */ + @ApiModelProperty("结束时间") + @TableField("finish_time") + private Date finishTime; + /** + * 业务编码 + */ + @TableField("biz_code") + @ApiModelProperty("业务编码") + private String bizCode; + /** + * 业务名称(步骤) + */ + @TableField("biz_name") + @ApiModelProperty("业务名称(步骤)") + private String bizName; + /** + * 执行参数 + */ + @ApiModelProperty("执行参数") + @TableField("execute_params") + private String executeParams; + /** + * 执行信息 + */ + @ApiModelProperty("执行信息") + @TableField("execute_info") + private String executeInfo; + /** + * 执行状态(running进行中 success成功 fail失败) + */ + @TableField("execute_status") + @ApiModelProperty("执行状态(running进行中 success成功 fail失败)") + private String + executeStatus; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java index c68f8426..bb2bb838 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceInfoTb.java @@ -46,59 +46,90 @@ import org.springframework.data.annotation.CreatedBy; @TableName("task_instance_info") @ApiModel(value = "TaskInstanceInfoTb对象", description = "任务实例") public class TaskInstanceInfoTb extends KitObject { - @CreatedBy @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建人", hidden = true) private String - createBy; - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - @TableField(fill = FieldFill.INSERT_UPDATE) - @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) private Date updateTime; - /** - * id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题 - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * 名称 - */ - @ApiModelProperty("名称") @TableField("context_name") private String contextName; - /** - * 语言 - */ - @ApiModelProperty("语言") @TableField("`language`") private String language; - /** - * 变更类型 - */ - @ApiModelProperty("变更类型") @TableField("change_type") private String changeType; - /** - * 环境别名 - */ - @TableField("env_alias") @ApiModelProperty("环境别名") private String envAlias; - /** - * 状态(running进行中 success成功 fail失败) - */ - @TableField("`status`") @ApiModelProperty("状态(running进行中 success成功 fail失败)") private String status; - /** - * 完成时间 - */ - @ApiModelProperty("完成时间") @TableField("finish_time") private Date finishTime; - /** - * 来源 - */ - @ApiModelProperty("来源") @TableField("`source`") private String source; - /** - * 变更原因 - */ - @TableField("reason") @ApiModelProperty("变更原因") private String reason; - /** - * 任务模板 - */ - @TableField("template") @ApiModelProperty("template") private String template; - /** - * QuartzJob参数 - */ - @TableField("job_data") @ApiModelProperty("QuartzJob参数") private String jobData; - /** - * 异常信息 - */ - @TableField("error_message") @ApiModelProperty("异常信息") private String errorMessage; + + @CreatedBy + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人", hidden = true) + private String + createBy; + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + @TableField(fill = FieldFill.INSERT_UPDATE) + @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date updateTime; + /** + * id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题 + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * 名称 + */ + @ApiModelProperty("名称") + @TableField("context_name") + private String contextName; + /** + * 语言 + */ + @ApiModelProperty("语言") + @TableField("`language`") + private String language; + /** + * 变更类型 + */ + @ApiModelProperty("变更类型") + @TableField("change_type") + private String changeType; + /** + * 环境别名 + */ + @TableField("env_alias") + @ApiModelProperty("环境别名") + private String envAlias; + /** + * 状态(running进行中 success成功 fail失败) + */ + @TableField("`status`") + @ApiModelProperty("状态(running进行中 success成功 fail失败)") + private String status; + /** + * 完成时间 + */ + @ApiModelProperty("完成时间") + @TableField("finish_time") + private Date finishTime; + /** + * 来源 + */ + @ApiModelProperty("来源") + @TableField("`source`") + private String source; + /** + * 变更原因 + */ + @TableField("reason") + @ApiModelProperty("变更原因") + private String reason; + /** + * 任务模板 + */ + @TableField("template") + @ApiModelProperty("template") + private String template; + /** + * QuartzJob参数 + */ + @TableField("job_data") + @ApiModelProperty("QuartzJob参数") + private String jobData; + /** + * 异常信息 + */ + @TableField("error_message") + @ApiModelProperty("异常信息") + private String errorMessage; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java index abef4c11..04238676 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskInstanceStepDetailTb.java @@ -45,23 +45,34 @@ import lombok.ToString; @TableName("task_instance_step_detail") @ApiModel(value = "TaskInstanceStepDetailTb对象", description = "") public class TaskInstanceStepDetailTb extends KitObject { - @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) - private Date createTime; - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.ASSIGN_ID) - @JsonSerialize(using = ToStringSerializer.class) @JSONField(format = "string") private Long id; - /** - * task_instance_detail表id - */ - @TableField("instance_detail_id") @ApiModelProperty("task_instance_detail表id") private Long instanceDetailId; - /** - * 步骤描述 - */ - @TableField("step_desc") @ApiModelProperty("步骤描述") private String stepDesc; - /** - * 状态(success成功 fail失败) - */ - @TableField("step_status") @ApiModelProperty("状态(success成功 fail失败)") private String stepStatus; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) + private Date createTime; + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + @JSONField(format = "string") + private Long id; + /** + * task_instance_detail表id + */ + @TableField("instance_detail_id") + @ApiModelProperty("task_instance_detail表id") + private Long instanceDetailId; + /** + * 步骤描述 + */ + @TableField("step_desc") + @ApiModelProperty("步骤描述") + private String stepDesc; + /** + * 状态(success成功 fail失败) + */ + @TableField("step_status") + @ApiModelProperty("状态(success成功 fail失败)") + private String stepStatus; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java index 70ded132..b1a3ba56 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/dataobject/TaskTemplateInfoTb.java @@ -40,36 +40,53 @@ import lombok.ToString; @TableName("task_template_info") @ApiModel(value = "TaskTemplateInfoTb对象", description = "任务模板") public class TaskTemplateInfoTb extends KitBaseUserTimeTb { - /** - * id - */ - @ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Long id; - /** - * 数据有效性 - */ - @TableField("available") @ApiModelProperty("数据有效性") private Boolean available; - /** - * 变更类型 - */ - @ApiModelProperty("变更类型") @TableField("change_type") private String changeType; - /** - * 流水线名称 - */ - @TableField("`name`") @ApiModelProperty("流水线名称") private String name; - /** - * 流水线描述 - */ - @ApiModelProperty("流水线描述") @TableField("`description`") private String description; - /** - * 流水线模板内容 - */ - @TableField("template") @ApiModelProperty("流水线模板内容") private String template; - /** - * 环境别名 - */ - @TableField("env_alias") @ApiModelProperty("环境别名") private String envAlias; - /** - * 应用为语言,资源为类型 - */ - @TableField("`language`") @ApiModelProperty("应用为语言,资源为类型") private String language; + + /** + * id + */ + @ApiModelProperty("id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 数据有效性 + */ + @TableField("available") + @ApiModelProperty("数据有效性") + private Boolean available; + /** + * 变更类型 + */ + @ApiModelProperty("变更类型") + @TableField("change_type") + private String changeType; + /** + * 流水线名称 + */ + @TableField("`name`") + @ApiModelProperty("流水线名称") + private String name; + /** + * 流水线描述 + */ + @ApiModelProperty("流水线描述") + @TableField("`description`") + private String description; + /** + * 流水线模板内容 + */ + @TableField("template") + @ApiModelProperty("流水线模板内容") + private String template; + /** + * 环境别名 + */ + @TableField("env_alias") + @ApiModelProperty("环境别名") + private String envAlias; + /** + * 应用为语言,资源为类型 + */ + @TableField("`language`") + @ApiModelProperty("应用为语言,资源为类型") + private String language; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java index 0072a506..5b1fcff1 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceInfoVo.java @@ -14,12 +14,13 @@ import lombok.Setter; @Getter @Setter public class TaskInstanceInfoVo extends TaskInstanceInfoTb { - /** - * 进行中 - */ - private List current; - /** - * 历史已完成或异常 - */ - private List history; + + /** + * 进行中 + */ + private List current; + /** + * 历史已完成或异常 + */ + private List history; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java index ea1ca05a..a9dea70b 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskInstanceNodeVo.java @@ -28,36 +28,37 @@ import lombok.Setter; @Getter @Setter public class TaskInstanceNodeVo extends KitObject { - /** - * 业务编码 - */ - protected String code; - /** - * 业务名称 - */ - protected String name; - /** - * 开始时间 - */ - protected Date startTime; - /** - * 完成时间 - */ - protected Date finishTime; - /** - * 耗时多久 - */ - protected String durationDesc; - /** - * 进行中描述 - */ - protected String runningDesc; - /** - * 节点状态编码 - */ - protected String status; - /** - * 节点状态描述 - */ - protected String statusDesc; + + /** + * 业务编码 + */ + protected String code; + /** + * 业务名称 + */ + protected String name; + /** + * 开始时间 + */ + protected Date startTime; + /** + * 完成时间 + */ + protected Date finishTime; + /** + * 耗时多久 + */ + protected String durationDesc; + /** + * 进行中描述 + */ + protected String runningDesc; + /** + * 节点状态编码 + */ + protected String status; + /** + * 节点状态描述 + */ + protected String statusDesc; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java index 3a7d0930..7028ebe2 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateInfoVo.java @@ -22,11 +22,12 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateInfoVo extends KitObject { - private String changeType; - private String name; - private String description; - private String envAlias; - private String language; - private String contextName; - private String templateInfo; + + private String changeType; + private String name; + private String description; + private String envAlias; + private String language; + private String contextName; + private String templateInfo; } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java index a63ebb2a..3140f825 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeOperateButtonVo.java @@ -29,20 +29,21 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateNodeOperateButtonVo extends KitObject { - /** - * 按钮类型(service:调用某个服务并传递参数 link:带参跳转) - */ - private String type; - /** - * 按钮标题 - */ - private String title; - /** - * 按钮传递的参数 - */ - private String code; - /** - * 默认附加参数 - */ - private Map parameters = new HashMap<>(); + + /** + * 按钮类型(service:调用某个服务并传递参数 link:带参跳转) + */ + private String type; + /** + * 按钮标题 + */ + private String title; + /** + * 按钮传递的参数 + */ + private String code; + /** + * 默认附加参数 + */ + private Map parameters = new HashMap<>(); } \ No newline at end of file diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java index ffd8690b..c2189617 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/model/TaskTemplateNodeVo.java @@ -31,36 +31,37 @@ import lombok.Setter; @Getter @Setter public class TaskTemplateNodeVo extends KitObject { - /** - * 业务编码 - */ - protected String code; - /** - * 业务类型(service:系统内置服务 rpc:远程调用) - */ - protected String type; - /** - * 业务名称 - */ - protected String name; - /** - * 是否可点击 - */ - protected Boolean click = false; - /** - * 是否可重试 - */ - protected Boolean retry = false; - /** - * 是否可点击:点击展示详情,详情内容类型 - */ - protected String detailType = ""; - /** - * 默认参数
execute: 执行调用 describe: 明细调用 - */ - protected Map parameters = new HashMap<>(); - /** - * 流水线节点控制按钮 - */ - protected List buttons = new ArrayList<>(); + + /** + * 业务编码 + */ + protected String code; + /** + * 业务类型(service:系统内置服务 rpc:远程调用) + */ + protected String type; + /** + * 业务名称 + */ + protected String name; + /** + * 是否可点击 + */ + protected Boolean click = false; + /** + * 是否可重试 + */ + protected Boolean retry = false; + /** + * 是否可点击:点击展示详情,详情内容类型 + */ + protected String detailType = ""; + /** + * 默认参数
execute: 执行调用 describe: 明细调用 + */ + protected Map parameters = new HashMap<>(); + /** + * 流水线节点控制按钮 + */ + protected List buttons = new ArrayList<>(); } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java index 9536b3dd..c79849e5 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceDetailMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-26 */ @Mapper -public interface TaskInstanceDetailMapper extends BaseMapper {} +public interface TaskInstanceDetailMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java index 7fb0336b..682b0b8c 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceInfoMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-26 */ @Mapper -public interface TaskInstanceInfoMapper extends BaseMapper {} +public interface TaskInstanceInfoMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java index 29cdf5ae..67451484 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskInstanceStepDetailMapper.java @@ -28,4 +28,6 @@ import org.apache.ibatis.annotations.Mapper; * @since 2025-09-28 */ @Mapper -public interface TaskInstanceStepDetailMapper extends BaseMapper {} +public interface TaskInstanceStepDetailMapper extends BaseMapper { + +} diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java index 50419cfa..3a646577 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/dal/mysql/TaskTemplateInfoMapper.java @@ -31,14 +31,15 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface TaskTemplateInfoMapper extends BaseMapper { - /** - * @param envAlias 环境别称 - * @param contextName 应用名称、资源类型 - * @param language 语言、版本 - * @param changeType 变更类型 - * @return / - */ - TaskTemplateInfoVo selectTemplateInfoByECL(@Param("envAlias") String envAlias, - @Param("contextName") String contextName, @Param("language") String language, - @Param("changeType") String changeType); + + /** + * @param envAlias 环境别称 + * @param contextName 应用名称、资源类型 + * @param language 语言、版本 + * @param changeType 变更类型 + * @return / + */ + TaskTemplateInfoVo selectTemplateInfoByECL(@Param("envAlias") String envAlias, + @Param("contextName") String contextName, @Param("language") String language, + @Param("changeType") String changeType); } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java index b4b7f83e..36c6fe94 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceDetailService.java @@ -38,71 +38,81 @@ import org.springframework.stereotype.Service; */ @Service public class TaskInstanceDetailService { - @Autowired private TaskInstanceDetailMapper taskInstanceDetailMapper; - public TaskInstanceDetailTb getOneByInstanceIdAndCode(Long id, String code) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, id); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - return taskInstanceDetailMapper.selectOne(wrapper); - } + @Autowired + private TaskInstanceDetailMapper taskInstanceDetailMapper; - public void fastFailWithInfo(Long instanceId, String code, String executeInfo) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, executeInfo); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Fail.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public TaskInstanceDetailTb getOneByInstanceIdAndCode(Long id, String code) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, id); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + return taskInstanceDetailMapper.selectOne(wrapper); + } - public void fastSuccess(Long instanceId, String code) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Success.getName()); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastFailWithInfo(Long instanceId, String code, String executeInfo) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, executeInfo); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Fail.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public void fastSuccessWithInfo(Long instanceId, String code, String executeInfo) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, - executeInfo == null ? TaskStatusEnum.Success.getName() : executeInfo); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastSuccess(Long instanceId, String code) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Success.getName()); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public void fastStart(Long instanceId, String code, JobDataMap dataMap) { - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.eq(TaskInstanceDetailTb::getBizCode, code); - wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); - wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Running.getName()); - wrapper.set(TaskInstanceDetailTb::getExecuteParams, JSON.toJSONString(dataMap)); - wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Running.getCode()); - taskInstanceDetailMapper.update(null, wrapper); - } + public void fastSuccessWithInfo(Long instanceId, String code, String executeInfo) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, + executeInfo == null ? TaskStatusEnum.Success.getName() : executeInfo); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Success.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public List queryByInstanceIdAndBizCodeList(Long instanceId, List bizCodeList) { - if (CollUtil.isEmpty(bizCodeList)) { - return CollUtil.newArrayList(); - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.in(TaskInstanceDetailTb::getBizCode, bizCodeList); - return taskInstanceDetailMapper.selectList(wrapper); - } + public void fastStart(Long instanceId, String code, JobDataMap dataMap) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.eq(TaskInstanceDetailTb::getBizCode, code); + wrapper.set(TaskInstanceDetailTb::getFinishTime, new Date()); + wrapper.set(TaskInstanceDetailTb::getExecuteInfo, TaskStatusEnum.Running.getName()); + wrapper.set(TaskInstanceDetailTb::getExecuteParams, JSON.toJSONString(dataMap)); + wrapper.set(TaskInstanceDetailTb::getExecuteStatus, TaskStatusEnum.Running.getCode()); + taskInstanceDetailMapper.update(null, wrapper); + } - public List queryByInstanceId(Long instanceId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); - wrapper.orderByAsc(TaskInstanceDetailTb::getId); - return taskInstanceDetailMapper.selectList(wrapper); + public List queryByInstanceIdAndBizCodeList(Long instanceId, List bizCodeList) { + if (CollUtil.isEmpty(bizCodeList)) { + return CollUtil.newArrayList(); } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.in(TaskInstanceDetailTb::getBizCode, bizCodeList); + return taskInstanceDetailMapper.selectList(wrapper); + } + + public List queryByInstanceId(Long instanceId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceDetailTb::getInstanceId, instanceId); + wrapper.orderByAsc(TaskInstanceDetailTb::getId); + return taskInstanceDetailMapper.selectList(wrapper); + } + + public void saveBatch(List taskInstanceDetails) { + taskInstanceDetailMapper.insert(taskInstanceDetails); + } + + public void removeByIds(List taskInstanceDetailIds) { + taskInstanceDetailMapper.deleteByIds(taskInstanceDetailIds); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java index 6299d357..103fb74a 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceInfoService.java @@ -36,79 +36,81 @@ import org.springframework.transaction.annotation.Transactional; */ @Service public class TaskInstanceInfoService { - @Autowired private TaskInstanceInfoMapper taskInstanceInfoMapper; - public TaskInstanceInfoTb getRunningById(Long id) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - return taskInstanceInfoMapper.selectOne(wrapper); - } + @Autowired + private TaskInstanceInfoMapper taskInstanceInfoMapper; - @Transactional(rollbackFor = Exception.class) - public void fastFailWithMessage(Long id, String errorMessage) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Fail.getCode()); - updRecord.setErrorMessage(errorMessage); - taskInstanceInfoMapper.updateById(updRecord); - } + public TaskInstanceInfoTb getRunningById(Long id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + return taskInstanceInfoMapper.selectOne(wrapper); + } - @Transactional(rollbackFor = Exception.class) - public void fastFailWithMessageData(Long id, String errorMessage, JobDataMap dataMap) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Fail.getCode()); - updRecord.setErrorMessage(errorMessage); - updRecord.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoMapper.updateById(updRecord); - } + @Transactional(rollbackFor = Exception.class) + public void fastFailWithMessage(Long id, String errorMessage) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Fail.getCode()); + updRecord.setErrorMessage(errorMessage); + taskInstanceInfoMapper.updateById(updRecord); + } - @Transactional(rollbackFor = Exception.class) - public void fastSuccessWithData(Long id, JobDataMap dataMap) { - TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); - updRecord.setId(id); - updRecord.setFinishTime(new Date()); - updRecord.setStatus(TaskStatusEnum.Success.getCode()); - updRecord.setJobData(JSON.toJSONString(dataMap)); - taskInstanceInfoMapper.updateById(updRecord); - } + @Transactional(rollbackFor = Exception.class) + public void fastFailWithMessageData(Long id, String errorMessage, JobDataMap dataMap) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Fail.getCode()); + updRecord.setErrorMessage(errorMessage); + updRecord.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoMapper.updateById(updRecord); + } - public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, - String changeType) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); - wrapper.eq(TaskInstanceInfoTb::getLanguage, language); - wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); - wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); - wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - return taskInstanceInfoMapper.selectOne(wrapper); - } + @Transactional(rollbackFor = Exception.class) + public void fastSuccessWithData(Long id, JobDataMap dataMap) { + TaskInstanceInfoTb updRecord = new TaskInstanceInfoTb(); + updRecord.setId(id); + updRecord.setFinishTime(new Date()); + updRecord.setStatus(TaskStatusEnum.Success.getCode()); + updRecord.setJobData(JSON.toJSONString(dataMap)); + taskInstanceInfoMapper.updateById(updRecord); + } - public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, - String changeType) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); - wrapper.eq(TaskInstanceInfoTb::getLanguage, language); - wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); - wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); - wrapper.orderByDesc(TaskInstanceInfoTb::getId); - wrapper.last("LIMIT 1"); - return taskInstanceInfoMapper.selectOne(wrapper); - } + public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, + String changeType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); + wrapper.eq(TaskInstanceInfoTb::getLanguage, language); + wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); + wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); + wrapper.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + return taskInstanceInfoMapper.selectOne(wrapper); + } - public void save(TaskInstanceInfoTb newInstance) { - taskInstanceInfoMapper.insert(newInstance); - } + public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, + String changeType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TaskInstanceInfoTb::getContextName, contextName); + wrapper.eq(TaskInstanceInfoTb::getLanguage, language); + wrapper.eq(TaskInstanceInfoTb::getEnvAlias, envAlias); + wrapper.eq(TaskInstanceInfoTb::getChangeType, changeType); + wrapper.orderByDesc(TaskInstanceInfoTb::getId); + wrapper.last("LIMIT 1"); + return taskInstanceInfoMapper.selectOne(wrapper); + } - public void updateById(TaskInstanceInfoTb taskInstanceInfoTb) { - taskInstanceInfoMapper.updateById(taskInstanceInfoTb); - } + public void save(TaskInstanceInfoTb newInstance) { + taskInstanceInfoMapper.insert(newInstance); + } - public TaskInstanceInfoTb getById(Long id) { - return taskInstanceInfoMapper.selectById(id); - } + public void updateById(TaskInstanceInfoTb taskInstanceInfoTb) { + taskInstanceInfoMapper.updateById(taskInstanceInfoTb); + } + + public TaskInstanceInfoTb getById(Long id) { + return taskInstanceInfoMapper.selectById(id); + } } \ No newline at end of file diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java index 6eb6f23d..4102c85e 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskInstanceStepDetailService.java @@ -35,48 +35,50 @@ import org.springframework.stereotype.Service; */ @Service public class TaskInstanceStepDetailService { - @Autowired private TaskInstanceStepDetailMapper taskInstanceStepDetailMapper; - /** - * 步骤执行成功 - * - * @param instanceDetailId 任务实例明细id - * @param stepDesc 步骤描述 - */ - public void success(Long instanceDetailId, String stepDesc) { - TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); - stepDetail.setInstanceDetailId(instanceDetailId); - stepDetail.setStepDesc(stepDesc); - stepDetail.setStepStatus(TaskStatusEnum.Success.getCode()); - taskInstanceStepDetailMapper.insert(stepDetail); - } + @Autowired + private TaskInstanceStepDetailMapper taskInstanceStepDetailMapper; - /** - * 步骤执行失败 - * - * @param instanceDetailId 任务实例明细id - * @param stepDesc 步骤描述 - */ - public void fail(Long instanceDetailId, String stepDesc) { - TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); - stepDetail.setInstanceDetailId(instanceDetailId); - stepDetail.setStepDesc(stepDesc); - stepDetail.setStepStatus(TaskStatusEnum.Fail.getCode()); - taskInstanceStepDetailMapper.insert(stepDetail); - throw new BadRequestException(stepDesc); - } + /** + * 步骤执行成功 + * + * @param instanceDetailId 任务实例明细id + * @param stepDesc 步骤描述 + */ + public void success(Long instanceDetailId, String stepDesc) { + TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); + stepDetail.setInstanceDetailId(instanceDetailId); + stepDetail.setStepDesc(stepDesc); + stepDetail.setStepStatus(TaskStatusEnum.Success.getCode()); + taskInstanceStepDetailMapper.insert(stepDetail); + } - /** - * 根据明细ID删除步骤明细 - * - * @param instanceDetailIds 任务实例明细id集合 - */ - public void removeByInstanceDetailIds(List instanceDetailIds) { - if (CollUtil.isEmpty(instanceDetailIds)) { - return; - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds); - taskInstanceStepDetailMapper.delete(wrapper); + /** + * 步骤执行失败 + * + * @param instanceDetailId 任务实例明细id + * @param stepDesc 步骤描述 + */ + public void fail(Long instanceDetailId, String stepDesc) { + TaskInstanceStepDetailTb stepDetail = new TaskInstanceStepDetailTb(); + stepDetail.setInstanceDetailId(instanceDetailId); + stepDetail.setStepDesc(stepDesc); + stepDetail.setStepStatus(TaskStatusEnum.Fail.getCode()); + taskInstanceStepDetailMapper.insert(stepDetail); + throw new BadRequestException(stepDesc); + } + + /** + * 根据明细ID删除步骤明细 + * + * @param instanceDetailIds 任务实例明细id集合 + */ + public void removeByInstanceDetailIds(List instanceDetailIds) { + if (CollUtil.isEmpty(instanceDetailIds)) { + return; } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds); + taskInstanceStepDetailMapper.delete(wrapper); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java index 960b0716..6f0a9195 100644 --- a/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java +++ b/cutejava/cutejava-module-task-v2/src/main/java/cn/odboy/task/service/TaskTemplateInfoService.java @@ -30,10 +30,12 @@ import org.springframework.stereotype.Service; */ @Service public class TaskTemplateInfoService { - @Autowired private TaskTemplateInfoMapper taskTemplateInfoMapper; - public TaskTemplateInfoVo getTemplateInfoByECL(String envAlias, String contextName, String language, - String changeType) { - return taskTemplateInfoMapper.selectTemplateInfoByECL(envAlias, contextName, language, changeType); - } + @Autowired + private TaskTemplateInfoMapper taskTemplateInfoMapper; + + public TaskTemplateInfoVo getTemplateInfoByECL(String envAlias, String contextName, String language, + String changeType) { + return taskTemplateInfoMapper.selectTemplateInfoByECL(envAlias, contextName, language, changeType); + } } diff --git a/cutejava/cutejava-module-task-v2/src/main/resources/mapper/TaskTemplateInfoMapper.xml b/cutejava/cutejava-module-task-v2/src/main/resources/mapper/TaskTemplateInfoMapper.xml index b0f24dbd..f440ada8 100644 --- a/cutejava/cutejava-module-task-v2/src/main/resources/mapper/TaskTemplateInfoMapper.xml +++ b/cutejava/cutejava-module-task-v2/src/main/resources/mapper/TaskTemplateInfoMapper.xml @@ -1,19 +1,19 @@ - + diff --git a/cutejava/cutejava-starter/pom.xml b/cutejava/cutejava-starter/pom.xml index da67bf5e..02821544 100644 --- a/cutejava/cutejava-starter/pom.xml +++ b/cutejava/cutejava-starter/pom.xml @@ -1,38 +1,38 @@ - - cutejava - cn.odboy - 1.4.1 - - 4.0.0 - cutejava-starter - 启动模块 - - - cn.odboy - cutejava-module-task-v1 - 1.4.1 - - - - - - cutejava - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + cutejava + cn.odboy + 1.4.1 + + 4.0.0 + cutejava-starter + 启动模块 + + + cn.odboy + cutejava-module-task-v1 + 1.4.1 + + + + + + cutejava + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + \ No newline at end of file diff --git a/cutejava/cutejava-starter/src/main/java/cn/odboy/AppRun.java b/cutejava/cutejava-starter/src/main/java/cn/odboy/AppRun.java index 8c0b76d4..04b35d94 100644 --- a/cutejava/cutejava-starter/src/main/java/cn/odboy/AppRun.java +++ b/cutejava/cutejava-starter/src/main/java/cn/odboy/AppRun.java @@ -26,8 +26,9 @@ import org.springframework.cache.annotation.EnableCaching; @EnableCaching @SpringBootApplication public class AppRun extends BootApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication springApplication = new SpringApplication(AppRun.class); - inited(springApplication.run(args)); - } + + public static void main(String[] args) throws UnknownHostException { + SpringApplication springApplication = new SpringApplication(AppRun.class); + inited(springApplication.run(args)); + } } diff --git a/cutejava/cutejava-starter/src/main/java/cn/odboy/GenCode.java b/cutejava/cutejava-starter/src/main/java/cn/odboy/GenCode.java index ea8064de..9f44c44f 100644 --- a/cutejava/cutejava-starter/src/main/java/cn/odboy/GenCode.java +++ b/cutejava/cutejava-starter/src/main/java/cn/odboy/GenCode.java @@ -22,24 +22,25 @@ import java.util.List; * 代码生成入口 */ public class GenCode { - private static final String ADDR = "192.168.100.128"; - private static final Integer PORT = 23306; - private static final String DATABASE_NAME = "cutejava"; - private static final String DATABASE_USER = "root"; - private static final String DATABASE_PWD = "kd123456"; - private static final String URL = String.format("jdbc:mysql://%s:%s/%s", ADDR, PORT, DATABASE_NAME); - public static void main(String[] args) { - KitMpCmdGenUtil generator = new KitMpCmdGenUtil(); - generator.setDatabaseUrl(URL); - generator.setDriverClassName("com.mysql.cj.jdbc.Driver"); - generator.setDatabaseUsername(DATABASE_USER); - generator.setDatabasePassword(DATABASE_PWD); - genTaskCode(generator); - } + private static final String ADDR = "192.168.100.128"; + private static final Integer PORT = 23306; + private static final String DATABASE_NAME = "cutejava"; + private static final String DATABASE_USER = "root"; + private static final String DATABASE_PWD = "kd123456"; + private static final String URL = String.format("jdbc:mysql://%s:%s/%s", ADDR, PORT, DATABASE_NAME); - private static void genTaskCode(KitMpCmdGenUtil generator) { - generator.gen("task", "", - List.of("task_instance_info", "task_instance_detail", "task_template_info", "task_instance_step_detail")); - } + public static void main(String[] args) { + KitMpCmdGenUtil generator = new KitMpCmdGenUtil(); + generator.setDatabaseUrl(URL); + generator.setDriverClassName("com.mysql.cj.jdbc.Driver"); + generator.setDatabaseUsername(DATABASE_USER); + generator.setDatabasePassword(DATABASE_PWD); + genTaskCode(generator); + } + + private static void genTaskCode(KitMpCmdGenUtil generator) { + generator.gen("task", "", + List.of("task_instance_info", "task_instance_detail", "task_template_info", "task_instance_step_detail")); + } } diff --git a/cutejava/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java b/cutejava/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java index 5da45267..b9b36166 100644 --- a/cutejava/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java +++ b/cutejava/cutejava-starter/src/main/java/cn/odboy/HealthCheckPointer.java @@ -16,28 +16,30 @@ package cn.odboy; import cn.odboy.framework.monitor.service.KitHealthCheckPointService; -import cn.odboy.system.service.SystemDictService; +import cn.odboy.system.dal.mysql.SystemDictMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; @Component public class HealthCheckPointer implements KitHealthCheckPointService { - @Autowired private SystemDictService systemDictService; - /** - * 系统准备就绪 - */ - @Override - public ResponseEntity doReadiness() { - return ResponseEntity.ok(null); - } + @Autowired + private SystemDictMapper systemDictMapper; - /** - * 系统是否正常 - */ - @Override - public ResponseEntity doLiveness() { - return ResponseEntity.ok(systemDictService.getById(1)); - } + /** + * 系统准备就绪 + */ + @Override + public ResponseEntity doReadiness() { + return ResponseEntity.ok(null); + } + + /** + * 系统是否正常 + */ + @Override + public ResponseEntity doLiveness() { + return ResponseEntity.ok(systemDictMapper.selectById(1)); + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java index 1c775267..86fb5cae 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/MyBatisMapperTests.java @@ -27,20 +27,22 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class MyBatisMapperTests { - @Autowired private SystemUserMapper systemUserMapper; - @Test - public void testMapper1() { - // SELECT * FROM system_user WHERE (create_time > '2025-08-18T14:48:18.400+0800'); - systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, new Date())); - // SELECT * FROM system_user WHERE (create_time > '2025-08-18T14:50:16.786+0800'); - systemUserMapper.selectList( - new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateTime.now())); - // SELECT * FROM system_user WHERE (create_time > '2025-08-18 14:53:46'); - systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, - DateUtil.formatDateTime(new Date()))); - // SELECT * FROM system_user WHERE (create_time > '2025-08-18'); - systemUserMapper.selectList( - new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateUtil.formatDate(new Date()))); - } + @Autowired + private SystemUserMapper systemUserMapper; + + @Test + public void testMapper1() { + // SELECT * FROM system_user WHERE (create_time > '2025-08-18T14:48:18.400+0800'); + systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, new Date())); + // SELECT * FROM system_user WHERE (create_time > '2025-08-18T14:50:16.786+0800'); + systemUserMapper.selectList( + new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateTime.now())); + // SELECT * FROM system_user WHERE (create_time > '2025-08-18 14:53:46'); + systemUserMapper.selectList(new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, + DateUtil.formatDateTime(new Date()))); + // SELECT * FROM system_user WHERE (create_time > '2025-08-18'); + systemUserMapper.selectList( + new LambdaQueryWrapper().gt(SystemUserTb::getCreateTime, DateUtil.formatDate(new Date()))); + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java index 132891f6..a5302327 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/SystemApplicationTests.java @@ -19,7 +19,7 @@ import cn.hutool.core.collection.CollUtil; 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.SystemUserTb; +import cn.odboy.system.dal.model.SystemUserVo; import cn.odboy.system.service.SystemUserService; import java.util.Set; import org.junit.jupiter.api.Test; @@ -29,34 +29,37 @@ import org.springframework.security.crypto.password.PasswordEncoder; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class SystemApplicationTests { - @Autowired private PasswordEncoder passwordEncoder; - @Autowired private SystemUserService systemUserService; - public static void main(String[] args) { - } + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private SystemUserService systemUserService; - @Test - public void contextLoads() { - SystemDeptTb systemDept = new SystemDeptTb(); - systemDept.setId(2L); - SystemJobTb systemJob = new SystemJobTb(); - systemJob.setId(11L); - Set systemJobs = CollUtil.newHashSet(systemJob); - SystemRoleTb systemRole = new SystemRoleTb(); - systemRole.setId(2L); - Set systemRoles = CollUtil.newHashSet(systemRole); - String pwd = passwordEncoder.encode("123456"); - for (int i = 100; i < 200; i++) { - SystemUserTb systemUser = new SystemUserTb(); - systemUser.setDept(systemDept); - systemUser.setJobs(systemJobs); - systemUser.setRoles(systemRoles); - systemUser.setUsername("odboy" + i); - systemUser.setEmail("1943815" + i + "@qq.com"); - systemUser.setPhone("18797874" + i); - systemUser.setPassword(pwd); - systemUser.setEnabled(true); - systemUserService.saveUser(systemUser); - } + public static void main(String[] args) { + } + + @Test + public void contextLoads() { + SystemDeptTb systemDept = new SystemDeptTb(); + systemDept.setId(2L); + SystemJobTb systemJob = new SystemJobTb(); + systemJob.setId(11L); + Set systemJobs = CollUtil.newHashSet(systemJob); + SystemRoleTb systemRole = new SystemRoleTb(); + systemRole.setId(2L); + Set systemRoles = CollUtil.newHashSet(systemRole); + String pwd = passwordEncoder.encode("123456"); + for (int i = 100; i < 200; i++) { + SystemUserVo systemUser = new SystemUserVo(); + systemUser.setDept(systemDept); + systemUser.setJobs(systemJobs); + systemUser.setRoles(systemRoles); + systemUser.setUsername("odboy" + i); + systemUser.setEmail("1943815" + i + "@qq.com"); + systemUser.setPhone("18797874" + i); + systemUser.setPassword(pwd); + systemUser.setEnabled(true); + systemUserService.saveUser(systemUser); } + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitDesEncryptUtilTest.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitDesEncryptUtilTest.java index 83d05e13..0e560a13 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitDesEncryptUtilTest.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitDesEncryptUtilTest.java @@ -15,40 +15,41 @@ */ package cn.odboy.util; -import lombok.SneakyThrows; -import org.junit.jupiter.api.Test; - import static cn.odboy.util.KitDesEncryptUtil.desDecrypt; import static cn.odboy.util.KitDesEncryptUtil.desEncrypt; import static org.junit.jupiter.api.Assertions.assertEquals; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; + public class KitDesEncryptUtilTest { - @SneakyThrows - public static void main(String[] args) { - System.err.println(desEncrypt("abc12345678")); - } - /** - * 对称加密 - */ - @Test - public void testDesEncrypt() { - try { - assertEquals("7772841DC6099402", desEncrypt("abc12345678")); - } catch (Exception e) { - e.printStackTrace(); - } - } + @SneakyThrows + public static void main(String[] args) { + System.err.println(desEncrypt("abc12345678")); + } - /** - * 对称解密 - */ - @Test - public void testDesDecrypt() { - try { - assertEquals("abc12345678", desDecrypt("7772841DC6099402")); - } catch (Exception e) { - e.printStackTrace(); - } + /** + * 对称加密 + */ + @Test + public void testDesEncrypt() { + try { + assertEquals("7772841DC6099402", desEncrypt("abc12345678")); + } catch (Exception e) { + e.printStackTrace(); } + } + + /** + * 对称解密 + */ + @Test + public void testDesDecrypt() { + try { + assertEquals("abc12345678", desDecrypt("7772841DC6099402")); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java index 73e1afd3..d5f5ec3c 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitFileUtilTest.java @@ -15,39 +15,40 @@ */ package cn.odboy.util; -import org.junit.jupiter.api.Test; -import org.springframework.mock.web.MockMultipartFile; - import static cn.odboy.util.KitFileUtil.getPrefix; import static cn.odboy.util.KitFileUtil.getSize; import static cn.odboy.util.KitFileUtil.getSuffix; import static cn.odboy.util.KitFileUtil.toFile; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.springframework.mock.web.MockMultipartFile; + public class KitFileUtilTest { - @Test - public void testToFile() { - long retval = toFile(new MockMultipartFile("foo", (byte[])null)).getTotalSpace(); - assertEquals(500695072768L, retval); - } - @Test - public void testGetExtensionName() { - assertEquals("foo", getSuffix("foo")); - assertEquals("exe", getSuffix("bar.exe")); - } + @Test + public void testToFile() { + long retval = toFile(new MockMultipartFile("foo", (byte[]) null)).getTotalSpace(); + assertEquals(500695072768L, retval); + } - @Test - public void testGetFileNameNoEx() { - assertEquals("foo", getPrefix("foo")); - assertEquals("bar", getPrefix("bar.txt")); - } + @Test + public void testGetExtensionName() { + assertEquals("foo", getSuffix("foo")); + assertEquals("exe", getSuffix("bar.exe")); + } - @Test - public void testGetSize() { - assertEquals("1000B ", getSize(1000)); - assertEquals("1.00KB ", getSize(1024)); - assertEquals("1.00MB ", getSize(1048576)); - assertEquals("1.00GB ", getSize(1073741824)); - } + @Test + public void testGetFileNameNoEx() { + assertEquals("foo", getPrefix("foo")); + assertEquals("bar", getPrefix("bar.txt")); + } + + @Test + public void testGetSize() { + assertEquals("1000B ", getSize(1000)); + assertEquals("1.00KB ", getSize(1024)); + assertEquals("1.00MB ", getSize(1048576)); + assertEquals("1.00GB ", getSize(1073741824)); + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java index b038246c..936e725c 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/KitStringUtilTest.java @@ -15,43 +15,44 @@ */ package cn.odboy.util; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + import java.text.SimpleDateFormat; import java.util.Date; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - public class KitStringUtilTest { - @Test - public void testToCamelCase() { - assertNull(KitStringUtil.toCamelCase(null)); - } - @Test - public void testToCapitalizeCamelCase() { - assertNull(KitStringUtil.toCapitalizeCamelCase(null)); - assertEquals("HelloWorld", KitStringUtil.toCapitalizeCamelCase("hello_world")); - } + @Test + public void testToCamelCase() { + assertNull(KitStringUtil.toCamelCase(null)); + } - @Test - public void testToUnderScoreCase() { - assertNull(KitStringUtil.toUnderScoreCase(null)); - assertEquals("hello_world", KitStringUtil.toUnderScoreCase("helloWorld")); - assertEquals("\u0000\u0000", KitStringUtil.toUnderScoreCase("\u0000\u0000")); - assertEquals("\u0000_a", KitStringUtil.toUnderScoreCase("\u0000A")); - } + @Test + public void testToCapitalizeCamelCase() { + assertNull(KitStringUtil.toCapitalizeCamelCase(null)); + assertEquals("HelloWorld", KitStringUtil.toCapitalizeCamelCase("hello_world")); + } - @Test - public void testGetWeekDay() { - SimpleDateFormat simpleDateformat = new SimpleDateFormat("E"); - assertEquals(simpleDateformat.format(new Date()), KitStringUtil.getWeekDay()); - } + @Test + public void testToUnderScoreCase() { + assertNull(KitStringUtil.toUnderScoreCase(null)); + assertEquals("hello_world", KitStringUtil.toUnderScoreCase("helloWorld")); + assertEquals("\u0000\u0000", KitStringUtil.toUnderScoreCase("\u0000\u0000")); + assertEquals("\u0000_a", KitStringUtil.toUnderScoreCase("\u0000A")); + } - @Test - public void testGetIP() { - Assertions.assertEquals("127.0.0.1", KitBrowserUtil.getIp(new MockHttpServletRequest())); - } + @Test + public void testGetWeekDay() { + SimpleDateFormat simpleDateformat = new SimpleDateFormat("E"); + assertEquals(simpleDateformat.format(new Date()), KitStringUtil.getWeekDay()); + } + + @Test + public void testGetIP() { + Assertions.assertEquals("127.0.0.1", KitBrowserUtil.getIp(new MockHttpServletRequest())); + } } diff --git a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/WorkTimeTests.java b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/WorkTimeTests.java index aebb7c97..06dafdef 100644 --- a/cutejava/cutejava-starter/src/test/java/cn/odboy/util/WorkTimeTests.java +++ b/cutejava/cutejava-starter/src/test/java/cn/odboy/util/WorkTimeTests.java @@ -19,11 +19,12 @@ package cn.odboy.util; * 钉钉 Teambition 实际工时数计算 */ public class WorkTimeTests { - public static void main(String[] args) { - // 总工作时长(时) - double totalHour = 11; - // 实际工作时长(天),一天8小时工作制 - double actualHour = totalHour / 8.0; - System.err.println("actualHour=" + actualHour + " 天"); - } + + public static void main(String[] args) { + // 总工作时长(时) + double totalHour = 11; + // 实际工作时长(天),一天8小时工作制 + double actualHour = totalHour / 8.0; + System.err.println("actualHour=" + actualHour + " 天"); + } } diff --git a/cutejava/pom.xml b/cutejava/pom.xml index 8ffa6a80..aa21126e 100644 --- a/cutejava/pom.xml +++ b/cutejava/pom.xml @@ -1,427 +1,427 @@ - 4.0.0 - cn.odboy - cutejava - pom - 1.4.1 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + cn.odboy + cutejava + pom + 1.4.1 - - - cutejava-framework - cutejava-module-system - cutejava-module-task-v1 - cutejava-module-task-v2 - cutejava-starter - + + + cutejava-framework + cutejava-module-system + cutejava-module-task-v1 + cutejava-module-task-v2 + cutejava-starter + - CuteJava 后台 + CuteJava 后台 - - org.springframework.boot - spring-boot-starter-parent - 2.7.18 - + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + - - UTF-8 - UTF-8 - UTF-8 - 11 - 1.2.9 - 2.0.60 - 1.2.27 - 2.11.1 - 3.5.14 - 5.8.40 - 0.12.6 - - 5.8.0 - 1.4.7 - + + UTF-8 + UTF-8 + UTF-8 + 11 + 1.2.9 + 2.0.60 + 1.2.27 + 2.11.1 + 3.5.14 + 5.8.40 + 0.12.6 + + 5.8.0 + 1.4.7 + - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-json - - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.boot - spring-boot-starter-undertow - - - io.undertow - undertow-core - - - - - io.undertow - undertow-core - 2.3.18.Final - + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-json + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + + io.undertow + undertow-core + + + + + io.undertow + undertow-core + 2.3.18.Final + - - - org.springframework.boot - spring-boot-starter-test - test - + + + org.springframework.boot + spring-boot-starter-test + test + - - - org.springframework.boot - spring-boot-starter-security - + + + org.springframework.boot + spring-boot-starter-security + - - - org.springframework.boot - spring-boot-starter-validation - + + + org.springframework.boot + spring-boot-starter-validation + - - - org.springframework.boot - spring-boot-starter-cache - + + + org.springframework.boot + spring-boot-starter-cache + - - - org.springframework.boot - spring-boot-starter-data-redis - + + + org.springframework.boot + spring-boot-starter-data-redis + - - - org.springframework.boot - spring-boot-starter-websocket - + + + org.springframework.boot + spring-boot-starter-websocket + - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - com.baomidou - mybatis-plus-jsqlparser - ${mybatis-plus.version} - - - org.springframework.boot - spring-boot-starter-freemarker - - - org.freemarker - freemarker - - - - - org.freemarker - freemarker - 2.3.34 - - - com.baomidou - mybatis-plus-generator - ${mybatis-plus.version} - + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatis-plus.version} + + + org.springframework.boot + spring-boot-starter-freemarker + + + org.freemarker + freemarker + + + + + org.freemarker + freemarker + 2.3.34 + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + - - - - org.apache.commons - commons-pool2 - ${commons-pool2.version} - - - org.apache.commons - commons-lang3 - + + + + org.apache.commons + commons-pool2 + ${commons-pool2.version} + + + org.apache.commons + commons-lang3 + - - - p6spy - p6spy - 3.9.1 - + + + p6spy + p6spy + 3.9.1 + - - - com.github.xiaoymin - knife4j-spring-boot-starter - 3.0.3 - - - - io.swagger - swagger-annotations - - - - - io.swagger - swagger-annotations - 1.5.22 - + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + + io.swagger + swagger-annotations + + + + + io.swagger + swagger-annotations + 1.5.22 + - - - com.mysql - mysql-connector-j - 9.3.0 - runtime - + + + com.mysql + mysql-connector-j + 9.3.0 + runtime + - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + - - - net.dreamlu - mica-ip2region - 2.7.18.9 - + + + net.dreamlu + mica-ip2region + 2.7.18.9 + - - - org.aspectj - aspectjrt - 1.9.7 - - - - org.aspectj - aspectjweaver - 1.9.7 - + + + org.aspectj + aspectjrt + 1.9.7 + + + + org.aspectj + aspectjweaver + 1.9.7 + - - - org.projectlombok - lombok - true - + + + org.projectlombok + lombok + true + - - - org.springframework.boot - spring-boot-configuration-processor - true - + + + org.springframework.boot + spring-boot-configuration-processor + true + - - - com.alibaba.fastjson2 - fastjson2 - ${fastjson2.version} - + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson2.version} + - - com.alibaba.fastjson2 - fastjson2-extension-spring5 - ${fastjson2.version} - + + com.alibaba.fastjson2 + fastjson2-extension-spring5 + ${fastjson2.version} + - - - com.github.whvcse - easy-captcha - 1.6.2 - + + + com.github.whvcse + easy-captcha + 1.6.2 + - - org.apache.commons - commons-text - 1.13.0 - + + org.apache.commons + commons-text + 1.13.0 + - - - com.alibaba - transmittable-thread-local - 2.14.5 - + + + com.alibaba + transmittable-thread-local + 2.14.5 + - - - org.springframework.boot - spring-boot-starter-aop - + + + org.springframework.boot + spring-boot-starter-aop + - - - cn.hutool - hutool-all - ${hutool.version} - + + + cn.hutool + hutool-all + ${hutool.version} + - - - io.jsonwebtoken - jjwt-api - ${jjwt.version} - - - io.jsonwebtoken - jjwt-impl - ${jjwt.version} - - - io.jsonwebtoken - jjwt-jackson - ${jjwt.version} - + + + io.jsonwebtoken + jjwt-api + ${jjwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + + + io.jsonwebtoken + jjwt-jackson + ${jjwt.version} + - - - ch.ethz.ganymed - ganymed-ssh2 - build210 - - - com.jcraft - jsch - 0.1.55 - + + + ch.ethz.ganymed + ganymed-ssh2 + build210 + + + com.jcraft + jsch + 0.1.55 + - - - com.github.oshi - oshi-core - 6.6.5 - + + + com.github.oshi + oshi-core + 6.6.5 + - - - javax.mail - mail - ${mail.version} - + + + javax.mail + mail + ${mail.version} + - - - org.springframework.boot - spring-boot-starter-quartz - - - org.quartz-scheduler - quartz - - - - - org.quartz-scheduler - quartz - 2.5.0 - - - com.mchange - c3p0 - 0.10.1 - + + + org.springframework.boot + spring-boot-starter-quartz + + + org.quartz-scheduler + quartz + + + + + org.quartz-scheduler + quartz + 2.5.0 + + + com.mchange + c3p0 + 0.10.1 + - - - commons-net - commons-net - 3.11.1 - + + + commons-net + commons-net + 3.11.1 + - - joda-time - joda-time - 2.12.7 - + + joda-time + joda-time + 2.12.7 + - - - io.github.biezhi - TinyPinyin - 2.0.3.RELEASE - + + + io.github.biezhi + TinyPinyin + 2.0.3.RELEASE + - - - - cn.idev.excel - fastexcel - 1.2.0 - compile - + + + + cn.idev.excel + fastexcel + 1.2.0 + compile + - - - org.mozilla - rhino - 1.8.0 - - - - - - com.ezylang - EvalEx - 3.3.0 - - + + + org.mozilla + rhino + 1.8.0 + + + + + + com.ezylang + EvalEx + 3.3.0 + + - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + - - - public - aliyun nexus - https://maven.aliyun.com/nexus/content/groups/public/ - - true - - - + + + public + aliyun nexus + https://maven.aliyun.com/nexus/content/groups/public/ + + true + + + - - - public - aliyun nexus - https://maven.aliyun.com/nexus/content/groups/public/ - - true - - - false - - - + + + public + aliyun nexus + https://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + +