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 | 1 | package cn.iocoder.dashboard.modules.tool.service.codegen.impl; |
| 2 | 2 | |
| 3 | 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 | 12 | import cn.iocoder.dashboard.modules.tool.service.codegen.ToolCodegenService; |
| 12 | -import com.google.common.collect.Sets; | |
| 13 | 13 | import org.springframework.stereotype.Service; |
| 14 | 14 | import org.springframework.transaction.annotation.Transactional; |
| 15 | 15 | |
| 16 | 16 | import javax.annotation.Resource; |
| 17 | -import java.math.BigDecimal; | |
| 18 | -import java.util.*; | |
| 17 | +import java.util.List; | |
| 19 | 18 | |
| 20 | 19 | /** |
| 21 | 20 | * 代码生成 Service 实现类 |
| ... | ... | @@ -25,74 +24,6 @@ import java.util.*; |
| 25 | 24 | @Service |
| 26 | 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 | 27 | @Resource |
| 97 | 28 | private ToolInformationSchemaTableMapper informationSchemaTableMapper; |
| 98 | 29 | @Resource |
| ... | ... | @@ -102,6 +33,11 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { |
| 102 | 33 | @Resource |
| 103 | 34 | private ToolCodegenColumnMapper codegenColumnMapper; |
| 104 | 35 | |
| 36 | + @Resource | |
| 37 | + private ToolCodegenBuilder codegenBuilder; | |
| 38 | + @Resource | |
| 39 | + private ToolCodegenEngine codegenEngine; | |
| 40 | + | |
| 105 | 41 | @Override |
| 106 | 42 | @Transactional |
| 107 | 43 | public Long createCodegenTable(String tableName) { |
| ... | ... | @@ -119,102 +55,16 @@ public class ToolCodegenServiceImpl implements ToolCodegenService { |
| 119 | 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 | 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 | 63 | columns.forEach(column -> { |
| 129 | - initColumnDefault(column); | |
| 130 | 64 | column.setTableId(table.getId()); |
| 131 | 65 | codegenColumnMapper.insert(column); // TODO 批量插入 |
| 132 | 66 | }); |
| 133 | 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 | } | ... | ... |