diff --git a/src/test/resources/templates/bo.java.vm b/src/test/resources/templates/bo.java.vm
new file mode 100644
index 00000000..8757f0ff
--- /dev/null
+++ b/src/test/resources/templates/bo.java.vm
@@ -0,0 +1,141 @@
+package ${package.Parent}.model.bo;
+
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+#if(${chainModel})
+import lombok.experimental.Accessors;
+#end
+#end
+import java.time.LocalDateTime;
+
+/**
+ * $!{table.comment}
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+@Accessors(chain = true)
+ #end
+#end
+#if(${superEntityClass})
+public class ${entity}BO extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity}BO extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity}BO implements Serializable {
+#else
+public class ${entity}BO {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+#if(${field.keyFlag})
+#set($keyPropertyName=${field.propertyName})
+#end
+#if("$!field.comment" != "")
+ /**
+ * ${field.comment}
+ */
+#end
+#if(${field.keyFlag})
+## 主键
+ #if(${field.keyIdentityFlag})
+ @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
+ #elseif(!$null.isNull(${idType}) && "$!idType" != "")
+ @TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
+ #elseif(${field.convert})
+ @TableId("${field.annotationColumnName}")
+ #end
+## 普通字段
+#elseif(${field.fill})
+## ----- 存在字段填充设置 -----
+ #if(${field.convert})
+ @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
+ #else
+ @TableField(fill = FieldFill.${field.fill})
+ #end
+#elseif(${field.convert})
+ @TableField("${field.annotationColumnName}")
+#end
+## 乐观锁注解
+#if(${field.versionField})
+ @Version
+#end
+## 逻辑删除注解
+#if(${field.logicDeleteField})
+ @TableLogic
+#end
+ private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+#foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+#end
+## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+ public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+ }
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+ }
+#end
+}
diff --git a/src/test/resources/templates/controller.java.vm b/src/test/resources/templates/controller.java.vm
new file mode 100644
index 00000000..eebde7db
--- /dev/null
+++ b/src/test/resources/templates/controller.java.vm
@@ -0,0 +1,81 @@
+package ${package.Controller};
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import ${package.Parent}.model.form.${entity}Form;
+import ${package.Parent}.model.query.${entity}PageQuery;
+import ${package.Parent}.model.vo.${entity}PageVO;
+import ${package.Parent}.service.${table.serviceName};
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.youlai.common.result.PageResult;
+import com.youlai.common.result.Result;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import jakarta.validation.Valid;
+
+#if(${superControllerClassPackage})
+import ${superControllerClassPackage};
+#end
+
+/**
+ * $!{table.comment} 前端控制器
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Tag(name = "${table.comment}接口")
+@RestController
+@RequestMapping("/api/v1/${firstCharLowerCaseEntity}s")
+@RequiredArgsConstructor
+#if(${superControllerClass})
+public class ${table.controllerName} extends ${superControllerClass} {
+#else
+public class ${table.controllerName} {
+#end
+
+ private final ${table.serviceName} ${firstCharLowerCaseEntity}Service;
+
+ @Operation(summary = "$!{table.comment}分页列表")
+ @GetMapping("/page")
+ public PageResult<${entity}PageVO> listPaged${entity}s(${entity}PageQuery queryParams ) {
+ IPage<${entity}PageVO> result = ${firstCharLowerCaseEntity}Service.listPaged${entity}s(queryParams);
+ return PageResult.success(result);
+ }
+
+ @Operation(summary = "新增$!{table.comment}")
+ @PostMapping
+ public Result save${entity}(@RequestBody @Valid ${entity}Form formData ) {
+ boolean result = ${firstCharLowerCaseEntity}Service.save${entity}(formData);
+ return Result.judge(result);
+ }
+
+ @Operation(summary = "$!{table.comment}表单数据")
+ @GetMapping("/{id}/form")
+ public Result<${entity}Form> get${entity}Form(
+ @Parameter(description = "$!{table.comment}ID") @PathVariable Long id
+ ) {
+ ${entity}Form formData = ${firstCharLowerCaseEntity}Service.get${entity}FormData(id);
+ return Result.success(formData);
+ }
+
+ @Operation(summary = "修改$!{table.comment}")
+ @PutMapping(value = "/{id}")
+ public Result update${entity}(@Parameter(description = "$!{table.comment}ID") @PathVariable Long id,
+ @RequestBody @Validated ${entity}Form formData) {
+ boolean result = ${firstCharLowerCaseEntity}Service.update${entity}(id, formData);
+ return Result.judge(result);
+ }
+
+ @Operation(summary = "删除$!{table.comment}")
+ @DeleteMapping("/{ids}")
+ public Result delete${entity}s(
+ @Parameter(description = "$!{table.comment}ID,多个以英文逗号(,)分割") @PathVariable String ids
+ ) {
+ boolean result = ${firstCharLowerCaseEntity}Service.delete${entity}s(ids);
+ return Result.judge(result);
+ }
+}
diff --git a/src/test/resources/templates/converter.java.vm b/src/test/resources/templates/converter.java.vm
new file mode 100644
index 00000000..93f97381
--- /dev/null
+++ b/src/test/resources/templates/converter.java.vm
@@ -0,0 +1,30 @@
+package ${package.Parent}.converter;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import ${package.Parent}.model.dto.${entity}DTO;
+import ${package.Parent}.model.entity.${entity};
+import ${package.Parent}.model.vo.${entity}PageVO;
+import ${package.Parent}.model.form.${entity}Form;
+import ${package.Parent}.model.bo.${entity}BO;
+
+/**
+ * $!{table.comment}转换器
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Mapper(componentModel = "spring")
+public interface ${entity}Converter{
+
+ ${entity}PageVO toPageVo(${entity}BO bo);
+
+ Page<${entity}PageVO> toPageVo(Page<${entity}BO> bo);
+
+ ${entity}Form toForm(${entity} entity);
+
+ @InheritInverseConfiguration(name = "toForm")
+ ${entity} toEntity(${entity}Form entity);
+}
\ No newline at end of file
diff --git a/src/test/resources/templates/dto.java.vm b/src/test/resources/templates/dto.java.vm
new file mode 100644
index 00000000..2cf3c041
--- /dev/null
+++ b/src/test/resources/templates/dto.java.vm
@@ -0,0 +1,112 @@
+package ${package.Parent}.model.dto;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+ #if(${chainModel})
+ import lombok.experimental.Accessors;
+ #end
+#end
+import java.io.Serializable;
+import java.time.LocalDateTime;
+/**
+ * $!{table.comment} DTO
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+@Accessors(chain = true)
+ #end
+#end
+@Schema( description = "$!{table.comment}传输层对象")
+#if(${superEntityClass})
+public class ${entity}DTO extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity}DTO extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity}DTO implements Serializable {
+#else
+public class ${entity}DTO {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+ #if(${field.keyFlag})
+ #set($keyPropertyName=${field.propertyName})
+ #end
+ #if("$!field.comment" != "")
+ @Schema(description = "${field.comment}")
+ #end
+
+private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+ #foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+ #end
+ ## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+}
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+}
+#end
+}
diff --git a/src/test/resources/templates/entity.java.vm b/src/test/resources/templates/entity.java.vm
new file mode 100644
index 00000000..4c2e2b57
--- /dev/null
+++ b/src/test/resources/templates/entity.java.vm
@@ -0,0 +1,143 @@
+package ${package.Entity};
+
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+#if(${chainModel})
+import lombok.experimental.Accessors;
+#end
+#end
+
+/**
+ * $!{table.comment}实体
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+@Accessors(chain = true)
+ #end
+#end
+#if(${table.convert})
+@TableName("${schemaName}${table.name}")
+#end
+#if(${superEntityClass})
+public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity} extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity} implements Serializable {
+#else
+public class ${entity} {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+#if(${field.keyFlag})
+#set($keyPropertyName=${field.propertyName})
+#end
+#if("$!field.comment" != "")
+ /**
+ * ${field.comment}
+ */
+#end
+#if(${field.keyFlag})
+## 主键
+ #if(${field.keyIdentityFlag})
+ @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
+ #elseif(!$null.isNull(${idType}) && "$!idType" != "")
+ @TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
+ #elseif(${field.convert})
+ @TableId("${field.annotationColumnName}")
+ #end
+## 普通字段
+#elseif(${field.fill})
+## ----- 存在字段填充设置 -----
+ #if(${field.convert})
+ @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
+ #else
+ @TableField(fill = FieldFill.${field.fill})
+ #end
+#elseif(${field.convert})
+ @TableField("${field.annotationColumnName}")
+#end
+## 乐观锁注解
+#if(${field.versionField})
+ @Version
+#end
+## 逻辑删除注解
+#if(${field.logicDeleteField})
+ @TableLogic
+#end
+ private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+#foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+#end
+## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+ public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+ }
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+ }
+#end
+}
diff --git a/src/test/resources/templates/form.java.vm b/src/test/resources/templates/form.java.vm
new file mode 100644
index 00000000..d1a9b2ec
--- /dev/null
+++ b/src/test/resources/templates/form.java.vm
@@ -0,0 +1,113 @@
+package ${package.Parent}.model.form;
+
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+import io.swagger.v3.oas.annotations.media.Schema;
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+ #if(${chainModel})
+ import lombok.experimental.Accessors;
+ #end
+#end
+
+/**
+ * $!{table.comment} 表单对象
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+ @Accessors(chain = true)
+ #end
+#end
+@Schema(description = "$!{table.comment}表单对象")
+#if(${superEntityClass})
+public class ${entity}Form extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity}Form extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity}Form implements Serializable {
+#else
+public class ${entity}Form {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+ #if(${field.keyFlag})
+ #set($keyPropertyName=${field.propertyName})
+ #end
+ #if("$!field.comment" != "")
+ @Schema(description = "${field.comment}")
+ #end
+
+private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+ #foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+ #end
+ ## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+ public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+}
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+}
+#end
+}
diff --git a/src/test/resources/templates/mapper.java.vm b/src/test/resources/templates/mapper.java.vm
new file mode 100644
index 00000000..a9828fbc
--- /dev/null
+++ b/src/test/resources/templates/mapper.java.vm
@@ -0,0 +1,35 @@
+package ${package.Mapper};
+
+import ${package.Entity}.${entity};
+import ${superMapperClassPackage};
+#if(${mapperAnnotationClass})
+import ${mapperAnnotationClass.name};
+#end
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import ${package.Parent}.model.bo.${entity}BO;
+import ${package.Parent}.model.query.${entity}PageQuery;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * $!{table.comment} Mapper 接口
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${mapperAnnotationClass})
+@${mapperAnnotationClass.simpleName}
+#end
+
+@Mapper
+public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
+
+ /**
+ * 获取用户分页列表
+ *
+ * @param page
+ * @param queryParams 查询参数
+ * @return
+ */
+ Page<${entity}BO> listPaged${entity}s(Page<${entity}BO> page, ${entity}PageQuery queryParams);
+
+}
diff --git a/src/test/resources/templates/mapper.xml.vm b/src/test/resources/templates/mapper.xml.vm
new file mode 100644
index 00000000..c1e3ebd2
--- /dev/null
+++ b/src/test/resources/templates/mapper.xml.vm
@@ -0,0 +1,63 @@
+
+
+
+
+#if(${enableCache})
+
+
+
+#end
+#if(${baseResultMap})
+
+
+#foreach($field in ${table.fields})
+#if(${field.keyFlag})##生成主键排在第一位
+
+#end
+#end
+#foreach($field in ${table.commonFields})##生成公共字段
+
+#end
+#foreach($field in ${table.fields})
+#if(!${field.keyFlag})##生成普通字段
+
+#end
+#end
+
+
+#end
+#if(${baseColumnList})
+
+
+#foreach($field in ${table.commonFields})
+ ${field.columnName},
+#end
+ ${table.fieldNames}
+
+
+#end
+
+
+
+
+
diff --git a/src/test/resources/templates/pageQuery.java.vm b/src/test/resources/templates/pageQuery.java.vm
new file mode 100644
index 00000000..0c761ea1
--- /dev/null
+++ b/src/test/resources/templates/pageQuery.java.vm
@@ -0,0 +1,20 @@
+package ${package.Parent}.model.query;
+
+import com.youlai.common.base.BasePageQuery;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * $!{table.comment}分页查询对象
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Schema(description ="$!{table.comment}分页查询对象")
+@Data
+public class ${entity}PageQuery extends BasePageQuery {
+
+ @Schema(description="关键字")
+ private String keywords;
+
+}
diff --git a/src/test/resources/templates/pageVo.java.vm b/src/test/resources/templates/pageVo.java.vm
new file mode 100644
index 00000000..582fac4f
--- /dev/null
+++ b/src/test/resources/templates/pageVo.java.vm
@@ -0,0 +1,113 @@
+package ${package.Parent}.model.vo;
+
+#foreach($pkg in ${table.importPackages})
+import ${pkg};
+#end
+import io.swagger.v3.oas.annotations.media.Schema;
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+ #if(${chainModel})
+ import lombok.experimental.Accessors;
+ #end
+#end
+
+/**
+ * $!{table.comment} 分页VO
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+ @Accessors(chain = true)
+ #end
+#end
+@Schema( description = "$!{table.comment}分页视图对象")
+#if(${superEntityClass})
+public class ${entity}PageVO extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity}PageVO extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity}PageVO implements Serializable {
+#else
+public class ${entity}PageVO {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+ #if(${field.keyFlag})
+ #set($keyPropertyName=${field.propertyName})
+ #end
+ #if("$!field.comment" != "")
+ @Schema(description = "${field.comment}")
+ #end
+
+ private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+ #foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+ #end
+ ## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+ public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+}
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+}
+#end
+}
diff --git a/src/test/resources/templates/service.java.vm b/src/test/resources/templates/service.java.vm
new file mode 100644
index 00000000..2c05ca26
--- /dev/null
+++ b/src/test/resources/templates/service.java.vm
@@ -0,0 +1,61 @@
+package ${package.Service};
+
+import ${package.Entity}.${entity};
+import ${superServiceClassPackage};
+import ${package.Parent}.model.form.${entity}Form;
+import ${package.Parent}.model.query.${entity}PageQuery;
+import ${package.Parent}.model.vo.${entity}PageVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+/**
+ * $!{table.comment} 服务类
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
+
+
+ /**
+ *$!{table.comment}分页列表
+ *
+ * @return
+ */
+ IPage<${entity}PageVO> listPaged${entity}s(${entity}PageQuery queryParams);
+
+
+ /**
+ * 获取$!{table.comment}表单数据
+ *
+ * @param id $!{table.comment}ID
+ * @return
+ */
+ ${entity}Form get${entity}FormData(Long id);
+
+
+ /**
+ * 新增$!{table.comment}
+ *
+ * @param formData $!{table.comment}表单对象
+ * @return
+ */
+ boolean save${entity}(${entity}Form formData);
+
+ /**
+ * 修改$!{table.comment}
+ *
+ * @param id $!{table.comment}ID
+ * @param formData $!{table.comment}表单对象
+ * @return
+ */
+ boolean update${entity}(Long id, ${entity}Form formData);
+
+
+ /**
+ * 删除$!{table.comment}
+ *
+ * @param ids $!{table.comment}ID,多个以英文逗号(,)分割
+ * @return
+ */
+ boolean delete${entity}s(String ids);
+
+}
diff --git a/src/test/resources/templates/serviceImpl.java.vm b/src/test/resources/templates/serviceImpl.java.vm
new file mode 100644
index 00000000..23876147
--- /dev/null
+++ b/src/test/resources/templates/serviceImpl.java.vm
@@ -0,0 +1,117 @@
+package ${package.ServiceImpl};
+
+import ${package.Entity}.${entity};
+import ${package.Mapper}.${table.mapperName};
+import ${package.Service}.${table.serviceName};
+import ${superServiceImplClassPackage};
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.youlai.common.util.DateUtils;
+import ${package.Parent}.model.form.${entity}Form;
+import ${package.Parent}.model.query.${entity}PageQuery;
+import ${package.Parent}.model.bo.${entity}BO;
+import ${package.Parent}.model.vo.${entity}PageVO;
+import ${package.Parent}.converter.${entity}Converter;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * $!{table.comment}服务实现类
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+@Service
+@RequiredArgsConstructor
+public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
+
+ private final ${entity}Converter ${firstCharLowerCaseEntity}Converter;
+
+ /**
+ * 获取$!{table.comment}分页列表
+ *
+ * @param queryParams 查询参数
+ * @return {@link IPage<${entity}PageVO>} $!{table.comment}分页列表
+ */
+ @Override
+ public IPage<${entity}PageVO> listPaged${entity}s(${entity}PageQuery queryParams) {
+
+ // 参数构建
+ int pageNum = queryParams.getPageNum();
+ int pageSize = queryParams.getPageSize();
+ Page<${entity}BO> page = new Page<>(pageNum, pageSize);
+
+ // 格式化为数据库日期格式,避免日期比较使用格式化函数导致索引失效
+ DateUtils.toDatabaseFormat(queryParams, "startTime", "endTime");
+
+ // 查询数据
+ Page<${entity}BO> boPage = this.baseMapper.listPaged${entity}s(page, queryParams);
+
+ // 实体转换
+ return ${firstCharLowerCaseEntity}Converter.toPageVo(boPage);
+ }
+
+ /**
+ * 获取$!{table.comment}表单数据
+ *
+ * @param id $!{table.comment}ID
+ * @return
+ */
+ @Override
+ public ${entity}Form get${entity}FormData(Long id) {
+ ${entity} entity = this.getById(id);
+ return ${firstCharLowerCaseEntity}Converter.toForm(entity);
+ }
+
+ /**
+ * 新增$!{table.comment}
+ *
+ * @param formData $!{table.comment}表单对象
+ * @return
+ */
+ @Override
+ public boolean save${entity}(${entity}Form formData) {
+ // 实体转换 form->entity
+ ${entity} entity = ${firstCharLowerCaseEntity}Converter.toEntity(formData);
+ return this.save(entity);
+ }
+
+ /**
+ * 更新$!{table.comment}
+ *
+ * @param id $!{table.comment}ID
+ * @param formData $!{table.comment}表单对象
+ * @return
+ */
+ @Override
+ public boolean update${entity}(Long id,${entity}Form formData) {
+ ${entity} entity = ${firstCharLowerCaseEntity}Converter.toEntity(formData);
+ return this.updateById(entity);
+ }
+
+ /**
+ * 删除$!{table.comment}
+ *
+ * @param ids $!{table.comment}ID,多个以英文逗号(,)分割
+ * @return true|false
+ */
+ @Override
+ public boolean delete${entity}s(String ids) {
+ Assert.isTrue(StrUtil.isNotBlank(ids), "删除的$!{table.comment}数据为空");
+ // 逻辑删除
+ List idList = Arrays.stream(ids.split(","))
+ .map(Long::parseLong)
+ .toList();
+ return this.removeByIds(idList);
+ }
+
+
+}
diff --git a/src/test/resources/templates/vo.java.vm b/src/test/resources/templates/vo.java.vm
new file mode 100644
index 00000000..1adb8877
--- /dev/null
+++ b/src/test/resources/templates/vo.java.vm
@@ -0,0 +1,112 @@
+package ${package.Parent}.model.vo;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+#if(${entityLombokModel})
+import lombok.Getter;
+import lombok.Setter;
+ #if(${chainModel})
+ import lombok.experimental.Accessors;
+ #end
+#end
+
+/**
+ * $!{table.comment} VO
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+#if(${entityLombokModel})
+@Getter
+@Setter
+ #if(${chainModel})
+ @Accessors(chain = true)
+ #end
+#end
+@Schema( description = "$!{table.comment}视图对象")
+#if(${superEntityClass})
+public class ${entity}VO extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
+#elseif(${activeRecord})
+public class ${entity} extends Model<${entity}> {
+#elseif(${entitySerialVersionUID})
+public class ${entity}VO implements Serializable {
+#else
+public class ${entity}VO {
+#end
+#if(${entitySerialVersionUID})
+
+ private static final long serialVersionUID = 1L;
+#end
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in ${table.fields})
+
+ #if(${field.keyFlag})
+ #set($keyPropertyName=${field.propertyName})
+ #end
+ #if("$!field.comment" != "")
+ @Schema(description = "${field.comment}")
+ #end
+
+ private ${field.propertyType} ${field.propertyName};
+#end
+## ---------- END 字段循环遍历 ----------
+#if(!${entityLombokModel})
+ #foreach($field in ${table.fields})
+ #if(${field.propertyType.equals("boolean")})
+ #set($getprefix="is")
+ #else
+ #set($getprefix="get")
+ #end
+
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ #if(${chainModel})
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #else
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #end
+ this.${field.propertyName} = ${field.propertyName};
+ #if(${chainModel})
+ return this;
+ #end
+ }
+ #end
+ ## --foreach end---
+#end
+## --end of #if(!${entityLombokModel})--
+#if(${entityColumnConstant})
+ #foreach($field in ${table.fields})
+
+ public static final String ${field.name.toUpperCase()} = "${field.name}";
+ #end
+#end
+#if(${activeRecord})
+
+ @Override
+ public Serializable pkVal() {
+ #if(${keyPropertyName})
+ return this.${keyPropertyName};
+ #else
+ return null;
+ #end
+}
+#end
+#if(!${entityLombokModel})
+
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ #foreach($field in ${table.fields})
+ #if($!{foreach.index}==0)
+ "${field.propertyName} = " + ${field.propertyName} +
+ #else
+ ", ${field.propertyName} = " + ${field.propertyName} +
+ #end
+ #end
+ "}";
+}
+#end
+}