diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/package-info.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/package-info.java deleted file mode 100644 index 7da5f5f..0000000 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 针对 infra 模块的 api 包 - */ -package com.njcn.rdms.framework.common.biz.infra; \ No newline at end of file diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiAccessLogCommonApi.java similarity index 79% rename from rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java rename to rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiAccessLogCommonApi.java index 3bb37a6..88fb244 100644 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java +++ b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiAccessLogCommonApi.java @@ -1,6 +1,6 @@ -package com.njcn.rdms.framework.common.biz.infra.logger; +package com.njcn.rdms.framework.common.biz.system.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.rdms.framework.common.enums.RpcConstants; import com.njcn.rdms.framework.common.pojo.CommonResult; import io.swagger.v3.oas.annotations.Operation; @@ -11,11 +11,11 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -@FeignClient(name = RpcConstants.INFRA_NAME) +@FeignClient(name = RpcConstants.SYSTEM_NAME) @Tag(name = "RPC 服务 - API 访问日志") public interface ApiAccessLogCommonApi { - String PREFIX = RpcConstants.INFRA_PREFIX + "/api-access-log"; + String PREFIX = RpcConstants.SYSTEM_PREFIX + "/api-access-log"; @PostMapping(PREFIX + "/create") @Operation(summary = "创建 API 访问日志") diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiErrorLogCommonApi.java similarity index 79% rename from rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java rename to rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiErrorLogCommonApi.java index 84b5599..526f91c 100644 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java +++ b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/ApiErrorLogCommonApi.java @@ -1,6 +1,6 @@ -package com.njcn.rdms.framework.common.biz.infra.logger; +package com.njcn.rdms.framework.common.biz.system.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.rdms.framework.common.enums.RpcConstants; import com.njcn.rdms.framework.common.pojo.CommonResult; import io.swagger.v3.oas.annotations.Operation; @@ -11,11 +11,11 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -@FeignClient(name = RpcConstants.INFRA_NAME) +@FeignClient(name = RpcConstants.SYSTEM_NAME) @Tag(name = "RPC 服务 - API 异常日志") public interface ApiErrorLogCommonApi { - String PREFIX = RpcConstants.INFRA_PREFIX + "/api-error-log"; + String PREFIX = RpcConstants.SYSTEM_PREFIX + "/api-error-log"; @PostMapping(PREFIX + "/create") @Operation(summary = "创建 API 异常日志") diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiAccessLogCreateReqDTO.java similarity index 96% rename from rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java rename to rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiAccessLogCreateReqDTO.java index 132ca43..e1dc6bd 100644 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java +++ b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiAccessLogCreateReqDTO.java @@ -1,4 +1,4 @@ -package com.njcn.rdms.framework.common.biz.infra.logger.dto; +package com.njcn.rdms.framework.common.biz.system.logger.dto; import jakarta.validation.constraints.NotNull; import lombok.Data; diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiErrorLogCreateReqDTO.java similarity index 98% rename from rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java rename to rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiErrorLogCreateReqDTO.java index f16251a..c75d389 100644 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java +++ b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/biz/system/logger/dto/ApiErrorLogCreateReqDTO.java @@ -1,4 +1,4 @@ -package com.njcn.rdms.framework.common.biz.infra.logger.dto; +package com.njcn.rdms.framework.common.biz.system.logger.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; diff --git a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/enums/RpcConstants.java b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/enums/RpcConstants.java index f3c74f8..06cded7 100644 --- a/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/enums/RpcConstants.java +++ b/rdms-framework/rdms-common/src/main/java/com/njcn/rdms/framework/common/enums/RpcConstants.java @@ -26,15 +26,5 @@ public interface RpcConstants { */ String SYSTEM_PREFIX = RPC_API_PREFIX + "/system"; - /** - * infra 服务名 - * - * 注意,需要保证和 spring.application.name 保持一致 - */ - String INFRA_NAME = "rdms-infra-server"; - /** - * infra 服务的前缀 - */ - String INFRA_PREFIX = RPC_API_PREFIX + "/infra"; } diff --git a/rdms-framework/rdms-spring-boot-starter-mq/MQ_REFACTOR_PLAN.md b/rdms-framework/rdms-spring-boot-starter-mq/MQ_REFACTOR_PLAN.md index 7af16bb..2cbc94e 100644 --- a/rdms-framework/rdms-spring-boot-starter-mq/MQ_REFACTOR_PLAN.md +++ b/rdms-framework/rdms-spring-boot-starter-mq/MQ_REFACTOR_PLAN.md @@ -1,4 +1,4 @@ -# MQ 改造方案(评审稿) +# MQ 改造方案(评审稿) ## 1. 背景与目标 你当前的业务策略是: @@ -26,16 +26,13 @@ 当前 `rdms-spring-boot-starter-mq` 的真实情况: 1. Redis 能力最完整,包含模板、监听器抽象、Stream 补偿与清理任务。 2. RabbitMQ 只有 `MessageConverter` 级别自动配置,未形成统一收发抽象。 -3. RocketMQ、Kafka 在该 starter 中没有对应自动配置主链路,实际接入主要在 WebSocket 模块。 当前 `rdms-system` 默认配置: -1. `rdms.websocket.sender-type: local`,即默认并未走 MQ 分发链路。 ## 3. 改造原则 1. 先配置统一,再接口统一,最后再清理非主路径。 2. 任何阶段都必须可回滚,且回滚只改配置不改代码。 3. 保持 Rabbit/Kafka 包路径存在,避免一次性大删导致历史分支合并困难。 -4. 先让 WebSocket 场景打通可切换,再考虑扩展到业务 MQ。 ## 4. 目标架构(落地后) 统一引入配置: @@ -44,10 +41,8 @@ 统一行为: 1. 单体环境配 `redis`。 2. 微服务环境配 `rocketmq`。 -3. WebSocket `sender-type` 跟随 `rdms.mq.type`,避免双配置。 建议方式: -1. `rdms.websocket.sender-type: ${rdms.mq.type}` ## 4.1 配置矩阵(最小可运行) @@ -56,8 +51,6 @@ rdms: mq: type: redis - websocket: - sender-type: ${rdms.mq.type} spring: data: @@ -71,8 +64,6 @@ spring: rdms: mq: type: rocketmq - websocket: - sender-type: ${rdms.mq.type} rocketmq: name-server: 127.0.0.1:9876 @@ -102,7 +93,6 @@ rocketmq: 实施项: 1. 新增配置项 `rdms.mq.type`,默认值 `redis`。 -2. 修改环境配置,使 `rdms.websocket.sender-type` 引用 `rdms.mq.type`。 3. 本阶段不删除 Rabbit/Kafka 代码,不变更包结构。 收益: @@ -110,7 +100,6 @@ rocketmq: 2. 不触碰核心业务逻辑,风险最低。 回滚: -1. 把 `rdms.websocket.sender-type` 改回固定值即可。 ## 阶段 B(中风险,接口统一) 目标:抽象统一 MQ 发送接口,减少业务对具体中间件的耦合。 @@ -119,7 +108,6 @@ rocketmq: 1. 新增统一接口,例如 `UnifiedMqSender`。 2. 提供 `RedisMqSender` 与 `RocketMqSender` 两个实现。 3. 用 `@ConditionalOnProperty` 根据 `rdms.mq.type` 注入唯一实现。 -4. 在 WebSocket 发送链路优先替换为统一接口调用。 5. 统一消息契约,至少包含标准消息头: `msgId`、`bizKey`、`timestamp`、`producer`、`traceId`、`version`。 @@ -149,7 +137,6 @@ rocketmq: ## 6. 影响面评估 主要影响模块: 1. `rdms-framework/rdms-spring-boot-starter-mq` -2. `rdms-framework/rdms-spring-boot-starter-websocket` 3. `rdms-system/rdms-system-boot` 配置文件 主要风险点: @@ -182,7 +169,6 @@ rocketmq: ## 7. 验收清单(每阶段都要过) 1. 单体环境 `rdms.mq.type=redis` 可启动、可发送、可消费。 2. 微服务环境 `rdms.mq.type=rocketmq` 可启动、可发送、可消费。 -3. WebSocket 在两种模式下都能完成跨实例消息投递。 4. 关键链路日志可定位发送端与消费端。 5. 切换只改配置,不改代码。 6. 回滚路径已验证。 @@ -224,7 +210,6 @@ rocketmq: 3. 关键业务出现重复消费副作用。 回滚动作: -1. 只回滚 `rdms.mq.type` 与 `rdms.websocket.sender-type` 配置。 2. 不回滚代码,确保恢复路径最短。 ## 9. 当前建议 diff --git a/rdms-framework/rdms-spring-boot-starter-mq/README.md b/rdms-framework/rdms-spring-boot-starter-mq/README.md index 28520a6..dfecea1 100644 --- a/rdms-framework/rdms-spring-boot-starter-mq/README.md +++ b/rdms-framework/rdms-spring-boot-starter-mq/README.md @@ -52,7 +52,6 @@ Redis 相关能力分成两类: ### 6. 多 MQ 的真实边界 虽然模块描述写了支持 Redis / RocketMQ / RabbitMQ / Kafka, 但本 starter 的自动配置主要是 Redis + Rabbit。 -RocketMQ / Kafka 的业务化接入在 `rdms-spring-boot-starter-websocket` 里有更完整示例。 ## 自动配置入口 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`: @@ -78,13 +77,6 @@ RocketMQ / Kafka 的业务化接入在 `rdms-spring-boot-starter-websocket` 里 2. 先按第 2 节使用 `Pub/Sub`(这是项目里最常见路径)。 3. 需要可恢复消费时,再按第 3 节接入 `Stream`。 -WebSocket 场景建议: -1. 多实例广播: `rdms.websocket.sender-type: redis` -2. 单机部署: 保持 `rdms.websocket.sender-type: local` - -说明: -1. 只要存在 `AbstractRedisChannelMessageListener` Bean,框架会自动注册 Redis 监听容器。 - ## 2. 使用 Redis Pub/Sub(广播) 适用场景: 通知广播、在线会话广播、对可靠性要求不高但强调实时性。 @@ -232,13 +224,6 @@ public class DemoRedisMessageInterceptor implements RedisMessageInterceptor { 1. Redis Stream 要求 Redis 版本 >= 5.0 2. 只有存在 Stream 监听器时,重投/清理定时任务才会生效 -## 与 WebSocket 的关系 -`rdms-spring-boot-starter-websocket` 直接复用本模块能力: -1. `sender-type=redis` 时使用 `RedisMQTemplate` + `AbstractRedisChannelMessageListener` -2. `sender-type=rabbitmq/rocketmq/kafka` 时切换到对应中间件实现 - -你可以参考 websocket 模块作为本模块的落地样板。 - ## 当前已知注意点 1. `AbstractRedisStreamMessageListener` 有一个 `(streamKey, group)` 构造器,内部把 `messageType` 置空;而消费反序列化仍依赖 `messageType`。 建议优先使用无参构造路径(即泛型推断消息类型的默认方式)。 diff --git a/rdms-framework/rdms-spring-boot-starter-security/README.md b/rdms-framework/rdms-spring-boot-starter-security/README.md index 7361931..9a38eb4 100644 --- a/rdms-framework/rdms-spring-boot-starter-security/README.md +++ b/rdms-framework/rdms-spring-boot-starter-security/README.md @@ -519,7 +519,13 @@ public Long createUser(UserSaveReqVO reqVO) { token 的签发和存储仍在系统服务等其他模块。 2. 当前跨服务透传的是 `login-user`,不是原始 token - 所以下游服务能识别当前用户,不等于它一直拿着原始 `Authorization`。 + 所以下游服务能识别当前用户,不等于它一直拿着原始 `Authorization`。 +3. 单体部署(不经过网关)建议在入口层剥离 `login-user` 请求头,避免外部伪造登录态 + - Nginx 示例: + ```nginx + # 去除客户端伪造的 login-user 头 + proxy_set_header login-user ""; + ``` 3. 不加 `@PreAuthorize` 不代表匿名可访问 默认仍然需要登录,只是不会进一步做权限点校验。 diff --git a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogAutoConfiguration.java b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogAutoConfiguration.java index 07c298b..953744f 100644 --- a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogAutoConfiguration.java +++ b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogAutoConfiguration.java @@ -2,7 +2,7 @@ package com.njcn.rdms.framework.apilog.config; import com.njcn.rdms.framework.apilog.core.filter.ApiAccessLogFilter; import com.njcn.rdms.framework.apilog.core.interceptor.ApiAccessLogInterceptor; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiAccessLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.ApiAccessLogCommonApi; import com.njcn.rdms.framework.common.enums.WebFilterOrderEnum; import com.njcn.rdms.framework.web.config.RdmsWebAutoConfiguration; import com.njcn.rdms.framework.web.config.WebProperties; diff --git a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogRpcAutoConfiguration.java b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogRpcAutoConfiguration.java index 59e90c8..8494a91 100644 --- a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogRpcAutoConfiguration.java +++ b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/config/RdmsApiLogRpcAutoConfiguration.java @@ -1,7 +1,7 @@ package com.njcn.rdms.framework.apilog.config; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiAccessLogCommonApi; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiErrorLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.ApiAccessLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.ApiErrorLogCommonApi; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.cloud.openfeign.EnableFeignClients; diff --git a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/core/filter/ApiAccessLogFilter.java b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/core/filter/ApiAccessLogFilter.java index c2b416f..ab66e66 100644 --- a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/core/filter/ApiAccessLogFilter.java +++ b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -10,8 +10,8 @@ import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.JsonNode; import com.njcn.rdms.framework.apilog.core.annotation.ApiAccessLog; import com.njcn.rdms.framework.apilog.core.enums.OperateTypeEnum; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiAccessLogCommonApi; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.ApiAccessLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.rdms.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.rdms.framework.common.pojo.CommonResult; import com.njcn.rdms.framework.common.util.json.JsonUtils; diff --git a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/config/RdmsWebAutoConfiguration.java b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/config/RdmsWebAutoConfiguration.java index 734ebfa..f421409 100644 --- a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/config/RdmsWebAutoConfiguration.java +++ b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/config/RdmsWebAutoConfiguration.java @@ -2,7 +2,7 @@ package com.njcn.rdms.framework.web.config; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Maps; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiErrorLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.ApiErrorLogCommonApi; import com.njcn.rdms.framework.common.enums.WebFilterOrderEnum; import com.njcn.rdms.framework.web.core.filter.CacheRequestBodyFilter; import com.njcn.rdms.framework.web.core.handler.GlobalExceptionHandler; diff --git a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/core/handler/GlobalExceptionHandler.java b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/core/handler/GlobalExceptionHandler.java index 574f067..f6e3c17 100644 --- a/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/core/handler/GlobalExceptionHandler.java +++ b/rdms-framework/rdms-spring-boot-starter-web/src/main/java/com/njcn/rdms/framework/web/core/handler/GlobalExceptionHandler.java @@ -7,8 +7,8 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.google.common.util.concurrent.UncheckedExecutionException; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiErrorLogCommonApi; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.ApiErrorLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.rdms.framework.common.exception.ServiceException; import com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil; import com.njcn.rdms.framework.common.pojo.CommonResult; diff --git a/rdms-framework/rdms-spring-boot-starter-websocket/README.md b/rdms-framework/rdms-spring-boot-starter-websocket/README.md index c63286c..2847cbb 100644 --- a/rdms-framework/rdms-spring-boot-starter-websocket/README.md +++ b/rdms-framework/rdms-spring-boot-starter-websocket/README.md @@ -1,21 +1,21 @@ -# rdms-spring-boot-starter-websocket +# rdms-spring-boot-starter-websocket ## 1. 模块定位 -`rdms-spring-boot-starter-websocket` 是 WebSocket 基础设施模块,用于统一处理连接、会话管理、消息分发与消息发送,并支持多节点场景下的广播投递。 +`rdms-spring-boot-starter-websocket` 是 WebSocket 基础设施模块,用于统一处理连接、会话管理、消息分发与消息发送。 模块聚合的核心能力: - WebSocket 自动装配与路径注册 - 登录用户绑定与会话管理 - JSON 消息协议与监听器分发 -- 消息发送与多节点广播 +- 消息发送 ## 2. 设计思路 - 统一 JSON 消息协议(`type` + `content`),通过 `type` 分发到对应监听器,降低业务耦合。 - 通过 `WebSocketSessionManager` 统一管理会话,支持按用户类型/用户编号/会话 ID 进行推送。 -- 通过可插拔 `sender-type` 支持单机与多节点广播(local/redis/rocketmq/rabbitmq/kafka)。 +- 通过本地发送器支持单机消息推送。 - 与安全体系结合,在握手阶段写入 `LoginUser`,便于后续鉴权与定向发送。 ## 3. 功能模块 @@ -28,7 +28,7 @@ - 注册握手拦截器(默认 `LoginUserHandshakeInterceptor`) - 注册 `WebSocketSessionManager` - 放行 WebSocket 路径的安全校验 -- 注册消息发送器(按 `sender-type`) +- 注册消息发送器 ### 3.2 JSON 消息协议 @@ -69,14 +69,7 @@ 消息会被封装为统一的 `JsonWebSocketMessage` 后发送。 -### 3.5 多节点广播 - -`sender-type` 支持以下类型: - -- `local`:单机直连(默认) -- `redis` / `rocketmq` / `rabbitmq` / `kafka`:通过 MQ 广播到各实例,再由各实例推送到本机会话 - -### 3.6 登录用户绑定 +### 3.5 登录用户绑定 握手阶段会读取当前登录用户并写入 WebSocket Session: @@ -102,13 +95,11 @@ rdms: websocket: enable: true path: /ws - sender-type: local ``` 说明: - `path` 默认 `/ws` -- `sender-type` 默认 `local` - `enable` 默认 `true` ### 4.3 连接方式 @@ -148,49 +139,4 @@ public void push(Long userId, NoticeDTO notice) { } ``` -### 4.6 多节点广播配置示例 -Redis: - -```yaml -rdms: - websocket: - sender-type: redis -``` - -RocketMQ: - -```yaml -rdms: - websocket: - sender-type: rocketmq - sender-rocketmq: - topic: ws-topic - consumer-group: ws-group -``` - -Kafka: - -```yaml -rdms: - websocket: - sender-type: kafka - sender-kafka: - topic: ws-topic - consumer-group: ws-group -``` - -RabbitMQ: - -```yaml -rdms: - websocket: - sender-type: rabbitmq - sender-rabbitmq: - exchange: ws-exchange - queue: ws-queue -``` - -注意: - -- 使用 MQ 模式时,请确保对应 MQ 客户端依赖与连接配置已就绪。 diff --git a/rdms-framework/rdms-spring-boot-starter-websocket/pom.xml b/rdms-framework/rdms-spring-boot-starter-websocket/pom.xml index df66a29..c2f5ba8 100644 --- a/rdms-framework/rdms-spring-boot-starter-websocket/pom.xml +++ b/rdms-framework/rdms-spring-boot-starter-websocket/pom.xml @@ -39,28 +39,6 @@ spring-boot-starter-websocket - - - com.njcn - rdms-spring-boot-starter-mq - - - org.springframework.kafka - spring-kafka - true - - - org.springframework.amqp - spring-rabbit - true - - - org.apache.rocketmq - rocketmq-spring-boot-starter - true - - - - \ No newline at end of file + diff --git a/rdms-gateway/README.md b/rdms-gateway/README.md new file mode 100644 index 0000000..db8146a --- /dev/null +++ b/rdms-gateway/README.md @@ -0,0 +1,144 @@ +# rdms-gateway + +## 1. 模块定位 + +`rdms-gateway` 是 API 服务网关模块,基于 Spring Cloud Gateway(WebFlux)实现,负责统一入口的路由转发、鉴权透传、跨域处理、访问日志、灰度/标签负载与全局异常处理。 + +## 2. 设计思路 + +- 通过网关统一处理横切能力,业务服务只关注业务逻辑。 +- 鉴权只做“解析 + 透传”,是否需要登录交给后端服务判定。 +- 灰度/标签负载通过自定义 `grayLb://` 方案实现。 +- 访问日志默认打印到日志,后续可扩展为落库。 + +## 3. 功能模块 + +### 3.1 路由与文档聚合 + +- 路由配置集中在 `application.yaml` 的 `spring.cloud.gateway.server.webflux.routes`。 +- Knife4j Gateway 负责聚合各服务的 OpenAPI 文档。 + +### 3.2 Token 鉴权透传 + +`TokenAuthenticationFilter` 负责: + +- 从 `Authorization` 解析 Token +- 远程校验 Token 有效性 +- 校验通过后将 `login-user` 头透传给后端 +- 不阻断请求,是否需要登录由后端服务决定 + +### 3.3 跨域处理 + +`CorsFilter` 统一放行跨域请求,并处理 OPTIONS 预检请求。 + +### 3.4 访问日志 + +`AccessLogFilter` 记录: + +- 请求路径、方法、参数、Body、Headers +- 响应体、响应码 +- 耗时、用户信息 + +当前实现是打印到日志(控制台/文件),可扩展为落库。 + +### 3.5 灰度/标签负载 + +灰度发布(Gray/Canary)是指新旧版本并行运行,只让一小部分请求先进入新版本验证,稳定后再逐步扩大流量,最终全量切换。 + +在本项目中,灰度不是按“百分比随机分流”,而是**按请求头定向路由**: + +- 请求头 `version` 用于匹配实例 `metadata.version` +- 请求头 `tag` 用于匹配实例 `metadata.tag` +- 如果匹配不到目标实例,会回退到全量实例 +- 最终按 Nacos 权重随机选择实例 + +`grayLb://` + `GrayLoadBalancer` 规则: + +- header `version` 匹配实例 metadata `version` +- header `tag` 匹配实例 metadata `tag` +- 无匹配时回落到全量实例 + +注意: + +- 不带 `tag` 的请求会优先过滤掉带 `tag` 的实例,避免测试/灰度实例被默认流量命中 +- 灰度发布依赖请求头控制路由范围,需要由网关或内部调用方注入 `version/tag`,避免外部随意绕路 + +### 3.6 全局异常 + +`GlobalExceptionHandler` 将异常统一翻译为 `CommonResult` 返回。 + +### 3.7 Jackson 一致性 + +`GatewayJacksonAutoConfiguration` 统一 JSON 序列化策略(时间戳、Long -> Number 等)。 + +## 4. 开发人员上手 + +### 4.1 路由配置示例 + +```yaml +spring: + cloud: + gateway: + server: + webflux: + routes: + - id: system-admin-api + uri: grayLb://rdms-system-server + predicates: + - Path=/admin-api/system/** + filters: + - RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs +``` + +### 4.2 鉴权透传 + +前端携带: + +``` +Authorization: Bearer +tenant-id: +``` + +网关校验成功后,会透传 `login-user` 给后端服务。 + +### 4.3 灰度/标签路由 + +请求头示例: + +``` +version: 1.0.0 +tag: dev +``` + +服务实例需要在注册中心 metadata 中配置对应 `version/tag`。 + +### 4.4 WebSocket 路由 + +```yaml +- id: system-websocket + uri: grayLb://rdms-system-server + predicates: + - Path=/system/ws/** +``` + +### 4.5 文档聚合示例 + +```yaml +knife4j: + gateway: + enabled: true + routes: + - name: system-server + service-name: rdms-system-server + url: /admin-api/system/v3/api-docs +``` + +## 5. 关键类索引 + +- 入口:`src/main/java/com/njcn/rdms/gateway/GatewayServerApplication.java` +- 路由配置:`src/main/resources/application.yaml` +- 鉴权:`src/main/java/com/njcn/rdms/gateway/filter/security/TokenAuthenticationFilter.java` +- 灰度:`src/main/java/com/njcn/rdms/gateway/filter/grey/GrayLoadBalancer.java` +- 访问日志:`src/main/java/com/njcn/rdms/gateway/filter/logging/AccessLogFilter.java` +- 跨域:`src/main/java/com/njcn/rdms/gateway/filter/cors/CorsFilter.java` +- 全局异常:`src/main/java/com/njcn/rdms/gateway/handler/GlobalExceptionHandler.java` diff --git a/rdms-gateway/src/main/java/com/njcn/rdms/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java b/rdms-gateway/src/main/java/com/njcn/rdms/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java index 781010d..907710a 100644 --- a/rdms-gateway/src/main/java/com/njcn/rdms/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java +++ b/rdms-gateway/src/main/java/com/njcn/rdms/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java @@ -55,7 +55,7 @@ public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Order public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR); String schemePrefix = exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR); - // 修改 by 灿能源码:将 lb 替换成 grayLb,表示灰度负载均衡 + // 修改:将 lb 替换成 grayLb,表示灰度负载均衡 if (url == null || (!"grayLb".equals(url.getScheme()) && !"grayLb".equals(schemePrefix))) { return chain.filter(exchange); } @@ -121,7 +121,7 @@ public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Order private Mono> choose(Request lbRequest, String serviceId, Set supportedLifecycleProcessors) { - // 修改 by 灿能源码:直接创建 GrayLoadBalancer 对象 + // 修改:直接创建 GrayLoadBalancer 对象 GrayLoadBalancer loadBalancer = new GrayLoadBalancer( clientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId); supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest)); diff --git a/rdms-gateway/src/main/resources/application.yaml b/rdms-gateway/src/main/resources/application.yaml index 18f7b71..646f8bf 100644 --- a/rdms-gateway/src/main/resources/application.yaml +++ b/rdms-gateway/src/main/resources/application.yaml @@ -76,9 +76,6 @@ knife4j: - name: system-server service-name: rdms-system-server url: /admin-api/system/v3/api-docs - - name: infra-server - service-name: infra-server - url: /admin-api/infra/v3/api-docs - name: bpm-server service-name: bpm-server url: /admin-api/bpm/v3/api-docs @@ -87,4 +84,4 @@ knife4j: rdms: info: - version: 1.0.0 \ No newline at end of file + version: 1.0.0 diff --git a/rdms-gateway/src/main/resources/banner.txt b/rdms-gateway/src/main/resources/banner.txt index 1e3d0e5..364da04 100644 --- a/rdms-gateway/src/main/resources/banner.txt +++ b/rdms-gateway/src/main/resources/banner.txt @@ -1,4 +1,3 @@ -灿能源码 http://www.iocoder.cn Application Version: ${rdms.info.version} Spring Boot Version: ${spring-boot.version} diff --git a/rdms-system/rdms-system-api/README.md b/rdms-system/rdms-system-api/README.md new file mode 100644 index 0000000..b0d1005 --- /dev/null +++ b/rdms-system/rdms-system-api/README.md @@ -0,0 +1,57 @@ +# rdms-system-api + +**概述** +本模块定义了 System(系统)模块对其他模块开放的公共 RPC API 面。它是一个纯 API 的 jar 包:包含 Feign 客户端接口、请求/响应 DTO,以及枚举/常量。不包含 controller 或 service 的实现。 + +**这里包含什么** +- 位于 `com.njcn.rdms.module.system.api.*` 下的 Feign 客户端接口 +- 位于 `com.njcn.rdms.module.system.api.*.dto` 下的 DTO +- 位于 `com.njcn.rdms.module.system.enums.*` 下的系统枚举和常量 + +**API 分组** +- `config`:`ConfigApi`,用于根据 key 读取配置值 +- `dept`:`DeptApi` 和 `PostApi`,用于部门与岗位数据及校验 +- `dict`:`DictDataApi`,用于字典数据校验(继承 `DictDataCommonApi`) +- `file`:`FileApi`,用于文件创建与预签名 URL +- `logger`:`LoginLogApi` 和 `OperateLogApi`(继承 `OperateLogCommonApi`) +- `notify`:`NotifyMessageSendApi`,用于站内消息发送 +- `permission`:`PermissionApi`(继承 `PermissionCommonApi`)以及 `RoleApi` +- `user`:`AdminUserApi`,用于管理员用户查询与校验 +- `websocket`:`WebSocketSenderApi`,用于推送 WebSocket 消息 + +**关键常量** +- `ApiConstants.NAME = "system-server"`(必须与 system 服务的 `spring.application.name` 保持一致) +- `ApiConstants.PREFIX = "/rpc-api/system"` +- `ApiConstants.VERSION = "1.0.0"` + +**用法** +1. 在调用方模块中添加依赖。 + +```xml + + com.njcn + rdms-system-api + +``` + +2. 在调用方服务中启用 Feign 客户端扫描。 + +```java +@EnableFeignClients(basePackages = "com.njcn.rdms.module.system.api") +``` + +3. 注入并调用 API 接口。 + +```java +@Resource +private AdminUserApi adminUserApi; + +public AdminUserRespDTO loadUser(Long id) { + return adminUserApi.getUser(id).getCheckedData(); +} +``` + +**备注** +- 所有方法都返回 `CommonResult`。按需使用 `getCheckedData()` 或 `checkError()`。 +- 有些 API 提供了默认的辅助方法(例如 `FileApi.createFile(...)`、`WebSocketSenderApi.send(...)`)。 +- `DictDataApi`、`OperateLogApi`、`PermissionApi` 继承了来自 `rdms-framework` 的通用 RPC 接口。 diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/logger/dto/LoginLogCreateReqDTO.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/logger/dto/LoginLogCreateReqDTO.java index 54be140..d890293 100644 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/logger/dto/LoginLogCreateReqDTO.java +++ b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/logger/dto/LoginLogCreateReqDTO.java @@ -24,7 +24,7 @@ public class LoginLogCreateReqDTO { private Integer userType; @Schema(description = "用户账号", example = "rdms") @Size(max = 30, message = "用户账号长度不能超过30个字符") - private String username; // 不再强制校验 username 非空,因为 Member 社交登录时,此时暂时没有 username(mobile)! + private String username; // 不再强制校验 username 非空,兼容无 username 的登录场景 @Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "登录结果不能为空") diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApi.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApi.java deleted file mode 100644 index a08f9b3..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApi.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.njcn.rdms.module.system.api.mail; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.module.system.api.mail.dto.MailSendSingleToUserReqDTO; -import com.njcn.rdms.module.system.enums.ApiConstants; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; - -import jakarta.validation.Valid; -import org.springframework.web.bind.annotation.RequestBody; - -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC 服务 - 邮件发送") -public interface MailSendApi { - - String PREFIX = ApiConstants.PREFIX + "/mail/send"; - - @PostMapping(PREFIX + "/send-single-admin") - @Operation(summary = "发送单条邮件给 Admin 用户", description = "在 mail 为空时,使用 userId 加载对应 Admin 的邮箱") - CommonResult sendSingleMailToAdmin(@Valid @RequestBody MailSendSingleToUserReqDTO reqDTO); - - @PostMapping(PREFIX + "/send-single-member") - @Operation(summary = "发送单条邮件给 Member 用户", description = "在 mail 为空时,使用 userId 加载对应 Member 的邮箱") - CommonResult sendSingleMailToMember(@Valid @RequestBody MailSendSingleToUserReqDTO reqDTO); - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java deleted file mode 100644 index d057cea..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.njcn.rdms.module.system.api.mail.dto; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.File; -import java.util.List; -import java.util.Map; - -/** - * 邮件发送 Request DTO - * - * @author hongawen - */ -@Data -public class MailSendSingleToUserReqDTO { - - /** - * 用户编号 - * - * 如果非空,则加载对应用户的邮箱,添加到 {@link #toMails} 中 - */ - private Long userId; - - /** - * 收件邮箱 - */ - private List<@Email String> toMails; - /** - * 抄送邮箱 - */ - private List<@Email String> ccMails; - /** - * 密送邮箱 - */ - private List<@Email String> bccMails; - - - /** - * 邮件模板编号 - */ - @NotNull(message = "邮件模板编号不能为空") - private String templateCode; - /** - * 邮件模板参数 - */ - private Map templateParams; - - /** - * 附件 - */ - private File[] attachments; - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java index 14c2fa4..c5674d9 100644 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java +++ b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/ErrorCodeConstants.java @@ -13,7 +13,6 @@ public interface ErrorCodeConstants { ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_002_000_000, "登录失败,账号密码不正确"); ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_002_000_001, "登录失败,账号被禁用"); ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_004, "验证码不正确,原因:{}"); - ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定"); ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在"); ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}"); @@ -115,19 +114,6 @@ public interface ErrorCodeConstants { ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1_002_016_002, "名字为【{}】的租户套餐已被禁用"); ErrorCode TENANT_PACKAGE_NAME_DUPLICATE = new ErrorCode(1_002_016_003, "已经存在该名字的租户套餐"); - // ========== 社交用户 1-002-018-000 ========== - ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}"); - ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_001, "社交授权失败,找不到对应的用户"); - - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败"); - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_UPLOAD_SHIPPING_INFO_ERROR = new ErrorCode(1_002_018_204, "上传微信小程序发货信息失败"); - ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_ORDER_NOTIFY_CONFIRM_RECEIVE_ERROR = new ErrorCode(1_002_018_205, "上传微信小程序订单收货信息失败"); - ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); - ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置"); - // ========== OAuth2 客户端 1-002-020-000 ========= ErrorCode OAUTH2_CLIENT_NOT_EXISTS = new ErrorCode(1_002_020_000, "OAuth2 客户端不存在"); ErrorCode OAUTH2_CLIENT_EXISTS = new ErrorCode(1_002_020_001, "OAuth2 客户端编号已存在"); @@ -146,18 +132,6 @@ public interface ErrorCodeConstants { ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1_002_022_000, "code 不存在"); ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1_002_022_001, "code 已过期"); - // ========== 邮箱账号 1-002-023-000 ========== - ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1_002_023_000, "邮箱账号不存在"); - ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1_002_023_001, "无法删除,该邮箱账号还有邮件模板"); - - // ========== 邮件模版 1-002-024-000 ========== - ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_024_000, "邮件模版不存在"); - ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1_002_024_001, "邮件模版 code({}) 已存在"); - - // ========== 邮件发送 1-002-025-000 ========== - ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_025_000, "模板参数({})缺失"); - ErrorCode MAIL_SEND_MAIL_NOT_EXISTS = new ErrorCode(1_002_025_001, "邮箱不存在"); - // ========== 站内信模版 1-002-026-000 ========== ErrorCode NOTIFY_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_026_000, "站内信模版不存在"); ErrorCode NOTIFY_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_002_026_001, "已经存在编码为【{}】的站内信模板"); @@ -194,28 +168,10 @@ public interface ErrorCodeConstants { ErrorCode FILE_NOT_EXISTS = new ErrorCode(1_001_003_001, "文件不存在"); ErrorCode FILE_IS_EMPTY = new ErrorCode(1_001_003_002, "文件为空"); - // ========== 代码生成器 1-001-004-000 ========== - ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1_001_004_002, "表定义已经存在"); - ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1_001_004_001, "导入的表不存在"); - ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1_001_004_002, "导入的字段不存在"); - ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_004, "表定义不存在"); - ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_005, "字段义不存在"); - ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1_001_004_006, "同步的字段不存在"); - ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1_001_004_007, "同步失败,不存在改变"); - ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1_001_004_008, "数据库的表注释未填写"); - ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1_001_004_009, "数据库的表字段({})注释未填写"); - ErrorCode CODEGEN_MASTER_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_010, "主表(id={})定义不存在,请检查"); - ErrorCode CODEGEN_SUB_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_011, "子表的字段(id={})不存在,请检查"); - ErrorCode CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE = new ErrorCode(1_001_004_012, "主表生成代码失败,原因:它没有子表"); - // ========== 文件配置 1-001-006-000 ========== ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_006_000, "文件配置不存在"); ErrorCode FILE_CONFIG_DELETE_FAIL_MASTER = new ErrorCode(1_001_006_001, "该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件"); - // ========== 数据源配置 1-001-007-000 ========== - ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_007_000, "数据源配置不存在"); - ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1_001_007_001, "数据源配置不正确,无法进行连接"); - // ========== 学生 1-001-201-000 ========== ErrorCode DEMO01_CONTACT_NOT_EXISTS = new ErrorCode(1_001_201_000, "示例联系人不存在"); ErrorCode DEMO02_CATEGORY_NOT_EXISTS = new ErrorCode(1_001_201_001, "示例分类不存在"); diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnHtmlTypeEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnHtmlTypeEnum.java deleted file mode 100644 index 3347b7b..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnHtmlTypeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段 HTML 展示枚举 - */ -@AllArgsConstructor -@Getter -public enum CodegenColumnHtmlTypeEnum { - - INPUT("input"), // 文本框 - TEXTAREA("textarea"), // 文本域 - SELECT("select"), // 下拉框 - RADIO("radio"), // 单选框 - CHECKBOX("checkbox"), // 复选框 - DATETIME("datetime"), // 日期控件 - IMAGE_UPLOAD("imageUpload"), // 上传图片 - FILE_UPLOAD("fileUpload"), // 上传文件 - EDITOR("editor"), // 富文本控件 - ; - - /** - * 条件 - */ - private final String type; - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnListConditionEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnListConditionEnum.java deleted file mode 100644 index 83dc36e..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenColumnListConditionEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段过滤条件枚举 - */ -@AllArgsConstructor -@Getter -public enum CodegenColumnListConditionEnum { - - EQ("="), - NE("!="), - GT(">"), - GTE(">="), - LT("<"), - LTE("<="), - LIKE("LIKE"), - BETWEEN("BETWEEN"); - - /** - * 条件 - */ - private final String condition; - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenFrontTypeEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenFrontTypeEnum.java deleted file mode 100644 index 89cee3e..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenFrontTypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成的前端类型枚举 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenFrontTypeEnum { - - VUE2_ELEMENT_UI(10), // Vue2 Element UI 标准模版 - - VUE3_ELEMENT_PLUS(20), // Vue3 Element Plus 标准模版 - - VUE3_VBEN2_ANTD_SCHEMA(30), // Vue3 VBEN2 + ANTD + Schema 模版 - - VUE3_VBEN5_ANTD_SCHEMA(40), // Vue3 VBEN5 + ANTD + schema 模版 - VUE3_VBEN5_ANTD_GENERAL(41), // Vue3 VBEN5 + ANTD 标准模版 - - VUE3_VBEN5_EP_SCHEMA(50), // Vue3 VBEN5 + EP + schema 模版 - VUE3_VBEN5_EP_GENERAL(51), // Vue3 VBEN5 + EP 标准模版 - - VUE3_ADMIN_UNIAPP_WOT(60), // Vue3 Admin + Uniapp + WOT 标准模版 - ; - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenSceneEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenSceneEnum.java deleted file mode 100644 index b4382b5..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenSceneEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import static cn.hutool.core.util.ArrayUtil.firstMatch; - -/** - * 代码生成的场景枚举 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenSceneEnum { - - ADMIN(1, "管理后台", "admin", ""), - APP(2, "用户 APP", "app", "App"); - - /** - * 场景 - */ - private final Integer scene; - /** - * 场景名 - */ - private final String name; - /** - * 基础包名 - */ - private final String basePackage; - /** - * Controller 和 VO 类的前缀 - */ - private final String prefixClass; - - public static CodegenSceneEnum valueOf(Integer scene) { - return firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), values()); - } - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenTemplateTypeEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenTemplateTypeEnum.java deleted file mode 100644 index 06b824b..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenTemplateTypeEnum.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import com.njcn.rdms.framework.common.util.object.ObjectUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 代码生成模板类型 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenTemplateTypeEnum { - - ONE(1), // 单表(增删改查) - TREE(2), // 树表(增删改查) - - MASTER_NORMAL(10), // 主子表 - 主表 - 普通模式 - MASTER_ERP(11), // 主子表 - 主表 - ERP 模式 - MASTER_INNER(12), // 主子表 - 主表 - 内嵌模式 - SUB(15), // 主子表 - 子表 - ; - - /** - * 类型 - */ - private final Integer type; - - /** - * 是否为主表 - * - * @param type 类型 - * @return 是否主表 - */ - public static boolean isMaster(Integer type) { - return ObjectUtils.equalsAny(type, - MASTER_NORMAL.type, MASTER_ERP.type, MASTER_INNER.type); - } - - /** - * 是否为树表 - * - * @param type 类型 - * @return 是否树表 - */ - public static boolean isTree(Integer type) { - return Objects.equals(type, TREE.type); - } - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenVOTypeEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenVOTypeEnum.java deleted file mode 100644 index 893374e..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/codegen/CodegenVOTypeEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.rdms.module.system.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成的 VO 类型枚举 - * - * 目前的作用:Controller 新增、修改、响应时,使用 VO 还是 DO - * 注意:不包括 Controller 的分页参数! - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenVOTypeEnum { - - VO(10, "VO"), - DO(20, "DO"); - - /** - * 场景 - */ - private final Integer type; - /** - * 场景名 - */ - private final String name; - -} diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/logger/LoginLogTypeEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/logger/LoginLogTypeEnum.java index b70eb51..4b95f81 100644 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/logger/LoginLogTypeEnum.java +++ b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/logger/LoginLogTypeEnum.java @@ -11,7 +11,6 @@ import lombok.Getter; public enum LoginLogTypeEnum { LOGIN_USERNAME(100), // 使用账号登录 - LOGIN_SOCIAL(101), // 使用社交登录 LOGIN_MOBILE(103), // 使用手机登陆 LOGIN_SMS(104), // 使用短信登陆 diff --git a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/mail/MailSendStatusEnum.java b/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/mail/MailSendStatusEnum.java deleted file mode 100644 index 4769ce8..0000000 --- a/rdms-system/rdms-system-api/src/main/java/com/njcn/rdms/module/system/enums/mail/MailSendStatusEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.njcn.rdms.module.system.enums.mail; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 邮件的发送状态枚举 - * - * @author hongawen - * @since 2022/4/10 13:39 - */ -@Getter -@AllArgsConstructor -public enum MailSendStatusEnum { - - INIT(0), // 初始化 - SUCCESS(10), // 发送成功 - FAILURE(20), // 发送失败 - IGNORE(30), // 忽略,即不发送 - ; - - private final int status; - -} diff --git a/rdms-system/rdms-system-boot/pom.xml b/rdms-system/rdms-system-boot/pom.xml index 6205048..e84fce3 100644 --- a/rdms-system/rdms-system-boot/pom.xml +++ b/rdms-system/rdms-system-boot/pom.xml @@ -49,10 +49,6 @@ com.njcn rdms-spring-boot-starter-mybatis - - com.baomidou - mybatis-plus-generator - com.njcn @@ -104,28 +100,12 @@ rdms-spring-boot-starter-excel - - org.apache.velocity - velocity-engine-core - - - - - org.springframework.boot - spring-boot-starter-mail - - com.anji-plus captcha-spring-boot-starter - - org.dromara.hutool - hutool-extra - - org.apache.tika tika-core diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiAccessLogApiImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiAccessLogApiImpl.java index f46f414..a61516a 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiAccessLogApiImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiAccessLogApiImpl.java @@ -1,7 +1,7 @@ package com.njcn.rdms.module.system.api.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiAccessLogCommonApi; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.ApiAccessLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.CommonResult; import com.njcn.rdms.module.system.service.logger.ApiAccessLogService; import jakarta.annotation.Resource; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiErrorLogApiImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiErrorLogApiImpl.java index fe36053..0f621d8 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiErrorLogApiImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/logger/ApiErrorLogApiImpl.java @@ -1,7 +1,7 @@ package com.njcn.rdms.module.system.api.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.ApiErrorLogCommonApi; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.ApiErrorLogCommonApi; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.CommonResult; import com.njcn.rdms.module.system.service.logger.ApiErrorLogService; import jakarta.annotation.Resource; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApiImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApiImpl.java deleted file mode 100644 index eb114b5..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/api/mail/MailSendApiImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.njcn.rdms.module.system.api.mail; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.module.system.api.mail.dto.MailSendSingleToUserReqDTO; -import com.njcn.rdms.module.system.service.mail.MailSendService; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; - -@RestController // 提供 RESTful API 接口,给 Feign 调用 -@Validated -public class MailSendApiImpl implements MailSendApi { - - @Resource - private MailSendService mailSendService; - - @Override - public CommonResult sendSingleMailToAdmin(MailSendSingleToUserReqDTO reqDTO) { - return success(mailSendService.sendSingleMailToAdmin(reqDTO.getUserId(), - reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(), - reqDTO.getTemplateCode(), reqDTO.getTemplateParams(), reqDTO.getAttachments())); - } - - @Override - public CommonResult sendSingleMailToMember(MailSendSingleToUserReqDTO reqDTO) { - return success(mailSendService.sendSingleMailToMember(reqDTO.getUserId(), - reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(), - reqDTO.getTemplateCode(), reqDTO.getTemplateParams(), reqDTO.getAttachments())); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/CodegenController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/CodegenController.java deleted file mode 100644 index 436416b..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/CodegenController.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ZipUtil; -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenDetailRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenPreviewRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTableRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.rdms.module.system.convert.codegen.CodegenConvert; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.rdms.module.system.service.codegen.CodegenService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; -import static com.njcn.rdms.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname; -import static com.njcn.rdms.module.system.framework.file.core.utils.FileTypeUtils.writeAttachment; - -@Tag(name = "管理后台 - 代码生成器") -@RestController -@RequestMapping("/infra/codegen") -@Validated -public class CodegenController { - - @Resource - private CodegenService codegenService; - - @GetMapping("/db/table/list") - @Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表") - @Parameters({ - @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1"), - @Parameter(name = "name", description = "表名,模糊匹配", example = "rdms"), - @Parameter(name = "comment", description = "描述,模糊匹配", example = "灿能") - }) - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getDatabaseTableList( - @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId, - @RequestParam(value = "name", required = false) String name, - @RequestParam(value = "comment", required = false) String comment) { - return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment)); - } - - @GetMapping("/table/list") - @Operation(summary = "获得表定义列表") - @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getCodegenTableList(@RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId) { - List list = codegenService.getCodegenTableList(dataSourceConfigId); - return success(BeanUtils.toBean(list, CodegenTableRespVO.class)); - } - - @GetMapping("/table/page") - @Operation(summary = "获得表定义分页") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getCodegenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { - PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, CodegenTableRespVO.class)); - } - - @GetMapping("/detail") - @Operation(summary = "获得表和字段的明细") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { - CodegenTableDO table = codegenService.getCodegenTable(tableId); - List columns = codegenService.getCodegenColumnListByTableId(tableId); - // 拼装返回 - return success(CodegenConvert.INSTANCE.convert(table, columns)); - } - - @Operation(summary = "基于数据库的表结构,创建代码生成器的表和字段定义") - @PostMapping("/create-list") - @PreAuthorize("@ss.hasPermission('infra:codegen:create')") - public CommonResult> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) { - return success(codegenService.createCodegenList(getLoginUserNickname(), reqVO)); - } - - @Operation(summary = "更新数据库的表和字段定义") - @PutMapping("/update") - @PreAuthorize("@ss.hasPermission('infra:codegen:update')") - public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { - codegenService.updateCodegen(updateReqVO); - return success(true); - } - - @Operation(summary = "基于数据库的表结构,同步数据库的表和字段定义") - @PutMapping("/sync-from-db") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:update')") - public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { - codegenService.syncCodegenFromDB(tableId); - return success(true); - } - - @Operation(summary = "删除数据库的表和字段定义") - @DeleteMapping("/delete") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") - public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { - codegenService.deleteCodegen(tableId); - return success(true); - } - - @Operation(summary = "批量删除数据库的表和字段定义") - @DeleteMapping("/delete-list") - @Parameter(name = "tableIds", description = "表编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") - public CommonResult deleteCodegenList(@RequestParam("tableIds") List tableIds) { - codegenService.deleteCodegenList(tableIds); - return success(true); - } - - @Operation(summary = "预览生成代码") - @GetMapping("/preview") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:preview')") - public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { - Map codes = codegenService.generationCodes(tableId); - return success(CodegenConvert.INSTANCE.convert(codes)); - } - - @Operation(summary = "下载生成代码") - @GetMapping("/download") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:download')") - public void downloadCodegen(@RequestParam("tableId") Long tableId, - HttpServletResponse response) throws IOException { - // 生成代码 - Map codes = codegenService.generationCodes(tableId); - // 构建 zip 包 - String[] paths = codes.keySet().toArray(new String[0]); - ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipUtil.zip(outputStream, paths, ins); - // 输出 - writeAttachment(response, "codegen.zip", outputStream.toByteArray()); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenCreateListReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenCreateListReqVO.java deleted file mode 100644 index 086d50a..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenCreateListReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") -@Data -public class CodegenCreateListReqVO { - - @Schema(description = "数据源配置的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "数据源配置的编号不能为空") - private Long dataSourceConfigId; - - @Schema(description = "表名数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2, 3]") - @NotNull(message = "表名数组不能为空") - private List tableNames; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenDetailRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenDetailRespVO.java deleted file mode 100644 index 3566579..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenDetailRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo; - -import com.njcn.rdms.module.system.controller.admin.codegen.vo.column.CodegenColumnRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTableRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 代码生成表和字段的明细 Response VO") -@Data -public class CodegenDetailRespVO { - - @Schema(description = "表定义") - private CodegenTableRespVO table; - - @Schema(description = "字段定义") - private List columns; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenPreviewRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenPreviewRespVO.java deleted file mode 100644 index c3d4eaa..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenPreviewRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 代码生成预览 Response VO,注意,每个文件都是一个该对象") -@Data -public class CodegenPreviewRespVO { - - @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "java/com.njcn.rdms/adminserver/modules/system/controller/test/SysTestDemoController.java") - private String filePath; - - @Schema(description = "代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "Hello World") - private String code; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenUpdateReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenUpdateReqVO.java deleted file mode 100644 index b3bb4df..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/CodegenUpdateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo; - -import com.njcn.rdms.module.system.controller.admin.codegen.vo.column.CodegenColumnSaveReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTableSaveReqVO; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 代码生成表和字段的修改 Request VO") -@Data -public class CodegenUpdateReqVO { - - @Valid // 校验内嵌的字段 - @NotNull(message = "表定义不能为空") - private CodegenTableSaveReqVO table; - - @Valid // 校验内嵌的字段 - @NotNull(message = "字段定义不能为空") - private List columns; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnRespVO.java deleted file mode 100644 index 8566981..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnRespVO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.column; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 代码生成字段定义 Response VO") -@Data -public class CodegenColumnRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long tableId; - - @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") - private String columnName; - - @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") - private String dataType; - - @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") - private String columnComment; - - @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean nullable; - - @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean primaryKey; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer ordinalPosition; - - @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") - private String javaType; - - @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") - private String javaField; - - @Schema(description = "字典类型", example = "sys_gender") - private String dictType; - - @Schema(description = "数据示例", example = "1024") - private String example; - - @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean createOperation; - - @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean updateOperation; - - @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean listOperation; - - @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") - private String listOperationCondition; - - @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean listOperationResult; - - @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") - private String htmlType; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java deleted file mode 100644 index 835600d..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.column; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管理后台 - 代码生成字段定义创建/修改 Request VO") -@Data -public class CodegenColumnSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "表编号不能为空") - private Long tableId; - - @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") - @NotNull(message = "字段名不能为空") - private String columnName; - - @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") - @NotNull(message = "字段类型不能为空") - private String dataType; - - @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") - @NotNull(message = "字段描述不能为空") - private String columnComment; - - @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否允许为空不能为空") - private Boolean nullable; - - @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是否主键不能为空") - private Boolean primaryKey; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "排序不能为空") - private Integer ordinalPosition; - - @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") - @NotNull(message = "Java 属性类型不能为空") - private String javaType; - - @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") - @NotNull(message = "Java 属性名不能为空") - private String javaField; - - @Schema(description = "字典类型", example = "sys_gender") - private String dictType; - - @Schema(description = "数据示例", example = "1024") - private String example; - - @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 Create 创建操作的字段不能为空") - private Boolean createOperation; - - @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是否为 Update 更新操作的字段不能为空") - private Boolean updateOperation; - - @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 List 查询操作的字段不能为空") - private Boolean listOperation; - - @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") - @NotNull(message = "List 查询操作的条件类型不能为空") - private String listOperationCondition; - - @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 List 查询操作的返回字段不能为空") - private Boolean listOperationResult; - - @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") - @NotNull(message = "显示类型不能为空") - private String htmlType; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java deleted file mode 100644 index 9bd0091..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.table; - -import com.njcn.rdms.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 表定义分页 Request VO") -@Data -public class CodegenTablePageReqVO extends PageParam { - - @Schema(description = "表名称,模糊匹配", example = "rdms") - private String tableName; - - @Schema(description = "表描述,模糊匹配", example = "灿能") - private String tableComment; - - @Schema(description = "实体,模糊匹配", example = "Rdms") - private String className; - - @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableRespVO.java deleted file mode 100644 index 46f55c3..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableRespVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.table; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 代码生成表定义 Response VO") -@Data -public class CodegenTableRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer scene; - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms") - private String tableName; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能") - private String tableComment; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") - private String moduleName; - - @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") - private String businessName; - - @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") - private String className; - - @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") - private String classComment; - - @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - private String author; - - @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer templateType; - - @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer frontType; - - @Schema(description = "父菜单编号", example = "1024") - private Long parentMenuId; - - @Schema(description = "主表的编号", example = "2048") - private Long masterTableId; - @Schema(description = "子表关联主表的字段编号", example = "4096") - private Long subJoinColumnId; - @Schema(description = "主表与子表是否一对多", example = "4096") - private Boolean subJoinMany; - - @Schema(description = "树表的父字段编号", example = "8192") - private Long treeParentColumnId; - @Schema(description = "树表的名字字段编号", example = "16384") - private Long treeNameColumnId; - - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer dataSourceConfigId; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime updateTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java deleted file mode 100644 index fa1e857..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.table; - -import cn.hutool.core.util.ObjectUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.njcn.rdms.module.system.enums.codegen.CodegenSceneEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenTemplateTypeEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管理后台 - 代码生成表定义创建/修改 Response VO") -@Data -public class CodegenTableSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "导入类型不能为空") - private Integer scene; - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms") - @NotNull(message = "表名称不能为空") - private String tableName; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能") - @NotNull(message = "表描述不能为空") - private String tableComment; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") - @NotNull(message = "模块名不能为空") - private String moduleName; - - @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") - @NotNull(message = "业务名不能为空") - private String businessName; - - @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") - @NotNull(message = "类名称不能为空") - private String className; - - @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") - @NotNull(message = "类描述不能为空") - private String classComment; - - @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - @NotNull(message = "作者不能为空") - private String author; - - @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "模板类型不能为空") - private Integer templateType; - - @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - @NotNull(message = "前端类型不能为空") - private Integer frontType; - - @Schema(description = "父菜单编号", example = "1024") - private Long parentMenuId; - - @Schema(description = "主表的编号", example = "2048") - private Long masterTableId; - @Schema(description = "子表关联主表的字段编号", example = "4096") - private Long subJoinColumnId; - @Schema(description = "主表与子表是否一对多", example = "4096") - private Boolean subJoinMany; - - @Schema(description = "树表的父字段编号", example = "8192") - private Long treeParentColumnId; - @Schema(description = "树表的名字字段编号", example = "16384") - private Long treeNameColumnId; - - @AssertTrue(message = "上级菜单不能为空,请前往 [修改生成配置 -> 生成信息] 界面,设置“上级菜单”字段") - @JsonIgnore - public boolean isParentMenuIdValid() { - // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 - return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene()) - || getParentMenuId() != null; - } - - @AssertTrue(message = "关联的父表信息不全") - @JsonIgnore - public boolean isSubValid() { - return ObjectUtil.notEqual(getTemplateType(), CodegenTemplateTypeEnum.SUB) - || (ObjectUtil.isAllNotEmpty(masterTableId, subJoinColumnId, subJoinMany)); - } - - @AssertTrue(message = "关联的树表信息不全") - @JsonIgnore - public boolean isTreeValid() { - return ObjectUtil.notEqual(templateType, CodegenTemplateTypeEnum.TREE) - || (ObjectUtil.isAllNotEmpty(treeParentColumnId, treeNameColumnId)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/DatabaseTableRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/DatabaseTableRespVO.java deleted file mode 100644 index 919410a..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/codegen/vo/table/DatabaseTableRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.codegen.vo.table; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 数据库的表定义 Response VO") -@Data -public class DatabaseTableRespVO { - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yuanma") - private String name; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - private String comment; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/config/ConfigController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/config/ConfigController.java index 6ed90f2..af8c676 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/config/ConfigController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/config/ConfigController.java @@ -31,7 +31,7 @@ import static com.njcn.rdms.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 参数配置") @RestController -@RequestMapping("/infra/config") +@RequestMapping("/system/config") @Validated public class ConfigController { @@ -40,14 +40,14 @@ public class ConfigController { @PostMapping("/create") @Operation(summary = "创建参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:create')") + @PreAuthorize("@ss.hasPermission('system:config:create')") public CommonResult createConfig(@Valid @RequestBody ConfigSaveReqVO createReqVO) { return success(configService.createConfig(createReqVO)); } @PutMapping("/update") @Operation(summary = "修改参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:update')") + @PreAuthorize("@ss.hasPermission('system:config:update')") public CommonResult updateConfig(@Valid @RequestBody ConfigSaveReqVO updateReqVO) { configService.updateConfig(updateReqVO); return success(true); @@ -56,7 +56,7 @@ public class ConfigController { @DeleteMapping("/delete") @Operation(summary = "删除参数配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:config:delete')") + @PreAuthorize("@ss.hasPermission('system:config:delete')") public CommonResult deleteConfig(@RequestParam("id") Long id) { configService.deleteConfig(id); return success(true); @@ -65,7 +65,7 @@ public class ConfigController { @DeleteMapping("/delete-list") @Operation(summary = "批量删除参数配置") @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:config:delete')") + @PreAuthorize("@ss.hasPermission('system:config:delete')") public CommonResult deleteConfigList(@RequestParam("ids") List ids) { configService.deleteConfigList(ids); return success(true); @@ -74,7 +74,7 @@ public class ConfigController { @GetMapping(value = "/get") @Operation(summary = "获得参数配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:config:query')") + @PreAuthorize("@ss.hasPermission('system:config:query')") public CommonResult getConfig(@RequestParam("id") Long id) { return success(ConfigConvert.INSTANCE.convert(configService.getConfig(id))); } @@ -95,7 +95,7 @@ public class ConfigController { @GetMapping("/page") @Operation(summary = "获取参数配置分页") - @PreAuthorize("@ss.hasPermission('infra:config:query')") + @PreAuthorize("@ss.hasPermission('system:config:query')") public CommonResult> getConfigPage(@Valid ConfigPageReqVO pageReqVO) { PageResult page = configService.getConfigPage(pageReqVO); return success(ConfigConvert.INSTANCE.convertPage(page)); @@ -103,7 +103,7 @@ public class ConfigController { @GetMapping("/export-excel") @Operation(summary = "导出参数配置") - @PreAuthorize("@ss.hasPermission('infra:config:export')") + @PreAuthorize("@ss.hasPermission('system:config:export')") @ApiAccessLog(operateType = EXPORT) public void exportConfig(ConfigPageReqVO exportReqVO, HttpServletResponse response) throws IOException { @@ -115,3 +115,4 @@ public class ConfigController { } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/DataSourceConfigController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/DataSourceConfigController.java deleted file mode 100644 index b28747d..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/DataSourceConfigController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.db; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.db.vo.DataSourceConfigRespVO; -import com.njcn.rdms.module.system.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.rdms.module.system.service.db.DataSourceConfigService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 数据源配置") -@RestController -@RequestMapping("/infra/data-source-config") -@Validated -public class DataSourceConfigController { - - @Resource - private DataSourceConfigService dataSourceConfigService; - - @PostMapping("/create") - @Operation(summary = "创建数据源配置") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:create')") - public CommonResult createDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO createReqVO) { - return success(dataSourceConfigService.createDataSourceConfig(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新数据源配置") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:update')") - public CommonResult updateDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO updateReqVO) { - dataSourceConfigService.updateDataSourceConfig(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除数据源配置") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") - public CommonResult deleteDataSourceConfig(@RequestParam("id") Long id) { - dataSourceConfigService.deleteDataSourceConfig(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Operation(summary = "批量删除数据源配置") - @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") - public CommonResult deleteDataSourceConfigList(@RequestParam("ids") List ids) { - dataSourceConfigService.deleteDataSourceConfigList(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得数据源配置") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") - public CommonResult getDataSourceConfig(@RequestParam("id") Long id) { - DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(id); - return success(BeanUtils.toBean(config, DataSourceConfigRespVO.class)); - } - - @GetMapping("/list") - @Operation(summary = "获得数据源配置列表") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") - public CommonResult> getDataSourceConfigList() { - List list = dataSourceConfigService.getDataSourceConfigList(); - return success(BeanUtils.toBean(list, DataSourceConfigRespVO.class)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigRespVO.java deleted file mode 100644 index 4b39495..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.db.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 数据源配置 Response VO") -@Data -public class DataSourceConfigRespVO { - - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - private String name; - - @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") - private String url; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") - private String username; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigSaveReqVO.java deleted file mode 100644 index 9f4d4bc..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/db/vo/DataSourceConfigSaveReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.db.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管理后台 - 数据源配置创建/修改 Request VO") -@Data -public class DataSourceConfigSaveReqVO { - - @Schema(description = "主键编号", example = "1024") - private Long id; - - @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - @NotNull(message = "数据源名称不能为空") - private String name; - - @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") - @NotNull(message = "数据源连接不能为空") - private String url; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") - @NotNull(message = "用户名不能为空") - private String username; - - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - @NotNull(message = "密码不能为空") - private String password; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.http b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.http index fa7fb6f..002de56 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.http +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.http @@ -1,5 +1,5 @@ -### 请求 /infra/file-config/create 接口 => 成功 -POST {{baseUrl}}/infra/file-config/create +### 请求 /system/file-config/create 接口 => 成功 +POST {{baseUrl}}/system/file-config/create Content-Type: application/json tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} @@ -18,8 +18,8 @@ Authorization: Bearer {{token}} } } -### 请求 /infra/file-config/update 接口 => 成功 -PUT {{baseUrl}}/infra/file-config/update +### 请求 /system/file-config/update 接口 => 成功 +PUT {{baseUrl}}/system/file-config/update Content-Type: application/json tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} @@ -38,8 +38,9 @@ Authorization: Bearer {{token}} } } -### 请求 /infra/file-config/test 接口 => 成功 -GET {{baseUrl}}/infra/file-config/test?id=2 +### 请求 /system/file-config/test 接口 => 成功 +GET {{baseUrl}}/system/file-config/test?id=2 Content-Type: application/json tenant-id: {{adminTenantId}} Authorization: Bearer {{token}} + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.java index adad4c7..5dfaa4b 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileConfigController.java @@ -23,7 +23,7 @@ import static com.njcn.rdms.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 文件配置") @RestController -@RequestMapping("/infra/file-config") +@RequestMapping("/system/file-config") @Validated public class FileConfigController { @@ -32,14 +32,14 @@ public class FileConfigController { @PostMapping("/create") @Operation(summary = "创建文件配置") - @PreAuthorize("@ss.hasPermission('infra:file-config:create')") + @PreAuthorize("@ss.hasPermission('system:file-config:create')") public CommonResult createFileConfig(@Valid @RequestBody FileConfigSaveReqVO createReqVO) { return success(fileConfigService.createFileConfig(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新文件配置") - @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + @PreAuthorize("@ss.hasPermission('system:file-config:update')") public CommonResult updateFileConfig(@Valid @RequestBody FileConfigSaveReqVO updateReqVO) { fileConfigService.updateFileConfig(updateReqVO); return success(true); @@ -47,7 +47,7 @@ public class FileConfigController { @PutMapping("/update-master") @Operation(summary = "更新文件配置为 Master") - @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + @PreAuthorize("@ss.hasPermission('system:file-config:update')") public CommonResult updateFileConfigMaster(@RequestParam("id") Long id) { fileConfigService.updateFileConfigMaster(id); return success(true); @@ -56,7 +56,7 @@ public class FileConfigController { @DeleteMapping("/delete") @Operation(summary = "删除文件配置") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + @PreAuthorize("@ss.hasPermission('system:file-config:delete')") public CommonResult deleteFileConfig(@RequestParam("id") Long id) { fileConfigService.deleteFileConfig(id); return success(true); @@ -65,7 +65,7 @@ public class FileConfigController { @DeleteMapping("/delete-list") @Operation(summary = "批量删除文件配置") @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + @PreAuthorize("@ss.hasPermission('system:file-config:delete')") public CommonResult deleteFileConfigList(@RequestParam("ids") List ids) { fileConfigService.deleteFileConfigList(ids); return success(true); @@ -74,7 +74,7 @@ public class FileConfigController { @GetMapping("/get") @Operation(summary = "获得文件配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + @PreAuthorize("@ss.hasPermission('system:file-config:query')") public CommonResult getFileConfig(@RequestParam("id") Long id) { FileConfigDO config = fileConfigService.getFileConfig(id); return success(BeanUtils.toBean(config, FileConfigRespVO.class)); @@ -82,7 +82,7 @@ public class FileConfigController { @GetMapping("/page") @Operation(summary = "获得文件配置分页") - @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + @PreAuthorize("@ss.hasPermission('system:file-config:query')") public CommonResult> getFileConfigPage(@Valid FileConfigPageReqVO pageVO) { PageResult pageResult = fileConfigService.getFileConfigPage(pageVO); return success(BeanUtils.toBean(pageResult, FileConfigRespVO.class)); @@ -90,9 +90,10 @@ public class FileConfigController { @GetMapping("/test") @Operation(summary = "测试文件配置是否正确") - @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + @PreAuthorize("@ss.hasPermission('system:file-config:query')") public CommonResult testFileConfig(@RequestParam("id") Long id) throws Exception { String url = fileConfigService.testFileConfig(id); return success(url); } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileController.java index 6c2a4f0..827c013 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/file/FileController.java @@ -34,7 +34,7 @@ import static com.njcn.rdms.module.system.framework.file.core.utils.FileTypeUtil @Tag(name = "管理后台 - 文件存储") @RestController -@RequestMapping("/infra/file") +@RequestMapping("/system/file") @Validated @Slf4j public class FileController { @@ -74,7 +74,7 @@ public class FileController { @GetMapping("/get") @Operation(summary = "获得文件") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:file:query')") + @PreAuthorize("@ss.hasPermission('system:file:query')") public CommonResult getFile(@RequestParam("id") Long id) { return success(BeanUtils.toBean(fileService.getFile(id), FileRespVO.class)); } @@ -82,7 +82,7 @@ public class FileController { @DeleteMapping("/delete") @Operation(summary = "删除文件") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:file:delete')") + @PreAuthorize("@ss.hasPermission('system:file:delete')") public CommonResult deleteFile(@RequestParam("id") Long id) throws Exception { fileService.deleteFile(id); return success(true); @@ -91,7 +91,7 @@ public class FileController { @DeleteMapping("/delete-list") @Operation(summary = "批量删除文件") @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:file:delete')") + @PreAuthorize("@ss.hasPermission('system:file:delete')") public CommonResult deleteFileList(@RequestParam("ids") List ids) throws Exception { fileService.deleteFileList(ids); return success(true); @@ -127,10 +127,11 @@ public class FileController { @GetMapping("/page") @Operation(summary = "获得文件分页") - @PreAuthorize("@ss.hasPermission('infra:file:query')") + @PreAuthorize("@ss.hasPermission('system:file:query')") public CommonResult> getFilePage(@Valid FilePageReqVO pageVO) { PageResult pageResult = fileService.getFilePage(pageVO); return success(BeanUtils.toBean(pageResult, FileRespVO.class)); } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiAccessLogController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiAccessLogController.java index ffe1333..f42e227 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiAccessLogController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiAccessLogController.java @@ -31,7 +31,7 @@ import static com.njcn.rdms.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - API 访问日志") @RestController -@RequestMapping("/infra/api-access-log") +@RequestMapping("/system/api-access-log") @Validated public class ApiAccessLogController { @@ -41,7 +41,7 @@ public class ApiAccessLogController { @GetMapping("/get") @Operation(summary = "获得 API 访问日志") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + @PreAuthorize("@ss.hasPermission('system:api-access-log:query')") public CommonResult getApiAccessLog(@RequestParam("id") Long id) { ApiAccessLogDO apiAccessLog = apiAccessLogService.getApiAccessLog(id); return success(BeanUtils.toBean(apiAccessLog, ApiAccessLogRespVO.class)); @@ -49,7 +49,7 @@ public class ApiAccessLogController { @GetMapping("/page") @Operation(summary = "获得API 访问日志分页") - @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + @PreAuthorize("@ss.hasPermission('system:api-access-log:query')") public CommonResult> getApiAccessLogPage(@Valid ApiAccessLogPageReqVO pageReqVO) { PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageReqVO); return success(BeanUtils.toBean(pageResult, ApiAccessLogRespVO.class)); @@ -57,7 +57,7 @@ public class ApiAccessLogController { @GetMapping("/export-excel") @Operation(summary = "导出API 访问日志 Excel") - @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") + @PreAuthorize("@ss.hasPermission('system:api-access-log:export')") @ApiAccessLog(operateType = EXPORT) public void exportApiAccessLogExcel(@Valid ApiAccessLogPageReqVO exportReqVO, HttpServletResponse response) throws IOException { @@ -69,3 +69,4 @@ public class ApiAccessLogController { } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiErrorLogController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiErrorLogController.java index ee9ee50..a7525e3 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiErrorLogController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/ApiErrorLogController.java @@ -30,7 +30,7 @@ import static com.njcn.rdms.framework.security.core.util.SecurityFrameworkUtils. @Tag(name = "管理后台 - API 错误日志") @RestController -@RequestMapping("/infra/api-error-log") +@RequestMapping("/system/api-error-log") @Validated public class ApiErrorLogController { @@ -43,7 +43,7 @@ public class ApiErrorLogController { @Parameter(name = "id", description = "编号", required = true, example = "1024"), @Parameter(name = "processStatus", description = "处理状态", required = true, example = "1") }) - @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") + @PreAuthorize("@ss.hasPermission('system:api-error-log:update-status')") public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, @RequestParam("processStatus") Integer processStatus) { apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); @@ -53,7 +53,7 @@ public class ApiErrorLogController { @GetMapping("/get") @Operation(summary = "获得 API 错误日志") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + @PreAuthorize("@ss.hasPermission('system:api-error-log:query')") public CommonResult getApiErrorLog(@RequestParam("id") Long id) { ApiErrorLogDO apiErrorLog = apiErrorLogService.getApiErrorLog(id); return success(BeanUtils.toBean(apiErrorLog, ApiErrorLogRespVO.class)); @@ -61,7 +61,7 @@ public class ApiErrorLogController { @GetMapping("/page") @Operation(summary = "获得 API 错误日志分页") - @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + @PreAuthorize("@ss.hasPermission('system:api-error-log:query')") public CommonResult> getApiErrorLogPage(@Valid ApiErrorLogPageReqVO pageReqVO) { PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageReqVO); return success(BeanUtils.toBean(pageResult, ApiErrorLogRespVO.class)); @@ -69,7 +69,7 @@ public class ApiErrorLogController { @GetMapping("/export-excel") @Operation(summary = "导出 API 错误日志 Excel") - @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") + @PreAuthorize("@ss.hasPermission('system:api-error-log:export')") @ApiAccessLog(operateType = EXPORT) public void exportApiErrorLogExcel(@Valid ApiErrorLogPageReqVO exportReqVO, HttpServletResponse response) throws IOException { @@ -81,3 +81,4 @@ public class ApiErrorLogController { } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java index 96ffb26..e1a1954 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java @@ -89,7 +89,7 @@ public class ApiAccessLogRespVO { @ExcelProperty("结果码") private Integer resultCode; - @Schema(description = "结果提示", example = "灿能源码,牛逼!") + @Schema(description = "结果提示", example = "灿能,牛逼!") @ExcelProperty("结果提示") private String resultMsg; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailAccountController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailAccountController.java deleted file mode 100644 index 2e640d3..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailAccountController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail; - - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountRespVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountSimpleRespVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import com.njcn.rdms.module.system.service.mail.MailAccountService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 邮箱账号") -@RestController -@RequestMapping("/system/mail-account") -public class MailAccountController { - - @Resource - private MailAccountService mailAccountService; - - @PostMapping("/create") - @Operation(summary = "创建邮箱账号") - @PreAuthorize("@ss.hasPermission('system:mail-account:create')") - public CommonResult createMailAccount(@Valid @RequestBody MailAccountSaveReqVO createReqVO) { - return success(mailAccountService.createMailAccount(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改邮箱账号") - @PreAuthorize("@ss.hasPermission('system:mail-account:update')") - public CommonResult updateMailAccount(@Valid @RequestBody MailAccountSaveReqVO updateReqVO) { - mailAccountService.updateMailAccount(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除邮箱账号") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") - public CommonResult deleteMailAccount(@RequestParam Long id) { - mailAccountService.deleteMailAccount(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Operation(summary = "批量删除邮箱账号") - @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") - public CommonResult deleteMailAccountList(@RequestParam("ids") List ids) { - mailAccountService.deleteMailAccountList(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得邮箱账号") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:mail-account:query')") - public CommonResult getMailAccount(@RequestParam("id") Long id) { - MailAccountDO account = mailAccountService.getMailAccount(id); - return success(BeanUtils.toBean(account, MailAccountRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得邮箱账号分页") - @PreAuthorize("@ss.hasPermission('system:mail-account:query')") - public CommonResult> getMailAccountPage(@Valid MailAccountPageReqVO pageReqVO) { - PageResult pageResult = mailAccountService.getMailAccountPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MailAccountRespVO.class)); - } - - @GetMapping({"/list-all-simple", "simple-list"}) - @Operation(summary = "获得邮箱账号精简列表") - public CommonResult> getSimpleMailAccountList() { - List list = mailAccountService.getMailAccountList(); - return success(BeanUtils.toBean(list, MailAccountSimpleRespVO.class)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailLogController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailLogController.java deleted file mode 100644 index 5e804f2..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailLogController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.log.MailLogRespVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailLogDO; -import com.njcn.rdms.module.system.service.mail.MailLogService; -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.security.access.prepost.PreAuthorize; -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 jakarta.annotation.Resource; -import jakarta.validation.Valid; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 邮件日志") -@RestController -@RequestMapping("/system/mail-log") -public class MailLogController { - - @Resource - private MailLogService mailLogService; - - @GetMapping("/page") - @Operation(summary = "获得邮箱日志分页") - @PreAuthorize("@ss.hasPermission('system:mail-log:query')") - public CommonResult> getMailLogPage(@Valid MailLogPageReqVO pageVO) { - PageResult pageResult = mailLogService.getMailLogPage(pageVO); - return success(BeanUtils.toBean(pageResult, MailLogRespVO.class)); - } - - @GetMapping("/get") - @Operation(summary = "获得邮箱日志") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:mail-log:query')") - public CommonResult getMailTemplate(@RequestParam("id") Long id) { - MailLogDO log = mailLogService.getMailLog(id); - return success(BeanUtils.toBean(log, MailLogRespVO.class)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.http b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.http deleted file mode 100644 index 9ad2ed2..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.http +++ /dev/null @@ -1,14 +0,0 @@ -### 请求 /system/mail-template/send-mail 接口 => 成功 -POST {{baseUrl}}/system/mail-template/send-mail -Authorization: Bearer {{token}} -Content-Type: application/json -tenant-id: {{adminTenantId}} - -{ - "templateCode": "test_01", - "mail": "7685413@qq.com", - "templateParams": { - "key01": "value01", - "key02": "value02" - } -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.java deleted file mode 100644 index b846b55..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/MailTemplateController.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.*; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import com.njcn.rdms.module.system.service.mail.MailSendService; -import com.njcn.rdms.module.system.service.mail.MailTemplateService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; -import static com.njcn.rdms.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 邮件模版") -@RestController -@RequestMapping("/system/mail-template") -public class MailTemplateController { - - @Resource - private MailTemplateService mailTempleService; - @Resource - private MailSendService mailSendService; - - @PostMapping("/create") - @Operation(summary = "创建邮件模版") - @PreAuthorize("@ss.hasPermission('system:mail-template:create')") - public CommonResult createMailTemplate(@Valid @RequestBody MailTemplateSaveReqVO createReqVO){ - return success(mailTempleService.createMailTemplate(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改邮件模版") - @PreAuthorize("@ss.hasPermission('system:mail-template:update')") - public CommonResult updateMailTemplate(@Valid @RequestBody MailTemplateSaveReqVO updateReqVO){ - mailTempleService.updateMailTemplate(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除邮件模版") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") - public CommonResult deleteMailTemplate(@RequestParam("id") Long id) { - mailTempleService.deleteMailTemplate(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Operation(summary = "批量删除邮件模版") - @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") - public CommonResult deleteMailTemplateList(@RequestParam("ids") List ids) { - mailTempleService.deleteMailTemplateList(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得邮件模版") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:mail-template:query')") - public CommonResult getMailTemplate(@RequestParam("id") Long id) { - MailTemplateDO template = mailTempleService.getMailTemplate(id); - return success(BeanUtils.toBean(template, MailTemplateRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得邮件模版分页") - @PreAuthorize("@ss.hasPermission('system:mail-template:query')") - public CommonResult> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) { - PageResult pageResult = mailTempleService.getMailTemplatePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MailTemplateRespVO.class)); - } - - @GetMapping({"/list-all-simple", "simple-list"}) - @Operation(summary = "获得邮件模版精简列表") - public CommonResult> getSimpleTemplateList() { - List list = mailTempleService.getMailTemplateList(); - return success(BeanUtils.toBean(list, MailTemplateSimpleRespVO.class)); - } - - @PostMapping("/send-mail") - @Operation(summary = "发送邮件") - @PreAuthorize("@ss.hasPermission('system:mail-template:send-mail')") - public CommonResult sendMail(@Valid @RequestBody MailTemplateSendReqVO sendReqVO) { - return success(mailSendService.sendSingleMailToAdmin(getLoginUserId(), - sendReqVO.getToMails(), sendReqVO.getCcMails(), sendReqVO.getBccMails(), - sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java deleted file mode 100644 index dd0da90..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.account; - -import com.njcn.rdms.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - 邮箱账号分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MailAccountPageReqVO extends PageParam { - - @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdmsyuanma@123.com") - private String mail; - - @Schema(description = "用户名" , requiredMode = Schema.RequiredMode.REQUIRED , example = "rdms") - private String username; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java deleted file mode 100644 index 9e2856c..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.account; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 邮箱账号 Response VO") -@Data -public class MailAccountRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdmsyuanma@123.com") - private String mail; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms") - private String username; - - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - private String password; - - @Schema(description = "SMTP 服务器域名", requiredMode = Schema.RequiredMode.REQUIRED, example = "www.iocoder.cn") - private String host; - - @Schema(description = "SMTP 服务器端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") - private Integer port; - - @Schema(description = "是否开启 ssl", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean sslEnable; - - @Schema(description = "是否开启 starttls", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean starttlsEnable; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java deleted file mode 100644 index c52a4f0..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSaveReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.account; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管理后台 - 邮箱账号创建/修改 Request VO") -@Data -public class MailAccountSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdmsyuanma@123.com") - @NotNull(message = "邮箱不能为空") - @Email(message = "必须是 Email 格式") - private String mail; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms") - @NotNull(message = "用户名不能为空") - private String username; - - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - @NotNull(message = "密码必填") - private String password; - - @Schema(description = "SMTP 服务器域名", requiredMode = Schema.RequiredMode.REQUIRED, example = "www.iocoder.cn") - @NotNull(message = "SMTP 服务器域名不能为空") - private String host; - - @Schema(description = "SMTP 服务器端口", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") - @NotNull(message = "SMTP 服务器端口不能为空") - private Integer port; - - @Schema(description = "是否开启 ssl", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否开启 ssl 必填") - private Boolean sslEnable; - - @Schema(description = "是否开启 starttls", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否开启 starttls 必填") - private Boolean starttlsEnable; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java deleted file mode 100644 index 6e391d8..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.account; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 邮箱账号的精简 Response VO") -@Data -public class MailAccountSimpleRespVO { - - @Schema(description = "邮箱编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "768541388@qq.com") - private String mail; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java deleted file mode 100644 index 78a9db0..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.log; - -import com.njcn.rdms.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 邮箱日志分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MailLogPageReqVO extends PageParam { - - @Schema(description = "用户编号", example = "30883") - private Long userId; - - @Schema(description = "用户类型,参见 UserTypeEnum 枚举", example = "2") - private Integer userType; - - @Schema(description = "接收邮箱地址,模糊匹配", example = "76854@qq.com") - private String toMail; - - @Schema(description = "邮箱账号编号", example = "18107") - private Long accountId; - - @Schema(description = "模板编号", example = "5678") - private Long templateId; - - @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", example = "1") - private Integer sendStatus; - - @Schema(description = "发送时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] sendTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogRespVO.java deleted file mode 100644 index 0d5b116..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/log/MailLogRespVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.log; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -@Schema(description = "管理后台 - 邮件日志 Response VO") -@Data -public class MailLogRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31020") - private Long id; - - @Schema(description = "用户编号", example = "30883") - private Long userId; - - @Schema(description = "用户类型,参见 UserTypeEnum 枚举", example = "2") - private Byte userType; - - @Schema(description = "接收邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "user1@example.com, user2@example.com") - private List toMails; - - @Schema(description = "抄送邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "user3@example.com, user4@example.com") - private List ccMails; - - @Schema(description = "密送邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "user5@example.com, user6@example.com") - private List bccMails; - - @Schema(description = "邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18107") - private Long accountId; - - @Schema(description = "发送邮箱地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "85757@qq.com") - private String fromMail; - - @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5678") - private Long templateId; - - @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") - private String templateCode; - - @Schema(description = "模版发送人名称", example = "李四") - private String templateNickname; - - @Schema(description = "邮件标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试标题") - private String templateTitle; - - @Schema(description = "邮件内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试内容") - private String templateContent; - - @Schema(description = "邮件参数", requiredMode = Schema.RequiredMode.REQUIRED) - private Map templateParams; - - @Schema(description = "发送状态,参见 MailSendStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Byte sendStatus; - - @Schema(description = "发送时间") - private LocalDateTime sendTime; - - @Schema(description = "发送返回的消息 ID", example = "28568") - private String sendMessageId; - - @Schema(description = "发送异常") - private String sendException; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java deleted file mode 100644 index ada1234..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.template; - -import com.njcn.rdms.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.njcn.rdms.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 邮件模版分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MailTemplatePageReqVO extends PageParam { - - @Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1") - private Integer status; - - @Schema(description = "标识,模糊匹配", example = "code_1024") - private String code; - - @Schema(description = "名称,模糊匹配", example = "芋头") - private String name; - - @Schema(description = "账号编号", example = "2048") - private Long accountId; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java deleted file mode 100644 index 921e64c..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.template; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "管理后台 - 邮件末班 Response VO") -@Data -public class MailTemplateRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试名字") - private String name; - - @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - private String code; - - @Schema(description = "发送的邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long accountId; - - @Schema(description = "发送人名称", example = "芋头") - private String nickname; - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "注册成功") - private String title; - - @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,注册成功啦") - private String content; - - @Schema(description = "参数数组", example = "name,code") - private List params; - - @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "备注", example = "奥特曼") - private String remark; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java deleted file mode 100644 index c36fb4d..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSaveReqVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.template; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 邮件模版创建/修改 Request VO") -@Data -public class MailTemplateSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "模版名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试名字") - @NotNull(message = "名称不能为空") - private String name; - - @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - @NotNull(message = "模版编号不能为空") - private String code; - - @Schema(description = "发送的邮箱账号编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "发送的邮箱账号编号不能为空") - private Long accountId; - - @Schema(description = "发送人名称", example = "芋头") - private String nickname; - - @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "注册成功") - @NotEmpty(message = "标题不能为空") - private String title; - - @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,注册成功啦") - @NotEmpty(message = "内容不能为空") - private String content; - - @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - private Integer status; - - @Schema(description = "备注", example = "奥特曼") - private String remark; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java deleted file mode 100644 index 2dc1634..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSendReqVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.template; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import java.util.List; -import java.util.Map; - -@Schema(description = "管理后台 - 邮件发送 Req VO") -@Data -public class MailTemplateSendReqVO { - - @Schema(description = "接收邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "[user1@example.com, user2@example.com]") - @NotEmpty(message = "接收邮箱不能为空") - private List toMails; - - @Schema(description = "抄送邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "[user3@example.com, user4@example.com]") - private List ccMails; - - @Schema(description = "密送邮箱", requiredMode = Schema.RequiredMode.REQUIRED, example = "[user5@example.com, user6@example.com]") - private List bccMails; - - @Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "test_01") - @NotNull(message = "模板编码不能为空") - private String templateCode; - - @Schema(description = "模板参数") - private Map templateParams; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java deleted file mode 100644 index 0624c26..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.mail.vo.template; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 邮件模版的精简 Response VO") -@Data -public class MailTemplateSimpleRespVO { - - @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "模版名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "哒哒哒") - private String name; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.http b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.http index 68b5487..6eca16e 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.http +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.http @@ -1,4 +1,5 @@ -### 请求 /infra/redis/get-monitor-info 接口 => 成功 -GET {{baseUrl}}/infra/redis/get-monitor-info +### 请求 /system/redis/get-monitor-info 接口 => 成功 +GET {{baseUrl}}/system/redis/get-monitor-info Authorization: Bearer {{token}} tenant-id: {{adminTenantId}} + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.java index d787eb3..4537c99 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/redis/RedisController.java @@ -20,7 +20,7 @@ import static com.njcn.rdms.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - Redis 监控") @RestController -@RequestMapping("/infra/redis") +@RequestMapping("/system/redis") public class RedisController { @Resource @@ -28,7 +28,7 @@ public class RedisController { @GetMapping("/get-monitor-info") @Operation(summary = "获得 Redis 监控信息") - @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + @PreAuthorize("@ss.hasPermission('system:redis:get-monitor-info')") public CommonResult getRedisMonitorInfo() { // 获得 Redis 统计信息 Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); @@ -41,3 +41,4 @@ public class RedisController { } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.http b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.http deleted file mode 100644 index 9909b51..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.http +++ /dev/null @@ -1,20 +0,0 @@ -### 请求 /system/social-client/send-subscribe-message 接口 => 发送测试订阅消息 -POST {{baseUrl}}/system/social-client/send-subscribe-message -Authorization: Bearer {{token}} -Content-Type: application/json -#Authorization: Bearer test100 -tenant-id: {{adminTenantId}} - -{ - "userId": 247, - "userType": 1, - "socialType": 34, - "templateTitle": "充值成功通知", - "page": "", - "messages": { - "character_string1":"5616122165165", - "amount2":"1000.00", - "time3":"2024-01-01 10:10:10", - "phrase4": "充值成功" - } -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.java deleted file mode 100644 index 7a589a6..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/SocialClientController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.socail; - -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientRespVO; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.social.SocialClientDO; -import com.njcn.rdms.module.system.service.social.SocialClientService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.njcn.rdms.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 社交客户端") -@RestController -@RequestMapping("/system/social-client") -@Validated -public class SocialClientController { - - @Resource - private SocialClientService socialClientService; - - @PostMapping("/create") - @Operation(summary = "创建社交客户端") - @PreAuthorize("@ss.hasPermission('system:social-client:create')") - public CommonResult createSocialClient(@Valid @RequestBody SocialClientSaveReqVO createReqVO) { - return success(socialClientService.createSocialClient(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新社交客户端") - @PreAuthorize("@ss.hasPermission('system:social-client:update')") - public CommonResult updateSocialClient(@Valid @RequestBody SocialClientSaveReqVO updateReqVO) { - socialClientService.updateSocialClient(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除社交客户端") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:social-client:delete')") - public CommonResult deleteSocialClient(@RequestParam("id") Long id) { - socialClientService.deleteSocialClient(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Parameter(name = "ids", description = "编号列表", required = true) - @Operation(summary = "批量删除社交客户端") - @PreAuthorize("@ss.hasPermission('system:social-client:delete')") - public CommonResult deleteSocialClientList(@RequestParam("ids") List ids) { - socialClientService.deleteSocialClientList(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得社交客户端") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:social-client:query')") - public CommonResult getSocialClient(@RequestParam("id") Long id) { - SocialClientDO client = socialClientService.getSocialClient(id); - return success(BeanUtils.toBean(client, SocialClientRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得社交客户端分页") - @PreAuthorize("@ss.hasPermission('system:social-client:query')") - public CommonResult> getSocialClientPage(@Valid SocialClientPageReqVO pageVO) { - PageResult pageResult = socialClientService.getSocialClientPage(pageVO); - return success(BeanUtils.toBean(pageResult, SocialClientRespVO.class)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java deleted file mode 100644 index 6ac9386..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.socail.vo.client; - -import com.njcn.rdms.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - 社交客户端分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SocialClientPageReqVO extends PageParam { - - @Schema(description = "应用名", example = "rdms商城") - private String name; - - @Schema(description = "社交平台的类型", example = "31") - private Integer socialType; - - @Schema(description = "用户类型", example = "2") - private Integer userType; - - @Schema(description = "客户端编号", example = "145442115") - private String clientId; - - @Schema(description = "状态", example = "1") - private Integer status; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java deleted file mode 100644 index cf0cd1e..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.socail.vo.client; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 社交客户端 Response VO") -@Data -public class SocialClientRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162") - private Long id; - - @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms商城") - private String name; - - @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31") - private Integer socialType; - - @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Integer userType; - - @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54") - private String clientId; - - @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter") - private String clientSecret; - - @Schema(description = "授权方的网页应用编号", example = "2000045") - private String agentId; - - @Schema(description = "publicKey 公钥", example = "2000045") - private String publicKey; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer status; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java deleted file mode 100644 index 9fb66fc..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/admin/socail/vo/client/SocialClientSaveReqVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.njcn.rdms.module.system.controller.admin.socail.vo.client; - -import com.njcn.rdms.framework.common.enums.CommonStatusEnum; -import com.njcn.rdms.framework.common.enums.UserTypeEnum; -import com.njcn.rdms.framework.common.validation.InEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 社交客户端创建/修改 Request VO") -@Data -public class SocialClientSaveReqVO { - - @Schema(description = "编号", example = "27162") - private Long id; - - @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "rdms商城") - @NotNull(message = "应用名不能为空") - private String name; - - @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31") - @NotNull(message = "社交平台的类型不能为空") - private Integer socialType; - - @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "用户类型不能为空") - @InEnum(UserTypeEnum.class) - private Integer userType; - - @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54") - @NotNull(message = "客户端编号不能为空") - private String clientId; - - @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "peter") - @NotNull(message = "客户端密钥不能为空") - private String clientSecret; - - @Schema(description = "授权方的网页应用编号", example = "2000045") - private String agentId; - - @Schema(description = "publicKey 公钥", example = "2000045") - private String publicKey; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "状态不能为空") - @InEnum(CommonStatusEnum.class) - private Integer status; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/app/file/AppFileController.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/app/file/AppFileController.java index 98160c7..0f0e00f 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/app/file/AppFileController.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/controller/app/file/AppFileController.java @@ -23,7 +23,7 @@ import static com.njcn.rdms.framework.common.pojo.CommonResult.success; @Tag(name = "用户 App - 文件存储") @RestController -@RequestMapping("/infra/file") +@RequestMapping("/system/file") @Validated @Slf4j public class AppFileController { @@ -63,3 +63,4 @@ public class AppFileController { } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/convert/codegen/CodegenConvert.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/convert/codegen/CodegenConvert.java deleted file mode 100644 index 48924f8..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/convert/codegen/CodegenConvert.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.njcn.rdms.module.system.convert.codegen; - -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.njcn.rdms.framework.common.util.collection.CollectionUtils; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenDetailRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenPreviewRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.column.CodegenColumnRespVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTableRespVO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import org.apache.ibatis.type.JdbcType; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface CodegenConvert { - - CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); - - // ========== TableInfo 相关 ========== - - @Mappings({ - @Mapping(source = "name", target = "tableName"), - @Mapping(source = "comment", target = "tableComment"), - }) - CodegenTableDO convert(TableInfo bean); - - List convertList(List list); - - @Mappings({ - @Mapping(source = "name", target = "columnName"), - @Mapping(source = "metaInfo.jdbcType", target = "dataType", qualifiedByName = "getDataType"), - @Mapping(source = "comment", target = "columnComment"), - @Mapping(source = "metaInfo.nullable", target = "nullable"), - @Mapping(source = "keyFlag", target = "primaryKey"), - @Mapping(source = "columnType.type", target = "javaType"), - @Mapping(source = "propertyName", target = "javaField"), - }) - CodegenColumnDO convert(TableField bean); - - @Named("getDataType") - default String getDataType(JdbcType jdbcType) { - return jdbcType.name(); - } - - // ========== 其它 ========== - - default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { - CodegenDetailRespVO respVO = new CodegenDetailRespVO(); - respVO.setTable(BeanUtils.toBean(table, CodegenTableRespVO.class)); - respVO.setColumns(BeanUtils.toBean(columns, CodegenColumnRespVO.class)); - return respVO; - } - - default List convert(Map codes) { - return CollectionUtils.convertList(codes.entrySet(), - entry -> new CodegenPreviewRespVO().setFilePath(entry.getKey()).setCode(entry.getValue())); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenColumnDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenColumnDO.java deleted file mode 100644 index 8a75cb1..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenColumnDO.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.codegen; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.module.system.enums.codegen.CodegenColumnHtmlTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenColumnListConditionEnum; -import lombok.Data; - -/** - * 代码生成 column 字段定义 - * - * @author hongawen - */ -@TableName(value = "infra_codegen_column", autoResultMap = true) -@KeySequence("infra_codegen_column_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data - -public class CodegenColumnDO extends BaseDO { - - /** - * ID 编号 - */ - @TableId - private Long id; - /** - * 表编号 - *

- * 关联 {@link CodegenTableDO#getId()} - */ - private Long tableId; - - // ========== 表相关字段 ========== - - /** - * 字段名 - * - * 关联 {@link TableField#getName()} - */ - private String columnName; - /** - * 数据库字段类型 - * - * 关联 {@link TableField.MetaInfo#getJdbcType()} - */ - private String dataType; - /** - * 字段描述 - * - * 关联 {@link TableField#getComment()} - */ - private String columnComment; - /** - * 是否允许为空 - * - * 关联 {@link TableField.MetaInfo#isNullable()} - */ - private Boolean nullable; - /** - * 是否主键 - * - * 关联 {@link TableField#isKeyFlag()} - */ - private Boolean primaryKey; - /** - * 排序 - */ - private Integer ordinalPosition; - - // ========== Java 相关字段 ========== - - /** - * Java 属性类型 - * - * 例如说 String、Boolean 等等 - * - * 关联 {@link TableField#getColumnType()} - */ - private String javaType; - /** - * Java 属性名 - * - * 关联 {@link TableField#getPropertyName()} - */ - private String javaField; - /** - * 字典类型 - *

- * 关联 DictTypeDO 的 type 属性 - */ - private String dictType; - /** - * 数据示例,主要用于生成 Swagger 注解的 example 字段 - */ - private String example; - - // ========== CRUD 相关字段 ========== - - /** - * 是否为 Create 创建操作的字段 - */ - private Boolean createOperation; - /** - * 是否为 Update 更新操作的字段 - */ - private Boolean updateOperation; - /** - * 是否为 List 查询操作的字段 - */ - private Boolean listOperation; - /** - * List 查询操作的条件类型 - *

- * 枚举 {@link CodegenColumnListConditionEnum} - */ - private String listOperationCondition; - /** - * 是否为 List 查询操作的返回字段 - */ - private Boolean listOperationResult; - - // ========== UI 相关字段 ========== - - /** - * 显示类型 - *

- * 枚举 {@link CodegenColumnHtmlTypeEnum} - */ - private String htmlType; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenTableDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenTableDO.java deleted file mode 100644 index 447ead0..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/codegen/CodegenTableDO.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.codegen; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.rdms.module.system.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenSceneEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenTemplateTypeEnum; -import lombok.Data; - -/** - * 代码生成 table 表定义 - * - * @author hongawen - */ -@TableName(value = "infra_codegen_table", autoResultMap = true) -@KeySequence("infra_codegen_table_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data - -public class CodegenTableDO extends BaseDO { - - /** - * ID 编号 - */ - @TableId - private Long id; - - /** - * 数据源编号 - * - * 关联 {@link DataSourceConfigDO#getId()} - */ - private Long dataSourceConfigId; - /** - * 生成场景 - * - * 枚举 {@link CodegenSceneEnum} - */ - private Integer scene; - - // ========== 表相关字段 ========== - - /** - * 表名称 - * - * 关联 {@link TableInfo#getName()} - */ - private String tableName; - /** - * 表描述 - * - * 关联 {@link TableInfo#getComment()} - */ - private String tableComment; - /** - * 备注 - */ - private String remark; - - // ========== 类相关字段 ========== - - /** - * 模块名,即一级目录 - * - * 例如说,system、infra、tool 等等 - */ - private String moduleName; - /** - * 业务名,即二级目录 - * - * 例如说,user、permission、dict 等等 - */ - private String businessName; - /** - * 类名称(首字母大写) - * - * 例如说,SysUser、SysMenu、SysDictData 等等 - */ - private String className; - /** - * 类描述 - */ - private String classComment; - /** - * 作者 - */ - private String author; - - // ========== 生成相关字段 ========== - - /** - * 模板类型 - * - * 枚举 {@link CodegenTemplateTypeEnum} - */ - private Integer templateType; - /** - * 代码生成的前端类型 - * - * 枚举 {@link CodegenFrontTypeEnum} - */ - private Integer frontType; - - // ========== 菜单相关字段 ========== - - /** - * 父菜单编号 - * - * 关联 MenuDO 的 id 属性 - */ - private Long parentMenuId; - - // ========== 主子表相关字段 ========== - - /** - * 主表的编号 - * - * 关联 {@link CodegenTableDO#getId()} - */ - private Long masterTableId; - /** - * 【自己】子表关联主表的字段编号 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long subJoinColumnId; - /** - * 主表与子表是否一对多 - * - * true:一对多 - * false:一对一 - */ - private Boolean subJoinMany; - - // ========== 树表相关字段 ========== - - /** - * 树表的父字段编号 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long treeParentColumnId; - /** - * 树表的名字字段编号 - * - * 名字的用途:新增或修改时,select 框展示的字段 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long treeNameColumnId; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/db/DataSourceConfigDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/db/DataSourceConfigDO.java deleted file mode 100644 index 59b79e1..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/db/DataSourceConfigDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.db; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.framework.mybatis.core.type.EncryptTypeHandler; -import lombok.Data; - -/** - * 数据源配置 - * - * @author hongawen - */ -@TableName(value = "infra_data_source_config", autoResultMap = true) -@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data - -public class DataSourceConfigDO extends BaseDO { - - /** - * 主键编号 - Master 数据源 - */ - public static final Long ID_MASTER = 0L; - - /** - * 主键编号 - */ - private Long id; - /** - * 连接名 - */ - private String name; - - /** - * 数据源连接 - */ - private String url; - /** - * 用户名 - */ - private String username; - /** - * 密码 - */ - @TableField(typeHandler = EncryptTypeHandler.class) - private String password; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailAccountDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailAccountDO.java deleted file mode 100644 index 6f2c673..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailAccountDO.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.mail; - -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 邮箱账号 DO - * - * 用途:配置发送邮箱的账号 - * - * @author hongawen - * - */ -@TableName(value = "system_mail_account", autoResultMap = true) -@KeySequence("system_mail_account_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) - -public class MailAccountDO extends BaseDO { - - /** - * 主键 - */ - @TableId - private Long id; - /** - * 邮箱 - */ - private String mail; - - /** - * 用户名 - */ - private String username; - /** - * 密码 - */ - private String password; - /** - * SMTP 服务器域名 - */ - private String host; - /** - * SMTP 服务器端口 - */ - private Integer port; - /** - * 是否开启 SSL - */ - private Boolean sslEnable; - /** - * 是否开启 STARTTLS - */ - private Boolean starttlsEnable; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailLogDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailLogDO.java deleted file mode 100644 index 34dc5d9..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailLogDO.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.mail; - -import com.njcn.rdms.framework.common.enums.UserTypeEnum; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.framework.mybatis.core.type.StringListTypeHandler; - -import com.njcn.rdms.module.system.enums.mail.MailSendStatusEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.*; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -/** - * 邮箱日志 DO - * 记录每一次邮件的发送 - * - * @author hongawen - * - */ -@TableName(value = "system_mail_log", autoResultMap = true) -@KeySequence("system_mail_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@AllArgsConstructor -@NoArgsConstructor - -public class MailLogDO extends BaseDO implements Serializable { - - /** - * 日志编号,自增 - */ - private Long id; - - /** - * 用户编码 - */ - private Long userId; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - - /** - * 接收邮箱地址 - */ - @TableField(typeHandler = StringListTypeHandler.class) - private List toMails; - /** - * 接收邮箱地址 - */ - @TableField(typeHandler = StringListTypeHandler.class) - private List ccMails; - /** - * 密送邮箱地址 - */ - @TableField(typeHandler = StringListTypeHandler.class) - private List bccMails; - - /** - * 邮箱账号编号 - * - * 关联 {@link MailAccountDO#getId()} - */ - private Long accountId; - /** - * 发送邮箱地址 - * - * 冗余 {@link MailAccountDO#getMail()} - */ - private String fromMail; - - // ========= 模板相关字段 ========= - /** - * 模版编号 - * - * 关联 {@link MailTemplateDO#getId()} - */ - private Long templateId; - /** - * 模版编码 - * - * 冗余 {@link MailTemplateDO#getCode()} - */ - private String templateCode; - /** - * 模版发送人名称 - * - * 冗余 {@link MailTemplateDO#getNickname()} - */ - private String templateNickname; - /** - * 模版标题 - */ - private String templateTitle; - /** - * 模版内容 - * - * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容 - */ - private String templateContent; - /** - * 模版参数 - * - * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private Map templateParams; - - // ========= 发送相关字段 ========= - /** - * 发送状态 - * - * 枚举 {@link MailSendStatusEnum} - */ - private Integer sendStatus; - /** - * 发送时间 - */ - private LocalDateTime sendTime; - /** - * 发送返回的消息 ID - */ - private String sendMessageId; - /** - * 发送异常 - */ - private String sendException; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailTemplateDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailTemplateDO.java deleted file mode 100644 index cfe3b63..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/mail/MailTemplateDO.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.mail; - -import com.njcn.rdms.framework.common.enums.CommonStatusEnum; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; - -/** - * 邮件模版 DO - * - * @author hongawen - * - */ -@TableName(value = "system_mail_template", autoResultMap = true) -@KeySequence("system_mail_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) - -public class MailTemplateDO extends BaseDO { - - /** - * 主键 - */ - private Long id; - /** - * 模版名称 - */ - private String name; - /** - * 模版编号 - */ - private String code; - /** - * 发送的邮箱账号编号 - * - * 关联 {@link MailAccountDO#getId()} - */ - private Long accountId; - - /** - * 发送人名称 - */ - private String nickname; - /** - * 标题 - */ - private String title; - /** - * 内容 - */ - private String content; - /** - * 参数数组(自动根据内容生成) - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List params; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/social/SocialClientDO.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/social/SocialClientDO.java deleted file mode 100644 index e473d7e..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/dataobject/social/SocialClientDO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.njcn.rdms.module.system.dal.dataobject.social; - -import com.njcn.rdms.framework.common.enums.CommonStatusEnum; -import com.njcn.rdms.framework.common.enums.UserTypeEnum; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -/** - * 社交客户端 DO - * - * @author hongawen - */ -@TableName(value = "system_social_client", autoResultMap = true) -@KeySequence("system_social_client_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SocialClientDO extends BaseDO { - - @TableId - private Long id; - /** 应用名 */ - private String name; - /** - * 社交类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer socialType; - /** - * 用户类型 - * - * 枚举 {@link UserTypeEnum} - */ - private Integer userType; - /** - * 状态 - * - * 枚举 {@link CommonStatusEnum} - */ - private Integer status; - /** 客户端 id */ - private String clientId; - /** 客户端 Secret */ - private String clientSecret; - /** 代理编号 */ - private String agentId; - /** publicKey 公钥 */ - private String publicKey; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenColumnMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenColumnMapper.java deleted file mode 100644 index e2cb407..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenColumnMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.codegen; - -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface CodegenColumnMapper extends BaseMapperX { - - default List selectListByTableId(Long tableId) { - return selectList(new LambdaQueryWrapperX() - .eq(CodegenColumnDO::getTableId, tableId) - .orderByAsc(CodegenColumnDO::getOrdinalPosition)); - } - - default void deleteListByTableId(Long tableId) { - delete(CodegenColumnDO::getTableId, tableId); - } - - default void deleteListByTableId(Collection tableIds) { - delete(new LambdaQueryWrapperX() - .in(CodegenColumnDO::getTableId, tableIds)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenTableMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenTableMapper.java deleted file mode 100644 index 62410eb..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/codegen/CodegenTableMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.codegen; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface CodegenTableMapper extends BaseMapperX { - - default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) { - return selectOne(CodegenTableDO::getTableName, tableName, - CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); - } - - default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) - .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) - .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName()) - .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()) - .orderByDesc(CodegenTableDO::getUpdateTime) - ); - } - - default List selectListByDataSourceConfigId(Long dataSourceConfigId) { - return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); - } - - default List selectListByTemplateTypeAndMasterTableId(Integer templateType, Long masterTableId) { - return selectList(CodegenTableDO::getTemplateType, templateType, - CodegenTableDO::getMasterTableId, masterTableId); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/db/DataSourceConfigMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/db/DataSourceConfigMapper.java deleted file mode 100644 index d2e2045..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/db/DataSourceConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.db; - -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 数据源配置 Mapper - * - * @author hongawen - */ -@Mapper -public interface DataSourceConfigMapper extends BaseMapperX { -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailAccountMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailAccountMapper.java deleted file mode 100644 index ae03b30..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailAccountMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MailAccountMapper extends BaseMapperX { - - default PageResult selectPage(MailAccountPageReqVO pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .likeIfPresent(MailAccountDO::getMail, pageReqVO.getMail()) - .likeIfPresent(MailAccountDO::getUsername , pageReqVO.getUsername()) - .orderByDesc(MailAccountDO::getId)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailLogMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailLogMapper.java deleted file mode 100644 index f09ffb3..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailLogMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.mail; - -import cn.hutool.core.util.StrUtil; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.framework.mybatis.core.util.MyBatisUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailLogDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MailLogMapper extends BaseMapperX { - - default PageResult selectPage(MailLogPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MailLogDO::getUserId, reqVO.getUserId()) - .eqIfPresent(MailLogDO::getUserType, reqVO.getUserType()) - .eqIfPresent(MailLogDO::getAccountId, reqVO.getAccountId()) - .eqIfPresent(MailLogDO::getTemplateId, reqVO.getTemplateId()) - .eqIfPresent(MailLogDO::getSendStatus, reqVO.getSendStatus()) - .betweenIfPresent(MailLogDO::getSendTime, reqVO.getSendTime()) - .apply(StrUtil.isNotBlank(reqVO.getToMail()), - MyBatisUtils.findInSet("to_mails", reqVO.getToMail())) - .orderByDesc(MailLogDO::getId)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailTemplateMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailTemplateMapper.java deleted file mode 100644 index 9699e7c..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/mail/MailTemplateMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MailTemplateMapper extends BaseMapperX { - - default PageResult selectPage(MailTemplatePageReqVO pageReqVO){ - return selectPage(pageReqVO , new LambdaQueryWrapperX() - .eqIfPresent(MailTemplateDO::getStatus, pageReqVO.getStatus()) - .likeIfPresent(MailTemplateDO::getCode, pageReqVO.getCode()) - .likeIfPresent(MailTemplateDO::getName, pageReqVO.getName()) - .eqIfPresent(MailTemplateDO::getAccountId, pageReqVO.getAccountId()) - .betweenIfPresent(MailTemplateDO::getCreateTime, pageReqVO.getCreateTime()) - .orderByDesc(MailTemplateDO::getId)); - } - - default Long selectCountByAccountId(Long accountId) { - return selectCount(MailTemplateDO::getAccountId, accountId); - } - - default MailTemplateDO selectByCode(String code) { - return selectOne(MailTemplateDO::getCode, code); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/social/SocialClientMapper.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/social/SocialClientMapper.java deleted file mode 100644 index 3f05fe0..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/mysql/social/SocialClientMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.njcn.rdms.module.system.dal.mysql.social; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.social.SocialClientDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SocialClientMapper extends BaseMapperX { - - default SocialClientDO selectBySocialTypeAndUserType(Integer socialType, Integer userType) { - return selectOne(SocialClientDO::getSocialType, socialType, - SocialClientDO::getUserType, userType); - } - - default PageResult selectPage(SocialClientPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(SocialClientDO::getName, reqVO.getName()) - .eqIfPresent(SocialClientDO::getSocialType, reqVO.getSocialType()) - .eqIfPresent(SocialClientDO::getUserType, reqVO.getUserType()) - .likeIfPresent(SocialClientDO::getClientId, reqVO.getClientId()) - .eqIfPresent(SocialClientDO::getStatus, reqVO.getStatus()) - .orderByDesc(SocialClientDO::getId)); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/redis/RedisKeyConstants.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/redis/RedisKeyConstants.java index d0034b2..2a69066 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/redis/RedisKeyConstants.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/dal/redis/RedisKeyConstants.java @@ -27,8 +27,4 @@ public interface RedisKeyConstants { String NOTIFY_TEMPLATE = "notify_template"; - String MAIL_ACCOUNT = "mail_account"; - - String MAIL_TEMPLATE = "mail_template"; - } diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenConfiguration.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenConfiguration.java deleted file mode 100644 index 16df98f..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.njcn.rdms.module.system.framework.codegen.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(CodegenProperties.class) -public class CodegenConfiguration { -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenProperties.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenProperties.java deleted file mode 100644 index 9215310..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/config/CodegenProperties.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.njcn.rdms.module.system.framework.codegen.config; - -import com.njcn.rdms.module.system.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenVOTypeEnum; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import java.util.Collection; - -@ConfigurationProperties(prefix = "rdms.codegen") -@Validated -@Data -public class CodegenProperties { - - /** - * 生成的 Java 代码的基础包 - */ - @NotNull(message = "Java 代码的基础包不能为空") - private String basePackage; - - /** - * 数据库名数组 - */ - @NotEmpty(message = "数据库不能为空") - private Collection dbSchemas; - - /** - * 代码生成的前端类型(默认) - * - * 枚举 {@link CodegenFrontTypeEnum#getType()} - */ - @NotNull(message = "代码生成的前端类型不能为空") - private Integer frontType; - - /** - * 代码生成的 VO 类型 - * - * 枚举 {@link CodegenVOTypeEnum#getType()} - */ - @NotNull(message = "代码生成的 VO 类型不能为空") - private Integer voType; - - /** - * 是否生成批量删除接口 - */ - @NotNull(message = "是否生成批量删除接口不能为空") - private Boolean deleteBatchEnable; - - /** - * 是否生成单元测试 - */ - @NotNull(message = "是否生成单元测试不能为空") - private Boolean unitTestEnable; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/package-info.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/package-info.java deleted file mode 100644 index e23ad88..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/codegen/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 代码生成器 - */ -package com.njcn.rdms.module.system.framework.codegen; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/file/core/client/AbstractFileClient.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/file/core/client/AbstractFileClient.java index e5d6e15..6925151 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/file/core/client/AbstractFileClient.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/framework/file/core/client/AbstractFileClient.java @@ -72,7 +72,8 @@ public abstract class AbstractFileClient implem * @return URL 访问地址 */ protected String formatFileUrl(String domain, String path) { - return StrUtil.format("{}/admin-api/infra/file/{}/get/{}", domain, getId(), path); + return StrUtil.format("{}/admin-api/system/file/{}/get/{}", domain, getId(), path); } } + diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/consumer/mail/MailSendConsumer.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/consumer/mail/MailSendConsumer.java deleted file mode 100644 index 49053ca..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/consumer/mail/MailSendConsumer.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.njcn.rdms.module.system.mq.consumer.mail; - -import com.njcn.rdms.module.system.mq.message.mail.MailSendMessage; -import com.njcn.rdms.module.system.service.mail.MailSendService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import jakarta.annotation.Resource; - -/** - * 针对 {@link MailSendMessage} 的消费者 - * - * @author hongawen - */ -@Component -@Slf4j -public class MailSendConsumer { - - @Resource - private MailSendService mailSendService; - - @EventListener - @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步 - public void onMessage(MailSendMessage message) { - log.info("[onMessage][消息内容({})]", message); - mailSendService.doSendMail(message); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/message/mail/MailSendMessage.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/message/mail/MailSendMessage.java deleted file mode 100644 index 69a3346..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/message/mail/MailSendMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.njcn.rdms.module.system.mq.message.mail; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.File; -import java.util.Collection; - -/** - * 邮箱发送消息 - * - * @author hongawen - */ -@Data -public class MailSendMessage { - - /** - * 邮件日志编号 - */ - @NotNull(message = "邮件日志编号不能为空") - private Long logId; - /** - * 接收邮件地址 - */ - @NotEmpty(message = "接收邮件地址不能为空") - private Collection toMails; - /** - * 抄送邮件地址 - */ - private Collection ccMails; - /** - * 密送邮件地址 - */ - private Collection bccMails; - /** - * 邮件账号编号 - */ - @NotNull(message = "邮件账号编号不能为空") - private Long accountId; - - /** - * 邮件发件人 - */ - private String nickname; - /** - * 邮件标题 - */ - @NotEmpty(message = "邮件标题不能为空") - private String title; - /** - * 邮件内容 - */ - @NotEmpty(message = "邮件内容不能为空") - private String content; - - /** - * 附件 - */ - private File[] attachments; - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/producer/mail/MailProducer.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/producer/mail/MailProducer.java deleted file mode 100644 index 4dfc4e6..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/mq/producer/mail/MailProducer.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.njcn.rdms.module.system.mq.producer.mail; - -import com.njcn.rdms.module.system.mq.message.mail.MailSendMessage; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -import java.io.File; -import java.util.Collection; - -/** - * Mail 邮件相关消息的 Producer - * - * @author hongawen - * @since 2021/4/19 13:33 - */ -@Slf4j -@Component -public class MailProducer { - - @Resource - private ApplicationContext applicationContext; - - /** - * 发送 {@link MailSendMessage} 消息 - * - * @param sendLogId 发送日志编码 - * @param toMails 接收邮件地址 - * @param ccMails 抄送邮件地址 - * @param bccMails 密送邮件地址 - * @param accountId 邮件账号编号 - * @param nickname 邮件发件人 - * @param title 邮件标题 - * @param content 邮件内容 - * @param attachments 附件 - */ - public void sendMailSendMessage(Long sendLogId, - Collection toMails, Collection ccMails, Collection bccMails, - Long accountId, String nickname, String title, String content, - File[] attachments) { - MailSendMessage message = new MailSendMessage() - .setLogId(sendLogId) - .setToMails(toMails).setCcMails(ccMails).setBccMails(bccMails) - .setAccountId(accountId).setNickname(nickname) - .setTitle(title).setContent(content).setAttachments(attachments); - applicationContext.publishEvent(message); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenService.java deleted file mode 100644 index a92c0b9..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenService.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.njcn.rdms.module.system.service.codegen; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; - -import java.util.List; -import java.util.Map; - -/** - * 代码生成 Service 接口 - * - * @author hongawen - */ -public interface CodegenService { - - /** - * 基于数据库的表结构,创建代码生成器的表定义 - * - * @param author 作者 - * @param reqVO 表信息 - * @return 创建的表定义的编号数组 - */ - List createCodegenList(String author, CodegenCreateListReqVO reqVO); - - /** - * 更新数据库的表和字段定义 - * - * @param updateReqVO 更新信息 - */ - void updateCodegen(CodegenUpdateReqVO updateReqVO); - - /** - * 基于数据库的表结构,同步数据库的表和字段定义 - * - * @param tableId 表编号 - */ - void syncCodegenFromDB(Long tableId); - - /** - * 删除数据库的表和字段定义 - * - * @param tableId 数据编号 - */ - void deleteCodegen(Long tableId); - - /** - * 批量删除数据库的表和字段定义 - * - * @param tableIds 数据编号列表 - */ - void deleteCodegenList(List tableIds); - - /** - * 获得表定义列表 - * - * @param dataSourceConfigId 数据源配置的编号 - * @return 表定义列表 - */ - List getCodegenTableList(Long dataSourceConfigId); - - /** - * 获得表定义分页 - * - * @param pageReqVO 分页条件 - * @return 表定义分页 - */ - PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); - - /** - * 获得表定义 - * - * @param id 表编号 - * @return 表定义 - */ - CodegenTableDO getCodegenTable(Long id); - - /** - * 获得指定表的字段定义数组 - * - * @param tableId 表编号 - * @return 字段定义数组 - */ - List getCodegenColumnListByTableId(Long tableId); - - /** - * 执行指定表的代码生成 - * - * @param tableId 表编号 - * @return 生成结果。key 为文件路径,value 为对应的代码内容 - */ - Map generationCodes(Long tableId); - - /** - * 获得数据库自带的表定义列表 - * - * @param dataSourceConfigId 数据源的配置编号 - * @param name 表名称 - * @param comment 表描述 - * @return 表定义列表 - */ - List getDatabaseTableList(Long dataSourceConfigId, String name, String comment); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenServiceImpl.java deleted file mode 100644 index 9fb7666..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/CodegenServiceImpl.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.njcn.rdms.module.system.service.codegen; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.google.common.annotations.VisibleForTesting; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.framework.mybatis.core.util.JdbcUtils; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.rdms.module.system.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.rdms.module.system.dal.mysql.codegen.CodegenColumnMapper; -import com.njcn.rdms.module.system.dal.mysql.codegen.CodegenTableMapper; -import com.njcn.rdms.module.system.enums.codegen.CodegenSceneEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenTemplateTypeEnum; -import com.njcn.rdms.module.system.framework.codegen.config.CodegenProperties; -import com.njcn.rdms.module.system.service.codegen.inner.CodegenBuilder; -import com.njcn.rdms.module.system.service.codegen.inner.CodegenEngine; -import com.njcn.rdms.module.system.service.db.DataSourceConfigService; -import com.njcn.rdms.module.system.service.db.DatabaseTableService; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.function.BiPredicate; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.convertMap; -import static com.njcn.rdms.framework.common.util.collection.CollectionUtils.convertSet; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.*; - -/** - * 代码生成 Service 实现类 - * - * @author hongawen - */ -@Service -public class CodegenServiceImpl implements CodegenService { - - @Resource - private DatabaseTableService databaseTableService; - @Resource - private DataSourceConfigService dataSourceConfigService; - - @Resource - private CodegenTableMapper codegenTableMapper; - @Resource - private CodegenColumnMapper codegenColumnMapper; - - @Resource - private CodegenBuilder codegenBuilder; - @Resource - private CodegenEngine codegenEngine; - - @Resource - private CodegenProperties codegenProperties; - - @Override - @Transactional(rollbackFor = Exception.class) - public List createCodegenList(String author, CodegenCreateListReqVO reqVO) { - List ids = new ArrayList<>(reqVO.getTableNames().size()); - // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 - reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(author, reqVO.getDataSourceConfigId(), tableName))); - return ids; - } - - private Long createCodegen(String author, Long dataSourceConfigId, String tableName) { - // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); - // 导入 - return createCodegen0(author, dataSourceConfigId, tableInfo); - } - - private Long createCodegen0(String author, Long dataSourceConfigId, TableInfo tableInfo) { - // 校验导入的表和字段非空 - validateTableInfo(tableInfo); - // 校验是否已经存在 - if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(), - dataSourceConfigId) != null) { - throw exception(CODEGEN_TABLE_EXISTS); - } - - // 构建 CodegenTableDO 对象,插入到 DB 中 - CodegenTableDO table = codegenBuilder.buildTable(tableInfo); - table.setDataSourceConfigId(dataSourceConfigId); - table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 - table.setFrontType(codegenProperties.getFrontType()); - table.setAuthor(author); - codegenTableMapper.insert(table); - - // 构建 CodegenColumnDO 数组,插入到 DB 中 - List columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields()); - // 如果没有主键,则使用第一个字段作为主键 - if (!tableInfo.isHavePrimaryKey()) { - columns.get(0).setPrimaryKey(true); - } - codegenColumnMapper.insertBatch(columns); - return table.getId(); - } - - @VisibleForTesting - void validateTableInfo(TableInfo tableInfo) { - if (tableInfo == null) { - throw exception(CODEGEN_IMPORT_TABLE_NULL); - } - if (StrUtil.isEmpty(tableInfo.getComment())) { - throw exception(CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL); - } - if (CollUtil.isEmpty(tableInfo.getFields())) { - throw exception(CODEGEN_IMPORT_COLUMNS_NULL); - } - tableInfo.getFields().forEach(field -> { - if (StrUtil.isEmpty(field.getComment())) { - throw exception(CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName()); - } - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCodegen(CodegenUpdateReqVO updateReqVO) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - // 校验主表字段存在 - if (Objects.equals(updateReqVO.getTable().getTemplateType(), CodegenTemplateTypeEnum.SUB.getType())) { - if (codegenTableMapper.selectById(updateReqVO.getTable().getMasterTableId()) == null) { - throw exception(CODEGEN_MASTER_TABLE_NOT_EXISTS, updateReqVO.getTable().getMasterTableId()); - } - if (CollUtil.findOne(updateReqVO.getColumns(), // 关联主表的字段不存在 - column -> column.getId().equals(updateReqVO.getTable().getSubJoinColumnId())) == null) { - throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, updateReqVO.getTable().getSubJoinColumnId()); - } - } - - // 更新 table 表定义 - CodegenTableDO updateTableObj = BeanUtils.toBean(updateReqVO.getTable(), CodegenTableDO.class); - codegenTableMapper.updateById(updateTableObj); - // 更新 column 字段定义 - List updateColumnObjs = BeanUtils.toBean(updateReqVO.getColumns(), CodegenColumnDO.class); - updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void syncCodegenFromDB(Long tableId) { - // 校验是否已经存在 - CodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); - // 执行同步 - syncCodegen0(tableId, tableInfo); - } - - private void syncCodegen0(Long tableId, TableInfo tableInfo) { - // 1. 校验导入的表和字段非空 - validateTableInfo(tableInfo); - List tableFields = tableInfo.getFields(); - - // 2. 构建 CodegenColumnDO 数组,只同步新增的字段 - List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); - Set codegenColumnNames = convertSet(codegenColumns, CodegenColumnDO::getColumnName); - - // 3.1 计算需要【修改】的字段,插入时重新插入,删除时将原来的删除 - Map codegenColumnDOMap = convertMap(codegenColumns, CodegenColumnDO::getColumnName); - BiPredicate primaryKeyPredicate = - (tableField, codegenColumn) -> tableField.getMetaInfo().getJdbcType().name().equals(codegenColumn.getDataType()) - && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable() - && tableField.isKeyFlag() == codegenColumn.getPrimaryKey() - && tableField.getComment().equals(codegenColumn.getColumnComment()); - Set modifyFieldNames = IntStream.range(0, tableFields.size()).mapToObj(index -> { - TableField tableField = tableFields.get(index); - String columnName = tableField.getColumnName(); - CodegenColumnDO codegenColumn = codegenColumnDOMap.get(columnName); - if (codegenColumn == null) { - return null; - } - if (!primaryKeyPredicate.test(tableField, codegenColumn) || codegenColumn.getOrdinalPosition() != index) { - return columnName; - } - return null; - }).filter(Objects::nonNull).collect(Collectors.toSet()); - // 3.2 计算需要【删除】的字段 - Set tableFieldNames = convertSet(tableFields, TableField::getName); - Set deleteColumnIds = codegenColumns.stream() - .filter(column -> (!tableFieldNames.contains(column.getColumnName())) || modifyFieldNames.contains(column.getColumnName())) - .map(CodegenColumnDO::getId).collect(Collectors.toSet()); - // 移除已经存在的字段 - tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()) && (!modifyFieldNames.contains(column.getColumnName()))); - if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) { - throw exception(CODEGEN_SYNC_NONE_CHANGE); - } - - // 4.1 插入新增的字段 - List columns = codegenBuilder.buildColumns(tableId, tableFields); - codegenColumnMapper.insertBatch(columns); - // 4.2 删除不存在的字段 - if (CollUtil.isNotEmpty(deleteColumnIds)) { - codegenColumnMapper.deleteByIds(deleteColumnIds); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCodegen(Long tableId) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(tableId) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - - // 删除 table 表定义 - codegenTableMapper.deleteById(tableId); - // 删除 column 字段定义 - codegenColumnMapper.deleteListByTableId(tableId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCodegenList(List tableIds) { - // 批量删除 table 表定义 - codegenTableMapper.deleteByIds(tableIds); - // 批量删除 column 字段定义 - codegenColumnMapper.deleteListByTableId(tableIds); - } - - @Override - public List getCodegenTableList(Long dataSourceConfigId) { - return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId); - } - - @Override - public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { - return codegenTableMapper.selectPage(pageReqVO); - } - - @Override - public CodegenTableDO getCodegenTable(Long id) { - return codegenTableMapper.selectById(id); - } - - @Override - public List getCodegenColumnListByTableId(Long tableId) { - return codegenColumnMapper.selectListByTableId(tableId); - } - - @Override - public Map generationCodes(Long tableId) { - // 校验是否已经存在 - CodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - List columns = codegenColumnMapper.selectListByTableId(tableId); - if (CollUtil.isEmpty(columns)) { - throw exception(CODEGEN_COLUMN_NOT_EXISTS); - } - - // 如果是主子表,则加载对应的子表信息 - List subTables = null; - List> subColumnsList = null; - if (CodegenTemplateTypeEnum.isMaster(table.getTemplateType())) { - // 校验子表存在 - subTables = codegenTableMapper.selectListByTemplateTypeAndMasterTableId( - CodegenTemplateTypeEnum.SUB.getType(), tableId); - if (CollUtil.isEmpty(subTables)) { - throw exception(CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE); - } - // 校验子表的关联字段存在 - subColumnsList = new ArrayList<>(); - for (CodegenTableDO subTable : subTables) { - List subColumns = codegenColumnMapper.selectListByTableId(subTable.getId()); - if (CollUtil.findOne(subColumns, column -> column.getId().equals(subTable.getSubJoinColumnId())) == null) { - throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, subTable.getId()); - } - subColumnsList.add(subColumns); - } - } - - // 获取数据源对应的数据库类型 - DataSourceConfigDO dataSourceConfig = dataSourceConfigService.getDataSourceConfig(table.getDataSourceConfigId()); - DbType dbType = JdbcUtils.getDbType(dataSourceConfig.getUrl()); - // 执行生成 - return codegenEngine.execute(dbType, table, columns, subTables, subColumnsList); - } - - @Override - public List getDatabaseTableList(Long dataSourceConfigId, String name, String comment) { - List tables = databaseTableService.getTableList(dataSourceConfigId, name, comment); - // 移除在 Codegen 中,已经存在的 - Set existsTables = convertSet( - codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName); - tables.removeIf(table -> existsTables.contains(table.getName())); - return BeanUtils.toBean(tables, DatabaseTableRespVO.class); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenBuilder.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenBuilder.java deleted file mode 100644 index 2a77aba..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenBuilder.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.njcn.rdms.module.system.service.codegen.inner; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.google.common.collect.Sets; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.module.system.convert.codegen.CodegenConvert; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.rdms.module.system.enums.codegen.CodegenColumnHtmlTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenColumnListConditionEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenTemplateTypeEnum; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.*; - -import static cn.hutool.core.text.CharSequenceUtil.*; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.hutool.core.util.RandomUtil.randomInt; - -/** - * 代码生成器的 Builder,负责: - * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO} - * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO} - */ -@Component -public class CodegenBuilder { - - /** - * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map COLUMN_LIST_OPERATION_CONDITION_MAPPINGS = - MapUtil.builder() - .put("name", CodegenColumnListConditionEnum.LIKE) - .put("time", CodegenColumnListConditionEnum.BETWEEN) - .put("date", CodegenColumnListConditionEnum.BETWEEN) - .build(); - - /** - * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map COLUMN_HTML_TYPE_MAPPINGS = - MapUtil.builder() - .put("status", CodegenColumnHtmlTypeEnum.RADIO) - .put("sex", CodegenColumnHtmlTypeEnum.RADIO) - .put("type", CodegenColumnHtmlTypeEnum.SELECT) - .put("image", CodegenColumnHtmlTypeEnum.IMAGE_UPLOAD) - .put("file", CodegenColumnHtmlTypeEnum.FILE_UPLOAD) - .put("content", CodegenColumnHtmlTypeEnum.EDITOR) - .put("description", CodegenColumnHtmlTypeEnum.EDITOR) - .put("demo", CodegenColumnHtmlTypeEnum.EDITOR) - .put("time", CodegenColumnHtmlTypeEnum.DATETIME) - .put("date", CodegenColumnHtmlTypeEnum.DATETIME) - .build(); - - /** - * 多租户编号的字段名 - */ - public static final String TENANT_ID_FIELD = "tenantId"; - /** - * {@link BaseDO} 的字段 - */ - public static final Set BASE_DO_FIELDS = new HashSet<>(); - /** - * 新增操作,不需要传递的字段 - */ - private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 修改操作,不需要传递的字段 - */ - private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); - /** - * 列表操作的条件,不需要传递的字段 - */ - private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 列表操作的结果,不需要返回的字段 - */ - private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); - - static { - Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName())); - BASE_DO_FIELDS.add(TENANT_ID_FIELD); - // 处理 OPERATION 相关的字段 - CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 - } - - public CodegenTableDO buildTable(TableInfo tableInfo) { - CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); - initTableDefault(table); - return table; - } - - /** - * 初始化 Table 表的默认字段 - * - * @param table 表定义 - */ - private void initTableDefault(CodegenTableDO table) { - // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept - // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 - String tableName = table.getTableName().toLowerCase(); - // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; - table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); - // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; - table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); - // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 - table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); - // 去除结尾的表,作为类描述 - table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); - table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); - } - - public List buildColumns(Long tableId, List tableFields) { - List columns = CodegenConvert.INSTANCE.convertList(tableFields); - int index = 1; - for (CodegenColumnDO column : columns) { - column.setTableId(tableId); - column.setOrdinalPosition(index++); - // 特殊处理:Byte => Integer - if (Byte.class.getSimpleName().equals(column.getJavaType())) { - column.setJavaType(Integer.class.getSimpleName()); - } - // 初始化 Column 列的默认字段 - processColumnOperation(column); // 处理 CRUD 相关的字段的默认值 - processColumnUI(column); // 处理 UI 相关的字段的默认值 - processColumnExample(column); // 处理字段的 swagger example 示例 - } - return columns; - } - - private void processColumnOperation(CodegenColumnDO column) { - // 处理 createOperation 字段 - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,创建时无需传递 - // 处理 updateOperation 字段 - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - || column.getPrimaryKey()); // 对于主键,更新时需要传递 - // 处理 listOperation 字段 - column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 - // 处理 listOperationCondition 字段 - COLUMN_LIST_OPERATION_CONDITION_MAPPINGS.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); - if (column.getListOperationCondition() == null) { - column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); - } - // 处理 listOperationResult 字段 - column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); - } - - private void processColumnUI(CodegenColumnDO column) { - // 基于后缀进行匹配 - COLUMN_HTML_TYPE_MAPPINGS.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); - // 如果是 Boolean 类型时,设置为 radio 类型. - if (Boolean.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); - } - // 如果是 LocalDateTime 类型,则设置为 datetime 类型 - if (LocalDateTime.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.DATETIME.getType()); - } - // 兜底,设置默认为 input 类型 - if (column.getHtmlType() == null) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); - } - } - - /** - * 处理字段的 swagger example 示例 - * - * @param column 字段 - */ - private void processColumnExample(CodegenColumnDO column) { - // id、price、count 等可能是整数的后缀 - if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "id", "price", "count")) { - column.setExample(String.valueOf(randomInt(1, Short.MAX_VALUE))); - return; - } - // name - if (StrUtil.endWithIgnoreCase(column.getJavaField(), "name")) { - column.setExample(randomEle(new String[]{"张三", "李四", "王五", "赵六", "芋艿"})); - return; - } - // status - if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "status", "type")) { - column.setExample(randomEle(new String[]{"1", "2"})); - return; - } - // url - if (StrUtil.endWithIgnoreCase(column.getColumnName(), "url")) { - column.setExample("https://www.iocoder.cn"); - return; - } - // reason - if (StrUtil.endWithIgnoreCase(column.getColumnName(), "reason")) { - column.setExample(randomEle(new String[]{"不喜欢", "不对", "不好", "不香"})); - return; - } - // description、memo、remark - if (StrUtil.endWithAnyIgnoreCase(column.getColumnName(), "description", "memo", "remark")) { - column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); - } - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenEngine.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenEngine.java deleted file mode 100644 index 4e5f8fe..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/codegen/inner/CodegenEngine.java +++ /dev/null @@ -1,679 +0,0 @@ -package com.njcn.rdms.module.system.service.codegen.inner; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.template.TemplateConfig; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.engine.velocity.VelocityEngine; -import cn.hutool.system.SystemUtil; -import com.baomidou.mybatisplus.annotation.DbType; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Maps; -import com.google.common.collect.Table; -import com.njcn.rdms.framework.apilog.core.annotation.ApiAccessLog; -import com.njcn.rdms.framework.apilog.core.enums.OperateTypeEnum; -import com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil; -import com.njcn.rdms.framework.common.pojo.CommonResult; -import com.njcn.rdms.framework.common.pojo.PageParam; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.collection.CollectionUtils; -import com.njcn.rdms.framework.common.util.date.DateUtils; -import com.njcn.rdms.framework.common.util.date.LocalDateTimeUtils; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.framework.common.util.object.ObjectUtils; -import com.njcn.rdms.framework.common.util.string.StrUtils; -import com.njcn.rdms.framework.excel.core.annotations.DictFormat; -import com.njcn.rdms.framework.excel.core.convert.DictConvert; -import com.njcn.rdms.framework.excel.core.util.ExcelUtils; -import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.rdms.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.rdms.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.rdms.module.system.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.rdms.module.system.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenSceneEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenTemplateTypeEnum; -import com.njcn.rdms.module.system.enums.codegen.CodegenVOTypeEnum; -import com.njcn.rdms.module.system.framework.codegen.config.CodegenProperties; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.Setter; -import org.springframework.stereotype.Component; -import org.springframework.util.ClassUtils; - -import java.util.*; - -import static cn.hutool.core.map.MapUtil.getStr; -import static cn.hutool.core.text.CharSequenceUtil.*; - -/** - * 代码生成的引擎,用于具体生成代码 - * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 - * - * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 - * - * @author hongawen - */ -@Component -public class CodegenEngine { - - /** - * 后端的模板配置 - * - * key:模板在 resources 的地址 - * value:生成的路径 - */ - private static final Map SERVER_TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 - // Java module-biz(server) Main - .put(javaTemplatePath("controller/vo/pageReqVO"), javaModuleImplVOFilePath("PageReqVO")) - .put(javaTemplatePath("controller/vo/listReqVO"), javaModuleImplVOFilePath("ListReqVO")) - .put(javaTemplatePath("controller/vo/respVO"), javaModuleImplVOFilePath("RespVO")) - .put(javaTemplatePath("controller/vo/saveReqVO"), javaModuleImplVOFilePath("SaveReqVO")) - .put(javaTemplatePath("controller/controller"), javaModuleImplControllerFilePath()) - .put(javaTemplatePath("dal/do"), - javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) - .put(javaTemplatePath("dal/do_sub"), // 特殊:主子表专属逻辑 - javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${subTable.className}DO")) - .put(javaTemplatePath("dal/mapper"), - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) - .put(javaTemplatePath("dal/mapper_sub"), // 特殊:主子表专属逻辑 - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${subTable.className}Mapper")) - .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) - .put(javaTemplatePath("service/serviceImpl"), - javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) - .put(javaTemplatePath("service/service"), - javaModuleImplMainFilePath("service/${table.businessName}/${table.className}Service")) - // Java module-biz(server) Test - .put(javaTemplatePath("test/serviceTest"), - javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest")) - // Java module-api Main - .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作")) - // SQL - .put("codegen/sql/sql.vm", "sql/sql.sql") - .put("codegen/sql/h2.vm", "sql/h2.sql") - .build(); - - /** - * 前端的配置模版 - * - * key1:UI 模版的类型 {@link CodegenFrontTypeEnum#getType()} - * key2:模板在 resources 的地址 - * value:生成的路径 - */ - private static final Table FRONT_TEMPLATES = ImmutableTable.builder() - // VUE2_ELEMENT_UI - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/index.vue"), - vueFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("api/api.js"), - vueFilePath("api/${table.moduleName}/${table.businessName}/index.js")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/form.vue"), - vueFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - // VUE3_ELEMENT_PLUS - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/index.vue"), - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/form.vue"), - vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("api/api.ts"), - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("api/api.ts"), - vue3UniappFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("components/search-form.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/components/search-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/form/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/form/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/detail/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/detail/index.vue")) - // VUE3_VBEN2_ANTD_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${classNameVar}.data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Modal.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - // VUE3_VBEN5_ANTD_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_ANTD - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_EP_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_EP - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .build(); - - @Resource - private CodegenProperties codegenProperties; - - /** - * 是否使用 jakarta 包,用于解决 Spring Boot 2.X 和 3.X 的兼容性问题 - * - * true - 使用 jakarta.validation.constraints.* - * false - 使用 javax.validation.constraints.* - */ - @Setter // 允许设置的原因,是因为单测需要手动改变 - private Boolean jakartaEnable; - - /** - * 是否为 rdms-cloud 项目,用于解决 Boot 和 Cloud 的 api 模块兼容性问题 - * - * true - 需要有 rdms-module-xxx-api 模块 - * false - 不需要有,使用 api、enum 包即可 - */ - @Setter - private Boolean cloudEnable; - - /** - * 模板引擎,由 hutool 实现 - */ - private final TemplateEngine templateEngine; - /** - * 全局通用变量映射 - */ - private final Map globalBindingMap = new HashMap<>(); - - public CodegenEngine() { - // 初始化 TemplateEngine 属性 - TemplateConfig config = new TemplateConfig(); - config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); - this.templateEngine = new VelocityEngine(config); - // 设置 javaxEnable,按照是否使用 JDK17 来判断 - this.jakartaEnable = SystemUtil.getJavaInfo().isJavaVersionAtLeast(1700) // 17.00 * 100 - && ClassUtils.isPresent("jakarta.annotation.Resource", ClassUtils.getDefaultClassLoader()); - // 设置 cloudEnable,按照是否使用 Spring Cloud 来判断 - this.cloudEnable = ClassUtils.isPresent("com.njcn.rdms.module.infra.framework.rpc.config.RpcConfiguration", - ClassUtils.getDefaultClassLoader()); - } - - @PostConstruct - @VisibleForTesting - void initGlobalBindingMap() { - // 全局配置 - globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); - globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() - + '.' + "framework"); // 用于后续获取测试类的 package 地址 - globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); - globalBindingMap.put("voType", codegenProperties.getVoType()); - globalBindingMap.put("deleteBatchEnable", codegenProperties.getDeleteBatchEnable()); - // 全局 Java Bean - globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); - globalBindingMap.put("PageResultClassName", PageResult.class.getName()); - // VO 类,独有字段 - globalBindingMap.put("PageParamClassName", PageParam.class.getName()); - globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); - // DO 类,独有字段 - globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); - globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); - globalBindingMap.put("QueryWrapperClassName", LambdaQueryWrapperX.class.getName()); - globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); - // Util 工具类 - globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); - globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); - globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); - globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName()); - globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); - globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); - globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName()); - globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); - globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); - globalBindingMap.put("CollectionUtilsClassName", CollectionUtils.class.getName()); - } - - /** - * 生成代码 - * - * @param dbType 数据库类型 - * @param table 表定义 - * @param columns table 的字段定义数组 - * @param subTables 子表数组,当且仅当主子表时使用 - * @param subColumnsList subTables 的字段定义数组 - * @return 生成的代码,key 是路径,value 是对应代码 - */ - public Map execute(DbType dbType, CodegenTableDO table, List columns, - List subTables, List> subColumnsList) { - // 1.1 初始化 bindMap 上下文 - Map bindingMap = initBindingMap(dbType, table, columns, subTables, subColumnsList); - // 1.2 获得模版 - Map templates = getTemplates(table.getFrontType()); - - // 2. 执行生成 - Map result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序 - templates.forEach((vmPath, filePath) -> { - // 2.1 特殊:主子表专属逻辑 - if (isSubTemplate(vmPath)) { - generateSubCode(table, subTables, result, vmPath, filePath, bindingMap); - return; - // 2.2 特殊:树表专属逻辑 - } else if (isPageReqVOTemplate(vmPath)) { - // 减少多余的类生成,例如说 PageVO.java 类 - if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - return; - } - } else if (isListReqVOTemplate(vmPath)) { - // 减少多余的类生成,例如说 ListVO.java 类 - if (!CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - return; - } - } - // 2.3 默认生成 - generateCode(result, vmPath, filePath, bindingMap); - }); - return result; - } - - private void generateCode(Map result, String vmPath, - String filePath, Map bindingMap) { - filePath = formatFilePath(filePath, bindingMap); - String content = templateEngine.getTemplate(vmPath).render(bindingMap); - // 格式化代码 - content = prettyCode(content, vmPath); - result.put(filePath, content); - } - - private void generateSubCode(CodegenTableDO table, List subTables, - Map result, String vmPath, - String filePath, Map bindingMap) { - // 没有子表,所以不生成 - if (CollUtil.isEmpty(subTables)) { - return; - } - // 主子表的模式匹配。目的:过滤掉个性化的模版 - if (vmPath.contains("_normal") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_NORMAL.getType())) { - return; - } - if (vmPath.contains("_erp") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_ERP.getType())) { - return; - } - if (vmPath.contains("_inner") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_INNER.getType())) { - return; - } - - // 逐个生成 - for (int i = 0; i < subTables.size(); i++) { - bindingMap.put("subIndex", i); - generateCode(result, vmPath, filePath, bindingMap); - } - bindingMap.remove("subIndex"); - } - - /** - * 格式化生成后的代码 - * - * 因为尽量让 vm 模版简单,所以统一的处理都在这个方法。 - * 如果不处理,Vue 的 Pretty 格式校验可能会报错 - * - * @param content 格式化前的代码 - * @param vmPath 模板路径 - * @return 格式化后的代码 - */ - private String prettyCode(String content, String vmPath) { - // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5、vue3_admin_uniapp) - if (!StrUtil.containsAny(vmPath, "vben5", "vue3_admin_uniapp")) { - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); - } - // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到 - if (StrUtil.count(content, "dateFormatter") == 1) { - content = StrUtils.removeLineContains(content, "dateFormatter"); - } - // Vue2 界面:修正 $refs - if (StrUtil.count(content, "this.refs") >= 1) { - content = content.replace("this.refs", "this.$refs"); - } - // Vue 界面:去除多的 dict 相关,只有一个的情况下,说明没使用到 - if (StrUtil.count(content, "getIntDictOptions") == 1) { - content = content.replace("getIntDictOptions, ", ""); - } - if (StrUtil.count(content, "getStrDictOptions") == 1) { - content = content.replace("getStrDictOptions, ", ""); - } - if (StrUtil.count(content, "getBoolDictOptions") == 1) { - content = content.replace("getBoolDictOptions, ", ""); - } - if (StrUtil.count(content, "DICT_TYPE.") == 0) { - content = StrUtils.removeLineContains(content, "DICT_TYPE"); - } - return content; - } - - private Map initBindingMap(DbType dbType, CodegenTableDO table, List columns, - List subTables, List> subColumnsList) { - // 创建 bindingMap - Map bindingMap = new HashMap<>(globalBindingMap); - bindingMap.put("dbType", dbType); - bindingMap.put("table", table); - bindingMap.put("columns", columns); - bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 - bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); - // className 相关 - // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 - String className = table.getClassName(); - String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName() - : removePrefix(table.getClassName(), upperFirst(table.getModuleName())); - String classNameVar = lowerFirst(simpleClassName); - bindingMap.put("simpleClassName", simpleClassName); - bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type - bindingMap.put("classNameVar", classNameVar); // 将 DictType 转换成 dictType,用于变量 - // 将 DictType 转换成 dict-type - String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); - bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); - // permission 前缀 - bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); - - // 特殊:树表专属逻辑 - if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - CodegenColumnDO treeParentColumn = CollUtil.findOne(columns, - column -> Objects.equals(column.getId(), table.getTreeParentColumnId())); - bindingMap.put("treeParentColumn", treeParentColumn); - bindingMap.put("treeParentColumn_javaField_underlineCase", toUnderlineCase(treeParentColumn.getJavaField())); - CodegenColumnDO treeNameColumn = CollUtil.findOne(columns, - column -> Objects.equals(column.getId(), table.getTreeNameColumnId())); - bindingMap.put("treeNameColumn", treeNameColumn); - bindingMap.put("treeNameColumn_javaField_underlineCase", toUnderlineCase(treeNameColumn.getJavaField())); - } - - // 特殊:主子表专属逻辑 - if (CollUtil.isNotEmpty(subTables)) { - // 创建 bindingMap - bindingMap.put("subTables", subTables); - bindingMap.put("subColumnsList", subColumnsList); - List subPrimaryColumns = new ArrayList<>(); - List subJoinColumns = new ArrayList<>(); - List subJoinColumnStrikeCases = new ArrayList<>(); - List subSimpleClassNames = new ArrayList<>(); - List subClassNameVars = new ArrayList<>(); - List simpleClassNameUnderlineCases = new ArrayList<>(); - List subSimpleClassNameStrikeCases = new ArrayList<>(); - for (int i = 0; i < subTables.size(); i++) { - CodegenTableDO subTable = subTables.get(i); - List subColumns = subColumnsList.get(i); - subPrimaryColumns.add(CollectionUtils.findFirst(subColumns, CodegenColumnDO::getPrimaryKey)); // - CodegenColumnDO subColumn = CollectionUtils.findFirst(subColumns, // 关联的字段 - column -> Objects.equals(column.getId(), subTable.getSubJoinColumnId())); - subJoinColumns.add(subColumn); - subJoinColumnStrikeCases.add(toSymbolCase(subColumn.getJavaField(), '-')); // 将 DictType 转换成 dict-type - // className 相关 - String subSimpleClassName = removePrefix(subTable.getClassName(), upperFirst(subTable.getModuleName())); - subSimpleClassNames.add(subSimpleClassName); - simpleClassNameUnderlineCases.add(toUnderlineCase(subSimpleClassName)); // 将 DictType 转换成 dict_type - subClassNameVars.add(lowerFirst(subSimpleClassName)); // 将 DictType 转换成 dictType,用于变量 - subSimpleClassNameStrikeCases.add(toSymbolCase(subSimpleClassName, '-')); // 将 DictType 转换成 dict-type - } - bindingMap.put("subPrimaryColumns", subPrimaryColumns); - bindingMap.put("subJoinColumns", subJoinColumns); - bindingMap.put("subJoinColumn_strikeCases", subJoinColumnStrikeCases); - bindingMap.put("subSimpleClassNames", subSimpleClassNames); - bindingMap.put("simpleClassNameUnderlineCases", simpleClassNameUnderlineCases); - bindingMap.put("subClassNameVars", subClassNameVars); - bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases); - } - - // 多个 vm 公用的 VO 变量 - if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { - String prefixClass = CodegenSceneEnum.valueOf(table.getScene()).getPrefixClass(); - bindingMap.put("saveReqVOClass", prefixClass + className + "SaveReqVO"); - bindingMap.put("updateReqVOClass", prefixClass + className + "SaveReqVO"); - bindingMap.put("respVOClass", prefixClass + className + "RespVO"); - bindingMap.put("saveReqVOVar", "createReqVO"); - bindingMap.put("updateReqVOVar", "updateReqVO"); - } else if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.DO.getType())) { - bindingMap.put("saveReqVOClass", className + "DO"); - bindingMap.put("updateReqVOClass", className + "DO"); - bindingMap.put("respVOClass", className + "DO"); - bindingMap.put("saveReqVOVar", classNameVar); - bindingMap.put("updateReqVOVar", classNameVar); - } - return bindingMap; - } - - private Map getTemplates(Integer frontType) { - Map templates = new LinkedHashMap<>(); - templates.putAll(SERVER_TEMPLATES); - templates.putAll(FRONT_TEMPLATES.row(frontType)); - // 如果是 Boot 项目,则不使用 api/server 模块 - if (Boolean.FALSE.equals(cloudEnable)) { - SERVER_TEMPLATES.forEach((templatePath, filePath) -> { - filePath = StrUtil.replace(filePath, "/rdms-module-${table.moduleName}-api", ""); - filePath = StrUtil.replace(filePath, "/rdms-module-${table.moduleName}-server", ""); - templates.put(templatePath, filePath); - }); - } - // 如果禁用单元测试,则移除对应的模版 - if (Boolean.FALSE.equals(codegenProperties.getUnitTestEnable())) { - templates.remove(javaTemplatePath("test/serviceTest")); - templates.remove("codegen/sql/h2.vm"); - } - // 如果禁用 VO 类型,则移除对应的模版 - if (ObjectUtil.notEqual(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { - templates.remove(javaTemplatePath("controller/vo/respVO")); - templates.remove(javaTemplatePath("controller/vo/saveReqVO")); - } - return templates; - } - - @SuppressWarnings("unchecked") - private String formatFilePath(String filePath, Map bindingMap) { - filePath = StrUtil.replace(filePath, "${basePackage}", - getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); - filePath = StrUtil.replace(filePath, "${classNameVar}", - getStr(bindingMap, "classNameVar")); - filePath = StrUtil.replace(filePath, "${simpleClassName}", - getStr(bindingMap, "simpleClassName")); - // sceneEnum 包含的字段 - CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); - filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); - filePath = StrUtil.replace(filePath, "${sceneEnum.basePackage}", sceneEnum.getBasePackage()); - // table 包含的字段 - CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); - filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); - filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); - filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); - // 特殊:主子表专属逻辑 - Integer subIndex = (Integer) bindingMap.get("subIndex"); - if (subIndex != null) { - CodegenTableDO subTable = ((List) bindingMap.get("subTables")).get(subIndex); - filePath = StrUtil.replace(filePath, "${subTable.moduleName}", subTable.getModuleName()); - filePath = StrUtil.replace(filePath, "${subTable.businessName}", subTable.getBusinessName()); - filePath = StrUtil.replace(filePath, "${subTable.className}", subTable.getClassName()); - filePath = StrUtil.replace(filePath, "${subSimpleClassName}", - ((List) bindingMap.get("subSimpleClassNames")).get(subIndex)); - filePath = StrUtil.replace(filePath, "${subSimpleClassName_strikeCase}", - ((List) bindingMap.get("subSimpleClassName_strikeCases")).get(subIndex)); - } - return filePath; - } - - private static String javaTemplatePath(String path) { - return "codegen/java/" + path + ".vm"; - } - - private static String javaModuleImplVOFilePath(String path) { - return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + - "vo/${sceneEnum.prefixClass}${table.className}" + path, "server", "main"); - } - - private static String javaModuleImplControllerFilePath() { - return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + - "${sceneEnum.prefixClass}${table.className}Controller", "server", "main"); - } - - private static String javaModuleImplMainFilePath(String path) { - return javaModuleFilePath(path, "server", "main"); - } - - private static String javaModuleApiMainFilePath(String path) { - return javaModuleFilePath(path, "api", "main"); - } - - private static String javaModuleImplTestFilePath(String path) { - return javaModuleFilePath(path, "server", "test"); - } - - private static String javaModuleFilePath(String path, String module, String src) { - return "rdms-module-${table.moduleName}/" + // 顶级模块 - "rdms-module-${table.moduleName}-" + module + "/" + // 子模块 - "src/" + src + "/java/${basePackage}/module/${table.moduleName}/" + path + ".java"; - } - - private static String mapperXmlFilePath() { - return "rdms-module-${table.moduleName}/" + // 顶级模块 - "rdms-module-${table.moduleName}-server/" + // 子模块 - "src/main/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; - } - - private static String vueTemplatePath(String path) { - return "codegen/vue/" + path + ".vm"; - } - - private static String vueFilePath(String path) { - return "rdms-ui-${sceneEnum.basePackage}-vue2/" + // 顶级目录 - "src/" + path; - } - - private static String vue3TemplatePath(String path) { - return "codegen/vue3/" + path + ".vm"; - } - - private static String vue3FilePath(String path) { - return "rdms-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录 - "src/" + path; - } - - private static String vue3AdminUniappTemplatePath(String path) { - return "codegen/vue3_admin_uniapp/" + path + ".vm"; - } - - private static String vue3UniappFilePath(String path) { - return "rdms-ui-${sceneEnum.basePackage}-uniapp/" + // 顶级目录 - "src/" + path; - } - - private static String vue3VbenFilePath(String path) { - return "rdms-ui-${sceneEnum.basePackage}-vben/" + // 顶级目录 - "src/" + path; - } - - private static String vue3VbenTemplatePath(String path) { - return "codegen/vue3_vben/" + path + ".vm"; - } - - private static String vue3Vben5AntdSchemaTemplatePath(String path) { - return "codegen/vue3_vben5_antd/schema/" + path + ".vm"; - } - - private static String vue3Vben5AntdGeneralTemplatePath(String path) { - return "codegen/vue3_vben5_antd/general/" + path + ".vm"; - } - - private static String vue3Vben5EpSchemaTemplatePath(String path) { - return "codegen/vue3_vben5_ele/schema/" + path + ".vm"; - } - - private static String vue3Vben5EpGeneralTemplatePath(String path) { - return "codegen/vue3_vben5_ele/general/" + path + ".vm"; - } - - private static boolean isSubTemplate(String path) { - return path.contains("_sub"); - } - - private static boolean isPageReqVOTemplate(String path) { - return path.contains("pageReqVO"); - } - - private static boolean isListReqVOTemplate(String path) { - return path.contains("listReqVO"); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigService.java deleted file mode 100644 index b8b1c29..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.njcn.rdms.module.system.service.db; - -import com.njcn.rdms.module.system.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * 数据源配置 Service 接口 - * - * @author hongawen - */ -public interface DataSourceConfigService { - - /** - * 创建数据源配置 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDataSourceConfig(@Valid DataSourceConfigSaveReqVO createReqVO); - - /** - * 更新数据源配置 - * - * @param updateReqVO 更新信息 - */ - void updateDataSourceConfig(@Valid DataSourceConfigSaveReqVO updateReqVO); - - /** - * 删除数据源配置 - * - * @param id 编号 - */ - void deleteDataSourceConfig(Long id); - - /** - * 批量删除数据源配置 - * - * @param ids 编号列表 - */ - void deleteDataSourceConfigList(List ids); - - /** - * 获得数据源配置 - * - * @param id 编号 - * @return 数据源配置 - */ - DataSourceConfigDO getDataSourceConfig(Long id); - - /** - * 获得数据源配置列表 - * - * @return 数据源配置列表 - */ - List getDataSourceConfigList(); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigServiceImpl.java deleted file mode 100644 index d16ec04..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DataSourceConfigServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.njcn.rdms.module.system.service.db; - -import com.baomidou.dynamic.datasource.creator.DataSourceProperty; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.framework.mybatis.core.util.JdbcUtils; -import com.njcn.rdms.module.system.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.rdms.module.system.dal.mysql.db.DataSourceConfigMapper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; -import java.util.Objects; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_OK; - -/** - * 数据源配置 Service 实现类 - * - * @author hongawen - */ -@Service -@Validated -public class DataSourceConfigServiceImpl implements DataSourceConfigService { - - @Resource - private DataSourceConfigMapper dataSourceConfigMapper; - - @Resource - private DynamicDataSourceProperties dynamicDataSourceProperties; - - @Override - public Long createDataSourceConfig(DataSourceConfigSaveReqVO createReqVO) { - DataSourceConfigDO config = BeanUtils.toBean(createReqVO, DataSourceConfigDO.class); - validateConnectionOK(config); - - // 插入 - dataSourceConfigMapper.insert(config); - // 返回 - return config.getId(); - } - - @Override - public void updateDataSourceConfig(DataSourceConfigSaveReqVO updateReqVO) { - // 校验存在 - validateDataSourceConfigExists(updateReqVO.getId()); - DataSourceConfigDO updateObj = BeanUtils.toBean(updateReqVO, DataSourceConfigDO.class); - validateConnectionOK(updateObj); - - // 更新 - dataSourceConfigMapper.updateById(updateObj); - } - - @Override - public void deleteDataSourceConfig(Long id) { - // 校验存在 - validateDataSourceConfigExists(id); - // 删除 - dataSourceConfigMapper.deleteById(id); - } - - @Override - public void deleteDataSourceConfigList(List ids) { - dataSourceConfigMapper.deleteByIds(ids); - } - - private void validateDataSourceConfigExists(Long id) { - if (dataSourceConfigMapper.selectById(id) == null) { - throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); - } - } - - @Override - public DataSourceConfigDO getDataSourceConfig(Long id) { - // 如果 id 为 0,默认为 master 的数据源 - if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) { - return buildMasterDataSourceConfig(); - } - // 从 DB 中读取 - return dataSourceConfigMapper.selectById(id); - } - - @Override - public List getDataSourceConfigList() { - List result = dataSourceConfigMapper.selectList(); - // 补充 master 数据源 - result.add(0, buildMasterDataSourceConfig()); - return result; - } - - private void validateConnectionOK(DataSourceConfigDO config) { - boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword()); - if (!success) { - throw exception(DATA_SOURCE_CONFIG_NOT_OK); - } - } - - private DataSourceConfigDO buildMasterDataSourceConfig() { - String primary = dynamicDataSourceProperties.getPrimary(); - DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); - return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary) - .setUrl(dataSourceProperty.getUrl()) - .setUsername(dataSourceProperty.getUsername()) - .setPassword(dataSourceProperty.getPassword()); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableService.java deleted file mode 100644 index 8491647..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.njcn.rdms.module.system.service.db; - -import com.baomidou.mybatisplus.generator.config.po.TableInfo; - -import java.util.List; - -/** - * 数据库表 Service - * - * @author hongawen - */ -public interface DatabaseTableService { - - /** - * 获得表列表,基于表名称 + 表描述进行模糊匹配 - * - * @param dataSourceConfigId 数据源配置的编号 - * @param nameLike 表名称,模糊匹配 - * @param commentLike 表描述,模糊匹配 - * @return 表列表 - */ - List getTableList(Long dataSourceConfigId, String nameLike, String commentLike); - - /** - * 获得指定表名 - * - * @param dataSourceConfigId 数据源配置的编号 - * @param tableName 表名称 - * @return 表 - */ - TableInfo getTable(Long dataSourceConfigId, String tableName); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableServiceImpl.java deleted file mode 100644 index abdaf34..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/db/DatabaseTableServiceImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.njcn.rdms.module.system.service.db; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.generator.config.DataSourceConfig; -import com.baomidou.mybatisplus.generator.config.GlobalConfig; -import com.baomidou.mybatisplus.generator.config.StrategyConfig; -import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.DateType; -import com.baomidou.mybatisplus.generator.query.SQLQuery; -import com.njcn.rdms.framework.mybatis.core.util.JdbcUtils; -import com.njcn.rdms.module.system.dal.dataobject.db.DataSourceConfigDO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 数据库表 Service 实现类 - * - * @author hongawen - */ -@Service -public class DatabaseTableServiceImpl implements DatabaseTableService { - - @Resource - private DataSourceConfigService dataSourceConfigService; - - @Override - public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { - List tables = getTableList0(dataSourceConfigId, null); - return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) - && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) - .collect(Collectors.toList()); - } - - @Override - public TableInfo getTable(Long dataSourceConfigId, String name) { - return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); - } - - private List getTableList0(Long dataSourceConfigId, String name) { - // 获得数据源配置 - DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); - Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); - - // 使用 MyBatis Plus Generator 解析表结构 - DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), - config.getPassword()); - if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419 - dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class); - } - StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到 - if (StrUtil.isNotEmpty(name)) { - strategyConfig.addInclude(name); - } else { - // 移除工作流和定时任务前缀的表名 - strategyConfig.addExclude("ACT_[\\S\\s]+|QRTZ_[\\S\\s]+|FLW_[\\S\\s]+|act_[\\S\\s]+|qrtz_[\\S\\s]+|flw_[\\S\\s]+"); - // 移除 ORACLE 相关的系统表 - strategyConfig.addExclude("IMPDP_[\\S\\s]+|ALL_[\\S\\s]+|HS_[\\S\\s]+|impdp_[\\S\\s]+|all_[\\S\\s]+|hs_[\\S\\s]+"); - strategyConfig.addExclude("[\\S\\s]+\\$[\\S\\s]+|[\\S\\s]+\\$"); // 表里不能有 $,一般有都是系统的表 - } - - GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate - ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfigBuilder.build(), strategyConfig.build(), - null, globalConfig, null); - // 按照名字排序 - List tables = builder.getTableInfoList(); - tables.sort(Comparator.comparing(TableInfo::getName)); - return tables; - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogService.java index 75328d8..a3f5dbe 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogService.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogService.java @@ -1,6 +1,6 @@ package com.njcn.rdms.module.system.service.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.PageResult; import com.njcn.rdms.module.system.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; import com.njcn.rdms.module.system.dal.dataobject.logger.ApiAccessLogDO; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogServiceImpl.java index d9350bb..7b9026a 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogServiceImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiAccessLogServiceImpl.java @@ -1,6 +1,6 @@ package com.njcn.rdms.module.system.service.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.PageResult; import com.njcn.rdms.framework.common.util.object.BeanUtils; import com.njcn.rdms.framework.common.util.string.StrUtils; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogService.java index 58b0a7d..128a196 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogService.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogService.java @@ -1,6 +1,6 @@ package com.njcn.rdms.module.system.service.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.PageResult; import com.njcn.rdms.module.system.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; import com.njcn.rdms.module.system.dal.dataobject.logger.ApiErrorLogDO; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogServiceImpl.java index 2455c96..b4fa00f 100644 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogServiceImpl.java +++ b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/logger/ApiErrorLogServiceImpl.java @@ -1,6 +1,6 @@ package com.njcn.rdms.module.system.service.logger; -import com.njcn.rdms.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.njcn.rdms.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.rdms.framework.common.pojo.PageResult; import com.njcn.rdms.framework.common.util.object.BeanUtils; import com.njcn.rdms.framework.common.util.string.StrUtils; diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountService.java deleted file mode 100644 index dcf438c..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountService.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * 邮箱账号 Service 接口 - * - * @author hongawen - * - */ -public interface MailAccountService { - - /** - * 创建邮箱账号 - * - * @param createReqVO 邮箱账号信息 - * @return 编号 - */ - Long createMailAccount(@Valid MailAccountSaveReqVO createReqVO); - - /** - * 修改邮箱账号 - * - * @param updateReqVO 邮箱账号信息 - */ - void updateMailAccount(@Valid MailAccountSaveReqVO updateReqVO); - - /** - * 删除邮箱账号 - * - * @param id 编号 - */ - void deleteMailAccount(Long id); - - /** - * 批量删除邮箱账号 - * - * @param ids 编号列表 - */ - void deleteMailAccountList(List ids); - - /** - * 获取邮箱账号信息 - * - * @param id 编号 - * @return 邮箱账号信息 - */ - MailAccountDO getMailAccount(Long id); - - /** - * 从缓存中获取邮箱账号 - * - * @param id 编号 - * @return 邮箱账号 - */ - MailAccountDO getMailAccountFromCache(Long id); - - /** - * 获取邮箱账号分页信息 - * - * @param pageReqVO 邮箱账号分页参数 - * @return 邮箱账号分页信息 - */ - PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO); - - /** - * 获取邮箱数组信息 - * - * @return 邮箱账号信息数组 - */ - List getMailAccountList(); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountServiceImpl.java deleted file mode 100644 index f7c7b6a..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailAccountServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.account.MailAccountSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import com.njcn.rdms.module.system.dal.mysql.mail.MailAccountMapper; -import com.njcn.rdms.module.system.dal.redis.RedisKeyConstants; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS; - -/** - * 邮箱账号 Service 实现类 - * - * @author hongawen - * - */ -@Service -@Validated -@Slf4j -public class MailAccountServiceImpl implements MailAccountService { - - @Resource - private MailAccountMapper mailAccountMapper; - - @Resource - private MailTemplateService mailTemplateService; - - @Override - public Long createMailAccount(MailAccountSaveReqVO createReqVO) { - MailAccountDO account = BeanUtils.toBean(createReqVO, MailAccountDO.class); - mailAccountMapper.insert(account); - return account.getId(); - } - - @Override - @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#updateReqVO.id") - public void updateMailAccount(MailAccountSaveReqVO updateReqVO) { - // 校验是否存在 - validateMailAccountExists(updateReqVO.getId()); - - // 更新 - MailAccountDO updateObj = BeanUtils.toBean(updateReqVO, MailAccountDO.class); - mailAccountMapper.updateById(updateObj); - } - - @Override - @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id") - public void deleteMailAccount(Long id) { - // 校验是否存在账号 - validateMailAccountExists(id); - // 校验是否存在关联模版 - if (mailTemplateService.getMailTemplateCountByAccountId(id) > 0) { - throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); - } - - // 删除 - mailAccountMapper.deleteById(id); - } - - @Override - @CacheEvict(value = RedisKeyConstants.MAIL_ACCOUNT, - allEntries = true) // allEntries 清空所有缓存,因为 Spring Cache 不支持按照 ids 批量删除 - public void deleteMailAccountList(List ids) { - // 1. 校验是否存在关联模版 - for (Long id : ids) { - if (mailTemplateService.getMailTemplateCountByAccountId(id) > 0) { - throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); - } - } - - // 2. 批量删除 - mailAccountMapper.deleteByIds(ids); - } - - private void validateMailAccountExists(Long id) { - if (mailAccountMapper.selectById(id) == null) { - throw exception(MAIL_ACCOUNT_NOT_EXISTS); - } - } - - @Override - public MailAccountDO getMailAccount(Long id) { - return mailAccountMapper.selectById(id); - } - - @Override - @Cacheable(value = RedisKeyConstants.MAIL_ACCOUNT, key = "#id", unless = "#result == null") - public MailAccountDO getMailAccountFromCache(Long id) { - return getMailAccount(id); - } - - @Override - public PageResult getMailAccountPage(MailAccountPageReqVO pageReqVO) { - return mailAccountMapper.selectPage(pageReqVO); - } - - @Override - public List getMailAccountList() { - return mailAccountMapper.selectList(); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogService.java deleted file mode 100644 index 88158cb..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogService.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailLogDO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * 邮件日志 Service 接口 - * - * @author hongawen - * - */ -public interface MailLogService { - - /** - * 邮件日志分页 - * - * @param pageVO 分页参数 - * @return 分页结果 - */ - PageResult getMailLogPage(MailLogPageReqVO pageVO); - - /** - * 获得指定编号的邮件日志 - * - * @param id 日志编号 - * @return 邮件日志 - */ - MailLogDO getMailLog(Long id); - - /** - * 创建邮件日志 - * - * @param userId 用户编码 - * @param userType 用户类型 - * @param toMails 收件人邮件 - * @param ccMails 收件人邮件 - * @param bccMails 收件人邮件 - * @param account 邮件账号信息 - * @param template 模版信息 - * @param templateContent 模版内容 - * @param templateParams 模版参数 - * @param isSend 是否发送成功 - * @return 日志编号 - */ - Long createMailLog(Long userId, Integer userType, - Collection toMails, Collection ccMails, Collection bccMails, - MailAccountDO account, MailTemplateDO template, - String templateContent, Map templateParams, Boolean isSend); - - /** - * 更新邮件发送结果 - * - * @param logId 日志编号 - * @param messageId 发送后的消息编号 - * @param exception 发送异常 - */ - void updateMailSendResult(Long logId, String messageId, Exception exception); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogServiceImpl.java deleted file mode 100644 index 2c5beaf..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailLogServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import cn.hutool.core.collection.ListUtil; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.mail.vo.log.MailLogPageReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailLogDO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import com.njcn.rdms.module.system.dal.mysql.mail.MailLogMapper; -import com.njcn.rdms.module.system.enums.mail.MailSendStatusEnum; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import jakarta.annotation.Resource; -import java.time.LocalDateTime; -import java.util.*; - -import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; - -/** - * 邮件日志 Service 实现类 - * - * @author hongawen - * - */ -@Service -@Validated -public class MailLogServiceImpl implements MailLogService { - - @Resource - private MailLogMapper mailLogMapper; - - @Override - public PageResult getMailLogPage(MailLogPageReqVO pageVO) { - return mailLogMapper.selectPage(pageVO); - } - - @Override - public MailLogDO getMailLog(Long id) { - return mailLogMapper.selectById(id); - } - - @Override - public Long createMailLog(Long userId, Integer userType, - Collection toMails, Collection ccMails, Collection bccMails, - MailAccountDO account, MailTemplateDO template, - String templateContent, Map templateParams, Boolean isSend) { - MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); - // 根据是否要发送,设置状态 - logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() - : MailSendStatusEnum.IGNORE.getStatus()) - // 用户信息 - .userId(userId).userType(userType) - .toMails(ListUtil.toList(toMails)).ccMails(ListUtil.toList(ccMails)).bccMails(ListUtil.toList(bccMails)) - .accountId(account.getId()).fromMail(account.getMail()) - // 模板相关字段 - .templateId(template.getId()).templateCode(template.getCode()).templateNickname(template.getNickname()) - .templateTitle(template.getTitle()).templateContent(templateContent).templateParams(templateParams); - - // 插入数据库 - MailLogDO logDO = logDOBuilder.build(); - mailLogMapper.insert(logDO); - return logDO.getId(); - } - - @Override - public void updateMailSendResult(Long logId, String messageId, Exception exception) { - // 1. 成功 - if (exception == null) { - mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) - .setSendStatus(MailSendStatusEnum.SUCCESS.getStatus()).setSendMessageId(messageId)); - return; - } - // 2. 失败 - mailLogMapper.updateById(new MailLogDO().setId(logId).setSendTime(LocalDateTime.now()) - .setSendStatus(MailSendStatusEnum.FAILURE.getStatus()).setSendException(getRootCauseMessage(exception))); - - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendService.java deleted file mode 100644 index ac700c1..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import com.njcn.rdms.framework.common.enums.UserTypeEnum; -import com.njcn.rdms.module.system.mq.message.mail.MailSendMessage; - -import java.io.File; -import java.util.Collection; -import java.util.Map; - -/** - * 邮件发送 Service 接口 - * - * @author hongawen - * - */ -public interface MailSendService { - - /** - * 发送单条邮件给管理后台的用户 - * - * @param userId 用户编码 - * @param toMails 收件邮箱 - * @param ccMails 抄送邮箱 - * @param bccMails 密送邮箱 - * @param templateCode 邮件模版编码 - * @param templateParams 邮件模版参数 - * @param attachments 附件 - * @return 发送日志编号 - */ - default Long sendSingleMailToAdmin(Long userId, - Collection toMails, Collection ccMails, Collection bccMails, - String templateCode, Map templateParams, - File... attachments) { - return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.ADMIN.getValue(), - templateCode, templateParams, attachments); - } - - /** - * 发送单条邮件给用户 APP 的用户 - * - * @param userId 用户编码 - * @param toMails 收件邮箱 - * @param ccMails 抄送邮箱 - * @param bccMails 密送邮箱 - * @param templateCode 邮件模版编码 - * @param templateParams 邮件模版参数 - * @param attachments 附件 - * @return 发送日志编号 - */ - default Long sendSingleMailToMember(Long userId, - Collection toMails, Collection ccMails, Collection bccMails, - String templateCode, Map templateParams, - File... attachments) { - return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.MEMBER.getValue(), - templateCode, templateParams, attachments); - } - - /** - * 发送单条邮件 - * - * @param toMails 收件邮箱 - * @param ccMails 抄送邮箱 - * @param bccMails 密送邮箱 - * @param userId 用户编号 - * @param userType 用户类型 - * @param templateCode 邮件模版编码 - * @param templateParams 邮件模版参数 - * @param attachments 附件 - * @return 发送日志编号 - */ - Long sendSingleMail(Collection toMails, Collection ccMails, Collection bccMails, - Long userId, Integer userType, - String templateCode, Map templateParams, - File... attachments); - - /** - * 执行真正的邮件发送 - * 注意,该方法仅仅提供给 MQ Consumer 使用 - * - * @param message 邮件 - */ - void doSendMail(MailSendMessage message); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendServiceImpl.java deleted file mode 100644 index cf7df74..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailSendServiceImpl.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Validator; -import cn.hutool.core.util.StrUtil; -import com.njcn.rdms.framework.common.enums.CommonStatusEnum; -import com.njcn.rdms.framework.common.enums.UserTypeEnum; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailAccountDO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import com.njcn.rdms.module.system.dal.dataobject.user.AdminUserDO; -import com.njcn.rdms.module.system.mq.message.mail.MailSendMessage; -import com.njcn.rdms.module.system.mq.producer.mail.MailProducer; -import com.njcn.rdms.module.system.service.member.MemberService; -import com.njcn.rdms.module.system.service.user.AdminUserService; -import com.google.common.annotations.VisibleForTesting; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.dromara.hutool.extra.mail.MailAccount; -import org.dromara.hutool.extra.mail.MailUtil; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.io.File; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.Map; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.*; - -/** - * 邮箱发送 Service 实现类 - * - * @author hongawen - * - */ -@Service -@Validated -@Slf4j -public class MailSendServiceImpl implements MailSendService { - - @Resource - private AdminUserService adminUserService; - @Resource - private MemberService memberService; - - @Resource - private MailAccountService mailAccountService; - @Resource - private MailTemplateService mailTemplateService; - - @Resource - private MailLogService mailLogService; - @Resource - private MailProducer mailProducer; - - @Override - public Long sendSingleMail(Collection toMails, Collection ccMails, Collection bccMails, - Long userId, Integer userType, - String templateCode, Map templateParams, - File... attachments) { - // 1.1 校验邮箱模版是否合法 - MailTemplateDO template = validateMailTemplate(templateCode); - // 1.2 校验邮箱账号是否合法 - MailAccountDO account = validateMailAccount(template.getAccountId()); - // 1.3 校验邮件参数是否缺失 - validateTemplateParams(template, templateParams); - - // 2. 组装邮箱 - String userMail = getUserMail(userId, userType); - Collection toMailSet = new LinkedHashSet<>(); - Collection ccMailSet = new LinkedHashSet<>(); - Collection bccMailSet = new LinkedHashSet<>(); - if (Validator.isEmail(userMail)) { - toMailSet.add(userMail); - } - if (CollUtil.isNotEmpty(toMails)) { - toMails.stream().filter(Validator::isEmail).forEach(toMailSet::add); - } - if (CollUtil.isNotEmpty(ccMails)) { - ccMails.stream().filter(Validator::isEmail).forEach(ccMailSet::add); - } - if (CollUtil.isNotEmpty(bccMails)) { - bccMails.stream().filter(Validator::isEmail).forEach(bccMailSet::add); - } - if (CollUtil.isEmpty(toMailSet)) { - throw exception(MAIL_SEND_MAIL_NOT_EXISTS); - } - - // 创建发送日志。如果模板被禁用,则不发送邮件,只记录日志 - Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); - String title = mailTemplateService.formatMailTemplateContent(template.getTitle(), templateParams); - String content = mailTemplateService.formatMailTemplateContent(template.getContent(), templateParams); - Long sendLogId = mailLogService.createMailLog(userId, userType, toMailSet, ccMailSet, bccMailSet, - account, template, content, templateParams, isSend); - // 发送 MQ 消息,异步执行发送邮件 - if (isSend) { - mailProducer.sendMailSendMessage(sendLogId, toMailSet, ccMailSet, bccMailSet, - account.getId(), template.getNickname(), title, content, attachments); - } - return sendLogId; - } - - private String getUserMail(Long userId, Integer userType) { - if (userId == null || userType == null) { - return null; - } - if (UserTypeEnum.ADMIN.getValue().equals(userType)) { - AdminUserDO user = adminUserService.getUser(userId); - if (user != null) { - return user.getEmail(); - } - } - if (UserTypeEnum.MEMBER.getValue().equals(userType)) { - return memberService.getMemberUserEmail(userId); - } - return null; - } - - @Override - public void doSendMail(MailSendMessage message) { - // 1. 创建发送账号 - MailAccountDO account = validateMailAccount(message.getAccountId()); - MailAccount mailAccount = buildMailAccount(account, message.getNickname()); - // 2. 发送邮件 - try { - String messageId = MailUtil.send(mailAccount, message.getToMails(), message.getCcMails(), message.getBccMails(), - message.getTitle(), message.getContent(), true, message.getAttachments()); - // 3. 更新结果(成功) - mailLogService.updateMailSendResult(message.getLogId(), messageId, null); - } catch (Exception e) { - // 3. 更新结果(异常) - mailLogService.updateMailSendResult(message.getLogId(), null, e); - } - } - - private MailAccount buildMailAccount(MailAccountDO account, String nickname) { - String from = StrUtil.isNotEmpty(nickname) ? nickname + " <" + account.getMail() + ">" : account.getMail(); - return new MailAccount().setFrom(from).setAuth(true) - .setUser(account.getUsername()).setPass(account.getPassword().toCharArray()) - .setHost(account.getHost()).setPort(account.getPort()) - .setSslEnable(account.getSslEnable()).setStarttlsEnable(account.getStarttlsEnable()); - } - - @VisibleForTesting - MailTemplateDO validateMailTemplate(String templateCode) { - // 获得邮件模板。考虑到效率,从缓存中获取 - MailTemplateDO template = mailTemplateService.getMailTemplateByCodeFromCache(templateCode); - // 邮件模板不存在 - if (template == null) { - throw exception(MAIL_TEMPLATE_NOT_EXISTS); - } - return template; - } - - @VisibleForTesting - MailAccountDO validateMailAccount(Long accountId) { - // 获得邮箱账号。考虑到效率,从缓存中获取 - MailAccountDO account = mailAccountService.getMailAccountFromCache(accountId); - // 邮箱账号不存在 - if (account == null) { - throw exception(MAIL_ACCOUNT_NOT_EXISTS); - } - return account; - } - - /** - * 校验邮件参数是否缺失 - * - * @param template 邮箱模板 - * @param templateParams 参数列表 - */ - @VisibleForTesting - void validateTemplateParams(MailTemplateDO template, Map templateParams) { - template.getParams().forEach(key -> { - Object value = templateParams.get(key); - if (value == null) { - throw exception(MAIL_SEND_TEMPLATE_PARAM_MISS, key); - } - }); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateService.java deleted file mode 100644 index 4cbc541..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateService.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import jakarta.validation.Valid; - -import java.util.List; -import java.util.Map; - -/** - * 邮件模版 Service 接口 - * - * @author hongawen - * - */ -public interface MailTemplateService { - - /** - * 邮件模版创建 - * - * @param createReqVO 邮件信息 - * @return 编号 - */ - Long createMailTemplate(@Valid MailTemplateSaveReqVO createReqVO); - - /** - * 邮件模版修改 - * - * @param updateReqVO 邮件信息 - */ - void updateMailTemplate(@Valid MailTemplateSaveReqVO updateReqVO); - - /** - * 邮件模版删除 - * - * @param id 编号 - */ - void deleteMailTemplate(Long id); - - /** - * 批量删除邮件模版 - * - * @param ids 编号列表 - */ - void deleteMailTemplateList(List ids); - - /** - * 获取邮件模版 - * - * @param id 编号 - * @return 邮件模版 - */ - MailTemplateDO getMailTemplate(Long id); - - /** - * 获取邮件模版分页 - * - * @param pageReqVO 模版信息 - * @return 邮件模版分页信息 - */ - PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO); - - /** - * 获取邮件模板数组 - * - * @return 模版数组 - */ - List getMailTemplateList(); - - /** - * 从缓存中获取邮件模版 - * - * @param code 模板编码 - * @return 邮件模板 - */ - MailTemplateDO getMailTemplateByCodeFromCache(String code); - - /** - * 邮件模版内容合成 - * - * @param content 邮件模版 - * @param params 合成参数 - * @return 格式化后的内容 - */ - String formatMailTemplateContent(String content, Map params); - - /** - * 获得指定邮件账号下的邮件模板数量 - * - * @param accountId 账号编号 - * @return 数量 - */ - long getMailTemplateCountByAccountId(Long accountId); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateServiceImpl.java deleted file mode 100644 index 0336c72..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/mail/MailTemplateServiceImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -package com.njcn.rdms.module.system.service.mail; - -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.ReUtil; -import cn.hutool.core.util.StrUtil; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; -import com.njcn.rdms.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.mail.MailTemplateDO; -import com.njcn.rdms.module.system.dal.mysql.mail.MailTemplateMapper; -import com.njcn.rdms.module.system.dal.redis.RedisKeyConstants; -import com.google.common.annotations.VisibleForTesting; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_CODE_EXISTS; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS; - -/** - * 邮箱模版 Service 实现类 - * - * @author hongawen - * - */ -@Service -@Validated -@Slf4j -public class MailTemplateServiceImpl implements MailTemplateService { - - /** - * 正则表达式,匹配 {} 中的变量 - */ - private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); - - @Resource - private MailTemplateMapper mailTemplateMapper; - - @Override - public Long createMailTemplate(MailTemplateSaveReqVO createReqVO) { - // 校验 code 是否唯一 - validateCodeUnique(null, createReqVO.getCode()); - - // 插入 - MailTemplateDO template = BeanUtils.toBean(createReqVO, MailTemplateDO.class) - .setParams(parseTemplateTitleAndContentParams(createReqVO.getTitle(), createReqVO.getContent())); - mailTemplateMapper.insert(template); - return template.getId(); - } - - @Override - @CacheEvict(cacheNames = RedisKeyConstants.MAIL_TEMPLATE, - allEntries = true) // allEntries 清空所有缓存,因为可能修改到 code 字段,不好清理 - public void updateMailTemplate(@Valid MailTemplateSaveReqVO updateReqVO) { - // 校验是否存在 - validateMailTemplateExists(updateReqVO.getId()); - // 校验 code 是否唯一 - validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode()); - - // 更新 - MailTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MailTemplateDO.class) - .setParams(parseTemplateTitleAndContentParams(updateReqVO.getTitle(), updateReqVO.getContent())); - mailTemplateMapper.updateById(updateObj); - } - - @VisibleForTesting - void validateCodeUnique(Long id, String code) { - MailTemplateDO template = mailTemplateMapper.selectByCode(code); - if (template == null) { - return; - } - // 存在 template 记录的情况下 - if (id == null // 新增时,说明重复 - || ObjUtil.notEqual(id, template.getId())) { // 更新时,如果 id 不一致,说明重复 - throw exception(MAIL_TEMPLATE_CODE_EXISTS); - } - } - - @Override - @CacheEvict(cacheNames = RedisKeyConstants.MAIL_TEMPLATE, - allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 - public void deleteMailTemplate(Long id) { - // 校验是否存在 - validateMailTemplateExists(id); - - // 删除 - mailTemplateMapper.deleteById(id); - } - - @Override - @CacheEvict(cacheNames = RedisKeyConstants.MAIL_TEMPLATE, - allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 code,不好清理 - public void deleteMailTemplateList(List ids) { - mailTemplateMapper.deleteByIds(ids); - } - - private void validateMailTemplateExists(Long id) { - if (mailTemplateMapper.selectById(id) == null) { - throw exception(MAIL_TEMPLATE_NOT_EXISTS); - } - } - - @Override - public MailTemplateDO getMailTemplate(Long id) {return mailTemplateMapper.selectById(id);} - - @Override - @Cacheable(value = RedisKeyConstants.MAIL_TEMPLATE, key = "#code", unless = "#result == null") - public MailTemplateDO getMailTemplateByCodeFromCache(String code) { - return mailTemplateMapper.selectByCode(code); - } - - @Override - public PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO) { - return mailTemplateMapper.selectPage(pageReqVO); - } - - @Override - public List getMailTemplateList() {return mailTemplateMapper.selectList();} - - @Override - public String formatMailTemplateContent(String content, Map params) { - // 1. 先替换模板变量 - String formattedContent = StrUtil.format(content, params); - - // 关联 Pull Request:https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1461 讨论 - // 2.1 反转义HTML特殊字符 - formattedContent = unescapeHtml(formattedContent); - // 2.2 处理代码块(确保

标签格式正确)
-        formattedContent = formatHtmlCodeBlocks(formattedContent);
-        // 2.3 将最外层的 pre 标签替换为 div 标签
-        formattedContent = replaceOuterPreWithDiv(formattedContent);
-        return formattedContent;
-    }
-
-    private String replaceOuterPreWithDiv(String content) {
-        if (StrUtil.isEmpty(content)) {
-            return content;
-        }
-        // 使用正则表达式匹配所有的 
 标签,包括嵌套的  标签
-        String regex = "(?s)]*>(.*?)
"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(content); - StringBuilder sb = new StringBuilder(); - while (matcher.find()) { - // 提取
 标签内的内容
-            String innerContent = matcher.group(1);
-            // 返回 div 标签包裹的内容
-            matcher.appendReplacement(sb, "
" + innerContent + "
"); - } - matcher.appendTail(sb); - return sb.toString(); - } - - /** - * 反转义 HTML 特殊字符 - * - * @param input 输入字符串 - * @return 反转义后的字符串 - */ - private String unescapeHtml(String input) { - if (StrUtil.isEmpty(input)) { - return input; - } - return input - .replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace(""", "\"") - .replace("'", "'") - .replace(" ", " "); - } - - /** - * 格式化 HTML 中的代码块 - * - * @param content 邮件内容 - * @return 格式化后的邮件内容 - */ - private String formatHtmlCodeBlocks(String content) { - // 匹配
 标签的代码块
-        Pattern codeBlockPattern = Pattern.compile("(.*?)
", Pattern.DOTALL); - Matcher matcher = codeBlockPattern.matcher(content); - StringBuilder sb = new StringBuilder(); - while (matcher.find()) { - // 获取代码块内容 - String codeBlock = matcher.group(1); - // 为代码块添加样式 - String replacement = "
" + codeBlock + "
"; - matcher.appendReplacement(sb, replacement); - } - matcher.appendTail(sb); - return sb.toString(); - } - - @Override - public long getMailTemplateCountByAccountId(Long accountId) { - return mailTemplateMapper.selectCountByAccountId(accountId); - } - - /** - * 解析标题和内容中的参数 - */ - @VisibleForTesting - public List parseTemplateTitleAndContentParams(String title, String content) { - List titleParams = ReUtil.findAllGroup1(PATTERN_PARAMS, title); - List contentParams = ReUtil.findAllGroup1(PATTERN_PARAMS, content); - // 合并参数并去重 - List allParams = new ArrayList<>(titleParams); - for (String param : contentParams) { - if (!allParams.contains(param)) { - allParams.add(param); - } - } - return allParams; - } - - /** - * 获得邮件模板中的参数,形如 {key} - * - * @param content 内容 - * @return 参数列表 - */ - List parseTemplateContentParams(String content) { - return ReUtil.findAllGroup1(PATTERN_PARAMS, content); - } - -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientService.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientService.java deleted file mode 100644 index caaa625..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.njcn.rdms.module.system.service.social; - -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.social.SocialClientDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * 社交应用 Service 接口 - * - * @author hongawen - */ -public interface SocialClientService { - - // =================== 客户端管理 =================== - - Long createSocialClient(@Valid SocialClientSaveReqVO createReqVO); - - void updateSocialClient(@Valid SocialClientSaveReqVO updateReqVO); - - void deleteSocialClient(Long id); - - void deleteSocialClientList(List ids); - - SocialClientDO getSocialClient(Long id); - - PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO); - -} diff --git a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientServiceImpl.java b/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientServiceImpl.java deleted file mode 100644 index 6d6a679..0000000 --- a/rdms-system/rdms-system-boot/src/main/java/com/njcn/rdms/module/system/service/social/SocialClientServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.njcn.rdms.module.system.service.social; - -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjUtil; -import com.njcn.rdms.framework.common.pojo.PageResult; -import com.njcn.rdms.framework.common.util.object.BeanUtils; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; -import com.njcn.rdms.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; -import com.njcn.rdms.module.system.dal.dataobject.social.SocialClientDO; -import com.njcn.rdms.module.system.dal.mysql.social.SocialClientMapper; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static com.njcn.rdms.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.rdms.module.system.enums.ErrorCodeConstants.*; - -/** - * 社交应用 Service 实现类 - * - * @author hongawen - */ -@Service -@Slf4j -public class SocialClientServiceImpl implements SocialClientService { - - @Resource - private SocialClientMapper socialClientMapper; - - @Override - public Long createSocialClient(SocialClientSaveReqVO createReqVO) { - validateSocialClientUnique(null, createReqVO.getUserType(), createReqVO.getSocialType()); - SocialClientDO client = BeanUtils.toBean(createReqVO, SocialClientDO.class); - socialClientMapper.insert(client); - return client.getId(); - } - - @Override - public void updateSocialClient(SocialClientSaveReqVO updateReqVO) { - validateSocialClientExists(updateReqVO.getId()); - validateSocialClientUnique(updateReqVO.getId(), updateReqVO.getUserType(), updateReqVO.getSocialType()); - SocialClientDO updateObj = BeanUtils.toBean(updateReqVO, SocialClientDO.class); - socialClientMapper.updateById(updateObj); - } - - @Override - public void deleteSocialClient(Long id) { - validateSocialClientExists(id); - socialClientMapper.deleteById(id); - } - - @Override - public void deleteSocialClientList(List ids) { - socialClientMapper.deleteByIds(ids); - } - - private void validateSocialClientExists(Long id) { - if (socialClientMapper.selectById(id) == null) { - throw exception(SOCIAL_CLIENT_NOT_EXISTS); - } - } - - private void validateSocialClientUnique(Long id, Integer userType, Integer socialType) { - SocialClientDO client = socialClientMapper.selectBySocialTypeAndUserType(socialType, userType); - if (client == null) { - return; - } - if (id == null || ObjUtil.notEqual(id, client.getId())) { - throw exception(SOCIAL_CLIENT_UNIQUE); - } - } - - @Override - public SocialClientDO getSocialClient(Long id) { - return socialClientMapper.selectById(id); - } - - @Override - public PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO) { - return socialClientMapper.selectPage(pageReqVO); - } - -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/application.yaml b/rdms-system/rdms-system-boot/src/main/resources/application.yaml index 910d185..fcfc035 100644 --- a/rdms-system/rdms-system-boot/src/main/resources/application.yaml +++ b/rdms-system/rdms-system-boot/src/main/resources/application.yaml @@ -1,4 +1,4 @@ -spring: +spring: application: name: rdms-system-server profiles: @@ -116,16 +116,9 @@ rdms: title: 管理后台 description: 提供管理员管理的所有功能 version: ${rdms.info.version} - codegen: - base-package: com.njcn.rdms - db-schemas: ${spring.datasource.dynamic.datasource.master.name} - front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 - vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 - delete-batch-enable: true # 是否生成批量删除接口 - unit-test-enable: false # 是否生成单元测试 websocket: enable: true # 是否开启 WebSocket - sender-type: local # WebSocket 消息发送器类型:local(本地)、redis、rocketmq、rabbitmq、kafka - path: /infra/ws # WebSocket 路径 + path: /system/ws # WebSocket 路径 debug: false + diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/controller.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/controller.vm deleted file mode 100644 index 9f63e24..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/controller.vm +++ /dev/null @@ -1,271 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; - -import org.springframework.web.bind.annotation.*; -import ${jakartaPackage}.annotation.Resource; -import org.springframework.validation.annotation.Validated; -#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end - -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import ${jakartaPackage}.validation.constraints.*; -import ${jakartaPackage}.validation.*; -import ${jakartaPackage}.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import ${PageParamClassName}; -import ${PageResultClassName}; -import ${CommonResultClassName}; -import ${BeanUtils}; -import static ${CommonResultClassName}.success; - -import ${ExcelUtilsClassName}; - -import ${ApiAccessLogClassName}; -import static ${OperateTypeEnumClassName}.*; - -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; - -@Tag(name = "${sceneEnum.name} - ${table.classComment}") -@RestController -##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 -@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") -@Validated -public class ${sceneEnum.prefixClass}${table.className}Controller { - - @Resource - private ${table.className}Service ${classNameVar}Service; - - @PostMapping("/create") - @Operation(summary = "创建${table.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") -#end - public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) { - return success(${classNameVar}Service.create${simpleClassName}(${saveReqVOVar})); - } - - @PutMapping("/update") - @Operation(summary = "更新${table.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") -#end - public CommonResult update${simpleClassName}(@Valid @RequestBody ${updateReqVOClass} ${updateReqVOVar}) { - ${classNameVar}Service.update${simpleClassName}(${updateReqVOVar}); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除${table.classComment}") - @Parameter(name = "id", description = "编号", required = true) -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { - ${classNameVar}Service.delete${simpleClassName}(id); - return success(true); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - @DeleteMapping("/delete-list") - @Parameter(name = "ids", description = "编号", required = true) - @Operation(summary = "批量删除${table.classComment}") - #if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") - #end - public CommonResult delete${simpleClassName}List(@RequestParam("ids") List<${primaryColumn.javaType}> ids) { - ${classNameVar}Service.delete${simpleClassName}ListByIds(ids); - return success(true); - } -#end - - @GetMapping("/get") - @Operation(summary = "获得${table.classComment}") - @Parameter(name = "id", description = "编号", required = true, example = "1024") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${respVOClass}> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { - ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); -#if ($voType == 10) - return success(BeanUtils.toBean(${classNameVar}, ${respVOClass}.class)); -#else - return success(${classNameVar}); -#end - } - -#if ( $table.templateType != 2 ) - @GetMapping("/page") - @Operation(summary = "获得${table.classComment}分页") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { - PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO); -#if ($voType == 10) - return success(BeanUtils.toBean(pageResult, ${respVOClass}.class)); -#else - return success(pageResult); -#end - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#else - @GetMapping("/list") - @Operation(summary = "获得${table.classComment}列表") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); -#if ($voType == 10) - return success(BeanUtils.toBean(list, ${respVOClass}.class)); -#else - return success(list); -#end - } - -#end - @GetMapping("/export-excel") - @Operation(summary = "导出${table.classComment} Excel") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')") -#end - @ApiAccessLog(operateType = EXPORT) -#if ( $table.templateType != 2 ) - public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${respVOClass}.class, - BeanUtils.toBean(list, ${respVOClass}.class)); - } -## 特殊:树表专属逻辑(树不需要分页接口) -#else - public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO, - HttpServletResponse response) throws IOException { - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); - // 导出 Excel - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${table.className}RespVO.class, - BeanUtils.toBean(list, ${table.className}RespVO.class)); - } -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) -#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - @GetMapping("/${subSimpleClassName_strikeCase}/page") - @Operation(summary = "获得${subTable.classComment}分页") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${subSimpleClassName}Page(PageParam pageReqVO, - @RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}Page(pageReqVO, ${subJoinColumn.javaField})); - } - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - @GetMapping("/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}") - @Operation(summary = "获得${subTable.classComment}列表") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${subSimpleClassName}ListBy${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField})); - } - - #else - @GetMapping("/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}") - @Operation(summary = "获得${subTable.classComment}") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${subTable.className}DO> get${subSimpleClassName}By${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField})); - } - - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - @PostMapping("/${subSimpleClassName_strikeCase}/create") - @Operation(summary = "创建${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") -#end - public CommonResult<${subPrimaryColumn.javaType}> create${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { - return success(${classNameVar}Service.create${subSimpleClassName}(${subClassNameVar})); - } - - @PutMapping("/${subSimpleClassName_strikeCase}/update") - @Operation(summary = "更新${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") -#end - public CommonResult update${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { - ${classNameVar}Service.update${subSimpleClassName}(${subClassNameVar}); - return success(true); - } - - @DeleteMapping("/${subSimpleClassName_strikeCase}/delete") - @Parameter(name = "id", description = "编号", required = true) - @Operation(summary = "删除${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { - ${classNameVar}Service.delete${subSimpleClassName}(id); - return success(true); - } - -#if ($deleteBatchEnable) - @DeleteMapping("/${subSimpleClassName_strikeCase}/delete-list") - @Parameter(name = "ids", description = "编号", required = true) - @Operation(summary = "批量删除${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${subSimpleClassName}List(@RequestParam("ids") List<${subPrimaryColumn.javaType}> ids) { - ${classNameVar}Service.delete${subSimpleClassName}ListByIds(ids); - return success(true); - } -#end - - @GetMapping("/${subSimpleClassName_strikeCase}/get") - @Operation(summary = "获得${subTable.classComment}") - @Parameter(name = "id", description = "编号", required = true) -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${subTable.className}DO> get${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { - return success(${classNameVar}Service.get${subSimpleClassName}(id)); - } - -#end -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/listReqVO.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/listReqVO.vm deleted file mode 100644 index 46b6a25..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/listReqVO.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import ${PageParamClassName}; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperation} && ${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -import org.springframework.format.annotation.DateTimeFormat; - -import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -#break -#end -#end -## 字段模板 -#macro(columnTpl $prefix $prefixStr) - @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}列表 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}ListReqVO { - -#foreach ($column in $columns) -#if (${column.listOperation})##查询操作 -#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 - @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private ${column.javaType}[] ${column.javaField}; -#else##情况二,非 Between 的时间 - #columnTpl('', '') -#end - -#end -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/pageReqVO.vm deleted file mode 100644 index d0367a3..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/pageReqVO.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import ${PageParamClassName}; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperationCondition} && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - -import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -#break -#end -#end -## 字段模板 -#macro(columnTpl $prefix $prefixStr) - @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}分页 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { - -#foreach ($column in $columns) -#if (${column.listOperation})##查询操作 -#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 - @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private ${column.javaType}[] ${column.javaField}; -#else##情况二,非 Between 的时间 - #columnTpl('', '') -#end - -#end -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/respVO.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/respVO.vm deleted file mode 100644 index eae083a..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/respVO.vm +++ /dev/null @@ -1,53 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -## 处理 BigDecimal 字段的引入 -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperationResult} && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; -#break -#end -#end -## 处理 Excel 导出 -import cn.idev.excel.annotation.*; -#foreach ($column in $columns) -#if ("$!column.dictType" != "")## 有设置数据字典 -import ${DictFormatClassName}; -import ${DictConvertClassName}; -#break -#end -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -@Data -@ExcelIgnoreUnannotated -public class ${sceneEnum.prefixClass}${table.className}RespVO { - -## 逐个处理字段 -#foreach ($column in $columns) -#if (${column.listOperationResult}) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Excel 导出 -#if ("$!column.dictType" != "")##处理枚举值 - @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) - @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 -#else - @ExcelProperty("${column.columnComment}") -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; - -#end -#end -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/saveReqVO.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/saveReqVO.vm deleted file mode 100644 index b432c75..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/controller/vo/saveReqVO.vm +++ /dev/null @@ -1,64 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import ${jakartaPackage}.validation.constraints.*; -## 处理 BigDecimal 字段的引入 -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if ((${column.createOperation} || ${column.updateOperation}) && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; -#break -#end -#end -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}新增/修改 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}SaveReqVO { - -## 逐个处理字段 -#foreach ($column in $columns) -#if (${column.createOperation} || ${column.updateOperation}) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Validator 参数校验 -#if (!${column.nullable} && !${column.primaryKey}) -#if (${column.javaType} == 'String') - @NotEmpty(message = "${column.columnComment}不能为空") -#else - @NotNull(message = "${column.columnComment}不能为空") -#end -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; - -#end -#end -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) - #if ( $subTable.subJoinMany) - @Schema(description = "${subTable.classComment}列表") - private List<${subTable.className}DO> ${subClassNameVars.get($index)}s; - - #else - @Schema(description = "${subTable.classComment}") - private ${subTable.className}DO ${subClassNameVars.get($index)}; - - #end -#end -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do.vm deleted file mode 100644 index f15ada4..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do.vm +++ /dev/null @@ -1,103 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; - -import lombok.*; -import java.util.*; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#end -#if (${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -#end -#end -import com.baomidou.mybatisplus.annotation.*; -import ${BaseDOClassName}; -## 处理 Excel 导出 + Schema 注解(仅 DO 模式) -#if ($voType == 20) -import io.swagger.v3.oas.annotations.media.Schema; -import cn.idev.excel.annotation.*; -#foreach ($column in $columns) - #if ("$!column.dictType" != "")## 有设置数据字典 - import ${DictFormatClassName}; - import ${DictConvertClassName}; - #break - #end -#end -#end - -/** - * ${table.classComment} DO - * - * @author ${table.author} - */ -@TableName("${table.tableName.toLowerCase()}") -@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -## 处理 Excel 导出 + Schema 注解(仅 DO 模式) -#if ($voType == 20) -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -@ExcelIgnoreUnannotated -#end -public class ${table.className}DO extends BaseDO { - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) - public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L; - -#end -#foreach ($column in $columns) -#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 - /** - * ${column.columnComment} - #if ("$!column.dictType" != "")##处理枚举值 - * - * 枚举 {@link TODO ${column.dictType} 对应的类} - #end - */ - #if (${column.primaryKey})##处理主键 - @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end - #end -#if ($voType == 20) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Excel 导出 -#if ("$!column.dictType" != "")##处理枚举值 - @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) - @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 -#else - @ExcelProperty("${column.columnComment}") -#end -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; -#end -#end - -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $voType == 20 && $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #if ( $subTable.subJoinMany) - /** - * ${subTable.classComment}列表 - */ - @Schema(description = "${subTable.classComment}列表") - @TableField(exist = false) - private List<${subTable.className}DO> ${subClassNameVars.get($index)}s; - #else - /** - * ${subTable.classComment} - */ - @Schema(description = "${subTable.classComment}") - @TableField(exist = false) - private ${subTable.className}DO ${subClassNameVars.get($index)}; - #end - #end -#end - -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do_sub.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do_sub.vm deleted file mode 100644 index 0dfc38f..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/do_sub.vm +++ /dev/null @@ -1,69 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -package ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}; - -import lombok.*; -import java.util.*; -#foreach ($column in $subColumns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#end -#if (${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -#end -#end -import com.baomidou.mybatisplus.annotation.*; -import ${BaseDOClassName}; -## 处理 Schema 注解(仅 DO 模式) -#if ($voType == 20) -import io.swagger.v3.oas.annotations.media.Schema; -#foreach ($column in $columns) - #if ("$!column.dictType" != "")## 有设置数据字典 - import ${DictFormatClassName}; - import ${DictConvertClassName}; - #break - #end -#end -#end - -/** - * ${subTable.classComment} DO - * - * @author ${subTable.author} - */ -@TableName("${subTable.tableName.toLowerCase()}") -@KeySequence("${subTable.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -## 处理 Schema 注解(仅 DO 模式) -#if ($voType == 20) -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -#end -public class ${subTable.className}DO extends BaseDO { - -#foreach ($column in $subColumns) -#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 - /** - * ${column.columnComment} - #if ("$!column.dictType" != "")##处理枚举值 - * - * 枚举 {@link TODO ${column.dictType} 对应的类} - #end - */ - #if (${column.primaryKey})##处理主键 - @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end - #end -#if ($voType == 20) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -#end -## 2. 处理字段定义 - private ${column.javaType} ${column.javaField}; -#end -#end - -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.vm deleted file mode 100644 index b98b471..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.vm +++ /dev/null @@ -1,82 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; - -import java.util.*; - -import ${PageResultClassName}; -import ${QueryWrapperClassName}; -import ${BaseMapperClassName}; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import org.apache.ibatis.annotations.Mapper; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; - -## 字段模板 -#macro(listCondition) -#foreach ($column in $columns) -#if (${column.listOperation}) -#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 -#if (${column.listOperationCondition} == "=")##情况一,= 的时候 - .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 - .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == ">")##情况三,> 的时候 - .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 - .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "<")##情况五,< 的时候 - .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 - .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 - .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 - .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#end -#end -#end -/** - * ${table.classComment} Mapper - * - * @author ${table.author} - */ -@Mapper -public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() - #listCondition() - .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 - - } -#else - default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX<${table.className}DO>() - #listCondition() - .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 - - } -#end - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - default ${table.className}DO selectBy${TreeParentJavaField}And${TreeNameJavaField}(Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { - return selectOne(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}, ${table.className}DO::get${TreeNameJavaField}, ${treeNameColumn.javaField}); - } - - default Long selectCountBy${TreeParentJavaField}(${treeParentColumn.javaType} ${treeParentColumn.javaField}) { - return selectCount(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}); - } - -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.xml.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.xml.vm deleted file mode 100644 index 290378d..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper.xml.vm +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper_sub.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper_sub.vm deleted file mode 100644 index 40f2ff5..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/dal/mapper_sub.vm +++ /dev/null @@ -1,63 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subJoinColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -package ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}; - -import java.util.*; - -import ${PageResultClassName}; -import ${PageParamClassName}; -import ${QueryWrapperClassName}; -import ${BaseMapperClassName}; -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -import org.apache.ibatis.annotations.Mapper; - -/** - * ${subTable.classComment} Mapper - * - * @author ${subTable.author} - */ -@Mapper -public interface ${subTable.className}Mapper extends BaseMapperX<${subTable.className}DO> { - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - default PageResult<${subTable.className}DO> selectPage(PageParam reqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectPage(reqVO, new LambdaQueryWrapperX<${subTable.className}DO>() - .eq(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}) - .orderByDesc(${subTable.className}DO::getId));## 大多数情况下,id 倒序 - - } -## 主表与子表是一对一时 - #if (!$subTable.subJoinMany) - default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - #end - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany) - default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - - #else - default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - - #end - #end - default int deleteBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - default int deleteBy${SubJoinColumnName}s(List<${subJoinColumn.javaType}> ${subJoinColumn.javaField}s) { - return deleteBatch(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}s); - } -#end - -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/enums/errorcode.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/enums/errorcode.vm deleted file mode 100644 index df3cd0b..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/enums/errorcode.vm +++ /dev/null @@ -1,22 +0,0 @@ -// TODO 待办:请将下面的错误码复制到 rdms-module-${table.moduleName} 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! -// ========== ${table.classComment} TODO 补充编号 ========== -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN = new ErrorCode(TODO 补充编号, "存在存在子${table.classComment},无法删除"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS = new ErrorCode(TODO 补充编号,"父级${table.classComment}不存在"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR = new ErrorCode(TODO 补充编号, "不能设置自己为父${table.classComment}"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE = new ErrorCode(TODO 补充编号, "已经存在该${treeNameColumn.columnComment}的${table.classComment}"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD = new ErrorCode(TODO 补充编号, "不能设置自己的子${table.className}为父${table.className}"); -#end -## 特殊:主子表专属逻辑 -#if ( $table.templateType == 11 )## 特殊:ERP 情况 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) -ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}不存在"); -#if ( !$subTable.subJoinMany ) -ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}已存在"); -#end -#end -#end \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/service.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/service.vm deleted file mode 100644 index 1cc68bf..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/service.vm +++ /dev/null @@ -1,165 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import java.util.*; -import ${jakartaPackage}.validation.*; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${PageResultClassName}; -import ${PageParamClassName}; - -/** - * ${table.classComment} Service 接口 - * - * @author ${table.author} - */ -public interface ${table.className}Service { - - /** - * 创建${table.classComment} - * - * @param ${saveReqVOVar} 创建信息 - * @return 编号 - */ - ${primaryColumn.javaType} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar}); - - /** - * 更新${table.classComment} - * - * @param ${updateReqVOVar} 更新信息 - */ - void update${simpleClassName}(@Valid ${updateReqVOClass} ${updateReqVOVar}); - - /** - * 删除${table.classComment} - * - * @param id 编号 - */ - void delete${simpleClassName}(${primaryColumn.javaType} id); - -#if ( $table.templateType != 2 && $deleteBatchEnable) - /** - * 批量删除${table.classComment} - * - * @param ids 编号 - */ - void delete${simpleClassName}ListByIds(List<${primaryColumn.javaType}> ids); -#end - - /** - * 获得${table.classComment} - * - * @param id 编号 - * @return ${table.classComment} - */ - ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - /** - * 获得${table.classComment}分页 - * - * @param pageReqVO 分页查询 - * @return ${table.classComment}分页 - */ - PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); -#else - /** - * 获得${table.classComment}列表 - * - * @param listReqVO 查询条件 - * @return ${table.classComment}列表 - */ - List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO); -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - /** - * 获得${subTable.classComment}分页 - * - * @param pageReqVO 分页查询 - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment}分页 - */ - PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}); - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - /** - * 获得${subTable.classComment}列表 - * - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment}列表 - */ - List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); - - #else - /** - * 获得${subTable.classComment} - * - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment} - */ - ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); - - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - /** - * 创建${subTable.classComment} - * - * @param ${subClassNameVar} 创建信息 - * @return 编号 - */ - ${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); - - /** - * 更新${subTable.classComment} - * - * @param ${subClassNameVar} 更新信息 - */ - void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); - - /** - * 删除${subTable.classComment} - * - * @param id 编号 - */ - void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id); - -#if ($deleteBatchEnable) - /** - * 批量删除${subTable.classComment} - * - * @param ids 编号 - */ - void delete${subSimpleClassName}ListByIds(List<${subPrimaryColumn.javaType}> ids); -#end - - /** - * 获得${subTable.classComment} - * - * @param id 编号 - * @return ${subTable.classComment} - */ - ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id); - -#end -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/serviceImpl.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/serviceImpl.vm deleted file mode 100644 index 42afdf9..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/service/serviceImpl.vm +++ /dev/null @@ -1,419 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import cn.hutool.core.collection.CollUtil; -import org.springframework.stereotype.Service; -import ${jakartaPackage}.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${PageResultClassName}; -import ${PageParamClassName}; -import ${BeanUtils}; - -import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}.${subTable.className}Mapper; -#end - -import static ${ServiceExceptionUtilClassName}.exception; -import static ${CollectionUtilsClassName}.convertList; -import static ${CollectionUtilsClassName}.diffList; -import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; - -/** - * ${table.classComment} Service 实现类 - * - * @author ${table.author} - */ -@Service -@Validated -public class ${table.className}ServiceImpl implements ${table.className}Service { - - @Resource - private ${table.className}Mapper ${classNameVar}Mapper; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) - @Resource - private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper; -#end - - @Override -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - @Transactional(rollbackFor = Exception.class) -#end - public ${primaryColumn.javaType} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) { -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - // 校验${treeParentColumn.columnComment}的有效性 - validateParent${simpleClassName}(null, ${saveReqVOVar}.get${TreeParentJavaField}()); - // 校验${treeNameColumn.columnComment}的唯一性 - validate${simpleClassName}${TreeNameJavaField}Unique(null, ${saveReqVOVar}.get${TreeParentJavaField}(), ${saveReqVOVar}.get${TreeNameJavaField}()); - -#end - // 插入 -#if ($voType == 10) - ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class); - ${classNameVar}Mapper.insert(${classNameVar}); -#else - ${saveReqVOVar}.clean() // 清理掉创建、更新时间等相关属性值 - ${classNameVar}Mapper.insert(${saveReqVOVar}); -#end - -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - - // 插入子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #if ( $subTable.subJoinMany) - create${subSimpleClassName}List(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}s()); - #else - create${subSimpleClassName}(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}()); - #end -#end -#end - // 返回 - return ${classNameVar}.getId(); - } - - @Override -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - @Transactional(rollbackFor = Exception.class) -#end - public void update${simpleClassName}(${updateReqVOClass} ${updateReqVOVar}) { - // 校验存在 - validate${simpleClassName}Exists(${updateReqVOVar}.getId()); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - // 校验${treeParentColumn.columnComment}的有效性 - validateParent${simpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}()); - // 校验${treeNameColumn.columnComment}的唯一性 - validate${simpleClassName}${TreeNameJavaField}Unique(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}(), ${updateReqVOVar}.get${TreeNameJavaField}()); - -#end - // 更新 -#if ($voType == 10) - ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class); - ${classNameVar}Mapper.updateById(updateObj); -#else - ${updateReqVOVar}.clean() // 清理掉创建、更新时间等相关属性值 - ${classNameVar}Mapper.updateById(${updateReqVOVar}); -#end -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11) - - // 更新子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #if ( $subTable.subJoinMany) - update${subSimpleClassName}List(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}s()); - #else - update${subSimpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}()); - #end -#end -#end - } - - @Override -## 特殊:主子表专属逻辑 -#if ( $subTables && $subTables.size() > 0) - @Transactional(rollbackFor = Exception.class) -#end - public void delete${simpleClassName}(${primaryColumn.javaType} id) { - // 校验存在 - validate${simpleClassName}Exists(id); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($ParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 - // 校验是否有子${table.classComment} - if (${classNameVar}Mapper.selectCountBy${ParentJavaField}(id) > 0) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN); - } -#end - // 删除 - ${classNameVar}Mapper.deleteById(id); -## 特殊:主子表专属逻辑 -#if ( $subTables && $subTables.size() > 0) - - // 删除子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - delete${subSimpleClassName}By${SubJoinColumnName}(id); -#end -#end - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - @Override - ## 特殊:主子表专属逻辑 - #if ( $subTables && $subTables.size() > 0) - @Transactional(rollbackFor = Exception.class) - #end - public void delete${simpleClassName}ListByIds(List<${primaryColumn.javaType}> ids) { - // 删除 - ${classNameVar}Mapper.deleteByIds(ids); - ## 特殊:主子表专属逻辑 - #if ( $subTables && $subTables.size() > 0) - - // 删除子表 - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - delete${subSimpleClassName}By${SubJoinColumnName}s(ids); - #end - #end - } - -#end - - private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { - if (${classNameVar}Mapper.selectById(id) == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - } - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - private void validateParent${simpleClassName}(Long id, Long ${treeParentColumn.javaField}) { - if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { - return; - } - // 1. 不能设置自己为父${table.classComment} - if (Objects.equals(id, ${treeParentColumn.javaField})) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR); - } - // 2. 父${table.classComment}不存在 - ${simpleClassName}DO parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); - if (parent${simpleClassName} == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS); - } - // 3. 递归校验父${table.classComment},如果父${table.classComment}是自己的子${table.classComment},则报错,避免形成环路 - if (id == null) { // id 为空,说明新增,不需要考虑环路 - return; - } - for (int i = 0; i < Short.MAX_VALUE; i++) { - // 3.1 校验环路 - ${treeParentColumn.javaField} = parent${simpleClassName}.get${TreeParentJavaField}(); - if (Objects.equals(id, ${treeParentColumn.javaField})) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD); - } - // 3.2 继续递归下一级父${table.classComment} - if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { - break; - } - parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); - if (parent${simpleClassName} == null) { - break; - } - } - } - - private void validate${simpleClassName}${TreeNameJavaField}Unique(Long id, Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { - ${simpleClassName}DO ${classNameVar} = ${classNameVar}Mapper.selectBy${TreeParentJavaField}And${TreeNameJavaField}(${treeParentColumn.javaField}, ${treeNameColumn.javaField}); - if (${classNameVar} == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的${table.classComment} - if (id == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); - } - if (!Objects.equals(${classNameVar}.getId(), id)) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); - } - } - -#end - @Override - public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { - return ${classNameVar}Mapper.selectById(id); - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - @Override - public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { - return ${classNameVar}Mapper.selectPage(pageReqVO); - } -#else - @Override - public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { - return ${classNameVar}Mapper.selectList(listReqVO); - } -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - @Override - public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField}); - } - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - @Override - public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - - #else - @Override - public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - - #end -#end -## 情况一:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - @Override - public ${subPrimaryColumn.javaType} create${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { -## 特殊:一对一时,需要保证只有一条,不能重复插入 -#if ( !$subTable.subJoinMany) - // 校验是否已经存在 - if (${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subClassNameVar}.get${SubJoinColumnName}()) != null) { - throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS); - } - // 插入 -#end - ${subClassNameVar}.clean(); // 清理掉创建、更新时间等相关属性值 - ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); - return ${subClassNameVar}.getId(); - } - - @Override - public void update${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { - // 校验存在 - validate${subSimpleClassName}Exists(${subClassNameVar}.getId()); - // 更新 - ${subClassNameVar}.clean(); // 解决更新情况下:updateTime 不更新 - ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar}); - } - - @Override - public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) { - // 删除 - ${subClassNameVars.get($index)}Mapper.deleteById(id); - } - -#if ($deleteBatchEnable) - @Override - public void delete${subSimpleClassName}ListByIds(List<${subPrimaryColumn.javaType}> ids) { - // 删除 - ${subClassNameVars.get($index)}Mapper.deleteByIds(ids); - } -#end - - @Override - public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) { - return ${subClassNameVars.get($index)}Mapper.selectById(id); - } - - private void validate${subSimpleClassName}Exists(${subPrimaryColumn.javaType} id) { - if (${subClassNameVar}Mapper.selectById(id) == null) { - throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS); - } - } - -## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作 -#else - #if ( $subTable.subJoinMany) - private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { - list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}).clean()); - ${subClassNameVars.get($index)}Mapper.insertBatch(list); - } - - private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { - list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}).clean()); - List<${subTable.className}DO> oldList = ${subClassNameVar}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField}); - List> diffList = diffList(oldList, list, (oldVal, newVal) -> { - boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId()); - if (same) { - newVal.setId(oldVal.getId()).clean(); // 解决更新情况下:updateTime 不更新 - } - return same; - }); - - // 第二步,批量添加、修改、删除 - if (CollUtil.isNotEmpty(diffList.get(0))) { - ${subClassNameVar}Mapper.insertBatch(diffList.get(0)); - } - if (CollUtil.isNotEmpty(diffList.get(1))) { - ${subClassNameVar}Mapper.updateBatch(diffList.get(1)); - } - if (CollUtil.isNotEmpty(diffList.get(2))) { - ${subClassNameVar}Mapper.deleteByIds(convertList(diffList.get(2), ${subTable.className}DO::getId)); - } - } - - #else - private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { - if (${subClassNameVar} == null) { - return; - } - ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}); - ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); - } - - private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { - if (${subClassNameVar} == null) { - return; - } - ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}).clean();// 解决更新情况下:updateTime 不更新 - ${subClassNameVars.get($index)}Mapper.insertOrUpdate(${subClassNameVar}); - } - - #end -#end - private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) { - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - private void delete${subSimpleClassName}By${SubJoinColumnName}s(List<${primaryColumn.javaType}> ${subJoinColumn.javaField}s) { - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}s(${subJoinColumn.javaField}s); - } -#end - -#end -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/test/serviceTest.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/java/test/serviceTest.vm deleted file mode 100644 index 974e8e8..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/java/test/serviceTest.vm +++ /dev/null @@ -1,167 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import ${jakartaPackage}.annotation.Resource; - -import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; - -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -import ${PageResultClassName}; - -import ${jakartaPackage}.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; -import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; -import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; -import static ${LocalDateTimeUtilsClassName}.*; -import static ${ObjectUtilsClassName}.*; -import static ${DateUtilsClassName}.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -## 字段模板 -#macro(getPageCondition $VO) - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - o.set$JavaField(null); - #end - #end - }); - ${classNameVar}Mapper.insert(db${simpleClassName}); - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - // 测试 ${column.javaField} 不匹配 - ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); - #end - #end - // 准备参数 - ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 - reqVO.set${JavaField}(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - #else - reqVO.set$JavaField(null); - #end - #end - #end -#end -/** - * {@link ${table.className}ServiceImpl} 的单元测试类 - * - * @author ${table.author} - */ -@Import(${table.className}ServiceImpl.class) -public class ${table.className}ServiceImplTest extends BaseDbUnitTest { - - @Resource - private ${table.className}ServiceImpl ${classNameVar}Service; - - @Resource - private ${table.className}Mapper ${classNameVar}Mapper; - - @Test - public void testCreate${simpleClassName}_success() { - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class).setId(null); - - // 调用 - ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(createReqVO); - // 断言 - assertNotNull(${classNameVar}Id); - // 校验记录的属性是否正确 - ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); - assertPojoEquals(createReqVO, ${classNameVar}, "id"); - } - - @Test - public void testUpdate${simpleClassName}_success() { - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); - ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class, o -> { - o.setId(db${simpleClassName}.getId()); // 设置更新的 ID - }); - - // 调用 - ${classNameVar}Service.update${simpleClassName}(updateReqVO); - // 校验是否更新正确 - ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, ${classNameVar}); - } - - @Test - public void testUpdate${simpleClassName}_notExists() { - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(updateReqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - - @Test - public void testDelete${simpleClassName}_success() { - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); - ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 - // 准备参数 - ${primaryColumn.javaType} id = db${simpleClassName}.getId(); - - // 调用 - ${classNameVar}Service.delete${simpleClassName}(id); - // 校验数据不存在了 - assertNull(${classNameVar}Mapper.selectById(id)); - } - - @Test - public void testDelete${simpleClassName}_notExists() { - // 准备参数 - ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); - - // 调用, 并断言异常 - assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGet${simpleClassName}Page() { - #getPageCondition("PageReqVO") - - // 调用 - PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); - } -#else - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGet${simpleClassName}List() { - #getPageCondition("ListReqVO") - - // 调用 - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(db${simpleClassName}, list.get(0)); - } -#end - -} \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/h2.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/h2.vm deleted file mode 100644 index 6c1ca57..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/h2.vm +++ /dev/null @@ -1,37 +0,0 @@ --- 将该建表 SQL 语句,添加到 rdms-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 -CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( -#foreach ($column in $columns) -#if (${column.javaType} == 'Long') - #set ($dataType='bigint') -#elseif (${column.javaType} == 'Integer') - #set ($dataType='int') -#elseif (${column.javaType} == 'Boolean') - #set ($dataType='bit') -#elseif (${column.javaType} == 'Date') - #set ($dataType='datetime') -#else - #set ($dataType='varchar') -#end - #if (${column.primaryKey})##处理主键 - "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, - #else - #if (${column.columnName} == 'create_time') - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - #elseif (${column.columnName} == 'update_time') - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') - "${column.columnName}" ${dataType} DEFAULT '', - #elseif (${column.columnName} == 'deleted') - "deleted" bit NOT NULL DEFAULT FALSE, - #elseif (${column.columnName} == 'tenant_id') - "tenant_id" bigint NOT NULL DEFAULT 0, - #else - "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, - #end - #end -#end - PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") -) COMMENT '${table.tableComment}'; - --- 将该删表 SQL 语句,添加到 rdms-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 -DELETE FROM "${table.tableName}"; \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/sql.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/sql.vm deleted file mode 100644 index 6e50837..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/sql/sql.vm +++ /dev/null @@ -1,181 +0,0 @@ -## 通用变量定义 -#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) -#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) -## -## 宏定义:生成按钮 SQL(通用部分) -#macro(insertButtonSql $parentIdVar) -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, ${parentIdVar}, - '', '', '', 0 - ); -#end -#end -## -## ======================= MySQL / OceanBase ======================= -#if ($dbType.name() == 'MYSQL' || $dbType.name() == 'OCEAN_BASE') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -## -## ======================= Oracle / 达梦 DM ======================= -#elseif ($dbType.name() == 'ORACLE' || $dbType.name() == 'DM') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:Oracle/达梦 使用序列获取上一个插入的 ID -DECLARE - v_parent_id NUMBER; -BEGIN - SELECT system_menu_seq.CURRVAL INTO v_parent_id FROM DUAL; - -- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, v_parent_id, - '', '', '', 0 - ); -#end -END; -/ -## -## ======================= PostgreSQL / 人大金仓 KingbaseES ======================= -#elseif ($dbType.name() == 'POSTGRE_SQL' || $dbType.name() == 'KINGBASE_ES') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:PostgreSQL/KingbaseES 使用 lastval() 获取上一个插入的序列值 -DO $$ -DECLARE - v_parent_id BIGINT; -BEGIN - v_parent_id := lastval(); - -- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, v_parent_id, - '', '', '', 0 - ); -#end -END $$; -## -## ======================= SQL Server ======================= -#elseif ($dbType.name() == 'SQL_SERVER' || $dbType.name() == 'SQL_SERVER2005') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:SQL Server 使用 SCOPE_IDENTITY() 获取上一个插入的自增 ID -DECLARE @parentId BIGINT; -SET @parentId = SCOPE_IDENTITY(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -## -## ======================= 不支持的数据库类型 ======================= -#else --- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --- 注意:当前数据库类型 ${dbType.name()} 暂不支持自动生成菜单 SQL --- 请参考以下 MySQL 语法,手动修改为您的数据库对应的语法 --- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- TODO: 请根据您的数据库类型,修改获取上一个插入 ID 的方式 --- MySQL: SELECT @parentId := LAST_INSERT_ID(); --- Oracle: SELECT system_menu_seq.CURRVAL INTO v_parent_id FROM DUAL; --- PostgreSQL: SELECT lastval() INTO v_parent_id; --- SQL Server: SET @parentId = SCOPE_IDENTITY(); -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -#end diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/api/api.js.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/api/api.js.vm deleted file mode 100644 index 0d9b66f..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/api/api.js.vm +++ /dev/null @@ -1,160 +0,0 @@ -import request from '@/utils/request' -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -// 创建${table.classComment} -export function create${simpleClassName}(data) { - return request({ - url: '${baseURL}/create', - method: 'post', - data: data - }) -} - -// 更新${table.classComment} -export function update${simpleClassName}(data) { - return request({ - url: '${baseURL}/update', - method: 'put', - data: data - }) -} - -// 删除${table.classComment} -export function delete${simpleClassName}(id) { - return request({ - url: '${baseURL}/delete?id=' + id, - method: 'delete' - }) -} - -#if ( $table.templateType != 2 && $deleteBatchEnable) -/** 批量删除${table.classComment} */ -export function delete${simpleClassName}List(ids) { - return request({ - url: `${baseURL}/delete-list?ids=${ids.join(',')}`, - method: 'delete' - }) -} -#end - -// 获得${table.classComment} -export function get${simpleClassName}(id) { - return request({ - url: '${baseURL}/get?id=' + id, - method: 'get' - }) -} - -#if ( $table.templateType != 2 ) -// 获得${table.classComment}分页 -export function get${simpleClassName}Page(params) { - return request({ - url: '${baseURL}/page', - method: 'get', - params - }) -} -#else -// 获得${table.classComment}列表 -export function get${simpleClassName}List(params) { - return request({ - url: '${baseURL}/list', - method: 'get', - params - }) -} -#end -// 导出${table.classComment} Excel -export function export${simpleClassName}Excel(params) { - return request({ - url: '${baseURL}/export-excel', - method: 'get', - params, - responseType: 'blob' - }) -} -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) - #set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== - ## 情况一:MASTER_ERP 时,需要分查询页子表 - #if ($table.templateType == 11) - // 获得${subTable.classComment}分页 - export function get${subSimpleClassName}Page(params) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/page', - method: 'get', - params - }) - } - ## 情况二:非 MASTER_ERP 时,需要列表查询子表 - #else - #if ($subTable.subJoinMany) - // 获得${subTable.classComment}列表 - export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, - method: 'get' - }) - } - #else - // 获得${subTable.classComment} - export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, - method: 'get' - }) - } - #end - #end - ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 - #if ($table.templateType == 11) - // 新增${subTable.classComment} - export function create${subSimpleClassName}(data) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/create', - method: 'post', - data - }) - } - // 修改${subTable.classComment} - export function update${subSimpleClassName}(data) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/update', - method: 'post', - data - }) - } - // 删除${subTable.classComment} - export function delete${subSimpleClassName}(id) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/delete?id=' + id, - method: 'delete' - }) - } - #if ($deleteBatchEnable) - /** 批量删除${subTable.classComment} */ - export function delete${subSimpleClassName}List(ids) { - return request({ - url: `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`, - method: 'delete' - }) - } - #end - // 获得${subTable.classComment} - export function get${subSimpleClassName}(id) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/get?id=' + id, - method: 'get' - }) - } - #end -#end \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm deleted file mode 100644 index 99aa91a..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm +++ /dev/null @@ -1,205 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm deleted file mode 100644 index ca266be..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm +++ /dev/null @@ -1,2 +0,0 @@ -## 主表的 normal 和 inner 使用相同的 form 表单 -#parse("codegen/vue/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm deleted file mode 100644 index 48a404a..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm +++ /dev/null @@ -1,347 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm deleted file mode 100644 index 3f290cc..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm +++ /dev/null @@ -1,210 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm deleted file mode 100644 index 90b8e41..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm +++ /dev/null @@ -1,4 +0,0 @@ -## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: -## 1)inner 使用 list 不分页,erp 使用 page 分页 -## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 -#parse("codegen/vue/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/form.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/form.vue.vm deleted file mode 100644 index 634d05d..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/form.vue.vm +++ /dev/null @@ -1,320 +0,0 @@ - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/index.vue.vm deleted file mode 100644 index bbc9131..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue/views/index.vue.vm +++ /dev/null @@ -1,386 +0,0 @@ - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/api/api.ts.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/api/api.ts.vm deleted file mode 100644 index c9f7361..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/api/api.ts.vm +++ /dev/null @@ -1,166 +0,0 @@ -import request from '@/config/axios' -import type { Dayjs } from 'dayjs'; -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subColumns = $subColumnsList.get($index))##当前字段数组 -/** ${subTable.classComment}信息 */ -export interface ${subSimpleClassName} { - #foreach ($column in $subColumns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end -} - -#end -/** ${table.classComment}信息 */ -export interface ${simpleClassName} { - #foreach ($column in $columns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - #if ( $table.templateType == 2 ) - children?: ${simpleClassName}[]; - #end - ## 特殊:主子表专属逻辑 - #if ( $table.templateType == 10 || $table.templateType == 12 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #if ( $subTable.subJoinMany ) - ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[] - #else - ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName} - #end - #end - #end -} - -// ${table.classComment} API -export const ${simpleClassName}Api = { -#if ( $table.templateType != 2 ) - // 查询${table.classComment}分页 - get${simpleClassName}Page: async (params: any) => { - return await request.get({ url: `${baseURL}/page`, params }) - }, -#else - // 查询${table.classComment}列表 - get${simpleClassName}List: async (params) => { - return await request.get({ url: `${baseURL}/list`, params }) - }, -#end - - // 查询${table.classComment}详情 - get${simpleClassName}: async (id: number) => { - return await request.get({ url: `${baseURL}/get?id=` + id }) - }, - - // 新增${table.classComment} - create${simpleClassName}: async (data: ${simpleClassName}) => { - return await request.post({ url: `${baseURL}/create`, data }) - }, - - // 修改${table.classComment} - update${simpleClassName}: async (data: ${simpleClassName}) => { - return await request.put({ url: `${baseURL}/update`, data }) - }, - - // 删除${table.classComment} - delete${simpleClassName}: async (id: number) => { - return await request.delete({ url: `${baseURL}/delete?id=` + id }) - }, - -#if ( $table.templateType != 2 && $deleteBatchEnable) - /** 批量删除${table.classComment} */ - delete${simpleClassName}List: async (ids: number[]) => { - return await request.delete({ url: `${baseURL}/delete-list?ids=${ids.join(',')}` }) - }, -#end - - // 导出${table.classComment} Excel - export${simpleClassName}: async (params) => { - return await request.download({ url: `${baseURL}/export-excel`, params }) - }, -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) -#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) -#set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - - // 获得${subTable.classComment}分页 - get${subSimpleClassName}Page: async (params) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/page`, params }) - }, -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - - // 获得${subTable.classComment}列表 - get${subSimpleClassName}ListBy${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) - }, - #else - - // 获得${subTable.classComment} - get${subSimpleClassName}By${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) - }, - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - // 新增${subTable.classComment} - create${subSimpleClassName}: async (data: ${subSimpleClassName}) => { - return await request.post({ url: `${baseURL}/${subSimpleClassName_strikeCase}/create`, data }) - }, - - // 修改${subTable.classComment} - update${subSimpleClassName}: async (data: ${subSimpleClassName}) => { - return await request.put({ url: `${baseURL}/${subSimpleClassName_strikeCase}/update`, data }) - }, - - // 删除${subTable.classComment} - delete${subSimpleClassName}: async (id: number) => { - return await request.delete({ url: `${baseURL}/${subSimpleClassName_strikeCase}/delete?id=` + id }) - }, - - #if ($deleteBatchEnable) - /** 批量删除${subTable.classComment} */ - delete${subSimpleClassName}List: async (ids: number[]) => { - return await request.delete({ url: `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}` }) - }, - #end - - // 获得${subTable.classComment} - get${subSimpleClassName}: async (id: number) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get?id=` + id }) - }, -#end -#end -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm deleted file mode 100644 index 8277e9b..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm +++ /dev/null @@ -1,204 +0,0 @@ -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm deleted file mode 100644 index d8542c3..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm +++ /dev/null @@ -1,2 +0,0 @@ -## 主表的 normal 和 inner 使用相同的 form 表单 -#parse("codegen/vue3/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm deleted file mode 100644 index 2212d4a..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm +++ /dev/null @@ -1,360 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm deleted file mode 100644 index 29df64d..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm +++ /dev/null @@ -1,231 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm deleted file mode 100644 index 3fe6488..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm +++ /dev/null @@ -1,4 +0,0 @@ -## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: -## 1)inner 使用 list 不分页,erp 使用 page 分页 -## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 -#parse("codegen/vue3/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/form.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/form.vue.vm deleted file mode 100644 index 466ea45..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/form.vue.vm +++ /dev/null @@ -1,300 +0,0 @@ - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/index.vue.vm deleted file mode 100644 index 857972a..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3/views/index.vue.vm +++ /dev/null @@ -1,424 +0,0 @@ - - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm deleted file mode 100644 index 4008706..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm +++ /dev/null @@ -1,296 +0,0 @@ - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm deleted file mode 100644 index b3302e5..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm +++ /dev/null @@ -1,151 +0,0 @@ - - - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm deleted file mode 100644 index f163144..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm +++ /dev/null @@ -1,254 +0,0 @@ - - - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm deleted file mode 100644 index 2d7daab..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm +++ /dev/null @@ -1,211 +0,0 @@ - - - - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/api/api.ts.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/api/api.ts.vm deleted file mode 100644 index b7f2651..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/api/api.ts.vm +++ /dev/null @@ -1,32 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -// 查询${table.classComment}列表 -export function get${simpleClassName}Page(params) { - return defHttp.get({ url: '${baseURL}/page', params }) -} - -// 查询${table.classComment}详情 -export function get${simpleClassName}(id: number) { - return defHttp.get({ url: `${baseURL}/get?id=${id}` }) -} - -// 新增${table.classComment} -export function create${simpleClassName}(data) { - return defHttp.post({ url: '${baseURL}/create', data }) -} - -// 修改${table.classComment} -export function update${simpleClassName}(data) { - return defHttp.put({ url: '${baseURL}/update', data }) -} - -// 删除${table.classComment} -export function delete${simpleClassName}(id: number) { - return defHttp.delete({ url: `${baseURL}/delete?id=${id}` }) -} - -// 导出${table.classComment} Excel -export function export${simpleClassName}(params) { - return defHttp.download({ url: '${baseURL}/export-excel', params }, '${table.classComment}.xls') -} diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/data.ts.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/data.ts.vm deleted file mode 100644 index 56f4e82..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/data.ts.vm +++ /dev/null @@ -1,260 +0,0 @@ -import type {BasicColumn, FormSchema} from '@/components/Table' -import {useRender} from '@/components/Table' -import {DICT_TYPE, getDictOptions} from '@/utils/dict' - -export const columns: BasicColumn[] = [ -#foreach($column in $columns) -#if ($column.listOperationResult) - #set ($dictType=$column.dictType) - #set ($javaField = $column.javaField) - #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment=$column.columnComment) -#if ($column.javaType == "LocalDateTime")## 时间类型 - { - title: '${comment}', - dataIndex: '${javaField}', - width: 180, - customRender: ({ text }) => { - return useRender.renderDate(text) - }, - }, -#elseif("" != $column.dictType)## 数据字典 - { - title: '${comment}', - dataIndex: '${javaField}', - width: 180, - customRender: ({ text }) => { - return useRender.renderDict(text, DICT_TYPE.$dictType.toUpperCase()) - }, - }, -#else - { - title: '${comment}', - dataIndex: '${javaField}', - width: 160, - }, -#end -#end -#end -] - -export const searchFormSchema: FormSchema[] = [ -#foreach($column in $columns) -#if ($column.listOperation) - #set ($dictType=$column.dictType) - #set ($javaType = $column.javaType) - #set ($javaField = $column.javaField) - #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment=$column.columnComment) - #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") - #elseif ($javaType == "String") - #set ($dictMethod = "string") - #elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") - #end - { - label: '${comment}', - field: '${javaField}', - #if ($column.htmlType == "input") - component: 'Input', - #elseif ($column.htmlType == "select") - component: 'Select', - componentProps: { - #if ("" != $dictType)## 设置了 dictType 数据字典的情况 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else## 未设置 dictType 数据字典的情况 - options: [], - #end - }, - #elseif ($column.htmlType == "radio") - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 设置了 dictType 数据字典的情况 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else## 未设置 dictType 数据字典的情况 - options: [], - #end - }, - #elseif($column.htmlType == "datetime") - component: 'RangePicker', - #end - colProps: { span: 8 }, - }, -#end -#end -] - -export const createFormSchema: FormSchema[] = [ - { - label: '编号', - field: 'id', - show: false, - component: 'Input', - }, -#foreach($column in $columns) -#if ($column.createOperation) - #set ($dictType = $column.dictType) - #set ($javaType = $column.javaType) - #set ($javaField = $column.javaField) - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment = $column.columnComment) - #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") - #elseif ($javaType == "String") - #set ($dictMethod = "string") - #elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") - #end -#if (!$column.primaryKey)## 忽略主键,不用在表单里 - { - label: '${comment}', - field: '${javaField}', - #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 - required: true, - #end - #if ($column.htmlType == "input") - component: 'Input', - #elseif($column.htmlType == "imageUpload")## 图片上传 - component: 'FileUpload', - componentProps: { - fileType: 'image', - maxCount: 1, - }, - #elseif($column.htmlType == "fileUpload")## 文件上传 - component: 'FileUpload', - componentProps: { - fileType: 'file', - maxCount: 1, - }, - #elseif($column.htmlType == "editor")## 文本编辑器 - component: 'Editor', - #elseif($column.htmlType == "select")## 下拉框 - component: 'Select', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "checkbox")## 多选框 - component: 'Checkbox', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "radio")## 单选框 - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "datetime")## 时间框 - component: 'DatePicker', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'x', - }, - #elseif($column.htmlType == "textarea")## 文本域 - component: 'InputTextArea', - #end - }, -#end -#end -#end -] - -export const updateFormSchema: FormSchema[] = [ - { - label: '编号', - field: 'id', - show: false, - component: 'Input', - }, -#foreach($column in $columns) -#if ($column.updateOperation) -#set ($dictType = $column.dictType) -#set ($javaType = $column.javaType) -#set ($javaField = $column.javaField) -#set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#set ($comment = $column.columnComment) -#if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") -#elseif ($javaType == "String") - #set ($dictMethod = "string") -#elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") -#end - #if (!$column.primaryKey)## 忽略主键,不用在表单里 - { - label: '${comment}', - field: '${javaField}', - #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 - required: true, - #end - #if ($column.htmlType == "input") - component: 'Input', - #elseif($column.htmlType == "imageUpload")## 图片上传 - component: 'FileUpload', - componentProps: { - fileType: 'image', - maxCount: 1, - }, - #elseif($column.htmlType == "fileUpload")## 文件上传 - component: 'FileUpload', - componentProps: { - fileType: 'file', - maxCount: 1, - }, - #elseif($column.htmlType == "editor")## 文本编辑器 - component: 'Editor', - #elseif($column.htmlType == "select")## 下拉框 - component: 'Select', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "checkbox")## 多选框 - component: 'Checkbox', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "radio")## 单选框 - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "datetime")## 时间框 - component: 'DatePicker', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'x', - }, - #elseif($column.htmlType == "textarea")## 文本域 - component: 'InputTextArea', - #end - }, - #end -#end -#end -] \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/form.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/form.vue.vm deleted file mode 100644 index 1804365..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/form.vue.vm +++ /dev/null @@ -1,58 +0,0 @@ - - \ No newline at end of file diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/index.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/index.vue.vm deleted file mode 100644 index 9e59b12..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben/views/index.vue.vm +++ /dev/null @@ -1,92 +0,0 @@ - - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm deleted file mode 100644 index c3691a8..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm +++ /dev/null @@ -1,167 +0,0 @@ -import type { PageParam, PageResult } from '@vben/request'; -import type { Dayjs } from 'dayjs'; - -import { requestClient } from '#/api/request'; -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -export namespace ${simpleClassName}Api { - ## 特殊:主子表专属逻辑 - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subColumns = $subColumnsList.get($index))##当前字段数组 - /** ${subTable.classComment}信息 */ - export interface ${subSimpleClassName} { - #foreach ($column in $subColumns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - } - - #end - /** ${table.classComment}信息 */ - export interface ${simpleClassName} { - #foreach ($column in $columns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - #if ( $table.templateType == 2 ) - children?: ${simpleClassName}[]; - #end - ## 特殊:主子表专属逻辑 - #if ( $table.templateType == 10 || $table.templateType == 12 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #if ( $subTable.subJoinMany ) - ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[] - #else - ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName} - #end - #end - #end - } -} - -#if ( $table.templateType != 2 ) -/** 查询${table.classComment}分页 */ -export function get${simpleClassName}Page(params: PageParam) { - return requestClient.get>('${baseURL}/page', { params }); -} -#else -/** 查询${table.classComment}列表 */ -export function get${simpleClassName}List(params: any) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}[]>('${baseURL}/list', { params }); -} -#end - -/** 查询${table.classComment}详情 */ -export function get${simpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/get?id=${id}`); -} - -/** 新增${table.classComment} */ -export function create${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { - return requestClient.post('${baseURL}/create', data); -} - -/** 修改${table.classComment} */ -export function update${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { - return requestClient.put('${baseURL}/update', data); -} - -/** 删除${table.classComment} */ -export function delete${simpleClassName}(id: number) { - return requestClient.delete(`${baseURL}/delete?id=${id}`); -} - -#if ( $table.templateType != 2 && $deleteBatchEnable) -/** 批量删除${table.classComment} */ -export function delete${simpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/delete-list?ids=${ids.join(',')}`) -} -#end - -/** 导出${table.classComment} */ -export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', { params }); -} - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) - #set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) -/** 获得${subTable.classComment}分页 */ -export function get${subSimpleClassName}Page(params: PageParam) { - return requestClient.get>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params }); -} - ## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else -#if ( $subTable.subJoinMany ) -/** 获得${subTable.classComment}列表 */ -export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); -} -#else -/** 获得${subTable.classComment} */ -export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); -} -#end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) -/** 新增${subTable.classComment} */ -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { - return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data); -} - -/** 修改${subTable.classComment} */ -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { - return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data); -} - -/** 删除${subTable.classComment} */ -export function delete${subSimpleClassName}(id: number) { - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`); -} - -#if ($deleteBatchEnable) -/** 批量删除${subTable.classComment} */ -export function delete${subSimpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`) -} -#end - -/** 获得${subTable.classComment} */ -export function get${subSimpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); -} -#end -#end - diff --git a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm b/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm deleted file mode 100644 index 581eae0..0000000 --- a/rdms-system/rdms-system-boot/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm +++ /dev/null @@ -1,325 +0,0 @@ - - -