第六章:easyCode代码生成器

前言

到了这里过后,我们剧本的架子已经基本搭起来了。我们可以开始进行大规模的表演了。在开始表演之前,我们要在采购一个道具,这个道具就是代码生成。我们很多的领域模型、vo、dto、entity等实体以及我们的dao层、service层、controller层、甚至我们的前端代码都能使用代码生成器进行生成。这样会节约我们很多的时间,让我们专注于业务上,不必在从数据库或者其他实体中来回的进行ctrl+c,ctrl+v。

首先在我们的IDEA中安装easyCode的插件,但是安装之前有个小坑,因为需要用到IDEA的“DataBase”,所以社区版的不能用这玩意,在这里悄悄咪咪的告诉各位一款PJ神器,专注PJ100年的那种。反正我身边的朋友用了都说好,当然也不知道啥时候会被干掉。

 

JetBrains全家桶:https://shimo.im/docs/WY3hd8Jt8KHgvVty/read

 

介绍

EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。

源码仓库:https://gitee.com/makejava/EasyCode

文档:https://gitee.com/makejava/EasyCode/wikis/pages

贡献者

第六章:easyCode代码生成器_第1张图片

安装

easyCode插件的安装,请选择“数据海洋”

第六章:easyCode代码生成器_第2张图片

创建DataSource

第六章:easyCode代码生成器_第3张图片

填写你的链接信息

第六章:easyCode代码生成器_第4张图片

记得第一次要注意驱动的问题,点击Driver后面的链接可以配置驱动。

第六章:easyCode代码生成器_第5张图片

配置完成点击一下Test Connection如果提示成功就可以点击ok,来进行下面的配置了

第六章:easyCode代码生成器_第6张图片

添加数据类型

我们先来进行默认的生成测试,右键sys_role表,然后点击“EasyCode --> Generate Code”

第六章:easyCode代码生成器_第7张图片

这个时候提示我们没有tinyint的数据类型,我们点击Yes去配置一下

第六章:easyCode代码生成器_第8张图片

将mysql数据库的tinyint类型映射为java的Integer类型

第六章:easyCode代码生成器_第9张图片

这个时候我们在继续生成

第六章:easyCode代码生成器_第10张图片

看看生成的效果,红色的部分都是生成的代码

第六章:easyCode代码生成器_第11张图片

可以看到,生成的代码有很多缺陷,我们的lombok并没有用上,而且Mybatis-Plus也没有用到,加上我们的页面啊什么的也没有生成到。

那么让我们来定制一下生成的模版吧,在配置页面

第六章:easyCode代码生成器_第12张图片

搜索easy Code,选择Template Setting,配置我们的模版

第六章:easyCode代码生成器_第13张图片

这里我就不详细介绍easyCode里面的标签了,大家可以参照文档来进行配置:https://gitee.com/makejava/EasyCode/wikis/pages

标签的话参考Velocity模板引擎语法:https://www.cnblogs.com/yangzhinian/p/4885973.html

模版设置

修改作者

第六章:easyCode代码生成器_第14张图片全局配置(Golbal Config)

第六章:easyCode代码生成器_第15张图片

init

##初始化区域

##去掉表的t_前缀
#if($tableInfo.obj.name.startsWith("自定义前缀_"))
    $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))
#end

## 定义版本号
#set($version = "1.0.0")

## 标记删除字段
#set($delete = "is_deleted")

## 创建时间标识
#set($createTime = "create_time")


## 公共字段
#set($publicFelids = $tool.newHashSet(
    "createTime",
    "createUserId",
    "modifyTime",
    "modifyUserId",
    "isDeleted",
    "remark"
))

##实现动态排除列
#set($temp = $tool.newHashSet("testCreateTime", "otherColumn"))
#foreach($item in $temp)
    #set($newList = $tool.newArrayList())
    #foreach($column in $tableInfo.fullColumn)
        #if($column.name!=$item)
            ##带有反回值的方法调用时使用$tool.call来消除返回值
            $tool.call($newList.add($column))
        #end
    #end
    ##重新保存
    $tableInfo.setFullColumn($newList)
#end

##对importList进行篡改
#set($temp = $tool.newHashSet())
#foreach($column in $tableInfo.fullColumn)
    #if(!$column.type.startsWith("java.lang."))
        ##带有反回值的方法调用时使用$tool.call来消除返回值
        $tool.call($temp.add($column.type))
    #end
#end
##覆盖
#set($importList = $temp)

define

##(Velocity宏定义)

##定义设置表名后缀的宏定义,调用方式:#setTableSuffix("Test")
#macro(setTableSuffix $suffix)
    #set($tableName = $!tool.append($tableInfo.name, $suffix))
#end

##定义设置包名后缀的宏定义,调用方式:#setPackageSuffix("Test")
#macro(setPackageSuffix $suffix)
    #if($suffix!="")package #end#if($tableInfo.savePackageName!="")$!{tableInfo.savePackageName}.#{end}$!suffix;
#end

##定义直接保存路径与文件名简化的宏定义,调用方式:#save("/entity", ".java")
#macro(save $path $fileName)
    $!callback.setSavePath($tool.append($tableInfo.savePath, $path))
    $!callback.setFileName($tool.append($tableInfo.name, $fileName))
#end

##定义表注释的宏定义,调用方式:#tableComment("注释信息")
#macro(tableComment $desc)
/**
 * $!{tableInfo.comment}($!{tableInfo.name})$desc
 *
 * @author $!author
 * @data $!time.currTime()
 */
#end

##定义GET,SET方法的宏定义,调用方式:#getSetMethod($column)
#macro(getSetMethod $column)

    public $!{tool.getClsNameByFullName($column.type)} get$!{tool.firstUpperCase($column.name)}() {
        return $!{column.name};
    }

    public void set$!{tool.firstUpperCase($column.name)}($!{tool.getClsNameByFullName($column.type)} $!{column.name}) {
        this.$!{column.name} = $!{column.name};
    }
#end

autoImport

##自动导入包(仅导入实体属性需要的包,通常用于实体类)
#foreach($import in $importList)
import $!import;
#end

mybatisSupport

##针对Mybatis 进行支持,主要用于生成xml文件
#foreach($column in $tableInfo.fullColumn)
    ##储存列类型
    $tool.call($column.ext.put("sqlType", $tool.getField($column.obj.dataType, "typeName")))
    #if($tool.newHashSet("java.lang.String").contains($column.type))
        #set($jdbcType="VARCHAR")
    #elseif($tool.newHashSet("java.lang.Boolean", "boolean").contains($column.type))
        #set($jdbcType="BOOLEAN")
    #elseif($tool.newHashSet("java.lang.Byte", "byte").contains($column.type))
        #set($jdbcType="BYTE")
    #elseif($tool.newHashSet("java.lang.Integer", "int", "java.lang.Short", "short").contains($column.type))
        #set($jdbcType="INTEGER")
    #elseif($tool.newHashSet("java.lang.Long", "long").contains($column.type))
        #set($jdbcType="INTEGER")
    #elseif($tool.newHashSet("java.lang.Float", "float", "java.lang.Double", "double").contains($column.type))
        #set($jdbcType="NUMERIC")
    #elseif($tool.newHashSet("java.util.Date", "java.sql.Timestamp", "java.time.Instant", "java.time.LocalDateTime", "java.time.OffsetDateTime", "  java.time.ZonedDateTime").contains($column.type))
        #set($jdbcType="TIMESTAMP")
    #elseif($tool.newHashSet("java.sql.Date", "java.time.LocalDate").contains($column.type))
        #set($jdbcType="TIMESTAMP")
    #else
        ##其他类型
        #set($jdbcType="OTHER")
    #end
    $tool.call($column.ext.put("jdbcType", $jdbcType))
#end

##定义宏,查询所有列
#macro(allSqlColumn)#foreach($column in $tableInfo.fullColumn)$column.obj.name#if($velocityHasNext), #end#end#end

模版配置(Template Config)

第六章:easyCode代码生成器_第16张图片

entity.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"Entity"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/entity"))

##使用宏定义设置包后缀
#setPackageSuffix("entity")
##使用全局变量实现默认包导入
$!autoImport
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.hzw.code.common.constant.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

#tableComment("数据访问类")
@Getter
@Setter
@ToString(callSuper = true)
@EqualsAndHashCode
@TableName("$!{tableInfo.obj.name}")
public class $!{tableName} extends BaseEntity{
    
    /**
     * 序列号
     */
    private static final long serialVersionUID = $!tool.serial();

#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
    /**
     * $!{pk.comment}
     */
    @TableId
    @ApiModelProperty(name = "$!{pk.name}", value = "$!{pk.comment}") 
    private $!{tool.getClsNameByFullName($pk.type)} $!{pk.name};
#end
#foreach($column in $tableInfo.otherColumn)
    #set($have = false)
    #foreach($felid in $publicFelids)
        #if($column.name==$felid)
            #set($have = true)
            #break
        #end
    #end
    #if(!$have)
    
    /**
     * $!{column.comment}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}") #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#end

}

mapper.xml

##引入宏定义
$!init
$!define
##引入mybatis支持
$!mybatisSupport

##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
#set($tempIndex = $!tableInfo.savePackageName.lastIndexOf('.') + 1)
##set($mapppath=$tableInfo.savePackageName.substring($tempIndex))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end





    
#foreach($column in $tableInfo.fullColumn)
        
#end
    
    
    
    
        #allSqlColumn()

    


    
    


    
    
    
    
    
    
        UPDATE $!tableInfo.obj.name
        
            ${delete} = 1,
#foreach($column in $tableInfo.fullColumn)
    #if($column.obj.name.equals("index_help"))
        $!column.obj.name = $!pk.obj.name,
#end
#end
         
         
        WHERE $!pk.obj.name = #{$!pk.name, jdbcType=$!{pk.ext.jdbcType}}
    

mapper.java

##引入宏定义
$!init
$!define
##定义初始变量
#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
##使用宏定义设置包后缀
#setPackageSuffix("mapper")
##使用全局变量实现默认包导入
$!autoImport
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}PageArgs;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}QueryArgs;
import $!{tableInfo.savePackageName}.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.dto.page.$!{tableInfo.name}PageDto;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Entity;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})持久层
 *
 * @author $!author
 * @date $!time.currTime()
 */
@Repository
public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}Entity>{
   
   /**
     * 分页查询
     *
     * @param args ${@link $!{tableInfo.name}PageArgs}
     * @param page  ${@link Page}
     * @return IPage<$!{tableInfo.name}Dto> ${@link IPage<$!{tableInfo.name}Dto>}
     * @author code generation
     * @date $!time.currTime()
     */
    IPage<$!{tableInfo.name}PageDto> page(Page page, @Param("query") $!{tableInfo.name}PageArgs args);


    /**
     * 条件查询多条
     *
     * @param args ${@link $!{tableInfo.name}QueryArgs}
     * @return List<$!{tableInfo.name}Dto> ${@link List<$!{tableInfo.name}Dto>}
     * @author code generation
     * @date $!time.currTime()
     */
    List<$!{tableInfo.name}Dto> selectListByModel($!{tableInfo.name}QueryArgs args);

}

service.java

##引入宏定义
$!init
$!define
##定义初始变量
#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
##使用宏定义设置包后缀
#setPackageSuffix("service")
##使用全局变量实现默认包导入
$!autoImport
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}Args;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}PageArgs;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}QueryArgs;
import $!{tableInfo.savePackageName}.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.dto.page.$!{tableInfo.name}PageDto;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Entity;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})业务层接口
 *
 * @author $!author
 * @date $!time.currTime()
 */
public interface $!{tableName} extends IService<$!{tableInfo.name}Entity> {
    /**
     * 保存
     *
     * @param args ${@link $!{tableInfo.name}Args}
     * @throws RuntimeException ${@link RuntimeException}
     * @author code generation
     * @date $!time.currTime()
     */
    void save($!{tableInfo.name}Args args) throws RuntimeException;


    /**
     * 通过id更新
     *
     * @param args ${@link $!{tableInfo.name}Args}
     * @throws RuntimeException ${@link RuntimeException}
     * @author code generation
     * @date $!time.currTime()
     */
    void updateById($!{tableInfo.name}Args args) throws RuntimeException;


    /**
     * 分页查询
     *
     * @param args ${@link $!{tableInfo.name}PageArgs}
     * @throws RuntimeException ${@link RuntimeException}
     * @return IPage<$!{tableInfo.name}PageDto> ${@link IPage<$!{tableInfo.name}Dto>}
     * @author code generation
     * @date $!time.currTime()
     */
    IPage<$!{tableInfo.name}PageDto> page($!{tableInfo.name}PageArgs args) throws RuntimeException;


    /**
     * 条件查询多条
     *
     * @param args ${@link $!{tableInfo.name}QueryArgs}
     * @throws RuntimeException ${@link RuntimeException}
     * @return List<$!{tableInfo.name}Dto> ${@link List<$!{tableInfo.name}Dto>}
     * @author code generation
     * @date $!time.currTime()
     */
    List<$!{tableInfo.name}Dto> selectListByModel($!{tableInfo.name}QueryArgs args) throws RuntimeException;


    /**
     * 通过id查询详情
     *
     * @param id ${@link String}
     * @throws RuntimeException ${@link RuntimeException}
     * @return $!{tableInfo.name}Dto ${@link $!{tableInfo.name}Dto}
     * @author code generation
     * @date $!time.currTime()
     */
    $!{tableInfo.name}Dto getById(String id) throws RuntimeException;
}

serviceImpl.java

##引入宏定义
$!init
$!define
##定义初始变量
#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
##使用宏定义设置包后缀
#setPackageSuffix("service.impl")
##使用全局变量实现默认包导入
$!autoImport
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}Args;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}PageArgs;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}QueryArgs;
import $!{tableInfo.savePackageName}.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.dto.page.$!{tableInfo.name}PageDto;
import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name}Entity;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import com.hzw.code.common.utils.ActionException;
import com.hzw.code.common.utils.ResultCodeEnum;
import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.beans.BeanUtils;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})业务层实现
 *
 * @author $!author
 * @date $!time.currTime()
 */
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}Entity> implements $!{tableInfo.name}Service {
    private final $!{tableInfo.name}Mapper mapper;


    @Override
    public void save($!{tableInfo.name}Args args) throws RuntimeException {
        $!{tableInfo.name}Entity entity = new $!{tableInfo.name}Entity();
        BeanUtils.copyProperties(args, entity);
        boolean result = super.save(entity);
        if (!result) {
            throw new ActionException(ResultCodeEnum.DATABASE_INSERT_ERROR);
        }
    }


    @Override
    public void updateById($!{tableInfo.name}Args args) throws RuntimeException {
        // 查询数据是否存在
        this.getById(args.get$tool.firstUpperCase(${pk.name})());
        // 更新数据
        $!{tableInfo.name}Entity entity = new $!{tableInfo.name}Entity();
        BeanUtils.copyProperties(args, entity);
        boolean result = super.updateById(entity);
        if (!result) {
            throw new ActionException(ResultCodeEnum.DATABASE_UPDATE_ERROR);
        }
    }


    @Override
    public List<$!{tableInfo.name}Dto> selectListByModel($!{tableInfo.name}QueryArgs args) throws RuntimeException {
        List<$!{tableInfo.name}Dto> list = mapper.selectListByModel(args);
        if (list == null || list.isEmpty()) {
            throw new ActionException(ResultCodeEnum.DATABASE_NODATA);
        }
        return list;
    }


    @Override
    public IPage<$!{tableInfo.name}PageDto> page($!{tableInfo.name}PageArgs args) throws RuntimeException {
        return mapper.page(args.getQueryPage(), args);
    }


    @Override
    public $!{tableInfo.name}Dto getById(String id) throws RuntimeException {
        $!{tableInfo.name}Entity byId = super.getById(id);
        if (byId == null) {
            throw new ActionException(ResultCodeEnum.DATABASE_NODATA);
        }
        $!{tableInfo.name}Dto dto = new $!{tableInfo.name}Dto();
        BeanUtils.copyProperties(byId, dto);
        return dto;
    }
}

RestfulController.java

##引入宏定义
$!init
$!define
##定义初始变量
#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
##使用宏定义设置包后缀
#setPackageSuffix("controller")
##使用全局变量实现默认包导入
$!autoImport
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.code.common.constant.SuperController;
import com.hzw.code.common.constant.BaseConstant;
import com.hzw.code.common.utils.ActionException;
import com.hzw.code.common.utils.ActionResult;
import com.hzw.code.common.validation.group.Insert;
import com.hzw.code.common.validation.group.Update;
import lombok.RequiredArgsConstructor;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}Args;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}PageArgs;
import $!{tableInfo.savePackageName}.controller.args.$!{tableInfo.name}QueryArgs;
import $!{tableInfo.savePackageName}.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.dto.page.$!{tableInfo.name}PageDto;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.util.List;
import org.springframework.web.bind.annotation.*;
## 获取主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

/**
 * $!{tableInfo.comment}($!{tableInfo.name})控制层
 *
 * @author $!author
 * @date $!time.currTime()
 */
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@Api(tags = "$!{tableInfo.name}", value = "$!{tableInfo.name}Api", description = "$!{tableInfo.name}Api接口相关")
@RequestMapping(value = BaseConstant.URI_DEPLOY_PREFIX + "/$tool.firstLowerCase($!{tableInfo.name})s", produces = MediaType.APPLICATION_JSON_VALUE)
public class $!{tableName} extends SuperController{
    private final $!{tableInfo.name}Service service;


    @ApiOperation(value = "添加(${version})", notes = "添加$!{tableInfo.comment}")
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @PostMapping
    public ActionResult insert(@RequestBody @Validated(Insert.class) $!{tableInfo.name}Args args) throws ActionException {
        service.save(args);
        return successMsg("添加成功");
    }


    @ApiOperation(value = "通过${pk.comment}修改(${version})", notes = "修改$!{tableInfo.comment}")
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @PutMapping
    public ActionResult update(@RequestBody @Validated(Update.class) $!{tableInfo.name}Args args) throws ActionException {
        service.updateById(args);
        return successMsg("修改成功");
    }


    @ApiOperation(value = "逻辑删除(${version})", notes = "删除$!{tableInfo.comment}")
    @ApiImplicitParam(paramType = "path", value = "${pk.comment}", name = "${pk.name}", required = true)
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @DeleteMapping(value = "/{${pk.name}}")
    public ActionResult delete(@PathVariable @NotBlank(message = "${pk.comment}不能为空") String ${pk.name}) throws ActionException {
        service.removeById(${pk.name});
        return successMsg("删除成功");
    }


    @ApiOperation(value = "通过${pk.comment}查询详情(${version})", notes = "查询$!{tableInfo.comment}详情")
    @ApiImplicitParam(paramType = "path", value = "${pk.comment}", name = "${pk.name}", required = true)
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @GetMapping(value = "/{${pk.name}}")
    public ActionResult<$!{tableInfo.name}Dto> getById(@PathVariable @NotBlank(message = "${pk.comment}不能为空") String ${pk.name}) throws ActionException {
        return successData(service.getById(${pk.name}));
    }


    @ApiOperation(value = "通过条件查询多条数据(${version})", notes = "通过条件查询$!{tableInfo.comment}")
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @GetMapping(value = "/list")
    public ActionResult> getList($!{tableInfo.name}QueryArgs args) throws ActionException {
        return successData(service.selectListByModel(args));
    }


    @ApiOperation(value = "分页查询(${version})", notes = "分页查询$!{tableInfo.comment}")
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @GetMapping(value = "/page")
    public ActionResult> selectPage($!{tableInfo.name}PageArgs args) throws ActionException {
        return successData(service.page(args));
    }
} 
  

insertOrUpdateArgs.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"Args"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/controller/args"))

##使用宏定义设置包后缀
#setPackageSuffix("controller.args")

##使用全局变量实现默认包导入
$!autoImport
import com.hzw.code.common.validation.group.Update;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;

#tableComment("Args")
@Getter
@Setter
@ToString
@EqualsAndHashCode
@ApiModel(value = "$!{tableInfo.comment}添加或修改Request", description = "$!{tableInfo.comment}添加或修改入参")
public class $!{tableName}  implements Serializable  {
    private static final long serialVersionUID = $!tool.serial();
    
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
    /**
     * $!{pk.comment}
     */
    @ApiModelProperty(name = "$!{pk.name}", value = "$!{pk.comment}")
    @NotBlank(message = "$!{pk.comment}不能为空", groups = Update.class)
    private $!{tool.getClsNameByFullName($pk.type)} $!{pk.name};
    
#end
#foreach($column in $tableInfo.otherColumn)
    /**
     * $!{column.name}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}" #if($!{tool.getClsNameByFullName($column.type)} == 'Integer') , example = "1" #end) #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

pageArgs.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"PageArgs"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/controller/args"))

##使用宏定义设置包后缀
#setPackageSuffix("controller.args")

##使用全局变量实现默认包导入
$!autoImport
import com.hzw.code.common.constant.SuperPageArgs;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

#tableComment("PageArgs")
@Getter
@Setter
@ToString
@ApiModel(value = "$!{tableInfo.comment}分页查询Request", description = "$!{tableInfo.comment}分页查询入参")
public class $!{tableName}  extends SuperPageArgs {
    private static final long serialVersionUID = $!tool.serial();

#foreach($column in $tableInfo.fullColumn)
    /**
     * $!{column.name}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}" #if($!{tool.getClsNameByFullName($column.type)} == 'Integer') , example = "1" #end) #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

pageDto.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"PageDto"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/dto/page"))

##使用宏定义设置包后缀
#setPackageSuffix("dto.page")

##使用全局变量实现默认包导入
$!autoImport
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import lombok.EqualsAndHashCode;
import java.util.Date;

#tableComment("Dto")
@Getter
@Setter
@ToString
@EqualsAndHashCode
@ApiModel(value = "$!{tableInfo.comment}分页查询Response", description = "$!{tableInfo.comment}分页查询响应")
public class $!{tableName}  implements Serializable  {
    private static final long serialVersionUID = $!tool.serial();

#foreach($column in $tableInfo.fullColumn)
    /**
     * $!{column.name}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}" #if($!{tool.getClsNameByFullName($column.type)} == 'Integer') , example = "1" #end) #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

queryArgs.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"QueryArgs"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/controller/args"))

##使用宏定义设置包后缀
#setPackageSuffix("controller.args")

##使用全局变量实现默认包导入
$!autoImport
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;

#tableComment("Args")
@Getter
@Setter
@ToString
@ApiModel(value = "$!{tableInfo.comment}条件查询Request", description = "$!{tableInfo.comment}条件查询入参")
public class $!{tableName}  implements Serializable  {
    private static final long serialVersionUID = $!tool.serial();

#foreach($column in $tableInfo.fullColumn)
    /**
     * $!{column.name}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}" #if($!{tool.getClsNameByFullName($column.type)} == 'Integer') , example = "1" #end) #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

dto.java

##引入宏定义
$!init
$!define
##定义初始变量
#set($tableName=$tool.append($tableInfo.name,"Dto"))
##设置回调
$!callback.setFileName($tool.append($tableName,".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath,"/dto"))

##使用宏定义设置包后缀
#setPackageSuffix("dto")

##使用全局变量实现默认包导入
$!autoImport
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import lombok.EqualsAndHashCode;

#tableComment("查询响应类")
@Getter
@Setter
@ToString
@EqualsAndHashCode
@ApiModel(value = "$!{tableInfo.comment}查询Response", description = "$!{tableInfo.comment}查询响应")
public class $!{tableName}  implements Serializable  {
    
    /**
     * 序列号
     */
    private static final long serialVersionUID = $!tool.serial();

#foreach($column in $tableInfo.fullColumn)
    /**
     * ${column.comment}
     */
    #if(${column.comment})@ApiModelProperty(name = "$!{column.name}", value = "${column.comment}") #end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    
#end
}

addEdit.vue

##新增,编辑,详情页面
##引入宏定义
$!init
$!define

##设置保存名称与保存位置
$!callback.setFileName("addEdit.vue")
#set($tempIndex = $!tableInfo.savePackageName.lastIndexOf('.') + 1)
##set($mapppath=$tableInfo.savePackageName.substring($tempIndex))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/",
    $tool.firstLowerCase($!{tableInfo.name}),"Manage/"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end



api.js

##JS代码
##引入宏定义
$!init
$!define

##设置保存名称与保存位置
$!callback.setFileName($tool.firstLowerCase($tool.append($!{tableInfo.name}, "Manage.js")))
#set($tempIndex = $!tableInfo.savePackageName.lastIndexOf('.') + 1)
##set($mapppath=$tableInfo.savePackageName.substring($tempIndex))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/",
    $tool.firstLowerCase($!{tableInfo.name}),"Manage/"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

import request from '@/utils/request'
//接口前缀
const sys_prefix = '/sys'

//分页
export function get$!{tableInfo.name}Page(query) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s/page',
    method: 'get',
    params: query
  })
}
//列表
export function get$!{tableInfo.name}List(data) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s/list',
    method: 'get',
    params: data
  })
}
//详情
export function get$!{tableInfo.name}Detail(data) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s/' + data.${pk.name},
    method: 'get',
    data
  })
}
//新增
export function create$!{tableInfo.name}(data) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s',
    method: 'post',
    data
  })
}
//更新
export function update$!{tableInfo.name}(data) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s',
    method: 'put',
    data
  })
}
//删除
export function $tool.append("delete",$!{tableInfo.name})(data) {
  return request({
    url: sys_prefix + '/$tool.firstLowerCase($!{tableInfo.name})s/' + data.${pk.name},
    method: 'delete',
    data
  })
}

index.vue

##列表页面
##引入宏定义
$!init
$!define

##设置保存名称与保存位置
$!callback.setFileName("index.vue")
#set($tempIndex = $!tableInfo.savePackageName.lastIndexOf('.') + 1)
##set($mapppath=$tableInfo.savePackageName.substring($tempIndex))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper/",
    $tool.firstLowerCase($!{tableInfo.name}),"Manage/"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end



生成

模版设置好了过后,就可以开始生成了。

可以选择多张表

第六章:easyCode代码生成器_第17张图片

右键生成

第六章:easyCode代码生成器_第18张图片

生成时,需要注意几点,一定要选择好对应的Package,不然会生成错地方。还有就是可以勾选一下禁止提示。不然生成很多的话会一直弹框提示。

第六章:easyCode代码生成器_第19张图片

项目结构

第六章:easyCode代码生成器_第20张图片

生成后

第六章:easyCode代码生成器_第21张图片

到这里,就差不多了,easyCode可以导入导出,但是都是导出到他的官网,给你生成一个token。所以这里就没有使用这种方式导出来,而是直接贴出了我们的模版。

好了,到这里就差不多了!接下来我们将使用token的方式来进行登录,并且自定义错误的返回提示。

 

----------------------------------------------------------

项目的源码地址:https://gitee.com/gzsjd/fast

----------------------------------------------------------

你可能感兴趣的:(Java快速开发)