refactor(generator): 重构代码生成配置

Closes #42
This commit is contained in:
Charles7c 2024-03-11 21:22:54 +08:00
parent dee3cf64cb
commit 7031a51cd4
17 changed files with 72 additions and 56 deletions

View File

@ -16,14 +16,13 @@
package top.charles7c.continew.admin.generator.config.properties;
import java.util.Map;
import cn.hutool.core.map.MapUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import cn.hutool.core.map.MapUtil;
import java.util.List;
import java.util.Map;
/**
* 代码生成器配置属性
@ -39,7 +38,12 @@ public class GeneratorProperties {
/**
* 排除数据表哪些数据表不展示在代码生成中
*/
private String[] excludeTables;
private String[] excludeTables = new String[0];
/**
* 类型映射
*/
private Map<String, Map<String, List<String>>> typeMappings = MapUtil.newHashMap();
/**
* 模板配置

View File

@ -19,8 +19,6 @@ package top.charles7c.continew.admin.generator.model.entity;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.meta.Column;
import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.dialect.PropsUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
@ -169,10 +167,4 @@ public class FieldConfigDO implements Serializable {
this.columnName = columnName;
this.fieldName = StrUtil.toCamelCase(this.columnName);
}
public void setColumnType(String columnType) {
this.columnType = columnType;
Props generatorProp = PropsUtil.get("generator");
this.fieldType = generatorProp.getStr(columnType);
}
}

View File

@ -46,6 +46,7 @@ import top.charles7c.continew.admin.generator.service.GeneratorService;
import top.charles7c.continew.starter.core.constant.StringConstants;
import top.charles7c.continew.starter.core.exception.BusinessException;
import top.charles7c.continew.starter.core.util.TemplateUtils;
import top.charles7c.continew.starter.data.core.enums.DatabaseType;
import top.charles7c.continew.starter.data.core.util.MetaUtils;
import top.charles7c.continew.starter.data.core.util.Table;
import top.charles7c.continew.starter.core.util.validate.CheckUtils;
@ -136,6 +137,12 @@ public class GeneratorServiceImpl implements GeneratorService {
List<FieldConfigDO> latestFieldConfigList = new ArrayList<>();
// 获取最新数据表列信息
Collection<Column> columnList = MetaUtils.getColumns(dataSource, tableName);
// 获取数据库对应的类型映射配置
DatabaseType databaseType = MetaUtils.getDatabaseType(dataSource);
Map<String, List<String>> typeMappingMap = generatorProperties.getTypeMappings()
.get(databaseType.getDatabase());
CheckUtils.throwIfEmpty(typeMappingMap, "请先配置对应数据库的类型映射");
Set<Map.Entry<String, List<String>>> typeMappingEntrySet = typeMappingMap.entrySet();
// 新增或更新字段配置
Map<String, FieldConfigDO> fieldConfigMap = fieldConfigList.stream()
.collect(Collectors.toMap(FieldConfigDO::getColumnName, Function.identity(), (key1, key2) -> key2));
@ -143,13 +150,19 @@ public class GeneratorServiceImpl implements GeneratorService {
for (Column column : columnList) {
FieldConfigDO fieldConfig = Optional.ofNullable(fieldConfigMap.get(column.getName()))
.orElseGet(() -> new FieldConfigDO(column));
fieldConfig.setFieldSort(i++);
// 更新已有字段配置
if (null != fieldConfig.getCreateTime()) {
String columnType = StrUtil.splitToArray(column.getTypeName(), StringConstants.SPACE)[0].toLowerCase();
fieldConfig.setColumnType(columnType);
fieldConfig.setColumnSize(Convert.toStr(column.getSize()));
}
String fieldType = typeMappingEntrySet.stream()
.filter(entry -> entry.getValue().contains(fieldConfig.getColumnType()))
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
fieldConfig.setFieldType(fieldType);
fieldConfig.setFieldSort(i++);
latestFieldConfigList.add(fieldConfig);
}
return latestFieldConfigList;
@ -232,13 +245,13 @@ public class GeneratorServiceImpl implements GeneratorService {
// 渲染前端代码
// api 代码
genConfigMap.put("fieldConfigs", fieldConfigList);
String apiContent = TemplateUtils.render("generator/api.ftl", genConfigMap);
String apiContent = TemplateUtils.render("api.ftl", genConfigMap);
GeneratePreviewResp apiCodePreview = new GeneratePreviewResp();
apiCodePreview.setFileName(classNamePrefix.toLowerCase() + ".ts");
apiCodePreview.setContent(apiContent);
generatePreviewList.add(apiCodePreview);
// view 代码
String viewContent = TemplateUtils.render("generator/index.ftl", genConfigMap);
String viewContent = TemplateUtils.render("index.ftl", genConfigMap);
GeneratePreviewResp viewCodePreview = new GeneratePreviewResp();
viewCodePreview.setFileName("index.vue");
viewCodePreview.setContent(viewContent);
@ -260,9 +273,9 @@ public class GeneratorServiceImpl implements GeneratorService {
// 1.确定后端代码基础路径
// 例如D:/continew-admin
String projectPath = SystemUtil.getUserInfo().getCurrentDir();
// 例如D:/continew-admin/continew-admin-tool
// 例如D:/continew-admin/continew-admin-system
File backendModuleFile = new File(projectPath, genConfig.getModuleName());
// 例如D:/continew-admin/continew-admin-tool/src/main/java/top/charles7c/continew/admin/tool
// 例如D:/continew-admin/continew-admin-system/src/main/java/top/charles7c/continew/admin/system
List<String> backendModuleChildPathList = CollUtil.newArrayList("src", "main", "java");
backendModuleChildPathList.addAll(StrUtil.split(packageName, StringConstants.DOT));
File backendParentFile = FileUtil.file(backendModuleFile, backendModuleChildPathList
@ -273,7 +286,7 @@ public class GeneratorServiceImpl implements GeneratorService {
.toList();
Map<String, TemplateConfig> templateConfigMap = generatorProperties.getTemplateConfigs();
for (GeneratePreviewResp codePreview : backendCodePreviewList) {
// 例如D:/continew-admin/continew-admin-tool/src/main/java/top/charles7c/continew/admin/tool/service/impl/XxxServiceImpl.java
// 例如D:/continew-admin/continew-admin-system/src/main/java/top/charles7c/continew/admin/system/service/impl/XxxServiceImpl.java
TemplateConfig templateConfig = templateConfigMap.get(codePreview.getFileName()
.replace(classNamePrefix, StringConstants.EMPTY)
.replace(FileNameUtil.EXT_JAVA, StringConstants.EMPTY));
@ -310,7 +323,7 @@ public class GeneratorServiceImpl implements GeneratorService {
FileUtil.writeUtf8String(apiCodePreview.getContent(), apiFile);
// 2.生成 view 代码
GeneratePreviewResp viewCodePreview = frontendCodePreviewList.get(1);
// 例如D:/continew-admin-ui/src/views/tool/xxx/index.vue
// 例如D:/continew-admin-ui/src/views/system/xxx/index.vue
File indexFile = FileUtil.file(frontendPath, apiModuleName, StrUtil
.lowerFirst(classNamePrefix), "index.vue");
if (indexFile.exists() && Boolean.FALSE.equals(isOverride)) {

View File

@ -1,26 +0,0 @@
tinyint=Integer
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=LocalDate
datetime=LocalDateTime
timestamp=LocalDateTime

View File

@ -6,11 +6,42 @@ generator:
- DATABASECHANGELOGLOCK
- gen_config
- gen_field_config
# 模板配置
## 类型映射
typeMappings:
MySQL:
Integer:
- int
- tinyint
- smallint
- mediumint
- integer
String:
- varchar
- char
- text
- mediumtext
- longtext
- tinytext
LocalDate:
- date
LocalDateTime:
- datetime
- timestamp
Long:
- bigint
Float:
- float
Double:
- double
BigDecimal:
- decimal
Boolean:
- bit
## 模板配置
templateConfigs:
DO:
# 模板路径
templatePath: generator/Entity.ftl
templatePath: Entity.ftl
# 包名称
packageName: model.entity
# 排除字段
@ -21,20 +52,20 @@ generator:
- updateUser
- updateTime
Query:
templatePath: generator/Query.ftl
templatePath: Query.ftl
packageName: model.query
Req:
templatePath: generator/Req.ftl
templatePath: Req.ftl
packageName: model.req
Resp:
templatePath: generator/Resp.ftl
templatePath: Resp.ftl
packageName: model.resp
excludeFields:
- id
- createUser
- createTime
DetailResp:
templatePath: generator/DetailResp.ftl
templatePath: DetailResp.ftl
packageName: model.resp
excludeFields:
- id
@ -43,14 +74,14 @@ generator:
- updateUser
- updateTime
Mapper:
templatePath: generator/Mapper.ftl
templatePath: Mapper.ftl
packageName: mapper
Service:
templatePath: generator/Service.ftl
templatePath: Service.ftl
packageName: service
ServiceImpl:
templatePath: generator/ServiceImpl.ftl
templatePath: ServiceImpl.ftl
packageName: service.impl
Controller:
templatePath: generator/Controller.ftl
templatePath: Controller.ftl
packageName: controller

View File

@ -214,6 +214,8 @@ spring:
profiles:
# 启用的环境
active: dev
include:
- generator
main:
# 允许定义重名的 bean 对象覆盖原有的 bean
allow-bean-definition-overriding: true