模板开发

autoCode.xml

一个autoCode.xml配置文件示例,;

autoCode.xml用于描述该文件夹下所有的模板的 输入路径和输出路径。 一般我们只需要关系 【templates->template 】 XML节点即可,在这里做扩展,其它直接复制稍微修饰即可。

template说明:

  • id:模板ID,请保持唯一;
  • name: 模板名称,请保持唯一;
  • destFile:输出目录;
  • templateFile:模板相对路径,相对于模板根目录;
  • engine: 可以为 groovy, velocity, jxls(excel模板), freemarker(暂未支持),thymeleaf(暂未支持);
  • acceptDataModel: 可接受处理的数据模型: tableModel,json,lineList,cellList,javaSource,rawContent,xml
  • description: 模板描述,可以进行介绍;
<?xml version="1.0" encoding="UTF-8" ?>
<autoMake
        xmlns="https://cn2oo8.github.io/molicode_doc/schema/autoCode"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://cn2oo8.github.io/molicode_doc/schema/autoCode https://cn2oo8.github.io/molicode_doc/schema/autoCode/autoCode-1.0.xsd">

    <moliCodeVersion>1.0.0</moliCodeVersion>


    <mavenInfo>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.shareyi.molicode</groupId>
        <version>1.0-SNAPSHOT</version>
        <artifactId>autocode-template-selfsdk</artifactId>
        <name>moliCode生成自有代码的模板</name>
        <description>moliCode生成自有代码的模板</description>

        <developers>
            <developer>
                <name>david</name>
                <email>zsb1987@foxmail.com</email>
                <organization>www.shareyi.com</organization>
                <organizationUrl>www.shareyi.com</organizationUrl>
            </developer>
        </developers>
    </mavenInfo>

    <properties>
        <!-- 代码片段配置文件,将部分公用的代码抽取出来放置到此处 -->
        <property key="snippet.template.path">config/molicode/snippetTemplate.xml</property>
        <!-- 用户自定义的配置文件,配置的值以文本方式直接可以在:extendConf.get("") 到-->
        <property key="extend.text.config">config/molicode/extendConfig.xml</property>
        <!-- 页面依赖资源配置文件(可支持requirejs和 普通引入)-->
        <property key="pagerequire.map.config">config/molicode/requireConfig.xml</property>
        <!-- 数据库类型到java类型映射-->
        <property key="dbtype.javatype.map.config">config/molicode/db2javaTypeMap.xml</property>
        <!-- 数据库类型到页面类型映射-->
        <property key="dbtype.columntag.map.config">config/molicode/dbType2ColumnTagMap.xml</property>

    </properties>


    <templates>
        <template id="domain" name="domain类"
                  destFile="/${config.artifactId}-domain/src/main/java/${PubUtils.packageToPath(config.basePackage)}/domain/${PubUtils.packageToPath(config.category)}/${tableDefine.id}.java"
                  templateFile="templates/domain/domain.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>
        </template>


        <template id="builder" name="builder类"
                  destFile="/${config.artifactId}-domain/src/main/java/${PubUtils.packageToPath(config.basePackage)}/builder/impl/${tableDefine.id}Builder.java"
                  templateFile="templates/domain/builder.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>
        </template>


        <template id="column" name="column 枚举"
                  destFile="/${config.artifactId}-common/src/main/java/${PubUtils.packageToPath(config.basePackage)}/common/enums/columns/${tableDefine.id}Column.java"
                  templateFile="templates/domain/column.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>


        <template id="mybatisDaoIntf" name="dao接口"
                  destFile="/${config.artifactId}-dao/src/main/java/${PubUtils.packageToPath(config.basePackage)}/dao/${PubUtils.packageToPath(config.category)}/${tableDefine.id}Dao.java"
                  templateFile="templates/dao/mybatis/daoIntf.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>

        <template id="mybatisMapper" name="mybatisMapper"
                  destFile="/${config.artifactId}-dao/src/main/resources/mapper/${tableDefine.id}.xml"
                  templateFile="templates/mapper/mybatis/mapper.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>


        <template id="managerIntf" name="manager 接口"
                  destFile="/${config.artifactId}-manager/src/main/java/${PubUtils.packageToPath(config.basePackage)}/manager/${PubUtils.packageToPath(config.category)}/${tableDefine.id}Manager.java"
                  templateFile="templates/manager/managerIntf.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
        <template id="managerImpl" name="manager接口 实现"
                  destFile="/${config.artifactId}-manager/src/main/java/${PubUtils.packageToPath(config.basePackage)}/manager/${PubUtils.packageToPath(config.category)}/impl/${tableDefine.id}ManagerImpl.java"
                  templateFile="templates/manager/managerImpl.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>


        <template id="serviceIntf" name="service SDK 接口"
                  destFile="/${config.artifactId}-service/src/main/java/${PubUtils.packageToPath(config.basePackage)}/service/${PubUtils.packageToPath(config.category)}/${tableDefine.id}Service.java"
                  templateFile="templates/sdk/serviceIntf.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>

        <template id="serviceImpl" name="service SDK 接口 实现"
                  destFile="/${config.artifactId}-service/src/main/java/${PubUtils.packageToPath(config.basePackage)}/service/${PubUtils.packageToPath(config.category)}/impl/${tableDefine.id}ServiceImpl.java"
                  templateFile="templates/sdk/serviceImpl.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>

        <template id="validator" name="validator SDK验证"
                  destFile="/${config.artifactId}-service/src/main/java/${PubUtils.packageToPath(config.basePackage)}/validate/provide/${tableDefine.id}Validator.java"
                  templateFile="templates/sdk/validator.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>

        <template id="controller" name="controller"
                  destFile="/${config.artifactId}-web/src/main/java/${PubUtils.packageToPath(config.basePackage)}/controller/${PubUtils.packageToPath(config.category)}/${tableDefine.id}Controller.java"
                  templateFile="templates/controller/controller.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>


        <template id="addPage" name="add页面"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/add.vue"
                  templateFile="templates/vue/add.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
        <template id="editPage" name="edit页面"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/edit.vue"
                  templateFile="templates/vue/edit.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
        <template id="listPage" name="list页面"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/list.vue"
                  templateFile="templates/vue/list.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
        <template id="operatePage" name="operate页面"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/operate.vue"
                  templateFile="templates/vue/operate.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
        <template id="tableDefineVue" name="tableDefineVue"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/tableDefine.js"
                  templateFile=" templates/vue/tableDefine.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>


        <template id="configVue" name="configVue配置信息"
                  destFile="/ui-starter/src/views/${PubUtils.packageToPath(config.category)}/${tableNameUtil.lowerCaseFirst(tableDefine.id)}/config.js"
                  templateFile="templates/vue/config.gsp">
            <acceptDataModel>tableModel</acceptDataModel>
        </template>

        <template id="tableInfo" name="表结构"
                  destFile="/${config.artifactId}-web/src/main/resources/temp/${tableDefine.id}TableInfo.txt"
                  templateFile="templates/config/tableInfo.gsp">
            <acceptDataModel>tableModel</acceptDataModel>

        </template>
    </templates>

</autoMake>

代码模板示例

${snippetTemplateUtil.getTemplate('copyrightInfo')}

<%
	  def tableDefine=tableModel.tableDefine;
	  def columns=tableDefine.columns;
	  def pkColumn=tableDefine.getPkColumn();
	  def upperPkName=tableNameUtil.upperFirst(pkColumn.dataName)

	  Set excludes = ["id","status","operator","created","modified","concurrentVersion","dataVersion"]

%>package ${config.basePackage}.domain${PubUtils.addStrAfterSeparator(config.category,"." )};

import ${config.basePackage}.domain.BasicDomain;
import java.io.Serializable;
/**
 * @author ${config.author}
 * @since ${config.nowDate}
 * ${tableDefine.cnname} Domain 类
 */
public class ${tableDefine.id} extends BasicDomain implements Serializable {

  private static final long serialVersionUID = ${PubUtils.getRandomLong()}L;

<%
	  columns.each{
		  if(!excludes.contains(it.dataName)) {
			  println "	/**  ${it.cnname}  */";
			  println "	private ${tableNameUtil.getDataType(it.columnType)} ${it.dataName}; "
		  }
	  };

	  columns.each{
		  if(!excludes.contains(it.dataName)) {
			  String dataName = it.dataName

			  def upperFistName=tableNameUtil.upperFirst(dataName)
			  def dataType =tableNameUtil.getDataType(it.columnType)
			  println """
  	public void set${upperFistName}(${dataType} ${dataName}) {
  	  this.${dataName}=${dataName};
  	}

  	public ${dataType} get${upperFistName}() {
  	  return this.${dataName};
  	}"""
		  }
	  }
%>

}

文件目录说明

新建一个目录, 如 molicode-template-selfsdk然后在该目录下创建 autoCode.xml; 按上面的autoCode.xml配置文件编写内容;

在molicode-template-selfsdk下创建 templates 目录,并组织自己的模板文件,其中:

  • *.gsp 为groovy 脚本文件;
  • *.vm 为velocity文件;
  • *.xlsx 为Excel文件;

新增的文件需要在autoCode.xml中进行描述;如下图 domain.gsp文件在autoCode.xml 可描述为:

    <template id="domain" name="domain类"
                  destFile="/${config.artifactId}-domain/src/main/java/${PubUtils.packageToPath(config.basePackage)}/domain/${PubUtils.packageToPath(config.category)}/${tableDefine.id}.java"
                  templateFile="templates/domain/domain.gsp" engine="groovy">
            <acceptDataModel>tableModel</acceptDataModel>
        </template>

dir

pom.xml 文件请忽略,此为使用maven仓库和使用maven工程才需要使用,普通git项目只需要 autoCode.xml 和 模板文件即可。

模板资源存储

我们所有的模板资源,建议托管到git仓库里面,方便大家发布和更新资源。如果是公开的可以推送到public仓库,如果公司内部私有的可以推送到私有仓库。

一个git仓库可以只存储一个模板集合,也可以存储多个:

多个的git仓库每个子文件下存储一个模板集合,每个子文件夹下面都有一个autoCode.xml;

特别说明

模板开发请追踪以下链接地址工程: https://gitee.com/molicode_repo/molicode-template-study