生成单元测试代码.
This commit is contained in:
@@ -15,11 +15,11 @@ import org.hibernate.validator.constraints.Range;
|
|||||||
@Data
|
@Data
|
||||||
public class PageRequest implements IPageRequest {
|
public class PageRequest implements IPageRequest {
|
||||||
|
|
||||||
@Range(min = 1, max = 10000)
|
@Range(min = 1, max = 10000, groups = IPageRequest.class)
|
||||||
@Schema(description = "页码")
|
@Schema(description = "页码")
|
||||||
private int page;
|
private int page;
|
||||||
|
|
||||||
@Range(min = 1, max = 100)
|
@Range(min = 1, max = 100, groups = IPageRequest.class)
|
||||||
@Schema(description = "大小")
|
@Schema(description = "大小")
|
||||||
private int limit;
|
private int limit;
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class BaseDO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@TableLogic
|
@TableLogic
|
||||||
@Schema(description = "是否删除 0未删除 1已删除")
|
@Schema(description = "是否删除 0未删除 1已删除")
|
||||||
@TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.BIT)
|
@TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.TINYINT)
|
||||||
private Boolean deleted;
|
private Boolean deleted;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.generator.config.rules.DateType;
|
|||||||
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
|
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
|
||||||
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
|
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
|
||||||
import com.orion.lang.constant.Const;
|
import com.orion.lang.constant.Const;
|
||||||
|
import com.orion.lang.utils.ansi.AnsiColor;
|
||||||
import com.orion.lang.utils.ext.yml.YmlExt;
|
import com.orion.lang.utils.ext.yml.YmlExt;
|
||||||
import com.orion.ops.framework.mybatis.core.domain.BaseDO;
|
import com.orion.ops.framework.mybatis.core.domain.BaseDO;
|
||||||
import com.orion.ops.framework.mybatis.core.mapper.IMapper;
|
import com.orion.ops.framework.mybatis.core.mapper.IMapper;
|
||||||
@@ -41,7 +42,7 @@ public class CodeGenerator {
|
|||||||
// new GenTable("system_user", "用户", "user")
|
// new GenTable("system_user", "用户", "user")
|
||||||
// .vue("user", "user")
|
// .vue("user", "user")
|
||||||
// .enums(UserStatusEnum.class),
|
// .enums(UserStatusEnum.class),
|
||||||
new GenTable("favorite", "收藏", "favorite", true),
|
new GenTable("favorite", "收藏", "favorite"),
|
||||||
};
|
};
|
||||||
// jdbc 配置 - 使用配置文件
|
// jdbc 配置 - 使用配置文件
|
||||||
File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml");
|
File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml");
|
||||||
@@ -102,6 +103,9 @@ public class CodeGenerator {
|
|||||||
|
|
||||||
// 执行
|
// 执行
|
||||||
ag.execute(engine);
|
ag.execute(engine);
|
||||||
|
|
||||||
|
// 打印提示信息
|
||||||
|
printTips();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -286,54 +290,57 @@ public class CodeGenerator {
|
|||||||
*/
|
*/
|
||||||
private static InjectionConfig getInjectionConfig() {
|
private static InjectionConfig getInjectionConfig() {
|
||||||
String[][] customFileDefineArr = new String[][]{
|
String[][] customFileDefineArr = new String[][]{
|
||||||
// -------------------- 后端 - service --------------------
|
// -------------------- 后端 - module --------------------
|
||||||
// http 文件
|
// http 文件
|
||||||
new String[]{"/templates/orion-server-module-controller.http.vm", "%sController.http", "controller"},
|
new String[]{"/templates/orion-server-module-controller.http.vm", "${type}Controller.http", "controller"},
|
||||||
// vo 文件
|
// vo 文件
|
||||||
new String[]{"/templates/orion-server-module-entity-vo.java.vm", "%sVO.java", "entity.vo"},
|
new String[]{"/templates/orion-server-module-entity-vo.java.vm", "${type}VO.java", "entity.vo"},
|
||||||
// create request 文件
|
// create request 文件
|
||||||
new String[]{"/templates/orion-server-module-entity-request-create.java.vm", "%sCreateRequest.java", "entity.request.%s"},
|
new String[]{"/templates/orion-server-module-entity-request-create.java.vm", "${type}CreateRequest.java", "entity.request.${bizPackage}"},
|
||||||
// update request 文件
|
// update request 文件
|
||||||
new String[]{"/templates/orion-server-module-entity-request-update.java.vm", "%sUpdateRequest.java", "entity.request.%s"},
|
new String[]{"/templates/orion-server-module-entity-request-update.java.vm", "${type}UpdateRequest.java", "entity.request.${bizPackage}"},
|
||||||
// query request 文件
|
// query request 文件
|
||||||
new String[]{"/templates/orion-server-module-entity-request-query.java.vm", "%sQueryRequest.java", "entity.request.%s"},
|
new String[]{"/templates/orion-server-module-entity-request-query.java.vm", "${type}QueryRequest.java", "entity.request.${bizPackage}"},
|
||||||
// convert 文件
|
// convert 文件
|
||||||
new String[]{"/templates/orion-server-module-convert.java.vm", "%sConvert.java", "convert"},
|
new String[]{"/templates/orion-server-module-convert.java.vm", "${type}Convert.java", "convert"},
|
||||||
// junit test 文件
|
|
||||||
|
|
||||||
// -------------------- 后端 - provider --------------------
|
// -------------------- 后端 - provider --------------------
|
||||||
// api 文件
|
// api 文件
|
||||||
new String[]{"/templates/orion-server-provider-api.java.vm", "%sApi.java", "api"},
|
new String[]{"/templates/orion-server-provider-api.java.vm", "${type}Api.java", "api"},
|
||||||
// api impl 文件
|
// api impl 文件
|
||||||
new String[]{"/templates/orion-server-provider-api-impl.java.vm", "%sApiImpl.java", "api.impl"},
|
new String[]{"/templates/orion-server-provider-api-impl.java.vm", "${type}ApiImpl.java", "api.impl"},
|
||||||
// dto 文件
|
// dto 文件
|
||||||
new String[]{"/templates/orion-server-provider-entity-dto.java.vm", "%sDTO.java", "entity.dto.%s"},
|
new String[]{"/templates/orion-server-provider-entity-dto.java.vm", "${type}DTO.java", "entity.dto.${bizPackage}"},
|
||||||
// create dto 文件
|
// create dto 文件
|
||||||
new String[]{"/templates/orion-server-provider-entity-dto-create.java.vm", "%sCreateDTO.java", "entity.dto.%s"},
|
new String[]{"/templates/orion-server-provider-entity-dto-create.java.vm", "${type}CreateDTO.java", "entity.dto.${bizPackage}"},
|
||||||
// update dto 文件
|
// update dto 文件
|
||||||
new String[]{"/templates/orion-server-provider-entity-dto-update.java.vm", "%sUpdateDTO.java", "entity.dto.%s"},
|
new String[]{"/templates/orion-server-provider-entity-dto-update.java.vm", "${type}UpdateDTO.java", "entity.dto.${bizPackage}"},
|
||||||
// query dto 文件
|
// query dto 文件
|
||||||
new String[]{"/templates/orion-server-provider-entity-dto-query.java.vm", "%sQueryDTO.java", "entity.dto.%s"},
|
new String[]{"/templates/orion-server-provider-entity-dto-query.java.vm", "${type}QueryDTO.java", "entity.dto.${bizPackage}"},
|
||||||
// convert 文件
|
// convert 文件
|
||||||
new String[]{"/templates/orion-server-provider-convert.java.vm", "%sProviderConvert.java", "convert"},
|
new String[]{"/templates/orion-server-provider-convert.java.vm", "${type}ProviderConvert.java", "convert"},
|
||||||
|
// -------------------- 后端 - test --------------------
|
||||||
|
// unit test 文件
|
||||||
|
new String[]{"/templates/orion-server-test-service-tests.java.vm", "${type}ServiceTests.java", "service.impl"},
|
||||||
|
// create table sql 文件
|
||||||
|
new String[]{"/templates/orion-server-test-create-table.sql.vm", "create-table-h2-${tableName}.sql", "sql"},
|
||||||
// -------------------- 前端 --------------------
|
// -------------------- 前端 --------------------
|
||||||
// vue api 文件
|
// api 文件
|
||||||
new String[]{"/templates/orion-vue-api.ts.vm", "${feature}.ts", "vue/api/${module}"},
|
new String[]{"/templates/orion-vue-api.ts.vm", "${feature}.ts", "vue/api/${module}"},
|
||||||
// vue router 文件
|
// router 文件
|
||||||
new String[]{"/templates/orion-vue-router.ts.vm", "${module}.${feature}.ts", "vue/router/routes/modules"},
|
new String[]{"/templates/orion-vue-router.ts.vm", "${module}.${feature}.ts", "vue/router/routes/modules"},
|
||||||
// vue views index.ts 文件
|
// views index.ts 文件
|
||||||
new String[]{"/templates/orion-vue-views-index.vue.vm", "index.vue", "vue/views/${module}/${feature}"},
|
new String[]{"/templates/orion-vue-views-index.vue.vm", "index.vue", "vue/views/${module}/${feature}"},
|
||||||
// vue form-modal.vue 文件
|
// form-modal.vue 文件
|
||||||
new String[]{"/templates/orion-vue-views-components-form-modal.vue.vm", "${feature}-form-modal.vue", "vue/views/${module}/${feature}/components"},
|
new String[]{"/templates/orion-vue-views-components-form-modal.vue.vm", "${feature}-form-modal.vue", "vue/views/${module}/${feature}/components"},
|
||||||
// vue table.vue 文件
|
// table.vue 文件
|
||||||
new String[]{"/templates/orion-vue-views-components-table.vue.vm", "${feature}-table.vue", "vue/views/${module}/${feature}/components"},
|
new String[]{"/templates/orion-vue-views-components-table.vue.vm", "${feature}-table.vue", "vue/views/${module}/${feature}/components"},
|
||||||
// vue enum.types.ts 文件
|
// enum.types.ts 文件
|
||||||
new String[]{"/templates/orion-vue-views-types-enum.types.ts.vm", "enum.types.ts", "vue/views/${module}/${feature}/types"},
|
new String[]{"/templates/orion-vue-views-types-enum.types.ts.vm", "enum.types.ts", "vue/views/${module}/${feature}/types"},
|
||||||
// vue form.rules.ts 文件
|
// form.rules.ts 文件
|
||||||
new String[]{"/templates/orion-vue-views-types-form.rules.ts.vm", "form.rules.ts", "vue/views/${module}/${feature}/types"},
|
new String[]{"/templates/orion-vue-views-types-form.rules.ts.vm", "form.rules.ts", "vue/views/${module}/${feature}/types"},
|
||||||
// vue table.vue 文件
|
// table.vue 文件
|
||||||
new String[]{"/templates/orion-vue-views-types-table.columns.ts.vm", "table.columns.ts", "vue/views/${module}/${feature}/types"},
|
new String[]{"/templates/orion-vue-views-types-table.columns.ts.vm", "table.columns.ts", "vue/views/${module}/${feature}/types"},
|
||||||
// sql menu.sql 文件
|
// menu.sql 文件
|
||||||
new String[]{"/templates/orion-sql-menu.sql.vm", "${feature}-menu.sql", "sql"},
|
new String[]{"/templates/orion-sql-menu.sql.vm", "${feature}-menu.sql", "sql"},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -353,12 +360,23 @@ public class CodeGenerator {
|
|||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
// 注入配置
|
// 注入配置
|
||||||
InjectionConfig injection = new InjectionConfig.Builder()
|
return new InjectionConfig.Builder()
|
||||||
// 自定义 文件
|
// 自定义 文件
|
||||||
.customFile(customerFiles)
|
.customFile(customerFiles)
|
||||||
// 构建
|
// 构建
|
||||||
.build();
|
.build();
|
||||||
return injection;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印提示信息
|
||||||
|
*/
|
||||||
|
private static void printTips() {
|
||||||
|
String line = AnsiColor.GLOSS_GREEN.color(":: 代码生成完毕 ::\n") +
|
||||||
|
AnsiColor.GLOSS_BLUE.color("- 后端代码复制后请先 clean 模块父工程\n") +
|
||||||
|
AnsiColor.GLOSS_BLUE.color("- 后端代码复制后请先执行单元测试检测是否正常\n") +
|
||||||
|
AnsiColor.GLOSS_BLUE.color("- vue 代码需要注意同一模块的 router 需要自行合并\n") +
|
||||||
|
AnsiColor.SUFFIX;
|
||||||
|
System.out.print(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ public class GenTable {
|
|||||||
*/
|
*/
|
||||||
private boolean genProviderApi;
|
private boolean genProviderApi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否生成单元测试
|
||||||
|
*/
|
||||||
|
private boolean genUnitTest;
|
||||||
|
|
||||||
// -------------------- 前端 --------------------
|
// -------------------- 前端 --------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,24 +66,31 @@ public class GenTable {
|
|||||||
private List<Class<? extends Enum<?>>> enums;
|
private List<Class<? extends Enum<?>>> enums;
|
||||||
|
|
||||||
public GenTable(String tableName, String comment, String bizPackage) {
|
public GenTable(String tableName, String comment, String bizPackage) {
|
||||||
this(tableName, comment, bizPackage, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GenTable(String tableName, String comment, String bizPackage, boolean genProviderApi) {
|
|
||||||
this.tableName = tableName;
|
this.tableName = tableName;
|
||||||
this.comment = comment;
|
this.comment = comment;
|
||||||
this.bizPackage = bizPackage;
|
this.bizPackage = bizPackage;
|
||||||
this.genProviderApi = genProviderApi;
|
this.genProviderApi = true;
|
||||||
|
this.genUnitTest = true;
|
||||||
this.enums = new ArrayList<>();
|
this.enums = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否生成 api
|
* 忽略生成 api
|
||||||
*
|
*
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
public GenTable api() {
|
public GenTable ignoreApi() {
|
||||||
this.genProviderApi = true;
|
this.genProviderApi = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 忽略生成单元测试
|
||||||
|
*
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
public GenTable ignoreTest() {
|
||||||
|
this.genUnitTest = false;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.orion.lang.utils.Strings;
|
|||||||
import com.orion.lang.utils.io.Files1;
|
import com.orion.lang.utils.io.Files1;
|
||||||
import com.orion.lang.utils.reflect.BeanMap;
|
import com.orion.lang.utils.reflect.BeanMap;
|
||||||
import com.orion.lang.utils.reflect.Fields;
|
import com.orion.lang.utils.reflect.Fields;
|
||||||
|
import com.orion.ops.framework.common.constant.Const;
|
||||||
import com.orion.ops.framework.common.constant.OrionOpsProConst;
|
import com.orion.ops.framework.common.constant.OrionOpsProConst;
|
||||||
import org.apache.velocity.Template;
|
import org.apache.velocity.Template;
|
||||||
import org.apache.velocity.VelocityContext;
|
import org.apache.velocity.VelocityContext;
|
||||||
@@ -54,8 +55,6 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
||||||
|
|
||||||
private static final String[] PACKAGE_REPLACER = new String[]{"request.%s", "dto.%s"};
|
|
||||||
|
|
||||||
private final Map<String, GenTable> tables;
|
private final Map<String, GenTable> tables;
|
||||||
|
|
||||||
private VelocityEngine velocityEngine;
|
private VelocityEngine velocityEngine;
|
||||||
@@ -106,8 +105,27 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
return filePath.endsWith(dotVm) ? filePath : filePath + dotVm;
|
return filePath.endsWith(dotVm) ? filePath : filePath + dotVm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void outputCustomFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
||||||
|
// 创建自定义文件副本文件
|
||||||
|
customFiles = this.createCustomFilesBackup(customFiles, tableInfo);
|
||||||
|
// 添加表元数据
|
||||||
|
this.addTableMeta(tableInfo, objectMap);
|
||||||
|
// 替换自定义包名
|
||||||
|
this.replacePackageName(customFiles, tableInfo, objectMap);
|
||||||
|
// 添加注释元数据
|
||||||
|
this.addApiCommentMeta(tableInfo, objectMap);
|
||||||
|
|
||||||
|
// 生成后端文件
|
||||||
|
this.generatorServerFile(customFiles, tableInfo, objectMap);
|
||||||
|
// 生成前端文件
|
||||||
|
this.generatorVueFile(customFiles, tableInfo, objectMap);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建自定义文件副本对象
|
* 创建自定义文件副本对象
|
||||||
|
* <p>
|
||||||
|
* - 根据类型进行移除不需要生成的模板
|
||||||
*
|
*
|
||||||
* @param originCustomerFile originCustomerFile
|
* @param originCustomerFile originCustomerFile
|
||||||
* @param tableInfo tableInfo
|
* @param tableInfo tableInfo
|
||||||
@@ -131,6 +149,10 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
if (!table.isGenProviderApi()) {
|
if (!table.isGenProviderApi()) {
|
||||||
files.removeIf(file -> this.isServerProviderFile(file.getTemplatePath()));
|
files.removeIf(file -> this.isServerProviderFile(file.getTemplatePath()));
|
||||||
}
|
}
|
||||||
|
// 不生成单元测试文件
|
||||||
|
if (!table.isGenUnitTest()) {
|
||||||
|
files.removeIf(file -> this.isServerUnitTestFile(file.getTemplatePath()));
|
||||||
|
}
|
||||||
// 不生成 vue 文件
|
// 不生成 vue 文件
|
||||||
if (!table.isGenVue()) {
|
if (!table.isGenVue()) {
|
||||||
files.removeIf(file -> this.isVueFile(file.getTemplatePath()));
|
files.removeIf(file -> this.isVueFile(file.getTemplatePath()));
|
||||||
@@ -138,6 +160,28 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 插入表元数据
|
||||||
|
*
|
||||||
|
* @param tableInfo tableInfo
|
||||||
|
* @param objectMap objectMap
|
||||||
|
*/
|
||||||
|
private void addTableMeta(@NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
||||||
|
// http 注释标识
|
||||||
|
objectMap.put("httpComment", "###");
|
||||||
|
// 版本
|
||||||
|
objectMap.put("since", OrionOpsProConst.VERSION);
|
||||||
|
// 替换业务注释
|
||||||
|
tableInfo.setComment(tables.get(tableInfo.getName()).getComment());
|
||||||
|
// 实体名称
|
||||||
|
String domainName = tableInfo.getEntityName();
|
||||||
|
String mappingHyphen = objectMap.get("controllerMappingHyphen").toString();
|
||||||
|
String entityName = domainName.substring(0, domainName.length() - 2);
|
||||||
|
objectMap.put("type", entityName);
|
||||||
|
objectMap.put("typeLower", Strings.firstLower(entityName));
|
||||||
|
objectMap.put("typeHyphen", mappingHyphen.substring(0, mappingHyphen.length() - 3));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 替换自定义文件包
|
* 替换自定义文件包
|
||||||
*
|
*
|
||||||
@@ -152,10 +196,11 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
BiConsumer<String, Object> callSetter = (field, value) -> Fields.setFieldValue(s, field, value);
|
BiConsumer<String, Object> callSetter = (field, value) -> Fields.setFieldValue(s, field, value);
|
||||||
String packageName = s.getPackageName();
|
String packageName = s.getPackageName();
|
||||||
// 替换文件业务包名
|
// 替换文件业务包名
|
||||||
boolean replace = Arrays.stream(PACKAGE_REPLACER).anyMatch(packageName::contains);
|
if (packageName.contains(Const.DOLLAR)) {
|
||||||
if (replace) {
|
Map<String, Object> meta = new HashMap<>(4);
|
||||||
String replacePackage = String.format(packageName, tables.get(tableInfo.getName()).getBizPackage());
|
meta.put("bizPackage", tables.get(tableInfo.getName()).getBizPackage());
|
||||||
callSetter.accept("packageName", replacePackage);
|
// 调用 setter
|
||||||
|
callSetter.accept("packageName", Strings.format(packageName, meta));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -181,29 +226,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
objectMap.put("customProviderFilePackages", customProviderFilePackages);
|
objectMap.put("customProviderFilePackages", customProviderFilePackages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 插入表元数据
|
|
||||||
*
|
|
||||||
* @param tableInfo tableInfo
|
|
||||||
* @param objectMap objectMap
|
|
||||||
*/
|
|
||||||
private void addTableMeta(@NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
|
||||||
// http 注释标识
|
|
||||||
objectMap.put("httpComment", "###");
|
|
||||||
// 版本
|
|
||||||
objectMap.put("since", OrionOpsProConst.VERSION);
|
|
||||||
// 替换业务注释
|
|
||||||
tableInfo.setComment(tables.get(tableInfo.getName()).getComment());
|
|
||||||
// 实体名称
|
|
||||||
String domainName = tableInfo.getEntityName();
|
|
||||||
String mappingHyphen = objectMap.get("controllerMappingHyphen").toString();
|
|
||||||
String entityName = domainName.substring(0, domainName.length() - 2);
|
|
||||||
objectMap.put("type", entityName);
|
|
||||||
objectMap.put("typeLower", Strings.firstLower(entityName));
|
|
||||||
objectMap.put("typeHyphen", mappingHyphen.substring(0, mappingHyphen.length() - 3));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 插入 api 注释
|
* 插入 api 注释
|
||||||
*
|
*
|
||||||
@@ -211,7 +233,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
* @param objectMap objectMap
|
* @param objectMap objectMap
|
||||||
*/
|
*/
|
||||||
private void addApiCommentMeta(@NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
private void addApiCommentMeta(@NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
||||||
Map<String, String> map = new HashMap<>();
|
Map<String, String> map = new HashMap<>(12);
|
||||||
objectMap.put("apiComment", map);
|
objectMap.put("apiComment", map);
|
||||||
String comment = tableInfo.getComment();
|
String comment = tableInfo.getComment();
|
||||||
map.put("create", "创建" + comment);
|
map.put("create", "创建" + comment);
|
||||||
@@ -225,31 +247,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
map.put("batchDeleteByIdList", "通过 id 批量删除" + comment);
|
map.put("batchDeleteByIdList", "通过 id 批量删除" + comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void outputCustomFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
|
||||||
// 创建自定义文件副本文件
|
|
||||||
customFiles = this.createCustomFilesBackup(customFiles, tableInfo);
|
|
||||||
// 替换自定义包名
|
|
||||||
this.replacePackageName(customFiles, tableInfo, objectMap);
|
|
||||||
// 添加表元数据
|
|
||||||
this.addTableMeta(tableInfo, objectMap);
|
|
||||||
// 添加注释元数据
|
|
||||||
this.addApiCommentMeta(tableInfo, objectMap);
|
|
||||||
|
|
||||||
// 生成后端文件
|
|
||||||
List<CustomFile> serverFiles = customFiles.stream()
|
|
||||||
.filter(s -> this.isServerFile(s.getTemplatePath()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
this.generatorServerFile(serverFiles, tableInfo, objectMap);
|
|
||||||
// 生成前端文件
|
|
||||||
if (tables.get(tableInfo.getName()).isGenVue()) {
|
|
||||||
List<CustomFile> vueFiles = customFiles.stream()
|
|
||||||
.filter(s -> this.isVueFile(s.getTemplatePath()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
this.generatorVueFile(vueFiles, tableInfo, objectMap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成后端文件
|
* 生成后端文件
|
||||||
*
|
*
|
||||||
@@ -258,6 +255,11 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
* @param objectMap objectMap
|
* @param objectMap objectMap
|
||||||
*/
|
*/
|
||||||
private void generatorServerFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
private void generatorServerFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
||||||
|
// 过滤文件
|
||||||
|
customFiles = customFiles.stream()
|
||||||
|
.filter(s -> this.isServerFile(s.getTemplatePath()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
String parentPath = getPathInfo(OutputFile.parent);
|
String parentPath = getPathInfo(OutputFile.parent);
|
||||||
// 生成文件
|
// 生成文件
|
||||||
customFiles.forEach(file -> {
|
customFiles.forEach(file -> {
|
||||||
@@ -269,8 +271,13 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
// 文件路径
|
// 文件路径
|
||||||
String filePath = parentPath + File.separator + file.getPackageName()
|
String filePath = parentPath + File.separator + file.getPackageName()
|
||||||
.replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
|
.replaceAll("\\.", StringPool.BACK_SLASH + File.separator);
|
||||||
String fileName = filePath + File.separator + String.format(file.getFileName(), objectMap.get("type"));
|
// 文件名称
|
||||||
outputFile(Files1.newFile(fileName), objectMap, file.getTemplatePath(), file.isFileOverride());
|
Map<String, Object> meta = new HashMap<>(4);
|
||||||
|
meta.put("type", objectMap.get("type"));
|
||||||
|
meta.put("tableName", tableInfo.getName());
|
||||||
|
String fileName = filePath + File.separator + Strings.format(file.getFileName(), meta);
|
||||||
|
// 渲染文件
|
||||||
|
this.outputFile(Files1.newFile(fileName), objectMap, file.getTemplatePath(), file.isFileOverride());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,6 +289,16 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
* @param objectMap objectMap
|
* @param objectMap objectMap
|
||||||
*/
|
*/
|
||||||
private void generatorVueFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
private void generatorVueFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
|
||||||
|
// 不生成 vue 文件
|
||||||
|
if (!tables.get(tableInfo.getName()).isGenVue()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 过滤文件
|
||||||
|
customFiles = customFiles.stream()
|
||||||
|
.filter(s -> this.isVueFile(s.getTemplatePath()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 元数据
|
||||||
String outPath = getConfigBuilder().getGlobalConfig().getOutputDir();
|
String outPath = getConfigBuilder().getGlobalConfig().getOutputDir();
|
||||||
GenTable table = tables.get(tableInfo.getName());
|
GenTable table = tables.get(tableInfo.getName());
|
||||||
BeanMap beanMap = BeanMap.create(table, "enums");
|
BeanMap beanMap = BeanMap.create(table, "enums");
|
||||||
@@ -301,7 +318,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
String filePath = outPath
|
String filePath = outPath
|
||||||
+ "/" + Strings.format(file.getPackageName(), beanMap)
|
+ "/" + Strings.format(file.getPackageName(), beanMap)
|
||||||
+ "/" + Strings.format(file.getFileName(), beanMap);
|
+ "/" + Strings.format(file.getFileName(), beanMap);
|
||||||
// 输出文件
|
// 渲染文件
|
||||||
this.outputFile(Files1.newFile(filePath), objectMap, file.getTemplatePath(), file.isFileOverride());
|
this.outputFile(Files1.newFile(filePath), objectMap, file.getTemplatePath(), file.isFileOverride());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -320,12 +337,22 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
|
|||||||
* 是否为后端 provider 文件
|
* 是否为后端 provider 文件
|
||||||
*
|
*
|
||||||
* @param templatePath templatePath
|
* @param templatePath templatePath
|
||||||
* @return 是否为 sql 文件
|
* @return 是否为后端 provider 文件
|
||||||
*/
|
*/
|
||||||
private boolean isServerProviderFile(String templatePath) {
|
private boolean isServerProviderFile(String templatePath) {
|
||||||
return templatePath.contains("orion-server-provider");
|
return templatePath.contains("orion-server-provider");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为后端单元测试文件
|
||||||
|
*
|
||||||
|
* @param templatePath templatePath
|
||||||
|
* @return 是否为后端单元测试文件
|
||||||
|
*/
|
||||||
|
private boolean isServerUnitTestFile(String templatePath) {
|
||||||
|
return templatePath.contains("orion-server-test");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否为 vue 文件
|
* 是否为 vue 文件
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ Content-Type: application/json
|
|||||||
Authorization: {{token}}
|
Authorization: {{token}}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
"page": 1,
|
||||||
|
"limit": 10,
|
||||||
#foreach($field in ${table.fields})
|
#foreach($field in ${table.fields})
|
||||||
"${field.propertyName}": ""#if($foreach.hasNext),#end
|
"${field.propertyName}": ""#if($foreach.hasNext),#end
|
||||||
#end
|
#end
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package ${package.Controller};
|
package ${package.Controller};
|
||||||
|
|
||||||
import com.orion.lang.define.wrapper.DataGrid;
|
import com.orion.lang.define.wrapper.DataGrid;
|
||||||
|
import com.orion.lang.define.wrapper.IPageRequest;
|
||||||
import com.orion.ops.framework.common.annotation.IgnoreLog;
|
import com.orion.ops.framework.common.annotation.IgnoreLog;
|
||||||
import com.orion.ops.framework.common.annotation.RestWrapper;
|
import com.orion.ops.framework.common.annotation.RestWrapper;
|
||||||
import com.orion.ops.framework.common.constant.IgnoreLogMode;
|
import com.orion.ops.framework.common.constant.IgnoreLogMode;
|
||||||
@@ -89,7 +90,7 @@ public class ${table.controllerName} {
|
|||||||
@PostMapping("/query")
|
@PostMapping("/query")
|
||||||
@Operation(summary = "${apiComment.queryPage}")
|
@Operation(summary = "${apiComment.queryPage}")
|
||||||
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
|
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
|
||||||
public DataGrid<${type}VO> get${type}Page(@Validated @RequestBody ${type}QueryRequest request) {
|
public DataGrid<${type}VO> get${type}Page(@Validated(IPageRequest.class) @RequestBody ${type}QueryRequest request) {
|
||||||
return ${typeLower}Service.get${type}Page(request);
|
return ${typeLower}Service.get${type}Page(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public interface ${table.serviceName} {
|
|||||||
* @param request request
|
* @param request request
|
||||||
* @return count
|
* @return count
|
||||||
*/
|
*/
|
||||||
Long get${type}Count(Favorite${type}Request request);
|
Long get${type}Count(${type}QueryRequest request);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ${apiComment.queryPage}
|
* ${apiComment.queryPage}
|
||||||
|
|||||||
@@ -93,11 +93,11 @@ public class ${type}ApiImpl implements ${type}Api {
|
|||||||
// 查询
|
// 查询
|
||||||
return ${typeLower}DAO.of()
|
return ${typeLower}DAO.of()
|
||||||
.wrapper(wrapper)
|
.wrapper(wrapper)
|
||||||
.dataGrid(${type}ProviderConvert.MAPPER::to);
|
.list(${type}ProviderConvert.MAPPER::to);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long get${type}Count(FavoriteQueryDTO dto) {
|
public Long get${type}Count(${type}QueryDTO dto) {
|
||||||
log.info("${type}Api.get${type}Count dto: {}", JSON.toJSONString(dto));
|
log.info("${type}Api.get${type}Count dto: {}", JSON.toJSONString(dto));
|
||||||
Valid.valid(dto);
|
Valid.valid(dto);
|
||||||
// 条件
|
// 条件
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
-- $!{table.comment}
|
||||||
|
DROP TABLE IF EXISTS `${table.name}`;
|
||||||
|
CREATE TABLE `${table.name}`
|
||||||
|
(
|
||||||
|
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
|
#foreach($field in ${table.fields})
|
||||||
|
#if("$!field.propertyName" != "id")
|
||||||
|
`${field.columnName}` ${field.metaInfo.jdbcType}(${field.metaInfo.length})#if(!$field.metaInfo.nullable) NOT NULL#end#if($null.isNull($field.metaInfo.defaultValue) || "$!{field.metaInfo.defaultValue}" == "") DEFAULT NULL#else DEFAULT#if(${field.propertyType} == 'String') '${field.metaInfo.defaultValue}'#else ${field.metaInfo.defaultValue}#end#end COMMENT '$!{field.metaInfo.remarks}',
|
||||||
|
#end
|
||||||
|
#end
|
||||||
|
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
|
`creator` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
||||||
|
`updater` VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
||||||
|
`deleted` TINYINT DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
);
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
package ${currentPackage};
|
||||||
|
|
||||||
|
import com.orion.lang.define.wrapper.DataGrid;
|
||||||
|
import com.orion.lang.utils.collect.Lists;
|
||||||
|
import com.orion.ops.framework.test.core.base.BaseUnitTest;
|
||||||
|
import com.orion.ops.framework.test.core.utils.EntityRandoms;
|
||||||
|
#foreach($pkg in ${customModuleFilePackages})
|
||||||
|
import ${pkg}.*;
|
||||||
|
#end
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.junit.jupiter.api.Order;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* $!{table.comment} 服务单元测试
|
||||||
|
*
|
||||||
|
* @author Jiahang Li
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2023/8/23 10:36
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Import(${type}ServiceImpl.class)
|
||||||
|
public class ${type}ServiceTests extends BaseUnitTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ${type}Service ${typeLower}Service;
|
||||||
|
|
||||||
|
private static Long lastId;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(1)
|
||||||
|
public void create${type}Test() {
|
||||||
|
${type}CreateRequest req = EntityRandoms.random(${type}CreateRequest.class);
|
||||||
|
lastId = ${typeLower}Service.create${type}(req);
|
||||||
|
assertNotNull(lastId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(2)
|
||||||
|
public void update${type}ByIdTest() {
|
||||||
|
${type}UpdateRequest req = EntityRandoms.random(${type}UpdateRequest.class);
|
||||||
|
req.setId(lastId);
|
||||||
|
Integer effect = ${typeLower}Service.update${type}ById(req);
|
||||||
|
assertEquals(effect, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
public void get${type}ByIdTest() {
|
||||||
|
${type}VO row = ${typeLower}Service.get${type}ById(lastId);
|
||||||
|
assertNotNull(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(4)
|
||||||
|
public void get${type}ByIdListTest() {
|
||||||
|
List<${type}VO> rows = ${typeLower}Service.get${type}ByIdList(Lists.of(lastId));
|
||||||
|
assertFalse(rows.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(5)
|
||||||
|
public void get${type}ListTest() {
|
||||||
|
List<${type}VO> rows = ${typeLower}Service.get${type}List(new ${type}QueryRequest());
|
||||||
|
assertFalse(rows.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(6)
|
||||||
|
public void get${type}CountTest() {
|
||||||
|
Long count = ${typeLower}Service.get${type}Count(new ${type}QueryRequest());
|
||||||
|
assertEquals(count, 1L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(7)
|
||||||
|
public void get${type}PageTest() {
|
||||||
|
${type}QueryRequest request = new ${type}QueryRequest();
|
||||||
|
request.setPage(1);
|
||||||
|
request.setLimit(1);
|
||||||
|
DataGrid<${type}VO> dataGrid = ${typeLower}Service.get${type}Page(request);
|
||||||
|
assertFalse(dataGrid.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(8)
|
||||||
|
public void delete${type}ByIdTest() {
|
||||||
|
Integer effect = ${typeLower}Service.delete${type}ById(lastId);
|
||||||
|
assertEquals(effect, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(9)
|
||||||
|
public void batchDelete${type}ByIdListTest() {
|
||||||
|
Integer effect = ${typeLower}Service.batchDelete${type}ByIdList(Lists.of(lastId));
|
||||||
|
assertEquals(effect, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -16,7 +16,7 @@ spring:
|
|||||||
sql:
|
sql:
|
||||||
init:
|
init:
|
||||||
schema-locations:
|
schema-locations:
|
||||||
- classpath:/sql/create-tables-h2-*.sql
|
- classpath:/sql/create-table-h2-*.sql
|
||||||
redis:
|
redis:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 16379
|
port: 16379
|
||||||
|
|||||||
Reference in New Issue
Block a user