整理 vm 模板

提交 test 生成的示例
This commit is contained in:
YunaiV
2021-02-06 23:52:26 +08:00
parent 2210ed5cf8
commit 5442f6522e
25 changed files with 412 additions and 246 deletions

View File

@@ -17,6 +17,8 @@ import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.*;
import static cn.hutool.core.text.CharSequenceUtil.*;
/**
* 代码生成器的 Builder负责
* 1. 将数据库的表 {@link ToolInformationSchemaTableDO} 定义,构建成 {@link ToolCodegenTableDO}
@@ -25,6 +27,18 @@ import java.util.*;
@Component
public class ToolCodegenBuilder {
/**
* Module 名字的映射 TODO 后续梳理到配置类
*
* key模块的完整名
* value模块的缩写名
*/
private static final Map<String, String> moduleNames = MapUtil.<String, String>builder()
.put("system", "sys")
.put("infra", "inf")
.put("tool", "tool")
.build();
/**
* 字段名与 {@link ToolCodegenColumnListConditionEnum} 的默认映射
* 注意,字段的匹配以后缀的方式
@@ -93,9 +107,9 @@ public class ToolCodegenBuilder {
CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS);
UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS);
LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS);
LIST_OPERATION_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是可能需要传递的
LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的
LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS);
LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("create_time"); // 创建时间,还是需要返回的
LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的
}
public ToolCodegenTableDO buildTable(ToolInformationSchemaTableDO schemaTable) {
@@ -110,13 +124,12 @@ public class ToolCodegenBuilder {
* @param table 表定义
*/
private void initTableDefault(ToolCodegenTableDO table) {
table.setModuleName(StrUtil.subBefore(table.getTableName(),
'_', false)); // 第一个 _ 前缀的前面,作为 module 名字
table.setBusinessName(StrUtil.subAfter(table.getTableName(),
'_', false)); // 第一个 _ 前缀的后面,作为 module 名字
table.setBusinessName(StrUtil.toCamelCase(table.getBusinessName())); // 可能存在多个 _ 的情况,转换成驼峰
table.setClassName(StrUtil.upperFirst(StrUtil.toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写
table.setClassComment(StrUtil.subBefore(table.getTableComment(), // 去除结尾的表,作为类描述
table.setModuleName(getFullModuleName(StrUtil.subBefore(table.getTableName(),
'_', false))); // 第一个 _ 前缀的前面,作为 module 名字
table.setBusinessName(toCamelCase(subAfter(table.getTableName(),
'_', false))); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰
table.setClassName(upperFirst(toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写
table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述
'表', true));
table.setAuthor("芋艿"); // TODO 稍后改成创建人
table.setTemplateType(ToolCodegenTemplateTypeEnum.CRUD.getType());
@@ -144,7 +157,7 @@ public class ToolCodegenBuilder {
private void processColumnJava(ToolCodegenColumnDO column) {
// 处理 javaField 字段
column.setJavaField(StrUtil.toCamelCase(column.getColumnName()));
column.setJavaField(toCamelCase(column.getColumnName()));
// 处理 dictType 字段,暂无
// 处理 javaType 字段
String dbType = StrUtil.subBefore(column.getColumnType(), '(', false);
@@ -194,4 +207,27 @@ public class ToolCodegenBuilder {
}
}
/**
* 获得模块的缩略名
*
* @param fullModuleName 模块的完整名
* @return 缩略名
*/
public String getSimpleModuleName(String fullModuleName) {
return moduleNames.getOrDefault(fullModuleName, fullModuleName);
}
/**
* 获得模块的完整名
*
* @param shortModuleName 模块的缩略名
* @return 完整名
*/
public String getFullModuleName(String shortModuleName) {
return moduleNames.entrySet().stream()
.filter(entry -> entry.getValue().equals(shortModuleName)) // 匹配
.findFirst().map(Map.Entry::getKey) // 返回 key
.orElse(shortModuleName); // 兜底返回 shortModuleName
}
}

View File

@@ -14,6 +14,7 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils;
import cn.iocoder.dashboard.util.date.DateUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -31,6 +32,9 @@ import static cn.hutool.core.text.CharSequenceUtil.*;
@Component
public class ToolCodegenEngine {
@Resource
private ToolCodegenBuilder codegenBuilder;
/**
* 模板引擎,由 hutool 实现
*/
@@ -69,9 +73,15 @@ public class ToolCodegenEngine {
Map<String, Object> bindingMap = new HashMap<>(globalBindingMap);
bindingMap.put("table", table);
bindingMap.put("columns", columns);
bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey));
bindingMap.put("simpleClassName", upperFirst(toCamelCase(subAfter( // 去掉第一个驼峰,例如说 SysUser 去掉后是 User
toUnderlineCase(table.getClassName()), '_', false))));
bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, ToolCodegenColumnDO::getPrimaryKey)); // 主键字段
String simpleModuleName = codegenBuilder.getSimpleModuleName(table.getModuleName());
bindingMap.put("simpleModuleName", simpleModuleName); // 将 system 转成 sys
// className 相关
String simpleClassName = subAfter(table.getClassName(), upperFirst(simpleModuleName)
, false); // 将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀
bindingMap.put("simpleClassName", simpleClassName);
bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type
bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType用于变量
// 执行生成
// String result = templateEngine.getTemplate("codegen/dal/do.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/dal/mapper.vm").render(bindingMap);
@@ -80,7 +90,10 @@ public class ToolCodegenEngine {
// String result = templateEngine.getTemplate("codegen/controller/vo/createReqVO.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/controller/vo/updateReqVO.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/controller/vo/respVO.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/convert/convert.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/enums/errorcode.vm").render(bindingMap);
String result = templateEngine.getTemplate("codegen/service/service.vm").render(bindingMap);
// String result = templateEngine.getTemplate("codegen/service/serviceImpl.vm").render(bindingMap);
System.out.println(result);
}