From b4f11b16d093133244cdfd946d51e8f577373039 Mon Sep 17 00:00:00 2001 From: ray <1490493387@qq.com> Date: Sat, 7 Sep 2024 15:24:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=94=9F=E6=88=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=87=8D=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 - sql/mysql5/youlai_boot.sql | 4 +- sql/mysql8/youlai_boot.sql | 4 +- .../com/youlai/boot/common/enums/EnvEnum.java | 26 + .../com/youlai/boot/config/CaptchaConfig.java | 2 +- ...Properties.java => CodegenProperties.java} | 6 +- .../auth/controller/AuthController.java | 4 +- .../auth/service/AuthService.java | 2 +- .../auth/service/impl/AuthServiceImpl.java | 4 +- .../controller/CodegenController.java} | 61 ++- .../codegen/converter/CodegenConverter.java} | 10 +- .../codegen}/mapper/DatabaseMapper.java | 10 +- .../codegen}/mapper/GenConfigMapper.java | 4 +- .../codegen}/mapper/GenFieldConfigMapper.java | 4 +- .../codegen}/model/bo/ColumnMetaData.java | 2 +- .../codegen}/model/bo/TableMetaData.java | 2 +- .../codegen}/model/entity/GenConfig.java | 2 +- .../codegen}/model/entity/GenFieldConfig.java | 2 +- .../codegen}/model/form/GenConfigForm.java | 2 +- .../codegen}/model/query/TablePageQuery.java | 2 +- .../codegen/model/vo/CodegenPreviewVO.java} | 4 +- .../codegen}/model/vo/TablePageVO.java | 2 +- .../codegen/service/CodegenService.java | 41 ++ .../codegen/service/GenConfigService.java | 39 ++ .../service/GenFieldConfigService.java | 4 +- .../service/impl/CodegenServiceImpl.java | 316 ++++++++++++ .../service/impl/GenConfigServiceImpl.java | 221 ++++++++ .../impl/GenFieldConfigServiceImpl.java | 8 +- .../file/controller/FileController.java | 4 +- .../file/service/FileService.java | 2 +- .../file/service/impl/AliyunFileService.java | 4 +- .../file/service/impl/MinioFileService.java | 4 +- .../mail/controller/MailController.java | 2 +- .../mail/service/MailService.java | 2 +- .../mail/service/impl/MailServiceImpl.java | 4 +- .../module/sms/controller/SmsController.java | 13 + .../sms/service/SmsService.java | 2 +- .../sms/service/impl/AliyunSmsService.java | 4 +- .../controller/WebsocketController.java | 2 +- .../websocket/service/WebsocketService.java | 2 +- .../service/impl/WebsocketServiceImpl.java | 4 +- .../generator/service/GenConfigService.java | 16 - .../generator/service/GeneratorService.java | 65 --- .../service/impl/GenConfigServiceImpl.java | 20 - .../service/impl/GeneratorServiceImpl.java | 475 ------------------ .../sms/controller/SmsController.java | 22 - .../boot/system/model/query/MenuQuery.java | 2 +- .../boot/system/service/MenuService.java | 6 +- .../system/service/impl/MenuServiceImpl.java | 7 +- .../system/service/impl/UserServiceImpl.java | 4 +- src/main/resources/application-dev.yml | 6 +- src/main/resources/application-prod.yml | 6 +- src/main/resources/application.yml | 26 +- src/main/resources/mapper/DatabaseMapper.xml | 8 +- src/main/resources/mapper/GenConfigMapper.xml | 2 +- .../resources/mapper/GenFieldConfigMapper.xml | 2 +- .../{generator => codegen}/api.ts.vm | 0 .../{generator => codegen}/controller.java.vm | 0 .../{generator => codegen}/converter.java.vm | 0 .../{generator => codegen}/entity.java.vm | 0 .../{generator => codegen}/form.java.vm | 0 .../{generator => codegen}/index.vue.vm | 0 .../{generator => codegen}/mapper.java.vm | 0 .../{generator => codegen}/mapper.xml.vm | 0 .../{generator => codegen}/query.java.vm | 0 .../{generator => codegen}/service.java.vm | 0 .../serviceImpl.java.vm | 0 .../{generator => codegen}/vo.java.vm | 0 .../generator/FastAutoGeneratorTest.java | 12 +- 69 files changed, 790 insertions(+), 731 deletions(-) create mode 100644 src/main/java/com/youlai/boot/common/enums/EnvEnum.java rename src/main/java/com/youlai/boot/config/property/{GeneratorProperties.java => CodegenProperties.java} (91%) rename src/main/java/com/youlai/boot/{platform => module}/auth/controller/AuthController.java (94%) rename src/main/java/com/youlai/boot/{platform => module}/auth/service/AuthService.java (92%) rename src/main/java/com/youlai/boot/{platform => module}/auth/service/impl/AuthServiceImpl.java (98%) rename src/main/java/com/youlai/boot/{platform/generator/controller/GeneratorController.java => module/codegen/controller/CodegenController.java} (59%) rename src/main/java/com/youlai/boot/{platform/generator/converter/GenConfigConverter.java => module/codegen/converter/CodegenConverter.java} (79%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/mapper/DatabaseMapper.java (59%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/mapper/GenConfigMapper.java (69%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/mapper/GenFieldConfigMapper.java (69%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/bo/ColumnMetaData.java (94%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/bo/TableMetaData.java (90%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/entity/GenConfig.java (92%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/entity/GenFieldConfig.java (96%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/form/GenConfigForm.java (97%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/query/TablePageQuery.java (91%) rename src/main/java/com/youlai/boot/{platform/generator/model/vo/GeneratorPreviewVO.java => module/codegen/model/vo/CodegenPreviewVO.java} (81%) rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/model/vo/TablePageVO.java (93%) create mode 100644 src/main/java/com/youlai/boot/module/codegen/service/CodegenService.java create mode 100644 src/main/java/com/youlai/boot/module/codegen/service/GenConfigService.java rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/service/GenFieldConfigService.java (63%) create mode 100644 src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java create mode 100644 src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java rename src/main/java/com/youlai/boot/{platform/generator => module/codegen}/service/impl/GenFieldConfigServiceImpl.java (60%) rename src/main/java/com/youlai/boot/{platform => module}/file/controller/FileController.java (93%) rename src/main/java/com/youlai/boot/{platform => module}/file/service/FileService.java (91%) rename src/main/java/com/youlai/boot/{platform => module}/file/service/impl/AliyunFileService.java (96%) rename src/main/java/com/youlai/boot/{platform => module}/file/service/impl/MinioFileService.java (98%) rename src/main/java/com/youlai/boot/{platform => module}/mail/controller/MailController.java (76%) rename src/main/java/com/youlai/boot/{platform => module}/mail/service/MailService.java (92%) rename src/main/java/com/youlai/boot/{platform => module}/mail/service/impl/MailServiceImpl.java (95%) create mode 100644 src/main/java/com/youlai/boot/module/sms/controller/SmsController.java rename src/main/java/com/youlai/boot/{platform => module}/sms/service/SmsService.java (91%) rename src/main/java/com/youlai/boot/{platform => module}/sms/service/impl/AliyunSmsService.java (96%) rename src/main/java/com/youlai/boot/{platform => module}/websocket/controller/WebsocketController.java (97%) rename src/main/java/com/youlai/boot/{platform => module}/websocket/service/WebsocketService.java (68%) rename src/main/java/com/youlai/boot/{platform => module}/websocket/service/impl/WebsocketServiceImpl.java (92%) delete mode 100644 src/main/java/com/youlai/boot/platform/generator/service/GenConfigService.java delete mode 100644 src/main/java/com/youlai/boot/platform/generator/service/GeneratorService.java delete mode 100644 src/main/java/com/youlai/boot/platform/generator/service/impl/GenConfigServiceImpl.java delete mode 100644 src/main/java/com/youlai/boot/platform/generator/service/impl/GeneratorServiceImpl.java delete mode 100644 src/main/java/com/youlai/boot/platform/sms/controller/SmsController.java rename src/main/resources/templates/{generator => codegen}/api.ts.vm (100%) rename src/main/resources/templates/{generator => codegen}/controller.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/converter.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/entity.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/form.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/index.vue.vm (100%) rename src/main/resources/templates/{generator => codegen}/mapper.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/mapper.xml.vm (100%) rename src/main/resources/templates/{generator => codegen}/query.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/service.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/serviceImpl.java.vm (100%) rename src/main/resources/templates/{generator => codegen}/vo.java.vm (100%) diff --git a/pom.xml b/pom.xml index 5aa9a62f..73720874 100644 --- a/pom.xml +++ b/pom.xml @@ -109,11 +109,6 @@ spring-boot-starter-aop - - org.apache.commons - commons-pool2 - - mysql mysql-connector-java diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index bbd5dc8a..4cc157e7 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -215,8 +215,8 @@ INSERT INTO `sys_menu` VALUES (110, 0, '0', '路由参数', 2, NULL, '/route-par INSERT INTO `sys_menu` VALUES (111, 110, '0,110', '参数(type=1)', 1, NULL, 'route-param-type1', 'demo/route-param', NULL, 0, 1, 1, 1, 'el-icon-Star', NULL, '2024-05-26 21:59:24', '2024-05-26 21:59:37', '{\"type\": \"1\"}'); INSERT INTO `sys_menu` VALUES (112, 110, '0,110', '参数(type=2)', 1, NULL, 'route-param-type2', 'demo/route-param', NULL, 0, 1, 1, 2, 'el-icon-StarFilled', NULL, '2024-05-26 21:46:55', '2024-05-26 21:59:45', '{\"type\": \"2\"}'); INSERT INTO `sys_menu` VALUES (117, 1, '0,1', '系统日志', 1, 'Log', 'log', 'system/log/index', NULL, 0, 1, 1, 6, 'document', NULL, '2024-06-28 07:43:16', '2024-06-28 07:43:16', NULL); -INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/generator', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-07-13 08:41:07', '2024-07-13 08:41:07', NULL); -INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成(Alpha)', 1, 'Generator', 'generator', 'generator/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-07-13 08:44:51', '2024-07-13 08:44:51', NULL); +INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/codegen', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-07-13 08:41:07', '2024-07-13 08:41:07', NULL); +INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成(Alpha)', 1, 'Generator', 'codegen', 'codegen/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-07-13 08:44:51', '2024-07-13 08:44:51', NULL); -- ---------------------------- -- Table structure for sys_message diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index f11a8f15..a0cb8651 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -216,8 +216,8 @@ INSERT INTO `sys_menu` VALUES (110, 0, '0', '路由参数', 2, NULL, '/route-par INSERT INTO `sys_menu` VALUES (111, 110, '0,110', '参数(type=1)', 1, NULL, 'route-param-type1', 'demo/route-param', NULL, 0, 1, 1, 1, 'el-icon-Star', NULL, '2024-05-26 21:59:24', '2024-05-26 21:59:37', '{\"type\": \"1\"}'); INSERT INTO `sys_menu` VALUES (112, 110, '0,110', '参数(type=2)', 1, NULL, 'route-param-type2', 'demo/route-param', NULL, 0, 1, 1, 2, 'el-icon-StarFilled', NULL, '2024-05-26 21:46:55', '2024-05-26 21:59:45', '{\"type\": \"2\"}'); INSERT INTO `sys_menu` VALUES (117, 1, '0,1', '系统日志', 1, 'Log', 'log', 'system/log/index', NULL, 0, 1, 1, 6, 'document', NULL, '2024-06-28 07:43:16', '2024-06-28 07:43:16', NULL); -INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/generator', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-07-13 08:41:07', '2024-07-13 08:41:07', NULL); -INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成(Alpha)', 1, 'Generator', 'generator', 'generator/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-07-13 08:44:51', '2024-07-13 08:44:51', NULL); +INSERT INTO `sys_menu` VALUES (118, 0, '0', '系统工具', 2, NULL, '/codegen', 'Layout', NULL, 0, 1, 1, 2, 'menu', NULL, '2024-07-13 08:41:07', '2024-07-13 08:41:07', NULL); +INSERT INTO `sys_menu` VALUES (119, 118, '0,118', '代码生成', 1, 'Codegen', 'codegen', 'codegen/index', NULL, 0, 1, 1, 1, 'code', NULL, '2024-07-13 08:44:51', '2024-07-13 08:44:51', NULL); -- ---------------------------- -- Table structure for sys_message diff --git a/src/main/java/com/youlai/boot/common/enums/EnvEnum.java b/src/main/java/com/youlai/boot/common/enums/EnvEnum.java new file mode 100644 index 00000000..9f502fab --- /dev/null +++ b/src/main/java/com/youlai/boot/common/enums/EnvEnum.java @@ -0,0 +1,26 @@ +package com.youlai.boot.common.enums; + +import com.youlai.boot.common.base.IBaseEnum; +import lombok.Getter; + +/** + * 环境枚举 + * + * @author Ray + * @since 4.0.0 + */ +@Getter +public enum EnvEnum implements IBaseEnum { + + DEV("dev", "开发环境"), + PROD("prod", "生产环境"); + + private final String value; + + private final String label; + + EnvEnum(String value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/youlai/boot/config/CaptchaConfig.java b/src/main/java/com/youlai/boot/config/CaptchaConfig.java index 36f709da..75d42059 100644 --- a/src/main/java/com/youlai/boot/config/CaptchaConfig.java +++ b/src/main/java/com/youlai/boot/config/CaptchaConfig.java @@ -36,7 +36,7 @@ public class CaptchaConfig { } else if ("random".equalsIgnoreCase(codeType)) { return new RandomGenerator(codeLength); } else { - throw new IllegalArgumentException("Invalid captcha generator type: " + codeType); + throw new IllegalArgumentException("Invalid captcha codegen type: " + codeType); } } diff --git a/src/main/java/com/youlai/boot/config/property/GeneratorProperties.java b/src/main/java/com/youlai/boot/config/property/CodegenProperties.java similarity index 91% rename from src/main/java/com/youlai/boot/config/property/GeneratorProperties.java rename to src/main/java/com/youlai/boot/config/property/CodegenProperties.java index 17fee904..80cc2275 100644 --- a/src/main/java/com/youlai/boot/config/property/GeneratorProperties.java +++ b/src/main/java/com/youlai/boot/config/property/CodegenProperties.java @@ -16,9 +16,9 @@ import java.util.Map; * @since 2.11.0 */ @Component -@ConfigurationProperties(prefix = "generator") +@ConfigurationProperties(prefix = "codegen") @Data -public class GeneratorProperties { +public class CodegenProperties { /** @@ -58,7 +58,7 @@ public class GeneratorProperties { public static class TemplateConfig { /** - * 模板路径 (e.g. /templates/generator/controller.java.vm) + * 模板路径 (e.g. /templates/codegen/controller.java.vm) */ private String templatePath; diff --git a/src/main/java/com/youlai/boot/platform/auth/controller/AuthController.java b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java similarity index 94% rename from src/main/java/com/youlai/boot/platform/auth/controller/AuthController.java rename to src/main/java/com/youlai/boot/module/auth/controller/AuthController.java index a8843830..0e20a433 100644 --- a/src/main/java/com/youlai/boot/platform/auth/controller/AuthController.java +++ b/src/main/java/com/youlai/boot/module/auth/controller/AuthController.java @@ -1,8 +1,8 @@ -package com.youlai.boot.platform.auth.controller; +package com.youlai.boot.module.auth.controller; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; -import com.youlai.boot.platform.auth.service.AuthService; +import com.youlai.boot.module.auth.service.AuthService; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; import com.youlai.boot.common.annotation.Log; diff --git a/src/main/java/com/youlai/boot/platform/auth/service/AuthService.java b/src/main/java/com/youlai/boot/module/auth/service/AuthService.java similarity index 92% rename from src/main/java/com/youlai/boot/platform/auth/service/AuthService.java rename to src/main/java/com/youlai/boot/module/auth/service/AuthService.java index 87f713b0..aa020e52 100644 --- a/src/main/java/com/youlai/boot/platform/auth/service/AuthService.java +++ b/src/main/java/com/youlai/boot/module/auth/service/AuthService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.auth.service; +package com.youlai.boot.module.auth.service; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; diff --git a/src/main/java/com/youlai/boot/platform/auth/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java similarity index 98% rename from src/main/java/com/youlai/boot/platform/auth/service/impl/AuthServiceImpl.java rename to src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java index ae403956..b4e734c2 100644 --- a/src/main/java/com/youlai/boot/platform/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/auth/service/impl/AuthServiceImpl.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.auth.service.impl; +package com.youlai.boot.module.auth.service.impl; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.CaptchaUtil; @@ -10,7 +10,7 @@ import cn.hutool.jwt.JWTPayload; import cn.hutool.jwt.JWTUtil; import com.youlai.boot.common.constant.SecurityConstants; import com.youlai.boot.common.enums.CaptchaTypeEnum; -import com.youlai.boot.platform.auth.service.AuthService; +import com.youlai.boot.module.auth.service.AuthService; import com.youlai.boot.system.model.dto.CaptchaResult; import com.youlai.boot.system.model.dto.LoginResult; import com.youlai.boot.config.property.CaptchaProperties; diff --git a/src/main/java/com/youlai/boot/platform/generator/controller/GeneratorController.java b/src/main/java/com/youlai/boot/module/codegen/controller/CodegenController.java similarity index 59% rename from src/main/java/com/youlai/boot/platform/generator/controller/GeneratorController.java rename to src/main/java/com/youlai/boot/module/codegen/controller/CodegenController.java index 29e06015..f247913a 100644 --- a/src/main/java/com/youlai/boot/platform/generator/controller/GeneratorController.java +++ b/src/main/java/com/youlai/boot/module/codegen/controller/CodegenController.java @@ -1,22 +1,24 @@ -package com.youlai.boot.platform.generator.controller; +package com.youlai.boot.module.codegen.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.common.result.PageResult; import com.youlai.boot.common.result.Result; -import com.youlai.boot.config.property.GeneratorProperties; +import com.youlai.boot.config.property.CodegenProperties; import com.youlai.boot.common.enums.LogModuleEnum; -import com.youlai.boot.platform.generator.service.GeneratorService; -import com.youlai.boot.platform.generator.model.form.GenConfigForm; -import com.youlai.boot.platform.generator.model.query.TablePageQuery; -import com.youlai.boot.platform.generator.model.vo.GeneratorPreviewVO; -import com.youlai.boot.platform.generator.model.vo.TablePageVO; +import com.youlai.boot.module.codegen.service.CodegenService; +import com.youlai.boot.module.codegen.model.form.GenConfigForm; +import com.youlai.boot.module.codegen.model.query.TablePageQuery; +import com.youlai.boot.module.codegen.model.vo.CodegenPreviewVO; +import com.youlai.boot.module.codegen.model.vo.TablePageVO; import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.module.codegen.service.GenConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import org.apache.commons.io.IOUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -32,12 +34,14 @@ import java.util.List; */ @Tag(name = "09.代码生成") @RestController -@RequestMapping("/api/v1/generator") +@RequestMapping("/api/v1/codegen") @RequiredArgsConstructor -public class GeneratorController { +@Slf4j +public class CodegenController { - private final GeneratorService generatorService; - private final GeneratorProperties generatorProperties; + private final CodegenService codegenService; + private final GenConfigService genConfigService; + private final CodegenProperties codegenProperties; @Operation(summary = "获取数据表分页列表") @GetMapping("/table/page") @@ -45,7 +49,7 @@ public class GeneratorController { public PageResult getTablePage( TablePageQuery queryParams ) { - Page result = generatorService.getTablePage(queryParams); + Page result = codegenService.getTablePage(queryParams); return PageResult.success(result); } @@ -54,7 +58,7 @@ public class GeneratorController { public Result getGenConfigFormData( @Parameter(description = "表名", example = "sys_user") @PathVariable String tableName ) { - GenConfigForm formData = generatorService.getGenConfigFormData(tableName); + GenConfigForm formData = genConfigService.getGenConfigFormData(tableName); return Result.success(formData); } @@ -62,7 +66,7 @@ public class GeneratorController { @PostMapping("/{tableName}/config") @Log(value = "生成代码", module = LogModuleEnum.OTHER) public Result saveGenConfig(@RequestBody GenConfigForm formData) { - generatorService.saveGenConfig(formData); + genConfigService.saveGenConfig(formData); return Result.success(); } @@ -71,32 +75,35 @@ public class GeneratorController { public Result deleteGenConfig( @Parameter(description = "表名", example = "sys_user") @PathVariable String tableName ) { - generatorService.deleteGenConfig(tableName); + genConfigService.deleteGenConfig(tableName); return Result.success(); } @Operation(summary = "获取预览生成代码") @GetMapping("/{tableName}/preview") @Log(value = "预览生成代码", module = LogModuleEnum.OTHER) - public Result> getTablePreviewData(@PathVariable String tableName) { - List list = generatorService.getTablePreviewData(tableName); + public Result> getTablePreviewData(@PathVariable String tableName) { + List list = codegenService.getCodegenPreviewData(tableName); return Result.success(list); } @Operation(summary = "下载代码") @GetMapping("/{tableName}/download") @Log(value = "下载代码", module = LogModuleEnum.OTHER) - public void downloadZip(HttpServletResponse response, @PathVariable String tableName) throws IOException { + public void downloadZip(HttpServletResponse response, @PathVariable String tableName) { String[] tableNames = tableName.split(","); - byte[] data = generatorService.downloadCode(tableNames); + byte[] data = codegenService.downloadCode(tableNames); + response.reset(); - response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(generatorProperties.getDownloadFileName(), StandardCharsets.UTF_8)); - response.addHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Pragma", "no-cache"); - response.setHeader("Cache-Control", "no-cache"); - response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(codegenProperties.getDownloadFileName(), StandardCharsets.UTF_8)); response.setContentType("application/octet-stream; charset=UTF-8"); - response.setDateHeader("Expires", 0); - IOUtils.write(data, response.getOutputStream()); + + try (ServletOutputStream outputStream = response.getOutputStream()) { + outputStream.write(data); + outputStream.flush(); + } catch (IOException e) { + log.error("Error while writing the zip file to response", e); + throw new RuntimeException("Failed to write the zip file to response", e); + } } } diff --git a/src/main/java/com/youlai/boot/platform/generator/converter/GenConfigConverter.java b/src/main/java/com/youlai/boot/module/codegen/converter/CodegenConverter.java similarity index 79% rename from src/main/java/com/youlai/boot/platform/generator/converter/GenConfigConverter.java rename to src/main/java/com/youlai/boot/module/codegen/converter/CodegenConverter.java index 7692cd09..083e343e 100644 --- a/src/main/java/com/youlai/boot/platform/generator/converter/GenConfigConverter.java +++ b/src/main/java/com/youlai/boot/module/codegen/converter/CodegenConverter.java @@ -1,8 +1,8 @@ -package com.youlai.boot.platform.generator.converter; +package com.youlai.boot.module.codegen.converter; -import com.youlai.boot.platform.generator.model.entity.GenConfig; -import com.youlai.boot.platform.generator.model.entity.GenFieldConfig; -import com.youlai.boot.platform.generator.model.form.GenConfigForm; +import com.youlai.boot.module.codegen.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.model.form.GenConfigForm; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -15,7 +15,7 @@ import java.util.List; * @since 2.10.0 */ @Mapper(componentModel = "spring") -public interface GenConfigConverter { +public interface CodegenConverter { @Mapping(source = "genConfig.tableName", target = "tableName") @Mapping(source = "genConfig.businessName", target = "businessName") diff --git a/src/main/java/com/youlai/boot/platform/generator/mapper/DatabaseMapper.java b/src/main/java/com/youlai/boot/module/codegen/mapper/DatabaseMapper.java similarity index 59% rename from src/main/java/com/youlai/boot/platform/generator/mapper/DatabaseMapper.java rename to src/main/java/com/youlai/boot/module/codegen/mapper/DatabaseMapper.java index 7d5d0fa4..cfa3c551 100644 --- a/src/main/java/com/youlai/boot/platform/generator/mapper/DatabaseMapper.java +++ b/src/main/java/com/youlai/boot/module/codegen/mapper/DatabaseMapper.java @@ -1,11 +1,11 @@ -package com.youlai.boot.platform.generator.mapper; +package com.youlai.boot.module.codegen.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.boot.platform.generator.model.bo.ColumnMetaData; -import com.youlai.boot.platform.generator.model.bo.TableMetaData; -import com.youlai.boot.platform.generator.model.query.TablePageQuery; -import com.youlai.boot.platform.generator.model.vo.TablePageVO; +import com.youlai.boot.module.codegen.model.bo.ColumnMetaData; +import com.youlai.boot.module.codegen.model.bo.TableMetaData; +import com.youlai.boot.module.codegen.model.query.TablePageQuery; +import com.youlai.boot.module.codegen.model.vo.TablePageVO; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/src/main/java/com/youlai/boot/platform/generator/mapper/GenConfigMapper.java b/src/main/java/com/youlai/boot/module/codegen/mapper/GenConfigMapper.java similarity index 69% rename from src/main/java/com/youlai/boot/platform/generator/mapper/GenConfigMapper.java rename to src/main/java/com/youlai/boot/module/codegen/mapper/GenConfigMapper.java index 9e973c2a..282b6fd9 100644 --- a/src/main/java/com/youlai/boot/platform/generator/mapper/GenConfigMapper.java +++ b/src/main/java/com/youlai/boot/module/codegen/mapper/GenConfigMapper.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.generator.mapper; +package com.youlai.boot.module.codegen.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.youlai.boot.platform.generator.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenConfig; import org.apache.ibatis.annotations.Mapper; /** diff --git a/src/main/java/com/youlai/boot/platform/generator/mapper/GenFieldConfigMapper.java b/src/main/java/com/youlai/boot/module/codegen/mapper/GenFieldConfigMapper.java similarity index 69% rename from src/main/java/com/youlai/boot/platform/generator/mapper/GenFieldConfigMapper.java rename to src/main/java/com/youlai/boot/module/codegen/mapper/GenFieldConfigMapper.java index 43607c50..0d663d0f 100644 --- a/src/main/java/com/youlai/boot/platform/generator/mapper/GenFieldConfigMapper.java +++ b/src/main/java/com/youlai/boot/module/codegen/mapper/GenFieldConfigMapper.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.generator.mapper; +package com.youlai.boot.module.codegen.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.youlai.boot.platform.generator.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; import org.apache.ibatis.annotations.Mapper; /** diff --git a/src/main/java/com/youlai/boot/platform/generator/model/bo/ColumnMetaData.java b/src/main/java/com/youlai/boot/module/codegen/model/bo/ColumnMetaData.java similarity index 94% rename from src/main/java/com/youlai/boot/platform/generator/model/bo/ColumnMetaData.java rename to src/main/java/com/youlai/boot/module/codegen/model/bo/ColumnMetaData.java index 18a57316..ed40149a 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/bo/ColumnMetaData.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/bo/ColumnMetaData.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.bo; +package com.youlai.boot.module.codegen.model.bo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/bo/TableMetaData.java b/src/main/java/com/youlai/boot/module/codegen/model/bo/TableMetaData.java similarity index 90% rename from src/main/java/com/youlai/boot/platform/generator/model/bo/TableMetaData.java rename to src/main/java/com/youlai/boot/module/codegen/model/bo/TableMetaData.java index 53eeaef9..028bbfb8 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/bo/TableMetaData.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/bo/TableMetaData.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.bo; +package com.youlai.boot.module.codegen.model.bo; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/entity/GenConfig.java b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenConfig.java similarity index 92% rename from src/main/java/com/youlai/boot/platform/generator/model/entity/GenConfig.java rename to src/main/java/com/youlai/boot/module/codegen/model/entity/GenConfig.java index 474ae2c8..c6144550 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/entity/GenConfig.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenConfig.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.entity; +package com.youlai.boot.module.codegen.model.entity; import com.baomidou.mybatisplus.annotation.*; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/entity/GenFieldConfig.java b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java similarity index 96% rename from src/main/java/com/youlai/boot/platform/generator/model/entity/GenFieldConfig.java rename to src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java index f00eae32..742067e2 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/entity/GenFieldConfig.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/entity/GenFieldConfig.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.entity; +package com.youlai.boot.module.codegen.model.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/form/GenConfigForm.java b/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java similarity index 97% rename from src/main/java/com/youlai/boot/platform/generator/model/form/GenConfigForm.java rename to src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java index df54e163..ddc8a473 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/form/GenConfigForm.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/form/GenConfigForm.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.form; +package com.youlai.boot.module.codegen.model.form; import com.youlai.boot.common.enums.FormTypeEnum; import com.youlai.boot.common.enums.QueryTypeEnum; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/query/TablePageQuery.java b/src/main/java/com/youlai/boot/module/codegen/model/query/TablePageQuery.java similarity index 91% rename from src/main/java/com/youlai/boot/platform/generator/model/query/TablePageQuery.java rename to src/main/java/com/youlai/boot/module/codegen/model/query/TablePageQuery.java index b141f544..4360ff2c 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/query/TablePageQuery.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/query/TablePageQuery.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.query; +package com.youlai.boot.module.codegen.model.query; import com.fasterxml.jackson.annotation.JsonIgnore; import com.youlai.boot.common.base.BasePageQuery; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/vo/GeneratorPreviewVO.java b/src/main/java/com/youlai/boot/module/codegen/model/vo/CodegenPreviewVO.java similarity index 81% rename from src/main/java/com/youlai/boot/platform/generator/model/vo/GeneratorPreviewVO.java rename to src/main/java/com/youlai/boot/module/codegen/model/vo/CodegenPreviewVO.java index e4a7dc14..959bd1a4 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/vo/GeneratorPreviewVO.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/vo/CodegenPreviewVO.java @@ -1,11 +1,11 @@ -package com.youlai.boot.platform.generator.model.vo; +package com.youlai.boot.module.codegen.model.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Schema(description = "代码生成代码预览VO") @Data -public class GeneratorPreviewVO { +public class CodegenPreviewVO { @Schema(description = "生成文件路径") private String path; diff --git a/src/main/java/com/youlai/boot/platform/generator/model/vo/TablePageVO.java b/src/main/java/com/youlai/boot/module/codegen/model/vo/TablePageVO.java similarity index 93% rename from src/main/java/com/youlai/boot/platform/generator/model/vo/TablePageVO.java rename to src/main/java/com/youlai/boot/module/codegen/model/vo/TablePageVO.java index 7ae1f099..369f2409 100644 --- a/src/main/java/com/youlai/boot/platform/generator/model/vo/TablePageVO.java +++ b/src/main/java/com/youlai/boot/module/codegen/model/vo/TablePageVO.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.generator.model.vo; +package com.youlai.boot.module.codegen.model.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/module/codegen/service/CodegenService.java b/src/main/java/com/youlai/boot/module/codegen/service/CodegenService.java new file mode 100644 index 00000000..5ac387c7 --- /dev/null +++ b/src/main/java/com/youlai/boot/module/codegen/service/CodegenService.java @@ -0,0 +1,41 @@ +package com.youlai.boot.module.codegen.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.module.codegen.model.form.GenConfigForm; +import com.youlai.boot.module.codegen.model.query.TablePageQuery; +import com.youlai.boot.module.codegen.model.vo.CodegenPreviewVO; +import com.youlai.boot.module.codegen.model.vo.TablePageVO; + +import java.util.List; + +/** + * 代码生成配置接口 + * + * @author Ray + * @since 2.10.0 + */ +public interface CodegenService { + + /** + * 获取数据表分页列表 + * + * @param queryParams 查询参数 + * @return + */ + Page getTablePage(TablePageQuery queryParams); + + /** + * 获取预览生成代码 + * + * @param tableName 表名 + * @return + */ + List getCodegenPreviewData(String tableName); + + /** + * 下载代码 + * @param tableNames 表名 + * @return + */ + byte[] downloadCode(String[] tableNames); +} diff --git a/src/main/java/com/youlai/boot/module/codegen/service/GenConfigService.java b/src/main/java/com/youlai/boot/module/codegen/service/GenConfigService.java new file mode 100644 index 00000000..93f0187f --- /dev/null +++ b/src/main/java/com/youlai/boot/module/codegen/service/GenConfigService.java @@ -0,0 +1,39 @@ +package com.youlai.boot.module.codegen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.module.codegen.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.form.GenConfigForm; + +/** + * 代码生成配置接口 + * + * @author Ray + * @since 2.10.0 + */ +public interface GenConfigService extends IService { + + /** + * 获取代码生成配置 + * + * @param tableName 表名 + * @return + */ + GenConfigForm getGenConfigFormData(String tableName); + + /** + * 保存代码生成配置 + * + * @param formData 表单数据 + * @return + */ + void saveGenConfig(GenConfigForm formData); + + /** + * 删除代码生成配置 + * + * @param tableName 表名 + * @return + */ + void deleteGenConfig(String tableName); + +} diff --git a/src/main/java/com/youlai/boot/platform/generator/service/GenFieldConfigService.java b/src/main/java/com/youlai/boot/module/codegen/service/GenFieldConfigService.java similarity index 63% rename from src/main/java/com/youlai/boot/platform/generator/service/GenFieldConfigService.java rename to src/main/java/com/youlai/boot/module/codegen/service/GenFieldConfigService.java index 218c8559..6e9c0407 100644 --- a/src/main/java/com/youlai/boot/platform/generator/service/GenFieldConfigService.java +++ b/src/main/java/com/youlai/boot/module/codegen/service/GenFieldConfigService.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.generator.service; +package com.youlai.boot.module.codegen.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.platform.generator.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; /** * 代码生成配置接口 diff --git a/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java new file mode 100644 index 00000000..89aa25a0 --- /dev/null +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/CodegenServiceImpl.java @@ -0,0 +1,316 @@ +package com.youlai.boot.module.codegen.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.Template; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.common.enums.JavaTypeEnum; +import com.youlai.boot.config.property.CodegenProperties; +import com.youlai.boot.module.codegen.service.GenConfigService; +import com.youlai.boot.module.codegen.service.GenFieldConfigService; +import com.youlai.boot.module.codegen.service.CodegenService; +import com.youlai.boot.module.codegen.converter.CodegenConverter; +import com.youlai.boot.common.exception.BusinessException; +import com.youlai.boot.module.codegen.mapper.DatabaseMapper; +import com.youlai.boot.module.codegen.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.model.query.TablePageQuery; +import com.youlai.boot.module.codegen.model.vo.CodegenPreviewVO; +import com.youlai.boot.module.codegen.model.vo.TablePageVO; +import com.youlai.boot.system.service.MenuService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 数据库服务实现类 + * + * @author Ray + * @since 2.10.0 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class CodegenServiceImpl implements CodegenService { + + private final DatabaseMapper databaseMapper; + private final CodegenProperties codegenProperties; + private final GenConfigService genConfigService; + private final GenFieldConfigService genFieldConfigService; + + /** + * 数据表分页列表 + * + * @param queryParams 查询参数 + * @return 分页结果 + */ + public Page getTablePage(TablePageQuery queryParams) { + Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); + // 设置排除的表 + List excludeTables = codegenProperties.getExcludeTables(); + queryParams.setExcludeTables(excludeTables); + + return databaseMapper.getTablePage(page, queryParams); + } + + /** + * 获取预览生成代码 + * + * @param tableName 表名 + * @return 预览数据 + */ + @Override + public List getCodegenPreviewData(String tableName) { + + List list = new ArrayList<>(); + + GenConfig genConfig = genConfigService.getOne(new LambdaQueryWrapper() + .eq(GenConfig::getTableName, tableName) + ); + if (genConfig == null) { + throw new BusinessException("未找到表生成配置"); + } + + List fieldConfigs = genFieldConfigService.list(new LambdaQueryWrapper() + .eq(GenFieldConfig::getConfigId, genConfig.getId()) + .orderByAsc(GenFieldConfig::getFieldSort) + + ); + if (CollectionUtil.isEmpty(fieldConfigs)) { + throw new BusinessException("未找到字段生成配置"); + } + + // 遍历模板配置 + Map templateConfigs = codegenProperties.getTemplateConfigs(); + for (Map.Entry templateConfigEntry : templateConfigs.entrySet()) { + CodegenPreviewVO previewVO = new CodegenPreviewVO(); + + CodegenProperties.TemplateConfig templateConfig = templateConfigEntry.getValue(); + + /* 1. 生成文件名 UserController */ + // User Role Menu Dept + String entityName = genConfig.getEntityName(); + // Controller Service Mapper Entity + String templateName = templateConfigEntry.getKey(); + // .java .ts .vue + String extension = templateConfig.getExtension(); + + // 文件名 UserController.java + String fileName = getFileName(entityName, templateName, extension); + previewVO.setFileName(fileName); + + /* 2. 生成文件路径 */ + // 包名:com.youlai.boot + String packageName = genConfig.getPackageName(); + // 模块名:system + String moduleName = genConfig.getModuleName(); + // 子包名:controller + String subpackageName = templateConfig.getSubpackageName(); + // 组合成文件路径:src/main/java/com/youlai/boot/system/controller + String filePath = getFilePath(templateName, moduleName, packageName, subpackageName, entityName); + previewVO.setPath(filePath); + + /* 3. 生成文件内容 */ + // 将模板文件中的变量替换为具体的值 生成代码内容 + String content = getCodeContent(templateConfig, genConfig, fieldConfigs); + previewVO.setContent(content); + + list.add(previewVO); + } + return list; + } + + /** + * 生成文件名 + * + * @param entityName 实体类名 UserController + * @param templateName 模板名 Entity + * @param extension 文件后缀 .java + * @return 文件名 + */ + private String getFileName(String entityName, String templateName, String extension) { + if ("Entity".equals(templateName)) { + return entityName + extension; + } else if ("MapperXml".equals(templateName)) { + return entityName + "Mapper" + extension; + } else if ("API".equals(templateName)) { + return StrUtil.toSymbolCase(entityName, '-') + extension; + } else if ("VIEW".equals(templateName)) { + return "index.vue"; + } + return entityName + templateName + extension; + } + + /** + * 生成文件路径 + * + * @param templateName 模板名 Entity + * @param moduleName 模块名 system + * @param packageName 包名 com.youlai + * @param subPackageName 子包名 controller + * @param entityName 实体类名 UserController + * @return 文件路径 src/main/java/com/youlai/system/controller + */ + private String getFilePath(String templateName, String moduleName, String packageName, String subPackageName, String entityName) { + String path; + if ("MapperXml".equals(templateName)) { + path = (codegenProperties.getBackendAppName() + + File.separator + + "src" + File.separator + "main" + File.separator + "resources" + + File.separator + subPackageName + ); + } else if ("API".equals(templateName)) { + path = (codegenProperties.getFrontendAppName() + + File.separator + + "src" + File.separator + subPackageName + ); + } else if ("VIEW".equals(templateName)) { + path = (codegenProperties.getFrontendAppName() + + File.separator + "src" + + File.separator + subPackageName + + File.separator + moduleName + + File.separator + StrUtil.toSymbolCase(entityName, '-') + ); + } else { + path = (codegenProperties.getBackendAppName() + + File.separator + + "src" + File.separator + "main" + File.separator + "java" + + File.separator + packageName + + File.separator + moduleName + + File.separator + subPackageName + ); + } + + // subPackageName = model.entity => model/entity + path = path.replace(".", File.separator); + + return path; + } + + /** + * 生成代码内容 + * + * @param templateConfig 模板配置 + * @param genConfig 生成配置 + * @param fieldConfigs 字段配置 + * @return 代码内容 + */ + private String getCodeContent(CodegenProperties.TemplateConfig templateConfig, GenConfig genConfig, List fieldConfigs) { + + Map bindMap = new HashMap<>(); + + String entityName = genConfig.getEntityName(); + + bindMap.put("packageName", genConfig.getPackageName()); + bindMap.put("moduleName", genConfig.getModuleName()); + bindMap.put("subpackageName", templateConfig.getSubpackageName()); + bindMap.put("date", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm")); + bindMap.put("entityName", entityName); + bindMap.put("tableName", genConfig.getTableName()); + bindMap.put("author", genConfig.getAuthor()); + bindMap.put("lowerFirstEntityName", StrUtil.lowerFirst(entityName)); // UserTest → userTest + bindMap.put("kebabCaseEntityName", StrUtil.toSymbolCase(entityName, '-')); // UserTest → user-test + bindMap.put("businessName", genConfig.getBusinessName()); + bindMap.put("fieldConfigs", fieldConfigs); + + boolean hasLocalDateTime = false; + boolean hasBigDecimal = false; + boolean hasRequiredField = false; + + for (GenFieldConfig fieldConfig : fieldConfigs) { + + if ("LocalDateTime".equals(fieldConfig.getFieldType())) { + hasLocalDateTime = true; + } + if ("BigDecimal".equals(fieldConfig.getFieldType())) { + hasBigDecimal = true; + } + if (ObjectUtil.equals(fieldConfig.getIsRequired(), 1)) { + hasRequiredField = true; + } + fieldConfig.setTsType(JavaTypeEnum.getTsTypeByJavaType(fieldConfig.getFieldType())); + + + } + + bindMap.put("hasLocalDateTime", hasLocalDateTime); + bindMap.put("hasBigDecimal", hasBigDecimal); + bindMap.put("hasRequiredField", hasRequiredField); + + TemplateEngine templateEngine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH)); + Template template = templateEngine.getTemplate(templateConfig.getTemplatePath()); + + return template.render(bindMap); + } + + /** + * 下载代码 + * + * @param tableNames 表名数组,支持多张表。 + * @return 压缩文件字节数组 + */ + @Override + public byte[] downloadCode(String[] tableNames) { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream)) { + + // 遍历每个表名,生成对应的代码并压缩到 zip 文件中 + for (String tableName : tableNames) { + generateAndZipCode(tableName, zip); + } + + return outputStream.toByteArray(); + + } catch (IOException e) { + log.error("Error while generating zip for code download", e); + throw new RuntimeException("Failed to generate code zip file", e); + } + } + + /** + * 根据表名生成代码并压缩到zip文件中 + * + * @param tableName 表名 + * @param zip 压缩文件输出流 + */ + private void generateAndZipCode(String tableName, ZipOutputStream zip) { + List codePreviewList = getCodegenPreviewData(tableName); + + for (CodegenPreviewVO codePreview : codePreviewList) { + String fileName = codePreview.getFileName(); + String content = codePreview.getContent(); + String path = codePreview.getPath(); + + try { + // 创建压缩条目 + ZipEntry zipEntry = new ZipEntry(path + File.separator + fileName); + zip.putNextEntry(zipEntry); + + // 写入文件内容 + zip.write(content.getBytes(StandardCharsets.UTF_8)); + + // 关闭当前压缩条目 + zip.closeEntry(); + + } catch (IOException e) { + log.error("Error while adding file {} to zip", fileName, e); + } + } + } + +} diff --git a/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java new file mode 100644 index 00000000..bf4975b0 --- /dev/null +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenConfigServiceImpl.java @@ -0,0 +1,221 @@ +package com.youlai.boot.module.codegen.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.youlai.boot.YouLaiApplication; +import com.youlai.boot.common.enums.EnvEnum; +import com.youlai.boot.common.enums.FormTypeEnum; +import com.youlai.boot.common.enums.JavaTypeEnum; +import com.youlai.boot.common.enums.QueryTypeEnum; +import com.youlai.boot.common.exception.BusinessException; +import com.youlai.boot.config.property.CodegenProperties; +import com.youlai.boot.module.codegen.converter.CodegenConverter; +import com.youlai.boot.module.codegen.mapper.DatabaseMapper; +import com.youlai.boot.module.codegen.mapper.GenConfigMapper; +import com.youlai.boot.module.codegen.model.bo.ColumnMetaData; +import com.youlai.boot.module.codegen.model.bo.TableMetaData; +import com.youlai.boot.module.codegen.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.model.form.GenConfigForm; +import com.youlai.boot.module.codegen.service.GenConfigService; +import com.youlai.boot.module.codegen.service.GenFieldConfigService; +import com.youlai.boot.system.service.MenuService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; + +/** + * 数据库服务实现类 + * + * @author Ray + * @since 2.10.0 + */ +@Service +@RequiredArgsConstructor +public class GenConfigServiceImpl extends ServiceImpl implements GenConfigService { + + private final DatabaseMapper databaseMapper; + private final CodegenProperties codegenProperties; + private final GenFieldConfigService genFieldConfigService; + private final CodegenConverter codegenConverter; + + @Value("${spring.profiles.active}") + private String springProfilesActive; + + private final MenuService menuService; + + /** + * 获取代码生成配置 + * + * @param tableName 表名 eg: sys_user + * @return 代码生成配置 + */ + @Override + public GenConfigForm getGenConfigFormData(String tableName) { + // 查询表生成配置 + GenConfig genConfig = this.getOne( + new LambdaQueryWrapper<>(GenConfig.class) + .eq(GenConfig::getTableName, tableName) + .last("LIMIT 1") + ); + + // 是否有代码生成配置 + boolean hasGenConfig = genConfig != null; + + // 如果没有代码生成配置,则根据表的元数据生成默认配置 + if (genConfig == null) { + TableMetaData tableMetadata = databaseMapper.getTableMetadata(tableName); + Assert.isTrue(tableMetadata != null, "未找到表元数据"); + + genConfig = new GenConfig(); + genConfig.setTableName(tableName); + + String tableComment = tableMetadata.getTableComment(); + if (StrUtil.isNotBlank(tableComment)) { + genConfig.setBusinessName(tableComment.replace("表", "")); + } + // 实体类名 = 表名去掉前缀后转驼峰,前缀默认为下划线分割的第一个元素 + String entityName = StrUtil.toCamelCase(StrUtil.removePrefix(tableName, tableName.split("_")[0])); + genConfig.setEntityName(entityName); + + genConfig.setPackageName(YouLaiApplication.class.getPackageName()); + genConfig.setModuleName(codegenProperties.getDefaultConfig().getModuleName()); // 默认模块名 + genConfig.setAuthor(codegenProperties.getDefaultConfig().getAuthor()); + } + + // 根据表的列 + 已经存在的字段生成配置 得到 组合后的字段生成配置 + List genFieldConfigs = new ArrayList<>(); + + // 获取表的列 + List tableColumns = databaseMapper.getTableColumns(tableName); + if (CollectionUtil.isNotEmpty(tableColumns)) { + // 查询字段生成配置 + List fieldConfigList = genFieldConfigService.list( + new LambdaQueryWrapper() + .eq(GenFieldConfig::getConfigId, genConfig.getId()) + .orderByAsc(GenFieldConfig::getFieldSort) + ); + Integer maxSort = fieldConfigList.stream() + .map(GenFieldConfig::getFieldSort) + .filter(Objects::nonNull) // 过滤掉空值 + .max(Integer::compareTo) + .orElse(0); + for (ColumnMetaData tableColumn : tableColumns) { + // 根据列名获取字段生成配置 + String columnName = tableColumn.getColumnName(); + GenFieldConfig fieldConfig = fieldConfigList.stream() + .filter(item -> StrUtil.equals(item.getColumnName(), columnName)) + .findFirst() + .orElseGet(() -> createDefaultFieldConfig(tableColumn)); + if (fieldConfig.getFieldSort() == null) { + fieldConfig.setFieldSort(++maxSort); + } + // 根据列类型设置字段类型 + String fieldType = fieldConfig.getFieldType(); + if (StrUtil.isBlank(fieldType)) { + String javaType = JavaTypeEnum.getJavaTypeByColumnType(fieldConfig.getColumnType()); + fieldConfig.setFieldType(javaType); + } + // 如果没有代码生成配置,则默认展示在列表和表单 + if (!hasGenConfig) { + fieldConfig.setIsShowInList(1); + fieldConfig.setIsShowInForm(1); + } + genFieldConfigs.add(fieldConfig); + } + } + //对genFieldConfigs按照fieldSort排序 + genFieldConfigs = genFieldConfigs.stream().sorted(Comparator.comparing(GenFieldConfig::getFieldSort)).toList(); + GenConfigForm genConfigForm = codegenConverter.toGenConfigForm(genConfig, genFieldConfigs); + + genConfigForm.setFrontendAppName(codegenProperties.getFrontendAppName()); + genConfigForm.setBackendAppName(codegenProperties.getBackendAppName()); + return genConfigForm; + } + + + /** + * 创建默认字段配置 + * + * @param columnMetaData 表字段元数据 + * @return + */ + private GenFieldConfig createDefaultFieldConfig(ColumnMetaData columnMetaData) { + GenFieldConfig fieldConfig = new GenFieldConfig(); + fieldConfig.setColumnName(columnMetaData.getColumnName()); + fieldConfig.setColumnType(columnMetaData.getDataType()); + fieldConfig.setFieldComment(columnMetaData.getColumnComment()); + fieldConfig.setFieldName(StrUtil.toCamelCase(columnMetaData.getColumnName())); + fieldConfig.setIsRequired("YES".equals(columnMetaData.getIsNullable()) ? 1 : 0); + + if (fieldConfig.getColumnType().equals("date")) { + fieldConfig.setFormType(FormTypeEnum.DATE); + } else if (fieldConfig.getColumnType().equals("datetime")) { + fieldConfig.setFormType(FormTypeEnum.DATE_TIME); + } else { + fieldConfig.setFormType(FormTypeEnum.INPUT); + } + + fieldConfig.setQueryType(QueryTypeEnum.EQ); + fieldConfig.setMaxLength(columnMetaData.getCharacterMaximumLength()); + return fieldConfig; + } + + /** + * 保存代码生成配置 + * + * @param formData 代码生成配置表单 + */ + @Override + public void saveGenConfig(GenConfigForm formData) { + GenConfig genConfig = codegenConverter.toGenConfig(formData); + this.saveOrUpdate(genConfig); + + // 如果选择上级菜单且当前环境不是生产环境,则保存菜单 + Long parentMenuId = formData.getParentMenuId(); + if (parentMenuId != null && !EnvEnum.PROD.getValue().equals(springProfilesActive)) { + menuService.addMenuForCodegen(parentMenuId, genConfig); + } + + List genFieldConfigs = codegenConverter.toGenFieldConfig(formData.getFieldConfigs()); + + if (CollectionUtil.isEmpty(genFieldConfigs)) { + throw new BusinessException("字段配置不能为空"); + } + genFieldConfigs.forEach(genFieldConfig -> { + genFieldConfig.setConfigId(genConfig.getId()); + }); + genFieldConfigService.saveOrUpdateBatch(genFieldConfigs); + } + + /** + * 删除代码生成配置 + * + * @param tableName 表名 + */ + @Override + public void deleteGenConfig(String tableName) { + GenConfig genConfig = this.getOne(new LambdaQueryWrapper() + .eq(GenConfig::getTableName, tableName)); + + boolean result = this.remove(new LambdaQueryWrapper() + .eq(GenConfig::getTableName, tableName) + ); + if (result) { + genFieldConfigService.remove(new LambdaQueryWrapper() + .eq(GenFieldConfig::getConfigId, genConfig.getId()) + ); + } + } + + + +} diff --git a/src/main/java/com/youlai/boot/platform/generator/service/impl/GenFieldConfigServiceImpl.java b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenFieldConfigServiceImpl.java similarity index 60% rename from src/main/java/com/youlai/boot/platform/generator/service/impl/GenFieldConfigServiceImpl.java rename to src/main/java/com/youlai/boot/module/codegen/service/impl/GenFieldConfigServiceImpl.java index 28ddb7f6..646efcdc 100644 --- a/src/main/java/com/youlai/boot/platform/generator/service/impl/GenFieldConfigServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/codegen/service/impl/GenFieldConfigServiceImpl.java @@ -1,9 +1,9 @@ -package com.youlai.boot.platform.generator.service.impl; +package com.youlai.boot.module.codegen.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.boot.platform.generator.mapper.GenFieldConfigMapper; -import com.youlai.boot.platform.generator.model.entity.GenFieldConfig; -import com.youlai.boot.platform.generator.service.GenFieldConfigService; +import com.youlai.boot.module.codegen.mapper.GenFieldConfigMapper; +import com.youlai.boot.module.codegen.model.entity.GenFieldConfig; +import com.youlai.boot.module.codegen.service.GenFieldConfigService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/youlai/boot/platform/file/controller/FileController.java b/src/main/java/com/youlai/boot/module/file/controller/FileController.java similarity index 93% rename from src/main/java/com/youlai/boot/platform/file/controller/FileController.java rename to src/main/java/com/youlai/boot/module/file/controller/FileController.java index 1b5123ee..6943af6e 100644 --- a/src/main/java/com/youlai/boot/platform/file/controller/FileController.java +++ b/src/main/java/com/youlai/boot/module/file/controller/FileController.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.file.controller; +package com.youlai.boot.module.file.controller; import com.youlai.boot.common.result.Result; -import com.youlai.boot.platform.file.service.FileService; +import com.youlai.boot.module.file.service.FileService; import com.youlai.boot.system.model.dto.FileInfo; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; diff --git a/src/main/java/com/youlai/boot/platform/file/service/FileService.java b/src/main/java/com/youlai/boot/module/file/service/FileService.java similarity index 91% rename from src/main/java/com/youlai/boot/platform/file/service/FileService.java rename to src/main/java/com/youlai/boot/module/file/service/FileService.java index a1aabb45..d7abf7da 100644 --- a/src/main/java/com/youlai/boot/platform/file/service/FileService.java +++ b/src/main/java/com/youlai/boot/module/file/service/FileService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.file.service; +package com.youlai.boot.module.file.service; import com.youlai.boot.system.model.dto.FileInfo; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/com/youlai/boot/platform/file/service/impl/AliyunFileService.java b/src/main/java/com/youlai/boot/module/file/service/impl/AliyunFileService.java similarity index 96% rename from src/main/java/com/youlai/boot/platform/file/service/impl/AliyunFileService.java rename to src/main/java/com/youlai/boot/module/file/service/impl/AliyunFileService.java index b3811f25..570e9c6f 100644 --- a/src/main/java/com/youlai/boot/platform/file/service/impl/AliyunFileService.java +++ b/src/main/java/com/youlai/boot/module/file/service/impl/AliyunFileService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.file.service.impl; +package com.youlai.boot.module.file.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; @@ -8,7 +8,7 @@ import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; -import com.youlai.boot.platform.file.service.FileService; +import com.youlai.boot.module.file.service.FileService; import com.youlai.boot.system.model.dto.FileInfo; import jakarta.annotation.PostConstruct; import lombok.Data; diff --git a/src/main/java/com/youlai/boot/platform/file/service/impl/MinioFileService.java b/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java similarity index 98% rename from src/main/java/com/youlai/boot/platform/file/service/impl/MinioFileService.java rename to src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java index 83bbbdd3..6157e671 100644 --- a/src/main/java/com/youlai/boot/platform/file/service/impl/MinioFileService.java +++ b/src/main/java/com/youlai/boot/module/file/service/impl/MinioFileService.java @@ -1,11 +1,11 @@ -package com.youlai.boot.platform.file.service.impl; +package com.youlai.boot.module.file.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import com.youlai.boot.platform.file.service.FileService; +import com.youlai.boot.module.file.service.FileService; import com.youlai.boot.system.model.dto.FileInfo; import io.minio.*; import io.minio.errors.*; diff --git a/src/main/java/com/youlai/boot/platform/mail/controller/MailController.java b/src/main/java/com/youlai/boot/module/mail/controller/MailController.java similarity index 76% rename from src/main/java/com/youlai/boot/platform/mail/controller/MailController.java rename to src/main/java/com/youlai/boot/module/mail/controller/MailController.java index 04a1a3ed..ceaedd18 100644 --- a/src/main/java/com/youlai/boot/platform/mail/controller/MailController.java +++ b/src/main/java/com/youlai/boot/module/mail/controller/MailController.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.mail.controller; +package com.youlai.boot.module.mail.controller; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/youlai/boot/platform/mail/service/MailService.java b/src/main/java/com/youlai/boot/module/mail/service/MailService.java similarity index 92% rename from src/main/java/com/youlai/boot/platform/mail/service/MailService.java rename to src/main/java/com/youlai/boot/module/mail/service/MailService.java index f1304cfd..7d5252cb 100644 --- a/src/main/java/com/youlai/boot/platform/mail/service/MailService.java +++ b/src/main/java/com/youlai/boot/module/mail/service/MailService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.mail.service; +package com.youlai.boot.module.mail.service; /** * 邮件服务接口层 diff --git a/src/main/java/com/youlai/boot/platform/mail/service/impl/MailServiceImpl.java b/src/main/java/com/youlai/boot/module/mail/service/impl/MailServiceImpl.java similarity index 95% rename from src/main/java/com/youlai/boot/platform/mail/service/impl/MailServiceImpl.java rename to src/main/java/com/youlai/boot/module/mail/service/impl/MailServiceImpl.java index 9ffc74b7..82b5f6ae 100644 --- a/src/main/java/com/youlai/boot/platform/mail/service/impl/MailServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/mail/service/impl/MailServiceImpl.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.mail.service.impl; +package com.youlai.boot.module.mail.service.impl; import com.youlai.boot.config.property.MailProperties; -import com.youlai.boot.platform.mail.service.MailService; +import com.youlai.boot.module.mail.service.MailService; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/youlai/boot/module/sms/controller/SmsController.java b/src/main/java/com/youlai/boot/module/sms/controller/SmsController.java new file mode 100644 index 00000000..c07164f5 --- /dev/null +++ b/src/main/java/com/youlai/boot/module/sms/controller/SmsController.java @@ -0,0 +1,13 @@ +package com.youlai.boot.module.sms.controller; + +/** + * 短信控制层 + * + * @author Ray + * @since 2.10.0 + */ +public class SmsController { + + + +} diff --git a/src/main/java/com/youlai/boot/platform/sms/service/SmsService.java b/src/main/java/com/youlai/boot/module/sms/service/SmsService.java similarity index 91% rename from src/main/java/com/youlai/boot/platform/sms/service/SmsService.java rename to src/main/java/com/youlai/boot/module/sms/service/SmsService.java index eb0309d7..40bee93c 100644 --- a/src/main/java/com/youlai/boot/platform/sms/service/SmsService.java +++ b/src/main/java/com/youlai/boot/module/sms/service/SmsService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.sms.service; +package com.youlai.boot.module.sms.service; /** * 短信服务接口层 diff --git a/src/main/java/com/youlai/boot/platform/sms/service/impl/AliyunSmsService.java b/src/main/java/com/youlai/boot/module/sms/service/impl/AliyunSmsService.java similarity index 96% rename from src/main/java/com/youlai/boot/platform/sms/service/impl/AliyunSmsService.java rename to src/main/java/com/youlai/boot/module/sms/service/impl/AliyunSmsService.java index 328fa717..79fcb8b3 100644 --- a/src/main/java/com/youlai/boot/platform/sms/service/impl/AliyunSmsService.java +++ b/src/main/java/com/youlai/boot/module/sms/service/impl/AliyunSmsService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.sms.service.impl; +package com.youlai.boot.module.sms.service.impl; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; @@ -9,7 +9,7 @@ import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.youlai.boot.config.property.AliyunSmsProperties; -import com.youlai.boot.platform.sms.service.SmsService; +import com.youlai.boot.module.sms.service.SmsService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/youlai/boot/platform/websocket/controller/WebsocketController.java b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java similarity index 97% rename from src/main/java/com/youlai/boot/platform/websocket/controller/WebsocketController.java rename to src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java index 4a94135b..b8525d28 100644 --- a/src/main/java/com/youlai/boot/platform/websocket/controller/WebsocketController.java +++ b/src/main/java/com/youlai/boot/module/websocket/controller/WebsocketController.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.websocket.controller; +package com.youlai.boot.module.websocket.controller; import com.youlai.boot.system.model.dto.ChatMessage; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/youlai/boot/platform/websocket/service/WebsocketService.java b/src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java similarity index 68% rename from src/main/java/com/youlai/boot/platform/websocket/service/WebsocketService.java rename to src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java index 5c16d281..4cfe70d1 100644 --- a/src/main/java/com/youlai/boot/platform/websocket/service/WebsocketService.java +++ b/src/main/java/com/youlai/boot/module/websocket/service/WebsocketService.java @@ -1,4 +1,4 @@ -package com.youlai.boot.platform.websocket.service; +package com.youlai.boot.module.websocket.service; public interface WebsocketService { diff --git a/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebsocketServiceImpl.java b/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java similarity index 92% rename from src/main/java/com/youlai/boot/platform/websocket/service/impl/WebsocketServiceImpl.java rename to src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java index b8ac3cae..48fcdfb5 100644 --- a/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebsocketServiceImpl.java +++ b/src/main/java/com/youlai/boot/module/websocket/service/impl/WebsocketServiceImpl.java @@ -1,7 +1,7 @@ -package com.youlai.boot.platform.websocket.service.impl; +package com.youlai.boot.module.websocket.service.impl; import com.youlai.boot.system.event.UserConnectionEvent; -import com.youlai.boot.platform.websocket.service.WebsocketService; +import com.youlai.boot.module.websocket.service.WebsocketService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; diff --git a/src/main/java/com/youlai/boot/platform/generator/service/GenConfigService.java b/src/main/java/com/youlai/boot/platform/generator/service/GenConfigService.java deleted file mode 100644 index 6f9975fe..00000000 --- a/src/main/java/com/youlai/boot/platform/generator/service/GenConfigService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.youlai.boot.platform.generator.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.platform.generator.model.entity.GenConfig; - -/** - * 代码生成配置接口 - * - * @author Ray - * @since 2.10.0 - */ -public interface GenConfigService extends IService { - - - -} diff --git a/src/main/java/com/youlai/boot/platform/generator/service/GeneratorService.java b/src/main/java/com/youlai/boot/platform/generator/service/GeneratorService.java deleted file mode 100644 index 8468d238..00000000 --- a/src/main/java/com/youlai/boot/platform/generator/service/GeneratorService.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.youlai.boot.platform.generator.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.boot.platform.generator.model.form.GenConfigForm; -import com.youlai.boot.platform.generator.model.query.TablePageQuery; -import com.youlai.boot.platform.generator.model.vo.GeneratorPreviewVO; -import com.youlai.boot.platform.generator.model.vo.TablePageVO; - -import java.util.List; - -/** - * 代码生成配置接口 - * - * @author Ray - * @since 2.10.0 - */ -public interface GeneratorService { - - /** - * 获取数据表分页列表 - * - * @param queryParams 查询参数 - * @return - */ - Page getTablePage(TablePageQuery queryParams); - - /** - * 获取预览生成代码 - * - * @param tableName 表名 - * @return - */ - List getTablePreviewData(String tableName); - - /** - * 获取代码生成配置 - * - * @param tableName 表名 - * @return - */ - GenConfigForm getGenConfigFormData(String tableName); - - /** - * 保存代码生成配置 - * - * @param formData 表单数据 - * @return - */ - void saveGenConfig(GenConfigForm formData); - - /** - * 删除代码生成配置 - * - * @param tableName 表名 - * @return - */ - void deleteGenConfig(String tableName); - - /** - * 下载代码 - * @param tableNames 表名 - * @return - */ - byte[] downloadCode(String[] tableNames); -} diff --git a/src/main/java/com/youlai/boot/platform/generator/service/impl/GenConfigServiceImpl.java b/src/main/java/com/youlai/boot/platform/generator/service/impl/GenConfigServiceImpl.java deleted file mode 100644 index 361b7b76..00000000 --- a/src/main/java/com/youlai/boot/platform/generator/service/impl/GenConfigServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.youlai.boot.platform.generator.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.boot.platform.generator.mapper.GenConfigMapper; -import com.youlai.boot.platform.generator.model.entity.GenConfig; -import com.youlai.boot.platform.generator.service.GenConfigService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -/** - * 数据库服务实现类 - * - * @author Ray - * @since 2.10.0 - */ -@Service -@RequiredArgsConstructor -public class GenConfigServiceImpl extends ServiceImpl implements GenConfigService { - -} diff --git a/src/main/java/com/youlai/boot/platform/generator/service/impl/GeneratorServiceImpl.java b/src/main/java/com/youlai/boot/platform/generator/service/impl/GeneratorServiceImpl.java deleted file mode 100644 index 01bda26e..00000000 --- a/src/main/java/com/youlai/boot/platform/generator/service/impl/GeneratorServiceImpl.java +++ /dev/null @@ -1,475 +0,0 @@ -package com.youlai.boot.platform.generator.service.impl; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.template.Template; -import cn.hutool.extra.template.TemplateConfig; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.TemplateUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.boot.YouLaiApplication; -import com.youlai.boot.common.enums.FormTypeEnum; -import com.youlai.boot.common.enums.JavaTypeEnum; -import com.youlai.boot.common.enums.QueryTypeEnum; -import com.youlai.boot.config.property.GeneratorProperties; -import com.youlai.boot.platform.generator.service.GenConfigService; -import com.youlai.boot.platform.generator.service.GenFieldConfigService; -import com.youlai.boot.platform.generator.service.GeneratorService; -import com.youlai.boot.platform.generator.converter.GenConfigConverter; -import com.youlai.boot.common.exception.BusinessException; -import com.youlai.boot.platform.generator.mapper.DatabaseMapper; -import com.youlai.boot.platform.generator.model.bo.ColumnMetaData; -import com.youlai.boot.platform.generator.model.bo.TableMetaData; -import com.youlai.boot.platform.generator.model.entity.GenConfig; -import com.youlai.boot.platform.generator.model.entity.GenFieldConfig; -import com.youlai.boot.platform.generator.model.form.GenConfigForm; -import com.youlai.boot.platform.generator.model.query.TablePageQuery; -import com.youlai.boot.platform.generator.model.vo.GeneratorPreviewVO; -import com.youlai.boot.platform.generator.model.vo.TablePageVO; -import com.youlai.boot.system.service.MenuService; -import lombok.RequiredArgsConstructor; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.zip.ZipOutputStream; - -/** - * 数据库服务实现类 - * - * @author Ray - * @since 2.10.0 - */ -@Service -@RequiredArgsConstructor -public class GeneratorServiceImpl implements GeneratorService { - - private final DatabaseMapper databaseMapper; - private final GeneratorProperties generatorProperties; - private final GenConfigService genConfigService; - private final GenFieldConfigService genFieldConfigService; - private final GenConfigConverter genConfigConverter; - private final MenuService menuService; - - @Value("${spring.profiles.active}") - private String springProfilesActive; - - /** - * 数据表分页列表 - * - * @param queryParams 查询参数 - * @return 分页结果 - */ - public Page getTablePage(TablePageQuery queryParams) { - Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - // 设置排除的表 - List excludeTables = generatorProperties.getExcludeTables(); - queryParams.setExcludeTables(excludeTables); - - return databaseMapper.getTablePage(page, queryParams); - } - - /** - * 获取代码生成配置 - * - * @param tableName 表名 eg: sys_user - * @return 代码生成配置 - */ - @Override - public GenConfigForm getGenConfigFormData(String tableName) { - // 查询表生成配置 - GenConfig genConfig = genConfigService.getOne( - new LambdaQueryWrapper<>(GenConfig.class) - .eq(GenConfig::getTableName, tableName) - .last("LIMIT 1") - ); - - // 是否有代码生成配置 - boolean hasGenConfig = genConfig != null; - - // 如果没有代码生成配置,则根据表的元数据生成默认配置 - if (genConfig == null) { - TableMetaData tableMetadata = databaseMapper.getTableMetadata(tableName); - Assert.isTrue(tableMetadata != null, "未找到表元数据"); - - genConfig = new GenConfig(); - genConfig.setTableName(tableName); - - String tableComment = tableMetadata.getTableComment(); - if (StrUtil.isNotBlank(tableComment)) { - genConfig.setBusinessName(tableComment.replace("表", "")); - } - // 实体类名 = 表名去掉前缀后转驼峰,前缀默认为下划线分割的第一个元素 - String entityName = StrUtil.toCamelCase(StrUtil.removePrefix(tableName, tableName.split("_")[0])); - genConfig.setEntityName(entityName); - - genConfig.setPackageName(YouLaiApplication.class.getPackageName()); - genConfig.setModuleName(generatorProperties.getDefaultConfig().getModuleName()); // 默认模块名 - genConfig.setAuthor(generatorProperties.getDefaultConfig().getAuthor()); - } - - // 根据表的列 + 已经存在的字段生成配置 得到 组合后的字段生成配置 - List genFieldConfigs = new ArrayList<>(); - - // 获取表的列 - List tableColumns = databaseMapper.getTableColumns(tableName); - if (CollectionUtil.isNotEmpty(tableColumns)) { - // 查询字段生成配置 - List fieldConfigList = genFieldConfigService.list( - new LambdaQueryWrapper() - .eq(GenFieldConfig::getConfigId, genConfig.getId()) - .orderByAsc(GenFieldConfig::getFieldSort) - ); - Integer maxSort = fieldConfigList.stream() - .map(GenFieldConfig::getFieldSort) - .filter(Objects::nonNull) // 过滤掉空值 - .max(Integer::compareTo) - .orElse(0); - for (ColumnMetaData tableColumn : tableColumns) { - // 根据列名获取字段生成配置 - String columnName = tableColumn.getColumnName(); - GenFieldConfig fieldConfig = fieldConfigList.stream() - .filter(item -> StrUtil.equals(item.getColumnName(), columnName)) - .findFirst() - .orElseGet(() -> createDefaultFieldConfig(tableColumn)); - if (fieldConfig.getFieldSort() == null) { - fieldConfig.setFieldSort(++maxSort); - } - // 根据列类型设置字段类型 - String fieldType = fieldConfig.getFieldType(); - if (StrUtil.isBlank(fieldType)) { - String javaType = JavaTypeEnum.getJavaTypeByColumnType(fieldConfig.getColumnType()); - fieldConfig.setFieldType(javaType); - } - // 如果没有代码生成配置,则默认展示在列表和表单 - if (!hasGenConfig) { - fieldConfig.setIsShowInList(1); - fieldConfig.setIsShowInForm(1); - } - genFieldConfigs.add(fieldConfig); - } - } - //对genFieldConfigs按照fieldSort排序 - genFieldConfigs = genFieldConfigs.stream().sorted(Comparator.comparing(GenFieldConfig::getFieldSort)).toList(); - GenConfigForm genConfigForm = genConfigConverter.toGenConfigForm(genConfig, genFieldConfigs); - - genConfigForm.setFrontendAppName(generatorProperties.getFrontendAppName()); - genConfigForm.setBackendAppName(generatorProperties.getBackendAppName()); - return genConfigForm; - } - - - /** - * 创建默认字段配置 - * - * @param columnMetaData 表字段元数据 - * @return - */ - private GenFieldConfig createDefaultFieldConfig(ColumnMetaData columnMetaData) { - GenFieldConfig fieldConfig = new GenFieldConfig(); - fieldConfig.setColumnName(columnMetaData.getColumnName()); - fieldConfig.setColumnType(columnMetaData.getDataType()); - fieldConfig.setFieldComment(columnMetaData.getColumnComment()); - fieldConfig.setFieldName(StrUtil.toCamelCase(columnMetaData.getColumnName())); - fieldConfig.setIsRequired("YES".equals(columnMetaData.getIsNullable()) ? 1 : 0); - - if (fieldConfig.getColumnType().equals("date")) { - fieldConfig.setFormType(FormTypeEnum.DATE); - } else if (fieldConfig.getColumnType().equals("datetime")) { - fieldConfig.setFormType(FormTypeEnum.DATE_TIME); - } else { - fieldConfig.setFormType(FormTypeEnum.INPUT); - } - - fieldConfig.setQueryType(QueryTypeEnum.EQ); - fieldConfig.setMaxLength(columnMetaData.getCharacterMaximumLength()); - return fieldConfig; - } - - /** - * 保存代码生成配置 - * - * @param formData 代码生成配置表单 - */ - @Override - public void saveGenConfig(GenConfigForm formData) { - GenConfig genConfig = genConfigConverter.toGenConfig(formData); - genConfigService.saveOrUpdate(genConfig); - - // 如果选择上级菜单 - Long parentMenuId = formData.getParentMenuId(); - if (parentMenuId != null && springProfilesActive.equals("dev")) { - menuService.saveMenu(parentMenuId, genConfig); - } - - List genFieldConfigs = genConfigConverter.toGenFieldConfig(formData.getFieldConfigs()); - - if (CollectionUtil.isEmpty(genFieldConfigs)) { - throw new BusinessException("字段配置不能为空"); - } - genFieldConfigs.forEach(genFieldConfig -> { - genFieldConfig.setConfigId(genConfig.getId()); - }); - genFieldConfigService.saveOrUpdateBatch(genFieldConfigs); - } - - /** - * 删除代码生成配置 - * - * @param tableName 表名 - */ - @Override - public void deleteGenConfig(String tableName) { - GenConfig genConfig = genConfigService.getOne(new LambdaQueryWrapper() - .eq(GenConfig::getTableName, tableName)); - - boolean result = genConfigService.remove(new LambdaQueryWrapper() - .eq(GenConfig::getTableName, tableName) - ); - if (result) { - genFieldConfigService.remove(new LambdaQueryWrapper() - .eq(GenFieldConfig::getConfigId, genConfig.getId()) - ); - } - } - - - /** - * 获取预览生成代码 - * - * @param tableName 表名 - * @return 预览数据 - */ - @Override - public List getTablePreviewData(String tableName) { - - List list = new ArrayList<>(); - - GenConfig genConfig = genConfigService.getOne(new LambdaQueryWrapper() - .eq(GenConfig::getTableName, tableName) - ); - if (genConfig == null) { - throw new BusinessException("未找到表生成配置"); - } - - List fieldConfigs = genFieldConfigService.list(new LambdaQueryWrapper() - .eq(GenFieldConfig::getConfigId, genConfig.getId()) - .orderByAsc(GenFieldConfig::getFieldSort) - - ); - if (CollectionUtil.isEmpty(fieldConfigs)) { - throw new BusinessException("未找到字段生成配置"); - } - - // 遍历模板配置 - Map templateConfigs = generatorProperties.getTemplateConfigs(); - for (Map.Entry templateConfigEntry : templateConfigs.entrySet()) { - GeneratorPreviewVO previewVO = new GeneratorPreviewVO(); - - GeneratorProperties.TemplateConfig templateConfig = templateConfigEntry.getValue(); - - /* 1. 生成文件名 UserController */ - // User Role Menu Dept - String entityName = genConfig.getEntityName(); - // Controller Service Mapper Entity - String templateName = templateConfigEntry.getKey(); - // .java .ts .vue - String extension = templateConfig.getExtension(); - - // 文件名 UserController.java - String fileName = getFileName(entityName, templateName, extension); - previewVO.setFileName(fileName); - - /* 2. 生成文件路径 */ - // 包名:com.youlai.boot - String packageName = genConfig.getPackageName(); - // 模块名:system - String moduleName = genConfig.getModuleName(); - // 子包名:controller - String subpackageName = templateConfig.getSubpackageName(); - // 组合成文件路径:src/main/java/com/youlai/boot/system/controller - String filePath = getFilePath(templateName, moduleName, packageName, subpackageName, entityName); - previewVO.setPath(filePath); - - /* 3. 生成文件内容 */ - // 将模板文件中的变量替换为具体的值 生成代码内容 - String content = getCodeContent(templateConfig, genConfig, fieldConfigs); - previewVO.setContent(content); - - list.add(previewVO); - } - return list; - } - - /** - * 生成文件名 - * - * @param entityName 实体类名 UserController - * @param templateName 模板名 Entity - * @param extension 文件后缀 .java - * @return 文件名 - */ - private String getFileName(String entityName, String templateName, String extension) { - if ("Entity".equals(templateName)) { - return entityName + extension; - } else if ("MapperXml".equals(templateName)) { - return entityName + "Mapper" + extension; - } else if ("API".equals(templateName)) { - return StrUtil.toSymbolCase(entityName, '-') + extension; - } else if ("VIEW".equals(templateName)) { - return "index.vue"; - } - return entityName + templateName + extension; - } - - /** - * 生成文件路径 - * - * @param templateName 模板名 Entity - * @param moduleName 模块名 system - * @param packageName 包名 com.youlai - * @param subPackageName 子包名 controller - * @param entityName 实体类名 UserController - * @return 文件路径 src/main/java/com/youlai/system/controller - */ - private String getFilePath(String templateName, String moduleName, String packageName, String subPackageName, String entityName) { - String path; - if ("MapperXml".equals(templateName)) { - path = (generatorProperties.getBackendAppName() - + File.separator - + "src" + File.separator + "main" + File.separator + "resources" - + File.separator + subPackageName - ); - } else if ("API".equals(templateName)) { - path = (generatorProperties.getFrontendAppName() - + File.separator - + "src" + File.separator + subPackageName - ); - } else if ("VIEW".equals(templateName)) { - path = (generatorProperties.getFrontendAppName() - + File.separator + "src" - + File.separator + subPackageName - + File.separator + moduleName - + File.separator + StrUtil.toSymbolCase(entityName, '-') - ); - } else { - path = (generatorProperties.getBackendAppName() - + File.separator - + "src" + File.separator + "main" + File.separator + "java" - + File.separator + packageName - + File.separator + moduleName - + File.separator + subPackageName - ); - } - - // subPackageName = model.entity => model/entity - path = path.replace(".", File.separator); - - return path; - } - - /** - * 生成代码内容 - * - * @param templateConfig 模板配置 - * @param genConfig 生成配置 - * @param fieldConfigs 字段配置 - * @return 代码内容 - */ - private String getCodeContent(GeneratorProperties.TemplateConfig templateConfig, GenConfig genConfig, List fieldConfigs) { - - Map bindMap = new HashMap<>(); - - String entityName = genConfig.getEntityName(); - - bindMap.put("packageName", genConfig.getPackageName()); - bindMap.put("moduleName", genConfig.getModuleName()); - bindMap.put("subpackageName", templateConfig.getSubpackageName()); - bindMap.put("date", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm")); - bindMap.put("entityName", entityName); - bindMap.put("tableName", genConfig.getTableName()); - bindMap.put("author", genConfig.getAuthor()); - bindMap.put("lowerFirstEntityName", StrUtil.lowerFirst(entityName)); // UserTest → userTest - bindMap.put("kebabCaseEntityName", StrUtil.toSymbolCase(entityName, '-')); // UserTest → user-test - bindMap.put("businessName", genConfig.getBusinessName()); - bindMap.put("fieldConfigs", fieldConfigs); - - boolean hasLocalDateTime = false; - boolean hasBigDecimal = false; - boolean hasRequiredField = false; - - for (GenFieldConfig fieldConfig : fieldConfigs) { - - if ("LocalDateTime".equals(fieldConfig.getFieldType())) { - hasLocalDateTime = true; - } - if ("BigDecimal".equals(fieldConfig.getFieldType())) { - hasBigDecimal = true; - } - if (ObjectUtil.equals(fieldConfig.getIsRequired(), 1)) { - hasRequiredField = true; - } - fieldConfig.setTsType(JavaTypeEnum.getTsTypeByJavaType(fieldConfig.getFieldType())); - - - } - - bindMap.put("hasLocalDateTime", hasLocalDateTime); - bindMap.put("hasBigDecimal", hasBigDecimal); - bindMap.put("hasRequiredField", hasRequiredField); - - TemplateEngine templateEngine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH)); - Template template = templateEngine.getTemplate(templateConfig.getTemplatePath()); - String content = template.render(bindMap); - - return content; - } - - /** - * 下载代码 - * - * @param tableNames 表名,可以支持多张表。 - * @return 压缩文件字节数组 - */ - @Override - public byte[] downloadCode(String[] tableNames) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(outputStream); - for (String tableName : tableNames) { - generatorCode(tableName, zip); - } - IOUtils.closeQuietly(zip); - return outputStream.toByteArray(); - } - - /** - * 根据表名生成代码并且压缩到zip文件中 - * - * @param tableName 单个表名 - * @param zip 压缩文件 - */ - private void generatorCode(String tableName, ZipOutputStream zip) { - List previewVOList = getTablePreviewData(tableName); - for (GeneratorPreviewVO previewVO : previewVOList) { - String fileName = previewVO.getFileName(); - String content = previewVO.getContent(); - String path = previewVO.getPath(); - try { - zip.putNextEntry(new java.util.zip.ZipEntry(path + File.separator + fileName)); - zip.write(content.getBytes(StandardCharsets.UTF_8)); - zip.closeEntry(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - -} diff --git a/src/main/java/com/youlai/boot/platform/sms/controller/SmsController.java b/src/main/java/com/youlai/boot/platform/sms/controller/SmsController.java deleted file mode 100644 index 7d85c6c0..00000000 --- a/src/main/java/com/youlai/boot/platform/sms/controller/SmsController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.youlai.boot.platform.sms.controller; - -import com.youlai.boot.platform.sms.service.SmsService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * 短信控制层 - * - * @author Ray - * @since 2.10.0 - */ -public class SmsController { - - - -} diff --git a/src/main/java/com/youlai/boot/system/model/query/MenuQuery.java b/src/main/java/com/youlai/boot/system/model/query/MenuQuery.java index e9de9971..9497b295 100644 --- a/src/main/java/com/youlai/boot/system/model/query/MenuQuery.java +++ b/src/main/java/com/youlai/boot/system/model/query/MenuQuery.java @@ -9,7 +9,7 @@ import lombok.Data; * @author haoxr * @since 2022/10/28 */ -@Schema(description ="部门分页查询对象") +@Schema(description ="菜单查询对象") @Data public class MenuQuery { diff --git a/src/main/java/com/youlai/boot/system/service/MenuService.java b/src/main/java/com/youlai/boot/system/service/MenuService.java index a6b9f763..59d19986 100644 --- a/src/main/java/com/youlai/boot/system/service/MenuService.java +++ b/src/main/java/com/youlai/boot/system/service/MenuService.java @@ -1,7 +1,7 @@ package com.youlai.boot.system.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.platform.generator.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenConfig; import com.youlai.boot.system.model.form.MenuForm; import com.youlai.boot.common.model.Option; import com.youlai.boot.system.model.entity.Menu; @@ -67,10 +67,10 @@ public interface MenuService extends IService { boolean deleteMenu(Long id); /** - * 为代码生成添加菜单 + * 代码生成时添加菜单 * * @param parentMenuId 父菜单ID * @param genConfig 实体名 */ - void saveMenu(Long parentMenuId, GenConfig genConfig); + void addMenuForCodegen(Long parentMenuId, GenConfig genConfig); } diff --git a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java index ddd927c9..ef13a2cc 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.youlai.boot.system.converter.MenuConverter; import com.youlai.boot.system.mapper.MenuMapper; import com.youlai.boot.system.model.bo.RouteBO; -import com.youlai.boot.platform.generator.model.entity.GenConfig; +import com.youlai.boot.module.codegen.model.entity.GenConfig; import com.youlai.boot.system.model.entity.Menu; import com.youlai.boot.system.model.form.MenuForm; import com.youlai.boot.system.model.query.MenuQuery; @@ -362,13 +362,13 @@ public class MenuServiceImpl extends ServiceImpl implements Me } /** - * 为代码生成添加菜单 + * 代码生成时添加菜单 * * @param parentMenuId 父菜单ID * @param genConfig 实体名称 */ @Override - public void saveMenu(Long parentMenuId, GenConfig genConfig) { + public void addMenuForCodegen(Long parentMenuId, GenConfig genConfig) { Menu parentMenu = this.getById(parentMenuId); Assert.notNull(parentMenu, "上级菜单不存在"); @@ -389,7 +389,6 @@ public class MenuServiceImpl extends ServiceImpl implements Me sort = maxSortMenu.getSort() + 1; } - Menu menu = new Menu(); menu.setParentId(parentMenuId); menu.setName(genConfig.getBusinessName()); diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index 7cc5f3c2..b055b289 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -11,8 +11,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SystemConstants; import com.youlai.boot.common.enums.ContactType; -import com.youlai.boot.platform.mail.service.MailService; -import com.youlai.boot.platform.sms.service.SmsService; +import com.youlai.boot.module.mail.service.MailService; +import com.youlai.boot.module.sms.service.SmsService; import com.youlai.boot.system.model.entity.User; import com.youlai.boot.system.model.form.*; import com.youlai.boot.config.property.AliyunSmsProperties; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d159a823..8fc2b4f8 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -150,9 +150,9 @@ springdoc: paths-to-match: "/**" packages-to-scan: - com.youlai.boot.system.controller - - com.youlai.boot.platform.auth.controller - - com.youlai.boot.platform.file.controller - - com.youlai.boot.platform.generator.controller + - com.youlai.boot.module.auth.controller + - com.youlai.boot.module.file.controller + - com.youlai.boot.module.generator.controller default-flat-param-object: true # knife4j 接口文档配置 diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index ecdcd7ac..92953031 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -134,9 +134,9 @@ springdoc: paths-to-match: "/**" packages-to-scan: - com.youlai.boot.system.controller - - com.youlai.boot.platform.auth.controller - - com.youlai.boot.platform.file.controller - - com.youlai.boot.platform.generator.controller + - com.youlai.boot.module.auth.controller + - com.youlai.boot.module.file.controller + - com.youlai.boot.module.generator.controller default-flat-param-object: true # knife4j 接口文档配置 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 096386d3..27ddf31e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: active: dev # 代码生成器配置 -generator: +codegen: # 下载代码文件名称 downloadFileName: youlai-admin-code.zip # 后端项目名称 @@ -23,43 +23,43 @@ generator: ## 模板配置 templateConfigs: API: - templatePath: generator/api.ts.vm + templatePath: codegen/api.ts.vm subpackageName: api extension: .ts VIEW: - templatePath: generator/index.vue.vm + templatePath: codegen/index.vue.vm subpackageName: views extension: .vue Controller: - templatePath: generator/controller.java.vm + templatePath: codegen/controller.java.vm subpackageName: controller Service: - templatePath: generator/service.java.vm + templatePath: codegen/service.java.vm subpackageName: service ServiceImpl: - templatePath: generator/serviceImpl.java.vm + templatePath: codegen/serviceImpl.java.vm subpackageName: service.impl Mapper: - templatePath: generator/mapper.java.vm + templatePath: codegen/mapper.java.vm subpackageName: mapper MapperXml: - templatePath: generator/mapper.xml.vm + templatePath: codegen/mapper.xml.vm subpackageName: mapper extension: .xml Converter: - templatePath: generator/converter.java.vm + templatePath: codegen/converter.java.vm subpackageName: converter Query: - templatePath: generator/query.java.vm + templatePath: codegen/query.java.vm subpackageName: model.query Form: - templatePath: generator/form.java.vm + templatePath: codegen/form.java.vm subpackageName: model.form VO: - templatePath: generator/vo.java.vm + templatePath: codegen/vo.java.vm subpackageName: model.vo Entity: - templatePath: generator/entity.java.vm + templatePath: codegen/entity.java.vm subpackageName: model.entity diff --git a/src/main/resources/mapper/DatabaseMapper.xml b/src/main/resources/mapper/DatabaseMapper.xml index c652ebf5..c059e090 100644 --- a/src/main/resources/mapper/DatabaseMapper.xml +++ b/src/main/resources/mapper/DatabaseMapper.xml @@ -2,10 +2,10 @@ - + - SELECT t1.TABLE_NAME , t1.TABLE_COMMENT , @@ -33,7 +33,7 @@ CREATE_TIME DESC - SELECT TABLE_NAME , TABLE_COMMENT , @@ -47,7 +47,7 @@ AND TABLE_NAME = #{tableName} - SELECT COLUMN_NAME, DATA_TYPE, diff --git a/src/main/resources/mapper/GenConfigMapper.xml b/src/main/resources/mapper/GenConfigMapper.xml index 64bf654c..dde77481 100644 --- a/src/main/resources/mapper/GenConfigMapper.xml +++ b/src/main/resources/mapper/GenConfigMapper.xml @@ -2,6 +2,6 @@ - + diff --git a/src/main/resources/mapper/GenFieldConfigMapper.xml b/src/main/resources/mapper/GenFieldConfigMapper.xml index 0bd4db31..44fb3976 100644 --- a/src/main/resources/mapper/GenFieldConfigMapper.xml +++ b/src/main/resources/mapper/GenFieldConfigMapper.xml @@ -2,6 +2,6 @@ - + diff --git a/src/main/resources/templates/generator/api.ts.vm b/src/main/resources/templates/codegen/api.ts.vm similarity index 100% rename from src/main/resources/templates/generator/api.ts.vm rename to src/main/resources/templates/codegen/api.ts.vm diff --git a/src/main/resources/templates/generator/controller.java.vm b/src/main/resources/templates/codegen/controller.java.vm similarity index 100% rename from src/main/resources/templates/generator/controller.java.vm rename to src/main/resources/templates/codegen/controller.java.vm diff --git a/src/main/resources/templates/generator/converter.java.vm b/src/main/resources/templates/codegen/converter.java.vm similarity index 100% rename from src/main/resources/templates/generator/converter.java.vm rename to src/main/resources/templates/codegen/converter.java.vm diff --git a/src/main/resources/templates/generator/entity.java.vm b/src/main/resources/templates/codegen/entity.java.vm similarity index 100% rename from src/main/resources/templates/generator/entity.java.vm rename to src/main/resources/templates/codegen/entity.java.vm diff --git a/src/main/resources/templates/generator/form.java.vm b/src/main/resources/templates/codegen/form.java.vm similarity index 100% rename from src/main/resources/templates/generator/form.java.vm rename to src/main/resources/templates/codegen/form.java.vm diff --git a/src/main/resources/templates/generator/index.vue.vm b/src/main/resources/templates/codegen/index.vue.vm similarity index 100% rename from src/main/resources/templates/generator/index.vue.vm rename to src/main/resources/templates/codegen/index.vue.vm diff --git a/src/main/resources/templates/generator/mapper.java.vm b/src/main/resources/templates/codegen/mapper.java.vm similarity index 100% rename from src/main/resources/templates/generator/mapper.java.vm rename to src/main/resources/templates/codegen/mapper.java.vm diff --git a/src/main/resources/templates/generator/mapper.xml.vm b/src/main/resources/templates/codegen/mapper.xml.vm similarity index 100% rename from src/main/resources/templates/generator/mapper.xml.vm rename to src/main/resources/templates/codegen/mapper.xml.vm diff --git a/src/main/resources/templates/generator/query.java.vm b/src/main/resources/templates/codegen/query.java.vm similarity index 100% rename from src/main/resources/templates/generator/query.java.vm rename to src/main/resources/templates/codegen/query.java.vm diff --git a/src/main/resources/templates/generator/service.java.vm b/src/main/resources/templates/codegen/service.java.vm similarity index 100% rename from src/main/resources/templates/generator/service.java.vm rename to src/main/resources/templates/codegen/service.java.vm diff --git a/src/main/resources/templates/generator/serviceImpl.java.vm b/src/main/resources/templates/codegen/serviceImpl.java.vm similarity index 100% rename from src/main/resources/templates/generator/serviceImpl.java.vm rename to src/main/resources/templates/codegen/serviceImpl.java.vm diff --git a/src/main/resources/templates/generator/vo.java.vm b/src/main/resources/templates/codegen/vo.java.vm similarity index 100% rename from src/main/resources/templates/generator/vo.java.vm rename to src/main/resources/templates/codegen/vo.java.vm diff --git a/src/test/java/com/youlai/boot/system/generator/FastAutoGeneratorTest.java b/src/test/java/com/youlai/boot/system/generator/FastAutoGeneratorTest.java index 8a7116fc..eb3b5681 100644 --- a/src/test/java/com/youlai/boot/system/generator/FastAutoGeneratorTest.java +++ b/src/test/java/com/youlai/boot/system/generator/FastAutoGeneratorTest.java @@ -48,12 +48,12 @@ public class FastAutoGeneratorTest { // 注入配置(设置扩展类的模板路径和包路径) .injectionConfig(consumer -> { List customFiles = new ArrayList<>(); - customFiles.add(new CustomFile.Builder().fileName("VO.java").templatePath("/templates/generator/vo.java.vm").packageName("model.vo").build()); - customFiles.add(new CustomFile.Builder().fileName("BO.java").templatePath("/templates/generator/bo.java.vm").packageName("model.bo").build()); - customFiles.add(new CustomFile.Builder().fileName("PageQuery.java").templatePath("/templates/generator/query.java.vm").packageName("model.query").build()); - customFiles.add(new CustomFile.Builder().fileName("PageVO.java").templatePath("/templates/pageVO.java.vm").packageName("model.vo").build()); - customFiles.add(new CustomFile.Builder().fileName("Form.java").templatePath("/templates/generator/form.java.vm").packageName("model.form").build()); - customFiles.add(new CustomFile.Builder().fileName("Converter.java").templatePath("/templates/generator/converter.java.vm").packageName("converter").build()); + customFiles.add(new CustomFile.Builder().fileName("VO.java").templatePath("/templates/codegen/vo.java.vm").packageName("model.vo").build()); + customFiles.add(new CustomFile.Builder().fileName("BO.java").templatePath("/templates/codegen/bo.java.vm").packageName("model.bo").build()); + customFiles.add(new CustomFile.Builder().fileName("PageQuery.java").templatePath("/templates/codegen/query.java.vm").packageName("model.query").build()); + customFiles.add(new CustomFile.Builder().fileName("PageVO.java").templatePath("/templates/codegen/pageVO.java.vm").packageName("model.vo").build()); + customFiles.add(new CustomFile.Builder().fileName("Form.java").templatePath("/templates/codegen/form.java.vm").packageName("model.form").build()); + customFiles.add(new CustomFile.Builder().fileName("Converter.java").templatePath("/templates/codegen/converter.java.vm").packageName("converter").build()); consumer.customFile(customFiles); consumer.beforeOutputFile((tableInfo, objectMap) -> { // 为每个表生成首字母小写的实体名