From 5f53c363471c34297e2a84f42c814d2dff615172 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期二, 19 十二月 2023 11:05:54 +0800
Subject: [PATCH] #

---
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/DateUtils.java                  |  195 +++
 zy-asrs-framework/src/main/resources/templates/Xml.txt                                       |   10 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Arith.java                      |  120 ++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/ManagerAuth.java           |   27 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/CoolGenerator.java          |  787 +++++++++++++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/SignUtils.java                   |   53 
 pom.xml                                                                                      |    1 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/RadixTools.java                 |  163 ++
 zy-asrs-framework/src/main/resources/templates/Html.txt                                      |   86 +
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Protocol.java                   |   89 +
 zy-asrs-framework/.gitignore                                                                 |   33 
 zy-asrs-framework/src/main/resources/META-INF/spring.factories                               |    1 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cache.java                      |   72 +
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cools.java                      |  368 ++++++
 zy-asrs-framework/src/main/resources/templates/ServiceImpl.txt                               |   12 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/utils/GeneratorUtils.java   |  149 ++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SpringUtils.java                |   38 
 zy-asrs-framework/src/main/resources/templates/Sql.txt                                       |   18 
 zy-asrs-framework/src/main/resources/templates/Service.txt                                   |    8 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/R.java                          |   62 +
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/ApplicationException.java    |   18 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/constant/SqlOsType.java     |    9 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/controller/AbstractBaseController.java |   69 +
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/domain/Column.java          |  285 ++++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/AppAuth.java               |   27 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/BaseRes.java                    |   14 
 zy-asrs-framework/src/main/resources/templates/Js.txt                                        |  252 ++++
 zy-asrs-framework/src/main/resources/templates/Controller.txt                                |  135 ++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/AesUtils.java                   |   81 +
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SnowflakeIdWorker.java          |  162 ++
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/CoolException.java           |   17 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/config/CoolBaseConfig.java             |   31 
 zy-asrs-framework/pom.xml                                                                    |   52 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/domain/KeyValueVo.java                 |   36 
 zy-asrs-framework/src/main/resources/templates/Mapper.txt                                    |   12 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/CoolTranslate.java         |   15 
 zy-asrs-framework/src/main/resources/templates/Entity.txt                                    |   16 
 zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/Algorithm.java                   |   22 
 38 files changed, 3,545 insertions(+), 0 deletions(-)

diff --git a/pom.xml b/pom.xml
index 09dfdca..cd9e21a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
 
     <modules>
         <module>zy-asrs-common</module>
+        <module>zy-asrs-framework</module>
         <module>zy-asrs-wcs</module>
         <module>zy-asrs-wms</module>
     </modules>
diff --git a/zy-asrs-framework/.gitignore b/zy-asrs-framework/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/zy-asrs-framework/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/zy-asrs-framework/pom.xml b/zy-asrs-framework/pom.xml
new file mode 100644
index 0000000..a12faef
--- /dev/null
+++ b/zy-asrs-framework/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>asrs-framework</artifactId>
+    <version>1.0.0</version>
+
+    <name>framework</name>
+
+    <parent>
+        <groupId>com.zy</groupId>
+        <artifactId>asrs</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <properties>
+        <jdk.version>1.8</jdk.version>
+        <spring-framework.version>5.3.9</spring-framework.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring-framework.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.46</version>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>8.2.2.jre8</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/AppAuth.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/AppAuth.java
new file mode 100644
index 0000000..41f027c
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/AppAuth.java
@@ -0,0 +1,27 @@
+package com.zy.asrs.framework.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 搴旂敤绔璇佹爣绛�
+ */
+@Target({ElementType.TYPE,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AppAuth {
+
+	Auth value() default Auth.CHECK;
+
+	// 澶囨敞
+	String memo() default "";
+
+	public enum Auth{
+		//鏉冮檺妫�娴�
+		CHECK,
+		//涓嶆娴嬫潈闄�
+		NONE
+	}
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/CoolTranslate.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/CoolTranslate.java
new file mode 100644
index 0000000..c765ed8
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/CoolTranslate.java
@@ -0,0 +1,15 @@
+package com.zy.asrs.framework.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE,ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface CoolTranslate {
+
+	// 鎰忔��
+	String value() default "";
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/ManagerAuth.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/ManagerAuth.java
new file mode 100644
index 0000000..7f22898
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/annotations/ManagerAuth.java
@@ -0,0 +1,27 @@
+package com.zy.asrs.framework.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 绠$悊绔璇佹爣绛�
+ */
+@Target({ElementType.TYPE,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ManagerAuth {
+	
+	Auth value() default Auth.CHECK;
+
+	// 澶囨敞
+	String memo() default "";
+	
+	public enum Auth{
+		//鏉冮檺妫�娴�
+		CHECK,
+		//涓嶆娴嬫潈闄�
+		NONE
+	}
+	
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/AesUtils.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/AesUtils.java
new file mode 100644
index 0000000..3ff908a
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/AesUtils.java
@@ -0,0 +1,81 @@
+package com.zy.asrs.framework.common;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+
+/**
+ * aes128-base64
+ * @author Vincent
+ */
+public class AesUtils {
+
+    private final static String DEFAULT_CHARSET = "utf-8";
+    private final static int DEFAULT_KEY_LENGTH = 16;
+
+    /**
+     * aes128 - base64 鍔犲瘑
+     * @param data  闇�瑕佸姞瀵嗙殑鏄庢枃
+     * @param key   鐩�
+     * @return   瀵嗘枃
+     */
+    public static String encrypt(String data, String key) {
+        try {
+            if (null == key || "".equals(key) || key.length() != DEFAULT_KEY_LENGTH) {
+                return null;
+            }
+            byte[] raw = key.getBytes(DEFAULT_CHARSET);
+            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"绠楁硶/妯″紡/琛ョ爜鏂瑰紡"
+            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
+            byte[] encrypted = cipher.doFinal(data.getBytes(DEFAULT_CHARSET));
+            return RadixTools.bytesToHexStr(encrypted);
+        } catch (Exception ex) {
+            return null;
+        }
+
+    }
+
+    /**
+     * aes128 - base64 瑙e瘑
+     * @param data  闇�瑕佽В瀵嗙殑瀵嗘枃
+     * @param key   鐩�
+     * @return   鏄庢枃
+     */
+    public static String decrypt(String data, String key) {
+        try {
+            if (null == key || "".equals(key) || key.length() != DEFAULT_KEY_LENGTH) {
+                return null;
+            }
+            byte[] raw = key.getBytes(DEFAULT_CHARSET);
+            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
+            byte[] original = cipher.doFinal(RadixTools.hexStringToBytes(data));
+            return new String(original,DEFAULT_CHARSET);
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        //test
+        String key = "123456";
+//        String jsonData = "json={\"status\":200,\"msg\":\"success\",\"data\":\"dsadsa\"}&timestamp=" + String.valueOf(System.currentTimeMillis()+5000000L);
+////        String jsonData = "status=200&msg=xltys1995==sadsadsad&timestamp=" + String.valueOf(System.currentTimeMillis()+5000000L);
+//        System.out.println(System.currentTimeMillis() + 5000000L);
+//        String encrypt = encrypt(key, jsonData);
+//        System.out.println(encrypt);
+//        String key = "QeCB1d74ab24482b";
+//        String s = decrypt("bd064484343cde2d325693c0611c157d04294ae2cea03854d10a2f0aa01377cfc69cf6c700ae665c8f4c539d030bb2af"
+//                , key);
+//        System.out.printf(s);
+
+
+        String data = "15988786205&timestamp=" + (System.currentTimeMillis() + 5000000L);
+//        String jsonData = "status=200&msg=xltys1995==sadsadsad&timestamp=" + String.valueOf(System.currentTimeMillis()+5000000L);
+        System.out.println(System.currentTimeMillis() + 5000000L);
+        String encrypt = encrypt(data,key);
+        System.out.println(encrypt);
+    }
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Arith.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Arith.java
new file mode 100644
index 0000000..c252c65
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Arith.java
@@ -0,0 +1,120 @@
+package com.zy.asrs.framework.common;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 鍥涘垯杩愮畻
+ * Created by vincent on 2019-04-15
+ */
+public class Arith {
+
+    /**
+     * 鍔犳硶
+     * @param dot 淇濈暀灏忔暟鐐�
+     * @param numbers 鏁板瓧绫诲瀷
+     */
+    public static double add(int dot, Number... numbers) {
+        return getAirth(dot, ArithType.ADD.getValue(), numbers);
+    }
+
+    /**
+     * 鍑忔硶
+     * @param dot 淇濈暀灏忔暟鐐�
+     * @param numbers 绗竴涓槸琚噺鏁�
+     */
+    public static double subtract(int dot, Number... numbers) {
+        return getAirth(dot, ArithType.SUBTRACT.getValue(), numbers);
+    }
+
+    /**
+     * 涔樻硶
+     * @param dot 淇濈暀灏忔暟鐐�
+     * @param numbers 涔樻硶鐨勫洜瀛�
+     */
+    public static double multiplys(int dot, Number... numbers) {
+        return getAirth(dot, ArithType.MULTIPLY.getValue(), numbers);
+    }
+
+    /**
+     * 闄ゆ硶
+     * @param dot 淇濈暀灏忔暟鐐�
+     * @param numbers 闄ゆ暟锛岀涓�涓槸闄ゆ暟
+     */
+    public static double divides(int dot, Number... numbers) {
+        return getAirth(dot, ArithType.DIVIDE.getValue(), numbers);
+    }
+
+    /**
+     * 鑾峰彇鐧惧垎姣�
+     * @param numbers 闄ゆ暟锛岀涓�涓槸闄ゆ暟
+     * @return 鐧惧垎鏁� * 100
+     */
+    public static int percentage(Number... numbers){
+        return (int) (divides(2,numbers) * 100);
+    }
+
+    /**
+     * 浣欐暟
+     * @param numbers
+     * @return
+     */
+    public static double remainder(Number... numbers){
+        return new BigDecimal(numbers[0].toString()).remainder(new BigDecimal(String.valueOf(numbers[1]))).doubleValue();
+    }
+
+    /**
+     * 缁煎悎鐨勮繍绠�
+     * @param dot       淇濈暀绮惧害
+     * @param arithType 杩愮畻鐨勭被鍨�
+     * @param numbers   闇�瑕佽繍绠楃殑鏁板瓧
+     */
+    private static double getAirth(int dot, int arithType, Number... numbers) {
+        if (numbers == null || numbers.length == 0) {
+            return 0.0;
+        }
+        BigDecimal bigDecimal = new BigDecimal(numbers[0].toString());
+        for (int i = 1; i < numbers.length; i++) {
+            switch (arithType) {
+                case 0:
+                    bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(numbers[i])));
+
+                    break;
+                case 1:
+                    bigDecimal = bigDecimal.divide(new BigDecimal(String.valueOf(numbers[i])), dot, RoundingMode.HALF_UP);
+                    break;
+                case 2:
+                    bigDecimal = bigDecimal.subtract(new BigDecimal(String.valueOf(numbers[i])));
+                    break;
+                case 3:
+                    bigDecimal = bigDecimal.multiply(new BigDecimal(String.valueOf(numbers[i])));
+                    break;
+                default:
+                    return 0.00;
+            }
+        }
+        return bigDecimal.setScale(dot, RoundingMode.HALF_UP).doubleValue();
+    }
+
+
+    /**
+     * 杩愮畻鐨勭被鍨�
+     */
+    private enum ArithType {
+        ADD("add", 0),
+        DIVIDE("divide", 1),
+        SUBTRACT("subtract", 2),
+        MULTIPLY("multiply", 3);
+        @SuppressWarnings("unused")
+		private String key;
+        private int value;
+        ArithType(String key, int value) {
+            this.key = key;
+            this.value = value;
+        }
+        public int getValue() {
+            return value;
+        }
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/BaseRes.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/BaseRes.java
new file mode 100644
index 0000000..b61dda1
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/BaseRes.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.framework.common;
+
+public interface BaseRes {
+
+    String OK = "200-鎿嶄綔鎴愬姛";
+    String EMPTY = "201-鏆傛棤鏁版嵁";
+    String LIMIT = "202-鏃犳潈闄�";
+    String PARAM = "401-鍙傛暟涓虹┖";
+    String DENIED = "403-璇烽噸鏂扮櫥褰�";
+    String REPEAT = "407-宸插瓨鍦�";
+    String NO_ACTIVATION = "409-璇峰厛婵�娲荤郴缁�";
+    String ERROR = "500-鏈嶅姟鍣ㄩ敊璇�";
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cache.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cache.java
new file mode 100644
index 0000000..1497359
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cache.java
@@ -0,0 +1,72 @@
+package com.zy.asrs.framework.common;
+
+import com.zy.asrs.framework.exception.ApplicationException;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
+
+/**
+ * 缂撳瓨
+ *
+ */
+public class Cache {
+
+	private Map<String,Object> caches=new ConcurrentHashMap<>();
+	
+	@SuppressWarnings("unchecked")
+	public <T>T get(Class<T> prototype) {
+		return (T) get(prototype.getName());
+	}
+	
+	public Object get(String key) {
+		return get(key,true);
+	}
+	
+	@SuppressWarnings("unchecked")
+	public <T>T get(String key,Supplier<T> func){
+		if(!hasKey(key)) {
+			put(key,func.get());
+		}
+		return (T)get(key);
+	}
+	
+	public Object get(String key,boolean exist) {
+		if(exist) {
+			if(!hasKey(key)) {
+				throw new ApplicationException(this+"-鎵句笉鍒扮紦瀛樺璞�:"+key);
+			}
+		}
+		return caches.get(key);
+	}
+	
+	public Cache put(Object value) {
+		String key=value.getClass().getName();
+		put(key,value);
+		return this;
+	}
+	
+	public Cache put(String key,Object value) {
+		put(key, value,true);
+		return this;
+	}
+	
+	public Cache put(String key,Object value,boolean exist) {
+		if(exist) {
+			if(hasKey(key)) {
+				throw new ApplicationException(this+"-缂撳瓨"+key+"宸插瓨鍦�");
+			}
+		}
+		caches.put(key, value);
+		return this;
+	}
+	
+	public boolean hasKey(Class<?> prototype) {
+		return hasKey(prototype.getName());
+	}
+	
+	public boolean hasKey(String key) {
+		return caches.containsKey(key);
+	}
+	
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cools.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cools.java
new file mode 100644
index 0000000..f8f4a79
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Cools.java
@@ -0,0 +1,368 @@
+package com.zy.asrs.framework.common;
+
+import com.zy.asrs.framework.annotations.CoolTranslate;
+
+import java.lang.reflect.*;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by vincent on 2019-06-09
+ */
+public class Cools {
+
+    public static boolean isEmpty(Object... objects) {
+        for (Object obj : objects){
+            if (isEmpty(obj)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static boolean isEmpty(Object o) {
+        if (o == null) {
+            return true;
+        }
+        if (o instanceof String) {
+            if (o.toString().trim().equals("")) {
+                return true;
+            }
+        } else if (o instanceof List) {
+            if (((List) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Map) {
+            if (((Map) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Set) {
+            if (((Set) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Object[]) {
+            if (((Object[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof int[]) {
+            if (((int[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof long[]) {
+            if (((long[]) o).length == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static int sqlLimitIndex(Integer pageIndex, Integer pageSize){
+        return (pageIndex - 1) * pageSize;
+    }
+
+    public static String enToken(String username, String password){
+        return AesUtils.encrypt(username, zerofill(password, 16));
+    }
+
+    public static String deTokn(String token, String password){
+        return AesUtils.decrypt(token, zerofill(password, 16));
+    }
+
+    public static String zerofill(String msg, Integer count){
+        if (msg.length() == count){
+            return msg;
+        } else if (msg.length() > count){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<count-msg.length(); i++){
+                msgBuilder.append("0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+
+    /**
+     * 鎴彇瀛楃涓�(榛樿end=true)
+     * @param str 琚埅瀛楃涓�
+     * @param end true:鏈�鍚庝竴涓瓧绗� / false:绗竴涓瓧绗�
+     */
+    public static String deleteChar(String str, boolean end){
+        if (isEmpty(str)){
+            return "";
+        }
+        if (end){
+            return str.substring(0, str.length()-1);
+        } else {
+            return str.substring(1);
+        }
+    }
+
+    public static String deleteChar(String str){
+        return deleteChar(str, true);
+    }
+
+
+    /**
+     * map 杞� 瀵硅薄
+     */
+    public static <T> T conver(Map<? extends String, ?> map, Class<T> cls){
+        T instance = null;
+        try {
+            Constructor<T> constructor = cls.getDeclaredConstructor();
+            boolean constructorAccessible = constructor.isAccessible();
+            constructor.setAccessible(true);
+            instance = constructor.newInstance();
+            constructor.setAccessible(constructorAccessible);
+        } catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+        Class<?> prototype = cls;
+        do {
+            for (Field field : prototype.getDeclaredFields()){
+                if (Modifier.isFinal(field.getModifiers())
+                        || Modifier.isStatic(field.getModifiers())
+                        || Modifier.isTransient(field.getModifiers())){
+                    continue;
+                }
+                String fieldName = field.getName();
+                Object val = null;
+                if (map.containsKey(fieldName)){
+                    val = map.get(fieldName);
+                }
+                if (val != null){
+                    boolean fieldAccessible = field.isAccessible();
+                    field.setAccessible(true);
+                    Class<?> type = field.getType();
+                    try {
+                        Constructor<?> constructor = type.getDeclaredConstructor(String.class);
+                        boolean constructorAccessible = constructor.isAccessible();
+                        constructor.setAccessible(true);
+                        field.set(instance, constructor.newInstance(String.valueOf(val)));
+                        constructor.setAccessible(constructorAccessible);
+                    } catch (IllegalAccessException
+                            | InstantiationException
+                            | InvocationTargetException
+                            | NoSuchMethodException e) {
+                        System.err.println("convert error ===> Class["+prototype+"],Field:["+fieldName+"],Type:["+type+"],Value:["+val+"]");
+                    }
+                    field.setAccessible(fieldAccessible);
+                }
+            }
+            prototype = prototype.getSuperclass();
+        } while (!Object.class.equals(prototype));
+        return instance;
+    }
+
+    /**
+     * 瀵硅薄 杞� map
+     */
+    public static Map<String, Object> conver(Object obj){
+        Class<?> cls = obj.getClass();
+        Field[] fields = getAllFields(cls);
+        Map<String, Object> map = new HashMap<>();
+        for (Field field : fields) {
+            if (Modifier.isFinal(field.getModifiers())
+                    || Modifier.isStatic(field.getModifiers())
+                    || Modifier.isTransient(field.getModifiers())){
+                continue;
+            }
+            String key = field.getName();
+            boolean flag = field.isAccessible();
+            field.setAccessible(true);
+            Object val = null;
+            try {
+                val = field.get(obj);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            field.setAccessible(flag);
+            if (val != null){
+                map.put(key, val);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 鑾峰彇鎸囧畾Class锛堝強鍏禨uperClass锛夌殑鎴愬憳鍙橀噺
+     */
+    public static Field[] getAllFields(Class<?> cls){
+        return getAllFields(cls, null);
+    }
+
+    /**
+     * 閫掑綊鍚堝苟鍩虹被Field
+     */
+    private static Field[] getAllFields(Class<?> cls, Field[] params){
+        Field[] fields = (params == null) ? cls.getDeclaredFields() : params;
+        Class<?> superCls = cls.getSuperclass();
+        if (superCls == null || superCls == Object.class){
+            return fields;
+        }
+        Field[] superClsFields = superCls.getDeclaredFields();
+        fields = addAll(fields, superClsFields);
+        return getAllFields(superCls, fields);
+    }
+
+    /**
+     * 鏍规嵁fieldName鑾峰彇Field瀵硅薄
+     */
+    public static Field getField(Class<?> cls, String fieldName) {
+        Field[] allFields = getAllFields(cls);
+        for (Field field : allFields) {
+            if (field.getName().equals(fieldName)) {
+                return field;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄涓煇涓狥ield鐨勫��
+     */
+    public static Object getFieldValue(Object obj, Field field) {
+        if (null == field) {
+            return null;
+        } else {
+            if (obj instanceof Class) {
+                obj = null;
+            }
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            try {
+                return field.get(obj);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /**
+     * 鏁扮粍鍙犲姞
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T[] addAll(T[] array1, T... array2) {
+        if (array1 == null) {
+            return clone(array2);
+        } else if (array2 == null) {
+            return clone(array1);
+        } else {
+            Class<?> cls = array1.getClass().getComponentType();
+            T[] joinedArray = (T[]) Array.newInstance(cls, array1.length + array2.length);
+            System.arraycopy(array1, 0, joinedArray, 0, array1.length);
+
+            try {
+                System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
+                return joinedArray;
+            } catch (ArrayStoreException e) {
+                Class<?> type2 = array2.getClass().getComponentType();
+                if (!cls.isAssignableFrom(type2)) {
+                    throw new RuntimeException("Cannot store " + type2.getName() + " in an array of " + cls.getName(), e);
+                } else {
+                    throw e;
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍏嬮殕
+     */
+    private static <T> T[] clone(T[] array) {
+        return array == null ? null : array.clone();
+    }
+
+    /**
+     * map鎿嶄綔
+     */
+    public static CoolMap add(String key,Object value){
+        CoolMap map = new CoolMap();
+        map.put(key, value);
+        return map;
+    }
+
+    public static class CoolMap extends HashMap<String, Object>{
+
+        public CoolMap add(String key,Object value){
+            this.put(key, value);
+            return this;
+        }
+
+        public CoolMap $(String key,Object value){
+            this.put(key, value);
+            return this;
+        }
+
+    }
+
+    public static String md5(String string){
+        try{
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            byte[] bytes = md5.digest(string.getBytes(StandardCharsets.UTF_8));
+            char[] chars = new char[bytes.length * 2];
+            for (int i = 0; i < bytes.length; i++) {
+                int b = bytes[i];
+                chars[i * 2] = hexDigits[(b & 0xF0) >> 4];
+                chars[i * 2 + 1] = hexDigits[b & 0x0F];
+            }
+            return new String(chars).toLowerCase();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("md5鍔犲瘑澶辫触,str=".concat(string));
+        }
+    }
+
+    private static char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    public static Map<String, Object> translate(Object obj){
+        Class<?> cls = obj.getClass();
+        Field[] fields = getAllFields(cls);
+        Map<String, Object> map = new HashMap<>();
+        for (Field field : fields) {
+            String key = field.getName();
+            if (field.isAnnotationPresent(CoolTranslate.class)){
+                CoolTranslate annotation = field.getAnnotation(CoolTranslate.class);
+                if (!isEmpty(annotation.value())) {
+                    key = annotation.value();
+                }
+            }
+            boolean flag = field.isAccessible();
+            field.setAccessible(true);
+            Object val = null;
+            try {
+                val = field.get(obj);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            field.setAccessible(flag);
+            if (val != null){
+                map.put(key, val);
+            }
+        }
+        return map;
+    }
+
+    public static boolean eq(String str, String str0) {
+        if (Cools.isEmpty(str) && Cools.isEmpty(str0)) {
+            return true;
+        }
+        if (Cools.isEmpty(str) && !Cools.isEmpty(str0)) {
+            return false;
+        }
+        if (Cools.isEmpty(str0) && !Cools.isEmpty(str)) {
+            return false;
+        }
+        if (str.equals(str0)) {
+            return true;
+        }
+        return false;
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/DateUtils.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/DateUtils.java
new file mode 100644
index 0000000..3145824
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/DateUtils.java
@@ -0,0 +1,195 @@
+package com.zy.asrs.framework.common;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 鏃堕棿宸ュ叿绫�
+ * Created by vincent on 2019-04-15
+ */
+public class DateUtils {
+
+    public final static String yyyyMMdd_C="yyyy骞碝M鏈坉d鏃�";
+    public final static String yyyyMM_F="yyyy-MM";
+    public final static String yyyyMMdd_F="yyyy-MM-dd";
+    public final static String yyyyMMddHHmmss_F="yyyy-MM-dd HH:mm:ss";
+    public final static String yyyyMMddHHmmsssss_F="yyyy-MM-dd HH:mm:ss,SSS";
+    public final static String yyyy="yyyy";
+    public final static String yyyyMM="yyyyMM";
+    public final static String yyyyMMdd="yyyyMMdd";
+    public final static String yyyyMMddHH="yyyyMMddHH";
+    public final static String yyyyMMddHHmmss="yyyyMMddHHmmss";
+    public final static String YYMMDDHHMMSS="YYMMDDHHMMSS";
+    public final static String yyyyMMddHHmmsssss="yyyyMMddHHmmssSSS";
+
+    /**
+     * date ==>> string
+     */
+    public static String convert(Date date, String pattern){
+        return new SimpleDateFormat(pattern).format(date);
+    }
+
+    public static String convert(Date date){
+        return convert(date, yyyyMMddHHmmss_F);
+    }
+
+    /**
+     * string ==>> date
+     */
+    public static Date convert(String str, String pattern){
+        if (str.length() < pattern.length()){
+            throw new RuntimeException("鏃堕棿瑙f瀽澶辫触 ==>> "+str);
+        }
+        if (str.length() > pattern.length()){
+            str = str.substring(0, pattern.length());
+        }
+        SimpleDateFormat format = new SimpleDateFormat(pattern);
+        Date date;
+        try {
+            date = format.parse(str);
+        } catch (ParseException e) {
+            throw new RuntimeException("鏃堕棿瑙f瀽澶辫触 ==>> "+str);
+        }
+        return date;
+    }
+
+    public static Date convert(String str){
+        return convert(str, yyyyMMddHHmmss_F);
+    }
+
+    /**
+     * 涓や釜date涔嬮棿鐩稿樊鐨勫ぉ鏁帮紝涓嶆弧涓�澶╃畻涓�澶�
+     */
+    public static int diff(Date date1, Date date2){
+        return getDaysByTimestamp(Math.abs(date2.getTime() - date1.getTime()));
+    }
+
+    public static long diffToMinute(Date date1, Date date2){
+        return Math.abs(date2.getTime() - date1.getTime())/1000/60;
+    }
+
+    public static long diffToSeconds(Date date1, Date date2){
+        return Math.abs(date2.getTime() - date1.getTime())/1000;
+    }
+
+    private static int getDaysByTimestamp(long timestamp){
+        double daysPoint = Arith.divides(2, timestamp, (1000 * 3600 * 24));
+        int daysPoint1 = (int) daysPoint;
+        double daysPoint2 = (double) daysPoint1;
+        if (daysPoint > daysPoint2){
+            return daysPoint1 + 1;
+        }
+        return daysPoint1;
+    }
+
+    /**
+     * 鍏ュ弬date璺濈鐜板湪鐨勭鏁�
+     */
+    public static int diffToNow(Date date){
+        long diff = new Date().getTime() - date.getTime();
+        return (int) (Math.abs(diff) / 1000);
+    }
+
+    /**
+     * 褰撳墠鏃堕棿鎴筹紙鍗曚綅锛氱锛�
+     */
+    public static String createTimeStamp() {
+        return Long.toString(System.currentTimeMillis() / 1000);
+    }
+
+    /**
+     * 鏃堕棿璁$畻鍑芥暟
+     * @param date 琚绠楁椂闂村疄渚�
+     * @param val 璁$畻鍊�
+     * @param timeUnit 璁$畻鍊煎崟浣�
+     * @param subtraction 鍑忔硶甯冨皵 true锛氬綋鍓嶅嚱鏁颁负鍑忔硶璁$畻锛宖alse锛氬弽涔�
+     * @return 璁$畻缁撴灉 Date
+     */
+    public static Date calculate(Date date, Long val, TimeUnit timeUnit, boolean subtraction){
+        if (Objects.isNull(date) || Objects.isNull(val) || Objects.isNull(timeUnit)){
+            return null;
+        }
+        return new Date(subtraction?date.getTime()-timeUnit.toMillis(val):date.getTime()+timeUnit.toMillis(val));
+    }
+
+    public static Date calculate(Date date, Long val, TimeUnit timeUnit){
+        return calculate(date, val, timeUnit, false);
+    }
+
+    /**
+     * 鏃堕棿瀵硅薄DateEntity
+     */
+    public static DateEntity getDateEntity(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        DateEntity dateEntity = new DateEntity();
+        dateEntity.setYear(cal.get(Calendar.YEAR));
+        dateEntity.setMonth(cal.get(Calendar.MONTH));
+        dateEntity.setDay(cal.get(Calendar.DATE));
+        dateEntity.setHour(cal.get(Calendar.HOUR_OF_DAY));
+        dateEntity.setMinute(cal.get(Calendar.MINUTE));
+        dateEntity.setSecond(cal.get(Calendar.SECOND));
+        return dateEntity;
+    }
+
+    static class DateEntity {
+        int year;
+        int month;
+        int day;
+        int hour;
+        int minute;
+        int second;
+
+        public int getYear() {
+            return year;
+        }
+
+        public void setYear(final int year) {
+            this.year = year;
+        }
+
+        public int getMonth() {
+            return month;
+        }
+
+        public void setMonth(final int month) {
+            this.month = month + 1;
+        }
+
+        public int getDay() {
+            return day;
+        }
+
+        public void setDay(final int day) {
+            this.day = day;
+        }
+
+        public int getHour() {
+            return hour;
+        }
+
+        public void setHour(final int hour) {
+            this.hour = hour;
+        }
+
+        public int getMinute() {
+            return minute;
+        }
+
+        public void setMinute(final int minute) {
+            this.minute = minute;
+        }
+
+        public int getSecond() {
+            return second;
+        }
+
+        public void setSecond(final int second) {
+            this.second = second;
+        }
+    }
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Protocol.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Protocol.java
new file mode 100644
index 0000000..a62445e
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/Protocol.java
@@ -0,0 +1,89 @@
+package com.zy.asrs.framework.common;
+
+
+import java.io.Serializable;
+
+/**
+ * common result
+ * Created by vincent on 2020-04-09
+ */
+public class Protocol<T> implements Serializable {
+
+    private static final long serialVersionUID = 4893280118017319089L;
+
+    private int code;
+
+    private String msg;
+
+    private T data;
+
+    public Protocol() {
+    }
+
+    public Protocol(int code, String msg, T data) {
+        super();
+        setCode(code);
+        setMsg(msg);
+        setData(data);
+    }
+
+    public Protocol(int code, String message) {
+        this(code, message, null);
+    }
+
+    public static <T> Protocol<T> ok(){
+        return parse(BaseRes.OK);
+    }
+
+    public static <T> Protocol<T> ok(T result){
+        Protocol<T> protocol = parse(BaseRes.OK);
+        protocol.setData(result);
+        return protocol;
+    }
+
+    public static <T> Protocol<T> error(){
+        return parse(BaseRes.ERROR);
+    }
+
+    public static <T> Protocol<T> error(String message) {
+        Protocol<T> protocol = parse(BaseRes.ERROR);
+        protocol.setMsg(message);
+        return protocol;
+    }
+
+    public static <T> Protocol<T> parse(String str) {
+        if(Cools.isEmpty(str)){
+            return parse(BaseRes.ERROR);
+        }
+        String[] msg = str.split("-");
+        if(msg.length==2){
+            return new Protocol<>(Integer.parseInt(msg[0]),msg[1]);
+        }else{
+            return parse("500-".concat(str));
+        }
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/R.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/R.java
new file mode 100644
index 0000000..56f5807
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/R.java
@@ -0,0 +1,62 @@
+package com.zy.asrs.framework.common;
+
+import java.util.HashMap;
+
+/**
+ * Created by vincent on 2019-06-09
+ */
+public class R extends HashMap<String, Object> {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String CODE = "code";
+    private static final String MSG = "msg";
+    private static final String DATA = "data";
+
+    public R(Integer code, String msg){
+        super.put(CODE, code);
+        super.put(MSG, msg);
+    }
+
+    public static R ok(){
+        return parse(BaseRes.OK);
+    }
+
+    public static R ok(String msg){
+        R r = ok();
+        r.put(MSG, msg);
+        return r;
+    }
+
+    public static R ok(Object obj){
+        return parse(BaseRes.OK).add(obj);
+    }
+
+    public static R error(){
+        return parse(BaseRes.ERROR);
+    }
+
+    public static R error(String msg){
+        R r = error();
+        r.put(MSG, msg);
+        return r;
+    }
+
+    public R add(Object obj){
+        this.put(DATA, obj);
+        return this;
+    }
+
+    public static R parse(String message){
+        if(Cools.isEmpty(message)){
+            return parse(BaseRes.ERROR);
+        }
+        String[] msg = message.split("-");
+        if(msg.length==2){
+            return new R(Integer.parseInt(msg[0]),msg[1]);
+        }else{
+            return parse("500-".concat(message));
+        }
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/RadixTools.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/RadixTools.java
new file mode 100644
index 0000000..f29b5da
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/RadixTools.java
@@ -0,0 +1,163 @@
+package com.zy.asrs.framework.common;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+
+/**
+ * radix tools
+ * Created by vincent on 2018/10/6
+ */
+public class RadixTools {
+
+    public static void main(String[] args) {
+        String s = RadixTools.toBinaryString((byte) 1);
+        System.out.println(s);
+        for(int i=s.length()-1;i>=0;i--){
+            char c=s.charAt(i);
+            if (i == 7 && c =='1'){
+                System.out.println("===");
+            }
+        }
+    }
+
+    /************************************** BinaryString **********************************************/
+
+    public static String toBinaryString(byte b){
+        return Long.toBinaryString((b & 0xFF) + 0x100).substring(1);
+    }
+
+    public static String toBinaryString(byte[] bytes){
+        StringBuilder sb = new StringBuilder();
+        for (byte aByte : bytes) {
+            sb.append(Long.toBinaryString((aByte & 0xFF) + 0x100).substring(1));
+        }
+        return sb.toString();
+    }
+
+    /************************************** HexString **********************************************/
+
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    public static String bytesToHexStr(byte[] bytes){
+        StringBuilder buf = new StringBuilder(bytes.length * 2);
+        for(byte b : bytes) {
+            buf.append(String.format("%02x", b & 0xff));
+        }
+
+        return buf.toString();
+    }
+
+    private static byte charToByte(char c) {
+        return (byte) "0123456789ABCDEF".indexOf(c);
+    }
+
+
+    /************************************** String **********************************************/
+
+    public static String bytesToStr(byte[] bytes){
+        return bytesToStr(bytes, Charset.forName("gbk"));
+    }
+
+    public static String bytesToStr(byte[] bytes, Charset charset){
+        return new String(bytes, charset).trim().toUpperCase();
+    }
+
+    public static byte[] strToBytes(String str) throws UnsupportedEncodingException {
+        return str.getBytes("gbk");
+    }
+
+    /************************************** long **********************************************/
+
+    public static byte[] longToBytes(long number) {
+        long temp = number;
+        byte[] b = new byte[8];
+        for (int i = 0; i < b.length; i++) {
+            b[i] = new Long(temp & 0xff).byteValue();// 灏嗘渶浣庝綅淇濆瓨鍦ㄦ渶浣庝綅
+            temp = temp >> 8; // 鍚戝彸绉�8浣�
+        }
+        return b;
+    }
+
+    public static long bytesToLong(byte[] bytes) {
+        long s = 0;
+        long s0 = bytes[0] & 0xff;// 鏈�浣庝綅
+        long s1 = bytes[1] & 0xff;
+        long s2 = bytes[2] & 0xff;
+        long s3 = bytes[3] & 0xff;
+        long s4 = bytes[4] & 0xff;// 鏈�浣庝綅
+        long s5 = bytes[5] & 0xff;
+        long s6 = bytes[6] & 0xff;
+        long s7 = bytes[7] & 0xff;
+
+        // s0涓嶅彉
+        s1 <<= 8;
+        s2 <<= 16;
+        s3 <<= 24;
+        s4 <<= 8 * 4;
+        s5 <<= 8 * 5;
+        s6 <<= 8 * 6;
+        s7 <<= 8 * 7;
+        s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7;
+        return s;
+    }
+
+
+    /************************************** int **********************************************/
+
+    public static byte[] intToBytes(int n) {
+        byte[] b = new byte[4];
+        b[3] = (byte) (n & 0xff);
+        b[2] = (byte) (n >> 8 & 0xff);
+        b[1] = (byte) (n >> 16 & 0xff);
+        b[0] = (byte) (n >> 24 & 0xff);
+        return b;
+    }
+
+
+    public static int bytesToInt(byte[] b) {
+        int s = 0;
+        int s0 = b[0] & 0xff;// 鏈�浣庝綅
+        int s1 = b[1] & 0xff;
+        int s2 = b[2] & 0xff;
+        int s3 = b[3] & 0xff;
+        s0 <<= 24;
+        s1 <<= 16;
+        s2 <<= 8;
+        s = s0 | s1 | s2 | s3;
+        return s;
+    }
+
+    /************************************** short **********************************************/
+
+    public static short byteToShort(byte[] b) {
+        short s = 0;
+        short s0 = (short) (b[1] & 0xff);// 鏈�浣庝綅
+        short s1 = (short) (b[0] & 0xff);
+        s1 <<= 8;
+        s = (short) (s0 | s1);
+        return s;
+    }
+
+    public static byte[] shortToByte(short s){
+        byte[] b = new byte[2];
+        for(int i = 0; i < 2; i++){
+            int offset = 16 - (i+1)*8; //鍥犱负byte鍗�4涓瓧鑺傦紝鎵�浠ヨ璁$畻鍋忕Щ閲�
+            b[i] = (byte)((s >> offset)&0xff); //鎶�16浣嶅垎涓�2涓�8浣嶈繘琛屽垎鍒瓨鍌�
+        }
+        return b;
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SnowflakeIdWorker.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SnowflakeIdWorker.java
new file mode 100644
index 0000000..5c2ec07
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SnowflakeIdWorker.java
@@ -0,0 +1,162 @@
+package com.zy.asrs.framework.common;
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake鐨勭粨鏋勫涓�(姣忛儴鍒嗙敤-鍒嗗紑):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 -
+ * 000000000000 <br>
+ * 1浣嶆爣璇嗭紝鐢变簬long鍩烘湰绫诲瀷鍦↗ava涓槸甯︾鍙风殑锛屾渶楂樹綅鏄鍙蜂綅锛屾鏁版槸0锛岃礋鏁版槸1锛屾墍浠d涓�鑸槸姝f暟锛屾渶楂樹綅鏄�0<br>
+ * 41浣嶆椂闂存埅(姣绾�)锛屾敞鎰忥紝41浣嶆椂闂存埅涓嶆槸瀛樺偍褰撳墠鏃堕棿鐨勬椂闂存埅锛岃�屾槸瀛樺偍鏃堕棿鎴殑宸�硷紙褰撳墠鏃堕棿鎴� - 寮�濮嬫椂闂存埅)
+ * 寰楀埌鐨勫�硷級锛岃繖閲岀殑鐨勫紑濮嬫椂闂存埅锛屼竴鑸槸鎴戜滑鐨刬d鐢熸垚鍣ㄥ紑濮嬩娇鐢ㄧ殑鏃堕棿锛岀敱鎴戜滑绋嬪簭鏉ユ寚瀹氱殑锛堝涓嬩笅闈㈢▼搴廔dWorker绫荤殑startTime灞炴�э級銆�41浣嶇殑鏃堕棿鎴紝鍙互浣跨敤69骞达紝骞碩
+ * = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10浣嶇殑鏁版嵁鏈哄櫒浣嶏紝鍙互閮ㄧ讲鍦�1024涓妭鐐癸紝鍖呮嫭5浣峝atacenterId鍜�5浣峸orkerId<br>
+ * 12浣嶅簭鍒楋紝姣鍐呯殑璁℃暟锛�12浣嶇殑璁℃暟椤哄簭鍙锋敮鎸佹瘡涓妭鐐规瘡姣(鍚屼竴鏈哄櫒锛屽悓涓�鏃堕棿鎴�)浜х敓4096涓狪D搴忓彿<br>
+ * 鍔犺捣鏉ュ垰濂�64浣嶏紝涓轰竴涓狶ong鍨嬨��<br>
+ * SnowFlake鐨勪紭鐐规槸锛屾暣浣撲笂鎸夌収鏃堕棿鑷鎺掑簭锛屽苟涓旀暣涓垎甯冨紡绯荤粺鍐呬笉浼氫骇鐢烮D纰版挒(鐢辨暟鎹腑蹇僆D鍜屾満鍣↖D浣滃尯鍒�)锛屽苟涓旀晥鐜囪緝楂橈紝缁忔祴璇曪紝SnowFlake姣忕鑳藉浜х敓26涓嘔D宸﹀彸銆�
+ */
+public class SnowflakeIdWorker {
+
+	// ==============================Fields===========================================
+	/** 寮�濮嬫椂闂存埅 (2015-01-01) */
+	private final long twepoch = 1420041600000L;
+	
+	/** 搴忓垪鍊兼墍鍗犵殑浣嶆暟 */
+	private final long sequenceBits = 12L;
+
+	/** 鏈哄櫒id鎵�鍗犵殑浣嶆暟 */
+	private final long workerIdBits = 5L;
+
+	/** 鏈烘埧id鎵�鍗犵殑浣嶆暟 */
+	private final long datacenterIdBits = 5L;
+
+	/** 鏈哄櫒id鍚戝乏绉�12浣� */
+	private final long workerIdLeftShift = sequenceBits;
+
+	/** 鏈烘埧id鍚戝乏绉�17浣�(5+12) */
+	private final long datacenterIdLeftShift =workerIdLeftShift + workerIdBits;
+
+	/** 鏃堕棿鎴悜宸︾Щ22浣�(5+5+12) */
+	private final long timestampLeftShift = datacenterIdLeftShift + datacenterIdBits;
+	
+	/** 鏀寔鐨勬渶澶ф満鍣╥d (浣嶆暟浜岃繘鍒跺��) */
+	private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+	/** 鏀寔鐨勬渶澶ф暟鎹爣璇唅d (浣嶆暟浜岃繘鍒跺��)  */
+	private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+	
+	/**鐢熸垚搴忓垪鐨勬帺鐮� */
+	private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+	/** 宸ヤ綔鏈哄櫒ID(0~31) */
+	private long workerId;
+
+	/** 鏁版嵁涓績ID(0~31) */
+	private long datacenterId;
+
+	/** 姣鍐呭簭鍒� */
+	private long sequence = 0L;
+
+	/** 涓婃鐢熸垚ID鐨勬椂闂存埅 */
+	private long lastTimestamp = -1L;
+
+	// ==============================Constructors=====================================
+	
+	/**
+	 * 鏋勯�犲嚱鏁�
+	 * 
+	 * @param workerId
+	 *            宸ヤ綔ID (0~31)
+	 * @param datacenterId
+	 *            鏁版嵁涓績ID (0~31)
+	 */
+	public SnowflakeIdWorker(long workerId, long datacenterId) {
+		if (workerId > maxWorkerId || workerId < 0) {
+			throw new IllegalArgumentException(
+					String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+		}
+		if (datacenterId > maxDatacenterId || datacenterId < 0) {
+			throw new IllegalArgumentException(
+					String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+		}
+		this.workerId = workerId;
+		this.datacenterId = datacenterId;
+	}
+
+	public SnowflakeIdWorker(){
+		this(0L, 0L);
+	}
+
+	// ==============================Methods==========================================
+	/**
+	 * 鑾峰緱涓嬩竴涓狪D (璇ユ柟娉曟槸绾跨▼瀹夊叏鐨�)
+	 * 
+	 * @return SnowflakeId
+	 */
+	public synchronized long nextId() {
+		long timestamp = timeGen();
+
+		// 濡傛灉褰撳墠鏃堕棿灏忎簬涓婁竴娆D鐢熸垚鐨勬椂闂存埑锛岃鏄庣郴缁熸椂閽熷洖閫�杩囪繖涓椂鍊欏簲褰撴姏鍑哄紓甯�
+		if (timestamp < lastTimestamp) {
+			throw new RuntimeException(String.format(
+					"Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+		}
+
+		// 濡傛灉鏄悓涓�鏃堕棿鐢熸垚鐨勶紝鍒欒繘琛屾绉掑唴搴忓垪
+		if (lastTimestamp == timestamp) {
+			sequence = (sequence + 1) & sequenceMask;
+			// 姣鍐呭簭鍒楁孩鍑�
+			if (sequence == 0) {
+				// 闃诲鍒颁笅涓�涓绉�,鑾峰緱鏂扮殑鏃堕棿鎴�
+				timestamp = tilNextMillis(lastTimestamp);
+			}
+		}
+		// 鏃堕棿鎴虫敼鍙橈紝姣鍐呭簭鍒楅噸缃�
+		else {
+			sequence = 0L;
+		}
+
+		// 涓婃鐢熸垚ID鐨勬椂闂存埅
+		lastTimestamp = timestamp;
+
+		// 绉讳綅骞堕�氳繃鎴栬繍绠楁嫾鍒颁竴璧风粍鎴�64浣嶇殑ID
+		return ((timestamp - twepoch) << timestampLeftShift) //
+				| (datacenterId << datacenterIdLeftShift) //
+				| (workerId << workerIdLeftShift) //
+				| sequence;
+	}
+	
+	/**
+	 * 闃诲鍒颁笅涓�涓绉掞紝鐩村埌鑾峰緱鏂扮殑鏃堕棿鎴�
+	 * 
+	 * @param lastTimestamp
+	 *            涓婃鐢熸垚ID鐨勬椂闂存埅
+	 * @return 褰撳墠鏃堕棿鎴�
+	 */
+	protected long tilNextMillis(long lastTimestamp) {
+		long timestamp = timeGen();
+		while (timestamp <= lastTimestamp) {
+			timestamp = timeGen();
+		}
+		return timestamp;
+	}
+
+	/**
+	 * 杩斿洖浠ユ绉掍负鍗曚綅鐨勫綋鍓嶆椂闂�
+	 * 
+	 * @return 褰撳墠鏃堕棿(姣)
+	 */
+	protected long timeGen() {
+		return System.currentTimeMillis();
+	}
+
+	// ==============================Test=============================================
+	/** 娴嬭瘯 */
+	public static void main(String[] args) {
+		SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
+		for (int i = 0; i < 1000; i++) {
+			long id = idWorker.nextId();
+			System.out.println(Long.toBinaryString(id));
+			System.out.println(id);
+		}
+	}
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SpringUtils.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SpringUtils.java
new file mode 100644
index 0000000..3bb38b8
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/SpringUtils.java
@@ -0,0 +1,38 @@
+package com.zy.asrs.framework.common;
+
+import com.zy.asrs.framework.exception.CoolException;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+public class SpringUtils implements ApplicationContextAware {
+
+	private static ApplicationContext application;
+
+	public SpringUtils() {}
+
+	public static void init(ApplicationContext context) {
+		SpringUtils.application = context;
+	}
+
+	@Override
+	public void setApplicationContext(ApplicationContext context) throws BeansException {
+		SpringUtils.application = context;
+	}
+
+	public static ApplicationContext getApplicationContext() {
+		if(application==null) {
+			throw new CoolException(BaseRes.ERROR);
+		}
+		return application;
+	}
+
+	public static <T>T getBean(Class<T> prototype) {
+		return getApplicationContext().getBean(prototype);
+	}
+
+	public static Object getBean(String name) {
+		return getApplicationContext().getBean(name);
+	}
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/config/CoolBaseConfig.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/config/CoolBaseConfig.java
new file mode 100644
index 0000000..9be246a
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/config/CoolBaseConfig.java
@@ -0,0 +1,31 @@
+package com.zy.asrs.framework.config;
+
+//import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+
+import com.zy.asrs.framework.common.SnowflakeIdWorker;
+import com.zy.asrs.framework.common.SpringUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Created by vincent on 2019-06-10
+ */
+@Configuration
+public class CoolBaseConfig {
+
+//    @Bean
+//    public PaginationInterceptor paginationInterceptor() {
+//        return new PaginationInterceptor();
+//    }
+
+    @Bean
+    public SpringUtils getSpringUtils(){
+        return new SpringUtils();
+    }
+
+    @Bean
+    public SnowflakeIdWorker snowflakeIdWorker(){
+        return new SnowflakeIdWorker();
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/controller/AbstractBaseController.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/controller/AbstractBaseController.java
new file mode 100644
index 0000000..282e3ce
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/controller/AbstractBaseController.java
@@ -0,0 +1,69 @@
+package com.zy.asrs.framework.controller;
+
+import com.zy.asrs.framework.common.BaseRes;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.exception.CoolException;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by vincent on 2019-06-09
+ */
+public abstract class AbstractBaseController {
+
+    public <T> List exportSupport(List<T> list, List<String> fields){
+        if (Cools.isEmpty(list)){
+            throw new CoolException(BaseRes.EMPTY);
+        }
+        try {
+            List<List<Object>> result = new ArrayList<>();
+            Method[] methods = list.get(0).getClass().getMethods();
+            for (T t : list){
+                List<Object> node = new ArrayList<>();
+                for (String field : fields){
+                    for (Method method : methods) {
+                        if (("get" + field).toLowerCase().equals(method.getName().toLowerCase())) {
+                            Object val = method.invoke(t);
+                            node.add(val);
+                            break;
+                        }
+                    }
+                }
+                result.add(node);
+            }
+            return result;
+        } catch (Exception e){
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    public static Map<String, Object> excludeTrash(Map<String, Object> map){
+        if (Cools.isEmpty(map)){
+            return new HashMap<>();
+        }
+        map.entrySet().removeIf(next -> next.getKey().equals("curr")
+                || next.getKey().equals("limit")
+                || next.getKey().equals("orderByField")
+                || next.getKey().equals("orderByType")
+                || next.getKey().equals("condition")
+                || Cools.isEmpty(next.getValue()));
+        return map;
+    }
+
+    public static String humpToLine(String str) {
+        Matcher matcher = Pattern.compile("[A-Z]").matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/domain/KeyValueVo.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/domain/KeyValueVo.java
new file mode 100644
index 0000000..f8f45bc
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/domain/KeyValueVo.java
@@ -0,0 +1,36 @@
+package com.zy.asrs.framework.domain;
+
+/**
+ * Created by vincent on 2021/4/13
+ */
+public class KeyValueVo {
+
+    private String name;
+
+    private Long value;
+
+    public KeyValueVo() {
+    }
+
+    public KeyValueVo(String name, Long value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getValue() {
+        return value;
+    }
+
+    public void setValue(Long value) {
+        this.value = value;
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/ApplicationException.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/ApplicationException.java
new file mode 100644
index 0000000..4969b7c
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/ApplicationException.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.framework.exception;
+
+/**
+ * 搴旂敤寮傚父
+ */
+public class ApplicationException extends RuntimeException {
+	
+	private static final long serialVersionUID = 1L;
+	
+	public ApplicationException(Throwable e) {
+		super(e);
+	}
+	
+	public ApplicationException(String message) {
+		super(message);
+	}
+	
+}
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/CoolException.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/CoolException.java
new file mode 100644
index 0000000..182faad
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/exception/CoolException.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.framework.exception;
+
+/**
+ * 妗嗘灦寮傚父
+ * Created by vincent on 2019-09-04
+ */
+public class CoolException extends RuntimeException {
+
+    public CoolException(Throwable e) {
+        super(e);
+    }
+
+    public CoolException(String message) {
+        super(message);
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/CoolGenerator.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/CoolGenerator.java
new file mode 100644
index 0000000..e131455
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/CoolGenerator.java
@@ -0,0 +1,787 @@
+package com.zy.asrs.framework.generators;
+
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.generators.constant.SqlOsType;
+import com.zy.asrs.framework.generators.domain.Column;
+import com.zy.asrs.framework.generators.utils.GeneratorUtils;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.*;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by vincent on 2019-06-18
+ */
+public class CoolGenerator {
+
+    private static final String BASE_DIR = "src/main/";
+    private static final String JAVA_DIR = BASE_DIR + "java/";
+    private static final String XML_DIR = BASE_DIR + "resources/mapper/";
+    private static final String HTML_DIR = BASE_DIR + "webapp/";
+    private static final String[] ALL_TEMPLATES = new String[]{
+            "Controller",
+            "Service",
+            "ServiceImpl",
+            "Mapper",
+            "Entity",
+            "Xml",
+            "Html",
+            "HtmlDetail",
+            "Js",
+            "Sql"};
+    private static final ArrayList<String> SYSTEM_MODEL = new ArrayList<String>(){{
+            add("User");
+            add("Host");
+    }};
+
+
+    public String url;
+    public String username;
+    public String password;
+    public String table;
+    public String packagePath;
+    public boolean controller = true;
+    public boolean service = true;
+    public boolean mapper = true;
+    public boolean entity = true;
+    public boolean xml = true;
+    public boolean html = true;
+    public boolean htmlDetail = false;
+    public boolean js = true;
+    public boolean sql = true;
+    public SqlOsType sqlOsType;
+
+    private List<Column> columns = new ArrayList<>();
+    private String fullEntityName;
+    private String simpleEntityName;
+    private String entityImport;
+    private String entityContent;
+    private String xmlContent;
+    private String htmlContent;
+    private String htmlDialogContent;
+    private String jsTableContent;
+    private String jsForeignKeyContent;
+    private String jsDateContent;
+    private String jsPrimaryKeyDoms;
+    private String primaryKeyColumn;
+    private String majorColumn;
+    private String systemPackagePath;
+    private String systemPackage;
+
+    public void build() throws Exception {
+        init();
+        for (String template : ALL_TEMPLATES){
+            boolean pass = false;
+            String lowerCase = template.toLowerCase();
+            String templatePath = lowerCase.contains("impl")?lowerCase.substring(0,lowerCase.length()-4)+"/"+lowerCase.substring(lowerCase.length()-4):lowerCase;
+            String directory="";
+            String fileName="";
+            switch (template){
+                case "Controller":
+                    pass = controller;
+                    directory = JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/";
+                    fileName = fullEntityName+template+".java";
+                    break;
+                case "Service":
+                    pass = service;
+                    directory = JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/";
+                    fileName = fullEntityName+template+".java";
+                    break;
+                case "ServiceImpl":
+                    pass = service;
+                    directory = JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/";
+                    fileName = fullEntityName+template+".java";
+                    break;
+                case "Mapper":
+                    pass = mapper;
+                    directory = JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/";
+                    fileName = fullEntityName+template+".java";
+                    break;
+                case "Entity":
+                    pass = entity;
+                    directory = JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/";
+                    fileName = fullEntityName+".java";
+                    break;
+                case "Xml":
+                    pass = xml;
+                    directory = XML_DIR;
+                    fileName = fullEntityName+"Mapper.xml";
+                    break;
+                case "Html":
+                    pass = html;
+                    directory = HTML_DIR + "/views/" + simpleEntityName + "/";
+                    fileName = simpleEntityName+".html";
+                    break;
+                case "Js":
+                    pass = js;
+                    directory = HTML_DIR + "/static/js/" + simpleEntityName + "/";
+                    fileName = simpleEntityName+".js";
+                    break;
+                case "Sql":
+                    pass = sql;
+                    directory = JAVA_DIR;
+                    fileName = simpleEntityName+".sql";
+                default:
+                    break;
+            }
+            if (!pass){ continue; }
+            String content = readFile(template);
+            writeFile(content, directory, fileName, template);
+        }
+    }
+
+    private void init() throws Exception {
+        gainDbInfo();
+        fullEntityName = GeneratorUtils.getNameSpace(table);
+        simpleEntityName = fullEntityName.substring(0, 1).toLowerCase()+fullEntityName.substring(1);
+        entityContent = createEntityMsg();
+        xmlContent = createXmlMsg();
+        htmlContent = createHtmlMsg();
+        htmlDialogContent = createHtmlDialogMsg();
+        jsTableContent = createJsTableMsg();
+        jsForeignKeyContent = createJsFkContent();
+        jsDateContent = createJsDateContent();
+        jsPrimaryKeyDoms = createJsPrimaryKeyMsg();
+        primaryKeyColumn = createPrimaryMsg();
+        majorColumn = createMajorMsg();
+        String[] packagePathSplit = packagePath.split("\\.");
+        systemPackagePath = packagePath.replaceAll(packagePathSplit[packagePathSplit.length-1], "system");
+        String[] split = systemPackagePath.split("\\.");
+        systemPackage = "";
+        for (int i = 1;i <= split.length; i++) {
+            if (i != split.length) {
+                if (i == split.length - 1) {
+                    systemPackage = systemPackage + split[i-1];
+                } else {
+                    systemPackage = systemPackage + split[i-1] + ".";
+                }
+            }
+
+        }
+    }
+
+    private String readFile(String template){
+        StringBuilder txtContentBuilder=new StringBuilder();
+        ClassPathResource classPath=new ClassPathResource("templates/"+template + ".txt");
+
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(classPath.getInputStream()))) {
+            String lineContent;
+            while ((lineContent = reader.readLine()) != null) {
+                txtContentBuilder.append(lineContent).append("\n");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return txtContentBuilder.toString();
+    }
+
+    private void writeFile(String content, String directory, String fileName, String template) throws IOException {
+        File codeDirectory=new File(directory);
+        if(!codeDirectory.exists()){
+            codeDirectory.mkdirs();
+        }
+        File writerFile=new File(directory+fileName);
+        if(!writerFile.exists()){
+            content=content.
+                    replaceAll("@\\{TABLENAME}", table)
+                    .replaceAll("@\\{ENTITYIMPORT}", entityImport)
+                    .replaceAll("@\\{ENTITYCONTENT}", entityContent)
+                    .replaceAll("@\\{ENTITYNAME}", fullEntityName)
+                    .replaceAll("@\\{SIMPLEENTITYNAME}", simpleEntityName)
+                    .replaceAll("@\\{UENTITYNAME}", simpleEntityName)
+                    .replaceAll("@\\{COMPANYNAME}",packagePath)
+                    .replaceAll("@\\{XMLCONTENT}", xmlContent)
+                    .replaceAll("@\\{HTMLCONTENT}", htmlContent)
+                    .replaceAll("@\\{HTMLDIALOGCONTENT}", htmlDialogContent)
+                    .replaceAll("@\\{JSTABLECONTENT}", jsTableContent)
+                    .replaceAll("@\\{JSFOREIGNKEYCONTENT}", jsForeignKeyContent)
+                    .replaceAll("@\\{JSDATECONTENT}", jsDateContent)
+                    .replaceAll("@\\{JSPRIMARYKEYDOMS}", jsPrimaryKeyDoms)
+                    .replaceAll("@\\{MAJORCOLUMN}", GeneratorUtils.humpToLine(majorColumn))
+                    .replaceAll("@\\{MAJORCOLUMN_UP}", GeneratorUtils.firstCharConvert(GeneratorUtils.humpToLine(majorColumn), false))
+                    .replaceAll("@\\{PRIMARYKEYCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false))
+                    .replaceAll("@\\{PRIMARYKEYCOLUMN0}", GeneratorUtils.firstCharConvert(primaryKeyColumn, true))
+                    .replaceAll("@\\{UPCASEMARJORCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false))
+                    .replaceAll("@\\{SYSTEMPACKAGE}",systemPackage)
+            ;
+            writerFile.createNewFile();
+            BufferedWriter writer=new BufferedWriter(new FileWriter(writerFile));
+            writer.write(content);
+            writer.flush();
+            writer.close();
+            System.out.println(fullEntityName+template+" 婧愭枃浠跺垱寤烘垚鍔燂紒");
+        }else{
+            System.out.println(fullEntityName+template+" 婧愭枃浠跺凡缁忓瓨鍦ㄥ垱寤哄け璐ワ紒");
+        }
+    }
+
+    private void gainDbInfo() throws Exception {
+        Connection conn;
+        if (null == this.sqlOsType) {
+            throw new RuntimeException("璇锋寚瀹氭暟鎹簱绫诲瀷锛�");
+        }
+        switch (this.sqlOsType) {
+            case MYSQL:
+                Class.forName("com.mysql.jdbc.Driver").newInstance();
+                conn = DriverManager.getConnection("jdbc:mysql://"+url, username, password);
+                this.columns = getMysqlColumns(conn, table, true, sqlOsType);
+                break;
+            case SQL_SERVER:
+                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
+                conn = DriverManager.getConnection("jdbc:sqlserver://"+url, username, password);
+                this.columns = getSqlServerColumns(conn, table, true, sqlOsType);
+                break;
+            default:
+                throw new RuntimeException("璇锋寚瀹氭暟鎹簱绫诲瀷锛�");
+        }
+
+    }
+
+    // mysql
+    public static List<Column> getMysqlColumns(Connection conn, String table, boolean init, SqlOsType sqlOsType) throws Exception {
+        List<Column> result = new ArrayList<>();
+        PreparedStatement ps = conn.prepareStatement("select * from " + table);
+        ResultSetMetaData meta = ps.executeQuery().getMetaData();
+        // 鍗曡〃瀛楁鏁伴噺
+        int count = meta.getColumnCount();
+        ResultSet resultSet = ps.executeQuery("show full columns from " + table);
+        for (int i = 1; i < count + 1; i++) {
+            String columnName = meta.getColumnName(i);
+            if (resultSet.next() && columnName.equals(resultSet.getString("Field"))){
+                result.add(new Column(
+                        conn,
+                        meta.getColumnName(i),
+                        GeneratorUtils.getType(meta.getColumnType(i)),
+                        resultSet.getString("Comment"),
+                        resultSet.getString("Key").equals("PRI"),
+                        resultSet.getString("Key").equals("PRI"),
+                        resultSet.getString("Null").equals("NO"),
+                        GeneratorUtils.getColumnLength(resultSet.getString("Type")),
+                        init,
+                        sqlOsType
+                ));
+            }
+            result.forEach(column -> System.out.println(column.toString()));
+        }
+        return result;
+    }
+
+    // sqlserver
+    public static List<Column> getSqlServerColumns(Connection conn, String table, boolean init, SqlOsType sqlOsType) throws Exception {
+        List<Column> result = new ArrayList<>();
+        PreparedStatement ps = conn.prepareStatement("select * from " + table);
+        ResultSetMetaData meta = ps.executeQuery().getMetaData();
+        // 鍗曡〃瀛楁鏁伴噺
+        int count = meta.getColumnCount();
+        StringBuilder sql = new StringBuilder("SELECT \n" +
+                "       'Field'= a.name,\n" +
+                "       'Comment'= isnull(g.[value],''),\n" +
+                "       'Key'= case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then 'PRI' else '' end,\n" +
+                "       'Main'= case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 'PRI' else '' end,"+
+                "       'Type'= b.name,\n" +
+                "       'Length'= COLUMNPROPERTY(a.id,a.name,'PRECISION'),\n" +
+                "       'Decimals'= isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),\n" +
+                "       'Null'= case when a.isnullable=1 then 'Yes' else 'No' end,\n" +
+                "       'Default' = isnull(e.text,'')\n" +
+                "FROM  syscolumns a\n" +
+                "LEFT JOIN  systypes b on a.xusertype=b.xusertype\n" +
+                "INNER JOIN sysobjects d on  a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'\n" +
+                "LEFT JOIN  syscomments e on  a.cdefault=e.id\n" +
+                "LEFT JOIN  sys.extended_properties g on  a.id=G.major_id and a.colid=g.minor_id  \n" +
+                "LEFT JOIN  sys.extended_properties f on  d.id=f.major_id and f.minor_id=0 where d.name = '")
+                .append(table).append("' ORDER BY a.colorder ASC");
+        ResultSet resultSet = conn.prepareStatement(sql.toString()).executeQuery();
+        for (int i = 1; i < count + 1; i++) {
+            String columnName = meta.getColumnName(i);
+            if (resultSet.next() && columnName.equals(resultSet.getString("Field"))){
+                result.add(new Column(
+                        conn,
+                        meta.getColumnName(i),
+                        GeneratorUtils.getType(meta.getColumnType(i)),
+                        resultSet.getString("Comment"),
+                        resultSet.getString("Key").equals("PRI"),
+                        resultSet.getString("Main").equals("PRI"),
+                        resultSet.getString("Null").equals("No"),
+                        GeneratorUtils.getColumnLength(resultSet.getString("Type")),
+                        init,
+                        sqlOsType
+                ));
+            }
+        }
+        result.forEach(column -> System.out.println(column.toString()));
+        return result;
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    /**********************************************************************************************/
+    /************************************* Entity鍔ㄦ�佸瓧娈� *******************************************/
+    /**********************************************************************************************/
+
+    private String createEntityMsg(){
+        if (Cools.isEmpty(systemPackagePath)) {
+            String[] packagePathSplit = packagePath.split("\\.");
+            systemPackagePath = packagePath.replaceAll(packagePathSplit[packagePathSplit.length-1], "system");
+        }
+        if (columns.isEmpty()){
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        StringBuilder entityIm = new StringBuilder("import com.core.common.Cools;");
+        boolean setTableField = true;
+        boolean setTableId = true;
+        boolean setDateTimeFormat = true;
+        for (Column column : columns){
+            if (column.getType().equals("Date")){
+                entityIm.append("import java.text.SimpleDateFormat;\n")
+                        .append("import java.util.Date;\n");
+            }
+
+            // 娉ㄩ噴
+            if (!Cools.isEmpty(column.getComment())){
+                sb.append("    /**\n")
+                        .append("     * ")
+                        .append(column.getWholeComment())
+                        .append("\n")
+                        .append("     */")
+                        .append("\n");
+            }
+
+            // swagger
+            sb.append("    @ApiModelProperty(value= \"")
+                    .append(column.getWholeComment())
+                    .append("\")\n");
+
+
+            // 涓婚敭淇グ
+            if (column.isMainKey()){
+                if (setTableId){
+                    entityIm.append("import com.baomidou.mybatisplus.annotations.TableId;").append("\n")
+                            .append("import com.baomidou.mybatisplus.enums.IdType;").append("\n");
+                    setTableId = false;
+                }
+                if (column.isOnly()){
+                    sb.append("    ")
+                            .append("@TableId(value = \"")
+                            .append(column.getName())
+                            .append("\", type = IdType.AUTO)")
+                            .append("\n");
+                } else {
+                    sb.append("    ")
+                            .append("@TableId(value = \"")
+                            .append(column.getName())
+                            .append("\", type = IdType.INPUT)")
+                            .append("\n");
+                }
+
+            }
+
+            // 澶栭敭淇グ
+            if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                entityIm.append("import com.core.common.SpringUtils;\n")
+                        .append("import ").append(SYSTEM_MODEL.contains(column.getForeignKey())?systemPackagePath:packagePath).append(".service.").append(column.getForeignKey()).append("Service;\n")
+                        .append("import ").append(SYSTEM_MODEL.contains(column.getForeignKey())?systemPackagePath:packagePath).append(".entity.").append(column.getForeignKey()).append(";\n");
+            }
+
+            // 鍛藉悕杞崲娉ㄨВ
+            if (!column.getName().equals(column.getHumpName())){
+                if (setTableField){
+                    entityIm.append("import com.baomidou.mybatisplus.annotations.TableField;").append("\n");
+                    setTableField = false;
+                }
+                sb.append("    ")
+                        .append("@TableField(\"")
+                        .append(column.getName())
+                        .append("\")")
+                        .append("\n");
+            }
+
+            if ("Date".equals(column.getType())){
+                if (setDateTimeFormat){
+                    entityIm.append("import org.springframework.format.annotation.DateTimeFormat;").append("\n");
+                    setDateTimeFormat = false;
+                }
+                sb.append("    ")
+                        .append("@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")")
+                        .append("\n");
+            }
+
+            sb.append("    ")
+                    .append("private ")
+                    .append(column.getType())
+                    .append(" ")
+                    .append(column.getHumpName())
+                    .append(";")
+                    .append("\n")
+                    .append("\n");
+        }
+
+        // default constructor
+        sb.append("    public ").append(fullEntityName).append("() {}\n\n");
+        // full constructor
+        sb.append("    public ").append(fullEntityName).append("(");
+        for (Column column : columns){
+            if (column.isOnly()){ continue;}
+            sb.append(column.getType()).append(" ").append(column.getHumpName()).append(",");
+        }
+        sb.deleteCharAt(sb.length()-1);
+        sb.append(") {\n");
+        for (Column column : columns){
+            if (column.isPrimaryKey()){ continue;}
+            sb.append("        this.").append(column.getHumpName()).append(" = ").append(column.getHumpName()).append(";\n");
+        }
+        sb.append("    }\n\n");
+        // constructor tips
+        sb.append("//    ").append(fullEntityName).append(" ").append(simpleEntityName).append(" = new ").append(fullEntityName).append("(\n");
+        for (int i = 0; i<columns.size(); i++) {
+            if (columns.get(i).isOnly()){ continue;}
+            sb.append("//            null");
+            if (i < columns.size()-1){
+                sb.append(",");
+            }
+            sb.append("    // ").append(columns.get(i).getComment()).append(columns.get(i).isNotNull()?"[闈炵┖]":"");
+            if (i < columns.size()-1){
+                sb.append("\n");
+            }
+        }
+        sb.append("\n//    );\n\n");
+
+        // get set
+        for (Column column : columns){
+            // 鏃堕棿瀛楁澧炲姞$鏍煎紡鍖�
+            if ("Date".equals(column.getType())){
+                sb.append("    public String get")
+                        .append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1))
+                        .append("\\$")
+                        .append("(){\n")
+                        .append("        if (Cools.isEmpty(this.").append(column.getHumpName()).append(")){\n")
+                        .append("            return \"\";\n")
+                        .append("        }\n")
+                        .append("        return new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(this.")
+                        .append(column.getHumpName())
+                        .append(");\n")
+                        .append("    }\n\n");
+            // 鏋氫妇瀛楁澧炲姞$鏍煎紡鍖�
+            } else if (!Cools.isEmpty(column.getEnums())){
+                sb.append("    public String get")
+                        .append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1))
+                        .append("\\$")
+                        .append("(){\n")
+                        .append("        if (null == this.").append(column.getHumpName()).append("){ return null; }\n")
+                        .append("        switch (this.").append(column.getHumpName()).append("){\n");
+                for (Map<String, Object> map : column.getEnums()){
+                    for (Map.Entry<String, Object> entry : map.entrySet()){
+                        sb.append("            case ").append(entry.getKey()).append(":\n")
+                                .append("                return \"").append(entry.getValue()).append("\";\n");
+                    }
+                }
+                sb.append("            default:\n")
+                        .append("                return String.valueOf(this.").append(column.getHumpName()).append(");\n")
+                        .append("        }\n")
+                        .append("    }\n\n");
+            }
+
+            // 澶栭敭淇グ
+            if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                sb.append("    public String get").append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1)).append("\\$").append("(){\n")
+                        .append("        ").append(column.getForeignKey()).append("Service service = SpringUtils.getBean(").append(column.getForeignKey()).append("Service.class);\n")
+                        .append("        ").append(column.getForeignKey()).append(" ").append(GeneratorUtils.firstCharConvert(column.getForeignKey()))
+                        .append(" = service.selectById(this.").append(column.getHumpName()).append(");\n")
+                        .append("        if (!Cools.isEmpty(").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append(")){\n")
+                        .append("            return String.valueOf(").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append(".get").append(column.getForeignKeyMajor()).append("());\n")
+                        .append("        }\n")
+                        .append("        return null;\n")
+                        .append("    }\n\n");
+            }
+
+        }
+        entityImport = entityIm.toString();
+        return sb.toString();
+    }
+
+    /**********************************************************************************************/
+    /*********************************** Controller鍔ㄦ�佸瓧娈� *****************************************/
+    /**********************************************************************************************/
+
+    private String createPrimaryMsg(){
+        String defaultMajor = "id";
+        boolean havePrimary = false;
+        for (Column column: columns){
+            if (column.isPrimaryKey()){
+                defaultMajor = column.getHumpName();
+                havePrimary = true;
+            }
+        }
+        if (!havePrimary) {
+            for (Column column: columns){
+                if (column.isMainKey()){
+                    defaultMajor = column.getHumpName();
+                }
+            }
+        }
+        return defaultMajor;
+    }
+
+    private String createMajorMsg(){
+        String defaultMajor = "id";
+        for (Column column: columns){
+            if (column.isPrimaryKey()){
+                defaultMajor = column.getHumpName();
+            }
+            if (column.isMajor()){
+                return column.getHumpName();
+            }
+        }
+        return defaultMajor;
+    }
+
+    /**********************************************************************************************/
+    /*************************************** Xml鍔ㄦ�佸瓧娈� ********************************************/
+    /**********************************************************************************************/
+
+    private String createXmlMsg(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns){
+            sb.append("        ")
+                    .append("<")
+                    .append(column.isOnly()?"id":"result")
+                    .append(" column=\"")
+                    .append(column.getName())
+                    .append("\" property=\"")
+                    .append(column.getHumpName())
+                    .append("\" />\n");
+        }
+        return sb.toString();
+    }
+
+    /**********************************************************************************************/
+    /************************************** Html鍔ㄦ�佸瓧娈� *******************************************/
+    /**********************************************************************************************/
+
+    private String createHtmlMsg(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns){
+            if (column.isPrimaryKey()){ continue;}
+            if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                sb.append("    <div class=\"layui-inline\">\n")
+                        .append("        <div class=\"layui-input-inline cool-auto-complete\">\n")
+                        .append("            <input id=\"").append(column.getHumpName()).append("\"")
+                        .append(" class=\"layui-input\" name=\"").append(column.getName()).append("\" type=\"text\" placeholder=\"璇疯緭鍏" autocomplete=\"off\" style=\"display: none\">\n")
+                        .append("            <input id=\"").append(column.getHumpName()).append("\\$")
+                        .append("\" class=\"layui-input cool-auto-complete-div\" onclick=\"autoShow(this.id)\" type=\"text\" placeholder=\"").append(GeneratorUtils.supportHtmlName(column.getComment())).append("\" onfocus=this.blur()>\n")
+                        .append("            <div class=\"cool-auto-complete-window\">\n")
+                        .append("                <input class=\"cool-auto-complete-window-input\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("\" onkeyup=\"autoLoad(this.getAttribute('data-key'))\">\n")
+                        .append("                <select class=\"cool-auto-complete-window-select\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("Select\" onchange=\"confirmed(this.getAttribute('data-key'))\" multiple=\"multiple\">\n")
+                        .append("                </select>\n")
+                        .append("            </div>\n")
+                        .append("        </div>\n")
+                        .append("    </div>\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    private String createHtmlDialogMsg() {
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns){
+            if (column.isPrimaryKey()) {
+                continue;
+            }
+            sb.append("                <div class=\"layui-form-item\">\n");
+            sb.append("                    <label class=\"layui-form-label");
+            if (column.isNotNull()){
+                sb.append(" layui-form-required");
+            }
+            sb.append("\">").append(column.getComment()).append(": </label>\n");
+            sb.append("                    <div class=\"layui-input-block");
+            // 鍏宠仈澶栭敭
+            if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                sb.append(" cool-auto-complete");
+            }
+            sb.append("\">\n");
+            // 杈撳叆妗嗙被鍨�
+            if (Cools.isEmpty(column.getEnums())){
+                sb.append("                        <input class=\"layui-input\" name=\"").append(column.getHumpName());
+                if ("Date".equals(column.getType())){
+                    sb.append("\" id=\"").append(column.getHumpName()).append("\\$");
+                }
+                sb.append("\" placeholder=\"璇疯緭鍏�").append(column.getComment()).append("\"");
+                if (column.isNotNull()){
+                    sb.append(" lay-vertype=\"tips\" lay-verify=\"required\"");
+                }
+                // 鍏宠仈澶栭敭
+                if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                    sb.append(" style=\"display: none\"");
+                }
+                sb.append(">\n");
+
+                // 鍏宠仈澶栭敭
+                if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                    sb.append("                        <input id=\"").append(column.getHumpName()).append("\\$").append("\" name=\"").append(column.getHumpName()).append("\\$")
+                            .append("\" class=\"layui-input cool-auto-complete-div\" onclick=\"autoShow(this.id)\" type=\"text\" placeholder=\"璇疯緭鍏�").append(column.getComment()).append("\" onfocus=this.blur()>\n");
+                    sb.append("                        <div class=\"cool-auto-complete-window\">\n")
+                            .append("                            <input class=\"cool-auto-complete-window-input\" data-key=\"")
+                            .append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("\" onkeyup=\"autoLoad(this.getAttribute('data-key'))\">\n")
+                            .append("                            <select class=\"cool-auto-complete-window-select\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("Select\" onchange=\"confirmed(this.getAttribute('data-key'))\" multiple=\"multiple\">\n")
+                            .append("                            </select>\n")
+                            .append("                        </div>\n");
+                }
+            // 鏋氫妇绫诲瀷
+            } else {
+                sb.append("                        <select name=\"").append(column.getHumpName()).append("\"");
+                if (column.isNotNull()){
+                    sb.append(" lay-vertype=\"tips\" lay-verify=\"required\"");
+                }
+                sb.append(">\n");
+                sb.append("                            <option value=\"\">").append("璇烽�夋嫨").append(column.getComment()).append("</option>\n");
+                for (Map<String, Object> map : column.getEnums()){
+                    for (Map.Entry<String, Object> entry : map.entrySet()){
+                        sb.append("                            <option value=\"")
+                                .append(entry.getKey())
+                                .append("\">")
+                                .append(entry.getValue())
+                                .append("</option>\n");
+                    }
+                }
+                sb.append("                        </select>\n");
+            }
+
+            sb.append("                    </div>\n");
+            sb.append("                </div>\n");
+        }
+        return sb.toString();
+    }
+
+    private String createJsTableMsg(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns){
+//            if (column.isPrimaryKey()){ continue;}
+            sb.append("            ,{field: '");
+            if ("Date".equals(column.getType()) || !Cools.isEmpty(column.getEnums())){
+                // 鏃堕棿銆佹灇涓�  鏍煎紡鍖�
+                sb.append(column.getHumpName()).append("\\$");
+            } else {
+                // 涓婚敭淇グ
+                if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                    sb.append(column.getHumpName()).append("\\$");
+                } else {
+                    sb.append(column.getHumpName());
+                }
+            }
+            sb.append("', align: 'center',title: '").append(column.getComment()).append("'");
+            // 澶嶉�夋
+            if (column.isCheckBox()){
+                sb.append(", templet:function(row){\n")
+                        .append("                    var html = \"<input value='")
+                        .append(column.getHumpName()).append("' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='\"+row.LAY_TABLE_INDEX+\"'\";\n")
+                        .append("                    if(row.").append(column.getHumpName()).append(" === 'Y'){html += \" checked \";}\n")
+                        .append("                    html += \">\";\n")
+                        .append("                    return html;\n")
+                        .append("                }");
+            }
+            sb.append("}\n");
+        }
+        return sb.toString();
+    }
+
+    private String createJsFkContent(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns){
+            // 濡傛灉鏈夊叧鑱斿鍋�
+            if (!Cools.isEmpty(column.getForeignKeyMajor())){
+                sb.append("    window.load").append(column.getForeignKey()).append("Sel = function () {").append("\n")
+                        .append("        return xmSelect.render({").append("\n")
+                        .append("            el: '#").append(GeneratorUtils.firstCharConvert(column.getForeignKey(), true)).append("XmlSel',").append("\n")
+                        .append("            autoRow: true,").append("\n")
+                        .append("            filterable: true,").append("\n")
+                        .append("            remoteSearch: true,").append("\n")
+                        .append("            radio: true,").append("\n")
+                        .append("            remoteMethod: function (val, cb, show) {").append("\n")
+                        .append("                \\$.ajax({").append("\n")
+                        .append("                    url: baseUrl + \"/").append(GeneratorUtils.firstCharConvert(column.getForeignKey(), true)).append("/all/get/kv\",").append("\n")
+                        .append("                    headers: {'token': localStorage.getItem('token')},").append("\n")
+                        .append("                    data: {").append("\n")
+                        .append("                        condition: val").append("\n")
+                        .append("                    },").append("\n")
+                        .append("                    method: 'POST',").append("\n")
+                        .append("                    success: function (res) {").append("\n")
+                        .append("                        if (res.code === 200) {").append("\n")
+                        .append("                            cb(res.data)").append("\n")
+                        .append("                        } else {").append("\n")
+                        .append("                            cb([]);").append("\n")
+                        .append("                            layer.msg(res.msg, {icon: 2});").append("\n")
+                        .append("                        }").append("\n")
+                        .append("                    }").append("\n")
+                        .append("                });").append("\n")
+                        .append("            }").append("\n")
+                        .append("        });").append("\n")
+                        .append("    }").append("\n")
+                        .append("\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    private String createJsDateContent(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns) {
+            if (column.isPrimaryKey()) {
+                continue;
+            }
+            if ("Date".equals(column.getType())){
+                sb.append("            layDate.render({\n")
+                        .append("                elem: '#").append(column.getHumpName()).append("\\\\\\\\\\$',\n")
+                        .append("                type: 'datetime',\n")
+                        .append("                value: data!==undefined?data['").append(column.getHumpName()).append("$'").append("]:null\n")
+                        .append("            });\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    private String createJsPrimaryKeyMsg(){
+        StringBuilder sb = new StringBuilder();
+        for (Column column : columns) {
+            if (column.isPrimaryKey()) {
+                sb.append("#").append(column.getHumpName()).append(",");
+            }
+        }
+        if (sb.length() > 1){
+            if (sb.substring(sb.length() - 1).equals(",")) {
+                sb.deleteCharAt(sb.length()-1);
+            }
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/constant/SqlOsType.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/constant/SqlOsType.java
new file mode 100644
index 0000000..fd5f924
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/constant/SqlOsType.java
@@ -0,0 +1,9 @@
+package com.zy.asrs.framework.generators.constant;
+
+public enum SqlOsType {
+
+    MYSQL,
+    SQL_SERVER,
+    ;
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/domain/Column.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/domain/Column.java
new file mode 100644
index 0000000..926c148
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/domain/Column.java
@@ -0,0 +1,285 @@
+package com.zy.asrs.framework.generators.domain;
+
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.generators.CoolGenerator;
+import com.zy.asrs.framework.generators.constant.SqlOsType;
+import com.zy.asrs.framework.generators.utils.GeneratorUtils;
+
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by vincent on 2019-06-18
+ */
+public class Column {
+
+    private String name; // 琛ㄥ瓧娈靛悕
+    private String type; // 绫诲瀷
+    private String comment; // 澶囨敞
+    private String humpName; // 灏忛┘宄�
+    private boolean primaryKey; // 鍞竴涓婚敭
+    private boolean mainKey;  // 鏅�氫富閿�
+    private boolean notNull; // 闈炵┖
+    private boolean major; // 涓昏
+    private boolean image; // 鍥剧墖
+    private boolean checkBox; // 澶嶉�夋
+    private String foreignKey; // 澶栧仴瀹炰緥鍚�(澶ч┘宄�,濡俿ys_user ==> User)
+    private String foreignKeyMajor; // 澶栭敭(灏忛┘宄�)
+    private List<Map<String, Object>> enums; // 鏋氫妇鍊�
+    private Integer length; // 瀛楁闀垮害
+
+    public Column(Connection conn, String name, String type, String comment, boolean primaryKey, boolean mainKey, boolean notNull, Integer length, boolean init, SqlOsType sqlOsType) {
+        this.name = name;
+        this.type = type;
+        this.comment = "";
+        if (!Cools.isEmpty(comment)){
+            // 鏋氫妇
+            Pattern pattern1 = Pattern.compile("(.+?)(?=\\{)");
+            Matcher matcher1 = pattern1.matcher(comment);
+            // 澶栭敭
+            Pattern pattern11 = Pattern.compile("(.+?)(?=\\[)");
+            Matcher matcher11 = pattern11.matcher(comment);
+            // 鏋氫妇
+            if (matcher1.find()) {
+                this.comment = matcher1.group();
+                Pattern pattern2 = Pattern.compile("(?<=\\{)(.+?)(?=})");
+                Matcher matcher2 = pattern2.matcher(comment);
+                if (matcher2.find()) {
+                    String group = matcher2.group();
+                    if (!Cools.isEmpty(group)) {
+                        String[] values = group.split(",");
+                        this.enums = new ArrayList<>();
+                        for (String val : values) {
+                            Map<String, Object> map = new HashMap<>();
+                            String[] split = val.split(":");
+                            map.put(split[0], split[1]);
+                            enums.add(map);
+                        }
+                    }
+                }
+            //  澶栭敭
+            } else if (matcher11.find()){
+                this.comment = matcher11.group();
+                Pattern pattern22 = Pattern.compile("(?<=\\[)(.+?)(?=])");
+                Matcher matcher22 = pattern22.matcher(comment);
+                if (matcher22.find()) {
+                    String group = matcher22.group();
+                    if (!Cools.isEmpty(group)) {
+                        this.foreignKey = GeneratorUtils.getNameSpace(group);
+                        List<Column> foreignColumns = new ArrayList<>();
+                        if (init) {
+                            try {
+                                switch (sqlOsType) {
+                                    case MYSQL:
+                                        foreignColumns = CoolGenerator.getMysqlColumns(conn, group, false, sqlOsType);
+                                        break;
+                                    case SQL_SERVER:
+                                        foreignColumns = CoolGenerator.getSqlServerColumns(conn, group, false, sqlOsType);
+                                        break;
+                                    default:
+                                        break;
+                                }
+
+                            } catch (Exception e){
+                                e.printStackTrace();
+                            }
+                        }
+                        if (!Cools.isEmpty(foreignColumns)){
+                            for (Column column : foreignColumns){
+                                if (column.isMajor()){
+                                    this.foreignKeyMajor = GeneratorUtils.firstCharConvert(column.getHumpName(), false);
+                                }
+                            }
+                            if (Cools.isEmpty(this.foreignKeyMajor)){
+                                this.foreignKeyMajor = "Id";
+                            }
+                        }
+                    }
+                }
+            } else {
+                this.comment = comment;
+            }
+            // 涓昏瀛楁
+            if (comment.endsWith("(*)")){
+                this.comment = comment.substring(0, comment.length()-3);
+                this.major = true;
+            }
+            // 鍥剧墖瀛楁
+            if (comment.endsWith("(img)")){
+                this.comment = comment.substring(0, comment.length()-5);
+                this.image = true;
+            }
+            // 澶嶉�夋
+            if (comment.endsWith("(checkbox)")){
+                this.comment = comment.substring(0, comment.length()-10);
+                this.checkBox = true;
+            }
+        }
+//        if (primaryKey || mainKey){
+//            this.primaryKey = true;
+//        } else {
+//            this.primaryKey = false;
+//        }
+        this.primaryKey = primaryKey;
+        this.mainKey = mainKey;
+        this.notNull = notNull;
+        this.length = length;
+        this.humpName = GeneratorUtils._convert(name);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(final String type) {
+        this.type = type;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+    public String getWholeComment() {
+        if (!Cools.isEmpty(this.enums)){
+            StringBuilder sb = new StringBuilder(" ");
+            for (Map<String, Object> val : enums){
+                for (Map.Entry<String, Object> entry : val.entrySet()){
+                    sb.append(entry.getKey())
+                            .append(": ")
+                            .append(entry.getValue())
+                            .append("  ");
+                }
+            }
+            return comment + sb.toString();
+        }
+        return comment;
+    }
+
+    public void setComment(final String comment) {
+        this.comment = comment;
+    }
+
+    public String getHumpName() {
+        return humpName;
+    }
+
+//    public boolean isPrimaryKey() {
+//        return primaryKey || mainKey;
+//    }
+
+    public boolean isPrimaryKey() {
+        return primaryKey;
+    }
+
+    public boolean isOnly(){
+        return primaryKey;
+    }
+
+    public void setPrimaryKey(boolean primaryKey) {
+        this.primaryKey = primaryKey;
+    }
+
+    public boolean isNotNull() {
+        return notNull;
+    }
+
+    public void setNotNull(final boolean notNull) {
+        this.notNull = notNull;
+    }
+
+    public String getForeignKey() {
+        return foreignKey;
+    }
+
+    public void setForeignKey(final String foreignKey) {
+        this.foreignKey = foreignKey;
+    }
+
+    public String getForeignKeyMajor() {
+        return foreignKeyMajor;
+    }
+
+    public void setForeignKeyMajor(final String foreignKeyMajor) {
+        this.foreignKeyMajor = foreignKeyMajor;
+    }
+
+    public List<Map<String, Object>> getEnums() {
+        return enums;
+    }
+
+    public void setEnums(List<Map<String, Object>> enums) {
+        this.enums = enums;
+    }
+
+    public Integer getLength() {
+        return length;
+    }
+
+    public void setLength(final Integer length) {
+        this.length = length;
+    }
+
+    public boolean isMajor() {
+        return major;
+    }
+
+    public void setMajor(final boolean major) {
+        this.major = major;
+    }
+
+    public boolean isImage() {
+        return image;
+    }
+
+    public void setImage(final boolean image) {
+        this.image = image;
+    }
+
+    public boolean isCheckBox() {
+        return checkBox;
+    }
+
+    public void setCheckBox(boolean checkBox) {
+        this.checkBox = checkBox;
+    }
+
+    public boolean isMainKey() {
+        return mainKey;
+    }
+
+    public void setMainKey(boolean mainKey) {
+        this.mainKey = mainKey;
+    }
+
+    @Override
+    public String toString() {
+        return "Column{" +
+                "name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", comment='" + comment + '\'' +
+                ", humpName='" + humpName + '\'' +
+                ", primaryKey=" + primaryKey +
+                ", notNull=" + notNull +
+                ", major=" + major +
+                ", image=" + image +
+                ", foreignKey='" + foreignKey + '\'' +
+                ", foreignKeyMajor='" + foreignKeyMajor + '\'' +
+                ", enums=" + enums +
+                ", length=" + length +
+                '}';
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/utils/GeneratorUtils.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/utils/GeneratorUtils.java
new file mode 100644
index 0000000..e6d364d
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/utils/GeneratorUtils.java
@@ -0,0 +1,149 @@
+package com.zy.asrs.framework.generators.utils;
+
+import com.core.common.Cools;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.sql.Types.*;
+
+/**
+ * Created by vincent on 2019-06-18
+ */
+public class GeneratorUtils {
+
+    /**
+     * 涓嬪垝绾� ===>> 椹煎嘲鍛藉悕
+     * @param smallHump 灏忛┘宄板懡鍚�
+     */
+    public static String _convert(String str, boolean smallHump){
+        String[] split = str.split("_");
+        StringBuilder sb = new StringBuilder();
+        for (int i=0;i<split.length;i++){
+            sb.append(i==0&&smallHump?split[i]:split[i].substring(0, 1).toUpperCase()+split[i].substring(1));
+        }
+        return sb.toString();
+    }
+
+    public static String _convert(String str){
+        return _convert(str, true);
+    }
+
+    // sql绫诲瀷 ===>> java绫诲瀷
+    public static String getType(int type){
+        switch (type){
+            case BIT:
+                return "Boolean";
+            case TINYINT:
+                return "Short";
+            case SMALLINT:
+                return "Short";
+            case INTEGER:
+                return "Integer";
+            case BIGINT:
+                return "Long";
+            case DOUBLE:
+                return "Double";
+            case DECIMAL:
+                return "Double";
+            case NCHAR:
+                return "String";
+            case NVARCHAR:
+                return "String";
+            case CHAR:
+                return "String";
+            case VARCHAR:
+                return "String";
+            case DATE:
+                return "Date";
+            case TIMESTAMP:
+                return "Date";
+            case BLOB:
+                return "String";
+            case LONGVARCHAR:
+                return "String";
+            default:
+                return null;
+        }
+    }
+
+    // sql琛ㄥ悕 ===>> 鍘诲墠缂� 澶ч┘宄�
+    public static String getNameSpace(String tableName){
+        String[] strings = tableName.split("_");
+        StringBuilder sb = new StringBuilder();
+        for (int i=1;i<strings.length;i++){
+            if (i!=1){
+                sb.append("_");
+            }
+            sb.append(strings[i]);
+        }
+        return _convert(sb.toString(), false);
+    }
+
+    // htmlDetail 瀛楃閫傞厤
+    public static String supportHtmlName(String comment){
+        if (Cools.isEmpty(comment)){
+            return "";
+        }
+        if (comment.length() == 2){
+            return comment.charAt(0) + "銆�銆�" + comment.charAt(1);
+        } else if (comment.length() == 3){
+            return comment.charAt(0) + " " + comment.charAt(1) + " " +comment.charAt(2);
+        }
+        return comment;
+    }
+
+    /**
+     * 鑾峰彇mysql琛ㄥ瓧娈甸暱搴�
+     */
+    public static Integer getColumnLength(String typeMsg){
+        if (Cools.isEmpty(typeMsg)){
+            return null;
+        }
+        Pattern pattern = Pattern.compile("(?<=\\()(.+?)(?=\\))");
+        Matcher matcher = pattern.matcher(typeMsg);
+        if (matcher.find()){
+            String group = matcher.group();
+            if (group.contains(",")) {
+                group = group.split(",")[0];
+            }
+            return Integer.parseInt(group);
+        }
+        return null;
+    }
+
+    /**
+     * 瀛楃涓查瀛楁瘝澶у皬鍐欒浆鎹�
+     * @param str 瀛楃涓�
+     * @param low true锛氬皬鍐�   /   false锛氬ぇ鍐�
+     * @return the result
+     */
+    public static String firstCharConvert(String str, boolean low){
+        if (Cools.isEmpty(str)){
+            return "";
+        }
+        String firstChar = str.substring(0, 1);
+        if (low){
+            firstChar = firstChar.toLowerCase();
+        } else {
+            firstChar = firstChar.toUpperCase();
+        }
+        return firstChar + str.substring(1);
+    }
+
+    public static String firstCharConvert(String str){
+        return firstCharConvert(str, true);
+    }
+
+    /** 椹煎嘲杞笅鍒掔嚎 */
+    public static String humpToLine(String str) {
+        Matcher matcher = Pattern.compile("[A-Z]").matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/Algorithm.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/Algorithm.java
new file mode 100644
index 0000000..89da7a9
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/Algorithm.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.framework.utils;
+
+/**
+ * 绠楁硶
+ * Created by vincent on 2023/3/8
+ */
+public class Algorithm {
+
+    /**
+     *
+     * Floyd 寮楁礇浼婂痉绠楁硶
+     *
+     *  x | 1 | 2 | 3 | 4
+     *  1 | 0 | 3 | 4 | 2
+     *  2 | 3 | 0 | 0 | 0
+     *  3 | 4 | 0 | 0 | 3
+     *  4 | 2 | 0 | 3 | 0
+     */
+
+
+
+}
diff --git a/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/SignUtils.java b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/SignUtils.java
new file mode 100644
index 0000000..5843030
--- /dev/null
+++ b/zy-asrs-framework/src/main/java/com/zy/asrs/framework/utils/SignUtils.java
@@ -0,0 +1,53 @@
+package com.zy.asrs.framework.utils;
+
+import com.core.common.Cools;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static javax.xml.bind.JAXBIntrospector.getValue;
+
+/**
+ * Created by vincent on 2020-01-06
+ */
+public class SignUtils {
+
+    /**
+     * 鐢熸垚绛惧悕
+     * 锛堣鍒欏涓嬶細
+     * 绗竴姝ワ細
+     *  璁炬墍鏈夊彂閫佹垨鑰呮帴鏀跺埌鐨勬暟鎹负闆嗗悎M锛�
+     *  灏嗛泦鍚圡鍐呴潪绌哄弬鏁板�肩殑鍙傛暟鎸夌収鍙傛暟鍚岮SCII鐮佷粠灏忓埌澶ф帓搴忥紙瀛楀吀搴忥級锛�
+     *  浣跨敤URL閿�煎鐨勬牸寮忥紙鍗砶ey1=value1&key2=value2鈥︼級鎷兼帴鎴愬瓧绗︿覆stringA
+     *
+     * 绗簩姝ワ細
+     *  鍦╯tringA鏈�鍚庢嫾鎺ヤ笂key寰楀埌stringSignTemp瀛楃涓诧紝
+     *  骞跺stringSignTemp杩涜MD5杩愮畻锛屽啀灏嗗緱鍒扮殑瀛楃涓叉墍鏈夊瓧绗﹁浆鎹负澶у啓锛�
+     *  寰楀埌sign鍊約ignValue
+     *  锛�
+     * @param map 鍙傛暟闆嗗悎
+     * @param secret 瀵嗛挜
+     * @return the sign 绛惧悕
+     */
+    public static String sign(Map<String, Object> map, String secret) {
+        List<String> list = new ArrayList<>();
+        for (String key : map.keySet()) {
+            if (!key.equals("sign") && map.get(key) != null) {
+                list.add(key + "=" + getValue(key) + "&");
+            }
+        }
+        int size = list.size();
+        String[] arrayToSort = list.toArray(new String[size]);
+        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < size; i++) {
+            sb.append(arrayToSort[i]);
+        }
+        String stringA = sb.toString();
+        stringA += "key=" + secret;
+        return Cools.md5(stringA).toUpperCase();
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/resources/META-INF/spring.factories b/zy-asrs-framework/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..73bd6d4
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.core.config.CoolBaseConfig
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/resources/templates/Controller.txt b/zy-asrs-framework/src/main/resources/templates/Controller.txt
new file mode 100644
index 0000000..ebe2755
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Controller.txt
@@ -0,0 +1,135 @@
+package @{COMPANYNAME}.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import @{COMPANYNAME}.entity.@{ENTITYNAME};
+import @{COMPANYNAME}.service.@{ENTITYNAME}Service;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.domain.KeyValueVo;
+import @{SYSTEMPACKAGE}.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class @{ENTITYNAME}Controller extends BaseController {
+
+    @Autowired
+    private @{ENTITYNAME}Service @{SIMPLEENTITYNAME}Service;
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(@{SIMPLEENTITYNAME}Service.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/page/auth")
+    @ManagerAuth
+    public R page(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<@{ENTITYNAME}> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(@{ENTITYNAME}.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(@{SIMPLEENTITYNAME}Service.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/add/auth")
+    @ManagerAuth
+    public R add(@{ENTITYNAME} @{SIMPLEENTITYNAME}) {
+        @{SIMPLEENTITYNAME}Service.insert(@{SIMPLEENTITYNAME});
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/@{SIMPLEENTITYNAME}/update/auth")
+	@ManagerAuth
+    public R update(@{ENTITYNAME} @{SIMPLEENTITYNAME}){
+        if (Cools.isEmpty(@{SIMPLEENTITYNAME}) || null==@{SIMPLEENTITYNAME}.get@{PRIMARYKEYCOLUMN}()){
+            return R.error();
+        }
+        @{SIMPLEENTITYNAME}Service.updateById(@{SIMPLEENTITYNAME});
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            @{SIMPLEENTITYNAME}Service.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<@{ENTITYNAME}> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("@{SIMPLEENTITYNAME}"));
+        convert(map, wrapper);
+        List<@{ENTITYNAME}> list = @{SIMPLEENTITYNAME}Service.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}Query/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<@{ENTITYNAME}> wrapper = new EntityWrapper<>();
+        wrapper.like("@{MAJORCOLUMN}", condition);
+        Page<@{ENTITYNAME}> page = @{SIMPLEENTITYNAME}Service.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (@{ENTITYNAME} @{SIMPLEENTITYNAME} : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", @{SIMPLEENTITYNAME}.get@{PRIMARYKEYCOLUMN}());
+            map.put("value", @{SIMPLEENTITYNAME}.get@{MAJORCOLUMN_UP}());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/@{SIMPLEENTITYNAME}/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<@{ENTITYNAME}> wrapper = new EntityWrapper<@{ENTITYNAME}>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != @{SIMPLEENTITYNAME}Service.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(@{ENTITYNAME}.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping("/@{SIMPLEENTITYNAME}/all/get/kv")
+    @ManagerAuth
+    public R getDataKV(@RequestParam(required = false) String condition) {
+        List<KeyValueVo> vos = new ArrayList<>();
+        Wrapper<@{ENTITYNAME}> wrapper = new EntityWrapper<@{ENTITYNAME}>().andNew().like("@{MAJORCOLUMN}", condition).orderBy("create_time", false);
+        @{SIMPLEENTITYNAME}Service.selectPage(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.get@{MAJORCOLUMN_UP}()), item.get@{PRIMARYKEYCOLUMN}())));
+        return R.ok().add(vos);
+    }
+
+}
diff --git a/zy-asrs-framework/src/main/resources/templates/Entity.txt b/zy-asrs-framework/src/main/resources/templates/Entity.txt
new file mode 100644
index 0000000..69d0b41
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Entity.txt
@@ -0,0 +1,16 @@
+package @{COMPANYNAME}.entity;
+
+@{ENTITYIMPORT}
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("@{TABLENAME}")
+public class @{ENTITYNAME} implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+@{ENTITYCONTENT}
+}
diff --git a/zy-asrs-framework/src/main/resources/templates/Html.txt b/zy-asrs-framework/src/main/resources/templates/Html.txt
new file mode 100644
index 0000000..b671f55
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Html.txt
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                     <div class="layui-inline" style="width: 300px">
+                        <div class="layui-input-inline">
+                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="@{SIMPLEENTITYNAME}" lay-filter="@{SIMPLEENTITYNAME}"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/@{SIMPLEENTITYNAME}/@{SIMPLEENTITYNAME}.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <div id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+@{HTMLDIALOGCONTENT}
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </div>
+</script>
+</html>
+
diff --git a/zy-asrs-framework/src/main/resources/templates/Js.txt b/zy-asrs-framework/src/main/resources/templates/Js.txt
new file mode 100644
index 0000000..0d00504
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Js.txt
@@ -0,0 +1,252 @@
+var pageCurr;
+var pageCount = 0;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin', 'xmSelect'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var xmSelect = layui.xmSelect;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#@{SIMPLEENTITYNAME}',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/@{SIMPLEENTITYNAME}/page/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+@{JSTABLECONTENT}
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;pageCount=count;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(@{SIMPLEENTITYNAME})', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(@{SIMPLEENTITYNAME})', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.@{PRIMARYKEYCOLUMN0};
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        '@{SIMPLEENTITYNAME}': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/@{SIMPLEENTITYNAME}/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(@{SIMPLEENTITYNAME})', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.@{PRIMARYKEYCOLUMN0}]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/@{SIMPLEENTITYNAME}/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/@{SIMPLEENTITYNAME}/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(true);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(true);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+@{JSDATECONTENT}
+        }, 300);
+    }
+    layDateRender();
+
+@{JSFOREIGNKEYCONTENT}
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(search) {
+    if (pageCount === 0 || search) {
+        let searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        tableIns.reload({
+            where: searchData,
+            page: {curr: pageCurr}
+        });
+    } else {
+        $(".layui-laypage-btn")[0].click();
+    }
+}
diff --git a/zy-asrs-framework/src/main/resources/templates/Mapper.txt b/zy-asrs-framework/src/main/resources/templates/Mapper.txt
new file mode 100644
index 0000000..2188013
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Mapper.txt
@@ -0,0 +1,12 @@
+package @{COMPANYNAME}.mapper;
+
+import @{COMPANYNAME}.entity.@{ENTITYNAME};
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface @{ENTITYNAME}Mapper extends BaseMapper<@{ENTITYNAME}> {
+
+}
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/resources/templates/Service.txt b/zy-asrs-framework/src/main/resources/templates/Service.txt
new file mode 100644
index 0000000..ea76166
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Service.txt
@@ -0,0 +1,8 @@
+package @{COMPANYNAME}.service;
+
+import @{COMPANYNAME}.entity.@{ENTITYNAME};
+import com.baomidou.mybatisplus.service.IService;
+
+public interface @{ENTITYNAME}Service extends IService<@{ENTITYNAME}> {
+
+}
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/resources/templates/ServiceImpl.txt b/zy-asrs-framework/src/main/resources/templates/ServiceImpl.txt
new file mode 100644
index 0000000..732073e
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/ServiceImpl.txt
@@ -0,0 +1,12 @@
+package @{COMPANYNAME}.service.impl;
+
+import @{COMPANYNAME}.mapper.@{ENTITYNAME}Mapper;
+import @{COMPANYNAME}.entity.@{ENTITYNAME};
+import @{COMPANYNAME}.service.@{ENTITYNAME}Service;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("@{SIMPLEENTITYNAME}Service")
+public class @{ENTITYNAME}ServiceImpl extends ServiceImpl<@{ENTITYNAME}Mapper, @{ENTITYNAME}> implements @{ENTITYNAME}Service {
+
+}
\ No newline at end of file
diff --git a/zy-asrs-framework/src/main/resources/templates/Sql.txt b/zy-asrs-framework/src/main/resources/templates/Sql.txt
new file mode 100644
index 0000000..c11d64d
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Sql.txt
@@ -0,0 +1,18 @@
+-- save @{SIMPLEENTITYNAME} record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}/@{SIMPLEENTITYNAME}.html', '@{SIMPLEENTITYNAME}绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}/@{SIMPLEENTITYNAME}.html', N'@{SIMPLEENTITYNAME}绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/zy-asrs-framework/src/main/resources/templates/Xml.txt b/zy-asrs-framework/src/main/resources/templates/Xml.txt
new file mode 100644
index 0000000..6a8b3e5
--- /dev/null
+++ b/zy-asrs-framework/src/main/resources/templates/Xml.txt
@@ -0,0 +1,10 @@
+<?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="@{COMPANYNAME}.mapper.@{ENTITYNAME}Mapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="@{COMPANYNAME}.entity.@{ENTITYNAME}">
+@{XMLCONTENT}
+    </resultMap>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1