外观
代码模板
技术交流QQ群:3549030
代码模板的作用?
在代码生成器中,代码模板是预定义的代码块,它们被用作生成代码的基础。它们可以包含占位符或变量,这些变量将被实际值替换,以生成最终的代码。代码模板可以极大地提高代码生成器的效率,因为它们消除了大量繁琐的手工编写代码的工作。
代码模板的作用主要包括以下几个方面:
提高代码生成的效率:通过预定义代码块,可以快速生成符合规范的代码,减少手写代码的工作量。
统一代码风格:代码模板可以确保生成的代码风格一致,提高代码的可读性和可维护性。
支持自定义配置:代码模板可以根据具体需求进行自定义配置,例如添加或删除特定的代码块、修改代码块的参数等。
促进团队合作:代码模板可以提高代码的可读性和可维护性,有助于不同开发者之间更好地协作和交流。
总之,代码模板是代码生成器中重要的组成部分,能够提高代码的生成效率、统一代码风格、支持自定义配置和促进团队合作。
代码模板的选择?
Java中常用的模板技术包括以下几种:
JSP(JavaServer Pages):JSP是一种基于Java的服务器端动态网页技术。它使用XML格式的文本文件作为模板,并使用Java代码片段来定义动态内容。
FreeMarker:FreeMarker是一个基于Java的模板引擎,它使用类似于JSP的语法来定义模板,并使用Java对象来填充动态内容。
Velocity:Velocity是另一个基于Java的模板引擎,它使用类似于JSP的语法来定义模板,并使用Java对象来填充动态内容。
Thymeleaf:Thymeleaf是一个基于Java的模板引擎,它使用HTML/XML模板来定义模板,并使用Java对象来填充动态内容。与其他模板引擎不同,Thymeleaf可以在浏览器中进行预览,这有助于简化开发和调试过程。
JET(Java Emitter Templates):JET是一个基于Java的模板引擎,它使用XML格式的模板文件来定义模板,并使用Java代码来填充动态内容。
JFinal Enjoy模板是基于JFinal框架开发的一种模板引擎。它使用了类似于JSP的语法,但是与JSP相比,Enjoy模板具有更好的性能和更少的限制。以下是JFinal Enjoy模板的一些特点:
高性能:Enjoy模板使用预编译技术和缓存机制,以提高模板的执行效率和响应速度。
简单易用:Enjoy模板的语法类似于JSP,易于理解和使用。它还提供了一些方便的扩展功能,如自定义指令和过滤器。
高度可定制:Enjoy模板支持自定义标签和函数,可以根据项目的需求来扩展和定制模板功能。
轻量级:Enjoy模板不需要像JSP一样需要Tomcat等Web容器的支持,可以轻松地在JFinal框架中使用。
兼容性好:Enjoy模板可以与JSP和其他模板引擎无缝集成,可以在同一个项目中使用多种不同的模板技术。
总的来说,JFinal Enjoy模板是一种优秀的模板引擎,它具有高性能、简单易用和高度可定制等优点,同时还具有很好的兼容性和轻量级的特点。如果使用JFinal框架进行Java Web开发,那么可以考虑使用Enjoy模板来提高开发效率和代码质量。
BaseModel代码模板
java
package #(basePackage).modules.#(moduleName).model.base;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
import java.util.Date;
/**
* Generated by KungFuPanda, do not modify this file.
*/
@SuppressWarnings("serial")
public abstract class Base#(className)<M extends Base#(className)<M>> extends Model<M> implements IBean {
#for(column : columnList)
#set(columnName=(toCamelCase(column.column_name)))
#set(upperCaseColumnName=firstCharToUpperCase(toCamelCase(column.column_name)))
#set(javaType=toJavaType(column.data_type, column.column_type))
#set(javaMethod=toJavaMethod(column.data_type, column.column_type))
/**
* #(column.column_comment)
*/
public void set#(upperCaseColumnName)(#(javaType) #(columnName)) {
set("#(column.column_name)", #(columnName));
}
public #(javaType) get#(upperCaseColumnName)() {
return get#(javaMethod)("#(column.column_name)");
}
#end
}
Model代码模板
java
package #(basePackage).modules.#(moduleName).model;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
import #(basePackage).modules.#(moduleName).model.base.Base#(className);
/**
* Generated by KungFuPanda.
*/
@SuppressWarnings("serial")
public class #(className) extends Base#(className)<#(className)> {
public static final #(className) dao = new #(className)().dao();
}
DTO代码模板
java
package #(basePackage).modules.#(moduleName).dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
@ApiModel("#(tableComment)DTO")
public class #(firstCharToUpperCase(toCamelCase(tableName)))DTO {
#for(column : columnList)
@ApiModelProperty(value = "#(notBlank(column.column_comment)?column.column_comment:'暂无注释')", example = "#(toExample(column.data_type))", position= #(for.count)#if(column.is_nullable == 'NO'), required = true#end)
private #(toJavaType(column.data_type,column.column_type)) #(toCamelCase(column.column_name));
#end
#for(column : columnList)
public #(toJavaType(column.data_type,column.column_type)) get#(firstCharToUpperCase(toCamelCase(column.column_name)))() {
return #(toCamelCase(column.column_name));
}
public void set#(firstCharToUpperCase(toCamelCase(column.column_name)))(#(toJavaType(column.data_type,column.column_type)) #(toCamelCase(column.column_name))) {
this.#(toCamelCase(column.column_name)) = #(toCamelCase(column.column_name));
}
#end
}
Validate代码模板
java
package #(basePackage).modules.#(moduleName).validate;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
#set(camelCaseName=toCamelCase(tableName))
import #(basePackage).modules.#(moduleName).model.#(className);
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 #(className)Validator 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 {
#(className) #(camelCaseName) = KungfuKit.toModelValidator(json, #(className).class);
if (#(camelCaseName) == null) {
addError(KungfuConstant.MASSAGE, "#(className)对象不能为空");
}
else {
#for(column : columnList)
#set(columnName=(toCamelCase(column.column_name)))
#set(upperCaseColumnName=firstCharToUpperCase(toCamelCase(column.column_name)))
#set(javaType=toJavaType(column.data_type, column.column_type))
#set(javaMethod=toJavaMethod(column.data_type, column.column_type))
#if("NO".equals(column.is_nullable) && !"id".equals(column.column_name) && !"pinyin".equals(column.column_name) && (column.column_default == null || ("0".equals(column.column_default) && "bigint".equals(column.data_type))))
#if("varchar".equals(column.data_type))
if (StrKit.isBlank(#(camelCaseName).get#(upperCaseColumnName)())) {
addError(KungfuConstant.MASSAGE, "#(className)对象属性#(columnName)不能为空");
}
#else
if (#(camelCaseName).get#(upperCaseColumnName)() == null) {
addError(KungfuConstant.MASSAGE, "#(className)对象属性#(columnName)不能为空");
}
#end
#end
#end
}
} catch (Exception e) {
addError(KungfuConstant.MASSAGE, e.getMessage());
}
}
@Override
protected void handleError(Controller c) {
c.renderJson(getRet());
}
}
service代码模板
java
package #(basePackage).modules.#(moduleName).service;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
#set(camelCaseName=toCamelCase(tableName))
import #(basePackage).modules.#(moduleName).model.#(className);
import com.jfinal.plugin.activerecord.Db;
import io.kungfu.panda.util.PinyinKit;
import org.kungfu.core.KungfuService;
import org.kungfu.core.R;
import org.kungfu.core.UserInfo;
public class #(className)Service extends KungfuService<#(className)> {
private final #(className) dao = #(className).dao;
public R saveOrUpdate(#(className) #(camelCaseName), UserInfo userInfo) {
if (#(camelCaseName) == null) {
return R.fail(630, "信息不能为空");
}
Date date = new Date();
if (#(toCamelCase(tableName)).getId() != null) {
#(camelCaseName).setUpdateUser(userInfo.getUserName());
#(camelCaseName).setUpdateUserId(userInfo.getUserId());
#(camelCaseName).setUpdateTime(date);
if (#(camelCaseName).update()) {
CacheKit.remove("#(camelCaseName)", "#(camelCaseName)Tree");
return R.ok("更新成功");
}
return R.fail(641, "更新失败");
}
else {
#(camelCaseName).setCreateUser(userInfo.getUserName());
#(camelCaseName).setCreateUserId(userInfo.getUserId());
#(camelCaseName).setCreateTime(date);
if (#(camelCaseName).save()) {
CacheKit.removeAll("#(camelCaseName)");
return R.ok("保存成功");
}
return R.fail(640, "保存失败");
}
}
}
controller代码模板
java
package #(basePackage).modules.#(moduleName).controller;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
#set(camelCaseName=toCamelCase(tableName))
#set(tableComment=tableComment.replace("表",""))
import #(basePackage).modules.#(moduleName).dto.#(className)DTO;
import #(basePackage).modules.#(moduleName).model.#(className);
import #(basePackage).modules.#(moduleName).validate.#(className)Validator;
import #(basePackage).modules.#(moduleName).service.#(className)Service;
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 = "#(tableComment)", tags = "#(tableComment)接口")
@Path("/#(basePath)")
public class #(className)Controller extends KungfuController {
@Inject
private #(className)Service #(camelCaseName)Service;
@ApiOperation(value = "#(tableComment)信息保存或修改", notes = "根据表单内容保存或更新内容", httpMethod = ApiEnum.METHOD_POST, produces = ApiEnum.PRODUCES_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)", value = "#(tableComment)信息", dataTypeClass = #(className)DTO.class, paramType = ApiEnum.PARAM_TYPE_BODY)
})
@ApiResCustom(ResultVO.class)
@Before(#(className)Validator.class)
public void saveOrUpdate() {
#(className) #(camelCaseName) = toModel(#(className).class);
renderJson(#(camelCaseName)Service.saveOrUpdate(#(camelCaseName), 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(#(className).class));
}
@ApiOperation(value = "#(tableComment)信息查询", notes = "根据表ID查询#(tableComment)信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)Id", value = "#(tableComment)ID", defaultValue = "100")
})
@ApiResCustom(ResultVO.class)
public void getInfo() {
Long #(camelCaseName)Id = getLong("#(camelCaseName)Id");
renderJson(selectById(#(camelCaseName)Id, #(className).class));
}
@ApiOperation(value = "删除#(tableComment)记录", notes = "根据表ID删除#(tableComment)记录,支持批量删除")
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)Ids", value = "#(toCamelCase(tableComment))IDs", defaultValue = "100,200,300")
})
@ApiResCustom(ResultVO.class)
public void deleteByIds() {
String #(camelCaseName)Ids = get("#(camelCaseName)Ids");
renderJson(deleteByIds(#(camelCaseName)Ids, #(className).class));
}
}
树型结构service代码模板
java
package #(basePackage).modules.#(moduleName).service;
import #(basePackage).modules.#(moduleName).model.#(firstCharToUpperCase(toCamelCase(tableName)));
import org.kungfu.core.*;
import org.kungfu.util.KungfuKit;
import org.kungfu.core.R;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.ehcache.CacheKit;
import java.util.Date;
import java.util.List;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
#set(camelCaseName=toCamelCase(tableName))
#set(treeCode=getTreeCode(tableName))
#set(treeName=getTreeName(tableName))
#set(codeColumn=getCodeColumn(tableName))
#set(codeColumnName=getCodeColumnName(tableName))
#set(tableComment=tableComment.replace("表",""))
public class #(className)Service extends KungfuService<#(className)> {
private final #(className) dao = #(className).dao;
public Record buildTree(String queryName) {
String sql = "select * from #(tableName) order by display_no";
if (StrKit.notBlank(queryName)) {
sql = "select * from #(tableName) where #(codeColumnName) like '%" + queryName + "%' order by display_no";
}
List<Record> #(camelCaseName)List = Db.find(sql);
return buildTree(KungfuKit.toHumpsList(#(camelCaseName)List), "#(codeColumn)", "#(tableComment)");
}
public #(className) findByCode(String code) {
return dao.findFirst("select * from #(tableName) where #(codeColumn)=?", code);
}
public R saveOrUpdate(#(className) #(camelCaseName), UserInfo userInfo) {
if (#(camelCaseName) == null) {
return R.fail(630, "信息不能为空");
}
if (#(camelCaseName).getId() == null) {
#(className) exist = findByCode(#(treeCode));
if (exist != null) {
return R.fail(631, "编码已存在,请重新输入");
}
}
#(className) parent = findByCode(#(camelCaseName).getParentCode());
if (parent == null) {
#(camelCaseName).setParentName("#(tableComment)");
}
else {
#(camelCaseName).setParentName(parent.#(treeName));
}
Date date = new Date();
if (#(toCamelCase(tableName)).getId() != null) {
#(camelCaseName).setUpdateUser(userInfo.getUserName());
#(camelCaseName).setUpdateUserId(userInfo.getUserId());
#(camelCaseName).setUpdateTime(date);
if (#(camelCaseName).update()) {
CacheKit.remove("#(camelCaseName)", "#(camelCaseName)Tree");
return R.ok("更新成功");
}
return R.fail(620, "更新失败");
}
else {
#(camelCaseName).setCreateUser(userInfo.getUserName());
#(camelCaseName).setCreateUserId(userInfo.getUserId());
#(camelCaseName).setCreateTime(date);
if (#(camelCaseName).save()) {
CacheKit.removeAll("#(camelCaseName)");
return R.ok("保存成功");
}
return R.fail(630, "保存失败");
}
}
public boolean setStatus(Long #(camelCaseName)Id, Boolean isEnabled, UserInfo userInfo) {
#(className) #(camelCaseName) = dao.findById(#(camelCaseName)Id);
#(camelCaseName).setIsEnabled(isEnabled);
#(camelCaseName).setUpdateUserId(userInfo.getUserId());
#(camelCaseName).setUpdateUser(userInfo.getUserName());
#(camelCaseName).setUpdateTime(new Date());
return #(camelCaseName).update();
}
}
树型结构controller代码模板
java
package #(basePackage).modules.#(moduleName).controller;
#set(className=firstCharToUpperCase(toCamelCase(tableName)))
#set(camelCaseName=toCamelCase(tableName))
#set(tableComment=tableComment.replace("表",""))
import #(basePackage).modules.#(moduleName).dto.#(className)DTO;
import #(basePackage).modules.#(moduleName).model.#(className);
import #(basePackage).modules.#(moduleName).validate.#(className)Validator;
import #(basePackage).modules.#(moduleName).service.#(className)Service;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.core.Path;
import org.kungfu.core.R;
import com.jfinal.kit.StrKit;
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 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;
import org.kungfu.core.*;
import org.kungfu.validator.HeaderValidator;
import org.kungfu.validator.PostRequestValidator;
import java.util.List;
@Api(value = "#(tableComment)", tags = "#(tableComment)接口")
@Path("/#(basePath)")
public class #(className)Controller extends KungfuController {
@Inject
private #(className)Service #(camelCaseName)Service;
@ApiOperation(value = "#(tableComment)树查询", notes = "#(tableComment)树查询,查询整棵树")
@ApiImplicitParams({
@ApiImplicitParam(name = "searchName", value = "#(tableComment)名称", defaultValue = "")
})
public void tree() {
String searchName = get("searchName");
// 缓存
Record #(camelCaseName)Tree = CacheKit.get("#(camelCaseName)", "#(camelCaseName)Tree", () -> #(camelCaseName)Service.buildTree(searchName));
renderJson(R.ok("data", #(camelCaseName)Tree));
}
@ApiOperation(value = "#(tableComment)信息保存或修改", notes = "根据表单内容保存或更新内容", httpMethod = ApiEnum.METHOD_POST, produces = ApiEnum.PRODUCES_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)", value = "#(tableComment)信息", dataTypeClass = #(className)DTO.class, paramType = ApiEnum.PARAM_TYPE_BODY)
})
@ApiResCustom(ResultVO.class)
@Before(#(className)Validator.class)
public void saveOrUpdate() {
#(className) #(camelCaseName) = toModel(#(className).class);
renderJson(#(camelCaseName)Service.saveOrUpdate(#(camelCaseName), getUserInfo()));
}
@ApiOperation(value = "#(tableComment)分页查询", notes = "根据页码及查询条件分页查询")
@ApiImplicitParams({
@ApiImplicitParam(name = "queryCondition", value = "查询条件", dataTypeClass = QueryCondition.class, paramType = ApiEnum.PARAM_TYPE_BODY, required = true)
})
@ApiResCustom(ResultVO.class)
public void queryPage() {
renderJson(queryPage(#(className).class));
}
@ApiOperation(value = "#(tableComment)信息查询", notes = "根据表ID查询#(tableComment)信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)Id", value = "#(tableComment)ID", defaultValue = "100")
})
@ApiResCustom(ResultVO.class)
public void getInfo() {
Long #(camelCaseName)Id = getLong("#(camelCaseName)Id");
renderJson(selectById(#(camelCaseName)Id, #(className).class));
}
@ApiOperation(value = "删除#(tableComment)记录", notes = "根据表ID删除#(tableComment)记录,支持批量删除")
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)Ids", value = "#(toCamelCase(tableComment))IDs", defaultValue = "100,200,300")
})
@ApiResCustom(ResultVO.class)
public void deleteByIds() {
String #(camelCaseName)Ids = get("#(camelCaseName)Ids");
renderJson(deleteByIds(#(camelCaseName)Ids, #(className).class));
}
@ApiOperation(value = "设置状态", notes = "设置状态:启用停用")
@ApiImplicitParams({
@ApiImplicitParam(name = "#(camelCaseName)Id", value = "#(tableComment)ID", dataType = "Long"),
@ApiImplicitParam(name = "isEnabled", value = "启用状态", dataType = "Boolean")
})
@ApiResCustom(ResultVO.class)
@Before({EvictInterceptor.class,HeaderValidator.class})
@CacheName("#(camelCaseName)")
public void setStatus() {
Long #(camelCaseName)Id = getLong("#(camelCaseName)Id");
Boolean isEnabled = getBoolean("isEnabled");
renderJson(#(camelCaseName)Service.setStatus(#(camelCaseName)Id, isEnabled, getUserInfo()) ? R.ok("更新成功") : R.fail("更新失败"));
}
}