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