From 17055fd8d36504b79a5def28f5d4b4740faf012d Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 25 三月 2022 13:47:35 +0800
Subject: [PATCH] TDMQ工具集成

---
 src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java                        |    5 
 src/main/java/org/yeshi/utils/generater/GeneraterManager.java                          |    3 
 src/main/resources/generater/service/method/impl/mybatis/delete.ftl                    |    2 
 src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java                 |   15 
 src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java             |   15 
 pom.xml                                                                                |   26 
 src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java               |   11 
 src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java                          |    9 
 src/main/resources/generater/admin/adminController.template                            |    6 
 src/main/java/org/yeshi/utils/exception/MailSendException.java                         |   32 +
 src/main/java/org/yeshi/utils/generater/GeneraterUtil.java                             |   21 
 src/main/java/org/yeshi/utils/statistic/BaseStatisticTimeQuery.java                    |   41 +
 src/main/java/org/yeshi/utils/statistic/StatisticValueResult.java                      |   30 +
 src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java                                |   16 
 src/main/resources/generater/admin/update.ftl                                          |   16 
 src/main/resources/generater/dao/mybatisDBXML.ftl                                      |    2 
 src/main/java/org/yeshi/utils/sms/VerifyCodeFactory.java                               |   92 +++
 src/main/resources/generater/service/serviceImpl.template                              |    1 
 src/main/resources/generater/dao/mongoDBDao.template                                   |    2 
 src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java |   34 +
 src/main/java/org/yeshi/utils/mail/EmailApiUtil.java                                   |  104 ++++
 src/main/java/org/yeshi/utils/HttpUtil.java                                            |    2 
 src/main/resources/generater/admin/list.ftl                                            |  109 ++--
 src/main/java/org/yeshi/utils/statistic/BaseStatisticMySQLTimeQuery.java               |   50 ++
 src/main/resources/generater/admin/form/text.ftl                                       |    3 
 src/test/java/com/generater/GeneratorTest.java                                         |   10 
 src/main/java/org/yeshi/utils/statistic/StatisticNumberResult.java                     |   28 +
 src/main/java/org/yeshi/utils/statistic/StatisticTimeSpan.java                         |   26 +
 src/main/java/org/yeshi/utils/annotation/RequestMonitor.java                           |   16 
 src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java                     |    2 
 src/main/java/org/yeshi/utils/mail/EmailInfo.java                                      |   65 ++
 src/main/java/org/yeshi/utils/statistic/StatisticResulterFilterUtil.java               |  104 ++++
 src/main/java/org/yeshi/utils/ThreadUtil.java                                          |   27 +
 src/main/resources/generater/admin/add.ftl                                             |    2 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java                  |   28 +
 src/main/java/org/yeshi/utils/mq/TDMQUtil.java                                         |  503 ++++++++++++++++++++
 36 files changed, 1,346 insertions(+), 112 deletions(-)

diff --git a/pom.xml b/pom.xml
index 401b9d0..a131bd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,9 +11,17 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <org.springframework-version>4.3.0.RELEASE</org.springframework-version>
-        <spring.mongodb.version>1.10.10.RELEASE</spring.mongodb.version>
+        <spring.mongodb.version>3.0.5.RELEASE</spring.mongodb.version>
         <kafka.client.version>0.10.1.1</kafka.client.version>
     </properties>
+
+    <repositories>
+        <repository>
+            <id>nexus</id>
+            <name>nexus</name>
+            <url>http://193.112.35.168:8889/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
 
     <dependencies>
         <dependency>
@@ -192,7 +200,7 @@
         <dependency>
             <groupId>org.springframework.data</groupId>
             <artifactId>spring-data-mongodb-cross-store</artifactId>
-            <version>${spring.mongodb.version}</version>
+            <version>2.1.21.RELEASE</version>
         </dependency>
 
         <dependency>
@@ -279,12 +287,16 @@
             <groupId>ok-http</groupId>
             <artifactId>okhttp</artifactId>
             <version>3.14.2</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/libs/okhttp-3.14.2.jar</systemPath>
         </dependency>
 
         <dependency>
             <groupId>okio</groupId>
             <artifactId>okio</artifactId>
             <version>1.17.2</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/libs/okio-1.17.2.jar</systemPath>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
@@ -337,6 +349,14 @@
                     <artifactId>slf4j-log4j12</artifactId>
                 </exclusion>
             </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
+            <!-- 璇峰埌https://search.maven.org/search?q=tencentcloud-sdk-java鏌ヨ鎵�鏈夌増鏈紝鏈�鏂扮増鏈涓� -->
+            <version>3.1.472</version>
         </dependency>
 
 
@@ -398,8 +418,6 @@
                     </execution>
                 </executions>
             </plugin>
-
-
         </plugins>
         <resources>
             <resource>
diff --git a/src/main/java/org/yeshi/utils/HttpUtil.java b/src/main/java/org/yeshi/utils/HttpUtil.java
index 8483bc2..555f9ef 100644
--- a/src/main/java/org/yeshi/utils/HttpUtil.java
+++ b/src/main/java/org/yeshi/utils/HttpUtil.java
@@ -450,7 +450,7 @@
 
     public static String post(String url, Map<String, String> map, Map<String, String> headers) {
         HttpClient client = new HttpClient();
-        // client.getHostConfiguration().setProxy("192.168.1.122", 8888);
+//         client.getHostConfiguration().setProxy("192.168.3.122", 8888);
         PostMethod pm = new PostMethod(url);// 鍒涘缓HttpPost瀵硅薄
         NameValuePair[] ns = new NameValuePair[map.keySet().size()];
         Iterator<String> its = map.keySet().iterator();
diff --git a/src/main/java/org/yeshi/utils/ThreadUtil.java b/src/main/java/org/yeshi/utils/ThreadUtil.java
new file mode 100644
index 0000000..0b4c31a
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/ThreadUtil.java
@@ -0,0 +1,27 @@
+package org.yeshi.utils;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author hxh
+ * @title: ThreadUtil
+ * @description: TODO
+ * @date 2021/12/2 17:50
+ */
+public class ThreadUtil {
+
+    private static LinkedBlockingQueue<Runnable> queue=new LinkedBlockingQueue<Runnable>(100);
+
+    private static ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(30, 3000, 20, TimeUnit.SECONDS, queue);
+
+    static{
+        threadPoolExecutor.allowCoreThreadTimeOut(true);
+    }
+
+    public static void run(Runnable runnable){
+        threadPoolExecutor.execute(runnable);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/yeshi/utils/annotation/RequestMonitor.java b/src/main/java/org/yeshi/utils/annotation/RequestMonitor.java
new file mode 100644
index 0000000..b210a36
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/annotation/RequestMonitor.java
@@ -0,0 +1,16 @@
+package org.yeshi.utils.annotation;
+
+/**
+ * @author Administrator
+ * @title: RequestMonitor
+ * @projectName utils
+ * @description: 璇锋眰鐩戞帶
+ * @date 2021/10/1418:45
+ */
+public @interface RequestMonitor {
+    //redis鐨勪富閿�
+    String key() default "";
+
+    //鏈�澶ч棿闅旀椂闂� 鍗曚綅涓簊
+    int maxSpaceTime();
+}
diff --git a/src/main/java/org/yeshi/utils/exception/MailSendException.java b/src/main/java/org/yeshi/utils/exception/MailSendException.java
new file mode 100644
index 0000000..bd678b0
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/exception/MailSendException.java
@@ -0,0 +1,32 @@
+package org.yeshi.utils.exception;
+
+public class MailSendException extends Exception {
+
+    public final static int CODE_NETWORK_ERROR = 1;
+    public final static int CODE_BUSINESS_ERROR = 2;
+
+    private static final long serialVersionUID = 1L;
+    private int code;
+    private String msg;
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public MailSendException(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public MailSendException() {
+    }
+
+    @Override
+    public String getMessage() {
+        return this.msg;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
index 68e1912..ed8d621 100644
--- a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
@@ -225,6 +225,9 @@
         saveFile(result, new File(path, controllerName + ".java").getAbsolutePath());
 
 
+        if (!new File(htmlDir).exists()) {
+            new File(htmlDir).mkdirs();
+        }
         result = GeneraterUtil.createAdminPageForList(generaterInfo);
         saveFile(result, new File(htmlDir, htmlNamePrefix + "_list.html").getAbsolutePath());
 
diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterUtil.java b/src/main/java/org/yeshi/utils/generater/GeneraterUtil.java
index 204c1d7..a51678a 100644
--- a/src/main/java/org/yeshi/utils/generater/GeneraterUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterUtil.java
@@ -21,52 +21,52 @@
 public class GeneraterUtil {
 
     public static String createException(ExceptionVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\exception.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/exception.template"));
         System.out.println(result);
         return result;
     }
 
     public static String createMongoDBDao(MongoDBDaoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mongoDBDao.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/dao/mongoDBDao.template"));
         System.out.println(result);
         return result;
     }
 
 
     public static String createMybatisDBMapper(MyBatisDBDaoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBDao.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/dao/mybatisDBDao.template"));
         System.out.println(result);
         return result;
     }
 
     public static String createMybatisDBMapperXML(MyBatisDBDaoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBXML.ftl"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/dao/mybatisDBXML.ftl"));
         System.out.println(result);
         return result;
     }
 
 
     public static String createQuery(QueryVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\queryVO.ftl"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/service/queryVO.ftl"));
         System.out.println(result);
         return result;
     }
 
     public static String createService(ServiceInfoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\service.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/service/service.template"));
         System.out.println(result);
         return result;
     }
 
     public static String createServiceImpl(ServiceImplInfoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\serviceImpl.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/service/serviceImpl.template"));
         System.out.println(result);
         return result;
     }
 
 
     public static String createAdminController(AdminControllerInfoVO vo) throws IOException {
-        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\admin\\adminController.template"));
+        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/admin/adminController.template"));
         System.out.println(result);
         return result;
     }
@@ -115,5 +115,10 @@
         return result;
     }
 
+    public static void main(String[] args) {
+        InputStream input = GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/dao/mybatisDBDao.template");
+        System.out.println(input);
+    }
+
 
 }
diff --git a/src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java b/src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java
index 1dcc81d..7512520 100644
--- a/src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java
+++ b/src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java
@@ -37,7 +37,7 @@
 
     //鏄剧ず绫诲瀷
     enum ShowType {
-        TEXT, IMG;
+        TEXT, IMG,SWITCH;
     }
 
 
diff --git a/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
index 14af015..791010a 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
@@ -13,8 +13,9 @@
 
     public ClassInfo(String name, String clazz) {
         this.name = name;
-        this.clazz = clazz.replace("$",".");
+        this.clazz = clazz.replace("$", ".");
     }
+
 
     public String getName() {
         return name;
@@ -29,6 +30,10 @@
     }
 
     public void setClazz(String clazz) {
-        this.clazz = clazz.replace("$",".");
+        this.clazz = clazz.replace("$", ".");
+    }
+
+    public static ClassInfo create(Class clazz) {
+        return new ClassInfo(clazz.getSimpleName(), clazz.getName());
     }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java b/src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java
index 09ef57a..2fc71ca 100644
--- a/src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java
+++ b/src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java
@@ -10,24 +10,23 @@
     private String controllerPackage;
     private String htmlDir;
 
-    public AdminGeneraterParams(String controllerPackage, String htmlDir) {
-        this.controllerPackage = controllerPackage;
-        this.htmlDir = htmlDir;
-    }
+
 
     public String getControllerPackage() {
         return controllerPackage;
     }
 
-    public void setControllerPackage(String controllerPackage) {
+    public AdminGeneraterParams setControllerPackage(String controllerPackage) {
         this.controllerPackage = controllerPackage;
+        return this;
     }
 
     public String getHtmlDir() {
         return htmlDir;
     }
 
-    public void setHtmlDir(String htmlDir) {
+    public AdminGeneraterParams setHtmlDir(String htmlDir) {
         this.htmlDir = htmlDir;
+        return this;
     }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java b/src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java
index 30f34be..06ab359 100644
--- a/src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java
+++ b/src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java
@@ -10,24 +10,27 @@
     private String daoPackage;
     private String mapperXMLDir;
 
-    public DaoGeneraterParams(String daoPackage, String mapperXMLDir) {
-        this.daoPackage = daoPackage;
-        this.mapperXMLDir = mapperXMLDir;
-    }
+
 
     public String getDaoPackage() {
         return daoPackage;
     }
 
-    public void setDaoPackage(String daoPackage) {
+    public DaoGeneraterParams setDaoPackage(String daoPackage) {
         this.daoPackage = daoPackage;
+        return this;
     }
 
     public String getMapperXMLDir() {
         return mapperXMLDir;
     }
 
-    public void setMapperXMLDir(String mapperXMLDir) {
+    public DaoGeneraterParams setMapperXMLDir(String mapperXMLDir) {
         this.mapperXMLDir = mapperXMLDir;
+        return this;
     }
+
+
+
+
 }
diff --git a/src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java b/src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java
index 8f0dcd8..ad02f5e 100644
--- a/src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java
+++ b/src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java
@@ -12,33 +12,32 @@
     private String serviceInterPackage;
     private String serviceImplPackage;
 
-    public ServiceGeneraterParams(String queryPackage, String serviceInterPackage, String serviceImplPackage) {
-        this.queryPackage = queryPackage;
-        this.serviceInterPackage = serviceInterPackage;
-        this.serviceImplPackage = serviceImplPackage;
-    }
+
 
     public String getQueryPackage() {
         return queryPackage;
     }
 
-    public void setQueryPackage(String queryPackage) {
+    public ServiceGeneraterParams setQueryPackage(String queryPackage) {
         this.queryPackage = queryPackage;
+        return this;
     }
 
     public String getServiceInterPackage() {
         return serviceInterPackage;
     }
 
-    public void setServiceInterPackage(String serviceInterPackage) {
+    public ServiceGeneraterParams setServiceInterPackage(String serviceInterPackage) {
         this.serviceInterPackage = serviceInterPackage;
+        return this;
     }
 
     public String getServiceImplPackage() {
         return serviceImplPackage;
     }
 
-    public void setServiceImplPackage(String serviceImplPackage) {
+    public ServiceGeneraterParams setServiceImplPackage(String serviceImplPackage) {
         this.serviceImplPackage = serviceImplPackage;
+        return this;
     }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java b/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java
index 6ade380..53e4495 100644
--- a/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java
@@ -113,10 +113,11 @@
         Field[] fields = entity.getDeclaredFields();
         for (Field fd : fields) {
             Annotation[] as = fd.getAnnotations();
-            FormRowData formRowData = null;
             for (Annotation an : as) {
                 if (an instanceof Show) {
-                    list.add(getParamsMap(an));
+                    Map<String, Object> map = getParamsMap(an);
+                    map.put("identifier", fd.getName());
+                    list.add(map);
                 }
             }
         }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
index e55a0eb..a90b56a 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
@@ -25,6 +25,10 @@
     //鍚嶇О
     private String controllerName;
 
+    private boolean add;
+    private boolean update;
+    private boolean delete;
+
 
     public static class Builder {
         private AdminGeneraterInfo generaterInfo;
@@ -77,8 +81,12 @@
             vo.setPackageName(packageName);
             vo.setQueryVO(query);
             vo.setService(service);
+            vo.setAdd(generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0);
+            vo.setUpdate(generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0 && generaterInfo.getControllerData().edit());
+            vo.setDelete(generaterInfo.getControllerData().delete());
+
             vo.setIdentifyIdType(EntityUtil.getIdentifyId(generaterInfo.getEntity()).getType().getSimpleName());
-            vo.setControllerName(vo.getEntity().getName()+"AdminController");
+            vo.setControllerName(vo.getEntity().getName() + "AdminController");
             return vo;
         }
 
@@ -152,4 +160,28 @@
     public void setControllerName(String controllerName) {
         this.controllerName = controllerName;
     }
+
+    public boolean isAdd() {
+        return add;
+    }
+
+    public void setAdd(boolean add) {
+        this.add = add;
+    }
+
+    public boolean isUpdate() {
+        return update;
+    }
+
+    public void setUpdate(boolean update) {
+        this.update = update;
+    }
+
+    public boolean isDelete() {
+        return delete;
+    }
+
+    public void setDelete(boolean delete) {
+        this.delete = delete;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
index 26febb4..e4f1496 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
@@ -30,6 +30,10 @@
     private List<FormInputRegexVerifyVO> regexVerifyList;
     //鍒楄〃鎺ュ彛
     private String listApi;
+
+    //鍒犻櫎鎺ュ彛
+    private String deleteApi;
+
     //娣诲姞椤佃矾寰�
     private String addPagePath;
     //鏇存柊椤佃矾寰�
@@ -48,11 +52,21 @@
         public ListInfoVO build() {
             ListInfoVO vo = new ListInfoVO();
             vo.setListApi(generaterInfo.getControllerData().mapping() + "/list");
-            vo.setAddPagePath("add.html");
-            vo.setUpdatePagePath("update.html");
+            if (generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
+                vo.setAddPagePath(generaterInfo.getEntity().getSimpleName().toLowerCase() + "_add.html");
+            }
+
+            if (generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0) {
+                vo.setUpdatePagePath(generaterInfo.getEntity().getSimpleName().toLowerCase() + "_update.html");
+            }
             vo.setSearchFormRows(generaterInfo.getSearchFormRows());
             vo.setShowFileds(generaterInfo.getShowDataList());
-            vo.setTitle("淇敼" + generaterInfo.getControllerData().title());
+            vo.setTitle(generaterInfo.getControllerData().title());
+
+            if (generaterInfo.getControllerData().delete()) {
+                vo.setDeleteApi(generaterInfo.getControllerData().mapping() + "/delete");
+            }
+
             //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
             List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
             for (FormRowData row : vo.getSearchFormRows()) {
@@ -190,4 +204,12 @@
     public void setShowFileds(List<Map<String, Object>> showFileds) {
         this.showFileds = showFileds;
     }
+
+    public String getDeleteApi() {
+        return deleteApi;
+    }
+
+    public void setDeleteApi(String deleteApi) {
+        this.deleteApi = deleteApi;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/mail/EmailApiUtil.java b/src/main/java/org/yeshi/utils/mail/EmailApiUtil.java
new file mode 100644
index 0000000..7c2e85c
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/mail/EmailApiUtil.java
@@ -0,0 +1,104 @@
+package org.yeshi.utils.mail;
+
+import net.sf.json.JSONObject;
+import org.yeshi.utils.HttpUtil;
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.encrypt.AESUtil;
+import org.yeshi.utils.exception.MailSendException;
+
+import java.util.*;
+
+/**
+ * @author hxh
+ * @title: EmailApiUtil
+ * @description: 閭欢甯姪
+ * @date 2022/3/15 17:04
+ */
+public class EmailApiUtil {
+
+    final static String AESKEY = "123bN5%M7*~a8888";
+    final static String SIGNKEY = "EmailYeshi@88889!~";
+    final static String API_SEND = "http://api.mail.yeshitv.com:8081/email/send";
+
+
+    /**
+     * @return void
+     * @author hxh
+     * @description 閭欢鍙戦�佹帴鍙�
+     * @date 18:13 2022/3/15
+     * @param: emailInfo
+     **/
+    public static void sendEmail(EmailInfo emailInfo) throws MailSendException {
+        JSONObject accountJSON = new JSONObject();
+        accountJSON.put("toEmail", emailInfo.getToEmail());
+        accountJSON.put("fromEmail", emailInfo.getFromEmail());
+        accountJSON.put("fromEmailPwd", emailInfo.getFormEmailPwd());
+        Map<String, String> params = getBaseParams();
+        params.put("title", emailInfo.getTitle());
+        params.put("content", emailInfo.getContent());
+        params.put("app", emailInfo.getApp());
+        params.put("accountInfo", AESUtil.encrypt(accountJSON.toString(), AESKEY));
+        params.put("sign", getSign(params));
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
+
+        try {
+            String result = HttpUtil.post(API_SEND, params, headers);
+            if (StringUtil.isNullOrEmpty(result)) {
+                throw new Exception("鍐呭杩斿洖涓虹┖");
+            }
+            JSONObject resultJSON = JSONObject.fromObject(result);
+            if (resultJSON.optInt("code") != 0) {
+                throw new MailSendException(MailSendException.CODE_BUSINESS_ERROR, resultJSON.optString("msg"));
+            }
+        } catch (MailSendException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new MailSendException(MailSendException.CODE_NETWORK_ERROR, "鎺ュ彛缃戠粶鍑洪敊");
+        }
+    }
+
+    private static Map<String, String> getBaseParams() {
+        Map<String, String> params = new HashMap<>();
+        params.put("timestamp", System.currentTimeMillis() + "");
+        return params;
+    }
+
+    private static String getSign(Map<String, String> params) {
+        List<String> list = new ArrayList<>();
+        for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) {
+            String key = its.next();
+            if ("sign".equalsIgnoreCase(key))
+                continue;
+            list.add(key + "=" + params.get(key));
+        }
+
+        Collections.sort(list);
+        String str = StringUtil.concat(list, "&");
+        str += SIGNKEY;
+        String sign = StringUtil.Md5(str);
+        return sign;
+    }
+
+//    public static void main(String[] args) {
+//
+//        //"he15901227708@163.com", "hexiaohui1011", "hexiaohui@banliapp.com", "娴嬭瘯", "娴嬭瘯鍐呭"
+//        EmailInfo emailInfo = new EmailInfo();
+//        emailInfo.setApp("test");
+//        emailInfo.setContent("娴嬭瘯鍐呭");
+//        emailInfo.setFormEmailPwd("hexiaohui1011");
+//        emailInfo.setFromEmail("he15901227708@163.com");
+//        emailInfo.setTitle("娴嬭瘯");
+//        emailInfo.setToEmail("hexiaohui@banliapp.com");
+//
+//        try {
+//            EmailApiUtil.sendEmail(emailInfo);
+//        } catch (MailSendException e) {
+//            e.printStackTrace();
+//        }
+//
+//    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/mail/EmailInfo.java b/src/main/java/org/yeshi/utils/mail/EmailInfo.java
new file mode 100644
index 0000000..7369397
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/mail/EmailInfo.java
@@ -0,0 +1,65 @@
+package org.yeshi.utils.mail;
+
+/**
+ * @author hxh
+ * @title: EmailInfo
+ * @description: 閭欢淇℃伅
+ * @date 2022/3/15 18:11
+ */
+public class EmailInfo {
+    private String fromEmail;
+    private String formEmailPwd;
+    private String toEmail;
+    private String title;
+    private String content;
+    private String app;
+
+
+    public String getFromEmail() {
+        return fromEmail;
+    }
+
+    public void setFromEmail(String fromEmail) {
+        this.fromEmail = fromEmail;
+    }
+
+    public String getFormEmailPwd() {
+        return formEmailPwd;
+    }
+
+    public void setFormEmailPwd(String formEmailPwd) {
+        this.formEmailPwd = formEmailPwd;
+    }
+
+    public String getToEmail() {
+        return toEmail;
+    }
+
+    public void setToEmail(String toEmail) {
+        this.toEmail = toEmail;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getApp() {
+        return app;
+    }
+
+    public void setApp(String app) {
+        this.app = app;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java b/src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java
index 5226547..8a78a72 100644
--- a/src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java
+++ b/src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java
@@ -1,6 +1,9 @@
 package org.yeshi.utils.mongo;
 
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
@@ -82,6 +85,19 @@
         return (T) mongoTemplate.findById(id, this.getEntityClass());
     }
 
+
+    /**
+     * 鑱氬悎鏌ヨ
+     *
+     * @param opts
+     * @param output
+     * @return
+     */
+    public AggregationResults aggregate(List<? extends AggregationOperation> opts, Class output) {
+        Aggregation aggregation = Aggregation.newAggregation(opts);
+        return mongoTemplate.aggregate(aggregation, this.getEntityClass(), output);
+    }
+
     /**
      * 閫氳繃涓婚敭鍒犻櫎
      *
diff --git a/src/main/java/org/yeshi/utils/mq/TDMQUtil.java b/src/main/java/org/yeshi/utils/mq/TDMQUtil.java
new file mode 100644
index 0000000..11902f3
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/mq/TDMQUtil.java
@@ -0,0 +1,503 @@
+package org.yeshi.utils.mq;
+
+import com.qcloud.cmq.Account;
+import com.qcloud.cmq.Message;
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.tdmq.v20200217.TdmqClient;
+import com.tencentcloudapi.tdmq.v20200217.models.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+//鑵捐CMQ娑堟伅
+public class TDMQUtil {
+
+    private static TDMQUtil cmqUtil;
+
+    public static TDMQUtil getInstance() {
+        if (cmqUtil == null) {
+            cmqUtil = new TDMQUtil();
+        }
+        return cmqUtil;
+    }
+
+    private String secretId = "";
+    private String secretKey = "";
+    private String region = "ap-guangzhou";
+    // 鍐呯綉 http://gz.mqadapter.cmq.tencentyun.com
+    // 鍏綉 https://cmq-gz.public.tencenttdmq.com
+    private static String endpoint = "http://gz.mqadapter.cmq.tencentyun.com";
+    // private static String endpoint =
+    // "http://cmq-queue-gz.api.tencentyun.com";
+
+    private Account account;
+
+    /**
+     * @return void
+     * @author hxh
+     * @description 鍒濆鍖�
+     * @date 17:00 2022/3/21
+     * @param: secretId
+     * @param: secretKey
+     * @param: region 鍖哄煙锛屽: ap-guangzhou
+     * @param: apiRegion 鎺ュ彛鍖哄煙锛屽: gz
+     * @param: isPub 鏄惁涓哄叕缃�
+     **/
+    public void init(String secretId, String secretKey, String region, String apiRegion, boolean isPub) {
+        this.secretId = secretId;
+        this.secretKey = secretKey;
+        this.region = region;
+        String ep;
+        if (isPub) {
+            ep = String.format("https://cmq-%s.public.tencenttdmq.com", apiRegion);
+        } else {
+            ep = String.format("http://%s.mqadapter.cmq.tencentyun.com", apiRegion);
+        }
+        endpoint = ep;
+        account = new Account(endpoint, this.secretId, this.secretKey);
+    }
+
+
+    public void init(String secretId, String secretKey, boolean isPub) {
+        this.secretId = secretId;
+        this.secretKey = secretKey;
+        String ep;
+        if (isPub) {
+            ep = String.format("https://cmq-%s.public.tencenttdmq.com", "gz");
+        } else {
+            ep = String.format("http://%s.mqadapter.cmq.tencentyun.com", "gz");
+        }
+        endpoint = ep;
+        account = new Account(endpoint, this.secretId, this.secretKey);
+    }
+
+    private TdmqClient getClient() {
+        return getClient(this.region);
+    }
+
+    private TdmqClient getClient(String region) {
+        Credential cred = new Credential(secretId, secretKey);
+        // 瀹炰緥鍖栦竴涓� http 閫夐」锛屽彲閫夌殑锛屾病鏈夌壒娈婇渶姹傚彲浠ヨ烦杩�
+        HttpProfile httpProfile = new HttpProfile();
+        httpProfile.setEndpoint("tdmq.tencentcloudapi.com");
+        // 瀹炰緥鍖栦竴涓猚lient閫夐」锛屽彲閫夌殑锛屾病鏈夌壒娈婇渶姹傚彲浠ヨ烦杩�
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setHttpProfile(httpProfile);
+        // 瀹炰緥鍖栬璇锋眰浜у搧鐨� client 瀵硅薄,clientProfile 鏄彲閫夌殑
+        TdmqClient client = new TdmqClient(cred, region, clientProfile);
+        return client;
+    }
+
+    private TdmqClient getMsgClient() {
+        return getClient(this.region);
+    }
+
+
+    public boolean existQueue(String queueName) {
+        if (getQueue(queueName) != null) {
+            return true;
+        }
+        return false;
+    }
+
+
+    // 鍒涘缓闃熷垪
+    public boolean createQueue(String queueName) {
+        return this.createQueue(queueName, 10L, 5 * 60L, 65536L);
+    }
+
+    // 鍒涘缓闃熷垪
+    public boolean createQueue(String queueName, int maxMsgSize) {
+        return this.createQueue(queueName, 10L, 5 * 60L, maxMsgSize);
+    }
+
+    /**
+     * 鎸囧畾鍙傛暟鍒涘缓闃熷垪
+     *
+     * @param queueName
+     * @param pollingWaitSeconds -闀胯疆璁瓑寰呮椂闂�
+     * @param visibilityTimeout  -娑堟伅娑堣垂鍚庡啀娆″彲瑙佺殑鏃堕棿
+     * @return
+     */
+    public boolean createQueue(String queueName, long pollingWaitSeconds, long visibilityTimeout, long maxMsgSize) {
+
+        if (existQueue(queueName)) {
+            return true;
+        }
+        CreateCmqQueueRequest request = new CreateCmqQueueRequest();
+        request.setQueueName(queueName);
+        request.setPollingWaitSeconds(pollingWaitSeconds);
+        request.setVisibilityTimeout(visibilityTimeout);
+        request.setMaxMsgSize(maxMsgSize);
+        request.setMsgRetentionSeconds(345600L);
+        try {
+            getClient().CreateCmqQueue(request);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+
+        return false;
+
+
+    }
+
+    // 鍒犻櫎闃熷垪
+    public boolean deleteQueue(String queueName) {
+        DeleteCmqQueueRequest request = new DeleteCmqQueueRequest();
+        request.setQueueName(queueName);
+        try {
+            getClient().DeleteCmqQueue(request);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    // 鑾峰彇闃熷垪鍒楄〃
+    public List<CmqQueue> getQueueNameList(String key) {
+        DescribeCmqQueuesRequest request = new DescribeCmqQueuesRequest();
+        request.setOffset(0L);
+        request.setLimit(1000L);
+        try {
+            DescribeCmqQueuesResponse response = getClient().DescribeCmqQueues(request);
+            CmqQueue[] queues = response.getQueueList();
+            return Arrays.asList(queues);
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    // 鑾峰彇闃熷垪
+    public CmqQueue getQueue(String queueName) {
+        DescribeCmqQueueDetailRequest req = new DescribeCmqQueueDetailRequest();
+        req.setQueueName(queueName);
+        // 杩斿洖鐨� resp 鏄竴涓� CreateCmqQueueResponse 鐨勫疄渚嬶紝涓庤姹傚璞″搴�
+        try {
+            DescribeCmqQueueDetailResponse resp = getClient().DescribeCmqQueueDetail(req);
+            return resp.getQueueDescribe();
+        } catch (TencentCloudSDKException e) {
+        }
+        return null;
+    }
+
+
+    // 鍙戦�佹秷鎭�
+    public String sendMsg(String queueName, String msg, long delaySeconds) {
+        SendCmqMsgRequest request = new SendCmqMsgRequest();
+        request.setQueueName(queueName);
+        request.setMsgContent(msg);
+        request.setDelaySeconds(delaySeconds);
+        try {
+            SendCmqMsgResponse response = getMsgClient().SendCmqMsg(request);
+            return response.getMsgId();
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public String sendMsg(String queueName, String msg) {
+        return this.sendMsg(queueName, msg, 0L);
+    }
+
+
+    // 娑堣垂娑堟伅
+    public Message recieveMsg(String queueName) throws Exception {
+        com.qcloud.cmq.Queue queue = account.getQueue(queueName);
+        return queue.receiveMessage();
+    }
+
+    /**
+     * 娑堣垂娑堟伅
+     *
+     * @param count     1-16
+     * @param queueName 闃熷垪鍚嶅瓧
+     * @return
+     */
+    public List<Message> recieveMsg(int count, String queueName) {
+        com.qcloud.cmq.Queue queue = account.getQueue(queueName);
+
+        if (queue == null) {
+            return null;
+        }
+
+        List<Message> msgList = null;
+        try {
+            msgList = queue.batchReceiveMessage(count);
+            return msgList;
+        } catch (Exception e) {
+            if (e.getMessage() != null && !e.getMessage().contains("no message"))
+                e.printStackTrace();
+        }
+        return null;
+    }
+
+    // 鍒犻櫎娑堟伅
+    public boolean deleteMsg(String queueName, String receiptHandle) {
+        try {
+            com.qcloud.cmq.Queue queue = account.getQueue(queueName);
+            queue.deleteMessage(receiptHandle);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 璁㈤槄娑堟伅鐩稿叧
+     */
+
+
+    /**
+     * 涓婚鍚嶇О鏄惁宸茬粡瀛樺湪
+     *
+     * @param topicName
+     * @return
+     */
+    private boolean topicNameExist(String topicName) {
+        DescribeCmqTopicDetailRequest req = new DescribeCmqTopicDetailRequest();
+        req.setTopicName(topicName);
+        try {
+            getClient().DescribeCmqTopicDetail(req);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            return false;
+        }
+    }
+
+    /**
+     * 鍒涘缓璁㈤槄涓婚
+     *
+     * @param topicName-涓婚鍚嶇О
+     * @param maxMsgSize-娑堟伅鏈�澶ч暱搴�
+     * @param filterType-杩囨护绫诲瀷
+     * @return
+     */
+    public boolean createTopic(String topicName, Long maxMsgSize, Long filterType) {
+        if (topicNameExist(topicName)) {
+            return true;
+        }
+        CreateCmqTopicRequest req = new CreateCmqTopicRequest();
+        if (filterType != null) {
+            req.setFilterType(filterType);
+        }
+
+        if (maxMsgSize != null) {
+            req.setMaxMsgSize(maxMsgSize);
+        }
+        req.setTopicName(topicName);
+        try {
+            getClient().CreateCmqTopic(req);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    //鍒櫎涓婚
+    public boolean deleteTopic(String topicName) {
+        DeleteCmqTopicRequest req = new DeleteCmqTopicRequest();
+        req.setTopicName(topicName);
+        try {
+            getClient().DeleteCmqTopic(req);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 鍒涘缓榛樿鍙傛暟鐨勪富棰�
+     *
+     * @param topicName
+     * @return
+     */
+    public boolean createTopic(String topicName) {
+        return createTopic(topicName, null, null);
+    }
+
+
+    /**
+     * 鏄惁宸茬粡璁㈤槄
+     *
+     * @param topicName
+     * @param subscriptionName
+     * @return
+     */
+    private boolean isAlreadySubscribe(String topicName, String subscriptionName) {
+        DescribeCmqSubscriptionDetailRequest req = new DescribeCmqSubscriptionDetailRequest();
+        req.setSubscriptionName(subscriptionName);
+        req.setTopicName(topicName);
+        req.setLimit(1L);
+        req.setOffset(0L);
+        try {
+            DescribeCmqSubscriptionDetailResponse response = getClient().DescribeCmqSubscriptionDetail(req);
+            if (response.getTotalCount() > 0)
+                return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 璁㈤槄涓婚
+     *
+     * @param topicName-涓婚鍚嶇О
+     * @param subscriptionName-璁㈤槄鍚嶇О
+     * @param queueName-鎺ュ彈娑堟伅鐨勯槦鍒楀悕绉�
+     * @return
+     */
+    public boolean subscribeTopic(String topicName, String subscriptionName, String queueName) {
+        return subscribeTopic(topicName, subscriptionName, queueName, null);
+    }
+
+    public boolean subscribeTopic(String topicName, String subscriptionName, String queueName, List<String> filterTags) {
+
+        try {
+            if (isAlreadySubscribe(topicName, subscriptionName)) {
+                return true;
+            }
+        } catch (Exception e) {
+        }
+        CreateCmqSubscribeRequest req = new CreateCmqSubscribeRequest();
+        req.setTopicName(topicName);
+        req.setEndpoint(queueName);
+        req.setSubscriptionName(subscriptionName);
+        req.setProtocol("queue");
+        req.setNotifyContentFormat("SIMPLIFIED");
+        if (filterTags != null && filterTags.size() > 0) {
+            String[] tags = new String[filterTags.size()];
+            filterTags.toArray(tags);
+            req.setFilterTag(tags);
+        }
+        try {
+            getClient().CreateCmqSubscribe(req);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎璁㈤槄
+     *
+     * @param topicName
+     * @param subscriptionName
+     * @return
+     */
+    public boolean deleteSubscribeTopic(String topicName, String subscriptionName) {
+        DeleteCmqSubscribeRequest req = new DeleteCmqSubscribeRequest();
+        req.setSubscriptionName(subscriptionName);
+        req.setTopicName(topicName);
+        try {
+            getClient().DeleteCmqSubscribe(req);
+            return true;
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 鍙戝竷璁㈤槄娑堟伅
+     *
+     * @param topicName
+     * @param message
+     * @return
+     */
+    public String publishTopicMessage(String topicName, String message) {
+
+        return publishTopicMessage(topicName, null, message);
+    }
+
+    /**
+     * 鍙戝竷璁㈤槄娑堟伅
+     *
+     * @param topicName
+     * @param tagList   -鏍囩
+     * @param message
+     * @return
+     */
+    public String publishTopicMessage(String topicName, List<String> tagList, String message) {
+        PublishCmqMsgRequest req = new PublishCmqMsgRequest();
+        req.setMsgContent(message);
+        req.setTopicName(topicName);
+        if (tagList != null && tagList.size() > 0) {
+            String[] tags = new String[tagList.size()];
+            tagList.toArray(tags);
+            req.setMsgTag(tags);
+        }
+        try {
+            PublishCmqMsgResponse response = getMsgClient().PublishCmqMsg(req);
+            return response.getMsgId();
+        } catch (TencentCloudSDKException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        TDMQUtil.getInstance().init("AKIDTlpgJhLjOozvd6QI2XnpfGbgV4NQJk25", "xhCSUHo55oHUQ6XicFcmfIgspX0EEzWo", true);
+
+        String queueName = "test1";
+        String topicName = "topic_test";
+
+        //鍒涘缓
+        TDMQUtil.getInstance().createQueue(queueName);
+
+        //鍙戦�佹秷鎭�
+        TDMQUtil.getInstance().sendMsg(queueName, "娴嬭瘯娑堟伅");
+
+        //鍒涘缓涓婚
+        TDMQUtil.getInstance().createTopic(topicName);
+
+        //鍒涘缓璁㈤槄
+        TDMQUtil.getInstance().subscribeTopic(topicName, topicName + queueName, queueName);
+
+        //鍙戦�佽闃呮秷鎭�
+        TDMQUtil.getInstance().publishTopicMessage(topicName, "涓婚娑堟伅");
+
+        //娑堣垂娑堟伅
+        try {
+            Message message = TDMQUtil.getInstance().recieveMsg(queueName);
+            System.out.println("鎺ュ彈鍒扮殑娑堟伅:" + message.msgBody);
+            TDMQUtil.getInstance().deleteMsg(queueName, message.receiptHandle);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        try {
+            List<Message> messages = TDMQUtil.getInstance().recieveMsg(10, queueName);
+            for (Message message : messages) {
+                System.out.println("鎵归噺鎺ュ彈鍒扮殑娑堟伅:" + message.msgBody);
+                TDMQUtil.getInstance().deleteMsg(queueName, message.receiptHandle);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+        //鍒犻櫎璁㈤槄
+        TDMQUtil.getInstance().deleteSubscribeTopic(topicName, topicName + queueName);
+
+        //鍒犻櫎涓婚
+        TDMQUtil.getInstance().deleteTopic(topicName);
+
+        //鍒犻櫎闃熷垪
+        TDMQUtil.getInstance().deleteQueue(queueName);
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/sms/VerifyCodeFactory.java b/src/main/java/org/yeshi/utils/sms/VerifyCodeFactory.java
new file mode 100644
index 0000000..c81da27
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/sms/VerifyCodeFactory.java
@@ -0,0 +1,92 @@
+package org.yeshi.utils.sms;
+
+/**
+ * @author hxh
+ * @title: VerifyCodeFactory
+ * @description: 楠岃瘉鐮佸伐鍘�
+ * @date 2021/11/15 18:47
+ */
+public class VerifyCodeFactory {
+
+    final static String NUMBERS = "0123456789";
+
+    final static String NUMBERS_UPPER_CASE = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    final static String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    final static String NUMBERS_LOWER_CASE = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+    final static String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 绾暟瀛楅獙璇佺爜
+     * @date 18:56 2021/11/15
+     * @param: length
+     **/
+    public static String createNumber(int length) {
+
+        return createCode(length, NUMBERS);
+    }
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 鏁板瓧澶у啓瀛楁瘝娣峰悎楠岃瘉鐮�
+     * @date 18:56 2021/11/15
+     * @param: length
+     **/
+    public static String createNumberAndUpperCase(int length) {
+
+        return createCode(length, NUMBERS_UPPER_CASE);
+    }
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 鏁板瓧灏忓啓瀛楁瘝娣峰悎楠岃瘉鐮�
+     * @date 18:56 2021/11/15
+     * @param: length
+     **/
+    public static String createNumberAndLowerCase(int length) {
+
+        return createCode(length, NUMBERS_LOWER_CASE);
+    }
+
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 绾ぇ鍐欏瓧姣嶆贩鍚堥獙璇佺爜
+     * @date 18:56 2021/11/15
+     * @param: length
+     **/
+    public static String createUpperCase(int length) {
+
+        return createCode(length, UPPER_CASE);
+    }
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 绾皬鍐欏瓧姣嶆贩鍚堥獙璇佺爜
+     * @date 18:56 2021/11/15
+     * @param: length
+     **/
+    public static String createLowerCase(int length) {
+
+        return createCode(length, LOWER_CASE);
+    }
+
+    private static String createCode(int length, String source) {
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < length; i++) {
+            buffer.append(source.charAt((int) (Math.random() * source.length())));
+        }
+        return buffer.toString();
+
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/BaseStatisticMySQLTimeQuery.java b/src/main/java/org/yeshi/utils/statistic/BaseStatisticMySQLTimeQuery.java
new file mode 100644
index 0000000..793a125
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/BaseStatisticMySQLTimeQuery.java
@@ -0,0 +1,50 @@
+package org.yeshi.utils.statistic;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author hxh
+ * @title: BaseStatisticQuery
+ * @description: 鍩虹缁熻鏌ヨ鏉′欢
+ * @date 2021/11/18 18:24
+ */
+public class BaseStatisticMySQLTimeQuery implements Serializable {
+
+    private Date startTime;
+    private Date endTime;
+    private String timeFormat;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getTimeFormat() {
+        return timeFormat;
+    }
+
+    public void setTimeFormat(String timeFormat) {
+        this.timeFormat = timeFormat;
+    }
+
+    public static BaseStatisticMySQLTimeQuery create(BaseStatisticTimeQuery query) {
+        BaseStatisticMySQLTimeQuery timeQuery = new BaseStatisticMySQLTimeQuery();
+        timeQuery.setEndTime(query.getEndTime());
+        timeQuery.setStartTime(query.getStartTime());
+        timeQuery.setTimeFormat(query.getTimeSpan().getSqlTimeFormat());
+        return timeQuery;
+    }
+
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/BaseStatisticTimeQuery.java b/src/main/java/org/yeshi/utils/statistic/BaseStatisticTimeQuery.java
new file mode 100644
index 0000000..b36244d
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/BaseStatisticTimeQuery.java
@@ -0,0 +1,41 @@
+package org.yeshi.utils.statistic;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author hxh
+ * @title: BaseStatisticQuery
+ * @description: 鍩虹缁熻鏌ヨ鏉′欢
+ * @date 2021/11/18 18:24
+ */
+public class BaseStatisticTimeQuery implements Serializable {
+
+    private Date startTime;
+    private Date endTime;
+    private StatisticTimeSpan timeSpan;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public StatisticTimeSpan getTimeSpan() {
+        return timeSpan;
+    }
+
+    public void setTimeSpan(StatisticTimeSpan timeSpan) {
+        this.timeSpan = timeSpan;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/StatisticNumberResult.java b/src/main/java/org/yeshi/utils/statistic/StatisticNumberResult.java
new file mode 100644
index 0000000..4a9d760
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/StatisticNumberResult.java
@@ -0,0 +1,28 @@
+package org.yeshi.utils.statistic;
+
+/**
+ * @author hxh
+ * @title: StatisticNumberResult
+ * @description: 缁熻鏁伴噺缁撴灉
+ * @date 2021/11/18 18:53
+ */
+public class StatisticNumberResult {
+    private String time;
+    private long number;
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public long getNumber() {
+        return number;
+    }
+
+    public void setNumber(long number) {
+        this.number = number;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/StatisticResulterFilterUtil.java b/src/main/java/org/yeshi/utils/statistic/StatisticResulterFilterUtil.java
new file mode 100644
index 0000000..da18252
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/StatisticResulterFilterUtil.java
@@ -0,0 +1,104 @@
+package org.yeshi.utils.statistic;
+
+import org.yeshi.utils.TimeUtil;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author hxh
+ * @title: StatisticResulterFilterUtil
+ * @description: 缁熻缁撴灉杩囨护
+ * @date 2021/11/18 19:11
+ */
+public class StatisticResulterFilterUtil {
+
+
+    public static List<StatisticNumberResult> filterNumberResult(List<StatisticNumberResult> list, BaseStatisticTimeQuery timeQuery) {
+        List<StatisticNumberResult> resultList = new ArrayList<>();
+        createEmptyList(timeQuery, new IAddEmptyData() {
+            @Override
+            public void onData(String time) {
+                StatisticNumberResult result = new StatisticNumberResult();
+                result.setNumber(0L);
+                result.setTime(time);
+                resultList.add(result);
+            }
+        });
+        Map<String, StatisticNumberResult> map = new HashMap<>();
+        for (StatisticNumberResult result : list) {
+            map.put(result.getTime(), result);
+        }
+
+        for (StatisticNumberResult result : resultList) {
+            if (map.get(result.getTime()) != null) {
+                result.setNumber(map.get(result.getTime()).getNumber());
+            }
+        }
+
+
+        return resultList;
+    }
+
+
+    public static List<StatisticValueResult> filterValueResult(List<StatisticValueResult> list, BaseStatisticTimeQuery timeQuery) {
+        List<StatisticValueResult> resultList = new ArrayList<>();
+        createEmptyList(timeQuery, new IAddEmptyData() {
+            @Override
+            public void onData(String time) {
+                StatisticValueResult result = new StatisticValueResult();
+                result.setValue(new BigDecimal(0));
+                result.setTime(time);
+                resultList.add(result);
+            }
+        });
+
+        Map<String, StatisticValueResult> map = new HashMap<>();
+        for (StatisticValueResult result : list) {
+            map.put(result.getTime(), result);
+        }
+
+        for (StatisticValueResult result : resultList) {
+            if (map.get(result.getTime()) != null) {
+                result.setValue(map.get(result.getTime()).getValue());
+            }
+        }
+
+        return resultList;
+    }
+
+    private static void createEmptyList(BaseStatisticTimeQuery timeQuery, IAddEmptyData addEmptyData) {
+
+        //寮�濮嬫椂闂翠笌缁撴潫鏃堕棿鏁村舰
+        Date startTime = new Date(timeQuery.getStartTime().getTime());
+        Date endTime = new Date(timeQuery.getEndTime().getTime());
+        startTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(startTime.getTime(), timeQuery.getTimeSpan().getLocalTimeFormat()), timeQuery.getTimeSpan().getLocalTimeFormat()));
+        endTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(endTime.getTime(), timeQuery.getTimeSpan().getLocalTimeFormat()), timeQuery.getTimeSpan().getLocalTimeFormat()));
+
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(startTime.getTime());
+        while (calendar.getTimeInMillis() <= endTime.getTime()) {
+            addEmptyData.onData(TimeUtil.getGernalTime(calendar.getTimeInMillis(), timeQuery.getTimeSpan().getLocalTimeFormat()));
+            //澧炲姞鏃堕棿
+            if (timeQuery.getTimeSpan() == StatisticTimeSpan.minute) {
+                calendar.add(Calendar.SECOND, 60);
+            } else if (timeQuery.getTimeSpan() == StatisticTimeSpan.hour) {
+                calendar.add(Calendar.HOUR, 1);
+            } else if (timeQuery.getTimeSpan() == StatisticTimeSpan.day) {
+                calendar.add(Calendar.HOUR, 24);
+            } else if (timeQuery.getTimeSpan() == StatisticTimeSpan.month) {
+                calendar.add(Calendar.MONTH, 1);
+            } else if (timeQuery.getTimeSpan() == StatisticTimeSpan.year) {
+                calendar.add(Calendar.YEAR, 1);
+            }
+            //鍒ゆ柇鏄惁瀛樺湪
+        }
+    }
+
+    interface IAddEmptyData {
+
+        public void onData(String time);
+    }
+
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/StatisticTimeSpan.java b/src/main/java/org/yeshi/utils/statistic/StatisticTimeSpan.java
new file mode 100644
index 0000000..3c8a4f5
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/StatisticTimeSpan.java
@@ -0,0 +1,26 @@
+package org.yeshi.utils.statistic;
+
+/**
+ * @author hxh
+ * @title: StatisticSpan
+ * @description: 缁熻鐨勬椂闂寸矑搴�
+ * @date 2021/11/18 18:21
+ */
+public enum StatisticTimeSpan {
+    minute("%Y-%m-%d %H %i", "yyyy-MM-dd HH mm"), hour("%Y-%m-%d %H", "yyyy-MM-dd HH"), day("%Y-%m-%d", "yyyy-MM-dd"), month("%Y-%m", "yyyy-MM"), year("%Y", "yyyy");
+    private String sqlTimeFormat;
+    private String localTimeFormat;
+
+    private StatisticTimeSpan(String sqlTimeFormat, String localTimeFormat) {
+        this.sqlTimeFormat = sqlTimeFormat;
+        this.localTimeFormat = localTimeFormat;
+    }
+
+    public String getSqlTimeFormat() {
+        return sqlTimeFormat;
+    }
+
+    public String getLocalTimeFormat() {
+        return localTimeFormat;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/statistic/StatisticValueResult.java b/src/main/java/org/yeshi/utils/statistic/StatisticValueResult.java
new file mode 100644
index 0000000..95efa68
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/statistic/StatisticValueResult.java
@@ -0,0 +1,30 @@
+package org.yeshi.utils.statistic;
+
+import java.math.BigDecimal;
+
+/**
+ * @author hxh
+ * @title: StatisticNumberResult
+ * @description: 缁熻鏁板�肩粨鏋�
+ * @date 2021/11/18 18:53
+ */
+public class StatisticValueResult {
+    private String time;
+    private BigDecimal value;
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public BigDecimal getValue() {
+        return value;
+    }
+
+    public void setValue(BigDecimal value) {
+        this.value = value;
+    }
+}
diff --git a/src/main/resources/generater/admin/add.ftl b/src/main/resources/generater/admin/add.ftl
index 2de34c9..92fad6e 100644
--- a/src/main/resources/generater/admin/add.ftl
+++ b/src/main/resources/generater/admin/add.ftl
@@ -177,7 +177,7 @@
                     }
                     uploadTool.upload(function(){
                         //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
-                        ksapp.postJSON('${addApi}', data.field, function (res) {
+                        ksapp.post('${addApi}', data.field, function (res) {
                             if (res.code == 0) {
                                 layer.alert("澧炲姞鎴愬姛", {
                                             icon: 6
diff --git a/src/main/resources/generater/admin/adminController.template b/src/main/resources/generater/admin/adminController.template
index 2fbfc9c..5a7f9a2 100644
--- a/src/main/resources/generater/admin/adminController.template
+++ b/src/main/resources/generater/admin/adminController.template
@@ -56,6 +56,7 @@
         return loadPrint(callback,JsonUtil.loadTrueResult(data));
     }
 
+    <#if delete>
     @ResponseBody
     @RequestMapping("delete")
     public String delete(String ids, String callback) {
@@ -64,7 +65,9 @@
         ${serviceObjName}.delete(idList);
         return loadPrint(callback, JsonUtil.loadTrueResult(""));
     }
+     </#if>
 
+    <#if add>
     @ResponseBody
     @RequestMapping("add")
     public String add(${entity.name} bean, HttpSession session, String callback) {
@@ -75,6 +78,7 @@
             return loadPrint(callback, JsonUtil.loadFalseResult(e.getMessage()));
         }
     }
+    </#if>
 
     @ResponseBody
     @RequestMapping("get")
@@ -88,6 +92,7 @@
     }
 
 
+    <#if update>
     @ResponseBody
     @RequestMapping("update")
     public String update(${entity.name} bean, HttpSession session,String callback) {
@@ -101,6 +106,7 @@
         }
         return loadPrint(callback,JsonUtil.loadTrueResult(""));
     }
+    </#if>
 
 
 }
diff --git a/src/main/resources/generater/admin/form/text.ftl b/src/main/resources/generater/admin/form/text.ftl
index e1dba14..c65f315 100644
--- a/src/main/resources/generater/admin/form/text.ftl
+++ b/src/main/resources/generater/admin/form/text.ftl
@@ -1,2 +1,3 @@
-                        <input type="text" name="${value.key}" <#if value.params.verifyValue??> lay-verify="${value.params.verifyValue}" </#if> placeholder="${value.params.placeHolder}" autocomplete="off"
+                        <#assign inputType="${value.params.inputType?lower_case}" >
+                        <input type="${inputType}" name="${value.key}" <#if value.params.verifyValue??> lay-verify="${value.params.verifyValue}" </#if> placeholder="${value.params.placeHolder}" autocomplete="off"
                                class="layui-input">
diff --git a/src/main/resources/generater/admin/list.ftl b/src/main/resources/generater/admin/list.ftl
index 0e55471..31e4386 100644
--- a/src/main/resources/generater/admin/list.ftl
+++ b/src/main/resources/generater/admin/list.ftl
@@ -12,9 +12,9 @@
     <link rel="stylesheet" href="./css/xadmin.css">
     <script src="./lib/layui/layui.js" charset="utf-8"></script>
     <link rel="stylesheet" href="./css/theme3049.min.css">
-    <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
+    <script src="./js/vue.min.js" type="text/javascript" charset="utf-8"></script>
     <script type="text/javascript" src="./js/xadmin.js"></script>
-    <script src="js/http.js" type="text/javascript" charset="utf-8"></script>
+    <script src="./js/http.js" type="text/javascript" charset="utf-8"></script>
     <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
     <!--[if lt IE 9]>
     <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
@@ -57,7 +57,7 @@
                         </div>
                         </#list>
                         <div class="layui-inline layui-show-xs-block">
-                            <button id="search" class="layui-btn" lay-submit="" lay-filter="sreach">
+                            <button id="search" class="layui-btn" lay-submit="" lay-filter="search">
                                 <i class="layui-icon">&#xe615;</i></button>
                         </div>
                     </form>
@@ -73,26 +73,32 @@
 </body>
 <script type="text/html" id="toolbar">
     <div class="layui-btn-container">
+          <#if addPagePath??>
         <button class="layui-btn" onclick="xadmin.open('娣诲姞${title}','${addPagePath}',500,580)"><i
                 class="layui-icon">顦�</i>娣诲姞
         </button>
-
+          </#if>
+        <#if deleteApi??>
         <button class="layui-btn layui-btn-danger" lay-event="delete">
             <i class="layui-icon">&#xe640;</i>
             鍒犻櫎
         </button>
+        </#if>
     </div>
 </script>
 
-<script type="text/html" id="deleteContainer">
+<script type="text/html" id="optContainer">
     <div class="layui-btn-container">
-        <!-- <a title='鎭㈠' onclick='member_resume(this,{{d.LAY_INDEX }}, {{d.id}})' href='javascript:;'> -->
-        <!--<i class="layui-icon">&#xe669;</i>-->
-        <!--</a>-->
-
+        <#if updatePagePath??>
+        <a title="淇敼" onclick="xadmin.open('淇敼${title}','${updatePagePath}?id={{d.id}}',500,580)" href="javascript:;">
+            <i class="layui-icon">&#xe642;</i>
+        </a>
+        </#if>
+        <#if deleteApi??>
         <a title="鍒犻櫎" onclick="member_del(this,{{d.LAY_INDEX }},'{{d.id}}')" href="javascript:;">
             <i class="layui-icon">&#xe640;</i>
         </a>
+        </#if>
     </div>
 </script>
 
@@ -116,50 +122,30 @@
            10003 ? 'checked': ''}} >
 </script>
 
+
+<script type="text/html" id="imgshow">
+    <!-- 杩欓噷鐨刢hecked鐨勭姸鎬佸彧鏄紨绀� -->
+    <img  src="{{d.}}"/>
+    <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="濂硘鐢�" lay-filter="sexDemo" {{ d.id==
+           10003 ? 'checked': ''}} >
+</script>
+
 <script>
 
+     <#if deleteApi??>
     function member_del(obj, index, id) {
         layer.confirm('纭瑕佸垹闄ゅ悧锛�', function (index) {
             //鍙戝紓姝ュ垹闄ゆ暟鎹�
             app.delete(obj, index, id);
         });
     }
+    </#if>
 
 </script>
 
 <script>
     var tableIns = null;
     $(function () {
-
-
-        //娓叉煋琛ㄦ牸
-        function rederTable() {
-            tableIns = table.render({
-                elem: '#table_list',
-                url: url,
-                toolbar: "#toolbar",
-                totalRow: true,
-                cols: [{type: 'checkbox', title: "ID"},
-                    {field: 'id', width: 120, sort: true, title: "ID"},
-                    {fixed: 'right', width: 80, title: "鎿嶄綔", toolbar: '#deleteContainer'}],
-                page: true,
-                parseData:
-                        function (res) { //res 鍗充负鍘熷杩斿洖鐨勬暟鎹�
-                            if (res.code != 0)
-                                return;
-                            if (res.data.list == null)
-                                return;
-                            console.log(res.data.list)
-                            return {
-                                "code": res.code, //瑙f瀽鎺ュ彛鐘舵��
-                                "msg": res.msg, //瑙f瀽鎻愮ず鏂囨湰
-                                "count": res.data.count, //瑙f瀽鏁版嵁闀垮害
-                                "data": res.data.list //瑙f瀽鏁版嵁鍒楄〃
-                            };
-                        }
-            });
-        }
-
 
         var app = new Vue({
             el: "#app",
@@ -196,12 +182,32 @@
 
                         tableIns = table.render({
                             elem: '#table_list',
-                            url: ${listApi},
+                            url: "${listApi}",
                             toolbar: "#toolbar",
                             totalRow: true,
-                            cols: [{type: 'checkbox', title: "ID"},
-                                {field: 'id', width: 120, sort: true, title: "ID"},
-                                {fixed: 'right', width: 80, title: "鎿嶄綔", toolbar: '#deleteContainer'}],
+                            cols: [[{type: 'checkbox', title: "ID"},
+                                 <#list showFileds as field >
+                                    <#if field.showType=='TEXT'>
+                                    {field: '${field.identifier}', width: 120, sort: false, title: "${field.title}"},
+                                    <#elseif field.showType=='SWITCH'>
+                                    {field: '${field.identifier}', width: 120, sort: false, title: "${field.title}",templet:function(res){
+                                         if(res.${field.identifier}){
+                                             return " <input type=\"checkbox\" checked='true'  disabled  lay-skin=\"switch\"";
+                                         }else{
+                                             return " <input type=\"checkbox\"  disabled  lay-skin=\"switch\"";
+                                         }
+                                        }
+                                    },
+                                    <#elseif field.showType=='IMG'>
+                                    {field: '${field.identifier}', width: 120, sort: false, title: "${field.title}",templet:function(res){
+                                                return "<img src='"+res.${field.identifier}+"' style='height:50px;'>";
+                                        }
+                                    },
+                                    <#else>
+                                    {field: '${field.identifier}', template:"<img src='{{d.${field.identifier}}}'>", width: 120, sort: false, title: "${field.title}"},
+                                    </#if>
+                                </#list>
+                                {fixed: 'right', width: 80, title: "鎿嶄綔", toolbar: '#optContainer'}]],
                             page: true,
                             parseData: function (res) { //res 鍗充负鍘熷杩斿洖鐨勬暟鎹�
                                 if (res.code != 0)
@@ -215,12 +221,15 @@
                                     "count": res.data.count, //瑙f瀽鏁版嵁闀垮害
                                     "data": res.data.list //瑙f瀽鏁版嵁鍒楄〃
                                 };
+                            },
+                            error: function (e, msg) {
+                                ksapp.tableError(e)
                             }
                             //,鈥︹�� //鍏朵粬鍙傛暟
                         });
 
                         //澶村伐鍏锋爮浜嬩欢
-                        tableIns.on('toolbar(app)',
+                        table.on('toolbar(app)',
                                 function (obj) {
                                     var checkStatus = table.checkStatus(obj.config.id);
                                     switch (obj.event) {
@@ -242,8 +251,7 @@
                                             });
 
                                             break;
-                                    }
-                                    ;
+                                    };
                                 });
                         //璇锋眰鎼滅储琛ㄥ崟涓渶瑕佺殑鏁版嵁
                          <#if preRequestList??&&(preRequestList?size>0)>
@@ -317,12 +325,9 @@
                     });
                 },
             }
-        }
-    })
-    ;
-    }
-    )
-    ;
+    });
+    app.init();
+    });
 
 </script>
 
diff --git a/src/main/resources/generater/admin/update.ftl b/src/main/resources/generater/admin/update.ftl
index 3a33b09..23cbc86 100644
--- a/src/main/resources/generater/admin/update.ftl
+++ b/src/main/resources/generater/admin/update.ftl
@@ -24,7 +24,7 @@
 <body>
 <div class="layui-fluid">
     <div class="layui-row">
-        <form class="layui-form" lay-filter="add">
+        <form class="layui-form" lay-filter="update">
 
             <#list rowsList as value>
                 <div class="layui-form-item">
@@ -55,7 +55,7 @@
 
             <div class="layui-form-item">
                 <label for="L_remarks" class="layui-form-label"></label>
-                <button class="layui-btn" lay-filter="add" lay-submit="">纭畾淇敼</button>
+                <button class="layui-btn" lay-filter="update" lay-submit="">纭畾淇敼</button>
             </div>
         </form>
     </div>
@@ -150,9 +150,9 @@
             return;
         }
 
-        ksapp.postJSON('${detailApi}', {id: id}, function (res) {
+        ksapp.post('${detailApi}', {id: id}, function (res) {
             if (res.code == 0) {
-                form.data(res.data);
+                form.val("update",res.data);
             } else {
                 layer.msg(res.msg);
             }
@@ -185,7 +185,7 @@
 
 
         //鐩戝惉鎻愪氦
-        form.on('submit(add)',
+        form.on('submit(update)',
                 function (data) {
                     console.log(data.field);
                     //杞崲json瀵硅薄
@@ -206,9 +206,9 @@
                         var params = data.field;
                         params.id = ksapp.getQueryParam("id");
 
-                        ksapp.postJSON('${updateApi}', data.field, function (res) {
+                        ksapp.post('${updateApi}', data.field, function (res) {
                             if (res.code == 0) {
-                                layer.alert("澧炲姞鎴愬姛", {
+                                layer.alert("淇敼鎴愬姛", {
                                             icon: 6
                                         },
                                         function () {
@@ -237,7 +237,7 @@
              params["${key}"]=${request.params["${key}"]}
                  </#list>
 
-         ksapp.postJSON('${request.url}', params, function (res) {
+         ksapp.post('${request.url}', params, function (res) {
              if (res.code == 0) {
                  //濉厖鏁版嵁
                  $("${request.fillTarget}").empty();
diff --git a/src/main/resources/generater/dao/mongoDBDao.template b/src/main/resources/generater/dao/mongoDBDao.template
index 32a5d1d..56e0355 100644
--- a/src/main/resources/generater/dao/mongoDBDao.template
+++ b/src/main/resources/generater/dao/mongoDBDao.template
@@ -33,7 +33,7 @@
   public List<${entity.name}> list(DaoQuery daoQuery){
         Query query = getQuery(daoQuery);
         if (daoQuery.sortList!=null && daoQuery.sortList.size()>0){
-            query.with(new Sort(daoQuery.sortList));
+            query.with(Sort.by(daoQuery.sortList));
         }
         query.skip(daoQuery.start);
         query.limit(daoQuery.count);
diff --git a/src/main/resources/generater/dao/mybatisDBXML.ftl b/src/main/resources/generater/dao/mybatisDBXML.ftl
index fb90129..1b420d4 100644
--- a/src/main/resources/generater/dao/mybatisDBXML.ftl
+++ b/src/main/resources/generater/dao/mybatisDBXML.ftl
@@ -12,7 +12,7 @@
 
     <sql id="Base_Column_List">
         <trim suffixOverrides=",">
-        <#list columnList as column>${column.column},</#list>
+        ${identify.column},<#list columnList as column>${column.column},</#list>
         </trim>
     </sql>
 
diff --git a/src/main/resources/generater/service/method/impl/mybatis/delete.ftl b/src/main/resources/generater/service/method/impl/mybatis/delete.ftl
index 81ca7b1..6c2c94f 100644
--- a/src/main/resources/generater/service/method/impl/mybatis/delete.ftl
+++ b/src/main/resources/generater/service/method/impl/mybatis/delete.ftl
@@ -1,4 +1,4 @@
 <#assign daoObjName="${dao.name?uncap_first}" >
-     for (String id : idList){
+     for (Long id : idList){
         ${daoObjName}.deleteByPrimaryKey(id);
      }
\ No newline at end of file
diff --git a/src/main/resources/generater/service/serviceImpl.template b/src/main/resources/generater/service/serviceImpl.template
index 74e8321..795b99f 100644
--- a/src/main/resources/generater/service/serviceImpl.template
+++ b/src/main/resources/generater/service/serviceImpl.template
@@ -14,6 +14,7 @@
   private ${dao.name} ${dao.name?uncap_first};
 
   <#list metodInfoList as method>
+  @Override
   ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params}) <#if method.exceptions??> throws ${method.exceptions}</#if> {
 ${method.content}
   }
diff --git a/src/test/java/com/generater/GeneratorTest.java b/src/test/java/com/generater/GeneratorTest.java
index c157dcf..ba1ba09 100644
--- a/src/test/java/com/generater/GeneratorTest.java
+++ b/src/test/java/com/generater/GeneratorTest.java
@@ -149,15 +149,15 @@
     }
 
     private static void generater() throws Exception {
-        GeneraterManager.getInstance().init("D:\\workspace\\server\\utils\\src\\test\\java", TestEntity.class);
-        AdminGeneraterParams adminGeneraterParams=new AdminGeneraterParams("com.generater.temp.controller","D:\\workspace\\server\\utils\\src\\test");
-
-        GeneraterManager.getInstance().createWholeFunction(new DaoGeneraterParams("com.generater.temp.dao", "D:\\workspace\\server\\utils\\src\\test"), new ServiceGeneraterParams("com.generater.temp.query","com.generater.temp.service","com.generater.temp.service.impl"), adminGeneraterParams);
+//        GeneraterManager.getInstance().init("D:\\workspace\\server\\utils\\src\\test\\java", TestEntity.class);
+//        AdminGeneraterParams adminGeneraterParams=new AdminGeneraterParams("com.generater.temp.controller","D:\\workspace\\server\\utils\\src\\test");
+//
+//        GeneraterManager.getInstance().createWholeFunction(new DaoGeneraterParams("com.generater.temp.dao", "D:\\workspace\\server\\utils\\src\\test"), new ServiceGeneraterParams("com.generater.temp.query","com.generater.temp.service","com.generater.temp.service.impl"), adminGeneraterParams);
     }
 
 
     @Table("tb_test")
-    public static class Entity {
+     static class Entity {
 
         @Id
         @Column(name = "id")

--
Gitblit v1.8.0