Commit 501cfe5afa7fc951e8d92dcdb80bfc8a5406543a
1 parent
0f7e715b
feat:【INFRA 基础设施】代码生成时,支持配置 VO/DO 模式
Showing
9 changed files
with
160 additions
and
28 deletions
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenVOTypeEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.infra.enums.codegen; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Getter; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * 代码生成的 VO 类型枚举 | ||
| 8 | + * | ||
| 9 | + * 目前的作用:Controller 新增、修改、响应时,使用 VO 还是 DO | ||
| 10 | + * 注意:不包括 Controller 的分页参数! | ||
| 11 | + * | ||
| 12 | + * @author 芋道源码 | ||
| 13 | + */ | ||
| 14 | +@AllArgsConstructor | ||
| 15 | +@Getter | ||
| 16 | +public enum CodegenVOTypeEnum { | ||
| 17 | + | ||
| 18 | + VO(10, "VO"), | ||
| 19 | + DO(20, "DO"); | ||
| 20 | + | ||
| 21 | + /** | ||
| 22 | + * 场景 | ||
| 23 | + */ | ||
| 24 | + private final Integer type; | ||
| 25 | + /** | ||
| 26 | + * 场景名 | ||
| 27 | + */ | ||
| 28 | + private final String name; | ||
| 29 | + | ||
| 30 | +} |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/framework/codegen/config/CodegenProperties.java
| 1 | package cn.iocoder.yudao.module.infra.framework.codegen.config; | 1 | package cn.iocoder.yudao.module.infra.framework.codegen.config; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; | 3 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; |
| 4 | +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum; | ||
| 4 | import lombok.Data; | 5 | import lombok.Data; |
| 5 | import org.springframework.boot.context.properties.ConfigurationProperties; | 6 | import org.springframework.boot.context.properties.ConfigurationProperties; |
| 6 | import org.springframework.validation.annotation.Validated; | 7 | import org.springframework.validation.annotation.Validated; |
| @@ -35,6 +36,14 @@ public class CodegenProperties { | @@ -35,6 +36,14 @@ public class CodegenProperties { | ||
| 35 | private Integer frontType; | 36 | private Integer frontType; |
| 36 | 37 | ||
| 37 | /** | 38 | /** |
| 39 | + * 代码生成的 VO 类型 | ||
| 40 | + * | ||
| 41 | + * 枚举 {@link CodegenVOTypeEnum#getType()} | ||
| 42 | + */ | ||
| 43 | + @NotNull(message = "代码生成的 VO 类型不能为空") | ||
| 44 | + private Integer voType; | ||
| 45 | + | ||
| 46 | + /** | ||
| 38 | * 是否生成单元测试 | 47 | * 是否生成单元测试 |
| 39 | */ | 48 | */ |
| 40 | @NotNull(message = "是否生成单元测试不能为空") | 49 | @NotNull(message = "是否生成单元测试不能为空") |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
| @@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; | @@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; | ||
| 31 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; | 31 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum; |
| 32 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum; | 32 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum; |
| 33 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; | 33 | import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; |
| 34 | +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum; | ||
| 34 | import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties; | 35 | import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties; |
| 35 | import com.google.common.annotations.VisibleForTesting; | 36 | import com.google.common.annotations.VisibleForTesting; |
| 36 | import com.google.common.collect.ImmutableTable; | 37 | import com.google.common.collect.ImmutableTable; |
| @@ -234,6 +235,7 @@ public class CodegenEngine { | @@ -234,6 +235,7 @@ public class CodegenEngine { | ||
| 234 | globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() | 235 | globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() |
| 235 | + '.' + "framework"); // 用于后续获取测试类的 package 地址 | 236 | + '.' + "framework"); // 用于后续获取测试类的 package 地址 |
| 236 | globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); | 237 | globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); |
| 238 | + globalBindingMap.put("voType", codegenProperties.getVoType()); | ||
| 237 | // 全局 Java Bean | 239 | // 全局 Java Bean |
| 238 | globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); | 240 | globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); |
| 239 | globalBindingMap.put("PageResultClassName", PageResult.class.getName()); | 241 | globalBindingMap.put("PageResultClassName", PageResult.class.getName()); |
| @@ -383,11 +385,13 @@ public class CodegenEngine { | @@ -383,11 +385,13 @@ public class CodegenEngine { | ||
| 383 | 385 | ||
| 384 | // className 相关 | 386 | // className 相关 |
| 385 | // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 | 387 | // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 |
| 388 | + String className = table.getClassName(); | ||
| 386 | String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName() | 389 | String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName() |
| 387 | : removePrefix(table.getClassName(), upperFirst(table.getModuleName())); | 390 | : removePrefix(table.getClassName(), upperFirst(table.getModuleName())); |
| 391 | + String classNameVar = lowerFirst(simpleClassName); | ||
| 388 | bindingMap.put("simpleClassName", simpleClassName); | 392 | bindingMap.put("simpleClassName", simpleClassName); |
| 389 | bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type | 393 | bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type |
| 390 | - bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 | 394 | + bindingMap.put("classNameVar", classNameVar); // 将 DictType 转换成 dictType,用于变量 |
| 391 | // 将 DictType 转换成 dict-type | 395 | // 将 DictType 转换成 dict-type |
| 392 | String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); | 396 | String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); |
| 393 | bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); | 397 | bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); |
| @@ -441,6 +445,22 @@ public class CodegenEngine { | @@ -441,6 +445,22 @@ public class CodegenEngine { | ||
| 441 | bindingMap.put("subClassNameVars", subClassNameVars); | 445 | bindingMap.put("subClassNameVars", subClassNameVars); |
| 442 | bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases); | 446 | bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases); |
| 443 | } | 447 | } |
| 448 | + | ||
| 449 | + // 多个 vm 公用的 VO 变量 | ||
| 450 | + if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { | ||
| 451 | + String prefixClass = CodegenSceneEnum.valueOf(table.getScene()).getPrefixClass(); | ||
| 452 | + bindingMap.put("saveReqVOClass", prefixClass + className + "SaveReqVO"); | ||
| 453 | + bindingMap.put("updateReqVOClass", prefixClass + className + "SaveReqVO"); | ||
| 454 | + bindingMap.put("respVOClass", prefixClass + className + "RespVO"); | ||
| 455 | + bindingMap.put("saveReqVOVar", "createReqVO"); | ||
| 456 | + bindingMap.put("updateReqVOVar", "updateReqVO"); | ||
| 457 | + } else if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.DO.getType())) { | ||
| 458 | + bindingMap.put("saveReqVOClass", className + "DO"); | ||
| 459 | + bindingMap.put("updateReqVOClass", className + "DO"); | ||
| 460 | + bindingMap.put("respVOClass", className + "DO"); | ||
| 461 | + bindingMap.put("saveReqVOVar", classNameVar); | ||
| 462 | + bindingMap.put("updateReqVOVar", classNameVar); | ||
| 463 | + } | ||
| 444 | return bindingMap; | 464 | return bindingMap; |
| 445 | } | 465 | } |
| 446 | 466 | ||
| @@ -461,6 +481,11 @@ public class CodegenEngine { | @@ -461,6 +481,11 @@ public class CodegenEngine { | ||
| 461 | templates.remove(javaTemplatePath("test/serviceTest")); | 481 | templates.remove(javaTemplatePath("test/serviceTest")); |
| 462 | templates.remove("codegen/sql/h2.vm"); | 482 | templates.remove("codegen/sql/h2.vm"); |
| 463 | } | 483 | } |
| 484 | + // 如果禁用 VO 类型,则移除对应的模版 | ||
| 485 | + if (ObjectUtil.notEqual(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { | ||
| 486 | + templates.remove(javaTemplatePath("controller/vo/respVO")); | ||
| 487 | + templates.remove(javaTemplatePath("controller/vo/saveReqVO")); | ||
| 488 | + } | ||
| 464 | return templates; | 489 | return templates; |
| 465 | } | 490 | } |
| 466 | 491 |
yudao-module-infra/src/main/resources/codegen/java/controller/controller.vm
| @@ -49,8 +49,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -49,8 +49,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 49 | #if ($sceneEnum.scene == 1) | 49 | #if ($sceneEnum.scene == 1) |
| 50 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") | 50 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") |
| 51 | #end | 51 | #end |
| 52 | - public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) { | ||
| 53 | - return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); | 52 | + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) { |
| 53 | + return success(${classNameVar}Service.create${simpleClassName}(${saveReqVOVar})); | ||
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | @PutMapping("/update") | 56 | @PutMapping("/update") |
| @@ -58,8 +58,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -58,8 +58,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 58 | #if ($sceneEnum.scene == 1) | 58 | #if ($sceneEnum.scene == 1) |
| 59 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") | 59 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") |
| 60 | #end | 60 | #end |
| 61 | - public CommonResult<Boolean> update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) { | ||
| 62 | - ${classNameVar}Service.update${simpleClassName}(updateReqVO); | 61 | + public CommonResult<Boolean> update${simpleClassName}(@Valid @RequestBody ${updateReqVOClass} ${updateReqVOVar}) { |
| 62 | + ${classNameVar}Service.update${simpleClassName}(${updateReqVOVar}); | ||
| 63 | return success(true); | 63 | return success(true); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| @@ -80,9 +80,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -80,9 +80,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 80 | #if ($sceneEnum.scene == 1) | 80 | #if ($sceneEnum.scene == 1) |
| 81 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") | 81 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") |
| 82 | #end | 82 | #end |
| 83 | - public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { | 83 | + public CommonResult<${respVOClass}> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { |
| 84 | ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); | 84 | ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); |
| 85 | - return success(BeanUtils.toBean(${classNameVar}, ${sceneEnum.prefixClass}${table.className}RespVO.class)); | 85 | +#if ($voType == 10) |
| 86 | + return success(BeanUtils.toBean(${classNameVar}, ${respVOClass}.class)); | ||
| 87 | +#else | ||
| 88 | + return success(${classNameVar}); | ||
| 89 | +#end | ||
| 86 | } | 90 | } |
| 87 | 91 | ||
| 88 | #if ( $table.templateType != 2 ) | 92 | #if ( $table.templateType != 2 ) |
| @@ -91,9 +95,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -91,9 +95,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 91 | #if ($sceneEnum.scene == 1) | 95 | #if ($sceneEnum.scene == 1) |
| 92 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") | 96 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") |
| 93 | #end | 97 | #end |
| 94 | - public CommonResult<PageResult<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { | 98 | + public CommonResult<PageResult<${respVOClass}>> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { |
| 95 | PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO); | 99 | PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO); |
| 96 | - return success(BeanUtils.toBean(pageResult, ${sceneEnum.prefixClass}${table.className}RespVO.class)); | 100 | +#if ($voType == 10) |
| 101 | + return success(BeanUtils.toBean(pageResult, ${respVOClass}.class)); | ||
| 102 | +#else | ||
| 103 | + return success(pageResult); | ||
| 104 | +#end | ||
| 97 | } | 105 | } |
| 98 | 106 | ||
| 99 | ## 特殊:树表专属逻辑(树不需要分页接口) | 107 | ## 特殊:树表专属逻辑(树不需要分页接口) |
| @@ -103,9 +111,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -103,9 +111,13 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 103 | #if ($sceneEnum.scene == 1) | 111 | #if ($sceneEnum.scene == 1) |
| 104 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") | 112 | @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") |
| 105 | #end | 113 | #end |
| 106 | - public CommonResult<List<${sceneEnum.prefixClass}${table.className}RespVO>> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { | 114 | + public CommonResult<List<${respVOClass}>> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { |
| 107 | List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); | 115 | List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); |
| 108 | - return success(BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class)); | 116 | +#if ($voType == 10) |
| 117 | + return success(BeanUtils.toBean(list, ${respVOClass}.class)); | ||
| 118 | +#else | ||
| 119 | + return success(list); | ||
| 120 | +#end | ||
| 109 | } | 121 | } |
| 110 | 122 | ||
| 111 | #end | 123 | #end |
| @@ -121,8 +133,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | @@ -121,8 +133,8 @@ public class ${sceneEnum.prefixClass}${table.className}Controller { | ||
| 121 | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | 133 | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| 122 | List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList(); | 134 | List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList(); |
| 123 | // 导出 Excel | 135 | // 导出 Excel |
| 124 | - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}RespVO.class, | ||
| 125 | - BeanUtils.toBean(list, ${sceneEnum.prefixClass}${table.className}RespVO.class)); | 136 | + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${respVOClass}.class, |
| 137 | + BeanUtils.toBean(list, ${respVOClass}.class)); | ||
| 126 | } | 138 | } |
| 127 | ## 特殊:树表专属逻辑(树不需要分页接口) | 139 | ## 特殊:树表专属逻辑(树不需要分页接口) |
| 128 | #else | 140 | #else |
yudao-module-infra/src/main/resources/codegen/java/dal/do.vm
| @@ -12,6 +12,18 @@ import java.time.LocalDateTime; | @@ -12,6 +12,18 @@ import java.time.LocalDateTime; | ||
| 12 | #end | 12 | #end |
| 13 | import com.baomidou.mybatisplus.annotation.*; | 13 | import com.baomidou.mybatisplus.annotation.*; |
| 14 | import ${BaseDOClassName}; | 14 | import ${BaseDOClassName}; |
| 15 | +## 处理 Excel 导出 + Schema 注解(仅 DO 模式) | ||
| 16 | +#if ($voType == 20) | ||
| 17 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 18 | +import com.alibaba.excel.annotation.*; | ||
| 19 | +#foreach ($column in $columns) | ||
| 20 | + #if ("$!column.dictType" != "")## 有设置数据字典 | ||
| 21 | + import ${DictFormatClassName}; | ||
| 22 | + import ${DictConvertClassName}; | ||
| 23 | + #break | ||
| 24 | + #end | ||
| 25 | +#end | ||
| 26 | +#end | ||
| 15 | 27 | ||
| 16 | /** | 28 | /** |
| 17 | * ${table.classComment} DO | 29 | * ${table.classComment} DO |
| @@ -26,6 +38,11 @@ import ${BaseDOClassName}; | @@ -26,6 +38,11 @@ import ${BaseDOClassName}; | ||
| 26 | @Builder | 38 | @Builder |
| 27 | @NoArgsConstructor | 39 | @NoArgsConstructor |
| 28 | @AllArgsConstructor | 40 | @AllArgsConstructor |
| 41 | +## 处理 Excel 导出 + Schema 注解(仅 DO 模式) | ||
| 42 | +#if ($voType == 20) | ||
| 43 | +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") | ||
| 44 | +@ExcelIgnoreUnannotated | ||
| 45 | +#end | ||
| 29 | public class ${table.className}DO extends BaseDO { | 46 | public class ${table.className}DO extends BaseDO { |
| 30 | 47 | ||
| 31 | ## 特殊:树表专属逻辑 | 48 | ## 特殊:树表专属逻辑 |
| @@ -45,6 +62,18 @@ public class ${table.className}DO extends BaseDO { | @@ -45,6 +62,18 @@ public class ${table.className}DO extends BaseDO { | ||
| 45 | #if (${column.primaryKey})##处理主键 | 62 | #if (${column.primaryKey})##处理主键 |
| 46 | @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end | 63 | @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end |
| 47 | #end | 64 | #end |
| 65 | +#if ($voType == 20) | ||
| 66 | +## 1. 处理 Swagger 注解 | ||
| 67 | + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) | ||
| 68 | +## 2. 处理 Excel 导出 | ||
| 69 | +#if ("$!column.dictType" != "")##处理枚举值 | ||
| 70 | + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) | ||
| 71 | + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 | ||
| 72 | +#else | ||
| 73 | + @ExcelProperty("${column.columnComment}") | ||
| 74 | +#end | ||
| 75 | +#end | ||
| 76 | +## 3. 处理字段定义 | ||
| 48 | private ${column.javaType} ${column.javaField}; | 77 | private ${column.javaType} ${column.javaField}; |
| 49 | #end | 78 | #end |
| 50 | #end | 79 | #end |
yudao-module-infra/src/main/resources/codegen/java/dal/do_sub.vm
| @@ -14,6 +14,17 @@ import java.time.LocalDateTime; | @@ -14,6 +14,17 @@ import java.time.LocalDateTime; | ||
| 14 | #end | 14 | #end |
| 15 | import com.baomidou.mybatisplus.annotation.*; | 15 | import com.baomidou.mybatisplus.annotation.*; |
| 16 | import ${BaseDOClassName}; | 16 | import ${BaseDOClassName}; |
| 17 | +## 处理 Schema 注解(仅 DO 模式) | ||
| 18 | +#if ($voType == 20) | ||
| 19 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 20 | +#foreach ($column in $columns) | ||
| 21 | + #if ("$!column.dictType" != "")## 有设置数据字典 | ||
| 22 | + import ${DictFormatClassName}; | ||
| 23 | + import ${DictConvertClassName}; | ||
| 24 | + #break | ||
| 25 | + #end | ||
| 26 | +#end | ||
| 27 | +#end | ||
| 17 | 28 | ||
| 18 | /** | 29 | /** |
| 19 | * ${subTable.classComment} DO | 30 | * ${subTable.classComment} DO |
| @@ -28,6 +39,10 @@ import ${BaseDOClassName}; | @@ -28,6 +39,10 @@ import ${BaseDOClassName}; | ||
| 28 | @Builder | 39 | @Builder |
| 29 | @NoArgsConstructor | 40 | @NoArgsConstructor |
| 30 | @AllArgsConstructor | 41 | @AllArgsConstructor |
| 42 | +## 处理 Schema 注解(仅 DO 模式) | ||
| 43 | +#if ($voType == 20) | ||
| 44 | +@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") | ||
| 45 | +#end | ||
| 31 | public class ${subTable.className}DO extends BaseDO { | 46 | public class ${subTable.className}DO extends BaseDO { |
| 32 | 47 | ||
| 33 | #foreach ($column in $subColumns) | 48 | #foreach ($column in $subColumns) |
| @@ -42,6 +57,11 @@ public class ${subTable.className}DO extends BaseDO { | @@ -42,6 +57,11 @@ public class ${subTable.className}DO extends BaseDO { | ||
| 42 | #if (${column.primaryKey})##处理主键 | 57 | #if (${column.primaryKey})##处理主键 |
| 43 | @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end | 58 | @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end |
| 44 | #end | 59 | #end |
| 60 | +#if ($voType == 20) | ||
| 61 | +## 1. 处理 Swagger 注解 | ||
| 62 | + @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) | ||
| 63 | +#end | ||
| 64 | +## 2. 处理字段定义 | ||
| 45 | private ${column.javaType} ${column.javaField}; | 65 | private ${column.javaType} ${column.javaField}; |
| 46 | #end | 66 | #end |
| 47 | #end | 67 | #end |
yudao-module-infra/src/main/resources/codegen/java/service/service.vm
| @@ -21,17 +21,17 @@ public interface ${table.className}Service { | @@ -21,17 +21,17 @@ public interface ${table.className}Service { | ||
| 21 | /** | 21 | /** |
| 22 | * 创建${table.classComment} | 22 | * 创建${table.classComment} |
| 23 | * | 23 | * |
| 24 | - * @param createReqVO 创建信息 | 24 | + * @param ${saveReqVOVar} 创建信息 |
| 25 | * @return 编号 | 25 | * @return 编号 |
| 26 | */ | 26 | */ |
| 27 | - ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO); | 27 | + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar}); |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * 更新${table.classComment} | 30 | * 更新${table.classComment} |
| 31 | * | 31 | * |
| 32 | - * @param updateReqVO 更新信息 | 32 | + * @param ${updateReqVOVar} 更新信息 |
| 33 | */ | 33 | */ |
| 34 | - void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO); | 34 | + void update${simpleClassName}(@Valid ${updateReqVOClass} ${updateReqVOVar}); |
| 35 | 35 | ||
| 36 | /** | 36 | /** |
| 37 | * 删除${table.classComment} | 37 | * 删除${table.classComment} |
yudao-module-infra/src/main/resources/codegen/java/service/serviceImpl.vm
| @@ -49,19 +49,21 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | @@ -49,19 +49,21 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | ||
| 49 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) | 49 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) |
| 50 | @Transactional(rollbackFor = Exception.class) | 50 | @Transactional(rollbackFor = Exception.class) |
| 51 | #end | 51 | #end |
| 52 | - public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) { | 52 | + public ${primaryColumn.javaType} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) { |
| 53 | ## 特殊:树表专属逻辑 | 53 | ## 特殊:树表专属逻辑 |
| 54 | #if ( $table.templateType == 2 ) | 54 | #if ( $table.templateType == 2 ) |
| 55 | #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 | 55 | #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 |
| 56 | #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 | 56 | #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 |
| 57 | // 校验${treeParentColumn.columnComment}的有效性 | 57 | // 校验${treeParentColumn.columnComment}的有效性 |
| 58 | - validateParent${simpleClassName}(null, createReqVO.get${TreeParentJavaField}()); | 58 | + validateParent${simpleClassName}(null, ${createReqVOVar}.get${TreeParentJavaField}()); |
| 59 | // 校验${treeNameColumn.columnComment}的唯一性 | 59 | // 校验${treeNameColumn.columnComment}的唯一性 |
| 60 | - validate${simpleClassName}${TreeNameJavaField}Unique(null, createReqVO.get${TreeParentJavaField}(), createReqVO.get${TreeNameJavaField}()); | 60 | + validate${simpleClassName}${TreeNameJavaField}Unique(null, ${createReqVOVar}.get${TreeParentJavaField}(), ${createReqVOVar}.get${TreeNameJavaField}()); |
| 61 | 61 | ||
| 62 | #end | 62 | #end |
| 63 | // 插入 | 63 | // 插入 |
| 64 | +#if ($voType == 10) | ||
| 64 | ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class); | 65 | ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class); |
| 66 | +#end | ||
| 65 | ${classNameVar}Mapper.insert(${classNameVar}); | 67 | ${classNameVar}Mapper.insert(${classNameVar}); |
| 66 | ## 特殊:主子表专属逻辑(非 ERP 模式) | 68 | ## 特殊:主子表专属逻辑(非 ERP 模式) |
| 67 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) | 69 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) |
| @@ -73,9 +75,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | @@ -73,9 +75,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | ||
| 73 | #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 | 75 | #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 |
| 74 | #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 | 76 | #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 |
| 75 | #if ( $subTable.subJoinMany) | 77 | #if ( $subTable.subJoinMany) |
| 76 | - create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s()); | 78 | + create${subSimpleClassName}List(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}s()); |
| 77 | #else | 79 | #else |
| 78 | - create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}()); | 80 | + create${subSimpleClassName}(${classNameVar}.getId(), ${createReqVOVar}.get${subSimpleClassNames.get($index)}()); |
| 79 | #end | 81 | #end |
| 80 | #end | 82 | #end |
| 81 | #end | 83 | #end |
| @@ -88,22 +90,26 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | @@ -88,22 +90,26 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | ||
| 88 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) | 90 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) |
| 89 | @Transactional(rollbackFor = Exception.class) | 91 | @Transactional(rollbackFor = Exception.class) |
| 90 | #end | 92 | #end |
| 91 | - public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) { | 93 | + public void update${simpleClassName}(${updateReqVOClass} ${updateReqVOVar}) { |
| 92 | // 校验存在 | 94 | // 校验存在 |
| 93 | - validate${simpleClassName}Exists(updateReqVO.getId()); | 95 | + validate${simpleClassName}Exists(${updateReqVOVar}.getId()); |
| 94 | ## 特殊:树表专属逻辑 | 96 | ## 特殊:树表专属逻辑 |
| 95 | #if ( $table.templateType == 2 ) | 97 | #if ( $table.templateType == 2 ) |
| 96 | #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 | 98 | #set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 |
| 97 | #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 | 99 | #set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 |
| 98 | // 校验${treeParentColumn.columnComment}的有效性 | 100 | // 校验${treeParentColumn.columnComment}的有效性 |
| 99 | - validateParent${simpleClassName}(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}()); | 101 | + validateParent${simpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}()); |
| 100 | // 校验${treeNameColumn.columnComment}的唯一性 | 102 | // 校验${treeNameColumn.columnComment}的唯一性 |
| 101 | - validate${simpleClassName}${TreeNameJavaField}Unique(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}(), updateReqVO.get${TreeNameJavaField}()); | 103 | + validate${simpleClassName}${TreeNameJavaField}Unique(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}(), ${updateReqVOVar}.get${TreeNameJavaField}()); |
| 102 | 104 | ||
| 103 | #end | 105 | #end |
| 104 | // 更新 | 106 | // 更新 |
| 107 | +#if ($voType == 10) | ||
| 105 | ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class); | 108 | ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class); |
| 106 | ${classNameVar}Mapper.updateById(updateObj); | 109 | ${classNameVar}Mapper.updateById(updateObj); |
| 110 | +#else | ||
| 111 | + ${classNameVar}Mapper.updateById(${updateReqVOVar}); | ||
| 112 | +#end | ||
| 107 | ## 特殊:主子表专属逻辑(非 ERP 模式) | 113 | ## 特殊:主子表专属逻辑(非 ERP 模式) |
| 108 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11) | 114 | #if ( $subTables && $subTables.size() > 0 && $table.templateType != 11) |
| 109 | 115 | ||
| @@ -114,9 +120,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | @@ -114,9 +120,9 @@ public class ${table.className}ServiceImpl implements ${table.className}Service | ||
| 114 | #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 | 120 | #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 |
| 115 | #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 | 121 | #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 |
| 116 | #if ( $subTable.subJoinMany) | 122 | #if ( $subTable.subJoinMany) |
| 117 | - update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s()); | 123 | + update${subSimpleClassName}List(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}s()); |
| 118 | #else | 124 | #else |
| 119 | - update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}()); | 125 | + update${subSimpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}()); |
| 120 | #end | 126 | #end |
| 121 | #end | 127 | #end |
| 122 | #end | 128 | #end |
yudao-server/src/main/resources/application.yaml
| @@ -269,6 +269,7 @@ yudao: | @@ -269,6 +269,7 @@ yudao: | ||
| 269 | base-package: ${yudao.info.base-package} | 269 | base-package: ${yudao.info.base-package} |
| 270 | db-schemas: ${spring.datasource.dynamic.datasource.master.name} | 270 | db-schemas: ${spring.datasource.dynamic.datasource.master.name} |
| 271 | front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 | 271 | front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 |
| 272 | + vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 | ||
| 272 | unit-test-enable: false # 是否生成单元测试 | 273 | unit-test-enable: false # 是否生成单元测试 |
| 273 | tenant: # 多租户相关配置项 | 274 | tenant: # 多租户相关配置项 |
| 274 | enable: true | 275 | enable: true |