From bf0e89875223c2de9fa74b6b1eaf4426983d335f Mon Sep 17 00:00:00 2001 From: ray <1490493387@qq.com> Date: Fri, 26 Jul 2024 08:18:43 +0800 Subject: [PATCH] =?UTF-8?q?wip:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/GeneratorController.java | 5 +- .../system/converter/GenConfigConverter.java | 10 ++- .../youlai/system/mapper/DatabaseMapper.java | 7 +- .../system/model/bo/ColumnMetaData.java | 50 +++++++++++ .../youlai/system/model/bo/TableMetaData.java | 45 ++++++++++ .../youlai/system/model/entity/GenConfig.java | 16 ++-- .../youlai/system/model/vo/TablePageVO.java | 10 +-- .../system/service/GeneratorService.java | 3 +- .../service/impl/GeneratorServiceImpl.java | 82 +++++++++++++++---- src/main/resources/mapper/DatabaseMapper.xml | 20 ++++- 10 files changed, 211 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/youlai/system/model/bo/ColumnMetaData.java create mode 100644 src/main/java/com/youlai/system/model/bo/TableMetaData.java diff --git a/src/main/java/com/youlai/system/controller/GeneratorController.java b/src/main/java/com/youlai/system/controller/GeneratorController.java index 05dbce74..e217de96 100644 --- a/src/main/java/com/youlai/system/controller/GeneratorController.java +++ b/src/main/java/com/youlai/system/controller/GeneratorController.java @@ -3,6 +3,7 @@ package com.youlai.system.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.system.common.result.PageResult; import com.youlai.system.common.result.Result; +import com.youlai.system.model.bo.TableMetaData; import com.youlai.system.model.form.GenConfigForm; import com.youlai.system.model.query.TablePageQuery; import com.youlai.system.model.vo.GeneratorPreviewVO; @@ -26,10 +27,10 @@ public class GeneratorController { @Operation(summary = "获取数据表分页列表") @GetMapping("/table/page") - public PageResult getTablePage( + public PageResult getTablePage( TablePageQuery queryParams ) { - Page result = generatorService.getTablePage(queryParams); + Page result = generatorService.getTablePage(queryParams); return PageResult.success(result); } diff --git a/src/main/java/com/youlai/system/converter/GenConfigConverter.java b/src/main/java/com/youlai/system/converter/GenConfigConverter.java index 44a80452..3a4d5377 100644 --- a/src/main/java/com/youlai/system/converter/GenConfigConverter.java +++ b/src/main/java/com/youlai/system/converter/GenConfigConverter.java @@ -26,17 +26,19 @@ public interface GenConfigConverter { @Mapping(source = "fieldConfigs", target = "fieldConfigs") GenConfigForm toGenConfigForm(GenConfig genConfig, List fieldConfigs); - List toFieldConfigList(List fieldConfigs); + List toGenFieldConfigForm(List fieldConfigs); - GenConfigForm.FieldConfig toFieldConfig(GenFieldConfig genFieldConfig); + GenConfigForm.FieldConfig toGenFieldConfigForm(GenFieldConfig genFieldConfig); @Mapping(source = "formData", target = "genConfig") @Mapping(source = "formData.fieldConfigs", target = "fieldConfigs") - GenConfig toGenConfig(GenConfigForm formData); + GenConfig toGenConfigEntity(GenConfigForm formData); @Mapping(source = "formData.fieldConfigs", target = "fieldConfigs") - List toGenFieldConfigList(List fieldConfigs); + List toGenFieldConfigEntity(List fieldConfigs); + + GenFieldConfig toGenFieldConfigEntity(GenConfigForm.FieldConfig fieldConfig); } \ No newline at end of file diff --git a/src/main/java/com/youlai/system/mapper/DatabaseMapper.java b/src/main/java/com/youlai/system/mapper/DatabaseMapper.java index abc91f4a..9ce548a9 100644 --- a/src/main/java/com/youlai/system/mapper/DatabaseMapper.java +++ b/src/main/java/com/youlai/system/mapper/DatabaseMapper.java @@ -2,6 +2,8 @@ package com.youlai.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.system.model.bo.ColumnMetaData; +import com.youlai.system.model.bo.TableMetaData; import com.youlai.system.model.entity.SysDept; import com.youlai.system.model.query.TablePageQuery; import com.youlai.system.model.vo.TableColumnVO; @@ -21,9 +23,10 @@ import java.util.List; public interface DatabaseMapper extends BaseMapper { - Page getTablePage(Page page, TablePageQuery queryParams); + Page getTablePage(Page page, TablePageQuery queryParams); - List getTableColumns(String tableName); + List getTableColumns(String tableName); + TableMetaData getTableMetadata(String tableName); } diff --git a/src/main/java/com/youlai/system/model/bo/ColumnMetaData.java b/src/main/java/com/youlai/system/model/bo/ColumnMetaData.java new file mode 100644 index 00000000..c3137a2a --- /dev/null +++ b/src/main/java/com/youlai/system/model/bo/ColumnMetaData.java @@ -0,0 +1,50 @@ +package com.youlai.system.model.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "数据表字段VO") +@Data +public class ColumnMetaData { + + /** + * 字段名称 + */ + private String columnName; + + /** + * 字段类型 + */ + private String dataType; + + /** + * 字段描述 + */ + private String columnComment; + + /** + * 字段长度 + */ + private Integer characterMaximumLength; + + /** + * 是否主键(1-是 0-否) + */ + private Integer isPrimaryKey; + + /** + * 是否可为空(1-是 0-否) + */ + private String isNullable; + + /** + * 字符集 + */ + private String characterSetName; + + /** + * 排序规则 + */ + private String collationName; + +} diff --git a/src/main/java/com/youlai/system/model/bo/TableMetaData.java b/src/main/java/com/youlai/system/model/bo/TableMetaData.java new file mode 100644 index 00000000..d4b78792 --- /dev/null +++ b/src/main/java/com/youlai/system/model/bo/TableMetaData.java @@ -0,0 +1,45 @@ +package com.youlai.system.model.bo; + +import lombok.Data; + + +/** + * 数据表元数据 + * + * @author Ray + * @since 2.10.0 + */ +@Data +public class TableMetaData { + + /** + * 表名称 + */ + private String tableName; + + /** + * 表描述 + */ + private String tableComment; + + /** + * 排序规则 + */ + private String tableCollation; + + /** + * 存储引擎 + */ + private String engine; + + /** + * 字符集 + */ + private String charset; + + /** + * 创建时间 + */ + private String createTime; + +} diff --git a/src/main/java/com/youlai/system/model/entity/GenConfig.java b/src/main/java/com/youlai/system/model/entity/GenConfig.java index 90a2f844..49420341 100644 --- a/src/main/java/com/youlai/system/model/entity/GenConfig.java +++ b/src/main/java/com/youlai/system/model/entity/GenConfig.java @@ -4,12 +4,18 @@ import com.baomidou.mybatisplus.annotation.*; import com.youlai.system.common.base.BaseEntity; import lombok.Data; +import lombok.Getter; +import lombok.Setter; /** * 代码生成基础配置 + * + * @author Ray + * @since 2.10.0 */ -@TableName(value ="gen_config") -@Data +@TableName(value = "gen_config") +@Getter +@Setter public class GenConfig extends BaseEntity { /** @@ -28,14 +34,14 @@ public class GenConfig extends BaseEntity { private String moduleName; /** - * 实体名 + * 实体类名 */ private String entityName; /** - * 类描述 + * 业务名 */ - private String comment; + private String businessName; /** * 上级菜单ID diff --git a/src/main/java/com/youlai/system/model/vo/TablePageVO.java b/src/main/java/com/youlai/system/model/vo/TablePageVO.java index b9756f58..8c709831 100644 --- a/src/main/java/com/youlai/system/model/vo/TablePageVO.java +++ b/src/main/java/com/youlai/system/model/vo/TablePageVO.java @@ -4,23 +4,23 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -@Schema(description = "数据表分页VO") +@Schema(description = "数据表VO") @Data public class TablePageVO { - @Schema(description = "数据表名称", example = "sys_user") + @Schema(description = "表名称", example = "sys_user") private String tableName; - @Schema(description = "数据表注释",example = "用户表") + @Schema(description = "表描述",example = "用户表") private String tableComment; - @Schema(description = "数据表排序规则",example = "用户表") + @Schema(description = "表排序规则",example = "utf8mb4_general_ci") private String tableCollation; @Schema(description = "存储引擎",example = "InnoDB") private String engine; - @Schema(description = "字符集",example = "utf8mb4_general_ci") + @Schema(description = "字符集",example = "utf8mb4") private String charset; @Schema(description = "创建时间",example = "2023-08-08 08:08:08") diff --git a/src/main/java/com/youlai/system/service/GeneratorService.java b/src/main/java/com/youlai/system/service/GeneratorService.java index 0187f6a6..e6fd51ba 100644 --- a/src/main/java/com/youlai/system/service/GeneratorService.java +++ b/src/main/java/com/youlai/system/service/GeneratorService.java @@ -1,6 +1,7 @@ package com.youlai.system.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.system.model.bo.TableMetaData; import com.youlai.system.model.form.GenConfigForm; import com.youlai.system.model.query.TablePageQuery; import com.youlai.system.model.vo.GeneratorPreviewVO; @@ -23,7 +24,7 @@ public interface GeneratorService { * @param queryParams 查询参数 * @return */ - Page getTablePage(TablePageQuery queryParams); + Page getTablePage(TablePageQuery queryParams); /** * 获取预览生成代码 diff --git a/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java b/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java index 9d3b176b..8f3105f7 100644 --- a/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java @@ -11,17 +11,18 @@ 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.system.SystemApplication; import com.youlai.system.config.property.GeneratorProperties; import com.youlai.system.converter.GenConfigConverter; import com.youlai.system.exception.BusinessException; import com.youlai.system.mapper.DatabaseMapper; +import com.youlai.system.model.bo.ColumnMetaData; +import com.youlai.system.model.bo.TableMetaData; import com.youlai.system.model.entity.GenConfig; import com.youlai.system.model.entity.GenFieldConfig; import com.youlai.system.model.form.GenConfigForm; import com.youlai.system.model.query.TablePageQuery; import com.youlai.system.model.vo.GeneratorPreviewVO; -import com.youlai.system.model.vo.TableColumnVO; -import com.youlai.system.model.vo.TablePageVO; import com.youlai.system.service.GeneratorService; import com.youlai.system.service.GenConfigService; import com.youlai.system.service.GenFieldConfigService; @@ -43,15 +44,14 @@ import java.util.*; @RequiredArgsConstructor public class GeneratorServiceImpl implements GeneratorService { + @Value("${spring.application.name}") + private String applicationName; + private final DatabaseMapper databaseMapper; private final GeneratorProperties generatorProperties; private final GenConfigService genConfigService; private final GenFieldConfigService genFieldConfigService; - // 注入 spring.application.name - @Value("${spring.application.name}") - private String applicationName; - private final GenConfigConverter genConfigConverter; /** @@ -60,8 +60,8 @@ public class GeneratorServiceImpl implements GeneratorService { * @param queryParams 查询参数 * @return 分页结果 */ - public Page getTablePage(TablePageQuery queryParams) { - Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); + public Page getTablePage(TablePageQuery queryParams) { + Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); return databaseMapper.getTablePage(page, queryParams); } @@ -79,23 +79,73 @@ public class GeneratorServiceImpl implements GeneratorService { .eq(GenConfig::getTableName, tableName) .last("LIMIT 1") ); + // 如果没有代码生成配置,则根据表的元数据生成默认配置 + if (genConfig == null) { + TableMetaData tableMetadata = databaseMapper.getTableMetadata(tableName); + Assert.isTrue(tableMetadata != null, "未找到表元数据"); - // 查询字段生成配置 - List fieldConfigs = genFieldConfigService.list( - new LambdaQueryWrapper<>(GenFieldConfig.class) - .eq(GenFieldConfig::getConfigId, genConfig.getId()) - ); - GenConfigForm configFormData = genConfigConverter.toGenConfigForm(genConfig, fieldConfigs); + 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); + + String packageName = SystemApplication.class.getPackageName(); + genConfig.setPackageName(packageName); + + } + + + List genFieldConfigs = null; + + // 获取表的列信息 + List tableColumns = databaseMapper.getTableColumns(tableName); + + if (CollectionUtil.isNotEmpty(tableColumns)) { + + // 查询字段生成配置 + List configList = genFieldConfigService.list( + new LambdaQueryWrapper<>(GenFieldConfig.class) + .eq(GenFieldConfig::getConfigId, genConfig.getId()) + ); + genFieldConfigs = new ArrayList<>(); + for (ColumnMetaData tableColumn : tableColumns) { + GenFieldConfig fieldConfig = new GenFieldConfig(); + fieldConfig.setFieldName(tableColumn.getColumnName()); + fieldConfig.setFieldType(tableColumn.getDataType()); + fieldConfig.setComment(tableColumn.getColumnComment()); + + + // 如果没有字段生成配置,则根据表的元数据生成默认配置 + if (CollectionUtil.isNotEmpty(configList)) { + for (GenFieldConfig config : configList) { + if (StrUtil.equals(config.getFieldName(), fieldConfig.getFieldName())) { + fieldConfig = config; + break; + } + } + } + + genFieldConfigs.add(fieldConfig); + } + } + + GenConfigForm configFormData = genConfigConverter.toGenConfigForm(genConfig, genFieldConfigs); return configFormData; } @Override public void saveGenConfig(GenConfigForm formData) { - GenConfig genConfig = genConfigConverter.toGenConfig(formData); + GenConfig genConfig = genConfigConverter.toGenConfigEntity(formData); genConfigService.saveOrUpdate(genConfig); - List genFieldConfigs = genConfigConverter.toGenFieldConfigList(formData.getFieldConfigs()); + List genFieldConfigs = genConfigConverter.toGenFieldConfigEntity(formData.getFieldConfigs()); if (CollectionUtil.isEmpty(genFieldConfigs)) { throw new BusinessException("字段配置不能为空"); diff --git a/src/main/resources/mapper/DatabaseMapper.xml b/src/main/resources/mapper/DatabaseMapper.xml index df33c68f..7aecef51 100644 --- a/src/main/resources/mapper/DatabaseMapper.xml +++ b/src/main/resources/mapper/DatabaseMapper.xml @@ -5,7 +5,7 @@ - SELECT TABLE_NAME , TABLE_COMMENT , @@ -24,7 +24,21 @@ CREATE_TIME DESC - + SELECT + TABLE_NAME , + TABLE_COMMENT , + TABLE_COLLATION, + ENGINE, + CREATE_TIME + FROM + information_schema.tables + WHERE + TABLE_SCHEMA = (SELECT DATABASE()) + AND TABLE_NAME = #{tableName} + + + + +