diff --git a/README.md b/README.md index 4484bd627483516f05f6850358cb32325ed958f2..445a3660c99b079a56329ed980b551fe4eeea203 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,15 @@ java21的bin目录/java -jar jar包目录/jar包名称.jar --add-opens java.base ![image-20240112111124776](img/image-20240112111124776.png) +主要包含的环境变量 + +```bash +DB_HOST=localhost +DB_PASSWORD=xxxx +DB_PORT=3306 +DB_USERNAME=root +``` + 启动命令参考 win diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java b/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java index 56ad6b7767f6971df4f4b7dafdef459e213d0400..8b8c75127faa948583b5fa89a9bc2bdaaf8961fb 100644 --- a/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/config/CommonConfiguration.java @@ -3,6 +3,6 @@ package top.milkbox.app.core.config; import org.springframework.context.annotation.Configuration; @Configuration -public class CommonConfiguration { +public class CommonConfiguration { } diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java b/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfiguration.java similarity index 96% rename from milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java rename to milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfiguration.java index f17188ed2f6ed2bd4e04fdea3ab568031d8c9811..3281b82449a09890f8f0be80da084af05cafafca 100644 --- a/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfig.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/config/MybatisPlusConfiguration.java @@ -12,7 +12,7 @@ import org.springframework.context.annotation.Configuration; * @author milkbox */ @Configuration -public class MybatisPlusConfig { +public class MybatisPlusConfiguration { /** * 添加分页插件 diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/config/SaTokenConfiguration.java b/milkbox-app/src/main/java/top/milkbox/app/core/config/SaTokenConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..92544a65cb9dd92ae3e68d3aebf5be180570a405 --- /dev/null +++ b/milkbox-app/src/main/java/top/milkbox/app/core/config/SaTokenConfiguration.java @@ -0,0 +1,17 @@ +package top.milkbox.app.core.config; + +import cn.dev33.satoken.interceptor.SaInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SaTokenConfiguration implements WebMvcConfigurer { + + // 注册 Sa-Token 拦截器,打开注解式鉴权功能 + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册 Sa-Token 拦截器,打开注解式鉴权功能 + registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**"); + } +} diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java b/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java index 1636594adfd1f2ed6db27fb68f3c28450b23e440..b0c6d645400f56959bc4b742c1fd45aa2798ce6f 100644 --- a/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java +++ b/milkbox-app/src/main/java/top/milkbox/app/core/handler/GlobalControllerAdvice.java @@ -1,5 +1,6 @@ package top.milkbox.app.core.handler; +import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -40,7 +41,13 @@ public class GlobalControllerAdvice { } /** - * 全局异常捕捉,在此处进行处理 + * 全局异常捕捉,在此处进行处理
+ * 打印日志堆栈的方式(Exception e):
+ * * * @param exception 捕获到的异常 * @return 通用响应对象 @@ -49,8 +56,23 @@ public class GlobalControllerAdvice { @ExceptionHandler(value = Exception.class) public CommonResult errorHandler(Exception exception) { + // 服务层业务逻辑异常 + if (exception instanceof CommonServiceException commonServiceException) { + return new CommonResult<>(CommonStatusCodeEnum.ERROR506.getCode(), + CommonStatusCodeEnum.ERROR506.getMessage(), commonServiceException.getMessage()); + } + + // 用户未登录异常处理 + // 可以通过notLoginException的type属性来区分未登录的类型 + // 具体信息请查看cn.dev33.satoken.exception.NotLoginException + else if (exception instanceof NotLoginException notLoginException) { + notLoginException.setStackTrace(new StackTraceElement[0]); // 删除堆栈信息,因为它太长了 + return new CommonResult<>(CommonStatusCodeEnum.ERROR401.getCode(), + notLoginException.getMessage(), notLoginException); + } + // 后端校验不通过异常 - if (exception instanceof MethodArgumentNotValidException errorResponse) { + else if (exception instanceof MethodArgumentNotValidException errorResponse) { StringBuilder errorMessage = new StringBuilder(); errorResponse.getAllErrors() .forEach(objectError -> errorMessage.append(objectError.getDefaultMessage()).append(StrUtil.COMMA)); @@ -74,12 +96,6 @@ public class GlobalControllerAdvice { 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() + ")"; @@ -92,6 +108,6 @@ public class GlobalControllerAdvice { log.error("其他未处理异常:{}", exception.getMessage(), exception); // exception.printStackTrace(); // 系统控制台堆栈,可能不会存入日志 return new CommonResult<>(CommonStatusCodeEnum.ERROR500.getCode(), - CommonStatusCodeEnum.ERROR500.getMessage(), exception.toString()); + CommonStatusCodeEnum.ERROR500.getMessage(), exception.getStackTrace()); } } diff --git a/milkbox-app/src/main/resources/application.yml b/milkbox-app/src/main/resources/application.yml index ca9e211f019abade288818ef78047d2fadf03307..340e1942b5dd7fbf2d45e7ff858f68357bb0093f 100644 --- a/milkbox-app/src/main/resources/application.yml +++ b/milkbox-app/src/main/resources/application.yml @@ -1,24 +1,52 @@ server: port: 9990 +############## springdoc文档配置 ############## springdoc: swagger-ui: path: "/doc.html" spring: + ############## 数据库配置 ############## datasource: # 主机地址、用户名和密码请配置环境变量 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${DB_HOST}:13306/milkbox2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true + url: jdbc:mysql://${DB_HOST}:${DB_PORT}/milkbox2?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true type: com.alibaba.druid.pool.DruidDataSource username: ${DB_USERNAME} password: ${DB_PASSWORD} + data: + ############## redis连接池配置 ############## + # 注:springboot3的redis配置必须放到data节点下 + redis: + # Redis数据库索引(默认为0) + database: 6 + # Redis服务器地址 + host: 127.0.0.1 + # Redis服务器连接端口 + port: 6379 + # Redis服务器连接密码(默认为空) + password: 123456 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池最大连接数 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 连接池中的最大空闲连接 + max-idle: 10 + # 连接池中的最小空闲连接 + min-idle: 0 + +############## mybatis-plus配置 ############## mybatis-plus: configuration: # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段 jdbc-type-for-null: null - # mybatis-plus的日志(开启后控制台打印的内容非常多) + # mybatis-plus的日志(开启后控制台打印的内容非常多。生产环境请禁止,输出日志会导致性能下降和隐私泄露) log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: banner: false @@ -34,3 +62,19 @@ mybatis-plus: type-aliases-package: top.milkbox.**.entity;top.milkbox.**.param;top.milkbox.**.vo +############## Sa-Token配置 (文档: https://sa-token.cc) ############## +sa-token: + # token 名称(同时也是浏览器中cookie的名称) + token-name: sa-token + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: random-32 + # 是否输出操作日志(生产环境请禁止,输出日志会导致性能下降和隐私泄露) + is-log: true diff --git a/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java b/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java index a093ef229cd98fa72e80c90448a0d4ec8d01b7f9..cca6809549be9804e5dcbbdf4441295829798814 100644 --- a/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java +++ b/milkbox-common/src/main/java/top/milkbox/common/annotation/CommonLog.java @@ -6,6 +6,7 @@ import top.milkbox.common.enums.LogTypeEnum; import java.lang.annotation.*; /** + * 日志注解 * 创建时间: 2024-01-19 下午 2:06 * * @author milkbox @@ -43,4 +44,21 @@ public @interface CommonLog { * @return 默认返回空 */ LogTypeEnum type() default LogTypeEnum.NOT; + + /** + * 是否保存函数的参数
+ * 在某些涉密操作中,可将此值改为false来阻止秘密信息被写入日志表,以保护隐私 + * + * @return 默认情况下保存 + */ + boolean saveParam() default true; + + /** + * 是否保存函数的返回值
+ * 在某些涉密操作中,可将此值改为false来阻止秘密信息被写入日志表,以保护隐私
+ * 在对日志表本身进行操作的时候,应当设置此字段为false,防止result字段出现套娃情况 + * + * @return 默认情况下保存 + */ + boolean saveResult() default true; } diff --git a/milkbox-service/pom.xml b/milkbox-service/pom.xml index c780569c381e777c1c7695746ae718862906a180..fc49d819530705e84fa34fc20e2b3e45ead3b3e6 100644 --- a/milkbox-service/pom.xml +++ b/milkbox-service/pom.xml @@ -15,6 +15,7 @@ service-test service-sys service-log + service-dev diff --git a/milkbox-service/service-dev/pom.xml b/milkbox-service/service-dev/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..c97b4905df691b852dae3b7391cc2561b1bee87b --- /dev/null +++ b/milkbox-service/service-dev/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + top.milkbox + milkbox-service + 1.0-DEV + + + service-dev + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/milkbox-service/service-dev/src/main/java/top/milkbox/dev/core/config/DevConfiguration.java b/milkbox-service/service-dev/src/main/java/top/milkbox/dev/core/config/DevConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..4382dc0313e9ea15076967721f8cfa07f5a4fc44 --- /dev/null +++ b/milkbox-service/service-dev/src/main/java/top/milkbox/dev/core/config/DevConfiguration.java @@ -0,0 +1,11 @@ +package top.milkbox.dev.core.config; + +/** + * 创建时间: 2024-01-23 下午 3:39 + * + * @author milkbox + */ +public class DevConfiguration { + + public static final String MODULE_NAME = "开发模块"; +} diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java index 3b01a98dfd42b9eaf41296c60165366b27403716..efbdc36223ece9d34b411148aa83380329f95ed6 100644 --- a/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java +++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/core/aop/LogAop.java @@ -38,7 +38,7 @@ public class LogAop { * @return 切点方法的返回值 */ @Around("LogAop.logPointcut()") - public Object logAround(ProceedingJoinPoint joinPoint) { + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Object result; // 这里只能捕获到对应方法内部发生的异常 @@ -50,7 +50,7 @@ public class LogAop { } catch (Throwable throwable) { logMainService.saveThrowableLogAsync(joinPoint, throwable); // 需要继续抛出异常 - throw new RuntimeException(throwable); + throw throwable; } return result; } 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 index 3694e1de45ad1b44c7596c123d718dd7107490db..874881f68f0996db0fbcec21e2d0c6d9a104511c 100644 --- 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 @@ -1,5 +1,6 @@ package top.milkbox.log.modular.main.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -27,6 +28,7 @@ import java.util.List; * @author milkbox * @date 2024-1-23 */ +@SaCheckLogin @RestController @AllArgsConstructor @RequestMapping("/logMain") @@ -35,14 +37,14 @@ public class LogMainController { private LogMainService logMainService; - @PostMapping("/add") - @Operation(summary = "添加", description = "添加一条数据") - @CommonLog(value = "添加", description = "添加一条数据", - module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) - public CommonResult add(@Validated @RequestBody LogMainAddParam addParam) { - logMainService.add(addParam); - return CommonResult.ok(); - } +// @PostMapping("/add") +// @Operation(summary = "添加", description = "添加一条数据") +// @CommonLog(value = "添加", description = "添加一条数据", +// module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) +// public CommonResult add(@Validated @RequestBody LogMainAddParam addParam) { +// logMainService.add(addParam); +// return CommonResult.ok(); +// } @DeleteMapping("/delete") @Operation(summary = "批量删除") @@ -57,27 +59,27 @@ public class LogMainController { return CommonResult.ok(); } - @PutMapping("/edit") - @Operation(summary = "修改", description = "修改一条数据") - @CommonLog(value = "修改", description = "修改一条数据", - module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) - public CommonResult edit(@Validated @RequestBody LogMainEditParam editParam) { - logMainService.edit(editParam); - return CommonResult.ok(); - } +// @PutMapping("/edit") +// @Operation(summary = "修改", description = "修改一条数据") +// @CommonLog(value = "修改", description = "修改一条数据", +// module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) +// public CommonResult edit(@Validated @RequestBody LogMainEditParam editParam) { +// logMainService.edit(editParam); +// return CommonResult.ok(); +// } @GetMapping("/detail") @Operation(summary = "详情", description = "查询一条数据的详情") - @CommonLog(value = "详情", description = "查询一条数据的详情", - module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @CommonLog(value = "详情", description = "查询一条数据的详情", saveResult = false, + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) // 不保存返回值到数据库,防止套娃 public CommonResult detail(@Validated LogMainIdParam idParam) { return CommonResult.ok(logMainService.detail(idParam)); } @GetMapping("/page") @Operation(summary = "分页查询", description = "查询条件分页查询") - @CommonLog(value = "分页查询", description = "查询条件分页查询", - module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + @CommonLog(value = "分页查询", description = "查询条件分页查询", saveResult = false, + module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) // 不保存返回值到数据库,防止套娃 public CommonResult> page(@Validated LogMainPageParam pageParam) { return CommonResult.ok(logMainService.page(pageParam)); } 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 index fbe93d6ef78655b0b51f82f6dce6bdfa685571de..2859516dfe43808b93e21c47f72e11170b62d4f2 100644 --- 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 @@ -1,9 +1,7 @@ package top.milkbox.log.modular.main.entity; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.AllArgsConstructor; @@ -16,11 +14,15 @@ import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; + /** * 日志_日志主表 * * @author milkbox - * @date 2024-1-18 + * @date 2024-1-23 */ @Data @NoArgsConstructor @@ -43,6 +45,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "日志分类", description = "日志分类。暂定为枚举类型,api日志还是其他方法的日志,取值api和method") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private LogCategoryEnum category; /** @@ -50,6 +53,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "日志名称", description = "日志名称。对日志做一个简单的描述") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String name; /** @@ -73,6 +77,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "日志的详细描述", description = "日志的详细描述。如果报错,则保存报错堆栈") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String description; /** @@ -80,6 +85,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "操作主机地址", description = "操作主机地址") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String operationIp; /** @@ -87,6 +93,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "操作的浏览器", description = "操作的浏览器") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String operationBrowser; /** @@ -94,6 +101,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "操作系统", description = "操作系统") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String operationSystem; /** @@ -101,22 +109,23 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "请求地址", description = "请求地址。如果是api日志") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String requestUrl; /** * 参数json类型 */ @Schema(title = "参数json类型", - description = "请求参数json类型") - @TableField(typeHandler = JacksonTypeHandler.class) + description = "参数json类型") + @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.ALWAYS) private Object paramJson; /** * 结果json类型 */ @Schema(title = "结果json类型", - description = "响应对象json类型") - @TableField(typeHandler = JacksonTypeHandler.class) + description = "结果json类型") + @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.ALWAYS) private Object resultJson; /** @@ -124,6 +133,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "模块名称", description = "模块名称") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String module; /** @@ -131,6 +141,7 @@ public class LogMainEntity extends CommonEntity implements Serializable { */ @Schema(title = "类型", description = "类型。枚举") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private LogTypeEnum 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 index 5de9d652f83c4cd1e4e1b771a4a98e5b841f896d..d963653b5026034b61408a31d8c0221cf6b60cfc 100644 --- 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 @@ -34,12 +34,12 @@ public interface LogMainService extends IService { */ void delete(List paramList); - /** - * 通过id编辑 - * - * @param editParam 编辑参数 - */ - void edit(LogMainEditParam editParam); +// /** +// * 通过id编辑 +// * +// * @param editParam 编辑参数 +// */ +// void edit(LogMainEditParam editParam); /** * 通过id查询详情 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 index 1a1e87b34d0d7c00aa6e851bf898274489c59079..4a7c5c0fb980005bebe7a915e720fda3dfbdbe7b 100644 --- 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 @@ -7,6 +7,7 @@ import cn.hutool.extra.servlet.JakartaServletUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentInfo; import cn.hutool.http.useragent.UserAgentUtil; +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; @@ -66,12 +67,12 @@ public class LogMainServiceImpl extends ServiceImpl add(@Validated @RequestBody SysRelationshipAddParam addParam) { + sysRelationshipService.add(addParam); + return CommonResult.ok(); + } + + @DeleteMapping("/delete") + @Operation(summary = "批量删除") + @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + public CommonResult delete( + @Validated + @RequestBody + @Size(min = 1, message = "请至少传递一个删除对象") + List<@Valid SysRelationshipIdParam> paramList + ) { + sysRelationshipService.delete(paramList); + return CommonResult.ok(); + } + + @PutMapping("/edit") + @Operation(summary = "修改", description = "修改一条数据") + @CommonLog(value = "修改", description = "修改一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult edit(@Validated @RequestBody SysRelationshipEditParam editParam) { + sysRelationshipService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult detail(@Validated SysRelationshipIdParam idParam) { + return CommonResult.ok(sysRelationshipService.detail(idParam)); + } + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "查询条件分页查询") + @CommonLog(value = "分页查询", description = "查询条件分页查询", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult> page(@Validated SysRelationshipPageParam pageParam) { + return CommonResult.ok(sysRelationshipService.page(pageParam)); + } + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..177983fc9fcfe84635b9a5eb14737f2ac4cd829b --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/entity/SysRelationshipEntity.java @@ -0,0 +1,69 @@ +package top.milkbox.sys.modular.relationship.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.common.pojo.CommonEntity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +/** + * 系统_关系表_用户角色组织菜单权限综合关系表 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sys_relationship", autoResultMap = true) +@Schema(description = "SysRelationshipEntity 系统_关系表_用户角色组织菜单权限综合关系表。") +public class SysRelationshipEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 对象id;被关联的id + */ + @Schema(title = "对象id", + description = "对象id。被关联的id") + private Integer objectId; + + /** + * 目标id;关联到的目标id + */ + @Schema(title = "目标id", + description = "目标id。关联到的目标id") + private Integer targetId; + + /** + * 关联的类型;枚举 + */ + @Schema(title = "关联的类型", + description = "关联的类型。枚举") + private SysRelationshipTypeEnum category; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + @TableField(typeHandler = JacksonTypeHandler.class, updateStrategy = FieldStrategy.ALWAYS) + private Object extend; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..ad37c614c2f2ea2d28ec017d9060c7582d32c375 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/enums/SysRelationshipTypeEnum.java @@ -0,0 +1,57 @@ +package top.milkbox.sys.modular.relationship.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 关系表类型枚举 + * 创建时间: 2024-01-23 下午 4:28 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum SysRelationshipTypeEnum { + + /** + * 用户与角色关系(用户属于哪些角色) + */ + SYS_USER_RELATE_SYS_ROLE("用户与角色关系", "SYS_USER_RELATE_SYS_ROLE"), + + /** + * 用户与菜单关系(用户单独拥有的菜单) + */ + SYS_USER_RELATE_SYS_MENU("用户与菜单关系", "SYS_USER_RELATE_SYS_MENU"), + + /** + * 用户与组织关系(用户所属与哪些组织) + */ + SYS_USER_RELATE_SYS_ORG("用户与组织关系", "SYS_USER_RELATE_SYS_ORG"), + + /** + * 角色与菜单关系(角色拥有那些菜单) + */ + SYS_ROLE_RELATE_SYS_MENU("角色与菜单关系", "SYS_ROLE_RELATE_SYS_MENU"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/SysRelationshipMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/SysRelationshipMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..bcf127b48f5d0cb8df10a14ee4cddfdcbcb252f2 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/SysRelationshipMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.relationship.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; + +/** + * 系统_关系表_用户角色组织菜单权限综合关系表(sys_relationship)表数据库访问层 + * + * @author milkbox + * @date 2024-1-23 + */ +@Mapper +public interface SysRelationshipMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/mapping/SysRelationshipMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/mapping/SysRelationshipMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..58591dbf3b94c9402643c69e405d9ddf361ce958 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/mapper/mapping/SysRelationshipMapper.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/relationship/param/SysRelationshipAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipAddParam.java new file mode 100644 index 0000000000000000000000000000000000000000..8e1eaf4eb12e1d267785fc67f907e0a22af140f3 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipAddParam.java @@ -0,0 +1,54 @@ +package top.milkbox.sys.modular.relationship.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 top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-1-27 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRelationshipAddParam implements Serializable { + + /** + * 对象id;被关联的id + */ + @Schema(title = "对象id", + description = "对象id。被关联的id") + @NotNull(message = "对象id不能为空") + private Integer objectId; + + /** + * 目标id;关联到的目标id + */ + @Schema(title = "目标id", + description = "目标id。关联到的目标id") + @NotNull(message = "目标id不能为空") + private Integer targetId; + + /** + * 关联的类型;枚举 + */ + @Schema(title = "关联的类型", + description = "关联的类型。枚举") + @NotNull(message = "关联的类型不能为空") + private SysRelationshipTypeEnum category; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipEditParam.java new file mode 100644 index 0000000000000000000000000000000000000000..87962cb16aabee021f53bbf0924f4f98c3f62b49 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipEditParam.java @@ -0,0 +1,62 @@ +package top.milkbox.sys.modular.relationship.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 top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-27 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRelationshipEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 对象id;被关联的id + */ + @Schema(title = "对象id", + description = "对象id。被关联的id") + @NotNull(message = "对象id不能为空") + private Integer objectId; + + /** + * 目标id;关联到的目标id + */ + @Schema(title = "目标id", + description = "目标id。关联到的目标id") + @NotNull(message = "目标id不能为空") + private Integer targetId; + + /** + * 关联的类型;枚举 + */ + @Schema(title = "关联的类型", + description = "关联的类型。枚举") + @NotNull(message = "关联的类型不能为空") + private SysRelationshipTypeEnum category; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipIdParam.java new file mode 100644 index 0000000000000000000000000000000000000000..d1a6f54be7aa1b4022212748bbb1d3be6784c6b1 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.modular.relationship.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-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRelationshipIdParam 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/relationship/param/SysRelationshipPageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipPageParam.java new file mode 100644 index 0000000000000000000000000000000000000000..5b22f450ffc05a09d04df161d9ff07c72ba8fea5 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/param/SysRelationshipPageParam.java @@ -0,0 +1,53 @@ +package top.milkbox.sys.modular.relationship.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonPageParam; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +import java.io.Serializable; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysRelationshipPageParam extends CommonPageParam implements Serializable { + + /** + * 对象id;被关联的id + */ + @Schema(title = "对象id", + description = "对象id。被关联的id") + private Integer objectId; + + /** + * 目标id;关联到的目标id + */ + @Schema(title = "目标id", + description = "目标id。关联到的目标id") + private Integer targetId; + + /** + * 关联的类型;枚举 + */ + @Schema(title = "关联的类型", + description = "关联的类型。枚举") + private SysRelationshipTypeEnum category; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java new file mode 100644 index 0000000000000000000000000000000000000000..92ad4181fb812acaace09e896cfc2e2ef0a3c505 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/SysRelationshipService.java @@ -0,0 +1,67 @@ +package top.milkbox.sys.modular.relationship.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.param.SysRelationshipAddParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipIdParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipPageParam; +import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; + +import java.util.List; + +/** + * 系统_关系表_用户角色组织菜单权限综合关系表(sys_relationship)服务层接口 + * + * @author milkbox + * @date 2024-1-23 + */ +public interface SysRelationshipService extends IService { + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(SysRelationshipAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(SysRelationshipEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + SysRelationshipVo detail(SysRelationshipIdParam idParam); + + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + SysRelationshipEntity findEntity(Integer entityId); + + /** + * 分页查询 + * + * @param pageParam 分页查询参数 + * @return 返回苞米豆的分页对象,没有数据,则record长度为0 + */ + Page page(SysRelationshipPageParam pageParam); + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9c6e07641ada3af0600f81dc1ac85ddf448e2853 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/service/impl/SysRelationshipServiceImpl.java @@ -0,0 +1,99 @@ +package top.milkbox.sys.modular.relationship.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.common.enums.CommonSortTypeEnum; +import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.sys.modular.relationship.entity.SysRelationshipEntity; +import top.milkbox.sys.modular.relationship.mapper.SysRelationshipMapper; +import top.milkbox.sys.modular.relationship.param.SysRelationshipAddParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipEditParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipIdParam; +import top.milkbox.sys.modular.relationship.param.SysRelationshipPageParam; +import top.milkbox.sys.modular.relationship.service.SysRelationshipService; +import top.milkbox.sys.modular.relationship.vo.SysRelationshipVo; +import top.milkbox.common.utils.CommonUtil; + +import java.util.List; + +/** + * 系统_关系表_用户角色组织菜单权限综合关系表(sys_relationship)服务层实现类 + * + * @author milkbox + * @date 2024-1-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysRelationshipServiceImpl extends ServiceImpl implements SysRelationshipService { + + private SysRelationshipMapper sysRelationshipMapper; + + @Override + public void add(SysRelationshipAddParam addParam) { + SysRelationshipEntity entity = BeanUtil.toBean(addParam, SysRelationshipEntity.class); + super.save(entity); + } + + @Override + public void delete(List paramList) { + super.removeByIds(paramList.stream().map(SysRelationshipIdParam::getId).toList()); + } + + @Override + public void edit(SysRelationshipEditParam editParam) { + findEntity(editParam.getId()); + SysRelationshipEntity entity = BeanUtil.toBean(editParam, SysRelationshipEntity.class); + super.updateById(entity); + } + + @Override + public SysRelationshipVo detail(SysRelationshipIdParam idParam) { + SysRelationshipEntity entity = findEntity(idParam.getId()); + SysRelationshipVo vo = BeanUtil.toBean(entity, SysRelationshipVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public SysRelationshipEntity findEntity(Integer entityId) { + SysRelationshipEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; + } + + @Override + public Page page(SysRelationshipPageParam 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(SysRelationshipEntity::getSortCode); + } + queryWrapper.lambda().orderByAsc(SysRelationshipEntity::getId); + + Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + SysRelationshipVo vo = BeanUtil.toBean(entity, SysRelationshipVo.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/relationship/vo/SysRelationshipVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/vo/SysRelationshipVo.java new file mode 100644 index 0000000000000000000000000000000000000000..cbde8fdfdc3a1f3e94cbefaf8b670af0f61bc74d --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/relationship/vo/SysRelationshipVo.java @@ -0,0 +1,61 @@ +package top.milkbox.sys.modular.relationship.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonVo; +import top.milkbox.sys.modular.relationship.enums.SysRelationshipTypeEnum; + +import java.io.Serializable; + +/** + * 系统_关系表_用户角色组织菜单权限综合关系表默认vo + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysRelationshipEntity 系统_关系表_用户角色组织菜单权限综合关系表。") +public class SysRelationshipVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 对象id;被关联的id + */ + @Schema(title = "对象id", + description = "对象id。被关联的id") + private Integer objectId; + + /** + * 目标id;关联到的目标id + */ + @Schema(title = "目标id", + description = "目标id。关联到的目标id") + private Integer targetId; + + /** + * 关联的类型;枚举 + */ + @Schema(title = "关联的类型", + description = "关联的类型。枚举") + private SysRelationshipTypeEnum category; + + /** + * 扩展信息;Json格式 + */ + @Schema(title = "扩展信息", + description = "扩展信息。Json格式") + private Object extend; + +} \ 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 index 3dd34a873d6716cac743504b7ca7f3d69f3da1e7..abcf719cf47d0fe65345289ec24d0c0fb4e1ea5e 100644 --- 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 @@ -1,5 +1,6 @@ package top.milkbox.sys.modular.role.controller; +import cn.dev33.satoken.annotation.SaCheckLogin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -25,8 +26,9 @@ import java.util.List; * 角色表(sys_role)控制器 * * @author milkbox - * @date 2024-1-23 + * @date 2024-1-27 */ +@SaCheckLogin @RestController @AllArgsConstructor @RequestMapping("/sysRole") @@ -38,7 +40,7 @@ public class SysRoleController { @PostMapping("/add") @Operation(summary = "添加", description = "添加一条数据") @CommonLog(value = "添加", description = "添加一条数据", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) public CommonResult add(@Validated @RequestBody SysRoleAddParam addParam) { sysRoleService.add(addParam); return CommonResult.ok(); @@ -60,7 +62,7 @@ public class SysRoleController { @PutMapping("/edit") @Operation(summary = "修改", description = "修改一条数据") @CommonLog(value = "修改", description = "修改一条数据", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) public CommonResult edit(@Validated @RequestBody SysRoleEditParam editParam) { sysRoleService.edit(editParam); return CommonResult.ok(); @@ -69,7 +71,7 @@ public class SysRoleController { @GetMapping("/detail") @Operation(summary = "详情", description = "查询一条数据的详情") @CommonLog(value = "详情", description = "查询一条数据的详情", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult detail(@Validated SysRoleIdParam idParam) { return CommonResult.ok(sysRoleService.detail(idParam)); } @@ -77,7 +79,7 @@ public class SysRoleController { @GetMapping("/page") @Operation(summary = "分页查询", description = "查询条件分页查询") @CommonLog(value = "分页查询", description = "查询条件分页查询", - module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) public CommonResult> page(@Validated SysRolePageParam pageParam) { return CommonResult.ok(sysRoleService.page(pageParam)); } 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 index 7382f116aaabad4d9ecada4226135146681f7d54..367ec82fe0465ba9dba3f1625b27c4ea29defb05 100644 --- 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 @@ -10,6 +10,8 @@ import lombok.NoArgsConstructor; import top.milkbox.common.pojo.CommonEntity; import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldStrategy; /** * 系统_角色表 @@ -45,6 +47,7 @@ public class SysRoleEntity extends CommonEntity implements Serializable { */ @Schema(title = "角色值", description = "角色值") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String value; } \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java new file mode 100644 index 0000000000000000000000000000000000000000..378e57344568245879ec64e97819eef51625b159 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/controller/SysUserController.java @@ -0,0 +1,121 @@ +package top.milkbox.sys.modular.user.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaIgnore; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import top.milkbox.common.annotation.CommonLog; +import top.milkbox.common.enums.LogTypeEnum; +import top.milkbox.sys.core.config.SysConfiguration; +import top.milkbox.sys.modular.user.param.*; +import top.milkbox.sys.modular.user.service.SysUserService; +import top.milkbox.sys.modular.user.vo.SysUserVo; +import top.milkbox.common.pojo.CommonResult; + +import java.util.List; + +/** + * 用户表(sys_user)控制器 + * + * @author milkbox + * @date 2024-1-23 + */ +@Slf4j +@SaCheckLogin +@RestController +@AllArgsConstructor +@RequestMapping("/sysUser") +@Tag(name = "用户表控制器", description = "SysUserController") +public class SysUserController { + + private SysUserService sysUserService; + + @PostMapping("/add") + @Operation(summary = "添加", description = "添加一条数据") + @CommonLog(value = "添加", description = "添加一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT) + public CommonResult add(@Validated @RequestBody SysUserAddParam addParam) { + sysUserService.add(addParam); + return CommonResult.ok(); + } + + @DeleteMapping("/delete") + @Operation(summary = "批量删除") + @CommonLog(value = "批量删除", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE) + public CommonResult delete( + @Validated + @RequestBody + @Size(min = 1, message = "请至少传递一个删除对象") + List<@Valid SysUserIdParam> paramList + ) { + sysUserService.delete(paramList); + return CommonResult.ok(); + } + + @PutMapping("/edit") + @Operation(summary = "修改", description = "修改一条数据") + @CommonLog(value = "修改", description = "修改一条数据", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.UPDATE) + public CommonResult edit(@Validated @RequestBody SysUserEditParam editParam) { + sysUserService.edit(editParam); + return CommonResult.ok(); + } + + @GetMapping("/detail") + @Operation(summary = "详情", description = "查询一条数据的详情") + @CommonLog(value = "详情", description = "查询一条数据的详情", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult detail(@Validated SysUserIdParam idParam) { + return CommonResult.ok(sysUserService.detail(idParam)); + } + + @GetMapping("/page") + @Operation(summary = "分页查询", description = "查询条件分页查询") + @CommonLog(value = "分页查询", description = "查询条件分页查询", + module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT) + public CommonResult> page(@Validated SysUserPageParam pageParam) { + return CommonResult.ok(sysUserService.page(pageParam)); + } + + @SaIgnore + @PostMapping("/register") + @Operation(summary = "注册") + @CommonLog(value = "注册", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.INSERT, + saveParam = false) + public CommonResult register(@Validated @RequestBody SysUserRegisterParam registerParam) { + return CommonResult.ok("注册成功", sysUserService.register(registerParam)); + } + + @SaIgnore + @PostMapping("/login") + @Operation(summary = "登录") + @CommonLog(value = "登录", module = SysConfiguration.MODULE_NAME, saveParam = false, saveResult = false) + public CommonResult login(@RequestBody SysUserLoginParam loginParam) { + return CommonResult.ok("登录成功", sysUserService.login(loginParam)); + } + + @PostMapping("/getLoginUser") + @Operation(summary = "登录用户信息", description = """ + 获取当前登录用户的信息。 + 请将token(token的键名称在配置文件中存放)放入cookie中,然后将cookie放入header中然后发送请求。""") + @CommonLog(value = "登录用户信息", module = SysConfiguration.MODULE_NAME, type = LogTypeEnum.SELECT, + saveResult = false) + public CommonResult getLoginUser() { + return CommonResult.ok(sysUserService.getLoginUser()); + } + + @PostMapping("/logout") + @Operation(summary = "登出", description = "登出当前用户") + @CommonLog(value = "登出", module = SysConfiguration.MODULE_NAME) + public CommonResult logout() { + sysUserService.logout(); + return CommonResult.ok("登出成功", null); + } +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/entity/SysUserEntity.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/entity/SysUserEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..f13122875afa6a65991c23750d2ab510f2d332df --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/entity/SysUserEntity.java @@ -0,0 +1,178 @@ +package top.milkbox.sys.modular.user.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.common.pojo.CommonEntity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.util.Date; + +/** + * 系统_用户表 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "sys_user") +@Schema(description = "SysUserEntity 系统_用户表。") +public class SysUserEntity extends CommonEntity implements Serializable { + + /** + * 主键 + */ + @TableId + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String account; + + /** + * 登录密码 + */ + @Schema(title = "登录密码", + description = "登录密码") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private SysUserGenderEnum gender; + + /** + * 用户密级;字典表value + */ + @Schema(title = "用户密级", + description = "用户密级。字典表value") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String secretLevel; + + /** + * 用户状态;枚举 + */ + @Schema(title = "用户状态", + description = "用户状态。枚举") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private SysUserStatusEnum status; + + /** + * 上次登录ip + */ + @Schema(title = "上次登录ip", + description = "上次登录ip") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String beforeLoginIp; + + /** + * 上次登录地址 + */ + @Schema(title = "上次登录地址", + description = "上次登录地址") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String beforeLoginAddress; + + /** + * 上次登录时间 + */ + @Schema(title = "上次登录时间", + description = "上次登录时间") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Date beforeLoginTime; + + /** + * 上次登录设备 + */ + @Schema(title = "上次登录设备", + description = "上次登录设备") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String beforeLoginDevice; + + /** + * 最新登录ip + */ + @Schema(title = "最新登录ip", + description = "最新登录ip") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String newLoginIp; + + /** + * 最新登录地址 + */ + @Schema(title = "最新登录地址", + description = "最新登录地址") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String newLoginAddress; + + /** + * 最新登录时间 + */ + @Schema(title = "最新登录时间", + description = "最新登录时间") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private Date newLoginTime; + + /** + * 最新登录设备 + */ + @Schema(title = "最新登录设备", + description = "最新登录设备") + @TableField(updateStrategy = FieldStrategy.ALWAYS) + private String newLoginDevice; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserGenderEnum.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserGenderEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..e064e1b335615346ebe950bf6956ad0695704f2e --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserGenderEnum.java @@ -0,0 +1,41 @@ +package top.milkbox.sys.modular.user.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 用户性别枚举 + * 创建时间: 2024-01-23 下午 4:28 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum SysUserGenderEnum { + + MAN("男", "MAN"), + WOMAN("女", "WOMAN"), + SECRET("密", "SECRET"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserStatusEnum.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserStatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..b641589cf812d3107f62fd00ff34df082ae833f9 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/enums/SysUserStatusEnum.java @@ -0,0 +1,53 @@ +package top.milkbox.sys.modular.user.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; + +/** + * 用户状态枚举 + * 创建时间: 2024-01-23 下午 4:28 + * + * @author milkbox + */ +@AllArgsConstructor // 如果使用此注解,请勿随意修改成员变量的定义顺序 +public enum SysUserStatusEnum { + NORMAL("正常", "NORMAL"), + + /** + * 管理员手动禁用账户 + */ + DISABLED("禁用", "DISABLED"), + + /** + * 账户本人手动删除账户,并非登出账号 + */ + CANCEL("注销", "CANCEL"), + + /** + * 管理员手动删除账户,区分逻辑删除,此处为防止关联查询异常的删除 + */ + DELETED("删除", "DELETED"); + + private final String label; + + @EnumValue // mybatis-plus控制数据库字段,数据库中保存的字段。如果数据库中的字段与不在枚举中则返回空 + private final String value; + + public String getLabel() { + return label; + } + + @JsonValue // jackson的标识,用于json转枚举的时候使用的字段 + public String getValue() { + return value; + } + + /** + * 枚举对象转为json的时候,字段的值 + */ + @Override + public String toString() { + return value; + } +} diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/SysUserMapper.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/SysUserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..1d7999f5193cdaa587f37248b97cb70dd74b8450 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/SysUserMapper.java @@ -0,0 +1,16 @@ +package top.milkbox.sys.modular.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.milkbox.sys.modular.user.entity.SysUserEntity; + +/** + * 系统_用户表(sys_user)表数据库访问层 + * + * @author milkbox + * @date 2024-1-23 + */ +@Mapper +public interface SysUserMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/mapping/SysUserMapper.xml b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/mapping/SysUserMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..d27bb5a19cc3edd254dccabe8cdc53b2363798fb --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/mapper/mapping/SysUserMapper.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/user/param/SysUserAddParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAddParam.java new file mode 100644 index 0000000000000000000000000000000000000000..231ec23f9d1bd9a403a9ea05112ed043283207f1 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserAddParam.java @@ -0,0 +1,89 @@ +package top.milkbox.sys.modular.user.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.io.Serializable; +import java.util.Date; + +/** + * 添加参数对象 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserAddParam implements Serializable { + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + private String account; + +// /** +// * 登录密码 +// */ +// @Schema(title = "登录密码", +// description = "登录密码") +// @NotBlank(message = "登录密码不能为空") +// private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + private SysUserGenderEnum gender; + + /** + * 用户密级;字典表value + */ + @Schema(title = "用户密级", + description = "用户密级。字典表value") + private String secretLevel; + + /** + * 用户状态;枚举 + */ + @Schema(title = "用户状态", + description = "用户状态。枚举") + private SysUserStatusEnum status; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserEditParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserEditParam.java new file mode 100644 index 0000000000000000000000000000000000000000..0109d4f3ade0b59e635758f0a52881ef1fff2b98 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserEditParam.java @@ -0,0 +1,155 @@ +package top.milkbox.sys.modular.user.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.NotNull; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.util.Date; + +/** + * 编辑参数对象 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserEditParam implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + @NotNull(message = "主键不能为空") + private Integer id; + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + private String account; + + /** + * 登录密码 + */ + @Schema(title = "登录密码", + description = "登录密码") + @NotBlank(message = "登录密码不能为空") + private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + private SysUserGenderEnum gender; + + /** + * 用户密级;字典表value + */ + @Schema(title = "用户密级", + description = "用户密级。字典表value") + private String secretLevel; + + /** + * 用户状态;枚举 + */ + @Schema(title = "用户状态", + description = "用户状态。枚举") + private SysUserStatusEnum status; + + /** + * 上次登录ip + */ + @Schema(title = "上次登录ip", + description = "上次登录ip") + private String beforeLoginIp; + + /** + * 上次登录地址 + */ + @Schema(title = "上次登录地址", + description = "上次登录地址") + private String beforeLoginAddress; + + /** + * 上次登录时间 + */ + @Schema(title = "上次登录时间", + description = "上次登录时间") + private Date beforeLoginTime; + + /** + * 上次登录设备 + */ + @Schema(title = "上次登录设备", + description = "上次登录设备") + private String beforeLoginDevice; + + /** + * 最新登录ip + */ + @Schema(title = "最新登录ip", + description = "最新登录ip") + private String newLoginIp; + + /** + * 最新登录地址 + */ + @Schema(title = "最新登录地址", + description = "最新登录地址") + private String newLoginAddress; + + /** + * 最新登录时间 + */ + @Schema(title = "最新登录时间", + description = "最新登录时间") + private Date newLoginTime; + + /** + * 最新登录设备 + */ + @Schema(title = "最新登录设备", + description = "最新登录设备") + private String newLoginDevice; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserIdParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserIdParam.java new file mode 100644 index 0000000000000000000000000000000000000000..2ae540958b7a55ca9286638ff3979684c6a6b029 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserIdParam.java @@ -0,0 +1,30 @@ +package top.milkbox.sys.modular.user.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-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserIdParam 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/user/param/SysUserLoginParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserLoginParam.java new file mode 100644 index 0000000000000000000000000000000000000000..64bbb651ef4ebdfb538a72fe1365b2e310ad2979 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserLoginParam.java @@ -0,0 +1,38 @@ +package top.milkbox.sys.modular.user.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 登录参数对象 + * + * @author milkbox + * @date 2024-1-24 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserLoginParam implements Serializable { + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "可以是账号、邮箱或手机号") + @NotBlank(message = "账号不能为空") + private String account; + + /** + * 登录密码 + */ + @Schema(title = "登录密码", + description = "登录密码") + @NotBlank(message = "登录密码不能为空") + private String password; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserPageParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserPageParam.java new file mode 100644 index 0000000000000000000000000000000000000000..0643aab1017fd67f4fcc5806a890d92bb6ddac70 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserPageParam.java @@ -0,0 +1,146 @@ +package top.milkbox.sys.modular.user.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonPageParam; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.io.Serializable; +import java.util.Date; + +/** + * 分页参数对象 + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserPageParam extends CommonPageParam implements Serializable { + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + private String account; + +// /** +// * 登录密码 +// */ +// @Schema(title = "登录密码", +// description = "登录密码") +// private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + private SysUserGenderEnum gender; + + /** + * 用户密级;字典表value + */ + @Schema(title = "用户密级", + description = "用户密级。字典表value") + private String secretLevel; + + /** + * 用户状态;枚举 + */ + @Schema(title = "用户状态", + description = "用户状态。枚举") + private SysUserStatusEnum status; + + /** + * 上次登录ip + */ + @Schema(title = "上次登录ip", + description = "上次登录ip") + private String beforeLoginIp; + + /** + * 上次登录地址 + */ + @Schema(title = "上次登录地址", + description = "上次登录地址") + private String beforeLoginAddress; + + /** + * 上次登录时间 + */ + @Schema(title = "上次登录时间", + description = "上次登录时间") + private Date beforeLoginTime; + + /** + * 上次登录设备 + */ + @Schema(title = "上次登录设备", + description = "上次登录设备") + private String beforeLoginDevice; + + /** + * 最新登录ip + */ + @Schema(title = "最新登录ip", + description = "最新登录ip") + private String newLoginIp; + + /** + * 最新登录地址 + */ + @Schema(title = "最新登录地址", + description = "最新登录地址") + private String newLoginAddress; + + /** + * 最新登录时间 + */ + @Schema(title = "最新登录时间", + description = "最新登录时间") + private Date newLoginTime; + + /** + * 最新登录设备 + */ + @Schema(title = "最新登录设备", + description = "最新登录设备") + private String newLoginDevice; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserRegisterParam.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserRegisterParam.java new file mode 100644 index 0000000000000000000000000000000000000000..da3dbe6a46bda969f79cd9e04996de0b6f3b97e1 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/param/SysUserRegisterParam.java @@ -0,0 +1,75 @@ +package top.milkbox.sys.modular.user.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.io.Serializable; +import java.util.Date; + +/** + * 注册参数对象 + * + * @author milkbox + * @date 2024-1-24 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserRegisterParam implements Serializable { + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + private String account; + + /** + * 登录密码 + */ + @Schema(title = "登录密码", + description = "登录密码") + @NotBlank(message = "登录密码不能为空") + private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + private SysUserGenderEnum gender; + +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..ba8a8f027a08c45a807e63aa9c18b196d6d57a27 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/SysUserService.java @@ -0,0 +1,99 @@ +package top.milkbox.sys.modular.user.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.param.*; +import top.milkbox.sys.modular.user.vo.SysUserVo; + +import java.util.List; + +/** + * 系统_用户表(sys_user)服务层接口 + * + * @author milkbox + * @date 2024-1-23 + */ +public interface SysUserService extends IService { + + /** + * 添加 + * + * @param addParam 添加参数 + */ + void add(SysUserAddParam addParam); + + /** + * 删除 + * + * @param paramList 删除id对象集合 + */ + void delete(List paramList); + + /** + * 通过id编辑 + * + * @param editParam 编辑参数 + */ + void edit(SysUserEditParam editParam); + + /** + * 通过id查询详情 + * + * @param idParam id参数 + * @return 返回查询的详情,如果没有则返回空 + */ + SysUserVo detail(SysUserIdParam idParam); + + /** + * 查询实体,即简单查询,包含存在性校验,不存在报业务异常 + * + * @param entityId 实体id + * @return 返回实体 + */ + SysUserEntity findEntity(Integer entityId); + + /** + * 分页查询 + * + * @param pageParam 分页查询参数 + * @return 返回苞米豆的分页对象,没有数据,则record长度为0 + */ + Page page(SysUserPageParam pageParam); + + /** + * 通过账号、邮箱或手机号查询用户 + * + * @param keyword 可以是账号、邮箱或手机号 + * @return 返回查询到的用户信息,如果没有查询到则返回空 + */ + SysUserEntity findByAccountKeyword(String keyword); + + /** + * 注册 + * + * @param registerParam 注册参数 + * @return 返回注册用户的部分信息 + */ + SysUserVo register(SysUserRegisterParam registerParam); + + /** + * 登录 + * + * @param loginParam 登录参数 + * @return 返回登录用户的token以及部分用户信息 + */ + SysUserVo login(SysUserLoginParam loginParam); + + /** + * 获取当前登录的用户信息 + * + * @return 用户信息,如果用户未登录则返回空 + */ + SysUserVo getLoginUser(); + + /** + * 登出当前用户 + */ + void logout(); +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d1f084eb1308256e6a1874608a6c913b2bbd2e29 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/service/impl/SysUserServiceImpl.java @@ -0,0 +1,188 @@ +package top.milkbox.sys.modular.user.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.common.enums.CommonSortTypeEnum; +import top.milkbox.common.exceprion.CommonServiceException; +import top.milkbox.sys.modular.user.entity.SysUserEntity; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; +import top.milkbox.sys.modular.user.mapper.SysUserMapper; +import top.milkbox.sys.modular.user.param.*; +import top.milkbox.sys.modular.user.service.SysUserService; +import top.milkbox.sys.modular.user.vo.SysUserVo; +import top.milkbox.common.utils.CommonUtil; + +import java.util.List; + +/** + * 系统_用户表(sys_user)服务层实现类 + * + * @author milkbox + * @date 2024-1-23 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + + private SysUserMapper sysUserMapper; + + public static final int LOG_ROUNDS = 12; // 加密程度,数值越高越安全越慢 + + @Override + public void add(SysUserAddParam addParam) { + SysUserEntity entity = BeanUtil.toBean(addParam, SysUserEntity.class); + super.save(entity); + } + + @Override + public void delete(List paramList) { + super.removeByIds(paramList.stream().map(SysUserIdParam::getId).toList()); + } + + @Override + public void edit(SysUserEditParam editParam) { + findEntity(editParam.getId()); + SysUserEntity entity = BeanUtil.toBean(editParam, SysUserEntity.class); + super.updateById(entity); + } + + @Override + public SysUserVo detail(SysUserIdParam idParam) { + SysUserEntity entity = findEntity(idParam.getId()); + SysUserVo vo = BeanUtil.toBean(entity, SysUserVo.class); + // 此处进行数据翻译操作,,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + } + + @Override + public SysUserEntity findEntity(Integer entityId) { + SysUserEntity entity = super.getById(entityId); + if (ObjectUtil.isEmpty(entity)) { + throw new CommonServiceException("实体未找到({})", entityId); + } + return entity; + } + + @Override + public Page page(SysUserPageParam 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(SysUserEntity::getSortCode); + } + queryWrapper.lambda().orderByAsc(SysUserEntity::getId); + + Page entityPage = super.page(pageParam.toBaomidouPage(), queryWrapper); + // 此处进行远程调用或关联查询...... + + Page voPage = CommonUtil.convertPage(entityPage, entity -> { + SysUserVo vo = BeanUtil.toBean(entity, SysUserVo.class); + // 此处进行数据翻译操作,根据不同的业务逻辑将entity对象转为vo对象...... + + return vo; + }); + return voPage; + } + + @Override + public SysUserEntity findByAccountKeyword(String keyword) { + return findByAccountKeyword(keyword, keyword, keyword); + } + + /** + * 通过账号、邮箱或手机号查询用户 + * + * @param account 账号 + * @param email 邮箱 + * @param phone 手机号 + * @return 如果存在用户则返回,如果不存在返回空 + */ + public SysUserEntity findByAccountKeyword(String account, String email, String phone) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUserEntity::getAccount, account) + .or().eq(SysUserEntity::getEmail, email) + .or().eq(SysUserEntity::getPhone, phone); + return super.getOne(queryWrapper); + } + + @Override + public SysUserVo register(SysUserRegisterParam registerParam) { + // 校验用户名、邮箱和手机号不能重复 + SysUserEntity existUser = findByAccountKeyword( + registerParam.getAccount(), registerParam.getEmail(), registerParam.getPhone()); + if (ObjectUtil.isNotNull(existUser)) { + throw new CommonServiceException("账号、邮箱或手机号已经被注册过了!"); + } + + SysUserEntity user = BeanUtil.toBean(registerParam, SysUserEntity.class); + // 生成密码的hash值 + String hashPassword = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt(LOG_ROUNDS)); + user.setPassword(hashPassword); + initUser(user); + super.save(user); + + return BeanUtil.toBean(user, SysUserVo.class); + } + + /** + * 初始化用户 + * + * @param user 用户 + */ + private void initUser(SysUserEntity user) { + if (ObjectUtil.isNotNull(user.getGender())) { + user.setGender(SysUserGenderEnum.SECRET); + } + // TODO 此处可能会处理用户密级 + user.setStatus(SysUserStatusEnum.NORMAL); + } + + @Override + public SysUserVo login(SysUserLoginParam loginParam) { + // 根据账号、邮箱和手机号查询用户信息 + SysUserEntity user = findByAccountKeyword(loginParam.getAccount()); + if (ObjectUtil.isNull(user)) { + throw new CommonServiceException("用户不存在"); + } + + // 验证用户密码是否正确 + if (!BCrypt.checkpw(loginParam.getPassword(), user.getPassword())) { + throw new CommonServiceException("用户密码错误"); + } + + // sa-token操作 + StpUtil.login(user.getId()); + + // 最后需要将token放到vo对象中 + SysUserVo vo = BeanUtil.toBean(user, SysUserVo.class); + vo.setToken(StpUtil.getTokenValue()); + + return vo; + } + + @Override + public SysUserVo getLoginUser() { + return detail(new SysUserIdParam(StpUtil.getLoginIdAsInt())); + } + + @Override + public void logout() { + StpUtil.logout(); + } +} \ No newline at end of file diff --git a/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/vo/SysUserVo.java b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/vo/SysUserVo.java new file mode 100644 index 0000000000000000000000000000000000000000..796829de602b3c1e549ae3a3085496c268283336 --- /dev/null +++ b/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/user/vo/SysUserVo.java @@ -0,0 +1,161 @@ +package top.milkbox.sys.modular.user.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import top.milkbox.common.pojo.CommonVo; +import top.milkbox.sys.modular.user.enums.SysUserGenderEnum; +import top.milkbox.sys.modular.user.enums.SysUserStatusEnum; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统_用户表默认vo + * + * @author milkbox + * @date 2024-1-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(description = "SysUserEntity 系统_用户表。") +public class SysUserVo extends CommonVo implements Serializable { + + /** + * 主键 + */ + @Schema(title = "主键", + description = "主键") + private Integer id; + + /** + * 登录账号 + */ + @Schema(title = "登录账号", + description = "登录账号") + private String account; + +// /** +// * 登录密码 +// */ +// @Schema(title = "登录密码", +// description = "登录密码") +// private String password; + + /** + * 昵称 + */ + @Schema(title = "昵称", + description = "昵称") + private String nickname; + + /** + * 登录邮箱 + */ + @Schema(title = "登录邮箱", + description = "登录邮箱") + private String email; + + /** + * 登录手机号 + */ + @Schema(title = "登录手机号", + description = "登录手机号") + private String phone; + + /** + * 头像;base64格式 + */ + @Schema(title = "头像", + description = "头像。base64格式") + private String avatar; + + /** + * 性别;枚举 + */ + @Schema(title = "性别", + description = "性别。枚举") + private SysUserGenderEnum gender; + + /** + * 用户密级;字典表value + */ + @Schema(title = "用户密级", + description = "用户密级。字典表value") + private String secretLevel; + + /** + * 用户状态;枚举 + */ + @Schema(title = "用户状态", + description = "用户状态。枚举") + private SysUserStatusEnum status; + + /** + * 上次登录ip + */ + @Schema(title = "上次登录ip", + description = "上次登录ip") + private String beforeLoginIp; + + /** + * 上次登录地址 + */ + @Schema(title = "上次登录地址", + description = "上次登录地址") + private String beforeLoginAddress; + + /** + * 上次登录时间 + */ + @Schema(title = "上次登录时间", + description = "上次登录时间") + private Date beforeLoginTime; + + /** + * 上次登录设备 + */ + @Schema(title = "上次登录设备", + description = "上次登录设备") + private String beforeLoginDevice; + + /** + * 最新登录ip + */ + @Schema(title = "最新登录ip", + description = "最新登录ip") + private String newLoginIp; + + /** + * 最新登录地址 + */ + @Schema(title = "最新登录地址", + description = "最新登录地址") + private String newLoginAddress; + + /** + * 最新登录时间 + */ + @Schema(title = "最新登录时间", + description = "最新登录时间") + private Date newLoginTime; + + /** + * 最新登录设备 + */ + @Schema(title = "最新登录设备", + description = "最新登录设备") + private String newLoginDevice; + + /** + * 默认情况下登录后用户的token会自动存入浏览器的cookie中,无需单独控制
+ * 如果涉及到app或小程序等前后端分离的情况,可能就要手动存储这个字段了 + */ + @Schema(title = "用户当前登录的token", description = "用户当前登录的token") + private String token; + +} \ 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 7d7e7f6fa137159cf703d3490b5b6ff06fad686c..8aec1769f2fc8947568d6be5aa949f5e284fb743 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 @@ -3,10 +3,7 @@ package top.milkbox.modular.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -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 org.springframework.web.bind.annotation.*; import top.milkbox.modular.entity.SysRole; import top.milkbox.common.pojo.CommonPageParam; import top.milkbox.common.pojo.CommonResult; diff --git a/pom.xml b/pom.xml index 96173efa23ae92a70e2eae6ec09178b4bf0228d9..ef686dd8ba706cf09966ada81c787f587a0ff0fd 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,7 @@ + @@ -90,6 +91,14 @@ ${springdoc.version} + + + cn.dev33 + sa-token-spring-boot3-starter + ${sa-token} + + + @@ -129,6 +138,19 @@ test + + + cn.dev33 + sa-token-redis-jackson + ${sa-token.redis} + + + + + org.apache.commons + commons-pool2 + + @@ -158,6 +180,9 @@ 2.2.0 8.2.0 + + 1.37.0 + 1.37.0 @@ -192,6 +217,12 @@ service-log ${milkbox.version} + + + top.milkbox + service-dev + ${milkbox.version} +