Commit 6c5c32c845468706274f6c074ef6222748d8611d
1 parent
1bea2ea7
抽象出 ToolCodegenBuilder 类,负责 table 和 column 的构建,让 ToolCodegenService 专注于逻辑的组合
Showing
2 changed files
with
210 additions
and
168 deletions
src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenBuilder.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.tool.service.codegen.impl; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.map.MapUtil; | ||
| 4 | +import cn.hutool.core.util.StrUtil; | ||
| 5 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||
| 6 | +import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; | ||
| 7 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; | ||
| 8 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; | ||
| 9 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; | ||
| 10 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; | ||
| 11 | +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnHtmlTypeEnum; | ||
| 12 | +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenColumnListConditionEnum; | ||
| 13 | +import cn.iocoder.dashboard.modules.tool.enums.codegen.ToolCodegenTemplateTypeEnum; | ||
| 14 | +import com.google.common.collect.Sets; | ||
| 15 | +import org.springframework.stereotype.Component; | ||
| 16 | + | ||
| 17 | +import java.math.BigDecimal; | ||
| 18 | +import java.util.*; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + * 代码生成器的 Builder,负责: | ||
| 22 | + * 1. 将数据库的表 {@link ToolInformationSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO} | ||
| 23 | + * 2. 将数据库的列 {@link ToolInformationSchemaColumnDO} 构定义,建成 {@link ToolCodegenColumnDO} | ||
| 24 | + */ | ||
| 25 | +@Component | ||
| 26 | +public class ToolCodegenBuilder { | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 | ||
| 30 | + * 注意,字段的匹配以后缀的方式 | ||
| 31 | + */ | ||
| 32 | + private static final Map<String, ToolCodegenColumnListConditionEnum> columnListOperationConditionMappings = | ||
| 33 | + MapUtil.<String, ToolCodegenColumnListConditionEnum>builder() | ||
| 34 | + .put("name", ToolCodegenColumnListConditionEnum.LIKE) | ||
| 35 | + .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) | ||
| 36 | + .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) | ||
| 37 | + .build(); | ||
| 38 | + | ||
| 39 | + /** | ||
| 40 | + * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 | ||
| 41 | + * 注意,字段的匹配以后缀的方式 | ||
| 42 | + */ | ||
| 43 | + private static final Map<String, ToolCodegenColumnHtmlTypeEnum> columnHtmlTypeMappings = | ||
| 44 | + MapUtil.<String, ToolCodegenColumnHtmlTypeEnum>builder() | ||
| 45 | + .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) | ||
| 46 | + .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) | ||
| 47 | + .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) | ||
| 48 | + .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) | ||
| 49 | + .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) | ||
| 50 | + .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) | ||
| 51 | + .build(); | ||
| 52 | + | ||
| 53 | + /** | ||
| 54 | + * 新增操作,不需要传递的字段 | ||
| 55 | + */ | ||
| 56 | + private static final Set<String> CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); | ||
| 57 | + /** | ||
| 58 | + * 修改操作,不需要传递的字段 | ||
| 59 | + */ | ||
| 60 | + private static final Set<String> UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); | ||
| 61 | + /** | ||
| 62 | + * 列表操作的条件,不需要传递的字段 | ||
| 63 | + */ | ||
| 64 | + private static final Set<String> LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); | ||
| 65 | + /** | ||
| 66 | + * 列表操作的结果,不需要返回的字段 | ||
| 67 | + */ | ||
| 68 | + private static final Set<String> LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); | ||
| 69 | + | ||
| 70 | + /** | ||
| 71 | + * Java 类型与 MySQL 类型的映射关系 | ||
| 72 | + */ | ||
| 73 | + private static final Map<String, Set<String>> javaTypeMappings = MapUtil.<String, Set<String>>builder() | ||
| 74 | + .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) | ||
| 75 | + .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) | ||
| 76 | + .put(Long.class.getSimpleName(), Collections.singleton("bigint")) | ||
| 77 | + .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) | ||
| 78 | + .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) | ||
| 79 | + .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 | ||
| 80 | + "char", "varchar", "nvarchar", "varchar2")) // 短文本 | ||
| 81 | + .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) | ||
| 82 | + .build(); | ||
| 83 | + | ||
| 84 | + static { | ||
| 85 | + // 处理 OPERATION 相关的字段 | ||
| 86 | + Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { | ||
| 87 | + CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 88 | + UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 89 | + LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 90 | + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); | ||
| 91 | + }); | ||
| 92 | + LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 | ||
| 93 | + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + public ToolCodegenTableDO buildTable(ToolInformationSchemaTableDO schemaTable) { | ||
| 97 | + ToolCodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); | ||
| 98 | + initTableDefault(table); | ||
| 99 | + return table; | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * 初始化 Table 表的默认字段 | ||
| 104 | + * | ||
| 105 | + * @param table 表定义 | ||
| 106 | + */ | ||
| 107 | + private void initTableDefault(ToolCodegenTableDO table) { | ||
| 108 | + table.setModuleName(StrUtil.subBefore(table.getTableName(), | ||
| 109 | + '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 | ||
| 110 | + table.setBusinessName(StrUtil.subAfter(table.getTableName(), | ||
| 111 | + '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 | ||
| 112 | + table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 | ||
| 113 | + table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 | ||
| 114 | + table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 | ||
| 115 | + '表', true)); | ||
| 116 | + table.setAuthor("芋艿"); // TODO 稍后改成创建人 | ||
| 117 | + table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + public List<ToolCodegenColumnDO> buildColumns(List<ToolInformationSchemaColumnDO> schemaColumns) { | ||
| 121 | + List<ToolCodegenColumnDO> columns = CodegenConvert.INSTANCE.convertList(schemaColumns); | ||
| 122 | + columns.forEach(this::initColumnDefault); | ||
| 123 | + return columns; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + /** | ||
| 127 | + * 初始化 Column 列的默认字段 | ||
| 128 | + * | ||
| 129 | + * @param column 列定义 | ||
| 130 | + */ | ||
| 131 | + private void initColumnDefault(ToolCodegenColumnDO column) { | ||
| 132 | + // 处理 Java 相关的字段的默认值 | ||
| 133 | + processColumnJava(column); | ||
| 134 | + // 处理 CRUD 相关的字段的默认值 | ||
| 135 | + processColumnOperation(column); | ||
| 136 | + // 处理 UI 相关的字段的默认值 | ||
| 137 | + processColumnUI(column); | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + private void processColumnJava(ToolCodegenColumnDO column) { | ||
| 141 | + // 处理 javaField 字段 | ||
| 142 | + column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); | ||
| 143 | + // 处理 dictType 字段,暂无 | ||
| 144 | + // 处理 javaType 字段 | ||
| 145 | + String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); | ||
| 146 | + javaTypeMappings.entrySet().stream() | ||
| 147 | + .filter(entry -> entry.getValue().contains(dbType)) | ||
| 148 | + .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); | ||
| 149 | + if (column.getJavaType() == null) { | ||
| 150 | + throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", | ||
| 151 | + column.getColumnName(), column.getColumnType())); | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + private void processColumnOperation(ToolCodegenColumnDO column) { | ||
| 156 | + // 处理 createOperation 字段 | ||
| 157 | + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 158 | + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 | ||
| 159 | + // 处理 updateOperation 字段 | ||
| 160 | + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 161 | + || column.getPrimaryKey()); // 对于主键,更新时需要传递 | ||
| 162 | + // 处理 listOperation 字段 | ||
| 163 | + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 164 | + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 | ||
| 165 | + // 处理 listOperationCondition 字段 | ||
| 166 | + columnListOperationConditionMappings.entrySet().stream() | ||
| 167 | + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) | ||
| 168 | + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); | ||
| 169 | + if (column.getListOperationCondition() == null) { | ||
| 170 | + column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); | ||
| 171 | + } | ||
| 172 | + // 处理 listOperationResult 字段 | ||
| 173 | + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + private void processColumnUI(ToolCodegenColumnDO column) { | ||
| 177 | + // 基于后缀进行匹配 | ||
| 178 | + columnHtmlTypeMappings.entrySet().stream() | ||
| 179 | + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) | ||
| 180 | + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); | ||
| 181 | + // 如果是 Boolean 类型时,设置为 radio 类型. | ||
| 182 | + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. | ||
| 183 | + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { | ||
| 184 | + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); | ||
| 185 | + } | ||
| 186 | + // 兜底,设置默认为 input 类型 | ||
| 187 | + if (column.getHtmlType() == null) { | ||
| 188 | + column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); | ||
| 189 | + } | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | +} |
src/main/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImpl.java
| 1 | package cn.iocoder.dashboard.modules.tool.service.codegen.impl; | 1 | package cn.iocoder.dashboard.modules.tool.service.codegen.impl; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.map.MapUtil; | ||
| 5 | -import cn.hutool.core.util.StrUtil; | ||
| 6 | -import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||
| 7 | -import cn.iocoder.dashboard.modules.tool.convert.codegen.CodegenConvert; | ||
| 8 | -import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.*; | ||
| 9 | -import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.*; | ||
| 10 | -import cn.iocoder.dashboard.modules.tool.enums.codegen.*; | 4 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenColumnMapper; |
| 5 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolCodegenTableMapper; | ||
| 6 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaColumnMapper; | ||
| 7 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dao.coegen.ToolInformationSchemaTableMapper; | ||
| 8 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenColumnDO; | ||
| 9 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolCodegenTableDO; | ||
| 10 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaColumnDO; | ||
| 11 | +import cn.iocoder.dashboard.modules.tool.dal.mysql.dataobject.codegen.ToolInformationSchemaTableDO; | ||
| 11 | import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; | 12 | import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; |
| 12 | -import com.google.common.collect.Sets; | ||
| 13 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 14 | import org.springframework.transaction.annotation.Transactional; | 14 | import org.springframework.transaction.annotation.Transactional; |
| 15 | 15 | ||
| 16 | import javax.annotation.Resource; | 16 | import javax.annotation.Resource; |
| 17 | -import java.math.BigDecimal; | ||
| 18 | -import java.util.*; | 17 | +import java.util.List; |
| 19 | 18 | ||
| 20 | /** | 19 | /** |
| 21 | * 代码生成 Service 实现类 | 20 | * 代码生成 Service 实现类 |
| @@ -25,74 +24,6 @@ import java.util.*; | @@ -25,74 +24,6 @@ import java.util.*; | ||
| 25 | @Service | 24 | @Service |
| 26 | public class ToolCodegenServiceImpl implements ToolCodegenService { | 25 | public class ToolCodegenServiceImpl implements ToolCodegenService { |
| 27 | 26 | ||
| 28 | - /** | ||
| 29 | - * 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射 | ||
| 30 | - * 注意,字段的匹配以后缀的方式 | ||
| 31 | - */ | ||
| 32 | - private static final Map<String, ToolCodegenColumnListConditionEnum> columnListOperationConditionMappings = | ||
| 33 | - MapUtil.<String, ToolCodegenColumnListConditionEnum>builder() | ||
| 34 | - .put("name", ToolCodegenColumnListConditionEnum.LIKE) | ||
| 35 | - .put("time", ToolCodegenColumnListConditionEnum.BETWEEN) | ||
| 36 | - .put("date", ToolCodegenColumnListConditionEnum.BETWEEN) | ||
| 37 | - .build(); | ||
| 38 | - | ||
| 39 | - /** | ||
| 40 | - * 字段名与 {@link ToolCodegenColumnHtmlTypeEnum} 的默认映射 | ||
| 41 | - * 注意,字段的匹配以后缀的方式 | ||
| 42 | - */ | ||
| 43 | - private static final Map<String, ToolCodegenColumnHtmlTypeEnum> columnHtmlTypeMappings = | ||
| 44 | - MapUtil.<String, ToolCodegenColumnHtmlTypeEnum>builder() | ||
| 45 | - .put("status", ToolCodegenColumnHtmlTypeEnum.RADIO) | ||
| 46 | - .put("sex", ToolCodegenColumnHtmlTypeEnum.RADIO) | ||
| 47 | - .put("type", ToolCodegenColumnHtmlTypeEnum.SELECT) | ||
| 48 | - .put("image", ToolCodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) | ||
| 49 | - .put("file", ToolCodegenColumnHtmlTypeEnum.UPLOAD_FILE) | ||
| 50 | - .put("content", ToolCodegenColumnHtmlTypeEnum.EDITOR) | ||
| 51 | - .build(); | ||
| 52 | - | ||
| 53 | - /** | ||
| 54 | - * 新增操作,不需要传递的字段 | ||
| 55 | - */ | ||
| 56 | - private static final Set<String> CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); | ||
| 57 | - /** | ||
| 58 | - * 修改操作,不需要传递的字段 | ||
| 59 | - */ | ||
| 60 | - private static final Set<String> UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); | ||
| 61 | - /** | ||
| 62 | - * 列表操作的条件,不需要传递的字段 | ||
| 63 | - */ | ||
| 64 | - private static final Set<String> LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); | ||
| 65 | - /** | ||
| 66 | - * 列表操作的结果,不需要返回的字段 | ||
| 67 | - */ | ||
| 68 | - private static final Set<String> LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); | ||
| 69 | - | ||
| 70 | - /** | ||
| 71 | - * Java 类型与 MySQL 类型的映射关系 | ||
| 72 | - */ | ||
| 73 | - private static final Map<String, Set<String>> javaTypeMappings = MapUtil.<String, Set<String>>builder() | ||
| 74 | - .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit")) | ||
| 75 | - .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int")) | ||
| 76 | - .put(Long.class.getSimpleName(), Collections.singleton("bigint")) | ||
| 77 | - .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double")) | ||
| 78 | - .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric")) | ||
| 79 | - .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本 | ||
| 80 | - "char", "varchar", "nvarchar", "varchar2")) // 短文本 | ||
| 81 | - .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp")) | ||
| 82 | - .build(); | ||
| 83 | - | ||
| 84 | - static { | ||
| 85 | - // 处理 OPERATION 相关的字段 | ||
| 86 | - Arrays.stream(BaseDO.class.getDeclaredFields()).forEach(field -> { | ||
| 87 | - CREATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 88 | - UPDATE_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 89 | - LIST_OPERATION_EXCLUDE_COLUMN.add(field.getName()); | ||
| 90 | - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.add(field.getName()); | ||
| 91 | - }); | ||
| 92 | - LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的 | ||
| 93 | - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的 | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | @Resource | 27 | @Resource |
| 97 | private ToolInformationSchemaTableMapper informationSchemaTableMapper; | 28 | private ToolInformationSchemaTableMapper informationSchemaTableMapper; |
| 98 | @Resource | 29 | @Resource |
| @@ -102,6 +33,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { | @@ -102,6 +33,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { | ||
| 102 | @Resource | 33 | @Resource |
| 103 | private ToolCodegenColumnMapper codegenColumnMapper; | 34 | private ToolCodegenColumnMapper codegenColumnMapper; |
| 104 | 35 | ||
| 36 | + @Resource | ||
| 37 | + private ToolCodegenBuilder codegenBuilder; | ||
| 38 | + @Resource | ||
| 39 | + private ToolCodegenEngine codegenEngine; | ||
| 40 | + | ||
| 105 | @Override | 41 | @Override |
| 106 | @Transactional | 42 | @Transactional |
| 107 | public Long createCodegenTable(String tableName) { | 43 | public Long createCodegenTable(String tableName) { |
| @@ -119,102 +55,16 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { | @@ -119,102 +55,16 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { | ||
| 119 | throw new RuntimeException(""); // TODO | 55 | throw new RuntimeException(""); // TODO |
| 120 | } | 56 | } |
| 121 | 57 | ||
| 122 | - // 将 table 插入到数据库 | ||
| 123 | - ToolCodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable); | ||
| 124 | - initTableDefault(table); | 58 | + // 构建 ToolCodegenTableDO 对象,插入到 DB 中 |
| 59 | + ToolCodegenTableDO table = codegenBuilder.buildTable(schemaTable); | ||
| 125 | codegenTableMapper.insert(table); | 60 | codegenTableMapper.insert(table); |
| 126 | - // 将 column 插入到数据库 | ||
| 127 | - List<ToolCodegenColumnDO> columns = CodegenConvert.INSTANCE.convertList(schemaColumns); | 61 | + // 构建 ToolCodegenColumnDO 数组,插入到 DB 中 |
| 62 | + List<ToolCodegenColumnDO> columns = codegenBuilder.buildColumns(schemaColumns); | ||
| 128 | columns.forEach(column -> { | 63 | columns.forEach(column -> { |
| 129 | - initColumnDefault(column); | ||
| 130 | column.setTableId(table.getId()); | 64 | column.setTableId(table.getId()); |
| 131 | codegenColumnMapper.insert(column); // TODO 批量插入 | 65 | codegenColumnMapper.insert(column); // TODO 批量插入 |
| 132 | }); | 66 | }); |
| 133 | return table.getId(); | 67 | return table.getId(); |
| 134 | } | 68 | } |
| 135 | 69 | ||
| 136 | - /** | ||
| 137 | - * 初始化 Table 表的默认字段 | ||
| 138 | - * | ||
| 139 | - * @param table 表定义 | ||
| 140 | - */ | ||
| 141 | - private void initTableDefault(ToolCodegenTableDO table) { | ||
| 142 | - table.setModuleName(StrUtil.subBefore(table.getTableName(), | ||
| 143 | - '_', false)); // 第一个 _ 前缀的前面,作为 module 名字 | ||
| 144 | - table.setBusinessName(StrUtil.subAfter(table.getTableName(), | ||
| 145 | - '_', false)); // 第一个 _ 前缀的后面,作为 module 名字 | ||
| 146 | - table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰 | ||
| 147 | - table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写 | ||
| 148 | - table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述 | ||
| 149 | - '表', true)); | ||
| 150 | - table.setAuthor("芋艿"); // TODO 稍后改成创建人 | ||
| 151 | - table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType()); | ||
| 152 | - } | ||
| 153 | - | ||
| 154 | - /** | ||
| 155 | - * 初始化 Column 列的默认字段 | ||
| 156 | - * | ||
| 157 | - * @param column 列定义 | ||
| 158 | - */ | ||
| 159 | - private void initColumnDefault(ToolCodegenColumnDO column) { | ||
| 160 | - // 处理 Java 相关的字段的默认值 | ||
| 161 | - processColumnJava(column); | ||
| 162 | - // 处理 CRUD 相关的字段的默认值 | ||
| 163 | - processColumnOperation(column); | ||
| 164 | - // 处理 UI 相关的字段的默认值 | ||
| 165 | - processColumnUI(column); | ||
| 166 | - } | ||
| 167 | - | ||
| 168 | - private void processColumnJava(ToolCodegenColumnDO column) { | ||
| 169 | - // 处理 javaField 字段 | ||
| 170 | - column.setJavaField(StrUtil.toCamelCase(column.getColumnName())); | ||
| 171 | - // 处理 dictType 字段,暂无 | ||
| 172 | - // 处理 javaType 字段 | ||
| 173 | - String dbType = StrUtil.subBefore(column.getColumnType(), '(', false); | ||
| 174 | - javaTypeMappings.entrySet().stream() | ||
| 175 | - .filter(entry -> entry.getValue().contains(dbType)) | ||
| 176 | - .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey())); | ||
| 177 | - if (column.getJavaType() == null) { | ||
| 178 | - throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型", | ||
| 179 | - column.getColumnName(), column.getColumnType())); | ||
| 180 | - } | ||
| 181 | - } | ||
| 182 | - | ||
| 183 | - private void processColumnOperation(ToolCodegenColumnDO column) { | ||
| 184 | - // 处理 createOperation 字段 | ||
| 185 | - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 186 | - && !column.getPrimaryKey()); // 对于主键,创建时无需传递 | ||
| 187 | - // 处理 updateOperation 字段 | ||
| 188 | - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 189 | - || column.getPrimaryKey()); // 对于主键,更新时需要传递 | ||
| 190 | - // 处理 listOperation 字段 | ||
| 191 | - column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) | ||
| 192 | - && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 | ||
| 193 | - // 处理 listOperationCondition 字段 | ||
| 194 | - columnListOperationConditionMappings.entrySet().stream() | ||
| 195 | - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) | ||
| 196 | - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); | ||
| 197 | - if (column.getListOperationCondition() == null) { | ||
| 198 | - column.setListOperationCondition(ToolCodegenColumnListConditionEnum.EQ.getCondition()); | ||
| 199 | - } | ||
| 200 | - // 处理 listOperationResult 字段 | ||
| 201 | - column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); | ||
| 202 | - } | ||
| 203 | - | ||
| 204 | - private void processColumnUI(ToolCodegenColumnDO column) { | ||
| 205 | - // 基于后缀进行匹配 | ||
| 206 | - columnHtmlTypeMappings.entrySet().stream() | ||
| 207 | - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) | ||
| 208 | - .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); | ||
| 209 | - // 如果是 Boolean 类型时,设置为 radio 类型. | ||
| 210 | - // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. | ||
| 211 | - if (Boolean.class.getSimpleName().equals(column.getJavaType())) { | ||
| 212 | - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.RADIO.getType()); | ||
| 213 | - } | ||
| 214 | - // 兜底,设置默认为 input 类型 | ||
| 215 | - if (column.getHtmlType() == null) { | ||
| 216 | - column.setHtmlType(ToolCodegenColumnHtmlTypeEnum.INPUT.getType()); | ||
| 217 | - } | ||
| 218 | - } | ||
| 219 | - | ||
| 220 | } | 70 | } |