From de04085526eda992155716eda98af621ad681e4e Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 26 Feb 2021 09:49:14 +0800
Subject: [PATCH] init

---
 src/main/resources/template/excelTempLateCopy/dao.ftl                   |   38 
 src/main/resources/config/code-generation.xml                           |  157 +
 src/main/java/com/matrix/codeGeneration/plugin/DateUtils.java           |  557 +++++
 src/main/java/com/matrix/codeGeneration/core/Generator.java             |  105 
 src/main/java/com/matrix/codeGeneration/ext/AhcsModels.java             |  276 ++
 src/main/java/com/matrix/codeGeneration/ext/OracleStyleNameConvert.java |   86 
 src/main/resources/template/excelTempLateCopy/form.ftl                  |   82 
 src/main/resources/template/excelTemplateForHis/action.ftl              |   71 
 src/main/resources/template/excelTemplateForBoot/list.ftl               |  161 +
 src/main/resources/template/excelTemplateForCloud/list.ftl              |  161 +
 src/main/java/com/matrix/codeGeneration/model/ModelType.java            |   78 
 src/main/resources/template/excelTempLateCopy/action.ftl                |  122 +
 src/main/java/com/matrix/codeGeneration/convert/DefaultNameConvert.java |   88 
 src/main/resources/template/excelTempLateCopy/javaBean.ftl              |   41 
 src/main/resources/template/excelTemplateForCloud/daoImpl.ftl           |  252 ++
 src/main/resources/template/excelTemplateForCloud/javaBean.ftl          |   42 
 src/main/resources/template/excelTemplateForHis/service.ftl             |   92 
 README.md                                                               |    5 
 src/main/java/com/matrix/codeGeneration/ext/Matrix4Models.java          |  318 ++
 src/main/resources/template/excelTemplate/serviceImpl.ftl               |  132 +
 src/main/resources/template/excelTemplate/sqlFile.ftl                   |   16 
 src/main/resources/template/excelTemplateForCloud/dao.ftl               |   40 
 src/main/resources/template/excelTemplateForHis/mybatis-config.ftl      |   33 
 src/main/java/com/matrix/codeGeneration/model/CodeFile.java             |   65 
 src/main/resources/template/excelTemplateForBoot/action.ftl             |  122 +
 src/main/resources/template/excelTemplateForHis/javaBean.ftl            |   49 
 src/main/resources/template/excelTemplate/mybatis-config.ftl            |   33 
 src/main/resources/template/excelTemplateForHis/dao.ftl                 |   15 
 src/main/resources/template/excelTemplateForCloud/form.ftl              |   82 
 src/main/resources/template/excelTemplateForBoot/mybatis-config.ftl     |   33 
 src/main/java/com/matrix/codeGeneration/model/PropertyColumn.java       |  218 +
 src/main/resources/template/excelTemplate/list.ftl                      |  132 +
 src/main/java/com/matrix/codeGeneration/core/MainClass.java             |   26 
 src/main/java/com/matrix/codeGeneration/model/CodeModel.java            |   13 
 src/main/resources/template/excelTempLateCopy/mybatis-config.ftl        |   33 
 matrix-codeGenerator.zip                                                |    0 
 src/main/resources/template/excelTemplate/service.ftl                   |   72 
 src/main/resources/template/excelTemplateForBoot/数据字典表(模板).xlsx         |    0 
 pom.xml                                                                 |   94 
 src/main/java/com/matrix/codeGeneration/model/Constant.java             |   68 
 src/main/resources/template/excelTempLateCopy/数据字典表(模板).xlsx            |    0 
 src/main/resources/template/excelTemplateForHis/daoImpl.ftl             |  104 
 src/main/java/com/matrix/codeGeneration/ext/ExcelDataSource.java        |  207 +
 src/main/java/com/matrix/codeGeneration/convert/NameConvert.java        |   57 
 src/main/resources/template/excelTempLateCopy/sqlFile.ftl               |   29 
 src/main/resources/template/excelTemplateForCloud/mybatis-config.ftl    |   33 
 src/main/resources/template/excelTemplateForBoot/sqlFile.ftl            |   46 
 src/main/resources/template/excelTemplateForCloud/sqlFile.ftl           |   54 
 src/main/resources/template/excelTemplate/form.ftl                      |   82 
 src/main/resources/template/excelTemplateForCloud/数据字典表(模板).xlsx        |    0 
 src/main/java/com/matrix/codeGeneration/model/OutDataSource.java        |   89 
 src/main/java/com/matrix/codeGeneration/convert/DefaultTypeHandle.java  |   91 
 src/main/java/com/matrix/codeGeneration/plugin/ExcelImport.java         |  326 ++
 src/main/resources/template/excelTemplate/daoImpl.ftl                   |  226 ++
 src/main/resources/template/excelTemplateForCloud/action.ftl            |   81 
 src/main/resources/template/excelTemplate/action.ftl                    |   88 
 src/main/resources/template/excelTemplateForBoot/daoImpl.ftl            |  226 ++
 src/main/java/com/matrix/codeGeneration/model/TableClassModel.java      |  150 +
 src/main/resources/template/excelTempLateCopy/daoImpl.ftl               |  226 ++
 src/main/resources/template/excelTemplate/javaBean.ftl                  |   41 
 src/main/java/com/matrix/codeGeneration/model/CommonData.java           |   19 
 src/main/resources/template/excelTemplateForBoot/form.ftl               |   82 
 src/main/java/com/matrix/codeGeneration/model/Attribute.java            |   43 
 src/main/resources/template/excelTemplateForBoot/javaBean.ftl           |   42 
 src/main/resources/template/excelTemplate/dao.ftl                       |   38 
 src/main/resources/template/excelTemplateForBoot/dao.ftl                |   38 
 src/main/resources/template/excelTemplateForHis/sqlFile.ftl             |   34 
 src/main/java/com/matrix/codeGeneration/model/TypeHandle.java           |    9 
 src/main/resources/template/excelTempLateCopy/list.ftl                  |  132 +
 69 files changed, 6,597 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 68633ed..27f0de7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1 @@
-## matrix-codeGenerator
-
-matrix-codeGenerator
-
+#codegen3.0
diff --git a/matrix-codeGenerator.zip b/matrix-codeGenerator.zip
new file mode 100755
index 0000000..7022f26
--- /dev/null
+++ b/matrix-codeGenerator.zip
Binary files differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..8a6190e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,94 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.zkingsoft</groupId>
+	<artifactId>CodeGenerator</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>CodeGenerator</name>
+	<description>CodeGenerator</description>
+	<dependencies>
+		<dependency>
+			<groupId>org.httpobjects.freemarker</groupId>
+			<artifactId>httpobjects-freemarker</artifactId>
+			<version>0.5.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-logging</groupId>
+			<artifactId>commons-logging</artifactId>
+			<version>1.0.4</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-jcl</artifactId>
+			<version>2.5</version>
+			<classifier>sources</classifier>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>3.2.11.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>3.2.11.RELEASE</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-codec</groupId>
+			<artifactId>commons-codec</artifactId>
+			<version>1.3</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>3.2.12.RELEASE</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.mybatis</groupId>
+			<artifactId>mybatis</artifactId>
+			<version>3.2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.26</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.8</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.1</version>
+				<configuration>
+					<source>1.7</source>
+					<target>1.7</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
\ No newline at end of file
diff --git a/src/main/java/com/matrix/codeGeneration/convert/DefaultNameConvert.java b/src/main/java/com/matrix/codeGeneration/convert/DefaultNameConvert.java
new file mode 100644
index 0000000..2c28502
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/convert/DefaultNameConvert.java
@@ -0,0 +1,88 @@
+package com.matrix.codeGeneration.convert;
+
+/**
+ * 默认的名称实现的转换器
+ * 
+ * @author Administrator
+ *
+ */
+public class DefaultNameConvert implements NameConvert {
+
+	@Override
+	public String propertyToColumn(String property) {
+		StringBuffer columnName = new StringBuffer(property);
+		for (int i = 0; i < columnName.length(); i++) {
+			if (columnName.charAt(i) >= 'A' && columnName.charAt(i) <= 'Z') {
+				String upcase = "_" + (columnName.charAt(i) + "").toLowerCase();
+				columnName.replace(i, i + 1, upcase);
+			}
+		}
+		return columnName.toString();
+	}
+
+	/**
+	 * 
+	 */
+	@Override
+	public String columnToProperty(String column) {
+		// 如果数据库字段为大写则使用这里的方法
+		// StringBuffer property = new
+		// StringBuffer(tableNameToClassName(column.toLowerCase()));
+
+		StringBuffer property = new StringBuffer(tableNameToClassName(column));
+		String tempF = (property.charAt(0) + "").toLowerCase();
+		property.replace(0, 1, tempF);
+		return property.toString();
+	}
+
+	@Override
+	public String classNameToTableName(String calssName) {
+		return propertyToColumn(calssName).substring(1, propertyToColumn(calssName).length());
+	}
+
+	/**
+	 * 
+	 * 首字母改为大写 去除_ 下划线后一个字符变为大写字符
+	 */
+	@Override
+	public String tableNameToClassName(String tableName) {
+		StringBuffer calssName = new StringBuffer(tableName);
+		String tempF = (calssName.charAt(0) + "").toUpperCase();
+		calssName.replace(0, 1, tempF);
+		for (int i = 0; i < calssName.length(); i++) {
+			if (calssName.charAt(i) == '_' && i + 1 < tableName.length()) {
+				String upcase = (calssName.charAt(i + 1) + "").toUpperCase();
+				calssName.replace(i, i + 2, upcase);
+			}
+		}
+		return calssName.toString();
+	}
+
+	/**
+	 * 第一个字母大写
+	 */
+	@Override
+	public String propertyToMethod(String property) {
+		StringBuffer method = new StringBuffer(property);
+		String tempF = (method.charAt(0) + "").toUpperCase();
+		method.replace(0, 1, tempF);
+		return method.toString();
+	}
+
+	/**
+	 * 第一个字母小写
+	 */
+	@Override
+	public String classNameToVariableName(String className) {
+		StringBuffer variableName = new StringBuffer(className);
+		String tempF = (variableName.charAt(0) + "").toLowerCase();
+		variableName.replace(0, 1, tempF);
+		return variableName.toString();
+	}
+
+	public static void main(String[] args) {
+		DefaultNameConvert convert = new DefaultNameConvert();
+		System.out.println(convert.propertyToColumn("userName"));
+
+	}
+}
diff --git a/src/main/java/com/matrix/codeGeneration/convert/DefaultTypeHandle.java b/src/main/java/com/matrix/codeGeneration/convert/DefaultTypeHandle.java
new file mode 100644
index 0000000..808266c
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/convert/DefaultTypeHandle.java
@@ -0,0 +1,91 @@
+package com.matrix.codeGeneration.convert;
+
+import java.util.HashMap;
+
+import com.matrix.codeGeneration.model.TypeHandle;
+/**
+ * 默认的类型处理器
+ * @author Matrix-J
+ *
+ */
+public class DefaultTypeHandle implements TypeHandle {
+	
+	
+	public static HashMap<String, HashMap<String, String>> TypeMapping;
+	
+	
+	static {
+		
+		TypeMapping = new HashMap<String, HashMap<String, String>>();
+		
+		/**
+		 * mysql映射设置
+		 */
+		HashMap<String, String> mysqlMap = new HashMap<String, String>();
+		mysqlMap.put("double", "Double");
+		mysqlMap.put("int", "Integer");
+		mysqlMap.put("bigint", "Long");
+		mysqlMap.put("float", "Float");
+		mysqlMap.put("varchar", "String");
+		mysqlMap.put("tinyint", "Boolean");
+		mysqlMap.put("datetime", "Date");
+		mysqlMap.put("date", "Date");
+		mysqlMap.put("text", "String");
+		mysqlMap.put("char", "String");
+		mysqlMap.put("enum", "String");
+		mysqlMap.put("smallint", "Integer");
+		mysqlMap.put("mediumtext", "String");
+		mysqlMap.put("tinyint", "Integer");
+		mysqlMap.put("tinyint", "Integer");
+		mysqlMap.put("bit", "Integer");
+		mysqlMap.put("real", "Double");
+		mysqlMap.put("decimal", "BigDecimal");
+		mysqlMap.put("numeric", "BigDecimal");
+		mysqlMap.put("time", "Date");
+		mysqlMap.put("year", "Date");
+		mysqlMap.put("timestamp", "Date");
+		mysqlMap.put("tinyblob", "byte[]");
+		mysqlMap.put("blob", "byte[]");
+		mysqlMap.put("mediumblob", "byte[]");
+		mysqlMap.put("longblob", "byte[]");
+		mysqlMap.put("longtext", "String");
+		mysqlMap.put("tinytext", "String");
+		mysqlMap.put("mediumtext", "String");
+		mysqlMap.put("set", "String");
+		mysqlMap.put("binary", "byte[]");
+		mysqlMap.put("varbinary", "byte[]");
+		mysqlMap.put("point", "String");
+		mysqlMap.put("linestring", "String");
+		mysqlMap.put("polygon", "String");
+		mysqlMap.put("geometry", "String");
+		mysqlMap.put("multipoint", "String");
+		mysqlMap.put("multilinestring", "String");
+		mysqlMap.put("multipolygon", "String");
+		mysqlMap.put("geometrycollection", "String");
+		TypeMapping.put("mysql", mysqlMap);
+		
+		
+		
+		/**============================================================================================================================================
+		 * oracleMap映射设置
+		 * ===========================================================================================================================================
+		 */
+		HashMap<String, String> oracleMap = new HashMap<String, String>();
+		oracleMap.put("CHAR", "String");
+		oracleMap.put("VARCHAR2", "String");
+		oracleMap.put("LONG", "String");
+		oracleMap.put("NUMBER", "BigDecimal");
+		oracleMap.put("VARCHAR", "String");
+		oracleMap.put("DATE", "Date");
+		oracleMap.put("TIMESTAMP", "Date");
+		TypeMapping.put("oracle", oracleMap);
+		
+		
+		
+		
+	}
+	
+	
+	
+	
+}
diff --git a/src/main/java/com/matrix/codeGeneration/convert/NameConvert.java b/src/main/java/com/matrix/codeGeneration/convert/NameConvert.java
new file mode 100644
index 0000000..00a3bc0
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/convert/NameConvert.java
@@ -0,0 +1,57 @@
+package com.matrix.codeGeneration.convert;
+/**
+ * 名称转换接口
+ * @author Matrix-J
+ *
+ */
+public interface NameConvert {
+	/**
+	 * 属性转数据库字段格式转换接口
+	 * 
+	 * @param property
+	 * @return
+	 */
+	public String propertyToColumn(String property);
+
+	/**
+	 * 数据库字段转属性格式转换接口
+	 * 
+	 * @param column
+	 * @return
+	 */
+	public String columnToProperty(String column);
+	
+	
+	/**
+	 * 表名类名转换接口
+	 * 
+	 * @param column
+	 * @return
+	 */
+	public String tableNameToClassName(String tableName);
+	
+	
+	/**
+	 * 类名表名转换接口
+	 * 
+	 * @param column
+	 * @return
+	 */
+	public String classNameToTableName(String calssName);
+	/**
+	 * 属性名称转方法名称
+	 * @param property
+	 * @return
+	 */
+	public String propertyToMethod(String property);
+	
+	/**
+	 * 类名转类名的变量名
+	 * @param property
+	 * @return
+	 */
+	public String classNameToVariableName(String className);
+	
+	
+	
+}
diff --git a/src/main/java/com/matrix/codeGeneration/core/Generator.java b/src/main/java/com/matrix/codeGeneration/core/Generator.java
new file mode 100644
index 0000000..1a6a5ab
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/core/Generator.java
@@ -0,0 +1,105 @@
+package com.matrix.codeGeneration.core;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import com.matrix.codeGeneration.model.CodeFile;
+import com.matrix.codeGeneration.model.CodeModel;
+import com.matrix.codeGeneration.model.OutDataSource;
+
+import freemarker.template.Template;
+
+/**
+ * @author 姜友瑶
+ * @e-mail:<935090232@qq.com>
+ * @date 2015-10-23
+ * @description 代码生成器
+ */
+public class Generator {
+
+	public static void buildCodeFiles(OutDataSource outDataSource) {
+		// 构建模型文件
+		outDataSource.convertToTableModel();
+		// 根据模型生成代码模型文件
+		List<CodeFile> codeFileModel = generatorFile(outDataSource);
+		// 根据模型文件生成实体文件
+		createCodeFile(codeFileModel, outDataSource);
+	}
+
+	/**
+	 * 创建要生成的所有文件的模型
+	 * 
+	 * @param configuration
+	 * @return
+	 */
+	private static List<CodeFile> generatorFile(OutDataSource outDataSource) {
+		List<CodeFile> codeFiles = new ArrayList<CodeFile>();
+		Set<String> modelSet = outDataSource.getCodeModels().keySet();
+		// 由模型来生成对应的codeFile,因为模型最知道自己需要的数据是什么,codeFile不关心数据
+		for (String modelName : modelSet) {
+			CodeModel codeModel = outDataSource.getCodeModels().get(modelName);
+			List<CodeFile> thisModelFiles = codeModel.buildCodeFile(outDataSource);
+			codeFiles.addAll(thisModelFiles);
+		}
+		return codeFiles;
+	}
+
+	/**
+	 * 创建
+	 * 
+	 * @param configuration
+	 * @param dbModel
+	 * @return
+	 */
+	private static void createCodeFile(List<CodeFile> codeFiles, OutDataSource coutDataSource) {
+		try {
+			freemarker.template.Configuration cfg = new freemarker.template.Configuration();
+			cfg.setLocale(Locale.SIMPLIFIED_CHINESE);
+			cfg.setDefaultEncoding("utf-8");
+			cfg.setEncoding(Locale.SIMPLIFIED_CHINESE, "utf-8");
+			cfg.setEncoding(Locale.SIMPLIFIED_CHINESE, "utf-8");
+			for (CodeFile codeFile : codeFiles) {
+				Map<String, Object> root = new HashMap<String, Object>();
+				// 设置文件需要的数据
+				root.putAll(codeFile.getData());
+				// 生成代码文件
+				System.out.println("生成" + codeFile.getFileName() + "文件...");
+				cfg.setDirectoryForTemplateLoading(new File(coutDataSource.getUserTempLataHome()));
+				// 获取模板(template)
+				Template template = cfg.getTemplate(codeFile.getTemplateName(), "utf-8");
+				// 把文件写入磁盘
+				String filePath = coutDataSource.getTargetPath() + codeFile.getSavePath();
+				File file = new File(filePath);
+				if (file.getParentFile().exists() && file.exists()) {
+					File javaBean = new File(filePath + codeFile.getFileName());
+					javaBean.createNewFile();
+					BufferedWriter bf = new BufferedWriter(new FileWriter(javaBean));
+					template.process(root, bf);
+					bf.flush();
+					bf.close();
+				} else {
+					if (file.mkdirs()) {
+						File javaBean = new File(filePath + codeFile.getFileName());
+						javaBean.createNewFile();
+						BufferedWriter bf = new BufferedWriter(new FileWriter(javaBean));
+						template.process(root, bf);
+						bf.flush();
+						bf.close();
+					} else {
+						System.out.println("创建文件失败" + filePath);
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/matrix/codeGeneration/core/MainClass.java b/src/main/java/com/matrix/codeGeneration/core/MainClass.java
new file mode 100644
index 0000000..f92d930
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/core/MainClass.java
@@ -0,0 +1,26 @@
+package com.matrix.codeGeneration.core;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.matrix.codeGeneration.model.OutDataSource;
+
+/**
+ * @author 姜友瑶
+ * @e-mail:<935090232@qq.com>
+ * @date 2015-10-23
+ * @description 代码生成器
+ */
+public class MainClass {
+
+	public static void main(String[] args) {
+
+		ApplicationContext context = new ClassPathXmlApplicationContext("config/code-generation.xml");
+		// 根据需要注入自己的数据源
+		OutDataSource outDataSource = (OutDataSource) context.getBean("outDataSource");
+		// 生成代码文件
+		Generator.buildCodeFiles(outDataSource);
+
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/matrix/codeGeneration/ext/AhcsModels.java b/src/main/java/com/matrix/codeGeneration/ext/AhcsModels.java
new file mode 100644
index 0000000..4855efd
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/ext/AhcsModels.java
@@ -0,0 +1,276 @@
+package com.matrix.codeGeneration.ext;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.poi.ss.usermodel.DataFormatter;
+
+import com.matrix.codeGeneration.model.CodeFile;
+import com.matrix.codeGeneration.model.CodeModel;
+import com.matrix.codeGeneration.model.CommonData;
+import com.matrix.codeGeneration.model.Constant;
+import com.matrix.codeGeneration.model.OutDataSource;
+import com.matrix.codeGeneration.model.TableClassModel;
+import com.matrix.codeGeneration.plugin.DateUtils;
+
+/**
+ * 平安意健险代码文件模型
+ */
+public class AhcsModels implements CodeModel {
+
+	/**
+	 * 模型名称用来标识这个模型
+	 */
+	String modelName="";
+
+	/**
+	 * 包名
+	 */
+	private String packageName="";
+
+	/**
+	 * 名称后缀
+	 */
+	private String suffixName="";
+
+	/**
+	 * 名称前缀
+	 */
+	private String prefixName="";
+
+	/**
+	 * 文件扩展名称
+	 */
+	private String fileExtName="";
+
+	/**
+	 * 模板名称
+	 */
+	private String templateName="";
+
+	/**
+	 * 导入类列表
+	 */
+	private Map<String, String> importList = new HashMap<>();
+
+	/**
+	 * 类的变量名称
+	 */
+	private String classVariableName="";
+
+	   
+
+	@Override
+	public List<CodeFile> buildCodeFile(OutDataSource dataSource) {
+		List<CodeFile> codeFileList = new ArrayList<>();
+		for (TableClassModel tableClassModel : dataSource.getTableClassModels()) {
+			Map<String, Object> fileData = new HashMap<>();
+			System.out.println(tableClassModel.getClassName());
+			System.out.println(this.modelName);
+			System.out.println("--------------");
+
+			if (Constant.JAVA_BEAN.equals(this.modelName)) {
+
+				this.getImportList().put("Extend", "com.zkingsoft.anotations.Extend");
+
+			} else if (Constant.MYBATIS_DAO.equals(this.modelName)) {
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("Param", "org.apache.ibatis.annotations.Param");
+				this.getImportList().put("PaginationVO", "com.zkingsoft.pojo.PaginationVO");
+				this.getImportList().put("Map", "java.util.Map");
+
+			} else if (Constant.MYBATIS_DAO_IMPL.equals(this.modelName)) {
+
+			} else if (Constant.SERVICE.equals(this.modelName)) {
+
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("BaseServices", "com.zkingsoft.constraint.BaseServices");
+				this.getImportList().put("PaginationVO", "com.zkingsoft.pojo.PaginationVO");
+
+			} else if (Constant.SERVICE_IMPL.equals(this.modelName)) {
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+
+				this.getImportList().put("services",
+						getModelQualifiedClassName(Constant.SERVICE, tableClassModel, dataSource));
+				this.getImportList().put("dao",
+						getModelQualifiedClassName(Constant.MYBATIS_DAO, tableClassModel, dataSource));
+				this.getImportList().put("springframework.Service", "org.springframework.stereotype.Service");
+				this.getImportList().put("Autowired", "org.springframework.beans.factory.annotation.Autowired");
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("Map", "java.util.Map");
+
+			} else if (Constant.ACTION.equals(this.modelName)) {
+
+				this.getImportList().put("Controller", "org.springframework.stereotype.Controller");
+				this.getImportList().put("Resource", "javax.annotation.Resource");
+				this.getImportList().put("AjaxResult", "com.zkingsoft.pojo.AjaxResult");
+				this.getImportList().put("PaginationVO", "com.zkingsoft.pojo.PaginationVO");
+				this.getImportList().put("WebUtil", "com.zkingsoft.util.WebUtil");
+				this.getImportList().put("SaveRequestToken", "com.zkingsoft.anotations.SaveRequestToken");
+				this.getImportList().put("RemoveRequestToken", "com.zkingsoft.anotations.RemoveRequestToken");
+				this.getImportList().put("BaseController", "com.zkingsoft.constraint.BaseController");
+				this.getImportList().put("RequestMapping", "org.springframework.web.bind.annotation.RequestMapping");
+				this.getImportList().put("ResponseBody", "org.springframework.web.bind.annotation.ResponseBody");
+			}
+			fileData.put("importList", this.getImportList());
+			CodeFile codeFile = new CodeFile();
+			// 计算文件的名称
+			codeFile.setFileName(getFileName(tableClassModel, this));
+			codeFile.setSavePath(File.separator + getPackageName().replace(".", File.separator) + File.separator);
+			fileData.put("codeModel", this);
+			fileData.put("dataSource", dataSource);
+			fileData.put("tableClassModel", tableClassModel);
+			fileData.put("commonData", new CommonData());
+			fileData.put("time", DateUtils.dateFormatStr(new Date(), "yyyy-MM-dd HH:mm"));
+
+			fileData.put("ClassName", getModelClassName(this.getModelName(), tableClassModel, dataSource));
+			codeFile.setData(fileData);
+			codeFile.setTemplateName(this.templateName);
+			codeFileList.add(codeFile);
+		}
+		return codeFileList;
+
+	}
+
+	/**
+	 * 计算文件名称
+	 * 
+	 * @param tableClassModel
+	 * @return
+	 */
+	public String getFileName(TableClassModel tableClassModel, AhcsModels ahcsModels) {
+		StringBuffer name = new StringBuffer();
+		String prefix = ahcsModels.getPrefixName();
+		String suffix = ahcsModels.getSuffixName();
+		String extensionName = ahcsModels.getFileExtName();
+		if (prefix != null) {
+			name.append(prefix);
+		}
+		name.append(tableClassModel.getClassName());
+		if (suffix != null) {
+			name.append(suffix);
+		}
+		name.append(extensionName);
+		return name.toString();
+	}
+
+	/**
+	 * 获取一个模型的变量名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelVariablesName(String modelName, TableClassModel tableClassModel, OutDataSource dataSource) {
+		return dataSource.getNameConvert()
+				.classNameToTableName(getModelClassName(modelName, tableClassModel, dataSource));
+	}
+
+	/**
+	 * 获取一个模型的全类名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelQualifiedClassName(String modelName, TableClassModel tableClassModel,
+			OutDataSource dataSource) {
+		AhcsModels ahcsMOdels = ((AhcsModels) dataSource.getCodeModels().get(modelName));
+		String className = ahcsMOdels.getPackageName() + "." + ahcsMOdels.getPrefixName()
+				+ tableClassModel.getClassName() + ahcsMOdels.getSuffixName();
+		return className;
+	}
+
+	/**
+	 * 获取一个模型的类名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelClassName(String modelName, TableClassModel tableClassModel, OutDataSource dataSource) {
+		AhcsModels ahcsMOdels = ((AhcsModels) dataSource.getCodeModels().get(modelName));
+		String className = ahcsMOdels.getPrefixName() + tableClassModel.getClassName() + ahcsMOdels.getSuffixName();
+		return className;
+	}
+
+	public String getModelName() {
+		return modelName;
+	}
+
+	public void setModelName(String modelName) {
+		this.modelName = modelName;
+	}
+
+	public String getPackageName() {
+		return packageName;
+	}
+
+	public void setPackageName(String packageName) {
+		this.packageName = packageName;
+	}
+
+	public String getSuffixName() {
+		return suffixName;
+	}
+
+	public void setSuffixName(String suffixName) {
+		this.suffixName = suffixName;
+	}
+
+	public String getPrefixName() {
+		return prefixName;
+	}
+
+	public void setPrefixName(String prefixName) {
+		this.prefixName = prefixName;
+	}
+
+	public String getFileExtName() {
+		return fileExtName;
+	}
+
+	public void setFileExtName(String fileExtName) {
+		this.fileExtName = fileExtName;
+	}
+
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+	public Map<String, String> getImportList() {
+		return importList;
+	}
+
+	public void setImportList(Map<String, String> importList) {
+		this.importList = importList;
+	}
+
+	public String getClassVariableName() {
+		return classVariableName;
+	}
+
+	public void setClassVariableName(String classVariableName) {
+		this.classVariableName = classVariableName;
+	}
+ 
+ 
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/ext/ExcelDataSource.java b/src/main/java/com/matrix/codeGeneration/ext/ExcelDataSource.java
new file mode 100644
index 0000000..136a47b
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/ext/ExcelDataSource.java
@@ -0,0 +1,207 @@
+package com.matrix.codeGeneration.ext;
+
+import com.matrix.codeGeneration.convert.DefaultTypeHandle;
+import com.matrix.codeGeneration.model.OutDataSource;
+import com.matrix.codeGeneration.model.PropertyColumn;
+import com.matrix.codeGeneration.model.TableClassModel;
+import com.matrix.codeGeneration.plugin.ExcelImport;
+import org.apache.commons.lang.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * excel数据源
+ * 
+ * @author jiangyouyao
+ *
+ */
+public class ExcelDataSource extends OutDataSource {
+	// excel文件地址
+	private String sourcePath;
+	private String author;
+
+	private String dbType;
+
+	public ExcelDataSource() {
+	}
+
+	@Override
+	public List<TableClassModel> convertToTableModel() {
+
+		Map<String, List<List<Object>>> analysisExcel = new HashMap<>();
+		// 源文件路径
+		File sourceDir = new File(sourcePath);
+		if (!sourceDir.isDirectory()) {
+			new Exception("目标目录不存在");
+		}
+		File[] files = sourceDir.listFiles();
+		if (files != null) {
+			for (File file : files) {
+				if (file.canRead()) {// 是否为一个可读文件
+					String fileName = file.getName();
+					// 检查扩展名称
+					String extension = fileName.lastIndexOf(".") == -1 ? ""
+							: fileName.substring(fileName.lastIndexOf(".") + 1);
+					if (extension.equals("xls") || extension.equals("xlsx")) {
+						System.out.println(fileName);
+						// 读取excel文件的内容
+						try {
+							analysisExcel.putAll(ExcelImport.read2007ExcelAllShell(file, null, 6));
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+					}
+				} else {
+					new RuntimeException(file.getName() + "文件不可读");
+				}
+			}
+		}
+		List<TableClassModel> models = analysisExcel(analysisExcel);
+		this.setTableClassModels(models);
+		return this.getTableClassModels();
+	}
+
+	/**
+	 * 解析excel文件中数据表信息
+	 * 
+	 * @param analysisExcel
+	 * @return
+	 */
+	private List<TableClassModel> analysisExcel(Map<String, List<List<Object>>> analysisExcel) {
+		List<TableClassModel> models = new ArrayList<>();
+		Set<String> keys = analysisExcel.keySet();
+		// 除了第一行,其他每一行代表一个字段,一个key是一个表
+		for (String tableName : keys) {
+			TableClassModel model = new TableClassModel();
+			List<List<Object>> data = analysisExcel.get(tableName);
+			// 设置数据表基本信息
+			// 构建表名
+
+			int nameIndex = tableName.indexOf("(");
+			model.setTableMemo(tableName.substring(nameIndex+1, tableName.length()-1));
+			model.setTableName(tableName.substring(0, nameIndex));
+			// 设置类名和变量名称
+			model.setClassName(getNameConvert().tableNameToClassName(model.getTableName()));
+			model.setClassVariableName(getNameConvert().classNameToVariableName(model.getClassName()));
+             
+			// 该表需要展示到页面的字段个数
+			int showCount=0;
+			// 遍历设置字段信息
+			for (int i = 1; i < data.size(); i++) {
+				List<Object> row = data.get(i);
+				PropertyColumn p = new PropertyColumn();
+				// 列名
+				String columnName = (String) row.get(0);
+				p.setColumn(columnName);
+				// 属性名称
+				p.setProperty(getNameConvert().columnToProperty(columnName));
+
+				// 字段类型、长度
+				String type = (String) row.get(2);
+				p.setFullJdbcType(type);
+
+				// jdbc类型设置
+				int index = type.indexOf("(") > 0 ? type.indexOf("(") : type.length();
+
+				p.setJdbcType(type.substring(0, index).trim().replaceAll("2", ""));
+				System.out.println("jdbctype=" + p.getJdbcType());
+				// 基本类型
+				p.setClassType(DefaultTypeHandle.TypeMapping.get(dbType).get(p.getJdbcType()));
+
+				String isAllowNull = (String) row.get(3);
+
+				if (isAllowNull != null && isAllowNull.equals("N")) {
+					isAllowNull = " NOT NULL ";
+				} else {
+					isAllowNull = "";
+				}
+
+				p.setIsAllowNull(isAllowNull);
+
+				// 备注中 [表示界面显示字段] [表示必填字段*]
+				String memo = (String) row.get(1);
+				int begin = memo.indexOf("[");
+				int end = memo.indexOf("]");
+
+				if (begin > -1 && end - begin > 1) {
+					showCount++;
+					// 显示到页面上的字段
+					String subString1 = memo.substring(begin, end);
+					boolean isNecessary = subString1.indexOf("*") > 0;
+					if (isNecessary) {
+						p.setShowName(memo.substring(begin + 1, end - 1));
+					} else {
+						p.setShowName(memo.substring(begin + 1, end));
+					}
+					p.setIsNecessary(isNecessary);
+					p.setIsVisible(true);
+					// 截取[符号前面的字段作为数据库的备注
+					p.setMemo(memo.substring(0, begin));
+				} else {
+					p.setIsNecessary(false);
+					p.setIsVisible(false);
+					p.setMemo(memo);
+				}
+				// get,set方法名称
+				p.setMethodName(getNameConvert().propertyToMethod(p.getProperty()));
+
+				// 设置主键
+				if (p.getMemo() != null && p.getMemo().equals("主键")) {
+					p.setIsPrimaryKey(true);
+					model.setPrimaryKey(p);
+				} else {
+					p.setIsPrimaryKey(false);
+				}
+
+				// 索引
+				String indexName = (String) row.get(5);
+				if(null == indexName || "".equals(indexName)){
+					indexName = null;
+				}
+				p.setIndexName(indexName);
+
+				// 设置jsp编辑页面字段长度限制
+				String columnLengthStr = row.get(6) == null ? null : (String) row.get(6);
+				if (columnLengthStr!=null && columnLengthStr.trim().length()>0) {
+					// 从excel中读取的数字默认是double类型的,所以做如下处理去掉小数点
+					Double columnLength = Double.parseDouble(columnLengthStr);
+                    p.setColumnLength(columnLength.intValue()+"");
+				}
+
+				model.getMapping().add(p);
+			}
+			// 需要加上该表有多少个显示到list列表的字段个数
+			model.setShowCount(showCount);
+			models.add(model);
+		}
+		System.out.println(analysisExcel);
+		return models;
+	}
+
+	public String getSourcePath() {
+		return sourcePath;
+	}
+
+	public void setDbType(String dbType) {
+		this.dbType = dbType;
+	}
+
+	public void setSourcePath(String sourcePath) {
+		this.sourcePath = sourcePath;
+	}
+
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+
+	public String getAuthor() {
+		return author;
+	}
+
+	public String getDbType() {
+		return dbType;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/ext/Matrix4Models.java b/src/main/java/com/matrix/codeGeneration/ext/Matrix4Models.java
new file mode 100644
index 0000000..b23f98f
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/ext/Matrix4Models.java
@@ -0,0 +1,318 @@
+package com.matrix.codeGeneration.ext;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.BeanUtils;
+
+import com.matrix.codeGeneration.model.CodeFile;
+import com.matrix.codeGeneration.model.CodeModel;
+import com.matrix.codeGeneration.model.CommonData;
+import com.matrix.codeGeneration.model.Constant;
+import com.matrix.codeGeneration.model.OutDataSource;
+import com.matrix.codeGeneration.model.TableClassModel;
+import com.matrix.codeGeneration.plugin.DateUtils;
+
+/**
+ * matrix4代码文件模型
+ */
+public class Matrix4Models implements CodeModel {
+
+	/**
+	 * 模型名称用来标识这个模型
+	 */
+	String modelName="";
+
+	/**
+	 * 包名
+	 */
+	private String packageName="";
+
+	/**
+	 * 名称后缀
+	 */
+	private String suffixName="";
+
+	/**
+	 * 名称前缀
+	 */
+	private String prefixName="";
+
+	/**
+	 * 文件扩展名称
+	 */
+	private String fileExtName="";
+
+	/**
+	 * 模板名称
+	 */
+	private String templateName="";
+
+	/**
+	 * 导入类列表
+	 */
+	private Map<String, String> importList = new HashMap<>();
+
+	/**
+	 * 类的变量名称
+	 */
+	private String classVariableName="";
+
+	   
+
+	@Override
+	public List<CodeFile> buildCodeFile(OutDataSource dataSource) {
+		List<CodeFile> codeFileList = new ArrayList<>();
+		for (TableClassModel tableClassModel : dataSource.getTableClassModels()) {
+			Map<String, Object> fileData = new HashMap<>();
+			tableClassModel.setBeanClassName(getModelClassName(Constant.JAVA_BEAN,tableClassModel,dataSource));
+			tableClassModel.setFullClassName(getModelClassName(modelName,tableClassModel,dataSource));
+			tableClassModel.setQualifiedClassName(getModelQualifiedClassName(modelName,tableClassModel,dataSource));
+			System.out.println(tableClassModel.getClassName());
+			System.out.println(this.modelName);
+			System.out.println("--------------");
+
+			if (Constant.JAVA_BEAN.equals(this.modelName)) {
+
+				this.getImportList().put("Extend", "com.matrix.core.anotations.Extend");
+				this.getImportList().put("EntityDTO", "com.matrix.core.pojo.EntityDTO");
+				this.getImportList().put("EntityDTOExt", "com.matrix.core.publicBean.EntityDTOExt");
+
+			} else if (Constant.MYBATIS_DAO.equals(this.modelName)) {
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("Param", "org.apache.ibatis.annotations.Param");
+				this.getImportList().put("PaginationVO", "com.matrix.core.pojo.PaginationVO");
+				this.getImportList().put("Map", "java.util.Map");
+
+			} else if (Constant.MYBATIS_DAO_IMPL.equals(this.modelName)) {
+
+			} else if (Constant.SERVICE.equals(this.modelName)) {
+
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("BaseServices", "com.matrix.core.web.BaseServices");
+				this.getImportList().put("PaginationVO", "com.matrix.core.pojo.PaginationVO");
+
+			} else if (Constant.SERVICE_IMPL.equals(this.modelName)) {
+				this.setImportList(new HashMap<String, String>());
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+
+				this.getImportList().put("services",
+						getModelQualifiedClassName(Constant.SERVICE, tableClassModel, dataSource));
+				this.getImportList().put("dao",
+						getModelQualifiedClassName(Constant.MYBATIS_DAO, tableClassModel, dataSource));
+				this.getImportList().put("springframework.Service", "org.springframework.stereotype.Service");
+				this.getImportList().put("Autowired", "org.springframework.beans.factory.annotation.Autowired");
+				this.getImportList().put("List", "java.util.List");
+				this.getImportList().put("Map", "java.util.Map");
+				this.getImportList().put("MatrixConstance", "com.matrix.core.constance.MatrixConstance");
+				this.getImportList().put("WebUtil", "com.matrix.core.tools.WebUtil");
+				this.getImportList().put("GlobleException", "com.matrix.core.exception.GlobleException");
+				this.getImportList().put("ModelUtils", "com.matrix.core.tools.ModelUtils");
+				this.getImportList().put("SystemErrorCode", "com.matrix.core.constance.SystemErrorCode");
+				this.getImportList().put("UUIDUtil", "com.matrix.core.tools.UUIDUtil");
+				this.getImportList().put("PaginationVO", "com.matrix.core.pojo.PaginationVO");
+				this.getImportList().put("SysUsers", "com.xincheng.common.bean.SysUsers");
+				
+				
+				fileData.put("daoClassName", getModelClassName(Constant.MYBATIS_DAO, tableClassModel, dataSource));
+				fileData.put("daoVariableName", getModelVariablesName(Constant.MYBATIS_DAO, tableClassModel, dataSource));
+				fileData.put("serviceInterface", getModelClassName(Constant.SERVICE, tableClassModel, dataSource));
+				
+				
+			} else if (Constant.ACTION.equals(this.modelName)) {
+				this.getImportList().put("bean",
+						getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+				//this.getImportList().put("services",
+				//		getModelQualifiedClassName(Constant.SERVICE, tableClassModel, dataSource));
+				this.getImportList().put("Controller", "org.springframework.stereotype.Controller");
+				this.getImportList().put("Autowired", "org.springframework.beans.factory.annotation.Autowired");
+				this.getImportList().put("AjaxResult", "com.matrix.core.pojo.AjaxResult");
+				this.getImportList().put("GlobleException", "com.matrix.core.exception.GlobleException");
+				this.getImportList().put("PaginationVO", "com.matrix.core.pojo.PaginationVO");
+				this.getImportList().put("WebUtil", "com.matrix.core.tools.WebUtil");
+				this.getImportList().put("SaveRequestToken", "com.matrix.core.anotations.SaveRequestToken");
+				this.getImportList().put("RemoveRequestToken", "com.matrix.core.anotations.RemoveRequestToken");
+				this.getImportList().put("BaseController", "com.matrix.core.web.BaseAction");
+				this.getImportList().put("RequestMapping", "org.springframework.web.bind.annotation.RequestMapping");
+				this.getImportList().put("ResponseBody", "org.springframework.web.bind.annotation.ResponseBody");
+				this.getImportList().put("AppConstance", "static com.xincheng.common.constance.AppConstance.*");
+				this.getImportList().put("SystemMessageCode", "com.matrix.core.constance.SystemMessageCode");
+				this.getImportList().put("SystemErrorCode", "com.matrix.core.constance.SystemErrorCode");
+				this.getImportList().put("Map", "java.util.Map");
+				this.getImportList().put("RedisUserLoginUtils", "com.matrix.core.redis.RedisUserLoginUtils");
+				this.getImportList().put("SysUsers", "com.xincheng.commonApi.bean.SysUsers");
+			}
+			fileData.put("importList", this.getImportList());
+			CodeFile codeFile = new CodeFile();
+			// 计算文件的名称
+			codeFile.setFileName(getFileName(tableClassModel, this));
+			codeFile.setSavePath(File.separator + getPackageName().replace(".", File.separator) + File.separator);
+			fileData.put("codeModel", this);
+			fileData.put("beanQualifiedClassName", getModelQualifiedClassName(Constant.JAVA_BEAN, tableClassModel, dataSource));
+			fileData.put("dataSource", dataSource);
+			TableClassModel thisTableClassModel= new TableClassModel();
+			BeanUtils.copyProperties(tableClassModel, thisTableClassModel);
+			fileData.put("tableClassModel", thisTableClassModel);
+			fileData.put("commonData", new CommonData());
+			fileData.put("time", DateUtils.dateFormatStr(new Date(), "yyyy-MM-dd HH:mm"));
+			fileData.put("ClassName", getModelClassName(this.getModelName(), tableClassModel, dataSource));
+			codeFile.setData(fileData);
+			codeFile.setTemplateName(this.templateName);
+			codeFileList.add(codeFile);
+		}
+		return codeFileList;
+
+	}
+
+	/**
+	 * 计算文件名称
+	 * 
+	 * @param tableClassModel
+	 * @return
+	 */
+	public String getFileName(TableClassModel tableClassModel, Matrix4Models ahcsModels) {
+		StringBuffer name = new StringBuffer();
+		String prefix = ahcsModels.getPrefixName();
+		String suffix = ahcsModels.getSuffixName();
+		
+		
+		String extensionName = ahcsModels.getFileExtName();
+		if (prefix != null) {
+			name.append(prefix);
+		}
+		// 这里判断如果是html 则应该将文件名首字母小写
+		if(".html".equals(extensionName)) {
+			String className = tableClassModel.getClassName();
+			String initial = className.substring(0, 1).toLowerCase();
+			name.append(initial+className.substring(1));
+		}else {
+			name.append(tableClassModel.getClassName());
+		}
+		if (suffix != null) {
+			name.append(suffix);
+		}
+		name.append(extensionName);
+		return name.toString();
+	}
+
+	/**
+	 * 获取一个模型的变量名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelVariablesName(String modelName, TableClassModel tableClassModel, OutDataSource dataSource) {
+		return dataSource.getNameConvert()
+				.classNameToVariableName(getModelClassName(modelName, tableClassModel, dataSource));
+	}
+
+	/**
+	 * 获取一个模型的全类名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelQualifiedClassName(String modelName, TableClassModel tableClassModel,
+			OutDataSource dataSource) {
+		Matrix4Models ahcsMOdels = ((Matrix4Models) dataSource.getCodeModels().get(modelName));
+		String className = ahcsMOdels.getPackageName() + "." + ahcsMOdels.getPrefixName()
+				+ tableClassModel.getClassName() + ahcsMOdels.getSuffixName();
+		return className;
+	}
+
+	/**
+	 * 获取一个模型的类名
+	 * 
+	 * @param modelName
+	 * @param dataSource
+	 * @return
+	 */
+	public String getModelClassName(String modelName, TableClassModel tableClassModel, OutDataSource dataSource) {
+		Matrix4Models ahcsMOdels = ((Matrix4Models) dataSource.getCodeModels().get(modelName));
+		String className = ahcsMOdels.getPrefixName() + tableClassModel.getClassName() + ahcsMOdels.getSuffixName();
+		return className;
+	}
+	
+	
+
+	public String getModelName() {
+		return modelName;
+	}
+
+	public void setModelName(String modelName) {
+		this.modelName = modelName;
+	}
+
+	public String getPackageName() {
+		return packageName;
+	}
+
+	public void setPackageName(String packageName) {
+		this.packageName = packageName;
+	}
+
+	public String getSuffixName() {
+		return suffixName;
+	}
+
+	public void setSuffixName(String suffixName) {
+		this.suffixName = suffixName;
+	}
+
+	public String getPrefixName() {
+		return prefixName;
+	}
+
+	public void setPrefixName(String prefixName) {
+		this.prefixName = prefixName;
+	}
+
+	public String getFileExtName() {
+		return fileExtName;
+	}
+
+	public void setFileExtName(String fileExtName) {
+		this.fileExtName = fileExtName;
+	}
+
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+	public Map<String, String> getImportList() {
+		return importList;
+	}
+
+	public void setImportList(Map<String, String> importList) {
+		this.importList = importList;
+	}
+
+	public String getClassVariableName() {
+		return classVariableName;
+	}
+
+	public void setClassVariableName(String classVariableName) {
+		this.classVariableName = classVariableName;
+	}
+ 
+ 
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/ext/OracleStyleNameConvert.java b/src/main/java/com/matrix/codeGeneration/ext/OracleStyleNameConvert.java
new file mode 100644
index 0000000..3889eff
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/ext/OracleStyleNameConvert.java
@@ -0,0 +1,86 @@
+package com.matrix.codeGeneration.ext;
+
+import com.matrix.codeGeneration.convert.NameConvert;
+
+/**
+ * oracle风格的名称实现的转换器
+ * 
+ * @author Administrator
+ *
+ */
+public class OracleStyleNameConvert implements NameConvert {
+
+	@Override
+	public String propertyToColumn(String property) {
+		StringBuffer columnName = new StringBuffer(property);
+		for (int i = 0; i < columnName.length(); i++) {
+			if (columnName.charAt(i) >= 'A' && columnName.charAt(i) <= 'Z') {
+				String upcase = "_" + (columnName.charAt(i) + "").toLowerCase();
+				columnName.replace(i, i + 1, upcase);
+			}
+		}
+		return columnName.toString();
+	}
+
+	/**
+	 * 
+	 */
+	@Override
+	public String columnToProperty(String column) {
+		// 如果数据库字段为大写则使用这里的方法
+		StringBuffer property = new  StringBuffer(tableNameToClassName(column.toLowerCase()));
+		String tempF = (property.charAt(0) + "").toLowerCase();
+		property.replace(0, 1, tempF);
+		return property.toString();
+	}
+
+	@Override
+	public String classNameToTableName(String calssName) {
+		return propertyToColumn(calssName).substring(1, propertyToColumn(calssName).length());
+	}
+
+	/**
+	 * 
+	 * 首字母改为大写 去除_ 下划线后一个字符变为大写字符
+	 */
+	@Override
+	public String tableNameToClassName(String tableName) {
+		StringBuffer calssName = new StringBuffer(tableName.toLowerCase());
+		String tempF = (calssName.charAt(0) + "").toUpperCase();
+		calssName.replace(0, 1, tempF);
+		for (int i = 0; i < calssName.length(); i++) {
+			if (calssName.charAt(i) == '_' && i + 1 < tableName.length()) {
+				String upcase = (calssName.charAt(i + 1) + "").toUpperCase();
+				calssName.replace(i, i + 2, upcase);
+			}
+		}
+		return calssName.toString();
+	}
+
+	/**
+	 * 第一个字母大写
+	 */
+	@Override
+	public String propertyToMethod(String property) {
+		StringBuffer method = new StringBuffer(property);
+		String tempF = (method.charAt(0) + "").toUpperCase();
+		method.replace(0, 1, tempF);
+		return method.toString();
+	}
+
+	/**
+	 * 第一个字母小写
+	 */
+	@Override
+	public String classNameToVariableName(String className) {
+		StringBuffer variableName = new StringBuffer(className);
+		String tempF = (variableName.charAt(0) + "").toLowerCase();
+		variableName.replace(0, 1, tempF);
+		return variableName.toString();
+	}
+
+	public static void main(String[] args) {
+		OracleStyleNameConvert convert = new OracleStyleNameConvert();
+		System.out.println(convert.columnToProperty("user_id"));
+	}
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/Attribute.java b/src/main/java/com/matrix/codeGeneration/model/Attribute.java
new file mode 100644
index 0000000..fa0d5c4
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/Attribute.java
@@ -0,0 +1,43 @@
+package com.matrix.codeGeneration.model;
+
+/**
+ * 类属性
+ * 
+ * @author Matrix-J
+ */
+public class Attribute {
+
+	/**
+	 * 注解
+	 */
+	private String annotate;
+
+	private String className;
+
+	private String variableName;
+
+	public String getAnnotate() {
+		return annotate;
+	}
+
+	public void setAnnotate(String annotate) {
+		this.annotate = annotate;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public String getVariableName() {
+		return variableName;
+	}
+
+	public void setVariableName(String variableName) {
+		this.variableName = variableName;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/CodeFile.java b/src/main/java/com/matrix/codeGeneration/model/CodeFile.java
new file mode 100644
index 0000000..013b1ed
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/CodeFile.java
@@ -0,0 +1,65 @@
+package com.matrix.codeGeneration.model;
+
+import java.util.Map;
+
+ 
+/**每一个codeFile 代表一个要生成的文件
+ * 
+ * @author jiangyouyao
+ *
+ */
+public class CodeFile {
+
+	/**
+	 * 模板文件名称
+	 */
+	private String fileName;
+	/**
+	 * 模板文件保存地址
+	 */
+	private String savePath;
+	
+	/**
+	 * 模型文件地址
+	 */
+	private String templateName;
+	
+	
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+	/**
+	 * 模板文件需要的数据
+	 */
+	private Map<String, Object> data;
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public String getSavePath() {
+		return savePath;
+	}
+
+	public void setSavePath(String savePath) {
+		this.savePath = savePath;
+	}
+
+	public Map<String, Object> getData() {
+		return data;
+	}
+
+	public void setData(Map<String, Object> data) {
+		this.data = data;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/CodeModel.java b/src/main/java/com/matrix/codeGeneration/model/CodeModel.java
new file mode 100644
index 0000000..89d052a
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/CodeModel.java
@@ -0,0 +1,13 @@
+package com.matrix.codeGeneration.model;
+
+import java.util.List;
+
+/**
+ * 代码文件模型
+ * 
+ * @author Matrix-J
+ *
+ */
+public interface CodeModel {
+	public List<CodeFile> buildCodeFile(OutDataSource dataSource);
+ }
diff --git a/src/main/java/com/matrix/codeGeneration/model/CommonData.java b/src/main/java/com/matrix/codeGeneration/model/CommonData.java
new file mode 100644
index 0000000..d7b1ed1
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/CommonData.java
@@ -0,0 +1,19 @@
+package com.matrix.codeGeneration.model;
+
+import java.util.Date;
+
+import com.matrix.codeGeneration.plugin.DateUtils;
+
+public class CommonData {
+	@SuppressWarnings("unused")
+	private String now;
+
+	public String getNow() {
+		return DateUtils.dateFormatStr(new Date(), "yyyy-MM-dd HH:mm");
+	}
+
+	public void setNow(String now) {
+		this.now = now;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/Constant.java b/src/main/java/com/matrix/codeGeneration/model/Constant.java
new file mode 100644
index 0000000..142d40b
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/Constant.java
@@ -0,0 +1,68 @@
+package com.matrix.codeGeneration.model;
+
+/**
+ * 文件类型
+ * 
+ * @author Matrix-J
+ *
+ */
+public class Constant {
+	
+	/**
+	 * javabean类型模型
+	 */
+	public static String MYSQL_SQL = "MYSQL_SQL";
+	
+	
+	/**
+	 * javabean类型模型
+	 */
+	public static String JAVA_BEAN = "JAVA_BEAN";
+
+	/**
+	 * mybatis dao模型文件
+	 */
+	public static String MYBATIS_DAO_IMPL = "MYBATIS_DAO_IMPL";
+
+	/**
+	 * mybatis dao模型文件
+	 */
+	public static String MYBATIS_DAO = "MYBATIS_DAO";
+
+	/**
+	 * SERVICE接口 模型文件
+	 */
+	public static String SERVICE = "SERVICE";
+
+	/**
+	 * SERVICE 实现类模型文件
+	 */
+	public static String SERVICE_IMPL = "SERVICE_IMPL";
+
+	/**
+	 * ACTION 类模型文件
+	 */
+	public static String ACTION = "ACTION";
+
+	/**
+	 * LIST VIEW 视图模型文件
+	 */
+	public static String LIST = "LIST";
+	/**
+	 * FORM VIEW 视图模型文件
+	 */
+	public static String FORM = "FORM";
+
+	/**
+	 * MABATIS 的配置文件
+	 */
+	public static String MABATIS_CONFIG = "MABATIS_CONFIG";
+	/**
+	 * MYSQL数据库类型
+	 */
+	public static String DB_MYSQL = "DB_MYSQL";
+	/**
+	 * oracle数据库类型
+	 */
+	public static String DB_ORACLE = "DB_ORACLE";
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/ModelType.java b/src/main/java/com/matrix/codeGeneration/model/ModelType.java
new file mode 100644
index 0000000..9f64e31
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/ModelType.java
@@ -0,0 +1,78 @@
+package com.matrix.codeGeneration.model;
+
+/**
+ * 文件类型
+ * 
+ * @author Matrix-J
+ *
+ */
+public enum ModelType {
+	/**
+	 * javabean类型模型
+	 */
+	JAVA_BEAN,
+
+	/**
+	 * mybatis dao模型文件
+	 */
+	MYBATIS_DAO_IMPL,
+
+	/**
+	 * mybatis dao模型文件
+	 */
+	MYBATIS_DAO,
+
+	/**
+	 * SERVICE接口 模型文件
+	 */
+	SERVICE,
+
+	/**
+	 * SERVICE 实现类模型文件
+	 */
+	SERVICE_IMPL,
+
+	/**
+	 * ACTION 类模型文件
+	 */
+	ACTION,
+
+	/**
+	 * LIST VIEW 视图模型文件
+	 */
+	LIST,
+	/**
+	 * FORM VIEW 视图模型文件
+	 */
+	FORM,
+
+	/**
+	 * MABATIS 的配置文件
+	 */
+	MABATIS_CONFIG,;
+
+	public static ModelType get(String source) {
+
+		if (source.equals(JAVA_BEAN.toString())) {
+			return JAVA_BEAN;
+		} else if (source.equals(MYBATIS_DAO_IMPL.toString())) {
+			return MYBATIS_DAO_IMPL;
+		} else if (source.equals(MYBATIS_DAO.toString())) {
+			return MYBATIS_DAO;
+		} else if (source.equals(SERVICE.toString())) {
+			return SERVICE;
+		} else if (source.equals(SERVICE_IMPL.toString())) {
+			return SERVICE_IMPL;
+		} else if (source.equals(ACTION.toString())) {
+			return ACTION;
+		} else if (source.equals(LIST.toString())) {
+			return LIST;
+		}else if (source.equals(FORM.toString())) {
+			return FORM;
+		} else if (source.equals(MABATIS_CONFIG.toString())) {
+			return MABATIS_CONFIG;
+		}
+		return null;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/OutDataSource.java b/src/main/java/com/matrix/codeGeneration/model/OutDataSource.java
new file mode 100644
index 0000000..2fb2668
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/OutDataSource.java
@@ -0,0 +1,89 @@
+package com.matrix.codeGeneration.model;
+
+import java.util.List;
+import java.util.Map;
+
+import com.matrix.codeGeneration.convert.DefaultNameConvert;
+import com.matrix.codeGeneration.convert.NameConvert;
+
+public abstract class OutDataSource {
+
+	private String targetPath;
+
+	private NameConvert nameConvert = new DefaultNameConvert();
+	/**
+	 * 根据客户的选择生成表与类的对应
+	 */
+	private List<TableClassModel> tableClassModels;
+
+	/**
+	 * 根据客户的选择生成模型文件
+	 */
+	private Map<String, CodeModel> codeModels;
+
+	/**
+	 * 是否要生成文件 的包名
+	 */
+	private List<String> modelPackages;
+
+	/**
+	 * 用户模板根目录
+	 */
+	private String userTempLataHome;
+
+	public abstract List<TableClassModel> convertToTableModel();
+
+	public String getTargetPath() {
+		return targetPath;
+	}
+
+	public void setTargetPath(String targetPath) {
+		this.targetPath = targetPath;
+	}
+
+	public List<TableClassModel> getTableClassModels() {
+		return tableClassModels;
+	}
+
+	public void setTableClassModels(List<TableClassModel> tableClassModels) {
+		this.tableClassModels = tableClassModels;
+	}
+
+	public Map<String, CodeModel> getCodeModels() {
+		return codeModels;
+	}
+
+	public void setCodeModels(Map<String, CodeModel> codeModels) {
+		this.codeModels = codeModels;
+	}
+
+	public List<String> getModelPackages() {
+		return modelPackages;
+	}
+
+	public void setModelPackages(List<String> modelPackages) {
+		this.modelPackages = modelPackages;
+	}
+
+	public String getUserTempLataHome() {
+		return userTempLataHome;
+	}
+
+	// 这里支持classpath
+	public void setUserTempLataHome(String userTempLataHome) {
+		String cuttentPath = ClassLoader.getSystemResource("").toString().substring(5);
+		cuttentPath = cuttentPath + userTempLataHome;
+		this.userTempLataHome = cuttentPath;
+	}
+
+	public NameConvert getNameConvert() {
+		return nameConvert;
+	}
+
+	public void setNameConvert(NameConvert nameConvert) {
+		this.nameConvert = nameConvert;
+	}
+
+	 
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/PropertyColumn.java b/src/main/java/com/matrix/codeGeneration/model/PropertyColumn.java
new file mode 100644
index 0000000..efe47eb
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/PropertyColumn.java
@@ -0,0 +1,218 @@
+package com.matrix.codeGeneration.model;
+
+/**
+ * 属性名称和字段名称的对应bean
+ * 
+ * @author Matrix-j
+ *
+ */
+public class PropertyColumn {
+	/**
+	 * 属性名称
+	 */
+	private String property;
+	/**
+	 * 字段名称
+	 */
+	private String column;
+	/**
+	 * 类型名称
+	 */
+	private String classType;
+
+	/**
+	 * JDBC名称
+	 */
+	private String jdbcType;
+	
+	/**
+	 * JDBC名称 加长度
+	 */
+	private String fullJdbcType;
+	
+	
+	/**
+	 * 是否为主键
+	 * 
+	 */
+	private Boolean isPrimaryKey;
+	
+	/**
+	 * 是否在界面显示
+	 * 在数据库用[显示字段]备注表示在界面显示
+	 */
+	private Boolean isVisible;
+	
+	/**
+	 * 是否必填
+	 * 在数据库用[显示字段*]备注表示必填项
+	 */
+	private Boolean isNecessary;
+	
+	/**
+	 * 是否可为空
+	 */
+	private String isAllowNull;
+	/**
+	 * 显示在界面的名称
+	 */
+	private String showName;
+	
+	/**
+	 * 是否为外键
+	 */
+	private Boolean isForeignKey;
+
+	/**
+	 * 外键表名
+	 */
+	private String foreignTableName;
+
+	/**
+	 * 备注
+	 */
+	private String memo;
+
+	/**
+	 * 字段最大长度
+	 */
+	private String columnLength;
+
+	/**
+	 * 方法名称
+	 */
+	private String methodName;
+
+	/**
+	 * 索引名称
+	 */
+	private String indexName;
+
+	public String getMethodName() {
+		return methodName;
+	}
+
+	public void setMethodName(String methodName) {
+		this.methodName = methodName;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getForeignTableName() {
+		return foreignTableName;
+	}
+
+	public void setForeignTableName(String foreignTableName) {
+		this.foreignTableName = foreignTableName;
+	}
+
+	public String getProperty() {
+		return property;
+	}
+
+	public void setProperty(String property) {
+		this.property = property;
+	}
+
+	public String getColumn() {
+		return column;
+	}
+
+	public void setColumn(String column) {
+		this.column = column;
+	}
+
+	public String getClassType() {
+		return classType;
+	}
+
+	public void setClassType(String classType) {
+		this.classType = classType;
+	}
+
+	
+	public Boolean getIsVisible() {
+		return isVisible;
+	}
+
+	public void setIsVisible(Boolean isVisible) {
+		this.isVisible = isVisible;
+	}
+
+	public Boolean getIsNecessary() {
+		return isNecessary;
+	}
+
+	public void setIsNecessary(Boolean isNecessary) {
+		this.isNecessary = isNecessary;
+	}
+
+	public String getJdbcType() {
+		return jdbcType;
+	}
+
+	public void setJdbcType(String jdbcType) {
+		this.jdbcType = jdbcType;
+	}
+
+	public Boolean getIsPrimaryKey() {
+		return isPrimaryKey;
+	}
+
+	public void setIsPrimaryKey(Boolean isPrimaryKey) {
+		this.isPrimaryKey = isPrimaryKey;
+	}
+
+	public Boolean getIsForeignKey() {
+		return isForeignKey;
+	}
+
+	public void setIsForeignKey(Boolean isForeignKey) {
+		this.isForeignKey = isForeignKey;
+	}
+
+	public String getColumnLength() {
+		return columnLength;
+	}
+
+	public void setColumnLength(String columnLength) {
+		this.columnLength = columnLength;
+	}
+
+	public String getShowName() {
+		return showName;
+	}
+
+	public void setShowName(String showName) {
+		this.showName = showName;
+	}
+
+	public String getFullJdbcType() {
+		return fullJdbcType;
+	}
+
+	public void setFullJdbcType(String fullJdbcType) {
+		this.fullJdbcType = fullJdbcType;
+	}
+	public String getIsAllowNull() {
+		return isAllowNull;
+	}
+
+	public void setIsAllowNull(String isAllowNull) {
+		this.isAllowNull = isAllowNull;
+	}
+
+	public String getIndexName() {
+		return indexName;
+	}
+
+	public void setIndexName(String indexName) {
+		this.indexName = indexName;
+	}
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/TableClassModel.java b/src/main/java/com/matrix/codeGeneration/model/TableClassModel.java
new file mode 100644
index 0000000..a197118
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/TableClassModel.java
@@ -0,0 +1,150 @@
+package com.matrix.codeGeneration.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 数据表和java的对应模型
+ * 
+ * @author Matrix-J
+ *
+ */
+public class TableClassModel {
+
+	/**
+	 * 类的中文名称
+	 */
+	private String tableMemo;
+
+	/**
+	 * 类名
+	 */
+	private String className;
+	
+	/**
+	 * bean的名称
+	 */
+	private String beanClassName;
+	
+	private String fullClassName;
+	
+	private String qualifiedClassName;
+
+	/**
+	 * 表名
+	 */
+	private String tableName;
+
+	/**
+	 * 类的变量名称
+	 */
+	private String classVariableName;
+	/**
+	 * 主键
+	 */
+	private PropertyColumn primaryKey;
+
+	private List<PropertyColumn> mapping = new ArrayList<PropertyColumn>();
+	
+	/**
+	 * 展示到页面的字段个数 addByzhangheng
+	 */
+	private Integer showCount;
+
+	public TableClassModel() {
+	}
+  
+
+	public String getTableName() {
+		return tableName;
+	}
+
+	public void setTableName(String tableName) {
+		this.tableName = tableName;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public List<PropertyColumn> getMapping() {
+		return mapping;
+	}
+
+	public void setMapping(List<PropertyColumn> mapping) {
+		this.mapping = mapping;
+	}
+
+	public PropertyColumn getPrimaryKey() {
+		return primaryKey;
+	}
+
+	public void setPrimaryKey(PropertyColumn primaryKey) {
+		this.primaryKey = primaryKey;
+	}
+ 
+
+	public String getClassVariableName() {
+		return classVariableName;
+	}
+
+	public void setClassVariableName(String classVariableName) {
+		this.classVariableName = classVariableName;
+	}
+
+	 
+
+	public String getTableMemo() {
+		return tableMemo;
+	}
+
+	public void setTableMemo(String tableMemo) {
+		this.tableMemo = tableMemo;
+	}
+
+
+	public String getBeanClassName() {
+		return beanClassName;
+	}
+
+
+	public void setBeanClassName(String beanClassName) {
+		this.beanClassName = beanClassName;
+	}
+
+
+	public String getFullClassName() {
+		return fullClassName;
+	}
+
+
+	public void setFullClassName(String fullClassName) {
+		this.fullClassName = fullClassName;
+	}
+
+
+	public String getQualifiedClassName() {
+		return qualifiedClassName;
+	}
+
+
+	public void setQualifiedClassName(String qualifiedClassName) {
+		this.qualifiedClassName = qualifiedClassName;
+	}
+
+
+	public Integer getShowCount() {
+		return showCount;
+	}
+
+
+	public void setShowCount(Integer showCount) {
+		this.showCount = showCount;
+	}
+
+	
+}
diff --git a/src/main/java/com/matrix/codeGeneration/model/TypeHandle.java b/src/main/java/com/matrix/codeGeneration/model/TypeHandle.java
new file mode 100644
index 0000000..f62ec9c
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/model/TypeHandle.java
@@ -0,0 +1,9 @@
+package com.matrix.codeGeneration.model;
+/**
+ * 类型处理器
+ * @author Matrix-j
+ *
+ */
+public interface TypeHandle {
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/plugin/DateUtils.java b/src/main/java/com/matrix/codeGeneration/plugin/DateUtils.java
new file mode 100644
index 0000000..8d45c05
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/plugin/DateUtils.java
@@ -0,0 +1,557 @@
+package com.matrix.codeGeneration.plugin;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 日期格式化,转换工具类
+ * 
+ * @author 姜友瑶
+ * @createTime 2014.08.30
+ */
+public class DateUtils {
+
+
+	public static final String DATE_FORMAT_SS = "yyyy-MM-dd HH:mm:ss";
+
+	public static final String DATE_FORMAT_MONGO = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+
+	public static final String DATE_FORMAT_STS = "yyyy-MM-dd'T'HH:mm:ss";
+
+	public static final String DATE_FORMAT_MM = "yyyy-MM-dd HH:mm";
+
+	public static final String DATE_FORMAT_HH = "yyyy-MM-dd HH";
+
+	public static final String DATE_FORMAT_DD = "yyyy-MM-dd";
+
+	public static final String DATE_FORMAT_SPLITE_DD = "yyyy.MM.dd";
+
+	public static final String DATE_FORMAT_NO_SPLITE_DD = "yyyyMMdd";
+
+	public static final String DATE_FORMAT_MM_NO_DD = "yyyyMM";
+
+	public static final String DATE_FORMAT_NO_SPLITE_MM = "yyyyMMddHHmm";
+
+	public static final String DATE_FORMAT_NO_SPLITE_MM_HH = "yyyyMMddHH";
+
+	public static final String YEAR = "yyyy";
+
+	public static final String DATE_FORMAT_MMDD = "M月d日";
+
+	public static final String DATE_FORMAT_WEEK = "星期";
+
+	public static final String DATE_TIME_MORNING = "早上";
+
+	public static final String DATE_TIME_AFTERNOON = "下午";
+
+	public static final String DATE_TIME_NIGHT = "晚上";
+
+	public static final String CENTRE_SCRIBING = "-";
+
+	protected static final String EMPTY = "";
+
+	protected static final String ZERO = "0";
+
+	protected static final String SPLITE_CHAR = ":";
+
+	protected static final String START_TIME = " 00:00:00";// 空格不能删除
+
+	protected static final String END_TIME = " 23:59:59";// 空格不能删除
+
+	protected static final int WEEK_DAYS = 7;
+
+	public static String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
+
+	protected static final String[] weeks = { "一", "二", "三", "四", "五", "六", "日" };
+
+	/**
+	 * 返回年份
+	 * 
+	 * @param date
+	 *            日期
+	 * @return 返回年份
+	 */
+	public static int getYear(java.util.Date date) {
+
+		try {
+			java.util.Calendar c = java.util.Calendar.getInstance();
+			c.setTime(date);
+			return c.get(java.util.Calendar.YEAR);
+		} catch (Exception e) {
+		}
+
+		return 0;
+	}
+
+	/**
+	 * 返回月份
+	 * 
+	 * @param date
+	 *            日期
+	 * @return 返回月份
+	 */
+	public static int getMonth(java.util.Date date) {
+
+		try {
+			java.util.Calendar c = java.util.Calendar.getInstance();
+			c.setTime(date);
+			return c.get(java.util.Calendar.MONTH) + 1;
+		} catch (Exception e) {
+			
+		}
+		return 0;
+	}
+
+	/**
+	 * 日期转字符串
+	 * 
+	 * @param date
+	 * @param format
+	 * @return
+	 */
+	public static String dateToString(Date date, String format) {
+
+		if (date == null) {
+			return EMPTY;
+		}
+		DateFormat fmt = new SimpleDateFormat(format);
+		return fmt.format(date);
+	}
+
+	/**
+	 * 字符串转日期
+	 * 
+	 * @param dateStr
+	 * @param format
+	 * @return
+	 */
+	public static Date stringToDate(String dateStr, String format) {
+
+		DateFormat fmt = new SimpleDateFormat(format);
+		try {
+			return fmt.parse(dateStr);
+		} catch (ParseException e) {
+			
+		}
+		return null;
+	}
+ 
+
+	/**
+	 * 判断给定的日期是一周中的第几天,注意:按照中国的习惯,周日是第七天
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static int dateToWeek(Date date) {
+
+		if (date == null) {
+			return 0;
+		}
+
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		if (cal.get(Calendar.DAY_OF_WEEK) == 1) {
+			return 7;
+		} else {
+			return cal.get(Calendar.DAY_OF_WEEK) - 1;
+		}
+	}
+
+	public static String dateOfWeek(Date date) {
+
+		return DATE_FORMAT_WEEK + weeks[dateToWeek(date) - 1];
+	}
+
+	/**
+	 * 指定时间的下一天
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date nextDate(Date date) {
+
+		if (date == null) {
+			return date;
+		}
+
+		Calendar cal = Calendar.getInstance();
+		try {
+			cal.setTime(date);
+			cal.add(Calendar.DATE, 1);
+			return cal.getTime();
+		} catch (Exception e) {
+			
+		}
+
+		return null;
+	}
+
+	/**
+	 * 指定时间的前一天
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date previousDate(Date date) {
+
+		if (date == null) {
+			return date;
+		}
+
+		Calendar cal = Calendar.getInstance();
+		try {
+			cal.setTime(date);
+			cal.add(Calendar.DATE, -1);
+			return cal.getTime();
+		} catch (Exception e) {
+			
+		}
+
+		return null;
+	}
+
+	/**
+	 * 指定时间的下N天
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date nextNDate(Date date, int nDay) {
+
+		if (date == null) {
+			return date;
+		}
+
+		Calendar cal = Calendar.getInstance();
+		try {
+			cal.setTime(date);
+			cal.add(Calendar.DATE, nDay);
+			return cal.getTime();
+		} catch (Exception e) {
+			
+		}
+
+		return null;
+	}
+
+	/**
+	 * 指定时间的前N天
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date previousNDate(Date date, int nDay) {
+
+		if (date == null) {
+			return date;
+		}
+
+		Calendar cal = Calendar.getInstance();
+		try {
+			cal.setTime(date);
+			cal.add(Calendar.DATE, -nDay);
+			return cal.getTime();
+		} catch (Exception e) {
+			
+		}
+
+		return null;
+	}
+
+	/**
+	 * 获取一天的起始时间
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getStartDate(Date date) {
+
+		if (date == null) {
+			return date;
+		}
+
+		DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD);
+		String dateStr = fmt.format(date);
+		dateStr = dateStr + START_TIME;
+		fmt = new SimpleDateFormat(DATE_FORMAT_SS);
+		try {
+			return fmt.parse(dateStr);
+		} catch (ParseException e) {
+			
+		}
+
+		return date;
+	}
+
+	/**
+	 * 获取一天的结束时间
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getEndDate(Date date) {
+
+		if (date == null) {
+			return date;
+		}
+
+		DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD);
+		String dateStr = fmt.format(date);
+		dateStr = dateStr + END_TIME;
+		fmt = new SimpleDateFormat(DATE_FORMAT_SS);
+		try {
+			return fmt.parse(dateStr);
+		} catch (ParseException e) {
+			
+		}
+
+		return date;
+	}
+
+	/**
+	 * currentDat是否在referenceDate日期之前
+	 * 
+	 * @param referenceDate
+	 * @param currentDat
+	 * @return
+	 */
+	public static boolean isBeforeDate(Date referenceDate, Date currentDate) {
+
+		if (currentDate == null) {
+			return false;
+		}
+		if (referenceDate == null) {
+			return true;
+		}
+		return currentDate.before(referenceDate);
+	}
+
+	/**
+	 * currentDat是否在referenceDate日期之后
+	 * 
+	 * @param referenceDate
+	 * @param currentDat
+	 * @return
+	 */
+	public static boolean isAffterDate(Date referenceDate, Date currentDate) {
+
+		if (currentDate == null) {
+			return false;
+		}
+		if (referenceDate == null) {
+			return true;
+		}
+		return currentDate.after(referenceDate);
+	}
+
+	/**
+	 * 判断currentDate是否在startDate和endDate之间,不包括startDate和endDate
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @param currentDate
+	 * @return
+	 */
+	public static boolean isDuringDate(Date startDate, Date endDate, Date currentDate) {
+
+		if (currentDate == null) {
+			return false;
+		}
+
+		if (isAffterDate(startDate, currentDate) && isBeforeDate(endDate, currentDate)) {
+			return true;
+		}
+		return false;
+	}
+
+	 
+
+	/**
+	 * 获取startDate到endDate之间的星期day(中文星期)不包括startDate和endDate
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @param day
+	 * @return
+	 */
+	public static List<Date> findDayDuringDate(Date startDate, Date endDate, int day) {
+
+		List<Date> listDate = new ArrayList<Date>();
+		int startDay = dateToWeek(startDate);
+
+		Date date = null;
+		if (startDay == day) {
+			date = nextNDate(startDate, WEEK_DAYS);
+		} else {
+			date = nextNDate(startDate, day - startDay);
+		}
+		while (isDuringDate(startDate, endDate, date)) {
+			listDate.add(date);
+			date = nextNDate(date, WEEK_DAYS);
+		}
+
+		return listDate;
+	}
+
+	 
+
+	/**
+	 * date转换成Timestamp
+	 * 
+	 * @param date
+	 * @param format
+	 * @return
+	 */
+	public static Timestamp dateToTimestamp(Date date, String format) {
+
+		if (date == null) {
+			return null;
+		}
+
+		format = DATE_FORMAT_SS;
+
+		DateFormat fmt = new SimpleDateFormat(format);
+
+		return Timestamp.valueOf(fmt.format(date));
+	}
+
+	/**
+	 * 获取早中晚
+	 * 
+	 * @param time
+	 * @return
+	 */
+	public static String getDateTime(int time) {
+
+		// 早上
+		if (time == 1) {
+			return DateUtils.DATE_TIME_MORNING;
+		}
+		// 下午
+		else if (time == 2) {
+			return DateUtils.DATE_TIME_AFTERNOON;
+		}
+		// 晚上
+		else if (time == 3) {
+			return DateUtils.DATE_TIME_NIGHT;
+		}
+		return null;
+	}
+
+	/**
+	 * 获取早中晚的开始时间
+	 * 
+	 * @param date
+	 * @param time
+	 * @return
+	 */
+	public static Date getMeetTimeStart(String date, int time) {
+
+		// 早上
+		if (time == 1) {
+			return DateUtils.stringToDate(date + " 06:00", DateUtils.DATE_FORMAT_MM);
+		}
+		// 下午
+		else if (time == 2) {
+			return DateUtils.stringToDate(date + " 13:00", DateUtils.DATE_FORMAT_MM);
+		}
+		// 晚上
+		else if (time == 3) {
+			return DateUtils.stringToDate(date + " 19:00", DateUtils.DATE_FORMAT_MM);
+		}
+		return null;
+	}
+
+	/**
+	 * 获取早中晚的结束时间
+	 * 
+	 * @param date
+	 * @param time
+	 * @return
+	 */
+
+	public static Date getMeetTimeEnd(String date, int time) {
+		// 早上
+		if (time == 1) {
+			return DateUtils.stringToDate(date + " 13:00", DateUtils.DATE_FORMAT_MM);
+		}
+		// 下午
+		else if (time == 2) {
+			return DateUtils.stringToDate(date + " 19:00", DateUtils.DATE_FORMAT_MM);
+		}
+		// 晚上
+		else if (time == 3) {
+			return DateUtils.stringToDate(date + " 23:00", DateUtils.DATE_FORMAT_MM);
+		}
+		return null;
+	}
+
+	/**
+	 * 得到几天前的时间
+	 * 
+	 * @param d
+	 * @param day
+	 * @return
+	 */
+	public static Timestamp getDateBefore(Date d, int day) {
+		Calendar now = Calendar.getInstance();
+		now.setTime(d);
+		now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
+		return new Timestamp(now.getTime().getTime());
+	}
+
+	/**
+	 * 得到几天后的时间
+	 * 
+	 * @param d
+	 * @param day
+	 * @return
+	 */
+	public static Timestamp getDateAfter(Date d, int day) {
+		Calendar now = Calendar.getInstance();
+		now.setTime(d);
+		now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
+		return new Timestamp(now.getTime().getTime());
+	}
+
+	/**
+	 * 将日期类型格式化成字符串
+	 * 
+	 * @param date
+	 * @return 格式化后日期字符串
+	 * @throws ParseException
+	 */
+	public static String dateFormatStr(Date date, String dateStyle) {
+		String dateStr = null;
+		if (date != null) {
+			SimpleDateFormat sdf = new SimpleDateFormat(dateStyle);
+			dateStr = sdf.format(date);
+		}
+		return dateStr;
+	}
+
+	/**
+	 * 获取时间戳
+	 * 
+	 * @return
+	 */
+	public static String getTimeMark() {
+		Calendar c = Calendar.getInstance();
+		int year = c.get(Calendar.YEAR);
+		int mouth = c.get(Calendar.MONTH);
+		int day = c.get(Calendar.DAY_OF_MONTH);
+		int hour = c.get(Calendar.HOUR_OF_DAY);
+		int minute = c.get(Calendar.MINUTE);
+		int second = c.get(Calendar.SECOND);
+		int haomiao = c.get(Calendar.MILLISECOND);
+		return "" + year + mouth + day + hour + minute + second + haomiao;
+	}
+
+}
diff --git a/src/main/java/com/matrix/codeGeneration/plugin/ExcelImport.java b/src/main/java/com/matrix/codeGeneration/plugin/ExcelImport.java
new file mode 100644
index 0000000..c94d153
--- /dev/null
+++ b/src/main/java/com/matrix/codeGeneration/plugin/ExcelImport.java
@@ -0,0 +1,326 @@
+package com.matrix.codeGeneration.plugin;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * excel导入(根据需求调用03/07版本方法导入)
+ * 
+ * @ClassName: ExcelImport
+ * @Description: TODO
+ * @author 肖崇高 xiaochonggao@zkingsoft.com
+ * @date 2016年8月2日 上午10:39:04
+ *
+ */
+public class ExcelImport {
+	/**
+	 * 对外提供读取excel 的方法
+	 */
+	public static List<List<Object>> readExcel(File file, String fileName, Integer rowNum, Integer cellNum)
+			throws IOException {
+		String extension = fileName.lastIndexOf(".") == -1 ? "" : fileName.substring(fileName.lastIndexOf(".") + 1);
+		if ("xls".equals(extension)) {
+			return read2003Excel(file, rowNum, cellNum);
+		} else if ("xlsx".equals(extension)) {
+			return read2007Excel(file, rowNum, cellNum);
+		} else {
+			throw new IOException("不支持的文件类型");
+		}
+	}
+
+	/**
+	 * 
+	 * @Title: read2003Excel @Description: TODO @param @param file
+	 *         待读取的文件 @param @param rowNum 行数 @param @param cellNum
+	 *         列数 @param @return @param @throws IOException 设定文件 @return
+	 *         List<List<Object>> 返回类型 Object:单元格对象 List<Object>:行对象
+	 *         List<List<Object>>:整个excel对象 @throws
+	 */
+	private static List<List<Object>> read2003Excel(File file, Integer rowNum, Integer cellNum) throws IOException {
+		List<List<Object>> list = new LinkedList<List<Object>>();
+		HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));
+		HSSFSheet sheet = hwb.getSheetAt(0);
+		Object value = null;
+		HSSFRow row = null;
+		HSSFCell cell = null;
+		Integer rowsNum = 0;// 读取的行数
+		Integer cellsNum = 0;// 读取的列数
+		if (rowNum != null) {
+			rowsNum = rowNum;
+		} else {
+			rowsNum = sheet.getPhysicalNumberOfRows();
+		}
+		for (int i = sheet.getFirstRowNum(); i <= rowsNum; i++) {
+			row = sheet.getRow(i);
+			if (row == null) {
+				continue;
+			}
+			if (row.getFirstCellNum() < 0) {
+				continue;
+			}
+			List<Object> linked = new LinkedList<Object>();
+			if (cellNum != null) {
+				cellsNum = cellNum;
+			} else {
+				cellsNum = (int) row.getLastCellNum();
+			}
+			for (int j = 0; j <= cellsNum; j++) {// row.getFirstCellNum()
+				cell = row.getCell(j);
+				if (cell == null) {
+					value = null;
+				} else {
+					DecimalFormat df = new DecimalFormat("0");// 格式化 number
+																// String
+					// 字符
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
+					DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字
+					switch (cell.getCellType()) {
+					case XSSFCell.CELL_TYPE_STRING:
+						value = cell.getStringCellValue();
+						break;
+					case XSSFCell.CELL_TYPE_NUMERIC:
+						if ("@".equals(cell.getCellStyle().getDataFormatString())) {
+							value = df.format(cell.getNumericCellValue());
+						} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
+							value = nf.format(cell.getNumericCellValue());
+						} else {
+							value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
+						}
+						break;
+					case XSSFCell.CELL_TYPE_BOOLEAN:
+						value = cell.getBooleanCellValue();
+						break;
+					case XSSFCell.CELL_TYPE_BLANK:
+						value = "";
+						break;
+					default:
+						value = cell.toString();
+					}
+				}
+				linked.add(value);
+			}
+			list.add(linked);
+		}
+		return list;
+	}
+
+	/**
+	 * 
+	 * @Title: read2007Excel @Description: TODO @param @param file
+	 *         待读取的文件 @param @param rowNum 行数 @param @param cellNum
+	 *         列数 @param @return @param @throws IOException 设定文件 @return
+	 *         List<List<Object>> 返回类型 Object:单元格对象 List<Object>:行对象
+	 *         List<List<Object>>:整个excel对象 @throws
+	 */
+	private static List<List<Object>> read2007Excel(File file, Integer rowNum, Integer cellNum) throws IOException {
+		List<List<Object>> list = new LinkedList<List<Object>>();
+		// 构造 XSSFWorkbook 对象,strPath 传入文件路径
+		XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
+		// 读取第一章表格内容
+		XSSFSheet sheet = xwb.getSheetAt(0);
+		Object value = null;
+		XSSFRow row = null;
+		XSSFCell cell = null;
+		Integer rowsNum = 0;// 读取的行数
+		Integer cellsNum = 0;// 读取的列数
+		if (rowNum != null) {
+			rowsNum = rowNum;
+		} else {
+			rowsNum = sheet.getPhysicalNumberOfRows();
+		}
+		for (int i = sheet.getFirstRowNum(); i <= rowsNum; i++) {
+			row = sheet.getRow(i);
+			if (row == null) {
+				continue;
+			}
+			if (row.getFirstCellNum() < 0) {
+				continue;
+			}
+			if (cellNum != null) {
+				cellsNum = cellNum;
+			} else {
+				cellsNum = (int) row.getLastCellNum();
+			}
+			List<Object> linked = new LinkedList<Object>();
+			for (int j = 0; j <= cellsNum; j++) {
+				cell = row.getCell(j);
+				if (cell == null) {
+					value = null;
+				} else {
+					DecimalFormat df = new DecimalFormat("0");// 格式化 number
+																// String
+					// 字符
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
+					DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字
+					switch (cell.getCellType()) {
+					case XSSFCell.CELL_TYPE_STRING:
+						value = cell.getStringCellValue();
+						break;
+					case XSSFCell.CELL_TYPE_NUMERIC:
+						if ("@".equals(cell.getCellStyle().getDataFormatString())) {
+							value = df.format(cell.getNumericCellValue());
+						} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
+							value = nf.format(cell.getNumericCellValue());
+						} else {
+							value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
+						}
+						break;
+					case XSSFCell.CELL_TYPE_BOOLEAN:
+						value = cell.getBooleanCellValue();
+						break;
+					case XSSFCell.CELL_TYPE_BLANK:
+						value = "";
+						break;
+					default:
+						value = cell.toString();
+					}
+				}
+				linked.add(value);
+			}
+			list.add(linked);
+		}
+		return list;
+	}
+
+	/**
+	 * 
+	 * @Title: getCellValue @Description: TODO 获取某个单元格数据 @param @param
+	 *         cell @param @return @param @throws Exception 设定文件 @return Object
+	 *         返回类型 @throws
+	 */
+	public static Object getCellValue(HSSFCell cell) throws Exception {
+		Object value = null;
+		if (cell != null) {
+			DecimalFormat df = new DecimalFormat("0");// 格式化
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
+			DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字
+			switch (cell.getCellType()) {
+			case XSSFCell.CELL_TYPE_STRING:
+				value = cell.getStringCellValue();
+				break;
+			case XSSFCell.CELL_TYPE_NUMERIC:
+				if ("@".equals(cell.getCellStyle().getDataFormatString())) {
+					value = df.format(cell.getNumericCellValue());
+				} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
+					value = nf.format(cell.getNumericCellValue());
+				} else {
+					value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
+				}
+				break;
+			case XSSFCell.CELL_TYPE_BOOLEAN:
+				value = cell.getBooleanCellValue();
+				break;
+			case XSSFCell.CELL_TYPE_BLANK:
+				value = "";
+				break;
+			default:
+				value = cell.toString();
+			}
+		}
+		return value;
+	}
+
+	/**
+	 * 
+	 * @Title: read2007Excel @Description: TODO @param @param file
+	 *         待读取的文件 @param @param rowNum 行数 @param @param cellNum
+	 *         列数 @param @return @param @throws IOException 设定文件 @return
+	 *         List<List<Object>> 返回类型 Object:单元格对象 List<Object>:行对象
+	 *         List<List<Object>>:整个excel对象 @throws
+	 */
+	public static Map<String, List<List<Object>>> read2007ExcelAllShell(File file, Integer rowNum, Integer cellNum)
+			throws IOException {
+
+		Map<String, List<List<Object>>> resultSheet = new HashMap<String, List<List<Object>>>();
+
+		// 构造 XSSFWorkbook 对象,strPath 传入文件路径
+		XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
+		for (int i = 0; i < xwb.getNumberOfSheets(); i++) {
+			List<List<Object>> list = new LinkedList<List<Object>>();
+			XSSFSheet sheet = xwb.getSheetAt(i);
+			String sheetName = sheet.getSheetName();
+			System.out.println("读取第" + i + "章表格内容->" + sheetName);//
+			Object value = null;
+			XSSFRow row = null;
+			XSSFCell cell = null;
+			Integer rowsNum = 0;// 读取的行数
+			Integer cellsNum = 0;// 读取的列数
+			if (rowNum != null) {
+				rowsNum = rowNum;
+			} else {
+				rowsNum = sheet.getPhysicalNumberOfRows();
+			}
+			for (int j = sheet.getFirstRowNum(); j <= rowsNum; j++) {
+				row = sheet.getRow(j);
+				if (row == null) {
+					continue;
+				}
+				if (row.getFirstCellNum() < 0) {
+					continue;
+				}
+				if (cellNum != null) {
+					cellsNum = cellNum;
+				} else {
+					cellsNum = (int) row.getLastCellNum();
+				}
+				List<Object> linked = new LinkedList<Object>();
+				for (int k = 0; k <= cellsNum; k++) {
+					cell = row.getCell(k);
+					if (cell == null) {
+						value = null;
+					} else {
+						DecimalFormat df = new DecimalFormat("0");// 格式化 number
+																	// String
+						// 字符
+						SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
+						DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字
+						switch (cell.getCellType()) {
+						case XSSFCell.CELL_TYPE_STRING:
+							value = cell.getStringCellValue();
+							break;
+						case XSSFCell.CELL_TYPE_NUMERIC:
+							if ("@".equals(cell.getCellStyle().getDataFormatString())) {
+								value = df.format(cell.getNumericCellValue());
+							} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
+								value = nf.format(cell.getNumericCellValue());
+							} else {
+								value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
+							}
+							break;
+						case XSSFCell.CELL_TYPE_BOOLEAN:
+							value = cell.getBooleanCellValue();
+							break;
+						case XSSFCell.CELL_TYPE_BLANK:
+							value = "";
+							break;
+						default:
+							value = cell.toString();
+						}
+					}
+					linked.add(value);
+				}
+				list.add(linked);
+			}
+			resultSheet.put(sheetName, list);
+		}
+
+		return resultSheet;
+	}
+}
diff --git a/src/main/resources/config/code-generation.xml b/src/main/resources/config/code-generation.xml
new file mode 100644
index 0000000..301657d
--- /dev/null
+++ b/src/main/resources/config/code-generation.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	   xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
+	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
+	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
+
+	<!-- 根据需要调整注入的outDataSource -->
+
+	<!-- EXCEL 构建代码 -->
+	<bean id="outDataSource" class="com.matrix.codeGeneration.ext.ExcelDataSource">
+		<property name="author" value="yourName"></property>
+		<!-- excel所在目录 -->
+		<property name="sourcePath" value="E:\生成代码" />
+		<!-- 数据库类型 -->
+		<property name="dbType" value="mysql" />
+		<!-- 目标代码位置 -->
+		<property name="targetPath" value="E:\生成代码" />
+		<!-- 模板文件位置 -->
+		<property name="userTempLataHome" value="template/excelTemplateForBoot" />
+		<!-- <property name="userTempLataHome" value="template/excelTemplate" /> -->
+		<property name="nameConvert">
+			<bean class="com.matrix.codeGeneration.ext.OracleStyleNameConvert"></bean>
+		</property>
+		<!-- 配置需要生成的文件 -->
+		<property name="codeModels">
+			<map>
+				<entry key="JAVA_BEAN" value-ref="javaBean" />
+				<entry key="MYSQL_SQL" value-ref="mysqlModel" />
+				<entry key="MYBATIS_DAO" value-ref="mybatisDao" />
+				<entry key="MYBATIS_DAO_IMPL" value-ref="mybatisDaoImpl" />
+				<!-- <entry key="SERVICE" value-ref="service" /> -->
+				<!-- <entry key="SERVICE_IMPL" value-ref="serviceImpl" /> -->
+				<entry key="ACTION" value-ref="action" />
+				<entry key="LIST" value-ref="list" />
+				<entry key="FORM" value-ref="form" />
+			</map>
+		</property>
+	</bean>
+	<!-- 生成文件模型相关配置 -->
+	<bean id="mysqlModel" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- javaBean类型 -->
+		<property name="modelName" value="MYSQL_SQL" />
+		<!-- 包名 -->
+		<property name="packageName" value="sql" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".sql" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="sqlFile.ftl" />
+	</bean>
+	<!-- 生成文件模型相关配置 -->
+	<bean id="javaBean" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- javaBean类型 -->
+		<property name="modelName" value="JAVA_BEAN" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.bean" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".java" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="javaBean.ftl" />
+
+	</bean>
+
+	<bean id="mybatisDao" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="MYBATIS_DAO" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.dao" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".java" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="dao.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="Dao" />
+	</bean>
+
+	<bean id="mybatisDaoImpl" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="MYBATIS_DAO_IMPL" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.dao" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".xml" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="daoImpl.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="Dao" />
+	</bean>
+
+	<bean id="service" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="SERVICE" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.service" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".java" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="service.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="Service" />
+	</bean>
+
+	<bean id="serviceImpl" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="SERVICE_IMPL" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.service.impl" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".java" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="serviceImpl.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="ServiceImpl" />
+	</bean>
+
+	<bean id="action" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="ACTION" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.action" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".java" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="action.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="Action" />
+
+	</bean>
+	<bean id="list" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="LIST" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.html" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".html" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="list.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="-list" />
+
+	</bean>
+	<bean id="form" class="com.matrix.codeGeneration.ext.Matrix4Models">
+		<!-- dao接口类型 -->
+		<property name="modelName" value="FORM" />
+		<!-- 包名 -->
+		<property name="packageName" value="com.xincheng.biz2.html" />
+		<!-- 文件后缀名称 -->
+		<property name="fileExtName" value=".html" />
+		<!-- 对应的framwork模板文件名称 -->
+		<property name="templateName" value="form.ftl" />
+		<!-- 类名称后缀 -->
+		<property name="suffixName" value="-form" />
+
+	</bean>
+
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/action.ftl b/src/main/resources/template/excelTempLateCopy/action.ftl
new file mode 100644
index 0000000..bb5f979
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/action.ftl
@@ -0,0 +1,122 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Controller
+@RequestMapping(value = "admin/${tableClassModel.classVariableName}")
+public class ${ClassName} {
+
+	@Autowired
+	private ${tableClassModel.className}Dao ${tableClassModel.classVariableName}Dao;
+	
+	//记录编辑前的值Before_Edit_Value
+	public static final String BEV="${tableClassModel.className}_BEV";
+	
+	
+	/**
+	 * 列表显示
+	 */
+	@RequestMapping(value =  "/showList")
+	public @ResponseBody AjaxResult showList(${tableClassModel.className} ${tableClassModel.classVariableName}, PaginationVO pageVo) {
+		if (pageVo == null) {
+			pageVo = new PaginationVO();
+		}
+		List<${tableClassModel.className}> dataList = ${tableClassModel.classVariableName}Dao.selectInPage(${tableClassModel.classVariableName}, pageVo);
+		AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, dataList,
+				${tableClassModel.classVariableName}Dao.selectTotalRecord(${tableClassModel.classVariableName}));
+		return result;
+	}
+   	
+	/**
+	 * 新增
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/add${tableClassModel.className}")
+	public @ResponseBody AjaxResult add${tableClassModel.className}(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+	    SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+		${tableClassModel.classVariableName}.set${tableClassModel.primaryKey.property?cap_first}(UUIDUtil.getRandomID());
+		${tableClassModel.classVariableName}.setCreateBy(user.getSuName());
+		${tableClassModel.classVariableName}.setUpdateBy(user.getSuName());
+	 	int i=${tableClassModel.classVariableName}Dao.insert(${tableClassModel.classVariableName});
+	 	if(i > 0){
+	 		return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, "${tableClassModel.tableMemo}");
+	 	}else {
+			throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
+		}
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 修改
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/modify${tableClassModel.className}")
+	public @ResponseBody AjaxResult modify${tableClassModel.className}(${tableClassModel.className} new${tableClassModel.className}) {
+	   	${tableClassModel.className} old${tableClassModel.className} = WebUtil.getSessionAttribute(BEV);
+		int i = 0;
+		Map<String, Object> modifyMap = null;
+		try {
+			if (!ModelUtils.isModified(old${tableClassModel.className}, new${tableClassModel.className})) {
+				i = MatrixConstance.DML_SUCCESSS;
+			}
+			modifyMap = ModelUtils.comparePojo2Map(old${tableClassModel.className}, new${tableClassModel.className});
+		} catch (Exception e) {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, new${tableClassModel.className});
+		}
+		if (modifyMap.size() > 0) {
+			modifyMap.put("${tableClassModel.primaryKey.property}", old${tableClassModel.className}.get${tableClassModel.primaryKey.property?cap_first}());
+			${tableClassModel.classVariableName}Dao.updateByMap(modifyMap);
+		}
+		i = MatrixConstance.DML_SUCCESSS;
+		WebUtil.removeSessionAttribute(BEV);
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.UPDATE_SUCCES, "${tableClassModel.tableMemo}");
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL);
+		}
+	}
+	
+	
+	
+	
+   	/**
+	 * 进入修改界面
+	 */   
+	@SaveRequestToken
+   	@RequestMapping(value =  "/editForm")
+	public String editForm(${tableClassModel.primaryKey.classType} id) {
+		${tableClassModel.className} ${tableClassModel.classVariableName};
+		if (id != null) {
+			${tableClassModel.classVariableName} = ${tableClassModel.classVariableName}Dao.selectById(id);
+			WebUtil.getRequest().setAttribute("obj", ${tableClassModel.classVariableName});
+			WebUtil.setSessionAttribute(BEV, ${tableClassModel.classVariableName});
+		}
+		return "admin/${tableClassModel.className}-form";
+	}
+   	
+   	
+   	/**
+	 * 删除
+	 */  
+ 	@RequestMapping(value = "/del")
+	public @ResponseBody AjaxResult del(String keys) {
+		List<String> ids = StringUtils.strToCollToString(keys, ",");
+		int i =  ${tableClassModel.classVariableName}Dao.deleteByIds(ids);
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.DELETE_SUCCES, i);
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_DELETE_FAIL);
+		}
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/dao.ftl b/src/main/resources/template/excelTempLateCopy/dao.ftl
new file mode 100644
index 0000000..43f2ef2
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/dao.ftl
@@ -0,0 +1,38 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName}{
+
+	public int insert(@Param("item") ${tableClassModel.className} ${tableClassModel.classVariableName});
+   	
+   	public int batchInsert(@Param("list") List<${tableClassModel.className}> ${tableClassModel.classVariableName}List);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int deleteByIds(@Param("list") List<${tableClassModel.primaryKey.classType}> list);
+	
+	public int deleteById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+
+	public int deleteByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public List<${tableClassModel.className}> selectInPage(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName}, @Param("pageVo") PaginationVO pageVo);
+
+	public List<${tableClassModel.className}> selectByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int selectTotalRecord(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public ${tableClassModel.className}  selectById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+	public ${tableClassModel.className}  selectForUpdate(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/daoImpl.ftl b/src/main/resources/template/excelTempLateCopy/daoImpl.ftl
new file mode 100644
index 0000000..2720efa
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/daoImpl.ftl
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${tableClassModel.qualifiedClassName}">
+	<!-- 定义${tableClassModel.className} 的复杂关联map -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}Map">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	
+	<!-- 定义${tableClassModel.className} 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}SimpleMap">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		<#list tableClassModel.mapping as item> 
+			<#if item_has_next>
+			${item.column},
+			<#else>
+			${item.column}
+			</#if>
+		</#list>
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		${'#'}{item.createBy},
+		now(),
+		${'#'}{item.updateBy},
+		now(),
+		<#list tableClassModel.mapping as propertyitem>
+		<#if propertyitem_has_next>
+			${'#'}{item.${propertyitem.property}},
+			<#else>
+			${'#'}{item.${propertyitem.property}}
+			</#if>
+		</#list>	
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<#list tableClassModel.mapping as item> 
+			<if test="(record.${item.property}!=null and record.${item.property}!='') or  (record.${item.property}!='' and record.${item.property}==0)  ">
+				and ${item.column}  = ${'#'}{record.${item.property}} 
+			</if>
+			</#list>	
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="${beanQualifiedClassName}"
+		useGeneratedKeys="true" keyProperty="item.${tableClassModel.primaryKey.property}">
+		INSERT INTO ${tableClassModel.tableName} (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO ${tableClassModel.tableName} (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<if test="_parameter.containsKey('${item.property}')">
+					${item.column} = ${'#'}{${item.property}},
+				</if>		
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="${tableClassModel.primaryKey.classType}">
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<#if item.classType = "String">
+			<if test="record.${item.property} != null and record.${item.property} != '' ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			<#else>
+			<if test="record.${item.property} != null ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			</#if>	
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{record.${tableClassModel.primaryKey.property}} 
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from ${tableClassModel.tableName} where  ${tableClassModel.primaryKey.column} in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			${'#'}{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="${tableClassModel.primaryKey.classType}">
+		DELETE FROM ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="${beanQualifiedClassName}">
+		DELETE FROM ${tableClassModel.tableName}
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${'$'}{pageVo.sort} ${'$'}{pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				${'#'}{pageVo.offset},${'#'}{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from ${tableClassModel.tableName}
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.column}} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/form.ftl b/src/main/resources/template/excelTempLateCopy/form.ftl
new file mode 100644
index 0000000..6174abb
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/form.ftl
@@ -0,0 +1,82 @@
+<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
+<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
+<c:set var="path" value="${'$'}{pageContext.request.contextPath }" />
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/plugin/jquery-2.1.4.min.js"></script>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MBase.js"></script>
+</head>
+<body>
+<div class="ibox-content">
+		<form class="form-horizontal" id="dataform" onsubmit="javascripr:return false;">
+			<input type="hidden" name="tokenUrl" value="${'$'}{tokenUrl}">	 
+			<input type="hidden" name="token" value="${'$'}{token}">
+		<c:if test="${'$'}{obj ne null }">
+			<input type="hidden" name="${tableClassModel.primaryKey.property}" value="${'$'}{obj.${tableClassModel.primaryKey.property} }">
+		</c:if>
+		<#assign x = 1>
+		<#assign nodelSize = tableClassModel.mapping?size >
+		<#list tableClassModel.mapping as being>
+			<#if being.isVisible>
+			<#assign x = x + 1>
+			<#if x%2 = 0 || x = nodelSize>
+		<div class="form-group">
+			</#if>
+			<label class="col-sm-2 control-label">${being.showName}
+			<#if being.isNecessary>
+			<span class="text-danger">*</span>
+			</#if>
+			</label>
+			<div class="col-sm-4">
+				<input type="text" class="form-control" name="${being.property}" 
+					<#if being.columnLength??>
+						maxLength="${being.columnLength}" dataType="s1-${being.columnLength}"
+					</#if>
+					<#if !being.isNecessary>
+					ignore="ignore"
+					</#if>
+					value="<c:out value="${'$'}{obj.${being.property} }"></c:out>" nullmsg="${being.showName}不能为空">
+			</div>
+			<#if x%2 = 1 || x = nodelSize>
+		</div>
+			</#if>
+			</#if>
+		</#list>	
+		<div class="form-group ">
+			<div class="col-sm-12 text-center">
+				<a href="javascript:;" onclick="myForm.submit()"
+					class="btn btn-success radius"><i class="fa fa-check"></i>  保存</a>&nbsp;&nbsp;&nbsp;&nbsp; <a
+					 class="btn btn-danger radius" href="javascript:;" onclick="MTools.closeForm()" ><i class="fa fa-close"></i> 关闭</a>
+			</div>
+		</div>
+	</form>
+	</div>
+</body>
+<script type="text/javascript" src="${'$'}{path }/resource/js/systools/MJsBase.js"></script>
+<script type="text/javascript">
+	MTools.autoFullSelect();
+	$(".select2").select2();
+	var invokeUrl="${'$'}{path}/do/admin/${tableClassModel.classVariableName}/add${tableClassModel.className}";
+	<c:if test="${'$'}{obj ne null }">
+	invokeUrl = "${'$'}{path}/do/admin/${tableClassModel.classVariableName}/modify${tableClassModel.className}";
+	</c:if>
+	var myForm=MForm.initForm({
+		invokeUrl:invokeUrl,
+		afterSubmit:function(){
+			parent.myGrid.serchData();
+		},
+	});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/javaBean.ftl b/src/main/resources/template/excelTempLateCopy/javaBean.ftl
new file mode 100644
index 0000000..0da2f4b
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/javaBean.ftl
@@ -0,0 +1,41 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public class ${tableClassModel.className}  extends EntityDTO{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+<#list tableClassModel.mapping as being>
+	
+	<#if being.memo!="">
+	/**
+	 * ${being.memo}
+	 */
+	</#if>
+	private ${being.classType}  ${being.property};
+			
+</#list>	
+	
+<#list tableClassModel.mapping as being>
+
+	public ${being.classType} get${being.methodName}() {
+		return ${being.property};
+	}
+   	
+   	public void set${being.methodName}(${being.classType} ${being.property}) {
+		this.${being.property}=${being.property};
+	}
+   	
+</#list>	
+
+
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/list.ftl b/src/main/resources/template/excelTempLateCopy/list.ftl
new file mode 100644
index 0000000..b80d170
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/list.ftl
@@ -0,0 +1,132 @@
+<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
+<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
+<%@ taglib uri="http://www.zkingsoft.com" prefix="matrix"%>
+<c:set var="path" value="${'$'}{pageContext.request.contextPath }" />
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/plugin/jquery-2.1.4.min.js"></script>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MBase.js"></script>
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+		<!-- 搜索框部分start -->
+		<matrix:btn value="${tableClassModel.className}:search">
+<div class="row" >
+		<div class="col-sm-12" > 
+			<form class="form-inline" id="serchform">
+				<div class="form-group mr-20">
+					<input placeholder="请输入关键词" name="" type="text" class="form-control">
+				</div>
+				<button onclick="myGrid.serchData()" type="button"
+					class="btn btn-info btn-sm">
+					<i class="fa fa-search "></i> 搜索
+				</button>
+				<button onclick="MForm.reset('#serchform');" type="button" class="btn btn-info btn-sm">
+					<i class="fa fa-refresh "></i> 重置
+				</button>
+			</form>
+			</div>
+	</div>
+		</matrix:btn> 
+		<!-- 搜索框部分en -->
+		<div class="ibox-content radius-5 mt-5 mpanel">
+		
+	<div class="row" >
+		<div class="col-sm-12" >
+		<div class="option-bar">
+			<matrix:btn value="${tableClassModel.className}:dels"> 
+				<button onclick="myGrid.delItems('${tableClassModel.primaryKey.property}')" type="button"
+					class="btn btn-danger btn-sm">
+					<i class="fa fa-trash"></i>批量删除
+				</button>
+			</matrix:btn>
+			<matrix:btn value="${tableClassModel.className}:add"> 
+				<button onclick="openAdd()" type="button"
+					class="btn btn-success btn-sm">
+					<i class="fa fa-plus"></i> 新增
+				</button>
+			</matrix:btn>
+		</div>
+		<table id="mgrid">
+			<thead>
+				<tr>
+					<th data-checkbox="true"></th>
+					<th data-formatter="MGrid.indexfn" data-align="center"  data-width="30px" >序号</th>
+					<#list tableClassModel.mapping as being>
+						<#if being.isVisible>
+					<th data-field="${being.property}" >${being.showName}</th>
+						</#if>
+					</#list>	
+					<th data-align="center"  data-width="195px" data-field="${tableClassModel.primaryKey.property}" data-formatter="buidOperate">操作</th>
+				</tr>
+			</thead>
+		</table>
+	</div>
+</div>
+</div>
+</div>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MJsBase.js"></script>
+	<script type="text/javascript">
+		 var myGrid;
+		$(function(){
+			var delUrl="";
+			<matrix:btn value="${tableClassModel.className}:del"> 
+			delUrl="${'$'}{path}/do/admin/${tableClassModel.classVariableName}/del" ;
+			</matrix:btn>
+			myGrid=MGrid.initGrid({
+				 url:"${'$'}{path}/do/admin/${tableClassModel.classVariableName}/showList",
+				 delUrl:delUrl,
+			 });
+			
+		});
+		
+	 	function buidOperate(value, row, index){
+			var html = [];
+			<matrix:btn value="${tableClassModel.className}:edit"> 
+			html[0] = '<a  onClick="openEdit(\''+value+'\')"  title="编辑" class="fa fa-edit option"></a>'
+			</matrix:btn>
+			<matrix:btn value="${tableClassModel.className}:del"> 
+			html[1] = '<a onClick="myGrid.delItem(\''+value+'\')" title="删除" class="fa fa-close option text-danger"></a>';
+			</matrix:btn>
+			return html.join(""); 
+		} 
+		//打开添加界面
+		<matrix:btn value="${tableClassModel.className}:add"> 
+		function openAdd() {
+			layer.open({
+				type : 2,
+				title : "添加${tableClassModel.tableMemo}",
+				area : [ MUI.SIZE_L, '400px' ],
+				maxmin : true,
+				content : [ '${'$'}{path}/do/admin/${tableClassModel.classVariableName}/editForm']
+			}); 
+		}
+		</matrix:btn>
+		
+		//打开编辑界面
+		<matrix:btn value="${tableClassModel.className}:edit"> 
+		function openEdit(id) {
+			layer.open({
+				type : 2,
+				title : "编辑${tableClassModel.tableMemo}",
+				area : [ MUI.SIZE_L, '400px' ],
+				maxmin : true,
+				content : [ '${'$'}{path}/do/admin/${tableClassModel.classVariableName}/editForm?id=' + id]
+			});
+		}
+		</matrix:btn>
+	</script>
+</body>
+</html>
diff --git a/src/main/resources/template/excelTempLateCopy/mybatis-config.ftl b/src/main/resources/template/excelTempLateCopy/mybatis-config.ftl
new file mode 100644
index 0000000..8851a3b
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/mybatis-config.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+	<settings>
+		<setting name="cacheEnabled" value="false" />
+       	<setting name="lazyLoadingEnabled" value="false" />
+       	<setting name="multipleResultSetsEnabled" value="true" />
+       	<setting name="useColumnLabel" value="true" />
+       	<setting name="useGeneratedKeys" value="false" />
+       	<setting name="defaultExecutorType" value="SIMPLE" />
+       	<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+	
+	
+
+	
+	<typeAliases>
+
+	<#list alias as item> 
+	${item}
+	</#list>	
+
+	</typeAliases>
+	
+	<mappers>
+	
+		<#list mappers as item> 
+		${item}
+		</#list>	
+		
+	</mappers>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTempLateCopy/sqlFile.ftl b/src/main/resources/template/excelTempLateCopy/sqlFile.ftl
new file mode 100644
index 0000000..8054cf5
--- /dev/null
+++ b/src/main/resources/template/excelTempLateCopy/sqlFile.ftl
@@ -0,0 +1,29 @@
+
+/**
+ * ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+ CREATE TABLE ${tableClassModel.tableName}(
+  create_by varchar(100) NOT NULL COMMENT '创建人',
+  create_time datetime NOT NULL COMMENT '创建时间',
+  update_by varchar(100) NOT NULL COMMENT '更新人',
+  update_time datetime NOT NULL COMMENT '更新时间',
+<#list tableClassModel.mapping as being>
+  ${being.column} ${being.fullJdbcType}  ${being.isAllowNull}  COMMENT '${being.memo}',
+</#list>	
+PRIMARY KEY(${tableClassModel.primaryKey.column})
+)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${tableClassModel.tableMemo}';
+
+/**
+ *
+ *生成菜单的sql 默认在权限管理目录下
+ */
+INSERT INTO `sys_function` 
+VALUES 
+      ('开发者', now(), 
+      '开发者', now(), 
+      replace(uuid(), '-', ''), 
+      '', 'admin/${tableClassModel.className}-list', '否', '2', 
+      '05fb2915b39b4021a51d406473f0ee91', 
+      '${tableClassModel.tableMemo}', '4', '${tableClassModel.className}', '123', '是', null);
diff --git "a/src/main/resources/template/excelTempLateCopy/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx" "b/src/main/resources/template/excelTempLateCopy/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
new file mode 100644
index 0000000..4f23622
--- /dev/null
+++ "b/src/main/resources/template/excelTempLateCopy/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
Binary files differ
diff --git a/src/main/resources/template/excelTemplate/action.ftl b/src/main/resources/template/excelTemplate/action.ftl
new file mode 100644
index 0000000..0fd3b81
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/action.ftl
@@ -0,0 +1,88 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Controller
+@RequestMapping(value = "admin/${tableClassModel.classVariableName}")
+public class ${ClassName} extends BaseAction{
+
+	@Autowired
+	private ${tableClassModel.className}Service ${tableClassModel.classVariableName}Service;
+	
+	//记录编辑前的值Before_Edit_Value
+	public static final String BEV="${tableClassModel.className}_BEV";
+	
+	
+	/**
+	 * 列表显示
+	 */
+	@RequestMapping(value =  SAFEPATH+"/showList")
+	public @ResponseBody AjaxResult showList(${tableClassModel.className} ${tableClassModel.classVariableName}, PaginationVO pageVo) {
+		return showList(${tableClassModel.classVariableName}Service, ${tableClassModel.classVariableName}, pageVo);
+	}
+   	
+	/**
+	 * 新增
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  SAFEPATH+"/add${tableClassModel.className}")
+	public @ResponseBody AjaxResult add${tableClassModel.className}(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+	 	int i=${tableClassModel.classVariableName}Service.add(${tableClassModel.classVariableName});
+	 	if(i > 0){
+	 		return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, "${tableClassModel.tableMemo}");
+	 	}else {
+			throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
+		}
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 修改
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  SAFEPATH+"/modify${tableClassModel.className}")
+	public @ResponseBody AjaxResult modify${tableClassModel.className}(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+	   		${tableClassModel.classVariableName}.set${tableClassModel.primaryKey.methodName}(((${tableClassModel.className})WebUtil.getSessionAttribute(BEV)).get${tableClassModel.primaryKey.methodName}());
+	   		AjaxResult result=modify(${tableClassModel.classVariableName}Service, WebUtil.getSessionAttribute(BEV), ${tableClassModel.classVariableName}, "${tableClassModel.tableMemo}");
+			WebUtil.removeSessionAttribute(BEV);
+			return  result;
+	}
+	
+	
+	
+	
+   	/**
+	 * 进入修改界面
+	 */   
+	@SaveRequestToken
+   	@RequestMapping(value =  SAFEPATH+"/editForm")
+	public String editForm(${tableClassModel.primaryKey.classType} id) {
+		${tableClassModel.className} ${tableClassModel.classVariableName};
+		if (id != null) {
+			${tableClassModel.classVariableName} = ${tableClassModel.classVariableName}Service.findById(id);
+			WebUtil.getRequest().setAttribute("obj", ${tableClassModel.classVariableName});
+			WebUtil.setSessionAttribute(BEV, ${tableClassModel.classVariableName});
+		}
+		return "admin/${tableClassModel.className}-form";
+	}
+   	
+   	
+   	/**
+	 * 删除
+	 */  
+ 	@RequestMapping(value = SAFEPATH+"/del")
+	public @ResponseBody AjaxResult del(String keys) {
+		return remove(${tableClassModel.classVariableName}Service, keys);
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/dao.ftl b/src/main/resources/template/excelTemplate/dao.ftl
new file mode 100644
index 0000000..43f2ef2
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/dao.ftl
@@ -0,0 +1,38 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName}{
+
+	public int insert(@Param("item") ${tableClassModel.className} ${tableClassModel.classVariableName});
+   	
+   	public int batchInsert(@Param("list") List<${tableClassModel.className}> ${tableClassModel.classVariableName}List);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int deleteByIds(@Param("list") List<${tableClassModel.primaryKey.classType}> list);
+	
+	public int deleteById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+
+	public int deleteByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public List<${tableClassModel.className}> selectInPage(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName}, @Param("pageVo") PaginationVO pageVo);
+
+	public List<${tableClassModel.className}> selectByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int selectTotalRecord(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public ${tableClassModel.className}  selectById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+	public ${tableClassModel.className}  selectForUpdate(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/daoImpl.ftl b/src/main/resources/template/excelTemplate/daoImpl.ftl
new file mode 100644
index 0000000..2720efa
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/daoImpl.ftl
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${tableClassModel.qualifiedClassName}">
+	<!-- 定义${tableClassModel.className} 的复杂关联map -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}Map">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	
+	<!-- 定义${tableClassModel.className} 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}SimpleMap">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		<#list tableClassModel.mapping as item> 
+			<#if item_has_next>
+			${item.column},
+			<#else>
+			${item.column}
+			</#if>
+		</#list>
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		${'#'}{item.createBy},
+		now(),
+		${'#'}{item.updateBy},
+		now(),
+		<#list tableClassModel.mapping as propertyitem>
+		<#if propertyitem_has_next>
+			${'#'}{item.${propertyitem.property}},
+			<#else>
+			${'#'}{item.${propertyitem.property}}
+			</#if>
+		</#list>	
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<#list tableClassModel.mapping as item> 
+			<if test="(record.${item.property}!=null and record.${item.property}!='') or  (record.${item.property}!='' and record.${item.property}==0)  ">
+				and ${item.column}  = ${'#'}{record.${item.property}} 
+			</if>
+			</#list>	
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="${beanQualifiedClassName}"
+		useGeneratedKeys="true" keyProperty="item.${tableClassModel.primaryKey.property}">
+		INSERT INTO ${tableClassModel.tableName} (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO ${tableClassModel.tableName} (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<if test="_parameter.containsKey('${item.property}')">
+					${item.column} = ${'#'}{${item.property}},
+				</if>		
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="${tableClassModel.primaryKey.classType}">
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<#if item.classType = "String">
+			<if test="record.${item.property} != null and record.${item.property} != '' ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			<#else>
+			<if test="record.${item.property} != null ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			</#if>	
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{record.${tableClassModel.primaryKey.property}} 
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from ${tableClassModel.tableName} where  ${tableClassModel.primaryKey.column} in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			${'#'}{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="${tableClassModel.primaryKey.classType}">
+		DELETE FROM ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="${beanQualifiedClassName}">
+		DELETE FROM ${tableClassModel.tableName}
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${'$'}{pageVo.sort} ${'$'}{pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				${'#'}{pageVo.offset},${'#'}{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from ${tableClassModel.tableName}
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.column}} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/form.ftl b/src/main/resources/template/excelTemplate/form.ftl
new file mode 100644
index 0000000..6174abb
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/form.ftl
@@ -0,0 +1,82 @@
+<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
+<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
+<c:set var="path" value="${'$'}{pageContext.request.contextPath }" />
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/plugin/jquery-2.1.4.min.js"></script>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MBase.js"></script>
+</head>
+<body>
+<div class="ibox-content">
+		<form class="form-horizontal" id="dataform" onsubmit="javascripr:return false;">
+			<input type="hidden" name="tokenUrl" value="${'$'}{tokenUrl}">	 
+			<input type="hidden" name="token" value="${'$'}{token}">
+		<c:if test="${'$'}{obj ne null }">
+			<input type="hidden" name="${tableClassModel.primaryKey.property}" value="${'$'}{obj.${tableClassModel.primaryKey.property} }">
+		</c:if>
+		<#assign x = 1>
+		<#assign nodelSize = tableClassModel.mapping?size >
+		<#list tableClassModel.mapping as being>
+			<#if being.isVisible>
+			<#assign x = x + 1>
+			<#if x%2 = 0 || x = nodelSize>
+		<div class="form-group">
+			</#if>
+			<label class="col-sm-2 control-label">${being.showName}
+			<#if being.isNecessary>
+			<span class="text-danger">*</span>
+			</#if>
+			</label>
+			<div class="col-sm-4">
+				<input type="text" class="form-control" name="${being.property}" 
+					<#if being.columnLength??>
+						maxLength="${being.columnLength}" dataType="s1-${being.columnLength}"
+					</#if>
+					<#if !being.isNecessary>
+					ignore="ignore"
+					</#if>
+					value="<c:out value="${'$'}{obj.${being.property} }"></c:out>" nullmsg="${being.showName}不能为空">
+			</div>
+			<#if x%2 = 1 || x = nodelSize>
+		</div>
+			</#if>
+			</#if>
+		</#list>	
+		<div class="form-group ">
+			<div class="col-sm-12 text-center">
+				<a href="javascript:;" onclick="myForm.submit()"
+					class="btn btn-success radius"><i class="fa fa-check"></i>  保存</a>&nbsp;&nbsp;&nbsp;&nbsp; <a
+					 class="btn btn-danger radius" href="javascript:;" onclick="MTools.closeForm()" ><i class="fa fa-close"></i> 关闭</a>
+			</div>
+		</div>
+	</form>
+	</div>
+</body>
+<script type="text/javascript" src="${'$'}{path }/resource/js/systools/MJsBase.js"></script>
+<script type="text/javascript">
+	MTools.autoFullSelect();
+	$(".select2").select2();
+	var invokeUrl="${'$'}{path}/do/admin/${tableClassModel.classVariableName}/add${tableClassModel.className}";
+	<c:if test="${'$'}{obj ne null }">
+	invokeUrl = "${'$'}{path}/do/admin/${tableClassModel.classVariableName}/modify${tableClassModel.className}";
+	</c:if>
+	var myForm=MForm.initForm({
+		invokeUrl:invokeUrl,
+		afterSubmit:function(){
+			parent.myGrid.serchData();
+		},
+	});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/javaBean.ftl b/src/main/resources/template/excelTemplate/javaBean.ftl
new file mode 100644
index 0000000..0da2f4b
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/javaBean.ftl
@@ -0,0 +1,41 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public class ${tableClassModel.className}  extends EntityDTO{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+<#list tableClassModel.mapping as being>
+	
+	<#if being.memo!="">
+	/**
+	 * ${being.memo}
+	 */
+	</#if>
+	private ${being.classType}  ${being.property};
+			
+</#list>	
+	
+<#list tableClassModel.mapping as being>
+
+	public ${being.classType} get${being.methodName}() {
+		return ${being.property};
+	}
+   	
+   	public void set${being.methodName}(${being.classType} ${being.property}) {
+		this.${being.property}=${being.property};
+	}
+   	
+</#list>	
+
+
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/list.ftl b/src/main/resources/template/excelTemplate/list.ftl
new file mode 100644
index 0000000..b80d170
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/list.ftl
@@ -0,0 +1,132 @@
+<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
+<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
+<%@ taglib uri="http://www.zkingsoft.com" prefix="matrix"%>
+<c:set var="path" value="${'$'}{pageContext.request.contextPath }" />
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/plugin/jquery-2.1.4.min.js"></script>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MBase.js"></script>
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+		<!-- 搜索框部分start -->
+		<matrix:btn value="${tableClassModel.className}:search">
+<div class="row" >
+		<div class="col-sm-12" > 
+			<form class="form-inline" id="serchform">
+				<div class="form-group mr-20">
+					<input placeholder="请输入关键词" name="" type="text" class="form-control">
+				</div>
+				<button onclick="myGrid.serchData()" type="button"
+					class="btn btn-info btn-sm">
+					<i class="fa fa-search "></i> 搜索
+				</button>
+				<button onclick="MForm.reset('#serchform');" type="button" class="btn btn-info btn-sm">
+					<i class="fa fa-refresh "></i> 重置
+				</button>
+			</form>
+			</div>
+	</div>
+		</matrix:btn> 
+		<!-- 搜索框部分en -->
+		<div class="ibox-content radius-5 mt-5 mpanel">
+		
+	<div class="row" >
+		<div class="col-sm-12" >
+		<div class="option-bar">
+			<matrix:btn value="${tableClassModel.className}:dels"> 
+				<button onclick="myGrid.delItems('${tableClassModel.primaryKey.property}')" type="button"
+					class="btn btn-danger btn-sm">
+					<i class="fa fa-trash"></i>批量删除
+				</button>
+			</matrix:btn>
+			<matrix:btn value="${tableClassModel.className}:add"> 
+				<button onclick="openAdd()" type="button"
+					class="btn btn-success btn-sm">
+					<i class="fa fa-plus"></i> 新增
+				</button>
+			</matrix:btn>
+		</div>
+		<table id="mgrid">
+			<thead>
+				<tr>
+					<th data-checkbox="true"></th>
+					<th data-formatter="MGrid.indexfn" data-align="center"  data-width="30px" >序号</th>
+					<#list tableClassModel.mapping as being>
+						<#if being.isVisible>
+					<th data-field="${being.property}" >${being.showName}</th>
+						</#if>
+					</#list>	
+					<th data-align="center"  data-width="195px" data-field="${tableClassModel.primaryKey.property}" data-formatter="buidOperate">操作</th>
+				</tr>
+			</thead>
+		</table>
+	</div>
+</div>
+</div>
+</div>
+<script type="text/javascript"
+	src="${'$'}{path }/resource/js/systools/MJsBase.js"></script>
+	<script type="text/javascript">
+		 var myGrid;
+		$(function(){
+			var delUrl="";
+			<matrix:btn value="${tableClassModel.className}:del"> 
+			delUrl="${'$'}{path}/do/admin/${tableClassModel.classVariableName}/del" ;
+			</matrix:btn>
+			myGrid=MGrid.initGrid({
+				 url:"${'$'}{path}/do/admin/${tableClassModel.classVariableName}/showList",
+				 delUrl:delUrl,
+			 });
+			
+		});
+		
+	 	function buidOperate(value, row, index){
+			var html = [];
+			<matrix:btn value="${tableClassModel.className}:edit"> 
+			html[0] = '<a  onClick="openEdit(\''+value+'\')"  title="编辑" class="fa fa-edit option"></a>'
+			</matrix:btn>
+			<matrix:btn value="${tableClassModel.className}:del"> 
+			html[1] = '<a onClick="myGrid.delItem(\''+value+'\')" title="删除" class="fa fa-close option text-danger"></a>';
+			</matrix:btn>
+			return html.join(""); 
+		} 
+		//打开添加界面
+		<matrix:btn value="${tableClassModel.className}:add"> 
+		function openAdd() {
+			layer.open({
+				type : 2,
+				title : "添加${tableClassModel.tableMemo}",
+				area : [ MUI.SIZE_L, '400px' ],
+				maxmin : true,
+				content : [ '${'$'}{path}/do/admin/${tableClassModel.classVariableName}/editForm']
+			}); 
+		}
+		</matrix:btn>
+		
+		//打开编辑界面
+		<matrix:btn value="${tableClassModel.className}:edit"> 
+		function openEdit(id) {
+			layer.open({
+				type : 2,
+				title : "编辑${tableClassModel.tableMemo}",
+				area : [ MUI.SIZE_L, '400px' ],
+				maxmin : true,
+				content : [ '${'$'}{path}/do/admin/${tableClassModel.classVariableName}/editForm?id=' + id]
+			});
+		}
+		</matrix:btn>
+	</script>
+</body>
+</html>
diff --git a/src/main/resources/template/excelTemplate/mybatis-config.ftl b/src/main/resources/template/excelTemplate/mybatis-config.ftl
new file mode 100644
index 0000000..8851a3b
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/mybatis-config.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+	<settings>
+		<setting name="cacheEnabled" value="false" />
+       	<setting name="lazyLoadingEnabled" value="false" />
+       	<setting name="multipleResultSetsEnabled" value="true" />
+       	<setting name="useColumnLabel" value="true" />
+       	<setting name="useGeneratedKeys" value="false" />
+       	<setting name="defaultExecutorType" value="SIMPLE" />
+       	<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+	
+	
+
+	
+	<typeAliases>
+
+	<#list alias as item> 
+	${item}
+	</#list>	
+
+	</typeAliases>
+	
+	<mappers>
+	
+		<#list mappers as item> 
+		${item}
+		</#list>	
+		
+	</mappers>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/service.ftl b/src/main/resources/template/excelTemplate/service.ftl
new file mode 100644
index 0000000..96815de
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/service.ftl
@@ -0,0 +1,72 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description  service接口类 ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName}  extends BaseServices<${tableClassModel.className}>{
+	
+	/**
+	 * 新增
+	 */
+	public int add(${tableClassModel.className} ${tableClassModel.classVariableName});
+   	
+   	/**
+	 * 批量新增
+	 */
+	public int batchAdd(List<${tableClassModel.className}>  ${tableClassModel.classVariableName}List);
+   	
+   	/**
+	 * 根据map键值对 更新
+	 */
+	public int modifyByMap(${tableClassModel.className} old${tableClassModel.className} ,${tableClassModel.className} new${tableClassModel.className});
+	
+	/**
+	 * 根据对象 更新
+	 */
+	public int modifyByModel(${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	/**
+	 * 批量删除
+	 */
+	public int remove(List<${tableClassModel.primaryKey.classType}> list);
+
+	/**
+	 * 根据id删除
+	 */
+	public int removeById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+	/**
+	 * 根据对象删除
+	 */
+	public int removeByModel(${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	/**
+	 * 分页查询
+	 */
+	public List<${tableClassModel.className}> findInPage(${tableClassModel.className} ${tableClassModel.classVariableName}, PaginationVO pageVo);
+
+	/**
+	 * 根据对象查询
+	 */
+	public List<${tableClassModel.className}> findByModel(${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	/**
+	 * 统计记录数
+	 */
+	public int  findTotal(${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	/**
+	 * 根据id查询
+	 */
+	public ${tableClassModel.className}  findById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+
+   	
+
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/serviceImpl.ftl b/src/main/resources/template/excelTemplate/serviceImpl.ftl
new file mode 100644
index 0000000..27479fb
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/serviceImpl.ftl
@@ -0,0 +1,132 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description service接口实现类${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Service
+public class  ${ClassName} implements  ${serviceInterface}{
+
+	
+	@Autowired
+	private ${daoClassName} ${daoVariableName};
+	
+	
+	@Override
+	public int add(${tableClassModel.className} ${tableClassModel.classVariableName}){
+		// 设置基本字段信息
+		SysUsers loginUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+		${tableClassModel.classVariableName}.setCreateBy(loginUser.getSuName());
+		${tableClassModel.classVariableName}.setUpdateBy(loginUser.getSuName());
+		${tableClassModel.classVariableName}.set${tableClassModel.primaryKey.methodName}(UUIDUtil.getRandomID());
+		return ${daoVariableName}.insert(${tableClassModel.classVariableName});
+		
+	}
+	
+	@Override
+	public int batchAdd(List<${tableClassModel.className}>  ${tableClassModel.classVariableName}List) {
+		//这里没有做基本字段的设置,如有需要请自己实现	
+		int num = 0;
+		int c = 10000;
+		int size = ${tableClassModel.classVariableName}List.size()/c + 1;
+		for(int i=0; i<size; i++) {
+			int begin = i*c;
+			int end = (i+1)*c;
+			end = end >= ${tableClassModel.classVariableName}List.size() ? ${tableClassModel.classVariableName}List.size() : end;
+			List<${tableClassModel.className}> insertList = ${tableClassModel.classVariableName}List.subList(begin, end);
+			num += ${daoVariableName}.batchInsert(insertList);
+		}
+		return num;
+		
+	}
+	
+	
+   	
+    @Override
+	public int modifyByMap(${tableClassModel.className} old${tableClassModel.className}
+	,${tableClassModel.className} new${tableClassModel.className}){
+	
+		Map<String, Object> modifyMap = null;
+		try {
+			if (!ModelUtils.isModified(old${tableClassModel.className}, new${tableClassModel.className})) {
+				return MatrixConstance.DML_SUCCESSS;
+			}
+			modifyMap = ModelUtils.comparePojo2Map(old${tableClassModel.className}, new${tableClassModel.className});
+		} catch (Exception e) {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, new${tableClassModel.className});
+		}
+		if (modifyMap.size() > 0) {
+			modifyMap.put("${tableClassModel.primaryKey.property}", old${tableClassModel.className}.get${tableClassModel.primaryKey.methodName}());
+			${daoVariableName}.updateByMap(modifyMap);
+		}
+		return MatrixConstance.DML_SUCCESSS;
+	}
+	
+	@Override
+	public int modifyByModel(${tableClassModel.className} ${tableClassModel.classVariableName}){
+	
+		return ${daoVariableName}.updateByModel(${tableClassModel.classVariableName});
+	
+	}
+	
+	
+	
+	@Override
+	public int remove(List<${tableClassModel.primaryKey.classType}> list){
+	
+		return ${daoVariableName}.deleteByIds(list);
+	
+	}
+
+	@Override
+	public int removeById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property}){
+	
+		return ${daoVariableName}.deleteById(${tableClassModel.primaryKey.property});
+	
+	}
+	
+	@Override
+	public int removeByModel(${tableClassModel.className} ${tableClassModel.classVariableName}){
+	
+		return ${daoVariableName}.deleteByModel(${tableClassModel.classVariableName});
+	
+	}
+	
+	
+	@Override
+	public List<${tableClassModel.className}> findInPage(${tableClassModel.className} ${tableClassModel.classVariableName},  PaginationVO pageVo){
+	
+		return ${daoVariableName}.selectInPage(${tableClassModel.classVariableName} , pageVo);
+	
+	}
+	
+	@Override
+	public List<${tableClassModel.className}> findByModel(${tableClassModel.className} ${tableClassModel.classVariableName}){
+	
+		return ${daoVariableName}.selectByModel(${tableClassModel.classVariableName});
+	
+	}
+	
+	@Override
+	public int  findTotal(${tableClassModel.className} ${tableClassModel.classVariableName}){
+	
+		return ${daoVariableName}.selectTotalRecord(${tableClassModel.classVariableName});
+	
+	}
+	
+	@Override
+	public ${tableClassModel.className}  findById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property}){
+	
+		return ${daoVariableName}.selectById(${tableClassModel.primaryKey.property});
+	
+	}
+
+   	
+	
+	
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplate/sqlFile.ftl b/src/main/resources/template/excelTemplate/sqlFile.ftl
new file mode 100644
index 0000000..5cacf61
--- /dev/null
+++ b/src/main/resources/template/excelTemplate/sqlFile.ftl
@@ -0,0 +1,16 @@
+
+/**
+ * ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+ CREATE TABLE ${tableClassModel.tableName}(
+  create_by varchar(100) NOT NULL COMMENT '创建人',
+  create_time datetime NOT NULL COMMENT '创建时间',
+  update_by varchar(100) NOT NULL COMMENT '更新人',
+  update_time datetime NOT NULL COMMENT '更新时间',
+<#list tableClassModel.mapping as being>
+  ${being.column} ${being.fullJdbcType}  ${being.isAllowNull}  COMMENT '${being.memo}',
+</#list>	
+PRIMARY KEY(${tableClassModel.primaryKey.column})
+)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${tableClassModel.tableMemo}';
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/action.ftl b/src/main/resources/template/excelTemplateForBoot/action.ftl
new file mode 100644
index 0000000..64aed71
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/action.ftl
@@ -0,0 +1,122 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Controller
+@RequestMapping(value = "admin/${tableClassModel.classVariableName}")
+public class ${ClassName} {
+
+	@Autowired
+	private ${tableClassModel.className}Dao ${tableClassModel.classVariableName}Dao;
+	
+	//记录编辑前的值Before_Edit_Value
+	public static final String BEV="${tableClassModel.className}_BEV";
+	
+	
+	/**
+	 * 列表显示
+	 */
+	@RequestMapping(value =  "/showList")
+	public @ResponseBody AjaxResult showList(${tableClassModel.className} ${tableClassModel.classVariableName}, PaginationVO pageVo) {
+		if (pageVo == null) {
+			pageVo = new PaginationVO();
+		}
+		List<${tableClassModel.className}> dataList = ${tableClassModel.classVariableName}Dao.selectInPage(${tableClassModel.classVariableName}, pageVo);
+		AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, dataList,
+				${tableClassModel.classVariableName}Dao.selectTotalRecord(${tableClassModel.classVariableName}));
+		return result;
+	}
+   	
+	/**
+	 * 新增
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/add${tableClassModel.className}")
+	public @ResponseBody AjaxResult add${tableClassModel.className}(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+	    SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+		${tableClassModel.classVariableName}.setCreateBy(user.getSuName());
+		${tableClassModel.classVariableName}.setUpdateBy(user.getSuName());
+	 	int i=${tableClassModel.classVariableName}Dao.insert(${tableClassModel.classVariableName});
+	 	if(i > 0){
+	 		return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, "${tableClassModel.tableMemo}");
+	 	}else {
+			throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
+		}
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 修改
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/modify${tableClassModel.className}")
+	public @ResponseBody AjaxResult modify${tableClassModel.className}(${tableClassModel.className} new${tableClassModel.className}) {
+	   	${tableClassModel.className} old${tableClassModel.className} = WebUtil.getSessionAttribute(BEV);
+		int i = 0;
+		Map<String, Object> modifyMap = null;
+		try {
+			if (!ModelUtils.isModified(old${tableClassModel.className}, new${tableClassModel.className})) {
+				i = MatrixConstance.DML_SUCCESSS;
+			}
+			modifyMap = ModelUtils.comparePojo2Map(old${tableClassModel.className}, new${tableClassModel.className});
+		} catch (Exception e) {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, new${tableClassModel.className});
+		}
+		if (modifyMap.size() > 0) {
+			modifyMap.put("${tableClassModel.primaryKey.property}", old${tableClassModel.className}.get${tableClassModel.primaryKey.property?cap_first}());
+			${tableClassModel.classVariableName}Dao.updateByMap(modifyMap);
+		}
+		i = MatrixConstance.DML_SUCCESSS;
+		WebUtil.removeSessionAttribute(BEV);
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.UPDATE_SUCCES, "${tableClassModel.tableMemo}");
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL);
+		}
+	}
+	
+	
+	
+	
+   	/**
+	 * 进入修改界面
+	 */   
+	@SaveRequestToken
+   	@RequestMapping(value =  "/editForm")
+	public ModelAndView editForm(${tableClassModel.primaryKey.classType} id) {
+		${tableClassModel.className} ${tableClassModel.classVariableName} = new ${tableClassModel.className}();
+		ModelAndView modelAndView = new ModelAndView("admin/${tableClassModel.className?uncap_first}-form");
+		if (id != null) {
+			${tableClassModel.classVariableName} = ${tableClassModel.classVariableName}Dao.selectById(id);
+			WebUtil.setSessionAttribute(BEV, ${tableClassModel.classVariableName});
+		}
+		modelAndView.addObject("obj",${tableClassModel.classVariableName});
+		return modelAndView;
+	}
+   	
+   	
+   	/**
+	 * 删除
+	 */  
+ 	@RequestMapping(value = "/del")
+	public @ResponseBody AjaxResult del(String keys) {
+		List<String> ids = StringUtils.strToCollToString(keys, ",");
+		int i =  ${tableClassModel.classVariableName}Dao.deleteByIds(ids);
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.DELETE_SUCCES, i);
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_DELETE_FAIL);
+		}
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/dao.ftl b/src/main/resources/template/excelTemplateForBoot/dao.ftl
new file mode 100644
index 0000000..5e5d33d
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/dao.ftl
@@ -0,0 +1,38 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName}{
+
+	public int insert(@Param("item") ${tableClassModel.className} ${tableClassModel.classVariableName});
+   	
+   	public int batchInsert(@Param("list") List<${tableClassModel.className}> ${tableClassModel.classVariableName}List);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int deleteByIds(@Param("list") List<String> list);
+	
+	public int deleteById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+
+	public int deleteByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public List<${tableClassModel.className}> selectInPage(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName}, @Param("pageVo") PaginationVO pageVo);
+
+	public List<${tableClassModel.className}> selectByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int selectTotalRecord(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public ${tableClassModel.className}  selectById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+	public ${tableClassModel.className}  selectForUpdate(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/daoImpl.ftl b/src/main/resources/template/excelTemplateForBoot/daoImpl.ftl
new file mode 100644
index 0000000..2720efa
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/daoImpl.ftl
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${tableClassModel.qualifiedClassName}">
+	<!-- 定义${tableClassModel.className} 的复杂关联map -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}Map">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	
+	<!-- 定义${tableClassModel.className} 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}SimpleMap">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		<#list tableClassModel.mapping as item> 
+			<#if item_has_next>
+			${item.column},
+			<#else>
+			${item.column}
+			</#if>
+		</#list>
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		${'#'}{item.createBy},
+		now(),
+		${'#'}{item.updateBy},
+		now(),
+		<#list tableClassModel.mapping as propertyitem>
+		<#if propertyitem_has_next>
+			${'#'}{item.${propertyitem.property}},
+			<#else>
+			${'#'}{item.${propertyitem.property}}
+			</#if>
+		</#list>	
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<#list tableClassModel.mapping as item> 
+			<if test="(record.${item.property}!=null and record.${item.property}!='') or  (record.${item.property}!='' and record.${item.property}==0)  ">
+				and ${item.column}  = ${'#'}{record.${item.property}} 
+			</if>
+			</#list>	
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="${beanQualifiedClassName}"
+		useGeneratedKeys="true" keyProperty="item.${tableClassModel.primaryKey.property}">
+		INSERT INTO ${tableClassModel.tableName} (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO ${tableClassModel.tableName} (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<if test="_parameter.containsKey('${item.property}')">
+					${item.column} = ${'#'}{${item.property}},
+				</if>		
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="${tableClassModel.primaryKey.classType}">
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<#if item.classType = "String">
+			<if test="record.${item.property} != null and record.${item.property} != '' ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			<#else>
+			<if test="record.${item.property} != null ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			</#if>	
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{record.${tableClassModel.primaryKey.property}} 
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from ${tableClassModel.tableName} where  ${tableClassModel.primaryKey.column} in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			${'#'}{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="${tableClassModel.primaryKey.classType}">
+		DELETE FROM ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="${beanQualifiedClassName}">
+		DELETE FROM ${tableClassModel.tableName}
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${'$'}{pageVo.sort} ${'$'}{pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				${'#'}{pageVo.offset},${'#'}{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from ${tableClassModel.tableName}
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.column}} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/form.ftl b/src/main/resources/template/excelTemplateForBoot/form.ftl
new file mode 100644
index 0000000..7e9b950
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/form.ftl
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body>
+<div class="ibox-content">
+		<form class="form-horizontal" id="dataform" onsubmit="javascript:return false;">
+			<input type="hidden" name="tokenUrl" th:value="${'$'}{tokenUrl}">	 
+			<input type="hidden" name="token" th:value="${'$'}{token}">
+			<input type="hidden" name="${tableClassModel.primaryKey.property}" th:value="${'$'}{obj.${tableClassModel.primaryKey.property}}">
+		<#assign x = 1>
+		<#assign nodelSize = tableClassModel.showCount+1 >
+		<#list tableClassModel.mapping as being>
+			<#if being.isVisible>
+			<#assign x = x + 1>
+			<#if x%2 = 0 >
+		<div class="form-group">
+			</#if>
+			<label class="col-sm-2 control-label">${being.showName}
+			<#if being.isNecessary>
+			<span class="text-danger">*</span>
+			</#if>
+			</label>
+			<div class="col-sm-4">
+				<input type="text" class="form-control" name="${being.property}" 
+					<#if being.columnLength??>
+						maxLength="${being.columnLength}" dataType="s1-${being.columnLength}"
+					</#if>
+					<#if !being.isNecessary>
+					ignore="ignore"
+					</#if>
+					th:value="${'$'}{obj.${being.property}}"nullmsg="${being.showName}不能为空">
+			</div>
+			<#if x%2 = 1 || x = nodelSize>
+		</div>
+			</#if>
+			</#if>
+		</#list>	
+		<div class="form-group ">
+			<div class="col-sm-12 text-center">
+				<a href="javascript:;" onclick="myForm.submit()"
+					class="btn btn-success radius"><i class="fa fa-check"></i>  保存</a>&nbsp;&nbsp;&nbsp;&nbsp; <a
+					 class="btn btn-danger radius" href="javascript:;" onclick="MTools.closeForm()" ><i class="fa fa-close"></i> 关闭</a>
+			</div>
+		</div>
+	</form>
+	</div>
+</body>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+<script th:inline="javascript">
+	MTools.autoFullSelect();
+	$(".select2").select2();
+	
+	/*<![CDATA[*/
+	var obj=/*[[${'$'}{obj}]]*/
+	/*]]>*/
+	
+	var invokeUrl=basePath+"/admin/${tableClassModel.classVariableName}/add${tableClassModel.className}";
+	if(obj.${tableClassModel.primaryKey.property}!=null){
+	   invokeUrl = basePath+"/admin/${tableClassModel.classVariableName}/modify${tableClassModel.className}";
+	}
+	var myForm=MForm.initForm({
+		invokeUrl:invokeUrl,
+		afterSubmit:function(){
+			parent.myGrid.serchData();
+		},
+	});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/javaBean.ftl b/src/main/resources/template/excelTemplateForBoot/javaBean.ftl
new file mode 100644
index 0000000..0849348
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/javaBean.ftl
@@ -0,0 +1,42 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public class ${tableClassModel.className}  extends EntityDTO{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+<#list tableClassModel.mapping as being>
+	
+	<#if being.memo!="">
+	/**
+	 * ${being.memo}
+	 */
+	</#if>
+	private ${being.classType}  ${being.property};
+			
+</#list>	
+	
+<#list tableClassModel.mapping as being>
+
+	public ${being.classType} get${being.methodName}() {
+		return ${being.property};
+	}
+   	
+   	public ${tableClassModel.className} set${being.methodName}(${being.classType} ${being.property}) {
+		this.${being.property}=${being.property};
+		return this;
+	}
+   	
+</#list>	
+
+
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/list.ftl b/src/main/resources/template/excelTemplateForBoot/list.ftl
new file mode 100644
index 0000000..4905c30
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/list.ftl
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript"
+            th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+    <script type="text/javascript"
+            th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body class=" container-fluid">
+
+<div class="pd-10">
+
+    <!-- 搜索框部分start -->
+    <div class="row form-head">
+        <div class="col-md-4 col-xs-12">
+            <button onclick="myGrid.delItems('${tableClassModel.primaryKey.property}')" type="button"   matrix:btn="${tableClassModel.className?uncap_first}-dels"
+                    class="btn btn-danger btn-sm">
+                <i class="fa fa-trash"></i>批量删除
+            </button>
+            <button onclick="openAdd()" type="button" matrix:btn="${tableClassModel.className?uncap_first}-add"
+                    class="btn btn-success btn-sm">
+                <i class="fa fa-plus"></i> 新增
+            </button>
+        </div>
+        <div class="col-md-8 col-xs-12">
+            <div class="row">
+                <div class="col-md-11 col-xs-12" style="text-align: right">
+                    <form class="form-inline" id="serchform"  matrix:btn="${tableClassModel.className?uncap_first}-search" >
+                        <div class="input-group">
+                            <div class="btn-group search-list " data-for="search-text">
+                                <button type="button"
+                                        class="btn btn-default dropdown-toggle searchlist"
+                                        data-toggle="dropdown">
+                                    用户姓名 <span class="caret "></span>
+                                </button>
+                                <ul class="dropdown-menu" role="menu">
+                                    <li data-field="suName"><a>用户姓名</a></li>
+                                    <li data-field="suAccount"><a>账号 </a></li>
+                                </ul>
+                            </div>
+                            <div class="form-group mr-20 ml-20">
+                                <input id="search-text" name="suName" placeholder="输入查询关键词"
+                                       type="text" class="form-control">
+                            </div>
+                            <div class="form-group">
+                                <button onclick="myGrid.serchData(1)" type="button"
+                                        class="btn btn-info">
+                                    <i class="fa fa-search "></i> 搜索
+                                </button>
+                                <button type="reset" class="btn btn-info ">
+                                    <i class="fa fa-refresh "></i> 重置
+                                </button>
+                            </div>
+                        </div>
+                        <!-- 高级搜索
+                        <div class="senior-content">
+                            <div class="serch-headline">高级搜索</div>
+                            <div>
+                                <span class="serch-title">电话:</span> <input type="text" name="suTel"
+                                    class="form-control">
+                            </div>
+                            <div class="button">
+                                <button type="button" class="btn btn-info" onclick="myGrid.serchData()">确认</button>
+                                <button type="button" class="btn btn-warning serch-close">取消</button>
+                            </div>
+                        </div> -->
+                    </form>
+                </div>
+                <!--	<div class="col-md-1 text-r layui-anim" data-anim="layui-anim-up">
+                        <a class="senior-serch">高级搜索</a>
+                    </div>-->
+            </div>
+        </div>
+    </div>
+
+    <div class="row">
+        <table id="mgrid">
+            <thead>
+            <tr>
+                <th data-checkbox="true"></th>
+                <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
+                <#list tableClassModel.mapping as being>
+                    <#if being.isVisible>
+                        <th data-field="${being.property}">${being.showName}</th>
+                    </#if>
+                </#list>
+                <th data-align="center" data-width="195px" data-field="${tableClassModel.primaryKey.property}"
+                    data-formatter="buidOperate">操作
+                </th>
+            </tr>
+            </thead>
+        </table>
+    </div>
+</div>
+<script type="text/javascript"
+        th:src="@{/js/systools/MJsBase.js}"></script>
+<script type="text/javascript">
+    var myGrid;
+    $(function () {
+        var delUrl = "";
+        delUrl = basePath + "/admin/${tableClassModel.classVariableName}/del";
+        myGrid = MGrid.initGrid({
+            url: basePath + "/admin/${tableClassModel.classVariableName}/showList",
+            delUrl: delUrl,
+        });
+
+    });
+
+    function buidOperate(value, row, index) {
+        var html = "";
+        html += '<div class="btn-group">'
+            + '<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">'
+            + '操作 <span class="caret"></span>' + '</button>'
+            + '<ul class="dropdown-menu" role="menu">'
+            + '<li><a href="javascript:void(0)" style="display:'
+            + value
+            + '"  onClick="openEdit(\''
+            + value
+            + '\')" title="编辑">编辑</a></li>'
+            + '<li><a href="javascript:void(0)" style="display:'
+            + value
+            + '" onClick="myGrid.delItem(\''
+            + value
+            + '\')" title="删除">删除</a></li>' + '</ul>' + '</div>';
+        html += '';
+        return html;
+    }
+
+    //打开添加界面
+    function openAdd() {
+        layer.open({
+            type: 2,
+            title: "添加${tableClassModel.tableMemo}",
+            area: [MUI.SIZE_L, '400px'],
+            maxmin: true,
+            content: [basePath + '/admin/${tableClassModel.classVariableName}/editForm']
+        });
+    }
+
+    //打开编辑界面
+    function openEdit(id) {
+        layer.open({
+            type: 2,
+            title: "编辑${tableClassModel.tableMemo}",
+            area: [MUI.SIZE_L, '400px'],
+            maxmin: true,
+            content: [basePath + '/admin/${tableClassModel.classVariableName}/editForm?id=' + id]
+        });
+    }
+</script>
+</body>
+</html>
diff --git a/src/main/resources/template/excelTemplateForBoot/mybatis-config.ftl b/src/main/resources/template/excelTemplateForBoot/mybatis-config.ftl
new file mode 100644
index 0000000..8851a3b
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/mybatis-config.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+	<settings>
+		<setting name="cacheEnabled" value="false" />
+       	<setting name="lazyLoadingEnabled" value="false" />
+       	<setting name="multipleResultSetsEnabled" value="true" />
+       	<setting name="useColumnLabel" value="true" />
+       	<setting name="useGeneratedKeys" value="false" />
+       	<setting name="defaultExecutorType" value="SIMPLE" />
+       	<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+	
+	
+
+	
+	<typeAliases>
+
+	<#list alias as item> 
+	${item}
+	</#list>	
+
+	</typeAliases>
+	
+	<mappers>
+	
+		<#list mappers as item> 
+		${item}
+		</#list>	
+		
+	</mappers>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForBoot/sqlFile.ftl b/src/main/resources/template/excelTemplateForBoot/sqlFile.ftl
new file mode 100644
index 0000000..47e8287
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForBoot/sqlFile.ftl
@@ -0,0 +1,46 @@
+
+/**
+ * ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+ CREATE TABLE ${tableClassModel.tableName}(
+  create_by varchar(100) NOT NULL COMMENT '创建人',
+  create_time datetime NOT NULL COMMENT '创建时间',
+  update_by varchar(100) NOT NULL COMMENT '更新人',
+  update_time datetime NOT NULL COMMENT '更新时间',
+<#list tableClassModel.mapping as being>
+<#if being.column = tableClassModel.primaryKey.column && being.fullJdbcType = "int">
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull} AUTO_INCREMENT  COMMENT '${being.memo}',
+ <#else>
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull}  COMMENT '${being.memo}',
+</#if>
+ 
+</#list>	
+PRIMARY KEY(${tableClassModel.primaryKey.column})
+)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${tableClassModel.tableMemo}';
+
+/**
+ *
+ *生成菜单的sql 默认在权限管理目录下 根据不同的主键类型生成不同的菜单SQL
+ */
+ <#if  tableClassModel.primaryKey.fullJdbcType = "int">
+INSERT INTO `sys_function` 
+VALUES 
+      ('开发者', now(), 
+      '开发者', now(), 
+      null, 
+      '', 'biz/${tableClassModel.className?uncap_first}-list', '否', '2', 
+      1, 
+      '${tableClassModel.tableMemo}', '4', '${tableClassModel.className?uncap_first}', '123', '是', null);
+ <#else>
+INSERT INTO `sys_function` 
+VALUES 
+      ('开发者', now(), 
+      '开发者', now(), 
+      replace(uuid(), '-', ''), 
+      '', 'biz/${tableClassModel.className?uncap_first}-list', '否', '2', 
+      '05fb2915b39b4021a51d406473f0ee91', 
+      '${tableClassModel.tableMemo}', '4', '${tableClassModel.className?uncap_first}', '123', '是', null);
+</#if>
+
diff --git "a/src/main/resources/template/excelTemplateForBoot/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx" "b/src/main/resources/template/excelTemplateForBoot/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
new file mode 100644
index 0000000..4f23622
--- /dev/null
+++ "b/src/main/resources/template/excelTemplateForBoot/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
Binary files differ
diff --git a/src/main/resources/template/excelTemplateForCloud/action.ftl b/src/main/resources/template/excelTemplateForCloud/action.ftl
new file mode 100644
index 0000000..6f2a931
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/action.ftl
@@ -0,0 +1,81 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Controller
+@RequestMapping(value = "admin/${tableClassModel.classVariableName}")
+public class ${ClassName} {
+
+	@Autowired
+	private ${tableClassModel.className}Dao ${tableClassModel.classVariableName}Dao;
+	@Autowired
+	RedisUserLoginUtils redisUserLoginUtils;
+	
+	/**
+	 * 列表显示
+	 */
+	@RequestMapping(value =  "/showList")
+	public @ResponseBody AjaxResult showList(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		List<${tableClassModel.className}> dataList = ${tableClassModel.classVariableName}Dao.selectInPage(${tableClassModel.classVariableName});
+		AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, dataList,
+				${tableClassModel.classVariableName}Dao.selectTotalRecord(${tableClassModel.classVariableName}));
+		return result;
+	}
+   	
+	/**
+	 * 新增
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/add${tableClassModel.className}")
+	public @ResponseBody AjaxResult add${tableClassModel.className}(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		SysUsers user = redisUserLoginUtils.getLoginUser(SysUsers.class);
+		${tableClassModel.classVariableName}.setCreateBy(user.getSuName());
+		${tableClassModel.classVariableName}.setUpdateBy(user.getSuName());
+	 	int i=${tableClassModel.classVariableName}Dao.insert(${tableClassModel.classVariableName});
+	 	if(i > 0){
+	 		return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, "${tableClassModel.tableMemo}");
+	 	}else {
+			throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
+		}
+	}
+
+	
+	/**
+	 * 修改
+	 */   
+	@RemoveRequestToken	
+   	@RequestMapping(value =  "/modify${tableClassModel.className}")
+	public @ResponseBody AjaxResult modify${tableClassModel.className}(${tableClassModel.className} new${tableClassModel.className}) {
+		int i = ${tableClassModel.classVariableName}Dao.updateByModel(new${tableClassModel.className});
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.UPDATE_SUCCES, "${tableClassModel.tableMemo}");
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL);
+		}
+	}
+
+   	
+   	/**
+	 * 删除
+	 */  
+ 	@RequestMapping(value = "/del")
+	public @ResponseBody AjaxResult del(String keys) {
+		SysUsers user = redisUserLoginUtils.getLoginUser(SysUsers.class);
+        Long companyId = user.getCompanyId();
+		List<String> ids = StringUtils.strToCollToString(keys, ",");
+		int i =  ${tableClassModel.classVariableName}Dao.deleteByIds(ids,companyId);
+		if (i > 0) {
+			return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.DELETE_SUCCES, i);
+		} else {
+			throw new GlobleException(SystemErrorCode.DATA_DELETE_FAIL);
+		}
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/dao.ftl b/src/main/resources/template/excelTemplateForCloud/dao.ftl
new file mode 100644
index 0000000..114308b
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/dao.ftl
@@ -0,0 +1,40 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName}{
+
+	public int insert(@Param("item") ${tableClassModel.className} ${tableClassModel.classVariableName});
+   	
+   	public int batchInsert(@Param("list") List<${tableClassModel.className}> ${tableClassModel.classVariableName}List);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+
+	public int compelUpdateByModel(@Param("record")${tableClassModel.className} ${tableClassModel.classVariableName});
+
+	public int updateByModel(@Param("record")${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int deleteByIds(@Param("list") List<String> list , @Param("companyId") Long companyId);
+	
+	public int deleteById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property}, Long companyId);
+
+	public int deleteByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public List<${tableClassModel.className}> selectInPage(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+
+	public List<${tableClassModel.className}> selectByModel(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public int selectTotalRecord(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+	
+	public ${tableClassModel.className}  selectById(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+	public ${tableClassModel.className}  selectForUpdate(${tableClassModel.primaryKey.classType} ${tableClassModel.primaryKey.property});
+	
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/daoImpl.ftl b/src/main/resources/template/excelTemplateForCloud/daoImpl.ftl
new file mode 100644
index 0000000..e31a570
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/daoImpl.ftl
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${tableClassModel.qualifiedClassName}">
+	<!-- 定义${tableClassModel.className} 的复杂关联map -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}Map">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	
+	<!-- 定义${tableClassModel.className} 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}SimpleMap">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>	
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		<#list tableClassModel.mapping as item> 
+			<#if item_has_next>
+			${item.column},
+			<#else>
+			${item.column}
+			</#if>
+		</#list>
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		${'#'}{item.createBy},
+		now(),
+		${'#'}{item.updateBy},
+		now(),
+		<#list tableClassModel.mapping as propertyitem>
+		<#if propertyitem_has_next>
+			${'#'}{item.${propertyitem.property}},
+			<#else>
+			${'#'}{item.${propertyitem.property}}
+			</#if>
+		</#list>	
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<#list tableClassModel.mapping as item> 
+			<if test="(record.${item.property}!=null and record.${item.property}!='') or  (record.${item.property}!='' and record.${item.property}==0)  ">
+				and ${item.column}  = ${'#'}{record.${item.property}} 
+			</if>
+			</#list>	
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="${beanQualifiedClassName}"
+		useGeneratedKeys="true" keyProperty="item.${tableClassModel.primaryKey.property}">
+		INSERT INTO ${tableClassModel.tableName} (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO ${tableClassModel.tableName} (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			update_time = now(),
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<if test="_parameter.containsKey('${item.property}')">
+					${item.column} = ${'#'}{${item.property}},
+				</if>		
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="${tableClassModel.primaryKey.classType}">
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			update_time = now(),
+			<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+			<#if item.classType = "String">
+			<if test="record.${item.property} != null and record.${item.property} != '' ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			<#else>
+			<if test="record.${item.property} != null ">
+				${item.column}  = ${'#'}{record.${item.property}}, 
+			</if>
+			</#if>	
+			</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{record.${tableClassModel.primaryKey.property}} 
+	</update>
+
+	<!--  根据对象更新 部分更新(Integer和String类型为空时也会更新)   -->
+	<update id="compelUpdateByModel" parameterType="${tableClassModel.primaryKey.classType}">
+		UPDATE ${tableClassModel.tableName}
+		<set>
+			update_time = now(),
+			<#list tableClassModel.mapping as item>
+				<#if !item.isPrimaryKey>
+					<#if item.classType = "String">
+						<if test="record.${item.property} != null">
+							${item.column}  = ${'#'}{record.${item.property}},
+						</if>
+					<#else>
+						<if test="record.${item.property} != '' ">
+							${item.column}  = ${'#'}{record.${item.property}},
+						</if>
+					</#if>
+				</#if>
+			</#list>
+		</set>
+		WHERE ${tableClassModel.primaryKey.column}=${'#'}{record.${tableClassModel.primaryKey.property}}
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from ${tableClassModel.tableName} where  ${tableClassModel.primaryKey.column} in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			${'#'}{item}
+		</foreach>
+		and company_id = ${'#'}{companyId}
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="${tableClassModel.primaryKey.classType}">
+		DELETE FROM ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}}
+		       and company_id = ${'#'}{companyId}
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="${beanQualifiedClassName}">
+		DELETE FROM ${tableClassModel.tableName}
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="record !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="record.sort !=null  and record.order !=null">
+				order by
+				${'$'}{record.sort} ${'$'}{record.order}
+			</if>
+			<if test="record.offset >=0  and record.limit >0">
+				limit
+				${'#'}{record.offset},${'#'}{record.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from ${tableClassModel.tableName}
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.property}} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		where  ${tableClassModel.primaryKey.column}=${'#'}{${tableClassModel.primaryKey.column}} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="${tableClassModel.className}Map">
+		select 
+		<include refid="columns" ></include>
+		from ${tableClassModel.tableName}
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/form.ftl b/src/main/resources/template/excelTemplateForCloud/form.ftl
new file mode 100644
index 0000000..7e9b950
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/form.ftl
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body>
+<div class="ibox-content">
+		<form class="form-horizontal" id="dataform" onsubmit="javascript:return false;">
+			<input type="hidden" name="tokenUrl" th:value="${'$'}{tokenUrl}">	 
+			<input type="hidden" name="token" th:value="${'$'}{token}">
+			<input type="hidden" name="${tableClassModel.primaryKey.property}" th:value="${'$'}{obj.${tableClassModel.primaryKey.property}}">
+		<#assign x = 1>
+		<#assign nodelSize = tableClassModel.showCount+1 >
+		<#list tableClassModel.mapping as being>
+			<#if being.isVisible>
+			<#assign x = x + 1>
+			<#if x%2 = 0 >
+		<div class="form-group">
+			</#if>
+			<label class="col-sm-2 control-label">${being.showName}
+			<#if being.isNecessary>
+			<span class="text-danger">*</span>
+			</#if>
+			</label>
+			<div class="col-sm-4">
+				<input type="text" class="form-control" name="${being.property}" 
+					<#if being.columnLength??>
+						maxLength="${being.columnLength}" dataType="s1-${being.columnLength}"
+					</#if>
+					<#if !being.isNecessary>
+					ignore="ignore"
+					</#if>
+					th:value="${'$'}{obj.${being.property}}"nullmsg="${being.showName}不能为空">
+			</div>
+			<#if x%2 = 1 || x = nodelSize>
+		</div>
+			</#if>
+			</#if>
+		</#list>	
+		<div class="form-group ">
+			<div class="col-sm-12 text-center">
+				<a href="javascript:;" onclick="myForm.submit()"
+					class="btn btn-success radius"><i class="fa fa-check"></i>  保存</a>&nbsp;&nbsp;&nbsp;&nbsp; <a
+					 class="btn btn-danger radius" href="javascript:;" onclick="MTools.closeForm()" ><i class="fa fa-close"></i> 关闭</a>
+			</div>
+		</div>
+	</form>
+	</div>
+</body>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+<script th:inline="javascript">
+	MTools.autoFullSelect();
+	$(".select2").select2();
+	
+	/*<![CDATA[*/
+	var obj=/*[[${'$'}{obj}]]*/
+	/*]]>*/
+	
+	var invokeUrl=basePath+"/admin/${tableClassModel.classVariableName}/add${tableClassModel.className}";
+	if(obj.${tableClassModel.primaryKey.property}!=null){
+	   invokeUrl = basePath+"/admin/${tableClassModel.classVariableName}/modify${tableClassModel.className}";
+	}
+	var myForm=MForm.initForm({
+		invokeUrl:invokeUrl,
+		afterSubmit:function(){
+			parent.myGrid.serchData();
+		},
+	});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/javaBean.ftl b/src/main/resources/template/excelTemplateForCloud/javaBean.ftl
new file mode 100644
index 0000000..efb556f
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/javaBean.ftl
@@ -0,0 +1,42 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>	
+
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public class ${tableClassModel.className}  extends EntityDTOExt{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+<#list tableClassModel.mapping as being>
+	
+	<#if being.memo!="">
+	/**
+	 * ${being.memo}
+	 */
+	</#if>
+	private ${being.classType}  ${being.property};
+			
+</#list>	
+	
+<#list tableClassModel.mapping as being>
+
+	public ${being.classType} get${being.methodName}() {
+		return ${being.property};
+	}
+   	
+   	public ${tableClassModel.className} set${being.methodName}(${being.classType} ${being.property}) {
+		this.${being.property}=${being.property};
+		return this;
+	}
+   	
+</#list>	
+
+
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/list.ftl b/src/main/resources/template/excelTemplateForCloud/list.ftl
new file mode 100644
index 0000000..4905c30
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/list.ftl
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript"
+            th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+    <script type="text/javascript"
+            th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body class=" container-fluid">
+
+<div class="pd-10">
+
+    <!-- 搜索框部分start -->
+    <div class="row form-head">
+        <div class="col-md-4 col-xs-12">
+            <button onclick="myGrid.delItems('${tableClassModel.primaryKey.property}')" type="button"   matrix:btn="${tableClassModel.className?uncap_first}-dels"
+                    class="btn btn-danger btn-sm">
+                <i class="fa fa-trash"></i>批量删除
+            </button>
+            <button onclick="openAdd()" type="button" matrix:btn="${tableClassModel.className?uncap_first}-add"
+                    class="btn btn-success btn-sm">
+                <i class="fa fa-plus"></i> 新增
+            </button>
+        </div>
+        <div class="col-md-8 col-xs-12">
+            <div class="row">
+                <div class="col-md-11 col-xs-12" style="text-align: right">
+                    <form class="form-inline" id="serchform"  matrix:btn="${tableClassModel.className?uncap_first}-search" >
+                        <div class="input-group">
+                            <div class="btn-group search-list " data-for="search-text">
+                                <button type="button"
+                                        class="btn btn-default dropdown-toggle searchlist"
+                                        data-toggle="dropdown">
+                                    用户姓名 <span class="caret "></span>
+                                </button>
+                                <ul class="dropdown-menu" role="menu">
+                                    <li data-field="suName"><a>用户姓名</a></li>
+                                    <li data-field="suAccount"><a>账号 </a></li>
+                                </ul>
+                            </div>
+                            <div class="form-group mr-20 ml-20">
+                                <input id="search-text" name="suName" placeholder="输入查询关键词"
+                                       type="text" class="form-control">
+                            </div>
+                            <div class="form-group">
+                                <button onclick="myGrid.serchData(1)" type="button"
+                                        class="btn btn-info">
+                                    <i class="fa fa-search "></i> 搜索
+                                </button>
+                                <button type="reset" class="btn btn-info ">
+                                    <i class="fa fa-refresh "></i> 重置
+                                </button>
+                            </div>
+                        </div>
+                        <!-- 高级搜索
+                        <div class="senior-content">
+                            <div class="serch-headline">高级搜索</div>
+                            <div>
+                                <span class="serch-title">电话:</span> <input type="text" name="suTel"
+                                    class="form-control">
+                            </div>
+                            <div class="button">
+                                <button type="button" class="btn btn-info" onclick="myGrid.serchData()">确认</button>
+                                <button type="button" class="btn btn-warning serch-close">取消</button>
+                            </div>
+                        </div> -->
+                    </form>
+                </div>
+                <!--	<div class="col-md-1 text-r layui-anim" data-anim="layui-anim-up">
+                        <a class="senior-serch">高级搜索</a>
+                    </div>-->
+            </div>
+        </div>
+    </div>
+
+    <div class="row">
+        <table id="mgrid">
+            <thead>
+            <tr>
+                <th data-checkbox="true"></th>
+                <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
+                <#list tableClassModel.mapping as being>
+                    <#if being.isVisible>
+                        <th data-field="${being.property}">${being.showName}</th>
+                    </#if>
+                </#list>
+                <th data-align="center" data-width="195px" data-field="${tableClassModel.primaryKey.property}"
+                    data-formatter="buidOperate">操作
+                </th>
+            </tr>
+            </thead>
+        </table>
+    </div>
+</div>
+<script type="text/javascript"
+        th:src="@{/js/systools/MJsBase.js}"></script>
+<script type="text/javascript">
+    var myGrid;
+    $(function () {
+        var delUrl = "";
+        delUrl = basePath + "/admin/${tableClassModel.classVariableName}/del";
+        myGrid = MGrid.initGrid({
+            url: basePath + "/admin/${tableClassModel.classVariableName}/showList",
+            delUrl: delUrl,
+        });
+
+    });
+
+    function buidOperate(value, row, index) {
+        var html = "";
+        html += '<div class="btn-group">'
+            + '<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">'
+            + '操作 <span class="caret"></span>' + '</button>'
+            + '<ul class="dropdown-menu" role="menu">'
+            + '<li><a href="javascript:void(0)" style="display:'
+            + value
+            + '"  onClick="openEdit(\''
+            + value
+            + '\')" title="编辑">编辑</a></li>'
+            + '<li><a href="javascript:void(0)" style="display:'
+            + value
+            + '" onClick="myGrid.delItem(\''
+            + value
+            + '\')" title="删除">删除</a></li>' + '</ul>' + '</div>';
+        html += '';
+        return html;
+    }
+
+    //打开添加界面
+    function openAdd() {
+        layer.open({
+            type: 2,
+            title: "添加${tableClassModel.tableMemo}",
+            area: [MUI.SIZE_L, '400px'],
+            maxmin: true,
+            content: [basePath + '/admin/${tableClassModel.classVariableName}/editForm']
+        });
+    }
+
+    //打开编辑界面
+    function openEdit(id) {
+        layer.open({
+            type: 2,
+            title: "编辑${tableClassModel.tableMemo}",
+            area: [MUI.SIZE_L, '400px'],
+            maxmin: true,
+            content: [basePath + '/admin/${tableClassModel.classVariableName}/editForm?id=' + id]
+        });
+    }
+</script>
+</body>
+</html>
diff --git a/src/main/resources/template/excelTemplateForCloud/mybatis-config.ftl b/src/main/resources/template/excelTemplateForCloud/mybatis-config.ftl
new file mode 100644
index 0000000..8851a3b
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/mybatis-config.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+	<settings>
+		<setting name="cacheEnabled" value="false" />
+       	<setting name="lazyLoadingEnabled" value="false" />
+       	<setting name="multipleResultSetsEnabled" value="true" />
+       	<setting name="useColumnLabel" value="true" />
+       	<setting name="useGeneratedKeys" value="false" />
+       	<setting name="defaultExecutorType" value="SIMPLE" />
+       	<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+	
+	
+
+	
+	<typeAliases>
+
+	<#list alias as item> 
+	${item}
+	</#list>	
+
+	</typeAliases>
+	
+	<mappers>
+	
+		<#list mappers as item> 
+		${item}
+		</#list>	
+		
+	</mappers>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForCloud/sqlFile.ftl b/src/main/resources/template/excelTemplateForCloud/sqlFile.ftl
new file mode 100644
index 0000000..7b20fd3
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForCloud/sqlFile.ftl
@@ -0,0 +1,54 @@
+
+/**
+ * ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+ CREATE TABLE ${tableClassModel.tableName}(
+  create_by varchar(100) NOT NULL COMMENT '创建人',
+  create_time datetime NOT NULL COMMENT '创建时间',
+  update_by varchar(100) NOT NULL COMMENT '更新人',
+  update_time datetime NOT NULL COMMENT '更新时间',
+<#list tableClassModel.mapping as being>
+<#if being.column = tableClassModel.primaryKey.column && being.jdbcType = "int">
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull} AUTO_INCREMENT  COMMENT '${being.memo}',
+ <#else>
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull}  COMMENT '${being.memo}',
+</#if>
+ 
+</#list>	
+PRIMARY KEY(${tableClassModel.primaryKey.column})
+)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${tableClassModel.tableMemo}';
+
+<#list tableClassModel.mapping as being>
+<#if (being.indexName)??>
+  ALTER TABLE ${tableClassModel.tableName}
+  ADD INDEX ${being.indexName} (${being.column}) USING BTREE ;
+</#if>
+</#list>
+
+
+/**
+ *
+ *生成菜单的sql 默认在权限管理目录下 根据不同的主键类型生成不同的菜单SQL
+ */
+ <#if  tableClassModel.primaryKey.fullJdbcType = "int">
+INSERT INTO `sys_function` 
+VALUES 
+      ('开发者', now(), 
+      '开发者', now(), 
+      null, 
+      '', 'biz/${tableClassModel.className?uncap_first}-list', '否', '2', 
+      1, 
+      '${tableClassModel.tableMemo}', '4', '${tableClassModel.className?uncap_first}', '123', '是', null);
+ <#else>
+INSERT INTO `sys_function` 
+VALUES 
+      ('开发者', now(), 
+      '开发者', now(), 
+      replace(uuid(), '-', ''), 
+      '', 'biz/${tableClassModel.className?uncap_first}-list', '否', '2', 
+      '05fb2915b39b4021a51d406473f0ee91', 
+      '${tableClassModel.tableMemo}', '4', '${tableClassModel.className?uncap_first}', '123', '是', null);
+</#if>
+
diff --git "a/src/main/resources/template/excelTemplateForCloud/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx" "b/src/main/resources/template/excelTemplateForCloud/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
new file mode 100644
index 0000000..4f23622
--- /dev/null
+++ "b/src/main/resources/template/excelTemplateForCloud/\346\225\260\346\215\256\345\255\227\345\205\270\350\241\250\050\346\250\241\346\235\277\051.xlsx"
Binary files differ
diff --git a/src/main/resources/template/excelTemplateForHis/action.ftl b/src/main/resources/template/excelTemplateForHis/action.ftl
new file mode 100644
index 0000000..bcc0898
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/action.ftl
@@ -0,0 +1,71 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>
+import com.matrix.core.pojo.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Api(value=" ${tableClassModel.tableMemo}",tags={" ${tableClassModel.tableMemo}接口"})
+@RestController
+@RequestMapping(value = "/${tableClassModel.classVariableName}")
+public class ${ClassName} {
+
+	@Autowired
+	private ${tableClassModel.className}Service ${tableClassModel.classVariableName}Service;
+
+	/**
+	 * 列表显示
+	 */
+	@ApiOperation("列表显示")
+	@PostMapping(value =  "/showList")
+	public  AjaxResult showList(@RequestBody ${tableClassModel.className} ${tableClassModel.classVariableName}) {
+
+		return	${tableClassModel.classVariableName}Service.showList(${tableClassModel.classVariableName});
+	}
+   	
+	/**
+	 * 新增
+	 */
+	@ApiOperation("新增")
+   	@PostMapping(value =  "/su/add")
+	public  AjaxResult add${tableClassModel.className}(@RequestBody ${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		return	${tableClassModel.classVariableName}Service.add(${tableClassModel.classVariableName});
+	}
+
+	
+	/**
+	 * 修改
+	 */
+	@ApiOperation("修改")
+   	@PostMapping(value =  "/su/modify")
+	public  AjaxResult modify(@RequestBody ${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		return	${tableClassModel.classVariableName}Service.modify(${tableClassModel.classVariableName});
+	}
+
+   	
+   	/**
+	 * 批量删除
+	 */
+	@ApiOperation("批量删除")
+	@PostMapping(value = "/su/deleteIds")
+	public  AjaxResult del(String ids) {
+		return	${tableClassModel.classVariableName}Service.del(ids);
+	}
+	/**
+	* 删除
+	*/
+	@ApiOperation("删除")
+	@PostMapping(value = "/su/delete")
+	public  AjaxResult deleteByPrimaryKey(Integer id) {
+	return	${tableClassModel.classVariableName}Service.deleteByPrimaryKey(id);
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/dao.ftl b/src/main/resources/template/excelTemplateForHis/dao.ftl
new file mode 100644
index 0000000..1f6ca5e
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/dao.ftl
@@ -0,0 +1,15 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>
+import com.xincheng.common.dao.BaseMapper;
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+public interface ${ClassName} extends BaseMapper<${tableClassModel.className}>{
+  List<${tableClassModel.className}> selectByKeyword(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+  Integer selectCountByKeyword(@Param("record") ${tableClassModel.className} ${tableClassModel.classVariableName});
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/daoImpl.ftl b/src/main/resources/template/excelTemplateForHis/daoImpl.ftl
new file mode 100644
index 0000000..e21a678
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/daoImpl.ftl
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${tableClassModel.qualifiedClassName}">
+	<!-- 定义${tableClassModel.className} 的复杂关联map -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}Map">
+		<id property="${tableClassModel.primaryKey.property}" column="${tableClassModel.primaryKey.column}" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<result property="createDeptId" column="create_dept_id" />
+		<result property="createStoreId" column="create_store_id" />
+		<result property="companyId" column="company_id" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+		<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>
+	</resultMap>
+	
+	
+	<!-- 定义${tableClassModel.className} 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="${beanQualifiedClassName}" id="${tableClassModel.className}SimpleMap">
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+		<result property="createDeptId" column="create_dept_id" />
+		<result property="createStoreId" column="create_store_id" />
+		<result property="companyId" column="company_id" />
+		<#list tableClassModel.mapping as item>
+			<#if !item.isPrimaryKey>
+		<result property="${item.property}" column="${item.column}" />
+			</#if>
+		</#list>
+	</resultMap>
+
+	<sql id="columns">
+		${r'${alias}'}.create_by ${r'${columnPrefix}'}create_by,
+		${r'${alias}'}.create_time ${r'${columnPrefix}'}create_time,
+		${r'${alias}'}.update_by ${r'${columnPrefix}'}update_by,
+		${r'${alias}'}.update_time ${r'${columnPrefix}'}update_time,
+		${r'${alias}'}.create_dept_id ${r'${columnPrefix}'}create_dept_id,
+		${r'${alias}'}.create_store_id ${r'${columnPrefix}'}create_store_id,
+		${r'${alias}'}.company_id ${r'${columnPrefix}'}company_id,
+		<#list tableClassModel.mapping as item>
+			<#if item_has_next>
+		${r'${alias}'}.${item.column}  ${r'${columnPrefix}'}${item.column},
+			<#else>
+		${r'${alias}'}.${item.column} ${r'${columnPrefix}'}${item.column}
+			</#if>
+		</#list>
+	</sql>
+	<!-- where sql -->
+	<sql id="keyword_where_sql">
+
+		<if test="record!=null">
+			<if test="(record.companyId!=null and record.companyId!='')">
+				and ${r'${alias}'}.company_id  =  ${'#'}{record.companyId}
+			</if>
+			<if test="(record.createStoreId!=null and record.createStoreId!='')">
+				and ${r'${alias}'}.create_store_id  =  ${'#'}{record.createStoreId}
+			</if>
+			<if test="(record.createDeptId!=null and record.createDeptId!='')">
+				and ${r'${alias}'}.create_dept_id  =  ${'#'}{record.createDeptId}
+			</if>
+			<#list tableClassModel.mapping as item>
+				<#if item.classType=="String">
+					<if test="(record.${item.property}!=null and record.${item.property}!='')">
+						and ${r'${alias}'}.${item.column}  = ${'#'}{record.${item.property}}
+					</if>
+				<#else>
+				<if test="(record.${item.property}!=null)">
+					and ${r'${alias}'}.${item.column}  = ${'#'}{record.${item.property}}
+				</if>
+				</#if>
+			</#list>
+		</if>
+
+	</sql>
+	<!-- 分页查询 -->
+	<select id="selectByKeyword" resultMap="${tableClassModel.className}Map">
+		select
+		<include refid="columns" >
+			<property name="alias" value="a"/>
+			<property name="columnPrefix" value=""/>
+		</include>
+		from ${tableClassModel.tableName} a
+		<where>
+			<include refid="keyword_where_sql"><property name="alias" value="a"/></include>
+		</where>
+	</select>
+
+	<!-- 查询总条数 -->
+	<select id="selectCountByKeyword" parameterType="long"   resultType="java.lang.Integer">
+		select count(a.id)
+		from ${tableClassModel.tableName} a
+		<where>
+			<include refid="keyword_where_sql"><property name="alias" value="a"/></include>
+		</where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/javaBean.ftl b/src/main/resources/template/excelTemplateForHis/javaBean.ftl
new file mode 100644
index 0000000..5645c0c
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/javaBean.ftl
@@ -0,0 +1,49 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import com.xincheng.common.bean.EntityShoptTkDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Data
+@Table(name = "${tableClassModel.tableName}")
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value="${tableClassModel.tableMemo}",description="${tableClassModel.tableMemo}")
+public class ${tableClassModel.className}  extends EntityShoptTkDTO{
+	@Transient
+	private static final long serialVersionUID = 1L; 
+
+<#list tableClassModel.mapping as being>
+	<#if being.column = tableClassModel.primaryKey.column && being.jdbcType = "int">
+	@Id
+	@GeneratedValue(generator = "JDBC")
+	private ${being.classType}  ${being.property};
+	<#else>
+	<#if being.memo!="">
+	/**
+	* ${being.memo}
+	*/
+	@ApiModelProperty(value="${being.memo}",name="${being.memo}",example="")
+	</#if>
+	@Column(name = "${being.column}")
+	private ${being.classType}  ${being.property};
+	</#if>
+</#list>
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/mybatis-config.ftl b/src/main/resources/template/excelTemplateForHis/mybatis-config.ftl
new file mode 100644
index 0000000..8851a3b
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/mybatis-config.ftl
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+
+<configuration>
+	<settings>
+		<setting name="cacheEnabled" value="false" />
+       	<setting name="lazyLoadingEnabled" value="false" />
+       	<setting name="multipleResultSetsEnabled" value="true" />
+       	<setting name="useColumnLabel" value="true" />
+       	<setting name="useGeneratedKeys" value="false" />
+       	<setting name="defaultExecutorType" value="SIMPLE" />
+       	<setting name="defaultStatementTimeout" value="25000" />
+	</settings>
+	
+	
+
+	
+	<typeAliases>
+
+	<#list alias as item> 
+	${item}
+	</#list>	
+
+	</typeAliases>
+	
+	<mappers>
+	
+		<#list mappers as item> 
+		${item}
+		</#list>	
+		
+	</mappers>
+</configuration>
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/service.ftl b/src/main/resources/template/excelTemplateForHis/service.ftl
new file mode 100644
index 0000000..dcdb692
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/service.ftl
@@ -0,0 +1,92 @@
+package ${codeModel.packageName};
+
+<#list importList?keys as key>
+import ${importList[key]};
+</#list>
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.matrix.core.constance.SystemErrorCode;
+import com.matrix.core.constance.SystemMessageCode;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.stream.Collectors;
+/**
+ * @description ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+@Service
+public class ${ClassName} {
+
+	@Autowired
+	private ${tableClassModel.className}Dao ${tableClassModel.classVariableName}Dao;
+
+	/**
+	 * 列表显示
+	 */
+	public  AjaxResult showList(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		if (${tableClassModel.classVariableName}.getLimit() != null && ${tableClassModel.classVariableName}.getOffset() != null&&${tableClassModel.classVariableName}.getLimit() !=0) {
+			PageHelper.startPage((${tableClassModel.classVariableName}.getOffset()/${tableClassModel.classVariableName}.getLimit())+1,${tableClassModel.classVariableName}.getLimit(),
+			${tableClassModel.classVariableName}.getSort()+" "+${tableClassModel.classVariableName}.getOrder());
+		}
+		List<${tableClassModel.className}> dataList = ${tableClassModel.classVariableName}Dao.select(${tableClassModel.classVariableName});
+		PageInfo pageInfo = new PageInfo(dataList);
+		AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, pageInfo.getList(),
+		${tableClassModel.classVariableName}Dao.selectCount(${tableClassModel.classVariableName}));
+		return result;
+	}
+   	
+	/**
+	 * 新增
+	 */
+	@Transactional
+	public  AjaxResult add(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		${tableClassModel.classVariableName}Dao.insert(${tableClassModel.classVariableName});
+		return AjaxResult.buildSuccessInstance("添加成功");
+	}
+
+	
+	/**
+	 * 修改
+	 */
+	@Transactional
+	public  AjaxResult modify(${tableClassModel.className} ${tableClassModel.classVariableName}) {
+		${tableClassModel.classVariableName}Dao.updateByPrimaryKeySelective(${tableClassModel.classVariableName});
+		return AjaxResult.buildSuccessInstance("修改成功");
+	}
+
+	/**
+	* 删除
+	*/
+	@Transactional
+	public  AjaxResult deleteByPrimaryKey(Integer id) {
+
+		int i =  ${tableClassModel.classVariableName}Dao.deleteByPrimaryKey(id);
+		if (i > 0) {
+		return AjaxResult.buildSuccessInstance("删除成功");
+		} else {
+		throw new GlobleException(SystemErrorCode.DATA_DELETE_FAIL);
+		}
+	}
+   	/**
+	 * 删除
+	 */
+	@Transactional
+	public  AjaxResult del(String keys) {
+		List<String> ids = StringUtils.strToCollToString(keys, ",");
+		List<Integer> ${tableClassModel.classVariableName}s = ids.stream().map(a ->
+		Integer.parseInt(a)).collect(Collectors.toList());
+		int i =  ${tableClassModel.classVariableName}Dao.deleteByIdList(${tableClassModel.classVariableName}s);
+		if (i > 0) {
+		return AjaxResult.buildSuccessInstance("删除成功");
+		} else {
+		throw new GlobleException(SystemErrorCode.DATA_DELETE_FAIL);
+		}
+	}
+  
+}
\ No newline at end of file
diff --git a/src/main/resources/template/excelTemplateForHis/sqlFile.ftl b/src/main/resources/template/excelTemplateForHis/sqlFile.ftl
new file mode 100644
index 0000000..8fccb5d
--- /dev/null
+++ b/src/main/resources/template/excelTemplateForHis/sqlFile.ftl
@@ -0,0 +1,34 @@
+
+/**
+ * ${tableClassModel.tableMemo}
+ * @author ${dataSource.author}
+ * @date ${time}
+ */
+ CREATE TABLE ${tableClassModel.tableName}(
+  create_by varchar(100) NOT NULL COMMENT '创建人',
+  create_time datetime NOT NULL COMMENT '创建时间',
+  update_by varchar(100) NOT NULL COMMENT '更新人',
+  update_time datetime NOT NULL COMMENT '更新时间',
+  create_dept_id int(11) COMMENT '创建部门',
+  create_store_id int(11) COMMENT '创建门店',
+  company_id int(11) COMMENT '创建公司',
+<#list tableClassModel.mapping as being>
+<#if being.column = tableClassModel.primaryKey.column && being.jdbcType = "int">
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull} AUTO_INCREMENT  COMMENT '${being.memo}',
+ <#else>
+ ${being.column} ${being.fullJdbcType}  ${being.isAllowNull}  COMMENT '${being.memo}',
+</#if>
+</#list>	
+PRIMARY KEY(${tableClassModel.primaryKey.column})
+)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='${tableClassModel.tableMemo}';
+
+<#list tableClassModel.mapping as being>
+<#if (being.indexName)??>
+  ALTER TABLE ${tableClassModel.tableName}
+  ADD INDEX ${being.indexName} (${being.column}) USING BTREE ;
+</#if>
+</#list>
+
+
+
+

--
Gitblit v1.9.1