From 1dee2ae5f49e3998dc67720abc507a23922f7820 Mon Sep 17 00:00:00 2001 From: 15858193327 Date: Tue, 3 Nov 2020 02:16:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(code-gen):=20=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shoulder/generator/GeneratorApp.java | 6 +- .../generator/mapper/SysGeneratorMapper.xml | 4 +- .../shoulder/generator/model/TableEntity.java | 11 +++ .../shoulder/generator/utils/GenUtils.java | 27 ++++++- .../resources/template/Controller.java.vm | 75 ++++++++++++------ .../main/resources/template/Converter.java.vm | 48 ++++++++++++ .../src/main/resources/template/DTO.java.vm | 15 ++-- .../main/resources/template/JpaEntity.java.vm | 15 ++-- .../resources/template/JpaRepository.java.vm | 1 + .../main/resources/template/Mapper.java.vm | 41 +++++++++- .../src/main/resources/template/Mapper.xml.vm | 56 +++++++++----- .../src/main/resources/template/Model.java.vm | 15 ++-- .../src/main/resources/template/PO.java.vm | 15 +++- .../main/resources/template/Service.java.vm | 45 +++++++---- .../resources/template/ServiceImpl.java.vm | 76 +++++++++++-------- shoulder-system-center/system-common/pom.xml | 26 +++++++ 16 files changed, 357 insertions(+), 119 deletions(-) create mode 100644 shoulder-generator/src/main/resources/template/Converter.java.vm diff --git a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/GeneratorApp.java b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/GeneratorApp.java index 481e4fb..af5e5b6 100644 --- a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/GeneratorApp.java +++ b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/GeneratorApp.java @@ -44,7 +44,7 @@ public class GeneratorApp { private final SysGeneratorService sysGeneratorService; /** - * 列出数据库中所有表 + * ===========【 列出数据库中所有表 】=========== * 列出数据库中所有表 */ @ResponseBody @@ -54,9 +54,9 @@ public class GeneratorApp { } /** - * 生成代码 + * ===========【 生成代码 】=========== * web 中不需要主动关闭流 - * 所有表 + * 所有表生成代码 * @param tables 表名,逗号分隔,_all 全部 */ @RequestMapping("code") diff --git a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/mapper/SysGeneratorMapper.xml b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/mapper/SysGeneratorMapper.xml index f5f2f37..f8cd47f 100644 --- a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/mapper/SysGeneratorMapper.xml +++ b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/mapper/SysGeneratorMapper.xml @@ -29,7 +29,9 @@ \ No newline at end of file diff --git a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/model/TableEntity.java b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/model/TableEntity.java index 7a28660..f66f94b 100644 --- a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/model/TableEntity.java +++ b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/model/TableEntity.java @@ -25,4 +25,15 @@ public class TableEntity { //类名(第一个字母小写),如:sys_user => sysUser private String lowClassName; + /** + * Controller 中生成校验权限注解(Spring Security) + */ + private boolean checkAuth; + + /** + * 表类型: + * TREE(parent_id), CREATOR, MODIFIER, CREATOR_TIME, UPDATE_TIME, BATCH + */ + private List types; + } diff --git a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/utils/GenUtils.java b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/utils/GenUtils.java index 9ad3b34..56ac0f5 100644 --- a/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/utils/GenUtils.java +++ b/shoulder-generator/src/main/java/cn/itlym/shoulder/generator/utils/GenUtils.java @@ -33,15 +33,21 @@ public class GenUtils { */ public static List getTemplates() { List templates = new ArrayList(); + templates.add("template/Controller.java.vm"); + templates.add("template/JpaEntity.java.vm"); templates.add("template/JpaRepository.java.vm"); + templates.add("template/Model.java.vm"); + templates.add("template/DTO.java.vm"); templates.add("template/PO.java.vm"); - templates.add("template/Mapper.java.vm"); - templates.add("template/Mapper.xml.vm"); + templates.add("template/Converter.java.vm"); + templates.add("template/Service.java.vm"); templates.add("template/ServiceImpl.java.vm"); - templates.add("template/Controller.java.vm"); + + templates.add("template/Mapper.java.vm"); + templates.add("template/Mapper.xml.vm"); templates.add("template/index.html.vm"); @@ -131,6 +137,9 @@ public class GenUtils { columnEntity.setDataType(column.get("dataType")); columnEntity.setComments(column.get("columnComment")); columnEntity.setExtra(column.get("extra")); + String len = String.valueOf(column.get("charLength")); + columnEntity.setLength("null".equalsIgnoreCase(len) ? 0 : Integer.parseInt(len)); + columnEntity.setNotEmpty("NO".equalsIgnoreCase(column.get("isNullable"))); //列名转换成Java属性名 String attrName = columnToJava(columnEntity.getColumnName()); @@ -197,10 +206,22 @@ public class GenUtils { return packagePath + "entity" + File.separator + className + "Entity.java"; } + if (template.contains("Model.java.vm")) { + return packagePath + "model" + File.separator + className + ".java"; + } + if (template.contains("PO.java.vm")) { return packagePath + "po" + File.separator + className + "PO.java"; } + if (template.contains("DTO.java.vm")) { + return packagePath + "dto" + File.separator + className + "DTO.java"; + } + + if (template.contains("Converter.java.vm")) { + return packagePath + "convert" + File.separator + className + "Converter.java"; + } + if (template.contains("Mapper.java.vm")) { return packagePath + "dao" + File.separator + className + "Mapper.java"; } diff --git a/shoulder-generator/src/main/resources/template/Controller.java.vm b/shoulder-generator/src/main/resources/template/Controller.java.vm index 5c22900..1aaf112 100644 --- a/shoulder-generator/src/main/resources/template/Controller.java.vm +++ b/shoulder-generator/src/main/resources/template/Controller.java.vm @@ -3,17 +3,18 @@ package ${package}.${pkgName}.controller; import java.util.Map; import io.swagger.annotations.Api; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +#if(${checkAuth}) import org.springframework.security.access.prepost.PreAuthorize; +#end import org.shoulder.core.dto.response.PageResult; import org.shoulder.core.dto.response.RestResult; -import ${package}.${pkgName}.po.${className}; +import ${package}.${pkgName}.convert.${className}Converter; +import ${package}.${pkgName}.dto.${className}DTO; +import ${package}.${pkgName}.model.${className}; import ${package}.${pkgName}.service.${className}Service; /** @@ -35,50 +36,80 @@ public class ${className}Controller { * @param condition 查询条件 * @return 分页结果 */ - @RequestMapping("/list") + @RequestMapping("list") +#if(${checkAuth}) @PreAuthorize("hasAnyAuthority('${tableName}:${pathName}:list')") +#end public PageResult list(@RequestParam Map condition){ - PageResult pageResult = ${lowClassName}Service.findAll(condition); - return pageResult; + return ${lowClassName}Service.findAll(condition); } /** - * 保存单个 - * @param ${lowClassName} 新增数据 + * 保存单个,推荐使用幂等的 PUT 方法,体现接口幂等性。为了方便习惯,也开放了 POST + * + * @param ${lowClassName}DTO 新增数据 * @return 保存成功 */ - @RequestMapping("/save") + @RequestMapping(value = "save", method = {RequestMethod.PUT, RequestMethod.POST}) +#if(${checkAuth}) @PreAuthorize("hasAnyAuthority('resource:sysroleuser:save')") - public RestResult save(@RequestBody ${className} ${lowClassName}){ - ${lowClassName}Service.save(${lowClassName}); +#end + public RestResult save(@RequestBody ${className}DTO ${lowClassName}DTO){ + ${className} ${lowClassName} = ${className}Converter.CONVERTER.fromDTO(${lowClassName}DTO); + ${lowClassName}Service.save(${lowClassName}); - return RestResult.succeed(); + return RestResult.success(); } /** * 单个修改 - * @param ${lowClassName} 修改属性 + * + * @param ${lowClassName}DTO 修改属性 * @return 修改成功 */ - @RequestMapping("/update") + @PostMapping("update") +#if(${checkAuth}) @PreAuthorize("hasAnyAuthority('resource:sysroleuser:update')") - public RestResult update(@RequestBody ${className} ${lowClassName}){ +#end + public RestResult update(@RequestBody ${className}DTO ${lowClassName}DTO){ + ${className} ${lowClassName} = ${className}Converter.CONVERTER.fromDTO(${lowClassName}DTO); ${lowClassName}Service.update(${lowClassName}); - return RestResult.succeed(); + return RestResult.success(); } /** * 根据 id 删除单个 + * * @param ${pk.attributeName} id * @return 删除成功 */ - @RequestMapping("/delete/{id}") + @RequestMapping(value = "delete/{id}", method = {RequestMethod.DELETE, RequestMethod.POST}) +#if(${checkAuth}) @PreAuthorize("hasAnyAuthority('resource:sysroleuser:delete')") +#end public RestResult delete(@PathVariable Long ${pk.attributeName}){ - ${lowClassName}Service.delete(${pk.attributeName}); - return RestResult.succeed(); + ${lowClassName}Service.deleteById(${pk.attributeName}); + return RestResult.success(); + } + + /** + * 根据 id 批量删除 + * + * @param idList ids + * @return 删除成功 + */ + @RequestMapping(value = "delete", method = {RequestMethod.DELETE, RequestMethod.POST}) +#if(${checkAuth}) + @PreAuthorize("hasAnyAuthority('resource:sysroleuser:delete')") +#end + public RestResult delete(List idList){ + if(CollectionUtils.isEmpty(idList)){ + return RestResult.success(); + } + ${lowClassName}Service.deleteByIds(idList); + return RestResult.success(); } } diff --git a/shoulder-generator/src/main/resources/template/Converter.java.vm b/shoulder-generator/src/main/resources/template/Converter.java.vm new file mode 100644 index 0000000..b6ddeb6 --- /dev/null +++ b/shoulder-generator/src/main/resources/template/Converter.java.vm @@ -0,0 +1,48 @@ +package ${package}.${pkgName}.convert; + +import ${package}.${pkgName}.model.${className}; +import ${package}.${pkgName}.po.${className}PO; +import ${package}.${pkgName}.dto.${className}DTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * ${comments} 模型转换 + * + * @author ${author} + * @date ${datetime} + */ +@Mapper(componentModel = "spring") // 置为 spring 默认作为 bean 注入 Spring 容器中 +public interface ${className}Converter { + + ${className}Converter CONVERTER = Mappers.getMapper(${className}Converter.class); + + /** + * DTO 转为标准模型,用于接口传入时 + * @param dto 传输层对象 + * @return 标准模型 + */ + ${className} fromDTO(${className}DTO dto); + + /** + * PO 转为标准模型,用于存储中返回查询结果后 + * @param po 持久层对象 + * @return 标准模型 + */ + ${className} fromPO(${className}PO po); + + /** + * 标准模型转为 DTO,用于接口返回查询结果时,转化为视图层对象 + * @param model 标准模型 + * @return 传输层对象 + */ + ${className}DTO toDTO(${className} model); + + /** + * 标准模型转为 PO,用于存储入库前 + * @param model 标准模型 + * @return 持久层对象 + */ + ${className}PO toPO(${className} model); + +} \ No newline at end of file diff --git a/shoulder-generator/src/main/resources/template/DTO.java.vm b/shoulder-generator/src/main/resources/template/DTO.java.vm index 77fcd14..4cc4da9 100644 --- a/shoulder-generator/src/main/resources/template/DTO.java.vm +++ b/shoulder-generator/src/main/resources/template/DTO.java.vm @@ -8,6 +8,9 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + #if(${hasBigDecimal}) import java.math.BigDecimal; #end @@ -15,12 +18,11 @@ import java.io.Serializable; import java.util.Date; /** - * ${comments} + * ${comments} 传输层定义 分为 param(add / update)、vo * * @author ${author} * @date ${datetime} */ - @Data @NoArgsConstructor @AllArgsConstructor @@ -29,18 +31,17 @@ import java.util.Date; @ApiModel(value = "${className}DTO", description = "${tableName}") public class ${className}DTO implements Serializable { private static final long serialVersionUID = 1L; - #foreach ($column in $columns) /** * $column.comments */ - #if($column.notEmpty) +#if($column.notEmpty) @NotNull(message = "$column.comments 不能为空") - #end - #if($column.length > 0) +#end +#if($column.length > 0) @Length(max = $column.length, message = "$column.comments 长度不能超过 $column.length") - #end +#end @ApiModelProperty(value = "$column.comments", notes = "$column.comments") private $column.attrType $column.attributeName; #end diff --git a/shoulder-generator/src/main/resources/template/JpaEntity.java.vm b/shoulder-generator/src/main/resources/template/JpaEntity.java.vm index dad0e74..e7bf82d 100644 --- a/shoulder-generator/src/main/resources/template/JpaEntity.java.vm +++ b/shoulder-generator/src/main/resources/template/JpaEntity.java.vm @@ -1,5 +1,8 @@ package ${package}.${pkgName}.entity; +import lombok.AllArgsConstructor; +import lombok.experimental.Accessors; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.annotations.GenericGenerator; @@ -20,18 +23,20 @@ import java.util.Date; @Data @Entity @NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Builder @Table// 唯一索引 (uniqueConstraints = {@UniqueConstraint(name = "uk_$pk.columnName", columnNames = {"$pk.columnName"})}) public class ${className}Entity implements Serializable { -private static final long serialVersionUID = 1L; - + private static final long serialVersionUID = 1L; #foreach ($column in $columns) - #if($column.columnName == $pk.columnName) +#if($column.columnName == $pk.columnName) @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") - #end -private $column.attrType $column.attributeName; +#end + private $column.attrType $column.attributeName; #end } diff --git a/shoulder-generator/src/main/resources/template/JpaRepository.java.vm b/shoulder-generator/src/main/resources/template/JpaRepository.java.vm index ed2d8bd..e10e772 100644 --- a/shoulder-generator/src/main/resources/template/JpaRepository.java.vm +++ b/shoulder-generator/src/main/resources/template/JpaRepository.java.vm @@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import ${package}.${pkgName}.entity.${className}Entity; import javax.transaction.Transactional; import java.util.List; diff --git a/shoulder-generator/src/main/resources/template/Mapper.java.vm b/shoulder-generator/src/main/resources/template/Mapper.java.vm index c4c732f..0b0d7ea 100644 --- a/shoulder-generator/src/main/resources/template/Mapper.java.vm +++ b/shoulder-generator/src/main/resources/template/Mapper.java.vm @@ -1,10 +1,11 @@ package ${package}.${pkgName}.dao; -import ${package}.${pkgName}.po.${className}; +import ${package}.${pkgName}.po.${className}PO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; + /** * ${comments} * @@ -14,12 +15,44 @@ import java.util.Map; @Mapper public interface ${className}Mapper { - int insert(${className}PO ${lowClassName}); + /** + * 插入单条记录 + * + * @param ${lowClassName}PO 要添加的 + * @return 数据库影响行数 + */ + int insert(${className}PO ${lowClassName}PO); - int update(${className}PO ${lowClassName}); + /** + * 更新单个 + * + * @param ${lowClassName}PO 要更新的 + * @return 数据库影响行数 + */ + int update(${className}PO ${lowClassName}PO); - int delete(Long id); + /** + * 根据 id 删除单个 + * + * @param id 要删除的数据 id + * @return 数据库影响行数 + */ + int deleteById(Long id); + /** + * 根据 ids 批量删除 + * + * @param ids 要删除的数据 id + * @return 数据库影响行数 + */ + int deleteByIds(List ids); + + /** + * 分页查询 + * + * @param params 查询条件 + * @return 查询结果 + */ List<${className}PO> findAll(Map params); } diff --git a/shoulder-generator/src/main/resources/template/Mapper.xml.vm b/shoulder-generator/src/main/resources/template/Mapper.xml.vm index e0d03d5..2e847d9 100644 --- a/shoulder-generator/src/main/resources/template/Mapper.xml.vm +++ b/shoulder-generator/src/main/resources/template/Mapper.xml.vm @@ -10,42 +10,64 @@ #end +#if(${baseColumnList}) + + + ${pk} +#foreach($column in $columns) + , ${column.columnName} +#end + +#end + insert into ${tableName}( - #foreach($column in $columns) - #if( $!{velocityCount} == $!{columns.size()}) +#foreach($column in $columns) +#if( $!{velocityCount} == $!{columns.size()}) ${column.columnName} - #else +#else ${column.columnName}, - #end - #end +#end +#end ) values ( - #foreach($column in $columns) - #if( $!{velocityCount} == $!{columns.size()}) +#foreach($column in $columns) +#if( $!{velocityCount} == $!{columns.size()}) #{${column.columnName}} - #else +#else #{ ${column.columnName}}, - #end - #end +#end +#end ) update ${tableName} - #foreach($column in $columns) +#foreach($column in $columns) ${column.columnName} = #{${column.columnName}}, - #end +#end where id = #{id} + delete from ${tableName} where id = #{id} + + + delete from ${tableName} + + id in + + #{id} + + + +