直接跳到内容

代码生成器

技术交流QQ群:3549030

程序脚手架

程序脚手架(英文名称为“Scaffold”)是一种用于快速生成代码框架的工具,它可以自动生成一些基础代码和目录结构,从而帮助开发人员快速启动新项目或新功能的开发。脚手架工具通常包含一些预设的模板和规范,使得开发人员可以遵循最佳实践进行开发,并且在开发过程中可以更好地维护代码的质量和可读性。

使用程序脚手架可以减少开发人员在创建新项目或新功能时的重复工作量,从而提高生产力。常见的程序脚手架工具包括 Vue CLI、React Native CLI、Angular CLI 等。

创建一个 Demo 模块

友情提示

  • 安装了MySQL5.7+数据库
  • 已阅读帮助文档,熟悉代码生成器的配置
  • 已安装 JDK8

创建数据库表

创建MySQL数据库脚本可以通过使用MySQL命令行工具或者MySQL图形化界面工具完成。下面是使用MySQL命令行工具创建数据库的示例脚本:

sql
CREATE DATABASE database_name;

如果你希望在创建数据库的同时指定字符集和排序规则,可以使用以下脚本:

sql
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

其中,database_name是你要创建的数据库的名称。你可以根据自己的需要替换它。utf8mb4是MySQL支持的Unicode字符集,utf8mb4_unicode_ci是一种Unicode排序规则。你可以根据需要将它们替换为其他字符集和排序规则。

在创建数据库之后,你可以使用以下脚本创建表:

sql
-- ----------------------------
-- Table structure for sys_api
-- ----------------------------
DROP TABLE IF EXISTS `sys_api`;
CREATE TABLE `sys_api` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `table_name` varchar(32) NOT NULL COMMENT '表名',
  `module_name` varchar(32) NOT NULL COMMENT '所属模块名',
  `method_name` varchar(32) NOT NULL COMMENT '方法名称',
  `method_comment` varchar(60) NOT NULL COMMENT '方法注释',
  `create_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人ID',
  `create_user` varchar(32) NOT NULL DEFAULT '' COMMENT '创建人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新人ID',
  `update_user` varchar(32) NOT NULL DEFAULT '' COMMENT '更新人',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统接口表';

通过以上的脚本,你就可以创建MySQL数据库和表了。

配置代码生成器

java
    public static void main(String[] args) {
        // config info
        String databaseHost = "127.0.0.1:3306";
        String databaseName = "youya_gen";
        String username = "root";
        String password = "Mysql_20210513";

        String basePackage = "io.kungfu.panda";
        String moduleName = "sys";

        String includeTables = "sys_api";
        String excludeTables = "";

        String[] genLayers = new String[]{"base", "model", "dto", "validate", "service", "controller"};
                
        KungfuGenerator generator = new KungfuGenerator();

        generator.init(databaseHost, databaseName, username, password);

        generator.doGenerate(databaseName, basePackage, moduleName, includeTables, excludeTables, genLayers, null);
    }

运行main函数即可生成代码。如截图所示: image

生成代码预览

BaseSysApi.java

java
package io.kungfu.panda.modules.sys.model.base;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
import java.util.Date;

/**
 * Generated by KungFuPanda, do not modify this file.
 */
@SuppressWarnings("serial")
public abstract class BaseSysApi<M extends BaseSysApi<M>> extends Model<M> implements IBean {

	/**
	 * 
	 */
	public void setId(Long id) {
		set("id", id);
	}

	public Long getId() {
		return getLong("id");
	}

	/**
	 * 表名
	 */
	public void setTableName(String tableName) {
		set("table_name", tableName);
	}

	public String getTableName() {
		return getStr("table_name");
	}

	/**
	 * 所属模块名
	 */
	public void setModuleName(String moduleName) {
		set("module_name", moduleName);
	}

	public String getModuleName() {
		return getStr("module_name");
	}

	/**
	 * 方法名称
	 */
	public void setMethodName(String methodName) {
		set("method_name", methodName);
	}

	public String getMethodName() {
		return getStr("method_name");
	}

	/**
	 * 方法注释
	 */
	public void setMethodComment(String methodComment) {
		set("method_comment", methodComment);
	}

	public String getMethodComment() {
		return getStr("method_comment");
	}

	/**
	 * 创建人ID
	 */
	public void setCreateUserId(Long createUserId) {
		set("create_user_id", createUserId);
	}

	public Long getCreateUserId() {
		return getLong("create_user_id");
	}

	/**
	 * 创建人
	 */
	public void setCreateUser(String createUser) {
		set("create_user", createUser);
	}

	public String getCreateUser() {
		return getStr("create_user");
	}

	/**
	 * 创建时间
	 */
	public void setCreateTime(Date createTime) {
		set("create_time", createTime);
	}

	public Date getCreateTime() {
		return getDate("create_time");
	}

	/**
	 * 更新人ID
	 */
	public void setUpdateUserId(Long updateUserId) {
		set("update_user_id", updateUserId);
	}

	public Long getUpdateUserId() {
		return getLong("update_user_id");
	}

	/**
	 * 更新人
	 */
	public void setUpdateUser(String updateUser) {
		set("update_user", updateUser);
	}

	public String getUpdateUser() {
		return getStr("update_user");
	}

	/**
	 * 更新时间
	 */
	public void setUpdateTime(Date updateTime) {
		set("update_time", updateTime);
	}

	public Date getUpdateTime() {
		return getDate("update_time");
	}

}

SysApi.java

java
package io.kungfu.panda.modules.sys.model;
import io.kungfu.panda.modules.sys.model.base.BaseSysApi;

/**
 * Generated by KungFuPanda.
 */
@SuppressWarnings("serial")
public class SysApi extends BaseSysApi<SysApi> {
    public static final SysApi dao = new SysApi().dao();
}

SysApiDTO.java

java
package io.kungfu.panda.modules.sys.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;

@ApiModel("系统接口表DTO")
public class SysApiDTO {
    @ApiModelProperty(value = "暂无注释", example = "100", position= 1, required = true)
    private Long id;
    @ApiModelProperty(value = "表名", example = "示例值", position= 2, required = true)
    private String tableName;
    @ApiModelProperty(value = "所属模块名", example = "示例值", position= 3, required = true)
    private String moduleName;
    @ApiModelProperty(value = "方法名称", example = "示例值", position= 4, required = true)
    private String methodName;
    @ApiModelProperty(value = "方法注释", example = "示例值", position= 5, required = true)
    private String methodComment;

    public Long getId() {
      return id;
    }
    public void setId(Long id) {
      this.id = id;
    }

    public String getTableName() {
      return tableName;
    }
    public void setTableName(String tableName) {
      this.tableName = tableName;
    }

    public String getModuleName() {
      return moduleName;
    }
    public void setModuleName(String moduleName) {
      this.moduleName = moduleName;
    }

    public String getMethodName() {
      return methodName;
    }
    public void setMethodName(String methodName) {
      this.methodName = methodName;
    }

    public String getMethodComment() {
      return methodComment;
    }
    public void setMethodComment(String methodComment) {
      this.methodComment = methodComment;
    }

}

SysApiService.java

java
package io.kungfu.panda.modules.sys.service;

import io.kungfu.panda.modules.sys.model.SysApi;
import org.kungfu.core.KungfuService;
import org.kungfu.core.R;
import org.kungfu.core.UserInfo;

import java.util.Date;

public class SysApiService extends KungfuService<SysApi> {
    private final SysApi dao = SysApi.dao;

    public R saveOrUpdate(SysApi sysApi, UserInfo userInfo) {

        if (sysApi == null) {
            return R.fail(630, "信息不能为空");
        }

        Date date = new Date();
        if (sysApi.getId() != null) {
            sysApi.setUpdateUser(userInfo.getUserName());
            sysApi.setUpdateUserId(userInfo.getUserId());
            sysApi.setUpdateTime(date);
            if (sysApi.update()) {
                //CacheKit.remove("sysApi", "sysApiTree");
                return R.ok("更新成功");
            }

            return R.fail(641, "更新失败");
        }
        else {
            sysApi.setCreateUser(userInfo.getUserName());
            sysApi.setCreateUserId(userInfo.getUserId());
            sysApi.setCreateTime(date);

            if (sysApi.save()) {
                //CacheKit.removeAll("sysApi");
                return R.ok("保存成功");
            }

            return R.fail(640, "保存失败");
        }

    }
}

SysApiValidator.java

java
package io.kungfu.panda.modules.sys.validate;

import io.kungfu.panda.modules.sys.model.SysApi;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.validate.Validator;
import org.kungfu.core.KungfuConstant;
import org.kungfu.util.KungfuKit;

public class SysApiValidator extends Validator {

    @Override
    protected void validate(Controller c) {
        setShortCircuit(true);
        setRet(Ret.fail().set("code", 680));

        String json = c.getAttr(KungfuConstant.JSON_REQUEST_BODY);
        try {
            SysApi sysApi = KungfuKit.toModelValidator(json, SysApi.class);

            if (sysApi == null) {
                addError(KungfuConstant.MASSAGE, "SysApi对象不能为空");
            }
            else {
                if (StrKit.isBlank(sysApi.getTableName())) {
                    addError(KungfuConstant.MASSAGE, "SysApi对象属性tableName不能为空");
                }
                if (StrKit.isBlank(sysApi.getModuleName())) {
                    addError(KungfuConstant.MASSAGE, "SysApi对象属性moduleName不能为空");
                }
                if (StrKit.isBlank(sysApi.getMethodName())) {
                    addError(KungfuConstant.MASSAGE, "SysApi对象属性methodName不能为空");
                }
                if (StrKit.isBlank(sysApi.getMethodComment())) {
                    addError(KungfuConstant.MASSAGE, "SysApi对象属性methodComment不能为空");
                }
            }
        } catch (Exception e) {
            addError(KungfuConstant.MASSAGE, e.getMessage());
        }
    }

    @Override
    protected void handleError(Controller c) {
        c.renderJson(getRet());
    }
}

SysApiController.java

java
package io.kungfu.panda.modules.sys.controller;

import io.kungfu.panda.modules.sys.dto.SysApiDTO;
import io.kungfu.panda.modules.sys.model.SysApi;
import io.kungfu.panda.modules.sys.validate.SysApiValidator;
import io.kungfu.panda.modules.sys.service.SysApiService;
import com.jfinal.kit.StrKit;
import com.jfinal.aop.Inject;
import com.jfinal.aop.Before;
import com.jfinal.core.Path;
import org.kungfu.core.R;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.ehcache.CacheKit;
import com.jfinal.plugin.ehcache.CacheName;
import com.jfinal.plugin.ehcache.EvictInterceptor;
import org.kungfu.core.*;
import org.kungfu.validator.HeaderValidator;
import org.kungfu.validator.PostRequestValidator;
import com.lastb7.swagger.annotation.ApiResCustom;
import com.lastb7.swagger.enumeration.ApiEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

@Api(value = "系统接口", tags = "系统接口接口")
@Path("/sys-api")
public class SysApiController extends KungfuController {

    @Inject
    private SysApiService sysApiService;


    @ApiOperation(value = "系统接口信息保存或修改", notes = "根据表单内容保存或更新内容", httpMethod = ApiEnum.METHOD_POST, produces = ApiEnum.PRODUCES_JSON)
    @ApiImplicitParams({
        @ApiImplicitParam(name = "sysApi", value = "系统接口信息", dataTypeClass = SysApiDTO.class,  paramType = ApiEnum.PARAM_TYPE_BODY)
    })
    @ApiResCustom(ResultVO.class)
    @Before(SysApiValidator.class)
    public void saveOrUpdate() {
        SysApi sysApi = toModel(SysApi.class);
        renderJson(sysApiService.saveOrUpdate(sysApi, getUserInfo()));
    }

    @ApiOperation(value = "分页查询", notes = "根据页码及查询条件分页查询")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "queryCondition", value = "查询条件", dataTypeClass = QueryCondition.class, paramType = ApiEnum.PARAM_TYPE_BODY, required = true)
    })
    @ApiResCustom(ResultVO.class)
    public void queryPage() {
        renderJson(queryPage(SysApi.class));
    }

    @ApiOperation(value = "系统接口信息查询", notes = "根据表ID查询系统接口信息")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "sysApiId", value = "系统接口ID", defaultValue = "100")
    })
    @ApiResCustom(ResultVO.class)
    public void getInfo() {
        Long sysApiId = getLong("sysApiId");
        renderJson(selectById(sysApiId, SysApi.class));
    }

    @ApiOperation(value = "删除系统接口记录", notes = "根据表ID删除系统接口记录,支持批量删除")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "sysApiIds", value = "系统接口IDs", defaultValue = "100,200,300")
    })
    @ApiResCustom(ResultVO.class)
    public void deleteByIds() {
        String sysApiIds = get("sysApiIds");
        renderJson(deleteByIds(sysApiIds, SysApi.class));
    }

}

这样一个模块完整的后端基础代码就搞定了。

代码生成器已经加载完毕