From d018279ec85862d933f0ae7f2beba7ffb2227e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Sun, 31 Dec 2023 16:19:05 +0800 Subject: [PATCH 1/7] =?UTF-8?q?mp=EF=BC=8Cdruid=EF=BC=8C=E6=B5=8B=E8=AF=95?= =?UTF-8?q?entity=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 32 ++++++++++++- .../java/top/milkbox/pojo/CommonEntity.java | 47 ++++++++++++++++++ .../java/top/milkbox/pojo/CommonResult.java | 4 +- .../controller}/TestController.java | 9 ++-- .../top/milkbox/modular/entity/SysRole.java | 48 +++++++++++++++++++ pom.xml | 35 ++++++++++++-- 6 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java rename milkbox-service/service-test/src/main/java/top/milkbox/{ => modular/controller}/TestController.java (78%) create mode 100644 milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java diff --git a/milkbox-app/src/main/resources/application.yml b/milkbox-app/src/main/resources/application.yml index 56ebc45..3d6fa7b 100644 --- a/milkbox-app/src/main/resources/application.yml +++ b/milkbox-app/src/main/resources/application.yml @@ -3,4 +3,34 @@ server: springdoc: swagger-ui: - path: "/doc.html" \ No newline at end of file + path: "/doc.html" + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/milkbox2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true + type: com.alibaba.druid.pool.DruidDataSource + username: root + password: 123456 + +mybatis-plus: + configuration: + # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段 + jdbc-type-for-null: null + # mybatis-plus的日志(开启后控制台打印的内容非常多) + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + banner: false + enable-sql-runner: true + db-config: + id-type: AUTO + logic-delete-field: DELETE_FLAG + logic-delete-value: DELETED + logic-not-delete-value: NOT_DELETE + # 所有的mapper映射文件 + mapper-locations: + - classpath*:top/milkbox/**/mapping/*.xml + # 定义所有操作类的别名所在包 + type-aliases-package: top.milkbox.**.entity + + diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java new file mode 100644 index 0000000..ea887ac --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java @@ -0,0 +1,47 @@ +package top.milkbox.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class CommonEntity implements Serializable { + + /** + * 排序字段 + */ + @Schema(title = "排序字段") + private Integer sortCode; + + /** + * 删除标志(NOT_DELETE;DELETED) + */ + @Schema(title = "删除标志(NOT_DELETE;DELETED)") + private String deleteFlag; + + /** + * 创建人 + */ + @Schema(title = "创建人") + private String createUser; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private Date createTime; + + /** + * 更新人 + */ + @Schema(title = "更新人") + private String updateUser; + + /** + * 更新时间 + */ + @Schema(title = "更新时间") + private Date updateTime; +} diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java index d31725f..0969c66 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java @@ -5,10 +5,12 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; + @Data @NoArgsConstructor @AllArgsConstructor -public class CommonResult { +public class CommonResult implements Serializable { public static final String DEFAULT_MESSAGE = "操作成功"; diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/TestController.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java similarity index 78% rename from milkbox-service/service-test/src/main/java/top/milkbox/TestController.java rename to milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java index 35fb52d..89cd28a 100644 --- a/milkbox-service/service-test/src/main/java/top/milkbox/TestController.java +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java @@ -1,4 +1,4 @@ -package top.milkbox; +package top.milkbox.modular.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import top.milkbox.modular.entity.SysRole; import top.milkbox.pojo.CommonResult; /** @@ -21,9 +22,11 @@ public class TestController { @GetMapping("/test") @Operation(summary = "测试接口", description = "测试接口详细描述") - public CommonResult test( + public CommonResult test( @RequestParam(required = false) @Parameter(description = "参数1") String param) { - return CommonResult.ok(param); + SysRole sysRole = new SysRole(); + sysRole.setName(param); + return CommonResult.ok(sysRole); } } \ No newline at end of file diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java new file mode 100644 index 0000000..ffb7b9c --- /dev/null +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/entity/SysRole.java @@ -0,0 +1,48 @@ +package top.milkbox.modular.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonEntity; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统_角色表 + * + * @author milkbox + * @date 2023-12-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +@Schema(title = "SysRole", description = "系统_角色表。") +public class SysRole extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键") + private String id; + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 28cf12f..a56b031 100644 --- a/pom.xml +++ b/pom.xml @@ -46,11 +46,27 @@ - - - - - + + + + com.alibaba + druid-spring-boot-starter + 1.2.20 + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.5 + + + + + + + @@ -63,6 +79,15 @@ + + + + com.mysql + mysql-connector-j + 8.2.0 + + + org.slf4j slf4j-api -- Gitee From 7214d3844a53e995218cd0d36e235a35a4242e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Sun, 31 Dec 2023 23:34:38 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8Cmapper=EF=BC=8Cparam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- milkbox-app/pom.xml | 8 ++-- .../main/java/top/milkbox/Application.java | 2 +- .../src/main/java/top/milkbox/Main.java | 7 --- .../top/milkbox/pojo/CommonPageParam.java | 45 +++++++++++++++++ milkbox-service/pom.xml | 1 + milkbox-service/service-sys/pom.xml | 20 ++++++++ .../modular/role/entity/SysRoleEntity.java | 48 +++++++++++++++++++ .../modular/role/mapper/SysRoleMapper.java | 16 +++++++ .../role/mapper/mapping/SysRoleMapper.xml | 6 +++ .../modular/role/param/SysRoleAddParam.java | 34 +++++++++++++ .../modular/controller/TestController.java | 7 +++ pom.xml | 37 +++++++++++--- 12 files changed, 213 insertions(+), 18 deletions(-) delete mode 100644 milkbox-common/src/main/java/top/milkbox/Main.java create mode 100644 milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java create mode 100644 milkbox-service/service-sys/pom.xml create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java diff --git a/milkbox-app/pom.xml b/milkbox-app/pom.xml index 8b16f0e..3b55184 100644 --- a/milkbox-app/pom.xml +++ b/milkbox-app/pom.xml @@ -18,14 +18,14 @@ - - - - top.milkbox service-test + + top.milkbox + service-sys + diff --git a/milkbox-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java index 7bb7eb3..1b69855 100644 --- a/milkbox-app/src/main/java/top/milkbox/Application.java +++ b/milkbox-app/src/main/java/top/milkbox/Application.java @@ -25,7 +25,7 @@ public class Application { */ public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Application.class); -//// springApplication.setBannerMode(Banner.Mode.OFF); // 禁用boot横幅 +// springApplication.setBannerMode(Banner.Mode.OFF); // 禁用boot横幅 ConfigurableApplicationContext app = springApplication.run(args); log.info("当前服务器时间(new Date())与时区(TimeZone.getDefault()):" + new Date() + "," + JSONUtil.toJsonStr(TimeZone.getDefault())); diff --git a/milkbox-common/src/main/java/top/milkbox/Main.java b/milkbox-common/src/main/java/top/milkbox/Main.java deleted file mode 100644 index 3328866..0000000 --- a/milkbox-common/src/main/java/top/milkbox/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package top.milkbox; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java new file mode 100644 index 0000000..58a6643 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -0,0 +1,45 @@ +package top.milkbox.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CommonPageParam implements Serializable { + + /** + * 当前页 + */ + @Schema(title = "当前页码") + private Integer current; + + /** + * 每页条数 + */ + @Schema(title = "每页条数") + private Integer size; + + /** + * 排序字段 + */ + @Schema(title = "排序字段,字段驼峰名称", example = "userName") + private String sortField; + + /** + * 排序方式 + */ + @Schema(title = "排序方式,升序:ASC;降序:DESC", example = "ASC", allowableValues = {"ASC", "DESC"}) + private String sortOrder; + + /** + * 关键词 + */ + @Schema(title = "查询关键词") + private String searchKey; + +} diff --git a/milkbox-service/pom.xml b/milkbox-service/pom.xml index d5ab973..f12ce20 100644 --- a/milkbox-service/pom.xml +++ b/milkbox-service/pom.xml @@ -13,6 +13,7 @@ pom service-test + service-sys diff --git a/milkbox-service/service-sys/pom.xml b/milkbox-service/service-sys/pom.xml new file mode 100644 index 0000000..224fa2e --- /dev/null +++ b/milkbox-service/service-sys/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + top.milkbox + milkbox-service + 1.0-DEV + + + service-sys + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java new file mode 100644 index 0000000..ce94f5d --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java @@ -0,0 +1,48 @@ +package top.milkbox.modular.role.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonEntity; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统_角色表 + * + * @author milkbox + * @date 2023-12-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +@Schema(title = "SysRoleEntity", description = "系统_角色表。") +public class SysRoleEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键") + private String id; + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java new file mode 100644 index 0000000..82df3fa --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.modular.role.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.modular.role.entity.SysRoleEntity; + +/** + * 系统_角色表(sys_role)表数据库访问层 + * + * @author milkbox + * @date 2023-12-31 + */ +@Mapper +public interface SysRoleMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml new file mode 100644 index 0000000..82f3354 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java new file mode 100644 index 0000000..d6e8bd9 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java @@ -0,0 +1,34 @@ +package top.milkbox.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统_角色表 + * + * @author milkbox + * @date 2023-12-31 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleAddParam implements Serializable { + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java index 89cd28a..cf356cb 100644 --- a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import top.milkbox.modular.entity.SysRole; +import top.milkbox.pojo.CommonPageParam; import top.milkbox.pojo.CommonResult; /** @@ -29,4 +30,10 @@ public class TestController { return CommonResult.ok(sysRole); } + @GetMapping("/page") + @Operation(summary = "分页测试", description = "分页测试详细描述") + public CommonResult page(@Parameter(description = "参数1") CommonPageParam pageParam) { + return CommonResult.ok(pageParam); + } + } \ No newline at end of file diff --git a/pom.xml b/pom.xml index a56b031..37d8f94 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ com.alibaba druid-spring-boot-starter - 1.2.20 + ${druid.version} @@ -59,9 +59,25 @@ com.baomidou mybatis-plus-boot-starter - 3.5.5 + ${mybatis-plus.version} + + + + + org.mybatis + mybatis-spring + + + + + + + org.mybatis + mybatis-spring + 3.0.3 + @@ -72,7 +88,7 @@ org.springdoc springdoc-openapi-starter-webmvc-ui - 2.2.0 + ${springdoc.version} @@ -84,7 +100,7 @@ com.mysql mysql-connector-j - 8.2.0 + ${mysql-connector.version} @@ -118,7 +134,10 @@ 1.0-DEV 5.8.24 - 3.0.0 + 1.2.20 + 3.5.5 + 2.2.0 + 8.2.0 @@ -127,7 +146,7 @@ top.milkbox milkbox-common - 1.0-DEV + ${milkbox.version} @@ -141,6 +160,12 @@ service-test ${milkbox.version} + + + top.milkbox + service-sys + ${milkbox.version} + -- Gitee From 3c6c2bfeb9aa202a780d57d71eb2eec24595c762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Tue, 2 Jan 2024 14:47:29 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=85=B6=E4=BB=96param?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../top/milkbox/pojo/CommonPageParam.java | 5 +++ .../modular/role/entity/SysRoleEntity.java | 5 +-- .../modular/role/mapper/SysRoleMapper.java | 4 +- .../modular/role/param/SysRoleAddParam.java | 7 ++-- .../modular/role/param/SysRoleEditParam.java | 39 +++++++++++++++++++ .../modular/role/param/SysRoleIdParam.java | 27 +++++++++++++ .../modular/role/param/SysRolePageParam.java | 36 +++++++++++++++++ 7 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java index 58a6643..c813092 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -7,6 +7,11 @@ import lombok.NoArgsConstructor; import java.io.Serializable; +/** + * 公共分页对象 + * + * @author milkbox + */ @Data @NoArgsConstructor @AllArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java index ce94f5d..b3694f8 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java @@ -10,13 +10,12 @@ import lombok.NoArgsConstructor; import top.milkbox.pojo.CommonEntity; import java.io.Serializable; -import java.util.Date; /** * 系统_角色表 - * + * * @author milkbox - * @date 2023-12-31 + * @date 2024-1-2 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java index 82df3fa..1a405a3 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java @@ -8,9 +8,9 @@ import top.milkbox.modular.role.entity.SysRoleEntity; * 系统_角色表(sys_role)表数据库访问层 * * @author milkbox - * @date 2023-12-31 + * @date 2024-1-2 */ @Mapper -public interface SysRoleMapper extends BaseMapper{ +public interface SysRoleMapper extends BaseMapper { } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java index d6e8bd9..9c2fdd3 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java @@ -6,13 +6,12 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.Serializable; -import java.util.Date; /** - * 系统_角色表 - * + * 添加参数对象 + * * @author milkbox - * @date 2023-12-31 + * @date 2024-1-2 */ @Data @NoArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java new file mode 100644 index 0000000..53b53fb --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java @@ -0,0 +1,39 @@ +package top.milkbox.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-2 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键") + private String id; + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java new file mode 100644 index 0000000..494f61a --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java @@ -0,0 +1,27 @@ +package top.milkbox.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 主键参数对象 + * + * @author milkbox + * @date 2024-1-2 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleIdParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键") + private String id; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java new file mode 100644 index 0000000..c0d1558 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java @@ -0,0 +1,36 @@ +package top.milkbox.modular.role.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonPageParam; + +import java.io.Serializable; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-1-2 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysRolePageParam extends CommonPageParam implements Serializable { + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file -- Gitee From dca49c5f9e58d3408b6b3643235aaedfec47f563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Tue, 2 Jan 2024 18:09:17 +0800 Subject: [PATCH 4/7] =?UTF-8?q?service=E4=B8=8Econtroller=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=83=A8=E5=88=86=E5=92=8Cvo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../milkbox/enums/CommonDeleteFlagEnum.java | 17 ++++++++ .../top/milkbox/enums/CommonSortTypeEnum.java | 24 +++++++++++ .../milkbox/enums/CommonStatusCodeEnum.java | 25 +++++++++++ .../java/top/milkbox/pojo/CommonEntity.java | 8 +++- .../top/milkbox/pojo/CommonPageParam.java | 3 +- .../java/top/milkbox/pojo/CommonResult.java | 3 +- .../main/java/top/milkbox/pojo/CommonVo.java | 40 +++++++++++++++++ .../role/controller/SysRoleController.java | 29 +++++++++++++ .../modular/role/entity/SysRoleEntity.java | 2 +- .../modular/role/service/SysRoleService.java | 14 ++++++ .../role/service/impl/SysRoleServiceImpl.java | 24 +++++++++++ .../milkbox/modular/role/vo/SysRoleVo.java | 43 +++++++++++++++++++ .../modular/controller/TestController.java | 2 +- 13 files changed, 229 insertions(+), 5 deletions(-) create mode 100644 milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java create mode 100644 milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java create mode 100644 milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java create mode 100644 milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java create mode 100644 milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java new file mode 100644 index 0000000..460d360 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java @@ -0,0 +1,17 @@ +package top.milkbox.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 删除标志枚举 + * + * @author milkbox + */ +@Getter +@AllArgsConstructor +public enum CommonDeleteFlagEnum { + DELETED("DELETED"), + NOT_DELETE("NOT_DELETE"); + private final String value; +} diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java new file mode 100644 index 0000000..6f9c875 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java @@ -0,0 +1,24 @@ +package top.milkbox.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 排序方式枚举 + * + * @author milkbox + */ +@Getter +@AllArgsConstructor +public enum CommonSortTypeEnum { + /** + * 升序 + */ + ASC("ASC"), + /** + * 降序 + */ + DESC("DESC"); + + private final String value; +} diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java new file mode 100644 index 0000000..a54da17 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java @@ -0,0 +1,25 @@ +package top.milkbox.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * 状态码枚举 + * + * @author milkbox + */ +@Getter +@AllArgsConstructor +public enum CommonStatusCodeEnum { + OK200("200", "请求成功"), + ERROR401("401", "未登录"), + ERROR403("403", "无权限"), + ERROR404("404", "路径不存在"), + ERROR405("405", "请求方法不正确"), + ERROR415("415", "参数传递异常"), + ERROR500("500", "业务异常"); + + private final String code; + private final String message; +} diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java index ea887ac..ee934f2 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java @@ -2,10 +2,16 @@ package top.milkbox.pojo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import top.milkbox.enums.CommonDeleteFlagEnum; import java.io.Serializable; import java.util.Date; +/** + * 公共entity字段 + * + * @author milkbox + */ @Data public class CommonEntity implements Serializable { @@ -19,7 +25,7 @@ public class CommonEntity implements Serializable { * 删除标志(NOT_DELETE;DELETED) */ @Schema(title = "删除标志(NOT_DELETE;DELETED)") - private String deleteFlag; + private CommonDeleteFlagEnum deleteFlag; /** * 创建人 diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java index c813092..2ad7a35 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import top.milkbox.enums.CommonSortTypeEnum; import java.io.Serializable; @@ -39,7 +40,7 @@ public class CommonPageParam implements Serializable { * 排序方式 */ @Schema(title = "排序方式,升序:ASC;降序:DESC", example = "ASC", allowableValues = {"ASC", "DESC"}) - private String sortOrder; + private CommonSortTypeEnum sortType; /** * 关键词 diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java index 0969c66..3aefe20 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import top.milkbox.enums.CommonStatusCodeEnum; import java.io.Serializable; @@ -28,6 +29,6 @@ public class CommonResult implements Serializable { } public static CommonResult ok(ResultType data) { - return new CommonResult<>("200", DEFAULT_MESSAGE, data); + return new CommonResult<>(CommonStatusCodeEnum.OK200.getCode(), DEFAULT_MESSAGE, data); } } diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java new file mode 100644 index 0000000..0531a47 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java @@ -0,0 +1,40 @@ +package top.milkbox.pojo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 公共vo字段 + * + * @author milkbox + */ +@Data +public class CommonVo implements Serializable { + + /** + * 创建人 + */ + @Schema(title = "创建人") + private String createUser; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private Date createTime; + + /** + * 更新人 + */ + @Schema(title = "更新人") + private String updateUser; + + /** + * 更新时间 + */ + @Schema(title = "更新时间") + private Date updateTime; +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java new file mode 100644 index 0000000..99d1712 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java @@ -0,0 +1,29 @@ +package top.milkbox.modular.role.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import top.milkbox.modular.role.service.SysRoleService; +import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.pojo.CommonResult; + +/** + * 角色表(sys_role)控制器 + * + * @author milkbox + * @date 2024-1-2 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sysRole") +@Tag(name = "角色表控制器", description = "SysRoleController") +public class SysRoleController{ + + private SysRoleService sysRoleService; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java index b3694f8..b6e933d 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java @@ -22,7 +22,7 @@ import java.io.Serializable; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) @TableName("sys_role") -@Schema(title = "SysRoleEntity", description = "系统_角色表。") +@Schema(description = "SysRoleEntity 系统_角色表。") public class SysRoleEntity extends CommonEntity implements Serializable { /** diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java new file mode 100644 index 0000000..a29017b --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java @@ -0,0 +1,14 @@ +package top.milkbox.modular.role.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.modular.role.entity.SysRoleEntity; + +/** + * 系统_角色表(sys_role)服务层接口 + * + * @author milkbox + * @date 2024-1-2 + */ +public interface SysRoleService extends IService { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..c5d644b --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,24 @@ +package top.milkbox.modular.role.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import top.milkbox.modular.role.entity.SysRoleEntity; +import top.milkbox.modular.role.mapper.SysRoleMapper; +import top.milkbox.modular.role.service.SysRoleService; + +/** + * 系统_角色表(sys_role)服务层实现类 + * + * @author milkbox + * @date 2024-1-2 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + + private SysRoleMapper sysRoleMapper; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java new file mode 100644 index 0000000..c9e06f1 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java @@ -0,0 +1,43 @@ +package top.milkbox.modular.role.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonVo; + +import java.io.Serializable; + +/** + * 系统_角色表默认vo + * + * @author milkbox + * @date 2024-1-2 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysRoleEntity 系统_角色表。") +public class SysRoleVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键") + private String id; + + /** + * 角色名 + */ + @Schema(title = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java index cf356cb..838d031 100644 --- a/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java +++ b/milkbox-service/service-test/src/main/java/top/milkbox/modular/controller/TestController.java @@ -18,7 +18,7 @@ import top.milkbox.pojo.CommonResult; */ @RestController @RequestMapping("/test") -@Tag(name = "TestController", description = "测试控制器") +@Tag(name = "测试控制器", description = "TestController") public class TestController { @GetMapping("/test") -- Gitee From 3ae15f4e7fc461b0c67e1c10fc902a8f4bee2403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Wed, 10 Jan 2024 16:24:38 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/top/milkbox/Application.java | 13 +++- .../core/handler/GlobalControllerAdvice.java | 64 +++++++++++++++++++ .../top/milkbox/enums/CommonSortTypeEnum.java | 13 ++++ .../milkbox/enums/CommonStatusCodeEnum.java | 5 +- .../exceprion/CommonServiceException.java | 21 ++++++ .../top/milkbox/pojo/CommonPageParam.java | 18 ++++-- .../java/top/milkbox/pojo/CommonResult.java | 20 +++++- .../role/controller/SysRoleController.java | 15 +++-- .../modular/role/param/SysRolePageParam.java | 9 +-- .../modular/role/service/SysRoleService.java | 47 +++++++++++++- .../role/service/impl/SysRoleServiceImpl.java | 57 ++++++++++++++++- pom.xml | 6 ++ 12 files changed, 268 insertions(+), 20 deletions(-) create mode 100644 milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java create mode 100644 milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java diff --git a/milkbox-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java index 1b69855..2b378d4 100644 --- a/milkbox-app/src/main/java/top/milkbox/Application.java +++ b/milkbox-app/src/main/java/top/milkbox/Application.java @@ -3,10 +3,14 @@ package top.milkbox; import cn.hutool.core.date.DateTime; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import top.milkbox.pojo.CommonResult; import java.util.Date; import java.util.TimeZone; @@ -17,6 +21,8 @@ import java.util.TimeZone; * @author milkbox */ @Slf4j +@EnableWebMvc +@RestController @SpringBootApplication public class Application { @@ -33,4 +39,9 @@ public class Application { // log.info("通用配置:\n" + JSONUtil.toJsonPrettyStr(app.getBean("commonProperties"))); log.info(">>> {}", Application.class.getSimpleName().toUpperCase() + " STARTING SUCCESS 启动成功"); } + + @GetMapping("/") + public CommonResult welcome(@RequestParam(required = false) String message) { + return CommonResult.ok("系统运行中......", message); + } } \ No newline at end of file diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java new file mode 100644 index 0000000..99e043a --- /dev/null +++ b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java @@ -0,0 +1,64 @@ +package top.milkbox.core.handler; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ui.Model; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.*; +import top.milkbox.enums.CommonStatusCodeEnum; +import top.milkbox.pojo.CommonResult; + +/** + * 全局controller增强器 + * 创建时间: 2024-01-10 下午 2:29 + * + * @author milkbox + */ +@Slf4j +@ControllerAdvice +public class GlobalControllerAdvice { + + /** + * 把值绑定到Model中,使全局@RequestMapping可以获取到该值 + */ + @ModelAttribute + public void addAttributes(Model model) { + log.info(model.toString()); + } + + /** + * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + } + + /** + * 全局异常捕捉,在此处进行处理 + * + * @param exception 捕获到的异常 + * @return 通用响应对象 + */ + @ResponseBody + @ExceptionHandler(value = Exception.class) + public CommonResult errorHandler(Exception exception) { + + // 后端校验不通过异常 + if (exception instanceof MethodArgumentNotValidException methodArgumentNotValidException) { + StringBuilder errorMessage = new StringBuilder(); + methodArgumentNotValidException.getAllErrors() + .forEach(objectError -> errorMessage.append(objectError.getDefaultMessage()).append(StrUtil.COMMA)); + + return new CommonResult<>(CommonStatusCodeEnum.ERROR415.getCode(), + CommonStatusCodeEnum.ERROR415.getMessage(), + StrUtil.removeSuffix(errorMessage.toString(), StrUtil.COMMA)); + } + + // 其他未处理异常 + log.error("其他未处理异常:{}", exception.getMessage()); + exception.printStackTrace(); + return new CommonResult<>(CommonStatusCodeEnum.ERROR500.getCode(), + CommonStatusCodeEnum.ERROR500.getMessage(), exception.toString()); + } +} diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java index 6f9c875..83c8678 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java @@ -2,6 +2,7 @@ package top.milkbox.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import top.milkbox.exceprion.CommonServiceException; /** * 排序方式枚举 @@ -21,4 +22,16 @@ public enum CommonSortTypeEnum { DESC("DESC"); private final String value; + + /** + * 校验是否符合枚举 + * + * @param value 被校验的值 + */ + public static void validate(String value) { + value = value.toUpperCase(); + if (!ASC.getValue().equals(value) && !DESC.getValue().equals(value)) { + throw new CommonServiceException("不支持该排序方式:{}", value); + } + } } diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java index a54da17..15235ce 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java @@ -17,8 +17,9 @@ public enum CommonStatusCodeEnum { ERROR403("403", "无权限"), ERROR404("404", "路径不存在"), ERROR405("405", "请求方法不正确"), - ERROR415("415", "参数传递异常"), - ERROR500("500", "业务异常"); + ERROR415("415", "参数校验不通过"), + ERROR500("500", "未知异常"), + ERROR506("506", "业务逻辑异常"); private final String code; private final String message; diff --git a/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java b/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java new file mode 100644 index 0000000..a299acb --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java @@ -0,0 +1,21 @@ +package top.milkbox.exceprion; + +import cn.hutool.core.util.StrUtil; + +/** + * 自定义服务异常 + * 一般用于业务逻辑中出现的业务错误,返回给前端提示 + * 创建时间: 2024-01-08 下午 4:39 + * + * @author milkbox + */ +public class CommonServiceException extends RuntimeException { + + public CommonServiceException(String message) { + super(message); + } + + public CommonServiceException(String msg, Object... arguments) { + super(StrUtil.format(msg, arguments)); + } +} diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java index 2ad7a35..e9511cc 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -1,9 +1,10 @@ package top.milkbox.pojo; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import lombok.*; +import lombok.extern.slf4j.Slf4j; import top.milkbox.enums.CommonSortTypeEnum; import java.io.Serializable; @@ -13,22 +14,29 @@ import java.io.Serializable; * * @author milkbox */ +@Slf4j @Data @NoArgsConstructor @AllArgsConstructor public class CommonPageParam implements Serializable { + public static final Integer DEFAULT_CURRENT = 1; + public static final Integer DEFAULT_SIZE = 20; + public static final Integer MAX_SIZE = 100; // 最大查询条数 + /** * 当前页 */ @Schema(title = "当前页码") - private Integer current; + private Integer current = DEFAULT_CURRENT; /** * 每页条数 */ @Schema(title = "每页条数") - private Integer size; + @DecimalMax(value = "100", message = "最大条数不能超过100") + @DecimalMin(value = "1", message = "最小条数不能小于1") + private Integer size = DEFAULT_SIZE; /** * 排序字段 diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java index 3aefe20..d5e9379 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java @@ -8,6 +8,12 @@ import top.milkbox.enums.CommonStatusCodeEnum; import java.io.Serializable; +/** + * 通用响应对象 + * + * @author milkbox + * @param 响应数据的类型 + */ @Data @NoArgsConstructor @AllArgsConstructor @@ -29,6 +35,18 @@ public class CommonResult implements Serializable { } public static CommonResult ok(ResultType data) { - return new CommonResult<>(CommonStatusCodeEnum.OK200.getCode(), DEFAULT_MESSAGE, data); + return CommonResult.ok(DEFAULT_MESSAGE, data); + } + + public static CommonResult ok(String message, ResultType data) { + return new CommonResult<>(CommonStatusCodeEnum.OK200.getCode(), message, data); + } + + public static CommonResult error() { + return CommonResult.error(CommonStatusCodeEnum.ERROR500.getMessage()); + } + + public static CommonResult error(String message) { + return new CommonResult<>(CommonStatusCodeEnum.ERROR500.getCode(), message, null); } } diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java index 99d1712..e15452f 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java @@ -1,15 +1,15 @@ package top.milkbox.modular.role.controller; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import top.milkbox.modular.role.param.SysRolePageParam; import top.milkbox.modular.role.service.SysRoleService; -import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.pojo.CommonPageParam; import top.milkbox.pojo.CommonResult; /** @@ -22,8 +22,15 @@ import top.milkbox.pojo.CommonResult; @AllArgsConstructor @RequestMapping("/sysRole") @Tag(name = "角色表控制器", description = "SysRoleController") -public class SysRoleController{ +public class SysRoleController { private SysRoleService sysRoleService; + @GetMapping("/page") + @Operation(summary = "分页查询", description = "查询条件分页查询") + public CommonResult page(@Validated SysRolePageParam pageParam) { + sysRoleService.page(pageParam); + return CommonResult.ok(); + } + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java index c0d1558..77f9123 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java @@ -1,10 +1,9 @@ package top.milkbox.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.*; import top.milkbox.pojo.CommonPageParam; import java.io.Serializable; @@ -25,12 +24,14 @@ public class SysRolePageParam extends CommonPageParam implements Serializable { * 角色名 */ @Schema(title = "角色名") + @NotBlank(message = "角色名不能为空") private String name; /** * 角色值 */ @Schema(title = "角色值") + @NotEmpty(message = "角色值不能为空") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java index a29017b..e467af4 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java @@ -1,7 +1,15 @@ package top.milkbox.modular.role.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import top.milkbox.modular.role.entity.SysRoleEntity; +import top.milkbox.modular.role.param.SysRoleAddParam; +import top.milkbox.modular.role.param.SysRoleEditParam; +import top.milkbox.modular.role.param.SysRoleIdParam; +import top.milkbox.modular.role.param.SysRolePageParam; +import top.milkbox.modular.role.vo.SysRoleVo; + +import java.util.List; /** * 系统_角色表(sys_role)服务层接口 @@ -10,5 +18,42 @@ import top.milkbox.modular.role.entity.SysRoleEntity; * @date 2024-1-2 */ public interface SysRoleService extends IService { - + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(SysRoleAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(SysRoleEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + SysRoleVo detail(SysRoleIdParam idParam); + + /** + * 分页查询 + * + * @param pageParam 分页查询参数 + * @return 返回苞米豆的分页对象,没有数据,则record长度为0 + */ + Page page(SysRolePageParam pageParam); + } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java index c5d644b..4ca2290 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java @@ -1,12 +1,26 @@ package top.milkbox.modular.role.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import top.milkbox.enums.CommonSortTypeEnum; import top.milkbox.modular.role.entity.SysRoleEntity; import top.milkbox.modular.role.mapper.SysRoleMapper; +import top.milkbox.modular.role.param.SysRoleAddParam; +import top.milkbox.modular.role.param.SysRoleEditParam; +import top.milkbox.modular.role.param.SysRoleIdParam; +import top.milkbox.modular.role.param.SysRolePageParam; import top.milkbox.modular.role.service.SysRoleService; +import top.milkbox.modular.role.vo.SysRoleVo; + +import java.util.List; /** * 系统_角色表(sys_role)服务层实现类 @@ -18,7 +32,46 @@ import top.milkbox.modular.role.service.SysRoleService; @Service @AllArgsConstructor public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { - + private SysRoleMapper sysRoleMapper; - + + @Override + public void add(SysRoleAddParam addParam) { + SysRoleEntity sysRole = BeanUtil.toBean(addParam, SysRoleEntity.class); + super.save(sysRole); + } + + @Override + public void delete(List paramList) { + + } + + @Override + public void edit(SysRoleEditParam editParam) { + + } + + @Override + public SysRoleVo detail(SysRoleIdParam idParam) { + return null; + } + + @Override + public Page page(SysRolePageParam pageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { + queryWrapper.orderBy(true, + pageParam.getSortType() == CommonSortTypeEnum.ASC, + StrUtil.toUnderlineCase(pageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(SysRoleEntity::getSortCode); + } + queryWrapper.lambda().orderByAsc(SysRoleEntity::getId); + + log.info(pageParam.getSortField()); + log.info(JSONUtil.toJsonPrettyStr(pageParam)); + log.info(pageParam.toString()); + + return null; + } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 37d8f94..21d3057 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,12 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-starter-validation + + -- Gitee From 6242a470116d8cfba304a51f0534c8d35485cd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Mon, 15 Jan 2024 18:44:51 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=AE=8C=E6=88=90role=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E5=AE=9E?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 + img/image-20240112111124776.png | Bin 0 -> 46892 bytes .../core/config/MybatisPlusConfig.java | 32 +++++ .../core/handler/GlobalControllerAdvice.java | 45 ++++++- .../mybatisPlus/MyMetaObjectHandler.java | 41 +++++++ .../src/main/resources/application.yml | 14 +-- .../milkbox/enums/CommonDeleteFlagEnum.java | 20 +-- .../milkbox/enums/CommonStatusCodeEnum.java | 4 +- .../exceprion/CommonServiceException.java | 5 + .../java/top/milkbox/pojo/CommonEntity.java | 16 ++- .../top/milkbox/pojo/CommonPageParam.java | 25 +++- .../java/top/milkbox/pojo/CommonResult.java | 4 +- .../main/java/top/milkbox/pojo/CommonVo.java | 7 +- .../java/top/milkbox/utils/CommonUtil.java | 114 ++++++++++++++++++ .../role/controller/SysRoleController.java | 51 ++++++-- .../modular/role/entity/SysRoleEntity.java | 3 + .../modular/role/param/SysRoleAddParam.java | 6 +- .../modular/role/param/SysRoleEditParam.java | 12 +- .../modular/role/param/SysRoleIdParam.java | 6 +- .../modular/role/param/SysRolePageParam.java | 8 +- .../modular/role/service/SysRoleService.java | 8 ++ .../role/service/impl/SysRoleServiceImpl.java | 37 ++++-- .../milkbox/modular/role/vo/SysRoleVo.java | 2 +- pom.xml | 7 -- 24 files changed, 401 insertions(+), 72 deletions(-) create mode 100644 img/image-20240112111124776.png create mode 100644 milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java create mode 100644 milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java create mode 100644 milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java diff --git a/README.md b/README.md index 39a7238..bfab33e 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,14 @@ java21的bin目录/java -jar jar包目录/jar包名称.jar --add-opens java.base # 打包与启动 +启动时需要添加环境变量,如下图所示 + +![image-20240112111124776](img/image-20240112111124776.png) + 启动命令参考 +win + ```bash chcp chcp 65001 diff --git a/img/image-20240112111124776.png b/img/image-20240112111124776.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9cb81c88952bebe5989b8820ba38ca31c0ead2 GIT binary patch literal 46892 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�lK6$;-;;W3^CGr#W-toWG_O}Z! zj4ryDlHRX+M&)|Zm9V2E5a>l&$z*w|GR4_*)wH8;RzKKVz_6{yC_!e14&5b(rrSm_ z6mZhr=R&6B7xD|#I5Cab`883_ykaX`cgjRN=(;RXqNvU#By{Vt&F#X3=gLxTG^~cz zW$&aNK5*N?V<9F824+Z1{Mx9iZ(Ia{s*~`wOiiE%*ZMYC_rz;Vs};pPC3tgR@_mxk zT0-on3Y}Oy1n+f>rNY--%U3hs0bCg;Fo8O`_U*d#P9vZJjNVl;FMXz~{qusAF=>&rYXUsA5! zq72vCHO*1ftx&3$eXl#K+Vg+(>7~ztqm~y((6P98<+bkAHT9PID9b!brBry9R}nRX zKg3<<;KQPupPkSDrpTJAJ)5#FXU8+J3I9PLn^r~@!otGTRsrmOzN6o`6`vupQ1zlS zeQ4cop$Zj>6wusCj-ssOT~EA8D&~y3uA78*hhjaar>Ka|HP{Q)eb8rOv~7QjqTMBG z%o;BHi6C_w!!9>`jwkc2e?3V1JE?3m z%?oM_CaOaV;xisXLu5yjcD%qgcqAhUj;EYG>syG1V8fn>5jkw0vp1fQWEoWNqbF}h zVU%ootp5yAWMr-H>O=Y+=M^KYKz!jb#3JRJ19ZDZMDDb zK=xMRi6KvB_IteH?bF?vX)!0Z?#jv$hzO#^AWNo;7VFAtcdYpY?MO4KLjQm#&j4z+ zIA??1>UVcJDDA->T1Y$esQ=Dp!eVLLCw)#v4Kbtn{ljGg5*Ju{bic_ekwlvpD&z@U zNM^Ht4w3P~bHRCRc9%3hd&^Rk#4~OW?9P=Q&t<@G92~Ox+gyN`sMB!&xiKuN?0Rl; zfp*tx>(K7!zWC|J5$z2Yl0D?JGjnqpkl%l>aC1JokM)EagvsO`xjBilG_4T9|G7Xn zG0VQ`A_>0%%?{VUc%|+hFfl2h!74Iuo+zi`tlc4pv>mpBIsI?__KRJMdF65N*MSb- zj0h5DFm-pJP76#h9*E<)a+s?wIk)n7?&mRan zH2EIq^B`5M7c0vlnB+g5_J!)G4#SqKCFhSC-a~O7ewbbp5oP68w1(#@$2tn13+g&Byg^3p#*D*>8PH&s#tXmd(De+3?6B4crC{M`M|Bo5s z*9*=Oq9{4B9~a0Qcnh^T8>VsEu4uG{WMFjVLbl^ItgOr|xCiRO2MxuJj((P}vI*p* zUzg1A;aXGan;utcQ!x|zuN6zZS|4{|PATA#?DnHA%l+p}*s5leLygL#yuQLgSqrmL zI)Ev{FT5hxIyEVJ1Bw1mSX(GQ@?s3ahnHbLsrEslZdneelJX;!DC_%zd}_fVjJ| z@VG|X3ED?|Cw=NaiX^kYD=-{gk&9Om-An#-9CN=X`q7TfjujQj1opM72o(uC9FMUfESeM|h@`4T+1=hX0vuSc8!M-3Kb zbi1>s1Xfv~@jZQg`^WMX;IjeBg}nRMS@0tO0Db@o@%M;ty#QYx(A~fN@d@}}N`wEZ z6S)+);Y|QA83)JwftrH%f8S*gFj^OF-}Y-{{wZezh=&1;4F6wmm?A$}4f61|AKpNg zH!c6e#B$pCtqmUUz^9bUrx^`rYz=>Sx^>xDMu@6UwG>X_kL6iTqSeONvW`mPLxm@))j8(f=pvQb zhh;Nl0Tdw47nhkyNf?$ZSI#LXSNX&C5|J6Xwtn0p`PpV(LoTN1RzXCJBFK!>;~sc8 zF?~@KS?Ha~U@L?Vd{||LMB26VmTc;_T?ZyfWnB+Cu4^e7V!QQ}CCFPZpmr^W`+F~n z9997tUtVMHMDi^=>&o4FRxwsy9aI#b%3Ci+`WP`^o!ym;T+JEz^XK4)RjLL)TV875 z>o(3s=YgpGmS&&U?+T26D+}U=aJ=?0dH-%eqa6($>&s|D zLh9bt<3|07-LnP=hrf%99$J*x#nbXtOhKkAFthnoS{Gx5Ws(@7xdNjGvqc$09w91S zr+lk7afbl`tx;YOCAy#?T3AGsInSnS!K^yBB5$0mbhlJTX=xng>lqQ@djX5X!|z1T zqH5Qir}a6~)zLn)kaYazq z`awe2;s*Gd#7E!1NppI^QK}PPFeB~Z<_0?PY<@_z1L`FL#&hHMJ*e1A2d&BW)JZ_r zmtH|+_kpF|Ap7i@ob_x!B|R7_4QC#ogjRfFj!@p*(mhzEvTsK3LH8TiLj_USN;i!+z_OWua-gVPI@m4nI;@LrA z=)jp)eS&Yj^)Kek5k9ff@FY%qjY{l2+}Xx{{Rv)+-lDV04~Vl!KEL~#AYx;Cy`JIW zU*MZSn7;R>*+Zh2Qx_f3o*U>*J}swq!y?At=h9c=Y6+Yona#z=$5mfSA2a2Vo&ey> zl3C_5GWEp&LPW)9^b6z25f2PxMEzq0(?PDKr#Bm_laCWxb~8KM2wy(IqhXsv5?UBW zvE=m|VxeoPLrqDIyl7`SI`cRuC7Y#jdbK)GQ(5!Tx3K)13;eWCD*6oC#PXf>5 z71#+Mbd}4uOC9RxvtYfDN{``0?)xu#ua_Q^jh?uc30Jdy-$EUtI|@xm;yyqT^rcLt z!dBDmCwdP_p0tKYi%4Ez{1}T?t{z7Bpwm#I8lrh{xW#yp2IFzJ$w;Hi%(dSQJAx0e zUw*{y#PshHt>|i^UwXF9`Plr;`>I>P;W*U3;*Zhv?wQMvoJ>B)%A03RKCONwmy+MS z?;B8j?=oQLVor{6RV@qOPYw*8`#i}?j~);qY2%o+;U>|pexK(N&fDQSNVLp)Dnw2G z)6D?R>0AM?(fa)e7ZYa6^OOKsFf)=%7(~1m-yyA#>-97XV(I1nzTYgRVeeeH%p3i@ zNAt7d6*hG%j9hKUgrV$YPxu~&0e05n{p|Q}5vk;ve}$Tb&Wz(Kb4QPBkzz{`O_we& z{fli3#2pM?UYI6b9-yTChuMw?&-}eVE|H@mF~{$$WVqHZ>U;(;*X7lr`KG*4ffJ_$ zBoMNRX}JG)3JczEvdS)RbLr61E~-2cAZq(Tsq^SmrqFh&8>8%oj%+T0XDsYbLdS<1(2J-7ZDdwI(PqG!y_NMCsb8b4g{I*@QRwF8ammecepF z>m@96-df%mH_&=BDdG^epEOD3K>JMPnXSjr^W`C|=!F52r#XC%EL(dapMKOuseph;dRE{!EfUaHI(;N4#gvPv!H zw9?%lxH$=!LfUlHH^rVuc$e9o`mKlWEs9#T@?HE)AK_>`Y)4?}oi_!RbGHdNU?(0%lQgb z-~o^HeqABBnIk6PL~FlKUv&)M=>(ET_tSiRHJ}Z1yd&6_b+KD%mYgr-p8(%}cQ!uO zk0eUq@MP{K=+c7dt*2tQ1pIn4nMhB%L+Ek2e^xe(yf~2;9Y09W1s=CUg73)nzE>^T?Y?u3Ua283ekH)4M&<;1MymqMIs$(u@As z6pRbb9Y<$yHu2_=u{(P~)dc6`W&}o6!FDl5-A_zeH@zytNC+SDJXaXKqOjCr-cegB z8y(twM%=+A3fk-F)mJGGRF!-D#6KD47xZUs&R#k1kyF9>uuXZ3dA)c&Qx-^q6EJFa z;x>B4jhlu@moZwnoCK6*_Bx_H8>rNVtIBI8P|H&~I={(O+-KHjt(@teDqtzz`Z*2J z?^YqJp~lPHi+yb61$?$v`O#)oQHHFu{7a6n)WqXhJe$Qo#P-|`uu9E#WCltRuFL3y zJ7*hht+;Ie9MC?NQB#XcLGm@#meRbAEew))DwBsqscw!)`+t@|0N?UGYXAa@x0MZ$ zU_%KC^!(PZhbBkTNxlBqG3PWIfS6m+r7Ku*{R9s1FHJ^f;j_>42i^;$MiSJ{t6E)o zi16u)KI2d7Pg#EPB2(sm_NQvOlSuP_@?pt^m7bryxJp8LqFNkk`kzo$wpxC0=waXo z!@!~w3*ru@rUiAUxPjTff2SP3BL&tG@3&QK2oT-ujRT#V&VfTy+znRZ|LWS2dm39m z-}1)K!N+HaRnGo_RaGlnoI##?Ps)=@p`#hJ*tKU;Ha3-0=;*MYs+qV+LDa~sO3%4u zT7o`p1+c>SSgWbi+u1f7=Glz}R*V76^dHh{A&PH$nS`(Ds04gY1_V()#{;OOjCvso zp01VbTcsA1qrO)bDMY*q89BLhyy}*&CeG`OZz*S#xRE+rLEeig-An>2l%v^_sEFp{ zJev(!7@_s>GGDP;?>uyKoIZZLRJh@_eOPk_z;6CIpU8q0{b);P?V`L)Q|_6xw|nub zyk^EUPqV{$z=%(gL(f@jn1dmUi{}tq2OXU;p9e_9E0a^O0lsdObBK@zooms&q_o^m z&Qj>a2beD{UH?C(B&;=)~_VZk*bQx5-_s`k%ciL_ZZ)&$*_Bi#%R0S~Zw#G=88teR8?ZqMS zL@--IG|iqLw8YH5Vyiy$#rAxq2VacM_1@=ig&fTrf0tq^x6Dw5Ek8$>56@0tx{AwB ze*HLYo4;kU3B0TM(Z8}pdB-&@VV!D8>Y!?$t}Td|$eV1QxZWixfOUKEU}-_NV950c zqS9r(CVqjrFZ*|ZANN2RZaBfut7ilq8@d%T3UNSnRUEEBKI{v#I5`^^^XWP*)mifi zir3)W^8HT&X*xBYvMyYvY9&Gxy1++)w9Rc1_2Z`7{-rwhD@`$NuCUPB6$+Npo z2z~4t(7wZj-a5XGS(GXRhIp-4dcnCiU0}SnpxS2z!~~RwuZ)T+!(uxM)!WmTRODDz zk8y>C*Lvup9vr}9!yM(er=~0g(o!~O4Z>9WmJdVpbk$^cL%bs=CF2j!n1Hn(D00U} zh45)QjBSGZ>MXCJ>ozj_(U$(hB;pa$6WMbG1a-B6+OzrH6& zx&n-|H84y#Om996tmxt2Zl#kI errorHandler(Exception exception) { // 后端校验不通过异常 - if (exception instanceof MethodArgumentNotValidException methodArgumentNotValidException) { + if (exception instanceof MethodArgumentNotValidException errorResponse) { StringBuilder errorMessage = new StringBuilder(); - methodArgumentNotValidException.getAllErrors() + errorResponse.getAllErrors() .forEach(objectError -> errorMessage.append(objectError.getDefaultMessage()).append(StrUtil.COMMA)); return new CommonResult<>(CommonStatusCodeEnum.ERROR415.getCode(), @@ -55,9 +60,37 @@ public class GlobalControllerAdvice { StrUtil.removeSuffix(errorMessage.toString(), StrUtil.COMMA)); } - // 其他未处理异常 - log.error("其他未处理异常:{}", exception.getMessage()); - exception.printStackTrace(); + // 在controller接口方法参数上添加的校验注解,在此处单独报错 + else if (exception instanceof HandlerMethodValidationException errorResponse) { + Object[] detailMessageArguments = errorResponse.getDetailMessageArguments(); + if (detailMessageArguments != null && detailMessageArguments.length != 0) { + StringBuilder errorMessage = new StringBuilder(); + Arrays.stream(detailMessageArguments) + .forEach(objectError -> errorMessage.append(objectError.toString()).append(StrUtil.COMMA)); + return new CommonResult<>(CommonStatusCodeEnum.ERROR415.getCode(), + CommonStatusCodeEnum.ERROR415.getMessage(), + StrUtil.removeSuffix(errorMessage.toString(), StrUtil.COMMA)); + } + log.warn("校验报错,但是校验选项为空"); + } + + // 服务层业务逻辑异常 + else if (exception instanceof CommonServiceException commonServiceException) { + return new CommonResult<>(CommonStatusCodeEnum.ERROR506.getCode(), + CommonStatusCodeEnum.ERROR506.getMessage(), commonServiceException.getMessage()); + } + + // 请求参数的格式错误 + else if (exception instanceof HttpMessageNotReadableException httpMessageNotReadableException) { + String errorMessage = "请求参数格式错误(" + httpMessageNotReadableException.getMessage() + ")"; + log.warn(errorMessage, exception); + return new CommonResult<>(CommonStatusCodeEnum.ERROR415.getCode(), + CommonStatusCodeEnum.ERROR415.getMessage(), errorMessage); + } + + // 其他未处理异常,堆栈信息保存到日志中 + log.error("其他未处理异常:{}", exception.getMessage(), exception); +// exception.printStackTrace(); // 系统控制台堆栈,可能不会存入日志 return new CommonResult<>(CommonStatusCodeEnum.ERROR500.getCode(), CommonStatusCodeEnum.ERROR500.getMessage(), exception.toString()); } diff --git a/milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java b/milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java new file mode 100644 index 0000000..6e45b9b --- /dev/null +++ b/milkbox-app/src/main/java/top/milkbox/core/handler/mybatisPlus/MyMetaObjectHandler.java @@ -0,0 +1,41 @@ +package top.milkbox.core.handler.mybatisPlus; + +import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; +import top.milkbox.enums.CommonDeleteFlagEnum; + +import java.util.Date; + +/** + * 常用字段自动填充器 + * 创建时间: 2024-01-15 下午 4:08 + * + * @author milkbox + */ +@Component +public class MyMetaObjectHandler implements MetaObjectHandler { + @Override + public void insertFill(MetaObject metaObject) { + // 删除字段 + this.strictInsertFill(metaObject, "deleteFlag", + () -> CommonDeleteFlagEnum.NOT_DELETE, CommonDeleteFlagEnum.class); + // TODO 创建人,这个需要saToken + this.strictInsertFill(metaObject, "createUser", + () -> -1, Integer.class); + // 创建时间 + this.strictInsertFill(metaObject, "createTime", + DateTime::now, Date.class); + } + + @Override + public void updateFill(MetaObject metaObject) { + // TODO 更新人,这个需要saToken + this.strictUpdateFill(metaObject, "updateUser", + () -> -1, Integer.class); + // 更新时间 + this.strictUpdateFill(metaObject, "updateTime", + DateTime::now, Date.class); + } +} diff --git a/milkbox-app/src/main/resources/application.yml b/milkbox-app/src/main/resources/application.yml index 3d6fa7b..ca9e211 100644 --- a/milkbox-app/src/main/resources/application.yml +++ b/milkbox-app/src/main/resources/application.yml @@ -7,11 +7,12 @@ springdoc: spring: datasource: + # 主机地址、用户名和密码请配置环境变量 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/milkbox2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true + url: jdbc:mysql://${DB_HOST}:13306/milkbox2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true type: com.alibaba.druid.pool.DruidDataSource - username: root - password: 123456 + username: ${DB_USERNAME} + password: ${DB_PASSWORD} mybatis-plus: configuration: @@ -24,13 +25,12 @@ mybatis-plus: enable-sql-runner: true db-config: id-type: AUTO - logic-delete-field: DELETE_FLAG - logic-delete-value: DELETED - logic-not-delete-value: NOT_DELETE + logic-delete-value: 1 + logic-not-delete-value: 0 # 所有的mapper映射文件 mapper-locations: - classpath*:top/milkbox/**/mapping/*.xml # 定义所有操作类的别名所在包 - type-aliases-package: top.milkbox.**.entity + type-aliases-package: top.milkbox.**.entity;top.milkbox.**.param;top.milkbox.**.vo diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java index 460d360..824a6d6 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java @@ -1,17 +1,23 @@ package top.milkbox.enums; +import com.baomidou.mybatisplus.annotation.IEnum; import lombok.AllArgsConstructor; -import lombok.Getter; /** - * 删除标志枚举 + * 删除标志枚举,1表示删除,0表示未删除 * * @author milkbox */ -@Getter +//@Getter @AllArgsConstructor -public enum CommonDeleteFlagEnum { - DELETED("DELETED"), - NOT_DELETE("NOT_DELETE"); - private final String value; +public enum CommonDeleteFlagEnum implements IEnum { + DELETED(1), + NOT_DELETE(0); + + private final Integer value; + + @Override + public Integer getValue() { + return value; + } } diff --git a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java index 15235ce..57de696 100644 --- a/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java @@ -1,11 +1,11 @@ package top.milkbox.enums; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; /** * 状态码枚举 + * 可参考类:cn.hutool.http.HttpStatus * * @author milkbox */ @@ -17,7 +17,7 @@ public enum CommonStatusCodeEnum { ERROR403("403", "无权限"), ERROR404("404", "路径不存在"), ERROR405("405", "请求方法不正确"), - ERROR415("415", "参数校验不通过"), + ERROR415("415", "参数类型"), ERROR500("500", "未知异常"), ERROR506("506", "业务逻辑异常"); diff --git a/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java b/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java index a299acb..f162588 100644 --- a/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java +++ b/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java @@ -11,6 +11,11 @@ import cn.hutool.core.util.StrUtil; */ public class CommonServiceException extends RuntimeException { + + public CommonServiceException() { + super("未知业务逻辑异常"); + } + public CommonServiceException(String message) { super(message); } diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java index ee934f2..b423847 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java @@ -1,5 +1,8 @@ package top.milkbox.pojo; +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 lombok.Data; import top.milkbox.enums.CommonDeleteFlagEnum; @@ -24,30 +27,37 @@ public class CommonEntity implements Serializable { /** * 删除标志(NOT_DELETE;DELETED) */ - @Schema(title = "删除标志(NOT_DELETE;DELETED)") + @TableLogic + @Schema(title = "删除标志(1表示删除,0表示未删除)") + @TableField(fill = FieldFill.INSERT) private CommonDeleteFlagEnum deleteFlag; +// private Integer deleteFlag; /** * 创建人 */ + @TableField(fill = FieldFill.INSERT) @Schema(title = "创建人") - private String createUser; + private Integer createUser; /** * 创建时间 */ @Schema(title = "创建时间") + @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新人 */ @Schema(title = "更新人") - private String updateUser; + @TableField(fill = FieldFill.UPDATE) + private Integer updateUser; /** * 更新时间 */ @Schema(title = "更新时间") + @TableField(fill = FieldFill.UPDATE) private Date updateTime; } diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java index e9511cc..14834bf 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -1,5 +1,6 @@ package top.milkbox.pojo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMin; @@ -14,8 +15,8 @@ import java.io.Serializable; * * @author milkbox */ -@Slf4j @Data +@Slf4j @NoArgsConstructor @AllArgsConstructor public class CommonPageParam implements Serializable { @@ -27,13 +28,14 @@ public class CommonPageParam implements Serializable { /** * 当前页 */ - @Schema(title = "当前页码") + @Schema(title = "当前页码", description = "当前页码", example = "1") + @DecimalMin(value = "1", message = "最小页码不能小于1") private Integer current = DEFAULT_CURRENT; /** * 每页条数 */ - @Schema(title = "每页条数") + @Schema(title = "每页条数", description = "每页条数", example = "20") @DecimalMax(value = "100", message = "最大条数不能超过100") @DecimalMin(value = "1", message = "最小条数不能小于1") private Integer size = DEFAULT_SIZE; @@ -41,19 +43,30 @@ public class CommonPageParam implements Serializable { /** * 排序字段 */ - @Schema(title = "排序字段,字段驼峰名称", example = "userName") + @Schema(title = "排序字段", description = "排序字段,字段驼峰名称") private String sortField; /** * 排序方式 */ - @Schema(title = "排序方式,升序:ASC;降序:DESC", example = "ASC", allowableValues = {"ASC", "DESC"}) + @Schema(title = "排序方式", description = "排序方式,升序:ASC;降序:DESC", + example = "ASC", allowableValues = {"ASC", "DESC"}) private CommonSortTypeEnum sortType; /** * 关键词 */ - @Schema(title = "查询关键词") + @Schema(title = "查询关键词", description = "查询关键词") private String searchKey; + /** + * 将当前对象转换为苞米豆的分页对象 + * + * @param entity类型 + * @return 返回苞米豆的分页对象 + */ + public Page toBaomidouPage() { + return new Page<>(getCurrent(), getSize()); + } + } diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java index d5e9379..0469bf7 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java @@ -11,8 +11,8 @@ import java.io.Serializable; /** * 通用响应对象 * - * @author milkbox * @param 响应数据的类型 + * @author milkbox */ @Data @NoArgsConstructor @@ -27,7 +27,7 @@ public class CommonResult implements Serializable { @Schema(title = "操作消息", example = DEFAULT_MESSAGE, defaultValue = DEFAULT_MESSAGE) private String message; - @Schema(title = "返回的数据") + @Schema(description = "返回的数据") private ResultType data; public static CommonResult ok() { diff --git a/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java index 0531a47..f5e093c 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java @@ -14,11 +14,14 @@ import java.util.Date; @Data public class CommonVo implements Serializable { + @Schema(title = "排序字段") + private Integer sortCode; + /** * 创建人 */ @Schema(title = "创建人") - private String createUser; + private Integer createUser; /** * 创建时间 @@ -30,7 +33,7 @@ public class CommonVo implements Serializable { * 更新人 */ @Schema(title = "更新人") - private String updateUser; + private Integer updateUser; /** * 更新时间 diff --git a/milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java b/milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java new file mode 100644 index 0000000..ff805e6 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/utils/CommonUtil.java @@ -0,0 +1,114 @@ +package top.milkbox.utils; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 通用工具 + * 创建时间: 2023-12-04 下午 5:38 + * + * @author milkbox + */ +@Slf4j +public class CommonUtil { + + /** + * 将集合转换为森林 + * + * @param sourceList 要转换的集合,集合中的元素必须实现接口CommonMethodUtil.EntityTree + * @param rootId 以这个值为树的根节点 + * @param id与parentId的数据类型 + * @param 集合中每个元素的类型 + * @return 返回森林 + * @author milkbox + */ + public static > List> toTree( + List sourceList, S rootId) { + // 将OkrNormCategory集合对象转为TreeNode集合对象 + List> treeNodeList = sourceList.stream().map(treeNode -> { + if (ObjectUtil.isEmpty(treeNode.getParentId())) { + log.warn("当前数据不符合规范,上级id不能为空" + treeNode); + } + return new TreeNode<>(treeNode.getId(), treeNode.getParentId(), + treeNode.getName(), null).setExtra(JSONUtil.parseObj(treeNode)); + } + ).collect(Collectors.toList()); + + // 以parentId等于0作为树的根节点,将TreeNode集合对象构建成为森林 + return TreeUtil.build(treeNodeList, rootId); + } + + public interface EntityTree { + + T getId(); + + T getParentId(); + + String getName(); + } + + + /** + * 转为其他类型page,自定义每一项的转换方式 + * + * @param page 原page + * @param converter 自定义每一项转换方式 + * @param 目标page类型 + * @param 原page类型 + * @return 返回转换后的page + * @author milkbox + */ + public static Page convertPage(Page page, Function converter) { + return convertPage(page, page.getRecords().stream().map(converter).collect(Collectors.toList())); + } + + /** + * 转为其他类型page,转换方式为BeanUtil.copyToList + * + * @param page 原page + * @param targetClass 转换后目标每一项的类型.class + * @param 目标page类型 + * @param 原page类型 + * @return 返回转换后的page + * @author milkbox + */ + public static Page convertPage(Page page, Class targetClass) { + return convertPage(page, BeanUtil.copyToList(page.getRecords(), targetClass)); + } + + /** + * 转为其他类型page + * + * @param page 原page + * @param targetRecords 已经转换后的分页数据 + * @param 目标page类型 + * @param 原page类型 + * @return 返回转换后的page + * @author milkbox + */ + private static Page convertPage(Page page, List targetRecords) { + Page targetPage = new Page<>(); + targetPage.setRecords(targetRecords); + targetPage.setTotal(page.getTotal()); + targetPage.setSize(page.getSize()); + targetPage.setCurrent(page.getCurrent()); + targetPage.setOrders(page.orders()); + targetPage.setOptimizeCountSql(page.optimizeCountSql()); + targetPage.setSearchCount(page.searchCount()); + targetPage.setMaxLimit(page.maxLimit()); + targetPage.setCountId(page.countId()); + targetPage.setPages(page.getPages()); + return targetPage; + } + +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java index e15452f..649107c 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java @@ -1,17 +1,23 @@ package top.milkbox.modular.role.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import top.milkbox.modular.role.param.SysRoleAddParam; +import top.milkbox.modular.role.param.SysRoleEditParam; +import top.milkbox.modular.role.param.SysRoleIdParam; import top.milkbox.modular.role.param.SysRolePageParam; import top.milkbox.modular.role.service.SysRoleService; -import top.milkbox.pojo.CommonPageParam; +import top.milkbox.modular.role.vo.SysRoleVo; import top.milkbox.pojo.CommonResult; +import java.util.List; + /** * 角色表(sys_role)控制器 * @@ -26,11 +32,42 @@ public class SysRoleController { private SysRoleService sysRoleService; + @PutMapping("/add") + @Operation(summary = "添加", description = "添加一条数据") + public CommonResult add(@Validated @RequestBody SysRoleAddParam addParam) { + sysRoleService.add(addParam); + return CommonResult.ok(); + } + + @DeleteMapping("/delete") + @Operation(summary = "批量删除") + public CommonResult delete( + @Validated + @RequestBody + @Size(min = 1, message = "请至少传递一个删除对象") + List<@Valid SysRoleIdParam> paramList + ) { + sysRoleService.delete(paramList); + return CommonResult.ok(); + } + + @PutMapping("/edit") + @Operation(summary = "修改", description = "修改一条数据") + public CommonResult edit(@Validated @RequestBody SysRoleEditParam editParam) { + sysRoleService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + public CommonResult detail(@Validated SysRoleIdParam idParam) { + return CommonResult.ok(sysRoleService.detail(idParam)); + } + @GetMapping("/page") @Operation(summary = "分页查询", description = "查询条件分页查询") - public CommonResult page(@Validated SysRolePageParam pageParam) { - sysRoleService.page(pageParam); - return CommonResult.ok(); + public CommonResult> page(@Validated SysRolePageParam pageParam) { + return CommonResult.ok(sysRoleService.page(pageParam)); } } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java index b6e933d..5dc74a7 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java @@ -1,5 +1,7 @@ package top.milkbox.modular.role.entity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -41,6 +43,7 @@ public class SysRoleEntity extends CommonEntity implements Serializable { /** * 角色值 */ + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) @Schema(title = "角色值") private String value; diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java index 9c2fdd3..d506876 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java @@ -1,6 +1,7 @@ package top.milkbox.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -21,13 +22,14 @@ public class SysRoleAddParam implements Serializable { /** * 角色名 */ - @Schema(title = "角色名") + @Schema(title = "角色名", description = "角色名") + @NotBlank(message = "角色名不能为空") private String name; /** * 角色值 */ - @Schema(title = "角色值") + @Schema(title = "角色值", description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java index 53b53fb..7a8feef 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java @@ -1,6 +1,8 @@ package top.milkbox.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -21,19 +23,21 @@ public class SysRoleEditParam implements Serializable { /** * 主键 */ - @Schema(title = "主键") - private String id; + @Schema(title = "主键", description = "主键") + @NotNull(message = "主键id不能为空") + private Integer id; /** * 角色名 */ - @Schema(title = "角色名") + @Schema(title = "角色名", description = "角色名") + @NotBlank(message = "角色名不能为空") private String name; /** * 角色值 */ - @Schema(title = "角色值") + @Schema(title = "角色值", description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java index 494f61a..17539f6 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java @@ -1,6 +1,7 @@ package top.milkbox.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -21,7 +22,8 @@ public class SysRoleIdParam implements Serializable { /** * 主键 */ - @Schema(title = "主键") - private String id; + @Schema(title = "主键", description = "主键") + @NotNull(message = "主键id不能为空") + private Integer id; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java index 77f9123..86002ef 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java @@ -1,8 +1,6 @@ package top.milkbox.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import lombok.*; import top.milkbox.pojo.CommonPageParam; @@ -23,15 +21,13 @@ public class SysRolePageParam extends CommonPageParam implements Serializable { /** * 角色名 */ - @Schema(title = "角色名") - @NotBlank(message = "角色名不能为空") + @Schema(title = "角色名", description = "角色名") private String name; /** * 角色值 */ - @Schema(title = "角色值") - @NotEmpty(message = "角色值不能为空") + @Schema(title = "角色值", description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java index e467af4..d8322c9 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java @@ -48,6 +48,14 @@ public interface SysRoleService extends IService { */ SysRoleVo detail(SysRoleIdParam idParam); + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + SysRoleEntity findEntity(Integer entityId); + /** * 分页查询 * diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java index 4ca2290..b689569 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java @@ -3,7 +3,6 @@ package top.milkbox.modular.role.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,6 +10,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import top.milkbox.enums.CommonSortTypeEnum; +import top.milkbox.exceprion.CommonServiceException; import top.milkbox.modular.role.entity.SysRoleEntity; import top.milkbox.modular.role.mapper.SysRoleMapper; import top.milkbox.modular.role.param.SysRoleAddParam; @@ -19,6 +19,7 @@ import top.milkbox.modular.role.param.SysRoleIdParam; import top.milkbox.modular.role.param.SysRolePageParam; import top.milkbox.modular.role.service.SysRoleService; import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.utils.CommonUtil; import java.util.List; @@ -43,17 +44,32 @@ public class SysRoleServiceImpl extends ServiceImpl paramList) { - + super.removeByIds(paramList.stream().map(SysRoleIdParam::getId).toList()); } @Override public void edit(SysRoleEditParam editParam) { - + findEntity(editParam.getId()); + SysRoleEntity entity = BeanUtil.toBean(editParam, SysRoleEntity.class); + super.updateById(entity); } @Override public SysRoleVo detail(SysRoleIdParam idParam) { - return null; + SysRoleEntity entity = findEntity(idParam.getId()); + SysRoleVo vo = BeanUtil.toBean(entity, SysRoleVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public SysRoleEntity findEntity(Integer entityId) { + SysRoleEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; } @Override @@ -68,10 +84,15 @@ public class SysRoleServiceImpl extends ServiceImpl entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + SysRoleVo vo = BeanUtil.toBean(entity, SysRoleVo.class); + // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... - return null; + return vo; + }); + return voPage; } } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java index c9e06f1..aa92bd6 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/vo/SysRoleVo.java @@ -26,7 +26,7 @@ public class SysRoleVo extends CommonVo implements Serializable { * 主键 */ @Schema(title = "主键") - private String id; + private Integer id; /** * 角色名 diff --git a/pom.xml b/pom.xml index 21d3057..24864b8 100644 --- a/pom.xml +++ b/pom.xml @@ -83,13 +83,6 @@ 3.0.3 - - - - - - - org.springdoc -- Gitee From b7ac8f7aa298cd722ab45f862989e0a5cecaca06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=B3=B3=E8=BE=B0?= <312189607@qq.com> Date: Thu, 18 Jan 2024 15:07:51 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5dot=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=EF=BC=8C=E7=94=9F=E6=88=90log=E6=A8=A1=E5=9D=97=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 + milkbox-app/pom.xml | 8 ++ milkbox-service/pom.xml | 1 + milkbox-service/service-log/pom.xml | 20 +++ .../main/controller/LogMainController.java | 73 ++++++++++ .../modular/main/entity/LogMainEntity.java | 129 ++++++++++++++++++ .../modular/main/mapper/LogMainMapper.java | 16 +++ .../main/mapper/mapping/LogMainMapper.xml | 6 + .../modular/main/param/LogMainAddParam.java | 118 ++++++++++++++++ .../modular/main/param/LogMainEditParam.java | 126 +++++++++++++++++ .../modular/main/param/LogMainIdParam.java | 30 ++++ .../modular/main/param/LogMainPageParam.java | 115 ++++++++++++++++ .../modular/main/service/LogMainService.java | 67 +++++++++ .../main/service/impl/LogMainServiceImpl.java | 99 ++++++++++++++ .../log/modular/main/vo/LogMainVo.java | 125 +++++++++++++++++ .../role/controller/SysRoleController.java | 16 +-- .../modular/role/entity/SysRoleEntity.java | 18 +-- .../modular/role/mapper/SysRoleMapper.java | 6 +- .../role/mapper/mapping/SysRoleMapper.xml | 2 +- .../modular/role/param/SysRoleAddParam.java | 12 +- .../modular/role/param/SysRoleEditParam.java | 19 +-- .../modular/role/param/SysRoleIdParam.java | 9 +- .../modular/role/param/SysRolePageParam.java | 15 +- .../modular/role/service/SysRoleService.java | 16 +-- .../role/service/impl/SysRoleServiceImpl.java | 25 ++-- .../{ => sys}/modular/role/vo/SysRoleVo.java | 13 +- pom.xml | 8 +- 27 files changed, 1029 insertions(+), 69 deletions(-) create mode 100644 milkbox-service/service-log/pom.xml create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/LogMainMapper.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/mapping/LogMainMapper.xml create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainIdParam.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java create mode 100644 milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/controller/SysRoleController.java (83%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/entity/SysRoleEntity.java (67%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/mapper/SysRoleMapper.java (68%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/mapper/mapping/SysRoleMapper.xml (68%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/param/SysRoleAddParam.java (72%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/param/SysRoleEditParam.java (66%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/param/SysRoleIdParam.java (70%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/param/SysRolePageParam.java (58%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/service/SysRoleService.java (76%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/service/impl/SysRoleServiceImpl.java (82%) rename milkbox-service/service-sys/src/main/java/top/milkbox/{ => sys}/modular/role/vo/SysRoleVo.java (71%) diff --git a/README.md b/README.md index bfab33e..4484bd6 100644 --- a/README.md +++ b/README.md @@ -67,3 +67,9 @@ chcp chcp 65001 C:\Users\Administrator\.jdks\openjdk-21.0.1\bin\java -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 --add-opens java.base/sun.util.calendar=ALL-UNNAMED -jar .\milkbox-app-1.0-DEV.jar ``` + +# 新建模块 + +## 在milkbox-service模块下新建模块后需要配置maven的导包依赖 + +在项目根目录下的pom.xml的dependencyManagement中定义新模块的版本,然后在milkbox-app模块中引入新模块 \ No newline at end of file diff --git a/milkbox-app/pom.xml b/milkbox-app/pom.xml index 3b55184..945018b 100644 --- a/milkbox-app/pom.xml +++ b/milkbox-app/pom.xml @@ -18,14 +18,22 @@ + + top.milkbox service-test + top.milkbox service-sys + + + top.milkbox + service-log + diff --git a/milkbox-service/pom.xml b/milkbox-service/pom.xml index f12ce20..c780569 100644 --- a/milkbox-service/pom.xml +++ b/milkbox-service/pom.xml @@ -14,6 +14,7 @@ service-test service-sys + service-log diff --git a/milkbox-service/service-log/pom.xml b/milkbox-service/service-log/pom.xml new file mode 100644 index 0000000..4e0defe --- /dev/null +++ b/milkbox-service/service-log/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + top.milkbox + milkbox-service + 1.0-DEV + + + service-log + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java new file mode 100644 index 0000000..4ae1155 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java @@ -0,0 +1,73 @@ +package top.milkbox.log.modular.main.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import top.milkbox.log.modular.main.param.LogMainAddParam; +import top.milkbox.log.modular.main.param.LogMainEditParam; +import top.milkbox.log.modular.main.param.LogMainIdParam; +import top.milkbox.log.modular.main.param.LogMainPageParam; +import top.milkbox.log.modular.main.service.LogMainService; +import top.milkbox.log.modular.main.vo.LogMainVo; +import top.milkbox.pojo.CommonResult; + +import java.util.List; + +/** + * 日志主表(log_main)控制器 + * + * @author milkbox + * @date 2024-1-18 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/logMain") +@Tag(name = "日志主表控制器", description = "LogMainController") +public class LogMainController { + + private LogMainService logMainService; + + @PutMapping("/add") + @Operation(summary = "添加", description = "添加一条数据") + public CommonResult add(@Validated @RequestBody LogMainAddParam addParam) { + logMainService.add(addParam); + return CommonResult.ok(); + } + + @DeleteMapping("/delete") + @Operation(summary = "批量删除") + public CommonResult delete( + @Validated + @RequestBody + @Size(min = 1, message = "请至少传递一个删除对象") + List<@Valid LogMainIdParam> paramList + ) { + logMainService.delete(paramList); + return CommonResult.ok(); + } + + @PutMapping("/edit") + @Operation(summary = "修改", description = "修改一条数据") + public CommonResult edit(@Validated @RequestBody LogMainEditParam editParam) { + logMainService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + public CommonResult detail(@Validated LogMainIdParam idParam) { + return CommonResult.ok(logMainService.detail(idParam)); + } + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "查询条件分页查询") + public CommonResult> page(@Validated LogMainPageParam pageParam) { + return CommonResult.ok(logMainService.page(pageParam)); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java new file mode 100644 index 0000000..04fb3e5 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/entity/LogMainEntity.java @@ -0,0 +1,129 @@ +package top.milkbox.log.modular.main.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonEntity; + +import java.io.Serializable; + +/** + * 日志_日志主表 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("log_main") +@Schema(description = "LogMainEntity 日志_日志主表。") +public class LogMainEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + */ + @Schema(title = "日志分类", + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") + private String category; + + /** + * 日志名称;对日志做一个简单的描述 + */ + @Schema(title = "日志名称", + description = "日志名称。对日志做一个简单的描述") + private String name; + + /** + * 日志级别;枚举类型,INFO,DEBUG,ERROR等 + */ + @Schema(title = "日志级别", + description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", + example = "'TRACE'", defaultValue = "'TRACE'") + private String level; + + /** + * 执行状态;1表示成功,0表示失败 + */ + @Schema(title = "执行状态", + description = "执行状态。1表示成功,0表示失败。默认值“1”", + example = "1", defaultValue = "1") + private Integer status; + + /** + * 日志的详细描述;如果报错,则保存报错堆栈 + */ + @Schema(title = "日志的详细描述", + description = "日志的详细描述。如果报错,则保存报错堆栈") + private String description; + + /** + * 操作主机地址 + */ + @Schema(title = "操作主机地址", + description = "操作主机地址") + private String operationIp; + + /** + * 操作的浏览器 + */ + @Schema(title = "操作的浏览器", + description = "操作的浏览器") + private String operationBorwser; + + /** + * 操作系统 + */ + @Schema(title = "操作系统", + description = "操作系统") + private String operationSystem; + + /** + * 请求地址;如果是api日志 + */ + @Schema(title = "请求地址", + description = "请求地址。如果是api日志") + private String requestUrl; + + /** + * 请求参数json类型;如果是api日志 + */ + @Schema(title = "请求参数json类型", + description = "请求参数json类型。如果是api日志") + private Object requestBodyJson; + + /** + * 响应对象json类型;如果是api日志 + */ + @Schema(title = "响应对象json类型", + description = "响应对象json类型。如果是api日志") + private Object responseBodyJson; + + /** + * 模块名称 + */ + @Schema(title = "模块名称", + description = "模块名称") + private String module; + + /** + * 类型;枚举 + */ + @Schema(title = "类型", + description = "类型。枚举") + private String type; + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/LogMainMapper.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/LogMainMapper.java new file mode 100644 index 0000000..66a51d6 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/LogMainMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.log.modular.main.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.log.modular.main.entity.LogMainEntity; + +/** + * 日志_日志主表(log_main)表数据库访问层 + * + * @author milkbox + * @date 2024-1-18 + */ +@Mapper +public interface LogMainMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/mapping/LogMainMapper.xml b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/mapping/LogMainMapper.xml new file mode 100644 index 0000000..f19f91c --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/mapper/mapping/LogMainMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java new file mode 100644 index 0000000..5a1fe0f --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainAddParam.java @@ -0,0 +1,118 @@ +package top.milkbox.log.modular.main.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LogMainAddParam implements Serializable { + + /** + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + */ + @Schema(title = "日志分类", + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") + private String category; + + /** + * 日志名称;对日志做一个简单的描述 + */ + @Schema(title = "日志名称", + description = "日志名称。对日志做一个简单的描述") + private String name; + + /** + * 日志级别;枚举类型,INFO,DEBUG,ERROR等 + */ + @Schema(title = "日志级别", + description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", + example = "'TRACE'", defaultValue = "'TRACE'") + @NotBlank(message = "日志级别不能为空") + private String level; + + /** + * 执行状态;1表示成功,0表示失败 + */ + @Schema(title = "执行状态", + description = "执行状态。1表示成功,0表示失败。默认值“1”", + example = "1", defaultValue = "1") + @NotNull(message = "执行状态不能为空") + private Integer status; + + /** + * 日志的详细描述;如果报错,则保存报错堆栈 + */ + @Schema(title = "日志的详细描述", + description = "日志的详细描述。如果报错,则保存报错堆栈") + private String description; + + /** + * 操作主机地址 + */ + @Schema(title = "操作主机地址", + description = "操作主机地址") + private String operationIp; + + /** + * 操作的浏览器 + */ + @Schema(title = "操作的浏览器", + description = "操作的浏览器") + private String operationBorwser; + + /** + * 操作系统 + */ + @Schema(title = "操作系统", + description = "操作系统") + private String operationSystem; + + /** + * 请求地址;如果是api日志 + */ + @Schema(title = "请求地址", + description = "请求地址。如果是api日志") + private String requestUrl; + + /** + * 请求参数json类型;如果是api日志 + */ + @Schema(title = "请求参数json类型", + description = "请求参数json类型。如果是api日志") + private Object requestBodyJson; + + /** + * 响应对象json类型;如果是api日志 + */ + @Schema(title = "响应对象json类型", + description = "响应对象json类型。如果是api日志") + private Object responseBodyJson; + + /** + * 模块名称 + */ + @Schema(title = "模块名称", + description = "模块名称") + private String module; + + /** + * 类型;枚举 + */ + @Schema(title = "类型", + description = "类型。枚举") + private String type; + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java new file mode 100644 index 0000000..629a270 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainEditParam.java @@ -0,0 +1,126 @@ +package top.milkbox.log.modular.main.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LogMainEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + */ + @Schema(title = "日志分类", + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") + private String category; + + /** + * 日志名称;对日志做一个简单的描述 + */ + @Schema(title = "日志名称", + description = "日志名称。对日志做一个简单的描述") + private String name; + + /** + * 日志级别;枚举类型,INFO,DEBUG,ERROR等 + */ + @Schema(title = "日志级别", + description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", + example = "'TRACE'", defaultValue = "'TRACE'") + @NotBlank(message = "日志级别不能为空") + private String level; + + /** + * 执行状态;1表示成功,0表示失败 + */ + @Schema(title = "执行状态", + description = "执行状态。1表示成功,0表示失败。默认值“1”", + example = "1", defaultValue = "1") + @NotNull(message = "执行状态不能为空") + private Integer status; + + /** + * 日志的详细描述;如果报错,则保存报错堆栈 + */ + @Schema(title = "日志的详细描述", + description = "日志的详细描述。如果报错,则保存报错堆栈") + private String description; + + /** + * 操作主机地址 + */ + @Schema(title = "操作主机地址", + description = "操作主机地址") + private String operationIp; + + /** + * 操作的浏览器 + */ + @Schema(title = "操作的浏览器", + description = "操作的浏览器") + private String operationBorwser; + + /** + * 操作系统 + */ + @Schema(title = "操作系统", + description = "操作系统") + private String operationSystem; + + /** + * 请求地址;如果是api日志 + */ + @Schema(title = "请求地址", + description = "请求地址。如果是api日志") + private String requestUrl; + + /** + * 请求参数json类型;如果是api日志 + */ + @Schema(title = "请求参数json类型", + description = "请求参数json类型。如果是api日志") + private Object requestBodyJson; + + /** + * 响应对象json类型;如果是api日志 + */ + @Schema(title = "响应对象json类型", + description = "响应对象json类型。如果是api日志") + private Object responseBodyJson; + + /** + * 模块名称 + */ + @Schema(title = "模块名称", + description = "模块名称") + private String module; + + /** + * 类型;枚举 + */ + @Schema(title = "类型", + description = "类型。枚举") + private String type; + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainIdParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainIdParam.java new file mode 100644 index 0000000..3265880 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.log.modular.main.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 主键参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LogMainIdParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java new file mode 100644 index 0000000..1e60bf6 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/param/LogMainPageParam.java @@ -0,0 +1,115 @@ +package top.milkbox.log.modular.main.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonPageParam; + +import java.io.Serializable; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class LogMainPageParam extends CommonPageParam implements Serializable { + + /** + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + */ + @Schema(title = "日志分类", + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") + private String category; + + /** + * 日志名称;对日志做一个简单的描述 + */ + @Schema(title = "日志名称", + description = "日志名称。对日志做一个简单的描述") + private String name; + + /** + * 日志级别;枚举类型,INFO,DEBUG,ERROR等 + */ + @Schema(title = "日志级别", + description = "日志级别。枚举类型,INFO,DEBUG,ERROR等") + private String level; + + /** + * 执行状态;1表示成功,0表示失败 + */ + @Schema(title = "执行状态", + description = "执行状态。1表示成功,0表示失败") + private Integer status; + + /** + * 日志的详细描述;如果报错,则保存报错堆栈 + */ + @Schema(title = "日志的详细描述", + description = "日志的详细描述。如果报错,则保存报错堆栈") + private String description; + + /** + * 操作主机地址 + */ + @Schema(title = "操作主机地址", + description = "操作主机地址") + private String operationIp; + + /** + * 操作的浏览器 + */ + @Schema(title = "操作的浏览器", + description = "操作的浏览器") + private String operationBorwser; + + /** + * 操作系统 + */ + @Schema(title = "操作系统", + description = "操作系统") + private String operationSystem; + + /** + * 请求地址;如果是api日志 + */ + @Schema(title = "请求地址", + description = "请求地址。如果是api日志") + private String requestUrl; + + /** + * 请求参数json类型;如果是api日志 + */ + @Schema(title = "请求参数json类型", + description = "请求参数json类型。如果是api日志") + private Object requestBodyJson; + + /** + * 响应对象json类型;如果是api日志 + */ + @Schema(title = "响应对象json类型", + description = "响应对象json类型。如果是api日志") + private Object responseBodyJson; + + /** + * 模块名称 + */ + @Schema(title = "模块名称", + description = "模块名称") + private String module; + + /** + * 类型;枚举 + */ + @Schema(title = "类型", + description = "类型。枚举") + private String type; + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java new file mode 100644 index 0000000..7763b47 --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/LogMainService.java @@ -0,0 +1,67 @@ +package top.milkbox.log.modular.main.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.log.modular.main.entity.LogMainEntity; +import top.milkbox.log.modular.main.param.LogMainAddParam; +import top.milkbox.log.modular.main.param.LogMainEditParam; +import top.milkbox.log.modular.main.param.LogMainIdParam; +import top.milkbox.log.modular.main.param.LogMainPageParam; +import top.milkbox.log.modular.main.vo.LogMainVo; + +import java.util.List; + +/** + * 日志_日志主表(log_main)服务层接口 + * + * @author milkbox + * @date 2024-1-18 + */ +public interface LogMainService extends IService { + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(LogMainAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(LogMainEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + LogMainVo detail(LogMainIdParam idParam); + + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + LogMainEntity findEntity(Integer entityId); + + /** + * 分页查询 + * + * @param pageParam 分页查询参数 + * @return 返回苞米豆的分页对象,没有数据,则record长度为0 + */ + Page page(LogMainPageParam pageParam); + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java new file mode 100644 index 0000000..c7e4e1d --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/service/impl/LogMainServiceImpl.java @@ -0,0 +1,99 @@ +package top.milkbox.log.modular.main.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import top.milkbox.enums.CommonSortTypeEnum; +import top.milkbox.exceprion.CommonServiceException; +import top.milkbox.log.modular.main.entity.LogMainEntity; +import top.milkbox.log.modular.main.mapper.LogMainMapper; +import top.milkbox.log.modular.main.param.LogMainAddParam; +import top.milkbox.log.modular.main.param.LogMainEditParam; +import top.milkbox.log.modular.main.param.LogMainIdParam; +import top.milkbox.log.modular.main.param.LogMainPageParam; +import top.milkbox.log.modular.main.service.LogMainService; +import top.milkbox.log.modular.main.vo.LogMainVo; +import top.milkbox.utils.CommonUtil; + +import java.util.List; + +/** + * 日志_日志主表(log_main)服务层实现类 + * + * @author milkbox + * @date 2024-1-18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class LogMainServiceImpl extends ServiceImpl implements LogMainService { + + private LogMainMapper logMainMapper; + + @Override + public void add(LogMainAddParam addParam) { + LogMainEntity entity = BeanUtil.toBean(addParam, LogMainEntity.class); + super.save(entity); + } + + @Override + public void delete(List paramList) { + super.removeByIds(paramList.stream().map(LogMainIdParam::getId).toList()); + } + + @Override + public void edit(LogMainEditParam editParam) { + findEntity(editParam.getId()); + LogMainEntity entity = BeanUtil.toBean(editParam, LogMainEntity.class); + super.updateById(entity); + } + + @Override + public LogMainVo detail(LogMainIdParam idParam) { + LogMainEntity entity = findEntity(idParam.getId()); + LogMainVo vo = BeanUtil.toBean(entity, LogMainVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public LogMainEntity findEntity(Integer entityId) { + LogMainEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; + } + + @Override + public Page page(LogMainPageParam pageParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isAllNotEmpty(pageParam.getSortField(), pageParam.getSortType())) { + queryWrapper.orderBy(true, + pageParam.getSortType() == CommonSortTypeEnum.ASC, + StrUtil.toUnderlineCase(pageParam.getSortField())); + } else { + queryWrapper.lambda().orderByAsc(LogMainEntity::getSortCode); + } + queryWrapper.lambda().orderByAsc(LogMainEntity::getId); + + Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + LogMainVo vo = BeanUtil.toBean(entity, LogMainVo.class); + // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + }); + return voPage; + } + +} \ No newline at end of file diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java new file mode 100644 index 0000000..9fc998f --- /dev/null +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/vo/LogMainVo.java @@ -0,0 +1,125 @@ +package top.milkbox.log.modular.main.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.pojo.CommonVo; + +import java.io.Serializable; + +/** + * 日志_日志主表默认vo + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "LogMainEntity 日志_日志主表。") +public class LogMainVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 日志分类;暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下 + */ + @Schema(title = "日志分类", + description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method,具体还要考虑一下") + private String category; + + /** + * 日志名称;对日志做一个简单的描述 + */ + @Schema(title = "日志名称", + description = "日志名称。对日志做一个简单的描述") + private String name; + + /** + * 日志级别;枚举类型,INFO,DEBUG,ERROR等 + */ + @Schema(title = "日志级别", + description = "日志级别。枚举类型,INFO,DEBUG,ERROR等。默认值“'TRACE'”", + example = "'TRACE'", defaultValue = "'TRACE'") + private String level; + + /** + * 执行状态;1表示成功,0表示失败 + */ + @Schema(title = "执行状态", + description = "执行状态。1表示成功,0表示失败。默认值“1”", + example = "1", defaultValue = "1") + private Integer status; + + /** + * 日志的详细描述;如果报错,则保存报错堆栈 + */ + @Schema(title = "日志的详细描述", + description = "日志的详细描述。如果报错,则保存报错堆栈") + private String description; + + /** + * 操作主机地址 + */ + @Schema(title = "操作主机地址", + description = "操作主机地址") + private String operationIp; + + /** + * 操作的浏览器 + */ + @Schema(title = "操作的浏览器", + description = "操作的浏览器") + private String operationBorwser; + + /** + * 操作系统 + */ + @Schema(title = "操作系统", + description = "操作系统") + private String operationSystem; + + /** + * 请求地址;如果是api日志 + */ + @Schema(title = "请求地址", + description = "请求地址。如果是api日志") + private String requestUrl; + + /** + * 请求参数json类型;如果是api日志 + */ + @Schema(title = "请求参数json类型", + description = "请求参数json类型。如果是api日志") + private Object requestBodyJson; + + /** + * 响应对象json类型;如果是api日志 + */ + @Schema(title = "响应对象json类型", + description = "响应对象json类型。如果是api日志") + private Object responseBodyJson; + + /** + * 模块名称 + */ + @Schema(title = "模块名称", + description = "模块名称") + private String module; + + /** + * 类型;枚举 + */ + @Schema(title = "类型", + description = "类型。枚举") + private String type; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java similarity index 83% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java index 649107c..1c2bbe7 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/controller/SysRoleController.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java @@ -1,4 +1,4 @@ -package top.milkbox.modular.role.controller; +package top.milkbox.sys.modular.role.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; @@ -8,12 +8,12 @@ import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import top.milkbox.modular.role.param.SysRoleAddParam; -import top.milkbox.modular.role.param.SysRoleEditParam; -import top.milkbox.modular.role.param.SysRoleIdParam; -import top.milkbox.modular.role.param.SysRolePageParam; -import top.milkbox.modular.role.service.SysRoleService; -import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.sys.modular.role.param.SysRoleAddParam; +import top.milkbox.sys.modular.role.param.SysRoleEditParam; +import top.milkbox.sys.modular.role.param.SysRoleIdParam; +import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.service.SysRoleService; +import top.milkbox.sys.modular.role.vo.SysRoleVo; import top.milkbox.pojo.CommonResult; import java.util.List; @@ -22,7 +22,7 @@ import java.util.List; * 角色表(sys_role)控制器 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @RestController @AllArgsConstructor diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java similarity index 67% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java index 5dc74a7..08bec08 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/entity/SysRoleEntity.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java @@ -1,7 +1,5 @@ -package top.milkbox.modular.role.entity; +package top.milkbox.sys.modular.role.entity; -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -17,7 +15,7 @@ import java.io.Serializable; * 系统_角色表 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Data @NoArgsConstructor @@ -31,20 +29,22 @@ public class SysRoleEntity extends CommonEntity implements Serializable { * 主键 */ @TableId - @Schema(title = "主键") - private String id; + @Schema(title = "主键", + description = "主键") + private Integer id; /** * 角色名 */ - @Schema(title = "角色名") + @Schema(title = "角色名", + description = "角色名") private String name; /** * 角色值 */ - @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) - @Schema(title = "角色值") + @Schema(title = "角色值", + description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java similarity index 68% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java index 1a405a3..e31a552 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/SysRoleMapper.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java @@ -1,14 +1,14 @@ -package top.milkbox.modular.role.mapper; +package top.milkbox.sys.modular.role.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import top.milkbox.modular.role.entity.SysRoleEntity; +import top.milkbox.sys.modular.role.entity.SysRoleEntity; /** * 系统_角色表(sys_role)表数据库访问层 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Mapper public interface SysRoleMapper extends BaseMapper { diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/mapping/SysRoleMapper.xml similarity index 68% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/mapping/SysRoleMapper.xml index 82f3354..dcc30d5 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/mapper/mapping/SysRoleMapper.xml +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/mapping/SysRoleMapper.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java similarity index 72% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java index d506876..abf79e1 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleAddParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java @@ -1,18 +1,18 @@ -package top.milkbox.modular.role.param; +package top.milkbox.sys.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.Serializable; +import jakarta.validation.constraints.NotBlank; /** * 添加参数对象 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Data @NoArgsConstructor @@ -22,14 +22,16 @@ public class SysRoleAddParam implements Serializable { /** * 角色名 */ - @Schema(title = "角色名", description = "角色名") + @Schema(title = "角色名", + description = "角色名") @NotBlank(message = "角色名不能为空") private String name; /** * 角色值 */ - @Schema(title = "角色值", description = "角色值") + @Schema(title = "角色值", + description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java similarity index 66% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java index 7a8feef..8b17553 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleEditParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java @@ -1,19 +1,19 @@ -package top.milkbox.modular.role.param; +package top.milkbox.sys.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.io.Serializable; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; /** * 编辑参数对象 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Data @NoArgsConstructor @@ -23,21 +23,24 @@ public class SysRoleEditParam implements Serializable { /** * 主键 */ - @Schema(title = "主键", description = "主键") - @NotNull(message = "主键id不能为空") + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") private Integer id; /** * 角色名 */ - @Schema(title = "角色名", description = "角色名") + @Schema(title = "角色名", + description = "角色名") @NotBlank(message = "角色名不能为空") private String name; /** * 角色值 */ - @Schema(title = "角色值", description = "角色值") + @Schema(title = "角色值", + description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java similarity index 70% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java index 17539f6..c0e1fe1 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRoleIdParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java @@ -1,4 +1,4 @@ -package top.milkbox.modular.role.param; +package top.milkbox.sys.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -12,7 +12,7 @@ import java.io.Serializable; * 主键参数对象 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Data @NoArgsConstructor @@ -22,8 +22,9 @@ public class SysRoleIdParam implements Serializable { /** * 主键 */ - @Schema(title = "主键", description = "主键") - @NotNull(message = "主键id不能为空") + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") private Integer id; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java similarity index 58% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java index 86002ef..33d1e84 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/param/SysRolePageParam.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java @@ -1,7 +1,10 @@ -package top.milkbox.modular.role.param; +package top.milkbox.sys.modular.role.param; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import top.milkbox.pojo.CommonPageParam; import java.io.Serializable; @@ -10,7 +13,7 @@ import java.io.Serializable; * 分页参数对象 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Data @NoArgsConstructor @@ -21,13 +24,15 @@ public class SysRolePageParam extends CommonPageParam implements Serializable { /** * 角色名 */ - @Schema(title = "角色名", description = "角色名") + @Schema(title = "角色名", + description = "角色名") private String name; /** * 角色值 */ - @Schema(title = "角色值", description = "角色值") + @Schema(title = "角色值", + description = "角色值") private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java similarity index 76% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java index d8322c9..223219f 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/SysRoleService.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -1,13 +1,13 @@ -package top.milkbox.modular.role.service; +package top.milkbox.sys.modular.role.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import top.milkbox.modular.role.entity.SysRoleEntity; -import top.milkbox.modular.role.param.SysRoleAddParam; -import top.milkbox.modular.role.param.SysRoleEditParam; -import top.milkbox.modular.role.param.SysRoleIdParam; -import top.milkbox.modular.role.param.SysRolePageParam; -import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.sys.modular.role.entity.SysRoleEntity; +import top.milkbox.sys.modular.role.param.SysRoleAddParam; +import top.milkbox.sys.modular.role.param.SysRoleEditParam; +import top.milkbox.sys.modular.role.param.SysRoleIdParam; +import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.vo.SysRoleVo; import java.util.List; @@ -15,7 +15,7 @@ import java.util.List; * 系统_角色表(sys_role)服务层接口 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ public interface SysRoleService extends IService { diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java similarity index 82% rename from milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java rename to milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java index b689569..ed83f85 100644 --- a/milkbox-service/service-sys/src/main/java/top/milkbox/modular/role/service/impl/SysRoleServiceImpl.java +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -1,4 +1,4 @@ -package top.milkbox.modular.role.service.impl; +package top.milkbox.sys.modular.role.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; @@ -11,14 +11,14 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import top.milkbox.enums.CommonSortTypeEnum; import top.milkbox.exceprion.CommonServiceException; -import top.milkbox.modular.role.entity.SysRoleEntity; -import top.milkbox.modular.role.mapper.SysRoleMapper; -import top.milkbox.modular.role.param.SysRoleAddParam; -import top.milkbox.modular.role.param.SysRoleEditParam; -import top.milkbox.modular.role.param.SysRoleIdParam; -import top.milkbox.modular.role.param.SysRolePageParam; -import top.milkbox.modular.role.service.SysRoleService; -import top.milkbox.modular.role.vo.SysRoleVo; +import top.milkbox.sys.modular.role.entity.SysRoleEntity; +import top.milkbox.sys.modular.role.mapper.SysRoleMapper; +import top.milkbox.sys.modular.role.param.SysRoleAddParam; +import top.milkbox.sys.modular.role.param.SysRoleEditParam; +import top.milkbox.sys.modular.role.param.SysRoleIdParam; +import top.milkbox.sys.modular.role.param.SysRolePageParam; +import top.milkbox.sys.modular.role.service.SysRoleService; +import top.milkbox.sys.modular.role.vo.SysRoleVo; import top.milkbox.utils.CommonUtil; import java.util.List; @@ -27,7 +27,7 @@ import java.util.List; * 系统_角色表(sys_role)服务层实现类 * * @author milkbox - * @date 2024-1-2 + * @date 2024-1-18 */ @Slf4j @Service @@ -38,8 +38,8 @@ public class SysRoleServiceImpl extends ServiceImpl 1.0-DEV - 5.8.24 + 5.8.25 1.2.20 3.5.5 2.2.0 @@ -165,6 +165,12 @@ service-sys ${milkbox.version} + + + top.milkbox + service-log + ${milkbox.version} + -- Gitee