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}
+
+
+
+