EasyCode介绍及自定义模板

EasyCode介绍及自定义模板一 前言 最近做了几个傻瓜式的 CRUD 模块 光调整 EasyCode 生成的代码格式就调整了半天 毫无意义 但又必不可少 于是 网上找了关于 EasyCode 自定义模板的文章 尝试自定义模板 从根本上解决代码格式调整的痛点 EasyCode 是 IDEA 开发的一个代码生成插件

大家好,我是讯享网,很高兴认识大家。

一、前言

        最近做了几个傻瓜式的CRUD模块,光调整EasyCode生成的代码格式就调整了半天,毫无意义,但又必不可少。于是,网上找了关于EasyCode自定义模板的文章,尝试自定义模板,从根本上解决代码格式调整的痛点。

        EasyCode是 IDEA 开发的一个代码生成插件,主要通过自定义模板(基于velocity)来生成各种你想要的代码。经过测试,理论上来说只要是与数据有关的代码或文档都是可以生成的,例如:Controller、Service、Entity、Mapper、XML、README、HTML、JS等。

二、简要介绍EasyCode

EasyCode的安装与用法在此不做介绍,网上的文章已经很详尽了。具体可以参考官方文档。

https://gitee.com/makejava/EasyCode

讯享网


讯享网

 甚至还提供了官网视频教程,十分贴心。

讯享网https://gitee.com/makejava/EasyCode/wikis/pages

插件安装完成之后。你可以通过IDEA的 File --> Settings --> Other Settings --> EasyCode 来修改该插件的配置等。

 EasyCode对每一块配置都做了分组,你可以设置多个不同版本的配置。

在了解EasyCode的配置功能之后,设置自定义模板,则是一件十分简单的事情。

三、自定义模板

注意:这是我项目的针对性模板。大家需要根据各自的项目框架、代码习惯等做自定义修改。我这里仅供我自己参考和记录。

controller.java.vm

定义初始变量 #set($tableName = $tool.append($tableInfo.name, "Controller")) 设置回调 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/controller")) 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}VO; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}DTO; import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gyyjy.scs.common.core.util.R; import com.gyyjy.scs.common.log.annotation.SysLog; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import java.util.Objects; / * @Author $!author * @Desc $!{tableInfo.comment}($!{tableInfo.name})表控制层 * @Date $!time.currTime() */ @Api(tags = "$!{tableInfo.comment}") @RestController @RequestMapping("$!tool.firstLowerCase($tableInfo.name)") @RequiredArgsConstructor public class $!{tableName} { private final $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service; @ApiOperation("$!{tableInfo.comment}-分页查询") @SysLog("$!{tableInfo.comment}-分页查询") @PostMapping("/queryByPage") public R<IPage<$!{tableInfo.name}VO>> queryByPage(@RequestBody $!{tableInfo.name}DTO param) { return $!{tool.firstLowerCase($tableInfo.name)}Service.queryByPage(param); } @ApiOperation("$!{tableInfo.comment}-根据ID查详情") @SysLog("$!{tableInfo.comment}-根据ID查详情") @PostMapping("/queryById") public R<$!{tableInfo.name}VO> queryById(@RequestBody $!{tableInfo.name}DTO param) { return $!{tool.firstLowerCase($tableInfo.name)}Service.queryById(param.getId()); } @ApiOperation("$!{tableInfo.comment}-新增数据") @SysLog("$!{tableInfo.comment}-新增数据") @PostMapping("/insert") public R insert(@RequestBody $!{tableInfo.name} param) { return $!{tool.firstLowerCase($tableInfo.name)}Service.insert(param); } @ApiOperation("$!{tableInfo.comment}-编辑数据") @SysLog("$!{tableInfo.comment}-编辑数据") @PostMapping("/update") public R update(@RequestBody $!{tableInfo.name} param) { if(Objects.isNull(param.getId())){ return R.failed("ID不能为空"); } return $!{tool.firstLowerCase($tableInfo.name)}Service.update(param); } @ApiOperation("$!{tableInfo.comment}-删除数据") @SysLog("$!{tableInfo.comment}-删除数据") @PostMapping("/deleteById") public R deleteById(@RequestBody $!{tableInfo.name}DTO param) { return $!{tool.firstLowerCase($tableInfo.name)}Service.deleteById(param.getId()); } } 

dao.java.vm

讯享网定义初始变量 #set($tableName = $tool.append($tableInfo.name, "Mapper")) 设置回调 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper")) 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}VO; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}DTO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; / * @Author $!author * @Desc $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层 * @Date $!time.currTime() */ @Mapper public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}> { / * 分页查询 */ IPage<$!{tableInfo.name}VO> queryByPage(Page page, @Param("param") $!{tableInfo.name}DTO param); / * 根据ID查详情 */ $!{tableInfo.name}VO queryById($!pk.shortType $!pk.name); / * 新增数据 */ int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); / * 修改数据 */ int update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); / * 通过主键删除数据 */ int deleteById($!pk.shortType $!pk.name); } 

entity.java.vm

引入宏定义 $!{define.vm} 使用宏定义设置回调(保存位置与文件后缀) #save("/entity", ".java") 使用宏定义设置包后缀 #setPackageSuffix("entity") 使用全局变量实现默认包导入 $!{autoImport.vm} import lombok.Data; import com.baomidou.mybatisplus.annotation.TableName; 使用宏定义实现类注释信息 #tableComment("实体类") @Data @TableName(value = "$!tableInfo.obj.name") public class $!{tableInfo.name} { #foreach($column in $tableInfo.fullColumn) #if(${column.comment})/ * ${column.comment} */#end private $!{tool.getClsNameByFullName($column.type)} $!{column.name}; #end } 

mapper.xml.vm

讯享网引入mybatis支持 $!{mybatisSupport.vm} 设置保存名称与保存位置 $!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml")) $!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper")) 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper"> <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}VO" id="$!{tableInfo.name}VOMap"> #foreach($column in $tableInfo.fullColumn) <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/> #end </resultMap> <!--分页查询--> <select id="queryByPage" parameterType="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}DTO" resultMap="$!{tableInfo.name}VOMap"> SELECT #allSqlColumn() FROM $!tableInfo.obj.name <where> #foreach($column in $tableInfo.fullColumn) <if test="param.$!column.name != null#if($column.type.equals("java.lang.String")) and param.$!column.name != ''#end"> AND $!column.obj.name = param.#{$!column.name} </if> #end </where> ORDER BY create_time DESC </select> <!--根据ID查详情--> <select id="queryById" parameterType="long" resultMap="$!{tableInfo.name}VOMap"> SELECT #allSqlColumn() FROM $!tableInfo.obj.name WHERE $!pk.obj.name = #{$!pk.name} LIMIT 1 </select> <!--新增所有列--> <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true"> INSERT INTO $!{tableInfo.obj.name}(#foreach($column in $tableInfo.otherColumn)$!column.obj.name#if($velocityHasNext), #end#end) VALUES (#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end) </insert> <!--通过主键修改数据--> <update id="update"> UPDATE $!{tableInfo.obj.name} <set> #foreach($column in $tableInfo.otherColumn) <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end"> $!column.obj.name = #{$!column.name}, </if> #end </set> WHERE $!pk.obj.name = #{$!pk.name} </update> <!--通过主键删除--> <delete id="deleteById"> DELETE FROM $!{tableInfo.obj.name} WHERE $!pk.obj.name = #{$!pk.name} </delete> </mapper> 

service.java.vm

定义初始变量 #set($tableName = $tool.append($tableInfo.name, "Service")) 设置回调 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/service")) 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}DTO; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}VO; import com.baomidou.mybatisplus.extension.service.IService; import com.gyyjy.scs.common.core.util.R; import com.baomidou.mybatisplus.core.metadata.IPage; / * @Author $!author * @Desc $!{tableInfo.comment}($!{tableInfo.name})表服务接口 * @Date $!time.currTime() */ public interface $!{tableName} extends IService<$!{tableInfo.name}> { / * 分页查询 */ R<IPage<$!{tableInfo.name}VO>> queryByPage($!{tableInfo.name}DTO param); / * 根据ID查详情 */ R queryById($!pk.shortType $!pk.name); / * 新增数据 */ R insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); / * 修改数据 */ R update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})); / * 通过主键删除数据 */ R deleteById($!pk.shortType $!pk.name); }

serviceIImpl.java.vm

讯享网定义初始变量 #set($tableName = $tool.append($tableInfo.name, "ServiceImpl")) 设置回调 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl")) 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}DTO; import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}VO; import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper; import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.gyyjy.scs.common.core.util.R; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; / * @Author $!author * @Desc $!{tableInfo.comment}($!{tableInfo.name})表服务实现类 * @Date $!time.currTime() */ @RequiredArgsConstructor @Service("$!tool.firstLowerCase($!{tableInfo.name})Service") public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}> implements $!{tableInfo.name}Service { private final $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper; @Override public R<IPage<$!{tableInfo.name}VO>> queryByPage($!{tableInfo.name}DTO param) { return R.ok($!{tool.firstLowerCase($tableInfo.name)}Mapper.queryByPage(param, param)); } @Override public R queryById($!pk.shortType $!pk.name) { return R.ok($!{tool.firstLowerCase($!{tableInfo.name})}Mapper.queryById($!pk.name)); } @Override public R insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { int num = $!{tool.firstLowerCase($!{tableInfo.name})}Mapper.insert($!tool.firstLowerCase($!{tableInfo.name})); return R.ok(num); } @Override public R update($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) { int num = $!{tool.firstLowerCase($!{tableInfo.name})}Mapper.update($!tool.firstLowerCase($!{tableInfo.name})); return R.ok(num); } @Override public R deleteById($!pk.shortType $!pk.name) { int num = $!{tool.firstLowerCase($!{tableInfo.name})}Mapper.deleteById($!pk.name); return R.ok(num); } }

dto.java.vm

引入宏定义 $!{define.vm} 使用宏定义设置回调(保存位置与文件后缀) #save("/entity", "DTO.java") 使用宏定义设置包后缀 #setPackageSuffix("entity") 使用全局变量实现默认包导入 $!{autoImport.vm} import lombok.Data; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 使用宏定义实现类注释信息 #tableComment("DTO类") @Data public class $!{tableInfo.name}DTO extends Page { #foreach($column in $tableInfo.fullColumn) #if(${column.comment})/ * ${column.comment} */#end private $!{tool.getClsNameByFullName($column.type)} $!{column.name}; #end } 

vo.java.vm

讯享网引入宏定义 $!{define.vm} 使用宏定义设置回调(保存位置与文件后缀) #save("/entity", "VO.java") 使用宏定义设置包后缀 #setPackageSuffix("entity") 使用全局变量实现默认包导入 $!{autoImport.vm} import lombok.Data; 使用宏定义实现类注释信息 #tableComment("VO类") @Data public class $!{tableInfo.name}VO { #foreach($column in $tableInfo.fullColumn) #if(${column.comment})/ * ${column.comment} */#end private $!{tool.getClsNameByFullName($column.type)} $!{column.name}; #end } 

Interface.md.vm (接口文档)

引入宏定义 $!{define.vm} 使用宏定义设置回调(保存位置与文件后缀) #save("/readme", ".md") 拿到主键 #if(!$tableInfo.pkColumn.isEmpty()) #set($pk = $tableInfo.pkColumn.get(0)) #end <!-- @Author $!author --> <!-- @Date $!time.currTime() --> $!{tableInfo.comment}($!{tableInfo.name})接口文档 === 1.分页查询 --- 接口地址: `/$!tool.firstLowerCase($tableInfo.name)/queryByPage` 入参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | size | long | 每页显示条数,默认 10 | | current | long | 当前页,默认是1 | #foreach($column in $tableInfo.fullColumn) | $!{column.name} | $!{tool.getClsNameByFullName($column.type)} | ${column.comment} | #end 回参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | #foreach($column in $tableInfo.fullColumn) | $!{column.name} | $!{tool.getClsNameByFullName($column.type)} | ${column.comment} | #end 2.根据ID查详情 --- 接口地址: `/$!tool.firstLowerCase($tableInfo.name)/queryById` 入参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | $!pk.name | $!pk.shortType | 主键 | 回参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | #foreach($column in $tableInfo.fullColumn) | $!{column.name} | $!{tool.getClsNameByFullName($column.type)} | ${column.comment} | #end 3.新增数据 --- 接口地址: `/$!tool.firstLowerCase($tableInfo.name)/insert` 入参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | #foreach($column in $tableInfo.fullColumn) | $!{column.name} | $!{tool.getClsNameByFullName($column.type)} | ${column.comment} | #end 回参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | data | int | 操作成功影响的行数 | 4.编辑数据 --- 接口地址: `/$!tool.firstLowerCase($tableInfo.name)/update` 入参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | #foreach($column in $tableInfo.fullColumn) | $!{column.name} | $!{tool.getClsNameByFullName($column.type)} | ${column.comment} | #end 回参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | data | int | 操作成功影响的行数 | 5.删除数据 --- 接口地址: `/$!tool.firstLowerCase($tableInfo.name)/deleteById` 入参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | $!pk.name | $!pk.shortType | 主键 | 回参: | 参数名称 | 参数类型 | 参数描述 | | :----: | :----: | :----: | | data | int | 操作成功影响的行数 | 
讯享网我已经导出了该配置,你可以下载后直接导出。 https://download.csdn.net/download/_/

四、补充依赖文件

 R.java

该类是框架的全局返回类,你需要根据自身框架的返回类来做修改。这里仅展示。

 import lombok.*; import java.io.Serializable; @ToString @NoArgsConstructor @AllArgsConstructor public class R<T> implements Serializable { private static final long serialVersionUID = 1L; @Getter @Setter private int code; @Getter @Setter private String msg; @Getter @Setter private T data; public static <T> R<T> ok() { return restResult(null, 0, null); } public static <T> R<T> ok(T data) { return restResult(data, 0, null); } public static <T> R<T> ok(T data, String msg) { return restResult(data, 0, msg); } public static <T> R<T> failed() { return restResult(null, 1, null); } public static <T> R<T> failed(String msg) { return restResult(null, 1, msg); } public static <T> R<T> failed(T data) { return restResult(data, 1, null); } public static <T> R<T> failed(T data, String msg) { return restResult(data, 1, msg); } public static <T> R<T> restResult(T data, int code, String msg) { R<T> apiResult = new R<>(); apiResult.setCode(code); apiResult.setData(data); apiResult.setMsg(msg); return apiResult; } } 

SysLog.java

该类是全局框架日志注解类,需要根据你的项目框架来做修改,如果你的项目没有用到全局框架日志处理,则删除。

讯享网 import java.lang.annotation.*; / * 操作日志注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLog { / * 描述 */ String value() default ""; / * spel 表达式 */ String expression() default ""; } 

小讯
上一篇 2025-01-09 19:55
下一篇 2025-02-23 16:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73388.html