From 58901b5903419580cf7589c8443d04ac64442049 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Thu, 24 Aug 2023 19:14:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/entity/PageRequest.java | 4 +- .../framework/mybatis/core/domain/BaseDO.java | 2 +- .../ops/launch/generator/CodeGenerator.java | 74 +++++---- .../orion/ops/launch/generator/GenTable.java | 28 +++- .../generator/VelocityTemplateEngine.java | 145 +++++++++++------- .../orion-server-module-controller.http.vm | 10 +- .../orion-server-module-controller.java.vm | 3 +- .../orion-server-module-convert.java.vm | 2 +- .../orion-server-module-service-impl.java.vm | 2 +- .../orion-server-module-service.java.vm | 2 +- .../orion-server-provider-api-impl.java.vm | 6 +- .../orion-server-test-create-table.sql.vm | 17 ++ .../orion-server-test-service-tests.java.vm | 105 +++++++++++++ .../test/resources/application-unit-test.yaml | 2 +- 14 files changed, 292 insertions(+), 110 deletions(-) create mode 100644 orion-ops-launch/src/main/resources/templates/orion-server-test-create-table.sql.vm create mode 100644 orion-ops-launch/src/main/resources/templates/orion-server-test-service-tests.java.vm diff --git a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/entity/PageRequest.java b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/entity/PageRequest.java index 6e910fc9..aa39c5f9 100644 --- a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/entity/PageRequest.java +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/entity/PageRequest.java @@ -15,11 +15,11 @@ import org.hibernate.validator.constraints.Range; @Data public class PageRequest implements IPageRequest { - @Range(min = 1, max = 10000) + @Range(min = 1, max = 10000, groups = IPageRequest.class) @Schema(description = "页码") private int page; - @Range(min = 1, max = 100) + @Range(min = 1, max = 100, groups = IPageRequest.class) @Schema(description = "大小") private int limit; diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java index e0093270..ed85b82a 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java @@ -42,7 +42,7 @@ public class BaseDO implements Serializable { */ @TableLogic @Schema(description = "是否删除 0未删除 1已删除") - @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.BIT) + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.TINYINT) private Boolean deleted; } diff --git a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/CodeGenerator.java b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/CodeGenerator.java index 85cb172a..30686fb0 100644 --- a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/CodeGenerator.java +++ b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/CodeGenerator.java @@ -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.NamingStrategy; import com.orion.lang.constant.Const; +import com.orion.lang.utils.ansi.AnsiColor; import com.orion.lang.utils.ext.yml.YmlExt; import com.orion.ops.framework.mybatis.core.domain.BaseDO; import com.orion.ops.framework.mybatis.core.mapper.IMapper; @@ -41,7 +42,7 @@ public class CodeGenerator { // new GenTable("system_user", "用户", "user") // .vue("user", "user") // .enums(UserStatusEnum.class), - new GenTable("favorite", "收藏", "favorite", true), + new GenTable("favorite", "收藏", "favorite"), }; // jdbc 配置 - 使用配置文件 File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml"); @@ -102,6 +103,9 @@ public class CodeGenerator { // 执行 ag.execute(engine); + + // 打印提示信息 + printTips(); } /** @@ -286,54 +290,57 @@ public class CodeGenerator { */ private static InjectionConfig getInjectionConfig() { String[][] customFileDefineArr = new String[][]{ - // -------------------- 后端 - service -------------------- + // -------------------- 后端 - module -------------------- // 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 文件 - 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 文件 - 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 文件 - 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 文件 - 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 文件 - new String[]{"/templates/orion-server-module-convert.java.vm", "%sConvert.java", "convert"}, - // junit test 文件 - + new String[]{"/templates/orion-server-module-convert.java.vm", "${type}Convert.java", "convert"}, // -------------------- 后端 - provider -------------------- // 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 文件 - 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 文件 - 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 文件 - 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 文件 - 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 文件 - 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 文件 - 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}"}, - // vue router 文件 + // router 文件 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}"}, - // 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"}, - // vue table.vue 文件 + // table.vue 文件 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"}, - // 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"}, - // vue table.vue 文件 + // table.vue 文件 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"}, }; @@ -353,12 +360,23 @@ public class CodeGenerator { }).collect(Collectors.toList()); // 注入配置 - InjectionConfig injection = new InjectionConfig.Builder() + return new InjectionConfig.Builder() // 自定义 文件 .customFile(customerFiles) // 构建 .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); } } diff --git a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/GenTable.java b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/GenTable.java index ae86bef0..18c075f6 100644 --- a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/GenTable.java +++ b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/GenTable.java @@ -38,6 +38,11 @@ public class GenTable { */ private boolean genProviderApi; + /** + * 是否生成单元测试 + */ + private boolean genUnitTest; + // -------------------- 前端 -------------------- /** @@ -61,24 +66,31 @@ public class GenTable { private List>> enums; 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.comment = comment; this.bizPackage = bizPackage; - this.genProviderApi = genProviderApi; + this.genProviderApi = true; + this.genUnitTest = true; this.enums = new ArrayList<>(); } /** - * 是否生成 api + * 忽略生成 api * * @return this */ - public GenTable api() { - this.genProviderApi = true; + public GenTable ignoreApi() { + this.genProviderApi = false; + return this; + } + + /** + * 忽略生成单元测试 + * + * @return this + */ + public GenTable ignoreTest() { + this.genUnitTest = false; return this; } diff --git a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/VelocityTemplateEngine.java b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/VelocityTemplateEngine.java index e65ddf12..8708bb10 100644 --- a/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/VelocityTemplateEngine.java +++ b/orion-ops-launch/src/main/java/com/orion/ops/launch/generator/VelocityTemplateEngine.java @@ -28,6 +28,7 @@ import com.orion.lang.utils.Strings; import com.orion.lang.utils.io.Files1; import com.orion.lang.utils.reflect.BeanMap; import com.orion.lang.utils.reflect.Fields; +import com.orion.ops.framework.common.constant.Const; import com.orion.ops.framework.common.constant.OrionOpsProConst; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; @@ -54,8 +55,6 @@ import java.util.stream.Collectors; */ public class VelocityTemplateEngine extends AbstractTemplateEngine { - private static final String[] PACKAGE_REPLACER = new String[]{"request.%s", "dto.%s"}; - private final Map tables; private VelocityEngine velocityEngine; @@ -106,8 +105,27 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { return filePath.endsWith(dotVm) ? filePath : filePath + dotVm; } + @Override + protected void outputCustomFile(@NotNull List customFiles, @NotNull TableInfo tableInfo, @NotNull Map 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); + } + /** * 创建自定义文件副本对象 + *

+ * - 根据类型进行移除不需要生成的模板 * * @param originCustomerFile originCustomerFile * @param tableInfo tableInfo @@ -131,6 +149,10 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { if (!table.isGenProviderApi()) { files.removeIf(file -> this.isServerProviderFile(file.getTemplatePath())); } + // 不生成单元测试文件 + if (!table.isGenUnitTest()) { + files.removeIf(file -> this.isServerUnitTestFile(file.getTemplatePath())); + } // 不生成 vue 文件 if (!table.isGenVue()) { files.removeIf(file -> this.isVueFile(file.getTemplatePath())); @@ -138,6 +160,28 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { return files; } + /** + * 插入表元数据 + * + * @param tableInfo tableInfo + * @param objectMap objectMap + */ + private void addTableMeta(@NotNull TableInfo tableInfo, @NotNull Map 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 callSetter = (field, value) -> Fields.setFieldValue(s, field, value); String packageName = s.getPackageName(); // 替换文件业务包名 - boolean replace = Arrays.stream(PACKAGE_REPLACER).anyMatch(packageName::contains); - if (replace) { - String replacePackage = String.format(packageName, tables.get(tableInfo.getName()).getBizPackage()); - callSetter.accept("packageName", replacePackage); + if (packageName.contains(Const.DOLLAR)) { + Map meta = new HashMap<>(4); + meta.put("bizPackage", tables.get(tableInfo.getName()).getBizPackage()); + // 调用 setter + callSetter.accept("packageName", Strings.format(packageName, meta)); } }); @@ -181,29 +226,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { objectMap.put("customProviderFilePackages", customProviderFilePackages); } - - /** - * 插入表元数据 - * - * @param tableInfo tableInfo - * @param objectMap objectMap - */ - private void addTableMeta(@NotNull TableInfo tableInfo, @NotNull Map 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 注释 * @@ -211,7 +233,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { * @param objectMap objectMap */ private void addApiCommentMeta(@NotNull TableInfo tableInfo, @NotNull Map objectMap) { - Map map = new HashMap<>(); + Map map = new HashMap<>(12); objectMap.put("apiComment", map); String comment = tableInfo.getComment(); map.put("create", "创建" + comment); @@ -225,31 +247,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { map.put("batchDeleteByIdList", "通过 id 批量删除" + comment); } - @Override - protected void outputCustomFile(@NotNull List customFiles, @NotNull TableInfo tableInfo, @NotNull Map objectMap) { - // 创建自定义文件副本文件 - customFiles = this.createCustomFilesBackup(customFiles, tableInfo); - // 替换自定义包名 - this.replacePackageName(customFiles, tableInfo, objectMap); - // 添加表元数据 - this.addTableMeta(tableInfo, objectMap); - // 添加注释元数据 - this.addApiCommentMeta(tableInfo, objectMap); - - // 生成后端文件 - List serverFiles = customFiles.stream() - .filter(s -> this.isServerFile(s.getTemplatePath())) - .collect(Collectors.toList()); - this.generatorServerFile(serverFiles, tableInfo, objectMap); - // 生成前端文件 - if (tables.get(tableInfo.getName()).isGenVue()) { - List 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 */ private void generatorServerFile(@NotNull List customFiles, @NotNull TableInfo tableInfo, @NotNull Map objectMap) { + // 过滤文件 + customFiles = customFiles.stream() + .filter(s -> this.isServerFile(s.getTemplatePath())) + .collect(Collectors.toList()); + String parentPath = getPathInfo(OutputFile.parent); // 生成文件 customFiles.forEach(file -> { @@ -269,8 +271,13 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { // 文件路径 String filePath = parentPath + File.separator + file.getPackageName() .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 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 */ private void generatorVueFile(@NotNull List customFiles, @NotNull TableInfo tableInfo, @NotNull Map 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(); GenTable table = tables.get(tableInfo.getName()); BeanMap beanMap = BeanMap.create(table, "enums"); @@ -301,7 +318,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { String filePath = outPath + "/" + Strings.format(file.getPackageName(), beanMap) + "/" + Strings.format(file.getFileName(), beanMap); - // 输出文件 + // 渲染文件 this.outputFile(Files1.newFile(filePath), objectMap, file.getTemplatePath(), file.isFileOverride()); }); } @@ -320,12 +337,22 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { * 是否为后端 provider 文件 * * @param templatePath templatePath - * @return 是否为 sql 文件 + * @return 是否为后端 provider 文件 */ private boolean isServerProviderFile(String templatePath) { return templatePath.contains("orion-server-provider"); } + /** + * 是否为后端单元测试文件 + * + * @param templatePath templatePath + * @return 是否为后端单元测试文件 + */ + private boolean isServerUnitTestFile(String templatePath) { + return templatePath.contains("orion-server-test"); + } + /** * 是否为 vue 文件 * diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.http.vm b/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.http.vm index 54febbbf..9ebe93ed 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.http.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.http.vm @@ -40,9 +40,9 @@ Content-Type: application/json Authorization: {{token}} { -#foreach($field in ${table.fields}) + #foreach($field in ${table.fields}) "${field.propertyName}": ""#if($foreach.hasNext),#end -#end + #end } @@ -52,9 +52,11 @@ Content-Type: application/json Authorization: {{token}} { -#foreach($field in ${table.fields}) + "page": 1, + "limit": 10, + #foreach($field in ${table.fields}) "${field.propertyName}": ""#if($foreach.hasNext),#end -#end + #end } diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.java.vm index 0a265c25..811e57a2 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.java.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-module-controller.java.vm @@ -1,6 +1,7 @@ package ${package.Controller}; 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.RestWrapper; import com.orion.ops.framework.common.constant.IgnoreLogMode; @@ -89,7 +90,7 @@ public class ${table.controllerName} { @PostMapping("/query") @Operation(summary = "${apiComment.queryPage}") @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); } diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-module-convert.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-module-convert.java.vm index f0493483..63f50915 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-module-convert.java.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-module-convert.java.vm @@ -17,7 +17,7 @@ import java.util.List; */ @Mapper public interface ${type}Convert { - + ${type}Convert MAPPER = Mappers.getMapper(${type}Convert.class); ${type}DO to(${type}CreateRequest request); diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-module-service-impl.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-module-service-impl.java.vm index 5dcde2b0..01baf123 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-module-service-impl.java.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-module-service-impl.java.vm @@ -144,7 +144,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} { boolean present = ${typeLower}DAO.of().wrapper(wrapper).present(); Valid.isFalse(present, ErrorMessage.DATA_PRESENT); } - + /** * 构建查询 wrapper * diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-module-service.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-module-service.java.vm index d6713cfe..f0135917 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-module-service.java.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-module-service.java.vm @@ -62,7 +62,7 @@ public interface ${table.serviceName} { * @param request request * @return count */ - Long get${type}Count(Favorite${type}Request request); + Long get${type}Count(${type}QueryRequest request); /** * ${apiComment.queryPage} diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-provider-api-impl.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-provider-api-impl.java.vm index 57f3fa7a..c301fadc 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-server-provider-api-impl.java.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-server-provider-api-impl.java.vm @@ -35,7 +35,7 @@ public class ${type}ApiImpl implements ${type}Api { @Resource private ${type}Service ${typeLower}Service; - + @Resource private ${type}DAO ${typeLower}DAO; @@ -93,11 +93,11 @@ public class ${type}ApiImpl implements ${type}Api { // 查询 return ${typeLower}DAO.of() .wrapper(wrapper) - .dataGrid(${type}ProviderConvert.MAPPER::to); + .list(${type}ProviderConvert.MAPPER::to); } @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)); Valid.valid(dto); // 条件 diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-test-create-table.sql.vm b/orion-ops-launch/src/main/resources/templates/orion-server-test-create-table.sql.vm new file mode 100644 index 00000000..93471236 --- /dev/null +++ b/orion-ops-launch/src/main/resources/templates/orion-server-test-create-table.sql.vm @@ -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`) +); diff --git a/orion-ops-launch/src/main/resources/templates/orion-server-test-service-tests.java.vm b/orion-ops-launch/src/main/resources/templates/orion-server-test-service-tests.java.vm new file mode 100644 index 00000000..7ac990cf --- /dev/null +++ b/orion-ops-launch/src/main/resources/templates/orion-server-test-service-tests.java.vm @@ -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); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/test/resources/application-unit-test.yaml b/orion-ops-module-infra/orion-ops-module-infra-service/src/test/resources/application-unit-test.yaml index 8ed1f58f..ff76bb9a 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/test/resources/application-unit-test.yaml +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/test/resources/application-unit-test.yaml @@ -16,7 +16,7 @@ spring: sql: init: schema-locations: - - classpath:/sql/create-tables-h2-*.sql + - classpath:/sql/create-table-h2-*.sql redis: host: 127.0.0.1 port: 16379