diff --git a/README.md b/README.md index 39a7238c6c865b350ee497a13e758a5371be47f7..4484bd627483516f05f6850358cb32325ed958f2 100644 --- a/README.md +++ b/README.md @@ -54,10 +54,22 @@ java21的bin目录/java -jar jar包目录/jar包名称.jar --add-opens java.base # 打包与启动 +启动时需要添加环境变量,如下图所示 + +![image-20240112111124776](img/image-20240112111124776.png) + 启动命令参考 +win + ```bash 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/img/image-20240112111124776.png b/img/image-20240112111124776.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9cb81c88952bebe5989b8820ba38ca31c0ead2 Binary files /dev/null and b/img/image-20240112111124776.png differ diff --git a/milkbox-app/pom.xml b/milkbox-app/pom.xml index 8b16f0e473529bebf6cad3facfe1baad36875034..945018ba22ecf9391cd5756b1f3e47de54efafbe 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-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java index 7bb7eb338b2dc936a96787db8b86bfd5c5dc0125..2b378d43f113275eaa40036bed74ace3f8787486 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 { @@ -25,7 +31,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())); @@ -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/config/MybatisPlusConfig.java b/milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6b5c37f982a0bf4d8fd8720cb8f945c140db2d3d --- /dev/null +++ b/milkbox-app/src/main/java/top/milkbox/core/config/MybatisPlusConfig.java @@ -0,0 +1,32 @@ +package top.milkbox.core.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 创建时间: 2024-01-15 下午 5:49 + * + * @author milkbox + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 添加分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 其他插件... + + + // 如果配置多个插件,切记分页最后添加 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + // 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType + // interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } +} 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 0000000000000000000000000000000000000000..cb7a5310bb043f5caf6edbd6078f805e8a8fb952 --- /dev/null +++ b/milkbox-app/src/main/java/top/milkbox/core/handler/GlobalControllerAdvice.java @@ -0,0 +1,97 @@ +package top.milkbox.core.handler; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.ui.Model; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.method.annotation.HandlerMethodValidationException; +import top.milkbox.enums.CommonStatusCodeEnum; +import top.milkbox.exceprion.CommonServiceException; +import top.milkbox.pojo.CommonResult; + +import java.util.Arrays; + +/** + * 全局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 errorResponse) { + StringBuilder errorMessage = new StringBuilder(); + errorResponse.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)); + } + + // 在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 0000000000000000000000000000000000000000..6e45b9bb5228380b53f2fd9d7988ec59335b7539 --- /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 3d6fa7bc275ef1364ab0f2721283b5c368ff5f84..ca9e211f019abade288818ef78047d2fadf03307 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/Main.java b/milkbox-common/src/main/java/top/milkbox/Main.java deleted file mode 100644 index 332886651597813b800022dbc8d6696569279336..0000000000000000000000000000000000000000 --- 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/enums/CommonDeleteFlagEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..824a6d65bc0dd927c07c15d713adc8db80812c9f --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonDeleteFlagEnum.java @@ -0,0 +1,23 @@ +package top.milkbox.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import lombok.AllArgsConstructor; + +/** + * 删除标志枚举,1表示删除,0表示未删除 + * + * @author milkbox + */ +//@Getter +@AllArgsConstructor +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/CommonSortTypeEnum.java b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..83c8678fa68ff5280a999e6317b36479f93b36ac --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonSortTypeEnum.java @@ -0,0 +1,37 @@ +package top.milkbox.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import top.milkbox.exceprion.CommonServiceException; + +/** + * 排序方式枚举 + * + * @author milkbox + */ +@Getter +@AllArgsConstructor +public enum CommonSortTypeEnum { + /** + * 升序 + */ + ASC("ASC"), + /** + * 降序 + */ + 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 new file mode 100644 index 0000000000000000000000000000000000000000..57de6960ffeaf2e8a6e6a9b019a38fc597cc98dd --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/enums/CommonStatusCodeEnum.java @@ -0,0 +1,26 @@ +package top.milkbox.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 状态码枚举 + * 可参考类:cn.hutool.http.HttpStatus + * + * @author milkbox + */ +@Getter +@AllArgsConstructor +public enum CommonStatusCodeEnum { + OK200("200", "请求成功"), + ERROR401("401", "未登录"), + ERROR403("403", "无权限"), + ERROR404("404", "路径不存在"), + ERROR405("405", "请求方法不正确"), + 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 0000000000000000000000000000000000000000..f162588fa9ec088ef057c513a8596e103a7c665d --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/exceprion/CommonServiceException.java @@ -0,0 +1,26 @@ +package top.milkbox.exceprion; + +import cn.hutool.core.util.StrUtil; + +/** + * 自定义服务异常 + * 一般用于业务逻辑中出现的业务错误,返回给前端提示 + * 创建时间: 2024-01-08 下午 4:39 + * + * @author milkbox + */ +public class CommonServiceException extends RuntimeException { + + + public CommonServiceException() { + super("未知业务逻辑异常"); + } + + 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/CommonEntity.java b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java index ea887ac3c6326663c00d27f972d81f722f0b52e3..b423847ea2750032a548732e3cc35e2c3e3cd624 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonEntity.java @@ -1,11 +1,20 @@ 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; import java.io.Serializable; import java.util.Date; +/** + * 公共entity字段 + * + * @author milkbox + */ @Data public class CommonEntity implements Serializable { @@ -18,30 +27,37 @@ public class CommonEntity implements Serializable { /** * 删除标志(NOT_DELETE;DELETED) */ - @Schema(title = "删除标志(NOT_DELETE;DELETED)") - private String deleteFlag; + @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 new file mode 100644 index 0000000000000000000000000000000000000000..14834bfdd47e9876c43b57ed6e9248e661f54a0e --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonPageParam.java @@ -0,0 +1,72 @@ +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; +import lombok.*; +import lombok.extern.slf4j.Slf4j; +import top.milkbox.enums.CommonSortTypeEnum; + +import java.io.Serializable; + +/** + * 公共分页对象 + * + * @author milkbox + */ +@Data +@Slf4j +@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 = "当前页码", description = "当前页码", example = "1") + @DecimalMin(value = "1", message = "最小页码不能小于1") + private Integer current = DEFAULT_CURRENT; + + /** + * 每页条数 + */ + @Schema(title = "每页条数", description = "每页条数", example = "20") + @DecimalMax(value = "100", message = "最大条数不能超过100") + @DecimalMin(value = "1", message = "最小条数不能小于1") + private Integer size = DEFAULT_SIZE; + + /** + * 排序字段 + */ + @Schema(title = "排序字段", description = "排序字段,字段驼峰名称") + private String sortField; + + /** + * 排序方式 + */ + @Schema(title = "排序方式", description = "排序方式,升序:ASC;降序:DESC", + example = "ASC", allowableValues = {"ASC", "DESC"}) + private CommonSortTypeEnum sortType; + + /** + * 关键词 + */ + @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 0969c66a70a97f0d9cd4264a5eeae1b8bb2e08e7..0469bf7204071f28d9a6c3bd82abc4aba85a657e 100644 --- a/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonResult.java @@ -4,9 +4,16 @@ 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; +/** + * 通用响应对象 + * + * @param 响应数据的类型 + * @author milkbox + */ @Data @NoArgsConstructor @AllArgsConstructor @@ -20,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() { @@ -28,6 +35,18 @@ public class CommonResult implements Serializable { } public static CommonResult ok(ResultType data) { - return new CommonResult<>("200", 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-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 0000000000000000000000000000000000000000..f5e093c515c57b941a8a799ff680a3c1e64fee10 --- /dev/null +++ b/milkbox-common/src/main/java/top/milkbox/pojo/CommonVo.java @@ -0,0 +1,43 @@ +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 Integer sortCode; + + /** + * 创建人 + */ + @Schema(title = "创建人") + private Integer createUser; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private Date createTime; + + /** + * 更新人 + */ + @Schema(title = "更新人") + private Integer updateUser; + + /** + * 更新时间 + */ + @Schema(title = "更新时间") + private Date updateTime; +} 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 0000000000000000000000000000000000000000..ff805e6a40965f1fc336d16a758907b3f0200bbe --- /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/pom.xml b/milkbox-service/pom.xml index d5ab973b112e100b4c2c6bfb73ebd370e6f8df30..c780569c381e777c1c7695746ae718862906a180 100644 --- a/milkbox-service/pom.xml +++ b/milkbox-service/pom.xml @@ -13,6 +13,8 @@ pom 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 0000000000000000000000000000000000000000..4e0defef4a76131f191b5e0d5557d9afbfcefbed --- /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 0000000000000000000000000000000000000000..4ae1155e5fee8b2d13d4ec5f8c9ae7fbecc07723 --- /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 0000000000000000000000000000000000000000..04fb3e53bbcc6c1c740ab50df560cfbb86e4c8d3 --- /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 0000000000000000000000000000000000000000..66a51d691782ef5490f2d6dff73a17251311e247 --- /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 0000000000000000000000000000000000000000..f19f91c104cd9a9ebb24dd51f6271b1d64d8dcf5 --- /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 0000000000000000000000000000000000000000..5a1fe0f964967346dc96ee16e13b7970d7e9afad --- /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 0000000000000000000000000000000000000000..629a270e370ca4a3e216462a97d561635caf4951 --- /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 0000000000000000000000000000000000000000..32658804712127945e40b7678c429c7e2f21e923 --- /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 0000000000000000000000000000000000000000..1e60bf675ca08ff510787cf5751b15b3bb03c0e0 --- /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 0000000000000000000000000000000000000000..7763b47e9ec7caf081c2e0a5a877816b0fa43545 --- /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 0000000000000000000000000000000000000000..c7e4e1dcf7d2bf8eafad5efbc693054a16c28b86 --- /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 0000000000000000000000000000000000000000..9fc998f64c84acf1276963181b94e3960bcff081 --- /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/pom.xml b/milkbox-service/service-sys/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..224fa2e116fc8a829a2796afcd0d121cb792ba9a --- /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/sys/modular/role/controller/SysRoleController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..1c2bbe7aff50049a930d9521d4c8449c2c6d790a --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/controller/SysRoleController.java @@ -0,0 +1,73 @@ +package top.milkbox.sys.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.*; +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; + +/** + * 角色表(sys_role)控制器 + * + * @author milkbox + * @date 2024-1-18 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sysRole") +@Tag(name = "角色表控制器", description = "SysRoleController") +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) { + return CommonResult.ok(sysRoleService.page(pageParam)); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..08bec08003488ef3532fc27b4166b2724b06f7bf --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/entity/SysRoleEntity.java @@ -0,0 +1,50 @@ +package top.milkbox.sys.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; + +/** + * 系统_角色表 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +@Schema(description = "SysRoleEntity 系统_角色表。") +public class SysRoleEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 角色名 + */ + @Schema(title = "角色名", + description = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值", + description = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..e31a55213f0799017cd422b79412f5231dc57f0e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/SysRoleMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.role.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.sys.modular.role.entity.SysRoleEntity; + +/** + * 系统_角色表(sys_role)表数据库访问层 + * + * @author milkbox + * @date 2024-1-18 + */ +@Mapper +public interface SysRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/mapping/SysRoleMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/mapper/mapping/SysRoleMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..dcc30d52f8ce97332d31d4d26e7330ebde5749fe --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/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/sys/modular/role/param/SysRoleAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java new file mode 100644 index 0000000000000000000000000000000000000000..abf79e11a0f2a5f79d78381218366493a0b35c97 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleAddParam.java @@ -0,0 +1,37 @@ +package top.milkbox.sys.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 jakarta.validation.constraints.NotBlank; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleAddParam implements Serializable { + + /** + * 角色名 + */ + @Schema(title = "角色名", + description = "角色名") + @NotBlank(message = "角色名不能为空") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值", + description = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java new file mode 100644 index 0000000000000000000000000000000000000000..8b1755341f64bf9c205ecb8b43a683a6d2efd184 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleEditParam.java @@ -0,0 +1,46 @@ +package top.milkbox.sys.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 jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 角色名 + */ + @Schema(title = "角色名", + description = "角色名") + @NotBlank(message = "角色名不能为空") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值", + description = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java new file mode 100644 index 0000000000000000000000000000000000000000..c0e1fe117280b7cf22a098deb325789f58b9150f --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRoleIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.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; + +import java.io.Serializable; + +/** + * 主键参数对象 + * + * @author milkbox + * @date 2024-1-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleIdParam implements Serializable { + + /** + * 主键 + */ + @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/sys/modular/role/param/SysRolePageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java new file mode 100644 index 0000000000000000000000000000000000000000..33d1e846a0721c7c583e983426518d92073b468a --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/param/SysRolePageParam.java @@ -0,0 +1,38 @@ +package top.milkbox.sys.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-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysRolePageParam extends CommonPageParam implements Serializable { + + /** + * 角色名 + */ + @Schema(title = "角色名", + description = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值", + description = "角色值") + private String value; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java new file mode 100644 index 0000000000000000000000000000000000000000..223219fbc017ed2eb24450ca8d3bf3caa938f39c --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/SysRoleService.java @@ -0,0 +1,67 @@ +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.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; + +/** + * 系统_角色表(sys_role)服务层接口 + * + * @author milkbox + * @date 2024-1-18 + */ +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 entityId 实体id + * @return 返回实体 + */ + SysRoleEntity findEntity(Integer entityId); + + /** + * 分页查询 + * + * @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/sys/modular/role/service/impl/SysRoleServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..ed83f857f1b2d4eaf3a59b7542f1834133c8488e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,99 @@ +package top.milkbox.sys.modular.role.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.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; + +/** + * 系统_角色表(sys_role)服务层实现类 + * + * @author milkbox + * @date 2024-1-18 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + + private SysRoleMapper sysRoleMapper; + + @Override + public void add(SysRoleAddParam addParam) { + SysRoleEntity entity = BeanUtil.toBean(addParam, SysRoleEntity.class); + super.save(entity); + } + + @Override + public void delete(List 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) { + 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 + 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); + + Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + SysRoleVo vo = BeanUtil.toBean(entity, SysRoleVo.class); + // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + }); + return voPage; + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java new file mode 100644 index 0000000000000000000000000000000000000000..4d88f67e9a020077858284070b887199460101b3 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/role/vo/SysRoleVo.java @@ -0,0 +1,46 @@ +package top.milkbox.sys.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-18 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysRoleEntity 系统_角色表。") +public class SysRoleVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 角色名 + */ + @Schema(title = "角色名", + description = "角色名") + private String name; + + /** + * 角色值 + */ + @Schema(title = "角色值", + description = "角色值") + 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 89cd28a50b01acda63928b29c7a9df3a180616ff..838d031ff6c65edc91fde89d34d26eacfc8eaf80 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; /** @@ -17,7 +18,7 @@ import top.milkbox.pojo.CommonResult; */ @RestController @RequestMapping("/test") -@Tag(name = "TestController", description = "测试控制器") +@Tag(name = "测试控制器", description = "TestController") public class TestController { @GetMapping("/test") @@ -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 a56b0313cb16b250d0e20d06b7b8c9ba511218ac..2074c6318d0a6572fb8154bcfe886d91e6a4b7b9 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,12 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-starter-validation + + @@ -51,7 +57,7 @@ com.alibaba druid-spring-boot-starter - 1.2.20 + ${druid.version} @@ -59,20 +65,29 @@ com.baomidou mybatis-plus-boot-starter - 3.5.5 + ${mybatis-plus.version} + + + + + org.mybatis + mybatis-spring + + + + + + + org.mybatis + mybatis-spring + 3.0.3 - - - - - - org.springdoc springdoc-openapi-starter-webmvc-ui - 2.2.0 + ${springdoc.version} @@ -84,7 +99,7 @@ com.mysql mysql-connector-j - 8.2.0 + ${mysql-connector.version} @@ -117,8 +132,11 @@ 1.0-DEV - 5.8.24 - 3.0.0 + 5.8.25 + 1.2.20 + 3.5.5 + 2.2.0 + 8.2.0 @@ -127,7 +145,7 @@ top.milkbox milkbox-common - 1.0-DEV + ${milkbox.version} @@ -141,6 +159,18 @@ service-test ${milkbox.version} + + + top.milkbox + service-sys + ${milkbox.version} + + + + top.milkbox + service-log + ${milkbox.version} +