From 1a1a315efb1b5dc294013126f35819e36565040c Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 30 九月 2021 18:06:48 +0800
Subject: [PATCH] 后台管理自动化代码生成

---
 src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java              |    2 
 src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java  |  128 ++
 src/main/resources/generater/service/service.template                        |   14 
 src/main/resources/generater/admin/form/textArea.ftl                         |    4 
 src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java                |  128 ++
 src/main/resources/generater/service/method/save.template                    |    6 
 src/main/java/org/yeshi/utils/StringUtil.java                                |  565 +++++-----
 src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java |    9 
 src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java       |  170 +++
 src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java          |  160 +++
 src/main/resources/generater/admin/form/switch.ftl                           |    4 
 src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java                |   34 
 src/main/resources/generater/admin/adminController.template                  |  172 +-
 src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java            |   86 +
 src/main/resources/generater/admin/form/select.ftl                           |    4 
 src/main/resources/generater/service/queryVO.ftl                             |   17 
 src/main/resources/generater/admin/update.ftl                                |  338 +++++-
 src/main/java/org/yeshi/utils/generater/util/FormAnotationValidUtil.java     |   12 
 src/main/resources/generater/service/method/delete.template                  |   14 
 src/main/resources/generater/service/serviceImpl.template                    |   23 
 src/main/resources/generater/admin/form/checkBox.ftl                         |    4 
 src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java        |   10 
 src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java |   39 
 src/main/resources/generater/admin/form/img.ftl                              |   13 
 src/main/resources/generater/admin/list.ftl                                  |  330 ++++++
 src/main/resources/generater/admin/form/text.ftl                             |    4 
 src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java  |   55 +
 src/test/java/com/generater/GeneratorTest.java                               |   14 
 src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java             |  193 +++
 src/main/java/org/yeshi/utils/generater/annotation/admin/form/Img.java       |    7 
 src/main/resources/generater/admin/form/password.ftl                         |    4 
 src/main/resources/generater/service/method/list.template                    |   14 
 src/test/java/com/generater/TestEntity.java                                  |   10 
 /dev/null                                                                    |   16 
 src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java           |   77 +
 src/main/java/org/yeshi/utils/generater/annotation/admin/form/Select.java    |    4 
 src/main/resources/generater/service/method/add.template                     |    4 
 src/main/resources/generater/admin/form/radioGroup.ftl                       |    6 
 src/main/resources/generater/admin/add.ftl                                   |  226 ++-
 src/main/java/org/yeshi/utils/generater/entity/BaseData.java                 |   10 
 src/main/resources/generater/service/method/count.template                   |   14 
 src/main/resources/generater/service/method/updateSlective.template          |    2 
 src/main/resources/generater/service/method/selectByPrimaryKey.template      |    4 
 43 files changed, 2,347 insertions(+), 603 deletions(-)

diff --git a/src/main/java/org/yeshi/utils/StringUtil.java b/src/main/java/org/yeshi/utils/StringUtil.java
index 61db38d..bce6048 100644
--- a/src/main/java/org/yeshi/utils/StringUtil.java
+++ b/src/main/java/org/yeshi/utils/StringUtil.java
@@ -17,314 +17,321 @@
 
 public class StringUtil {
 
-	// 鍒ゆ柇鏄惁涓烘墜鏈哄彿鐮�
-	public static boolean isMobile(String mobile) {
+    // 鍒ゆ柇鏄惁涓烘墜鏈哄彿鐮�
+    public static boolean isMobile(String mobile) {
 
-		String regex = "^((13[0-9])|(17[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$";
-		Pattern p = Pattern.compile(regex);
-		Matcher m = p.matcher(mobile);
+        String regex = "^((13[0-9])|(17[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$";
+        Pattern p = Pattern.compile(regex);
+        Matcher m = p.matcher(mobile);
 
-		if (mobile == null || mobile.equals("") || mobile.length() != 11) {
+        if (mobile == null || mobile.equals("") || mobile.length() != 11) {
 
-			return false;
+            return false;
 
-		} else {
-			return m.find();
-		}
-	}
+        } else {
+            return m.find();
+        }
+    }
 
-	/**
-	 * 鑾峰彇鏁板瓧鍜屽瓧姣嶇殑闅忔満鐮�
-	 * 
-	 * @param count
-	 * @return
-	 */
-	public static String getRandomCode(int count) {
-		String sts = "0123456789abcdefghijklmnopqrsduvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-		String code = "";
-		for (int i = 0; i < count; i++) {
-			int p = (int) (Math.random() * 62);
-			code += sts.charAt(p);
-		}
-		return code;
-	}
+    /**
+     * 鑾峰彇鏁板瓧鍜屽瓧姣嶇殑闅忔満鐮�
+     *
+     * @param count
+     * @return
+     */
+    public static String getRandomCode(int count) {
+        String sts = "0123456789abcdefghijklmnopqrsduvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+        String code = "";
+        for (int i = 0; i < count; i++) {
+            int p = (int) (Math.random() * 62);
+            code += sts.charAt(p);
+        }
+        return code;
+    }
 
-	/**
-	 * 鑾峰彇6浣嶆暟瀛楅獙璇佺爜
-	 * 
-	 * @return
-	 */
-	public static String getVerifyCode() {
-		String sts = "0123456789";
-		String code = "";
-		for (int i = 0; i < 6; i++) {
-			int p = (int) (Math.random() * 10);
-			code += sts.charAt(p);
-		}
-		return code;
-	}
+    /**
+     * 鑾峰彇6浣嶆暟瀛楅獙璇佺爜
+     *
+     * @return
+     */
+    public static String getVerifyCode() {
+        String sts = "0123456789";
+        String code = "";
+        for (int i = 0; i < 6; i++) {
+            int p = (int) (Math.random() * 10);
+            code += sts.charAt(p);
+        }
+        return code;
+    }
 
-	/**
-	 * 鍒ゆ柇瀛楃涓叉槸鍚︿负绌�
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static boolean isNullOrEmpty(String text) {
-		if (text == null || text.trim().length() == 0 || text.equalsIgnoreCase("null")) {
-			return true;
-		}
-		return false;
-	}
+    /**
+     * 鍒ゆ柇瀛楃涓叉槸鍚︿负绌�
+     *
+     * @param text
+     * @return
+     */
+    public static boolean isNullOrEmpty(String text) {
+        if (text == null || text.trim().length() == 0 || text.equalsIgnoreCase("null")) {
+            return true;
+        }
+        return false;
+    }
 
-	/**
-	 * 32涓篗D5灏忓啓鍔犲瘑
-	 * 
-	 * @param st
-	 * @return
-	 */
-	public static String Md5(String st) {
-		try {
-			MessageDigest md = MessageDigest.getInstance("MD5");
-			try {
-				md.update(st.getBytes("UTF-8"));
-			} catch (UnsupportedEncodingException e) {
-				e.printStackTrace();
-			}
-			byte b[] = md.digest();
+    /**
+     * 32涓篗D5灏忓啓鍔犲瘑
+     *
+     * @param st
+     * @return
+     */
+    public static String Md5(String st) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            try {
+                md.update(st.getBytes("UTF-8"));
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            byte b[] = md.digest();
 
-			int i;
+            int i;
 
-			StringBuffer buf = new StringBuffer("");
-			for (int offset = 0; offset < b.length; offset++) {
-				i = b[offset];
-				if (i < 0)
-					i += 256;
-				if (i < 16)
-					buf.append("0");
-				buf.append(Integer.toHexString(i));
-			}
-			return buf.toString();
-			// LogUtil.i("result: " + buf.toString());// 32位锟侥硷拷锟斤拷
-			// LogUtil.i("result: " + buf.toString().substring(8,
-			// 24));// 16位锟侥硷拷锟斤拷
-		} catch (NoSuchAlgorithmException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
+            StringBuffer buf = new StringBuffer("");
+            for (int offset = 0; offset < b.length; offset++) {
+                i = b[offset];
+                if (i < 0)
+                    i += 256;
+                if (i < 16)
+                    buf.append("0");
+                buf.append(Integer.toHexString(i));
+            }
+            return buf.toString();
+            // LogUtil.i("result: " + buf.toString());// 32位锟侥硷拷锟斤拷
+            // LogUtil.i("result: " + buf.toString().substring(8,
+            // 24));// 16位锟侥硷拷锟斤拷
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
-	public static String MD5Hmac(String st, String key) {
-		try {
-			return HmacUtils.byte2hex(HmacUtils.encryptHMAC(st, key));
-		} catch (InvalidKeyException e) {
-			e.printStackTrace();
-		} catch (NoSuchAlgorithmException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
+    public static String MD5Hmac(String st, String key) {
+        try {
+            return HmacUtils.byte2hex(HmacUtils.encryptHMAC(st, key));
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
-	/**
-	 * 灏唍ull杞负绌哄瓧绗︿覆
-	 * 
-	 * @param st
-	 * @return
-	 */
-	public static String getString(String st) {
-		return isNullOrEmpty(st) ? "" : st;
-	}
+    /**
+     * 灏唍ull杞负绌哄瓧绗︿覆
+     *
+     * @param st
+     * @return
+     */
+    public static String getString(String st) {
+        return isNullOrEmpty(st) ? "" : st;
+    }
 
-	/**
-	 * 灏嗘暣鏁拌浆涓哄瓧绗︿覆
-	 * 
-	 * @param i
-	 * @return
-	 */
-	public static String getString(int i) {
-		return getString(i + "");
-	}
+    /**
+     * 灏嗘暣鏁拌浆涓哄瓧绗︿覆
+     *
+     * @param i
+     * @return
+     */
+    public static String getString(int i) {
+        return getString(i + "");
+    }
 
-	/**
-	 * 灏嗛暱鏁村舰杞负瀛楃涓�
-	 * 
-	 * @param i
-	 * @return
-	 */
-	public static String getString(long i) {
-		return getString(i + "");
-	}
+    /**
+     * 灏嗛暱鏁村舰杞负瀛楃涓�
+     *
+     * @param i
+     * @return
+     */
+    public static String getString(long i) {
+        return getString(i + "");
+    }
 
-	/**
-	 * 鑾峰彇鐢佃瘽鍙风爜鐨勯殣钘忔牸寮�
-	 * 
-	 * @param mobile
-	 * @return
-	 */
-	public static String getSubMobile(String mobile) {
-		if (!StringUtil.isNullOrEmpty(mobile) && mobile.length() > 10) {
-			return mobile.subSequence(0, 3).toString() + "****" + mobile.subSequence(7, mobile.length()).toString();
-		} else
-			return mobile;
-	}
+    /**
+     * 鑾峰彇鐢佃瘽鍙风爜鐨勯殣钘忔牸寮�
+     *
+     * @param mobile
+     * @return
+     */
+    public static String getSubMobile(String mobile) {
+        if (!StringUtil.isNullOrEmpty(mobile) && mobile.length() > 10) {
+            return mobile.subSequence(0, 3).toString() + "****" + mobile.subSequence(7, mobile.length()).toString();
+        } else
+            return mobile;
+    }
 
-	/**
-	 * BASE64鍔犲瘑
-	 * 
-	 * @param b
-	 * @return
-	 */
-	@SuppressWarnings("restriction")
-	public static String getBase64FromByte(byte[] b) {
+    /**
+     * BASE64鍔犲瘑
+     *
+     * @param b
+     * @return
+     */
+    @SuppressWarnings("restriction")
+    public static String getBase64FromByte(byte[] b) {
 
-		String s = null;
-		if (b != null) {
-			s = new BASE64Encoder().encode(b);
-		}
-		return s;
-	}
+        String s = null;
+        if (b != null) {
+            s = new BASE64Encoder().encode(b);
+        }
+        return s;
+    }
 
-	/**
-	 * 鎻愬彇瀛楃涓蹭腑鐨勬墍鏈夋暟瀛�
-	 * 
-	 * @param st
-	 * @return
-	 */
-	public static String getNumberFromString(String st) {
-		String number = "";
-		Pattern p = Pattern.compile("[0-9\\.]+");
-		Matcher m = p.matcher(st);
+    /**
+     * 鎻愬彇瀛楃涓蹭腑鐨勬墍鏈夋暟瀛�
+     *
+     * @param st
+     * @return
+     */
+    public static String getNumberFromString(String st) {
+        String number = "";
+        Pattern p = Pattern.compile("[0-9\\.]+");
+        Matcher m = p.matcher(st);
 
-		while (m.find()) {
-			number += (m.group() + ",");
-		}
-		return number;
-	}
+        while (m.find()) {
+            number += (m.group() + ",");
+        }
+        return number;
+    }
 
-	/**
-	 * 灏嗗瓧绗︿覆杞负UTF-8缂栫爜
-	 * 
-	 * @param resource
-	 * @param chactor
-	 * @return
-	 */
-	public static String getUTF8String(String resource, String chactor) {
-		if (!isNullOrEmpty(resource)) {
-			try {
-				return new String(resource.getBytes(chactor), "UTF-8");
-			} catch (UnsupportedEncodingException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-		}
-		return "";
-	}
+    /**
+     * 灏嗗瓧绗︿覆杞负UTF-8缂栫爜
+     *
+     * @param resource
+     * @param chactor
+     * @return
+     */
+    public static String getUTF8String(String resource, String chactor) {
+        if (!isNullOrEmpty(resource)) {
+            try {
+                return new String(resource.getBytes(chactor), "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+        return "";
+    }
 
-	/**
-	 * Base64鍔犲瘑
-	 * 
-	 * @param str
-	 * @return
-	 * @throws Exception
-	 */
-	@SuppressWarnings({ "unchecked", "rawtypes" })
-	public static String getBase64String(String str) throws Exception {
-		byte[] input = str.getBytes("UTF-8");
-		Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
-		Method mainMethod = clazz.getMethod("encode", byte[].class);
-		mainMethod.setAccessible(true);
-		Object retObj = mainMethod.invoke(null, new Object[] { input });
-		return (String) retObj;
-	}
-	
+    /**
+     * Base64鍔犲瘑
+     *
+     * @param str
+     * @return
+     * @throws Exception
+     */
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public static String getBase64String(String str) throws Exception {
+        byte[] input = str.getBytes("UTF-8");
+        Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
+        Method mainMethod = clazz.getMethod("encode", byte[].class);
+        mainMethod.setAccessible(true);
+        Object retObj = mainMethod.invoke(null, new Object[]{input});
+        return (String) retObj;
+    }
 
-	/**
-	 * BASE64瑙e瘑
-	 * 
-	 * @param s
-	 * @return
-	 */
-	public static String getFromBase64(String s) {
-		byte[] b = null;
-		String result = null;
-		if (s != null) {
-			final Base64 base64 = new Base64();
-			try {
-				b = base64.decode(s.getBytes("UTF-8"));
-				result = new String(b, "utf-8");
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-		return result;
-	}
 
-	/**
-	 * SHA1鍔犲瘑
-	 * 
-	 * @param decript
-	 * @return
-	 */
-	public static String SHA1(String decript) {
-		try {
-			MessageDigest digest = MessageDigest.getInstance("SHA-1");
-			digest.update(decript.getBytes());
-			byte messageDigest[] = digest.digest();
-			// Create Hex String
-			StringBuffer hexString = new StringBuffer();
-			// 瀛楄妭鏁扮粍杞崲锟�?鍗佸叚杩涘埗 锟�?
-			for (int i = 0; i < messageDigest.length; i++) {
-				String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
-				if (shaHex.length() < 2) {
-					hexString.append(0);
-				}
-				hexString.append(shaHex);
-			}
-			return hexString.toString();
+    /**
+     * BASE64瑙e瘑
+     *
+     * @param s
+     * @return
+     */
+    public static String getFromBase64(String s) {
+        byte[] b = null;
+        String result = null;
+        if (s != null) {
+            final Base64 base64 = new Base64();
+            try {
+                b = base64.decode(s.getBytes("UTF-8"));
+                result = new String(b, "utf-8");
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
 
-		} catch (NoSuchAlgorithmException e) {
-			e.printStackTrace();
-		}
-		return "";
-	}
+    /**
+     * SHA1鍔犲瘑
+     *
+     * @param decript
+     * @return
+     */
+    public static String SHA1(String decript) {
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-1");
+            digest.update(decript.getBytes());
+            byte messageDigest[] = digest.digest();
+            // Create Hex String
+            StringBuffer hexString = new StringBuffer();
+            // 瀛楄妭鏁扮粍杞崲锟�?鍗佸叚杩涘埗 锟�?
+            for (int i = 0; i < messageDigest.length; i++) {
+                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
+                if (shaHex.length() < 2) {
+                    hexString.append(0);
+                }
+                hexString.append(shaHex);
+            }
+            return hexString.toString();
 
-	public static long[] parseLong(String[] arr) {
-		long[] lArr = new long[arr.length];
-		int ii = 0;
-		for (String str : arr) {
-			lArr[ii] = Long.parseLong(str);
-			ii++;
-		}
-		return lArr;
-	}
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
 
-	public static String concat(List list, String sperator) {
-		if (list == null)
-			return null;
-		String str = "";
-		for (Object obj : list) {
-			str += obj + sperator;
-		}
-		if (str.endsWith(sperator))
-			str = str.substring(0, str.length() - sperator.length());
-		return str;
-	}
+    public static long[] parseLong(String[] arr) {
+        long[] lArr = new long[arr.length];
+        int ii = 0;
+        for (String str : arr) {
+            lArr[ii] = Long.parseLong(str);
+            ii++;
+        }
+        return lArr;
+    }
 
-	public static String concat(Object[] array, String sperator) {
-		if (array == null)
-			return null;
+    public static String concat(List list, String sperator) {
+        if (list == null)
+            return null;
+        String str = "";
+        for (Object obj : list) {
+            str += obj + sperator;
+        }
+        if (str.endsWith(sperator))
+            str = str.substring(0, str.length() - sperator.length());
+        return str;
+    }
 
-		String str = "";
-		for (int i = 0; i < array.length; i++) {
-			str += array[i] + sperator;
-		}
+    public static String concat(Object[] array, String sperator) {
+        if (array == null)
+            return null;
 
-		if (str.endsWith(sperator))
-			str = str.substring(0, str.length() - sperator.length());
-		return str;
-	}
+        String str = "";
+        for (int i = 0; i < array.length; i++) {
+            str += array[i] + sperator;
+        }
+
+        if (str.endsWith(sperator))
+            str = str.substring(0, str.length() - sperator.length());
+        return str;
+    }
+
+    //棣栧瓧姣嶅皬鍐�
+    public static String firstCharToLower(String st) {
+        if (st == null || st.length() < 2)
+            return st;
+        return st.substring(0, 1).toLowerCase() + st.substring(1);
+    }
 
 
 }
diff --git a/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java b/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
index 9ad08b6..7b17272 100644
--- a/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
+++ b/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
@@ -3,7 +3,7 @@
 import org.yeshi.utils.FreemarkerUtils;
 import org.yeshi.utils.generater.entity.ExceptionData;
 import org.yeshi.utils.generater.entity.MongoDBDaoData;
-import org.yeshi.utils.generater.entity.ServiceData;
+import org.yeshi.utils.generater.vo.ServiceInfoVO;
 
 import java.io.File;
 
@@ -27,9 +27,9 @@
      * @param targetDir
      * @throws Exception
      */
-    public static void createService(ServiceData data, String targetDir) throws Exception {
+    public static void createService(ServiceInfoVO data, String targetDir) throws Exception {
 
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/service.template"), new File(targetDir, data.getServiceClassName() + ".java").getAbsolutePath(), data);
+        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/service/service.template"), new File(targetDir, data.getServiceClassName() + ".java").getAbsolutePath(), data);
     }
 
     /**
@@ -39,9 +39,9 @@
      * @param targetDir
      * @throws Exception
      */
-    public static void createServiceImpl(ServiceData data, String targetDir) throws Exception {
+    public static void createServiceImpl(ServiceInfoVO data, String targetDir) throws Exception {
 
-        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/serviceImpl.template"), new File(targetDir, data.getServiceClassName() + "Impl.java").getAbsolutePath(), data);
+        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/service/serviceImpl.template"), new File(targetDir, data.getServiceClassName() + "Impl.java").getAbsolutePath(), data);
     }
 
 
diff --git a/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Img.java b/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Img.java
index 01ca254..613d6b9 100644
--- a/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Img.java
+++ b/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Img.java
@@ -31,4 +31,11 @@
 
     //鍥剧墖楂樺害px锛岄粯璁や笉璁剧疆
     int height() default -1;
+
+    //鍥剧墖涓婁紶鐨凙PI
+    String uploadApi() default "";
+
+    //鍥剧墖涓婁紶API鐨勫弬鏁�
+    String[] uploadApiParams() default "";
+
 }
diff --git a/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Select.java b/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Select.java
index 02b5762..8eadac2 100644
--- a/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Select.java
+++ b/src/main/java/org/yeshi/utils/generater/annotation/admin/form/Select.java
@@ -36,4 +36,8 @@
     String apiPath() default "";
 
 
+    //api鐨勮姹傚弬鏁�
+    String[] apiParams() default "";
+
+
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/BaseData.java b/src/main/java/org/yeshi/utils/generater/entity/BaseData.java
index 76dcbee..27bcbe5 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/BaseData.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/BaseData.java
@@ -2,7 +2,7 @@
 
 public class BaseData {
     private String packageName;
-    private String entityClass;
+    private ClassInfo entity;
 
     public String getPackageName() {
         return packageName;
@@ -12,11 +12,11 @@
         this.packageName = packageName;
     }
 
-    public String getEntityClass() {
-        return entityClass;
+    public ClassInfo getEntity() {
+        return entity;
     }
 
-    public void setEntityClass(String entityClass) {
-        this.entityClass = entityClass;
+    public void setEntity(ClassInfo entity) {
+        this.entity = entity;
     }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
new file mode 100644
index 0000000..d241acc
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/entity/ClassInfo.java
@@ -0,0 +1,34 @@
+package org.yeshi.utils.generater.entity;
+
+/**
+ * @author Administrator
+ * @title: ClassInfo
+ * @description: 绫讳俊鎭�
+ * @date 2021/9/30 15:53
+ */
+public class ClassInfo {
+
+    private String name;
+    private String clazz;
+
+    public ClassInfo(String name, String clazz) {
+        this.name = name;
+        this.clazz = clazz;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(String clazz) {
+        this.clazz = clazz;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java b/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java
deleted file mode 100644
index 403563d..0000000
--- a/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.yeshi.utils.generater.entity;
-
-public class ServiceData extends BaseData {
-    private String serviceClassName;
-    private String daoClassName;
-    private String daoClass;
-    private String daoClassCaseName;
-    private String serviceClass;
-
-
-    public static class Builder {
-        private Class entityClass;
-        private String packageName;
-        private Class daoClass;
-        private Class serviceClass;
-
-        public Builder setServiceClass(Class serviceClass) {
-            this.serviceClass = serviceClass;
-            return this;
-        }
-
-        public Builder setEntityClass(Class entityClass) {
-            this.entityClass = entityClass;
-            return this;
-        }
-
-        public Builder setPackageName(String packageName) {
-            this.packageName = packageName;
-            return this;
-        }
-
-        public Builder setDaoClass(Class daoClass) {
-            this.daoClass = daoClass;
-            return this;
-        }
-
-        public ServiceData build() {
-            ServiceData serviceData = new ServiceData();
-            if (daoClass != null) {
-                serviceData.setDaoClassCaseName((daoClass.getSimpleName().subSequence(0, 1) + "").toLowerCase() + daoClass.getSimpleName().subSequence(1, daoClass.getSimpleName().length()));
-                serviceData.setDaoClassName(daoClass.getSimpleName());
-                serviceData.setDaoClass(daoClass.getName());
-            }
-            if (serviceClass != null) {
-                serviceData.setServiceClass(serviceClass.getName());
-            }
-            serviceData.setServiceClassName(entityClass.getSimpleName() + "Service");
-            serviceData.setEntityClass(entityClass.getName());
-            serviceData.setPackageName(packageName);
-            return serviceData;
-        }
-
-    }
-
-    public String getServiceClassName() {
-        return serviceClassName;
-    }
-
-    public void setServiceClassName(String serviceClassName) {
-        this.serviceClassName = serviceClassName;
-    }
-
-    public String getDaoClassName() {
-        return daoClassName;
-    }
-
-    public void setDaoClassName(String daoClassName) {
-        this.daoClassName = daoClassName;
-    }
-
-    public String getDaoClassCaseName() {
-        return daoClassCaseName;
-    }
-
-    public void setDaoClassCaseName(String daoClassCaseName) {
-        this.daoClassCaseName = daoClassCaseName;
-    }
-
-    public String getDaoClass() {
-        return daoClass;
-    }
-
-    public void setDaoClass(String daoClass) {
-        this.daoClass = daoClass;
-    }
-
-    public String getServiceClass() {
-        return serviceClass;
-    }
-
-    public void setServiceClass(String serviceClass) {
-        this.serviceClass = serviceClass;
-    }
-}
diff --git a/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java b/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
index 65c382a..96eed04 100644
--- a/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
+++ b/src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
@@ -18,7 +18,7 @@
     //entity绫�
     private Class entity;
     //controller娉ㄨВ瀵硅薄
-    private Map<String, Object> controllerData;
+    private AdminController controllerData;
     //淇敼鐨勮〃鍗曡鏁版嵁
     private List<FormRowData> updateFormRows;
     //娣诲姞鐨勮〃鍗曡鏁版嵁
@@ -37,14 +37,13 @@
         this.entity = entity;
     }
 
-    public Map<String, Object> getControllerData() {
+    public AdminController getControllerData() {
         return controllerData;
     }
 
-    public void setControllerData(Map<String, Object> controllerData) {
+    public void setControllerData(AdminController controllerData) {
         this.controllerData = controllerData;
     }
-
 
     public List<FormRowData> getUpdateFormRows() {
         return updateFormRows;
@@ -98,7 +97,7 @@
                 if (an instanceof AdminController) {
                     Class searchFormClass = ((AdminController) an).searchForm();
                     AdminGeneraterInfo info = new AdminGeneraterInfo();
-                    info.setControllerData(AnotationUtil.getParamsMap(an));
+                    info.setControllerData((AdminController) an);
                     info.setSearchFormRows(AnotationUtil.getFormRowData(searchFormClass));
                     info.setAddFormRows(AnotationUtil.getFormRowData(entity));
                     info.setUpdateFormRows(AnotationUtil.getUpdateFormRowData(entity));
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 f70653e..6ade380 100644
--- a/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/util/AnotationUtil.java
@@ -38,7 +38,7 @@
                 if (arrays.length == 1 && StringUtil.isNullOrEmpty(arrays[0])) {
                 } else {
                     for (String st : (String[]) value) {
-                        values.add(new KeyValue(st.substring(0, st.indexOf(",")), st.substring(st.indexOf(",") + 1)));
+                        values.add(new KeyValue(st.substring(0, st.indexOf(":")), st.substring(st.indexOf(":") + 1)));
                     }
                 }
                 params.put(md.getName(), values);
diff --git a/src/main/java/org/yeshi/utils/generater/util/FormAnotationValidUtil.java b/src/main/java/org/yeshi/utils/generater/util/FormAnotationValidUtil.java
index 0aff7a2..704e1aa 100644
--- a/src/main/java/org/yeshi/utils/generater/util/FormAnotationValidUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/util/FormAnotationValidUtil.java
@@ -67,8 +67,8 @@
         }
 
         for (String st : checkBox.values()) {
-            if (!st.contains(",")) {
-                throw new AnotationException("澶嶉�夋鐨勫唴瀹规牸寮忛敊璇紝閿�煎瑕佺敤閫楀彿鍒嗛殧");
+            if (!st.contains(":")) {
+                throw new AnotationException("澶嶉�夋鐨勫唴瀹规牸寮忛敊璇紝閿�煎瑕佺敤:鍒嗛殧");
             }
         }
     }
@@ -94,8 +94,8 @@
         }
 
         for (String st : radioGroup.values()) {
-            if (!st.contains(",")) {
-                throw new AnotationException("鍗曢�夋鐨勫唴瀹规牸寮忛敊璇紝閿�煎瑕佺敤閫楀彿鍒嗛殧");
+            if (!st.contains(":")) {
+                throw new AnotationException("鍗曢�夋鐨勫唴瀹规牸寮忛敊璇紝閿�煎瑕佺敤:鍒嗛殧");
             }
         }
 
@@ -111,8 +111,8 @@
             }
         } else {
             for (String st : select.values()) {
-                if (!st.contains(",")) {
-                    throw new AnotationException("涓嬫媺妗嗙殑鍐呭鏍煎紡閿欒锛岄敭鍊煎瑕佺敤閫楀彿鍒嗛殧");
+                if (!st.contains(":")) {
+                    throw new AnotationException("涓嬫媺妗嗙殑鍐呭鏍煎紡閿欒锛岄敭鍊煎瑕佺敤:鍒嗛殧");
                 }
             }
         }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java
new file mode 100644
index 0000000..a731968
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/ServiceImplInfoVO.java
@@ -0,0 +1,86 @@
+package org.yeshi.utils.generater.vo;
+
+import org.yeshi.utils.generater.entity.BaseData;
+import org.yeshi.utils.generater.entity.ClassInfo;
+
+import java.util.List;
+
+public class ServiceImplInfoVO extends BaseData {
+    private ClassInfo service;
+    private ClassInfo dao;
+
+    //鏂规硶鍒楄〃
+    private List<ServiceMetodInfoVO> metodInfoList;
+
+
+    public static class Builder {
+        private Class entityClass;
+        private String packageName;
+        private Class daoClass;
+        private Class serviceClass;
+
+        public Builder setServiceClass(Class serviceClass) {
+            this.serviceClass = serviceClass;
+            return this;
+        }
+
+        public Builder setEntityClass(Class entityClass) {
+            this.entityClass = entityClass;
+            return this;
+        }
+
+        public Builder setPackageName(String packageName) {
+            this.packageName = packageName;
+            return this;
+        }
+
+        public Builder setDaoClass(Class daoClass) {
+            this.daoClass = daoClass;
+            return this;
+        }
+
+        public ServiceImplInfoVO build() {
+            ServiceImplInfoVO serviceData = new ServiceImplInfoVO();
+            serviceData.setEntity(entityClass);
+            serviceData.setEntity(new ClassInfo(entityClass.getSimpleName(), entityClass.getName()));
+            serviceData.setPackageName(packageName);
+            return serviceData;
+        }
+
+    }
+
+    public ClassInfo getService() {
+        return service;
+    }
+
+    public void setService(ClassInfo service) {
+        this.service = service;
+    }
+
+    public ClassInfo getDao() {
+        return dao;
+    }
+
+    public void setDao(ClassInfo dao) {
+        this.dao = dao;
+    }
+
+    @Override
+    public ClassInfo getEntity() {
+        return entity;
+    }
+
+    @Override
+    public void setEntity(ClassInfo entity) {
+        this.entity = entity;
+    }
+
+    public List<ServiceMetodInfoVO> getMetodInfoList() {
+        return metodInfoList;
+    }
+
+    public void setMetodInfoList(List<ServiceMetodInfoVO> metodInfoList) {
+        this.metodInfoList = metodInfoList;
+    }
+}
+
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java
new file mode 100644
index 0000000..67924f7
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/ServiceInfoVO.java
@@ -0,0 +1,128 @@
+package org.yeshi.utils.generater.vo;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.entity.BaseData;
+import org.yeshi.utils.generater.entity.ClassInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ServiceInfoVO extends BaseData {
+    private ClassInfo service;
+    private ClassInfo dao;
+    //鏂规硶鍒楄〃
+    private List<ServiceMetodInfoVO> metodInfoList;
+
+
+    public static class Builder {
+        private Class entity;
+        private String packageName;
+        private ClassInfo dao;
+        private ClassInfo service;
+        private ClassInfo query;
+
+
+        public Builder setEntity(Class entity) {
+            this.entity = entity;
+            return this;
+        }
+
+        public Builder setPackageName(String packageName) {
+            this.packageName = packageName;
+            return this;
+        }
+
+        public Builder setDao(ClassInfo dao) {
+            this.dao = dao;
+            return this;
+        }
+
+        public Builder setService(ClassInfo service) {
+            this.service = service;
+            return this;
+        }
+
+        public Builder setQuery(ClassInfo query) {
+            this.query = query;
+            return this;
+        }
+
+
+        public ServiceInfoVO build() throws Exception {
+            ServiceInfoVO serviceData = new ServiceInfoVO();
+            serviceData.setDao(dao);
+            serviceData.setService(service);
+            serviceData.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
+            serviceData.setPackageName(packageName);
+            //璁剧疆鎺ュ彛
+            List<ServiceMetodInfoVO> metodInfoVOList = new ArrayList<>();
+            /*******娣诲姞鏂规硶寮�濮�*******/
+            List<String> params = null;
+            ServiceMetodInfoVO metodInfo = null;
+            //list鏂规硶
+            params = new ArrayList<>();
+            params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
+            params.add("int page");
+            params.add("int pageSize");
+            metodInfo = new ServiceMetodInfoVO("public", String.format("List<%s>", serviceData.getEntity().getName()), "list", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+            //count鏂规硶
+            params = new ArrayList<>();
+            params.add(query.getName() + " " + StringUtil.firstCharToLower(query.getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "long", "count", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+            //get鏂规硶
+            params = new ArrayList<>();
+            params.add("String id");
+            metodInfo = new ServiceMetodInfoVO("public", serviceData.getEntity().getName(), "get", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+            //add鏂规硶
+            params = new ArrayList<>();
+            params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "void", "add", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+            //update鏂规硶
+            params = new ArrayList<>();
+            params.add(serviceData.getEntity().getName() + " " + StringUtil.firstCharToLower(serviceData.getEntity().getName()));
+            metodInfo = new ServiceMetodInfoVO("public", "void", "update", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+            //delete鏂规硶
+            params = new ArrayList<>();
+            params.add("List<String> idList");
+            metodInfo = new ServiceMetodInfoVO("public", String.format("void", serviceData.getEntity().getName()), "delete", StringUtil.concat(params, ","));
+            metodInfoVOList.add(metodInfo);
+
+            /*******娣诲姞鏂规硶缁撴潫*******/
+
+
+            return serviceData;
+        }
+
+    }
+
+    public ClassInfo getService() {
+        return service;
+    }
+
+    public void setService(ClassInfo service) {
+        this.service = service;
+    }
+
+    public ClassInfo getDao() {
+        return dao;
+    }
+
+    public void setDao(ClassInfo dao) {
+        this.dao = dao;
+    }
+
+    public List<ServiceMetodInfoVO> getMetodInfoList() {
+        return metodInfoList;
+    }
+
+    public void setMetodInfoList(List<ServiceMetodInfoVO> metodInfoList) {
+        this.metodInfoList = metodInfoList;
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java
new file mode 100644
index 0000000..cbb7d35
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/ServiceMetodInfoVO.java
@@ -0,0 +1,77 @@
+package org.yeshi.utils.generater.vo;
+
+/**
+ * @author Administrator
+ * @title: ServiceMetodInfo
+ * @description: 鏈嶅姟鍑芥暟鐨勮緭鍑轰俊鎭�
+ * @date 2021/9/27 17:12
+ */
+public class ServiceMetodInfoVO {
+    //娉ㄩ噴
+    private String note;
+    //璁块棶鎺у埗
+    private String visiteAccess;
+    //杩斿洖绫诲瀷
+    private String returnType;
+    //鍑芥暟鍚嶇О
+    private String name;
+    //鍙傛暟
+    private String params;
+    //鏂规硶鍐呭
+    private String content;
+
+    public ServiceMetodInfoVO(String visiteAccess, String returnType, String name, String params) {
+        this.visiteAccess = visiteAccess;
+        this.returnType = returnType;
+        this.name = name;
+        this.params = params;
+    }
+
+    public String getVisiteAccess() {
+        return visiteAccess;
+    }
+
+    public void setVisiteAccess(String visiteAccess) {
+        this.visiteAccess = visiteAccess;
+    }
+
+    public String getReturnType() {
+        return returnType;
+    }
+
+    public void setReturnType(String returnType) {
+        this.returnType = returnType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public String getNote() {
+        return note;
+    }
+
+    public void setNote(String note) {
+        this.note = note;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java
new file mode 100644
index 0000000..41ba237
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/AdminControllerInfoVO.java
@@ -0,0 +1,128 @@
+package org.yeshi.utils.generater.vo.admin;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.annotation.admin.form.Select;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.annotation.admin.form.TextArea;
+import org.yeshi.utils.generater.entity.ClassInfo;
+import org.yeshi.utils.generater.entity.KeyValue;
+import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
+import org.yeshi.utils.generater.entity.admin.FormRowData;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: FormAddInfo
+ * @description: 鏋勫缓鏂板鐨勫疄浣撶被
+ * @date 2021/9/26 10:07
+ */
+public class AdminControllerInfoVO {
+
+    private String packageName;
+    private String mapping;
+    private ClassInfo entity;
+    private ClassInfo service;
+    private ClassInfo query;
+
+
+    public static class Builder {
+        private AdminGeneraterInfo generaterInfo;
+        //鍖呭悕
+        private String packageName;
+        //鍚庡彴鏌ヨDTO
+        private ClassInfo query;
+        //
+        private ClassInfo service;
+
+
+        public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
+            this.generaterInfo = generaterInfo;
+            return this;
+        }
+
+        public Builder setPackageName(String packageName) {
+            this.packageName = packageName;
+            return this;
+        }
+
+        public Builder setQueryVO(ClassInfo query) {
+            this.query = query;
+            return this;
+        }
+
+        public Builder setService(ClassInfo service) {
+            this.service = service;
+            return this;
+        }
+
+        public AdminControllerInfoVO build() throws Exception {
+            if (generaterInfo == null) {
+                throw new Exception("generaterInfo涓嶈兘涓虹┖");
+            }
+            if (StringUtil.isNullOrEmpty(packageName)) {
+                throw new Exception("鍖呭悕涓嶈兘涓虹┖");
+            }
+            if (query == null) {
+                throw new Exception("鏌ヨ鏉′欢涓嶈兘涓虹┖");
+            }
+            if (service == null) {
+                throw new Exception("鏈嶅姟涓嶈兘涓虹┖");
+            }
+
+            AdminControllerInfoVO vo = new AdminControllerInfoVO();
+            vo.setMapping(generaterInfo.getControllerData().mapping());
+            vo.setEntity(new ClassInfo(generaterInfo.getEntity().getSimpleName(), generaterInfo.getEntity().getName()));
+            vo.setPackageName(packageName);
+            vo.setQueryVO(query);
+            vo.setService(service);
+            return vo;
+        }
+
+
+    }
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName) {
+        this.packageName = packageName;
+    }
+
+    public String getMapping() {
+        return mapping;
+    }
+
+    public void setMapping(String mapping) {
+        this.mapping = mapping;
+    }
+
+    public ClassInfo getEntity() {
+        return entity;
+    }
+
+    public void setEntity(ClassInfo entity) {
+        this.entity = entity;
+    }
+
+    public ClassInfo getService() {
+        return service;
+    }
+
+    public void setService(ClassInfo service) {
+        this.service = service;
+    }
+
+    public ClassInfo getQuery() {
+        return query;
+    }
+
+    public void setQueryVO(ClassInfo query) {
+        this.query = query;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java
new file mode 100644
index 0000000..70f16c3
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/FormAddInfoVO.java
@@ -0,0 +1,160 @@
+package org.yeshi.utils.generater.vo.admin;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.annotation.admin.form.Select;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.annotation.admin.form.TextArea;
+import org.yeshi.utils.generater.entity.KeyValue;
+import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
+import org.yeshi.utils.generater.entity.admin.FormRowData;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: FormAddInfo
+ * @description: 鏋勫缓鏂板鐨勫疄浣撶被
+ * @date 2021/9/26 10:07
+ */
+public class FormAddInfoVO {
+    private String title;
+    private List<FormRowData> rowsList;
+    private List<FormInputRegexVerifyVO> regexVerifyList;
+    private String addApi;
+
+    //杩涘叆椤甸潰灏遍渶瑕佽姹傜殑鏁版嵁
+    private List<FormHttpRequestInfoVO> preRequestList;
+
+    public static class Builder {
+
+        private AdminGeneraterInfo generaterInfo;
+
+        public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
+            this.generaterInfo = generaterInfo;
+            return this;
+        }
+
+        public FormAddInfoVO build() {
+            FormAddInfoVO vo = new FormAddInfoVO();
+            vo.setAddApi(generaterInfo.getControllerData().mapping() + "/add");
+            vo.setRowsList(generaterInfo.getAddFormRows());
+            vo.setTitle("鏂板" + generaterInfo.getControllerData().title());
+            //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
+            List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
+            for (FormRowData row : vo.getRowsList()) {
+                if (!row.getType().equalsIgnoreCase(Text.class.getSimpleName()) && !row.getType().equalsIgnoreCase(TextArea.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+                if ((row.getParams().get("verifyType")) != FormVerifyType.regex)
+                    continue;
+                FormInputRegexVerifyVO verifyVO = new FormInputRegexVerifyVO();
+                verifyVO.setExpression(row.getParams().get("verifyValue") + "");
+                verifyVO.setKey("_" + row.getKey());
+                verifyVO.setMsg(row.getParams().get("verifyNotifyMsg") + "");
+                verifyVOList.add(verifyVO);
+            }
+            vo.setRegexVerifyList(verifyVOList);
+            //鎻愬彇select涓殑缃戠粶璇锋眰
+            List<FormHttpRequestInfoVO> formHttpRequestInfoVOList = new ArrayList<>();
+            for (FormRowData row : vo.getRowsList()) {
+                if (!row.getType().equalsIgnoreCase(Select.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+
+                String apiPath = row.getParams().get("apiPath") + "";
+                if (StringUtil.isNullOrEmpty(apiPath)) {
+                    continue;
+                }
+                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
+                Map<String, String> apiParams = new HashMap<>();
+                if (((List) row.getParams().get("apiParams")).size() > 0) {
+                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
+                    for (KeyValue kv : apiParamsList) {
+                        apiParams.put(kv.getKey(), kv.getValue());
+                    }
+                }
+                requestInfoVO.setParams(apiParams);
+                requestInfoVO.setUrl(apiPath);
+                //TODO 鏆傛椂鍥哄畾涓簆ost锛屽悗闈㈠啀鏀寔鍏朵粬鐨勫姛鑳�
+                requestInfoVO.setType("POST");
+                requestInfoVO.setFillTarget("select[name=" + row.getKey() + "]");
+                formHttpRequestInfoVOList.add(requestInfoVO);
+            }
+
+
+            for (FormRowData row : vo.getRowsList()) {
+                //layui鏇存敼楠岃瘉
+                String layVerify = "";
+                if (row.getParams() != null && row.getParams().get("require") != null && (Boolean) row.getParams().get("require")) {
+                    layVerify += "required|";
+                }
+                if (row.getParams() != null && row.getParams().get("verifyType") != null) {
+                    FormVerifyType verifyType = (FormVerifyType) row.getParams().get("verifyType");
+                    if (verifyType == FormVerifyType.regex) {
+                        //鑷畾涔夌殑楠岃瘉鍚嶇О涓轰笅鍒掔嚎+name
+                        layVerify += "_" + row.getKey();
+                    } else if (verifyType != FormVerifyType.none) {
+                        layVerify += verifyType.name();
+                    }
+                }
+                if (layVerify.endsWith("|"))
+                    layVerify = layVerify.substring(0, layVerify.length() - 1);
+                //閲嶆柊璧嬪�硷紝琛ㄥ崟涓洿鎺ュ彇鍊�
+                row.getParams().put("verifyValue", layVerify);
+            }
+
+            vo.setPreRequestList(formHttpRequestInfoVOList);
+            return vo;
+        }
+
+
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public List<FormRowData> getRowsList() {
+        return rowsList;
+    }
+
+    public void setRowsList(List<FormRowData> rowsList) {
+        this.rowsList = rowsList;
+    }
+
+    public List<FormInputRegexVerifyVO> getRegexVerifyList() {
+        return regexVerifyList;
+    }
+
+    public void setRegexVerifyList(List<FormInputRegexVerifyVO> regexVerifyList) {
+        this.regexVerifyList = regexVerifyList;
+    }
+
+    public String getAddApi() {
+        return addApi;
+    }
+
+    public void setAddApi(String addApi) {
+        this.addApi = addApi;
+    }
+
+    public List<FormHttpRequestInfoVO> getPreRequestList() {
+        return preRequestList;
+    }
+
+    public void setPreRequestList(List<FormHttpRequestInfoVO> preRequestList) {
+        this.preRequestList = preRequestList;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java
new file mode 100644
index 0000000..216a4d6
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/FormHttpRequestInfoVO.java
@@ -0,0 +1,55 @@
+package org.yeshi.utils.generater.vo.admin;
+
+
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: FormHttpRequestInfo
+ * @description: 琛ㄥ崟涓殑鏁版嵁璇锋眰
+ * @date 2021/9/26 10:25
+ */
+public class FormHttpRequestInfoVO {
+
+    //post/get
+    private String type;
+    //璇锋眰閾炬帴
+    private String url;
+    //璇锋眰鍙傛暟
+    private Map<String, String> params;
+    //鏁版嵁闇�瑕佸~鍏呯殑jquery琛ㄨ揪寮�
+    private String fillTarget;
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Map<String, String> getParams() {
+        return params;
+    }
+
+    public void setParams(Map<String, String> params) {
+        this.params = params;
+    }
+
+    public String getFillTarget() {
+        return fillTarget;
+    }
+
+    public void setFillTarget(String fillTarget) {
+        this.fillTarget = fillTarget;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java
new file mode 100644
index 0000000..5162e26
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/FormInputRegexVerifyVO.java
@@ -0,0 +1,39 @@
+package org.yeshi.utils.generater.vo.admin;
+
+/**
+ * @author Administrator
+ * @title: FormInputVerifyVO
+ * @description: 琛ㄥ崟楠岃瘉鐨勬鍒欏疄浣�
+ * @date 2021/9/26 10:12
+ */
+public class FormInputRegexVerifyVO {
+
+    private String key;
+    private String expression;
+    private String msg;
+
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getExpression() {
+        return expression;
+    }
+
+    public void setExpression(String expression) {
+        this.expression = expression;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java
new file mode 100644
index 0000000..ece31e3
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/FormUpdateInfoVO.java
@@ -0,0 +1,170 @@
+package org.yeshi.utils.generater.vo.admin;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.annotation.admin.form.Select;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.annotation.admin.form.TextArea;
+import org.yeshi.utils.generater.entity.KeyValue;
+import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
+import org.yeshi.utils.generater.entity.admin.FormRowData;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: FormAddInfo
+ * @description: 鏋勫缓淇敼鐨勮緭鍑虹被
+ * @date 2021/9/26 10:07
+ */
+public class FormUpdateInfoVO {
+    private String title;
+    private List<FormRowData> rowsList;
+    private List<FormInputRegexVerifyVO> regexVerifyList;
+    private String updateApi;
+    private String detailApi;
+
+    //杩涘叆椤甸潰灏遍渶瑕佽姹傜殑鏁版嵁
+    private List<FormHttpRequestInfoVO> preRequestList;
+
+    public static class Builder {
+
+        private AdminGeneraterInfo generaterInfo;
+
+        public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
+            this.generaterInfo = generaterInfo;
+            return this;
+        }
+
+        public FormUpdateInfoVO build() {
+            FormUpdateInfoVO vo = new FormUpdateInfoVO();
+            vo.setUpdateApi(generaterInfo.getControllerData().mapping() + "/update");
+            vo.setDetailApi(generaterInfo.getControllerData().mapping() + "/get");
+            vo.setRowsList(generaterInfo.getUpdateFormRows());
+            vo.setTitle("淇敼" + generaterInfo.getControllerData().title());
+            //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
+            List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
+            for (FormRowData row : vo.getRowsList()) {
+                if (!row.getType().equalsIgnoreCase(Text.class.getSimpleName()) && !row.getType().equalsIgnoreCase(TextArea.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+                if ((row.getParams().get("verifyType")) != FormVerifyType.regex)
+                    continue;
+                FormInputRegexVerifyVO verifyVO = new FormInputRegexVerifyVO();
+                verifyVO.setExpression(row.getParams().get("verifyValue") + "");
+                verifyVO.setKey("_" + row.getKey());
+                verifyVO.setMsg(row.getParams().get("verifyNotifyMsg") + "");
+                verifyVOList.add(verifyVO);
+            }
+            vo.setRegexVerifyList(verifyVOList);
+            //鎻愬彇select涓殑缃戠粶璇锋眰
+            List<FormHttpRequestInfoVO> formHttpRequestInfoVOList = new ArrayList<>();
+            for (FormRowData row : vo.getRowsList()) {
+                if (!row.getType().equalsIgnoreCase(Select.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+
+                String apiPath = row.getParams().get("apiPath") + "";
+                if (StringUtil.isNullOrEmpty(apiPath)) {
+                    continue;
+                }
+                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
+                Map<String, String> apiParams = new HashMap<>();
+                if (((List) row.getParams().get("apiParams")).size() > 0) {
+                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
+                    for (KeyValue kv : apiParamsList) {
+                        apiParams.put(kv.getKey(), kv.getValue());
+                    }
+                }
+                requestInfoVO.setParams(apiParams);
+                requestInfoVO.setUrl(apiPath);
+                //TODO 鏆傛椂鍥哄畾涓簆ost锛屽悗闈㈠啀鏀寔鍏朵粬鐨勫姛鑳�
+                requestInfoVO.setType("POST");
+                requestInfoVO.setFillTarget("select[name=" + row.getKey() + "]");
+                formHttpRequestInfoVOList.add(requestInfoVO);
+            }
+
+
+            for (FormRowData row : vo.getRowsList()) {
+                //layui鏇存敼楠岃瘉
+                String layVerify = "";
+                if (row.getParams() != null && row.getParams().get("require") != null && (Boolean) row.getParams().get("require")) {
+                    layVerify += "required|";
+                }
+                if (row.getParams() != null && row.getParams().get("verifyType") != null) {
+                    FormVerifyType verifyType = (FormVerifyType) row.getParams().get("verifyType");
+                    if (verifyType == FormVerifyType.regex) {
+                        //鑷畾涔夌殑楠岃瘉鍚嶇О涓轰笅鍒掔嚎+name
+                        layVerify += "_" + row.getKey();
+                    } else if (verifyType != FormVerifyType.none) {
+                        layVerify += verifyType.name();
+                    }
+                }
+                if (layVerify.endsWith("|"))
+                    layVerify = layVerify.substring(0, layVerify.length() - 1);
+                //閲嶆柊璧嬪�硷紝琛ㄥ崟涓洿鎺ュ彇鍊�
+                row.getParams().put("verifyValue", layVerify);
+            }
+
+            vo.setPreRequestList(formHttpRequestInfoVOList);
+            return vo;
+        }
+
+
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public List<FormRowData> getRowsList() {
+        return rowsList;
+    }
+
+    public void setRowsList(List<FormRowData> rowsList) {
+        this.rowsList = rowsList;
+    }
+
+    public List<FormInputRegexVerifyVO> getRegexVerifyList() {
+        return regexVerifyList;
+    }
+
+    public void setRegexVerifyList(List<FormInputRegexVerifyVO> regexVerifyList) {
+        this.regexVerifyList = regexVerifyList;
+    }
+
+    public String getUpdateApi() {
+        return updateApi;
+    }
+
+    public void setUpdateApi(String updateApi) {
+        this.updateApi = updateApi;
+    }
+
+    public String getDetailApi() {
+        return detailApi;
+    }
+
+    public void setDetailApi(String detailApi) {
+        this.detailApi = detailApi;
+    }
+
+    public List<FormHttpRequestInfoVO> getPreRequestList() {
+        return preRequestList;
+    }
+
+    public void setPreRequestList(List<FormHttpRequestInfoVO> preRequestList) {
+        this.preRequestList = preRequestList;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java
new file mode 100644
index 0000000..2cfdeeb
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/ListInfoVO.java
@@ -0,0 +1,193 @@
+package org.yeshi.utils.generater.vo.admin;
+
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.annotation.admin.form.Select;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.annotation.admin.form.TextArea;
+import org.yeshi.utils.generater.entity.KeyValue;
+import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
+import org.yeshi.utils.generater.entity.admin.FormRowData;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Administrator
+ * @title: FormAddInfo
+ * @description: 鏋勫缓淇敼鐨勮緭鍑虹被
+ * @date 2021/9/26 10:07
+ */
+public class ListInfoVO {
+    private String title;
+    private List<FormRowData> searchFormRows;
+    //鏄剧ず鐨勫瓧娈�
+    private List<Map<String, Object>> showFileds;
+    //杩涘叆椤甸潰灏遍渶瑕佽姹傜殑鏁版嵁
+    private List<FormHttpRequestInfoVO> preRequestList;
+    private List<FormInputRegexVerifyVO> regexVerifyList;
+    //鍒楄〃鎺ュ彛
+    private String listApi;
+    //娣诲姞椤佃矾寰�
+    private String addPagePath;
+    //鏇存柊椤佃矾寰�
+    private String updatePagePath;
+
+
+    public static class Builder {
+
+        private AdminGeneraterInfo generaterInfo;
+
+        public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
+            this.generaterInfo = generaterInfo;
+            return this;
+        }
+
+        public ListInfoVO build() {
+            ListInfoVO vo = new ListInfoVO();
+            vo.setListApi(generaterInfo.getControllerData().mapping() + "/list");
+            vo.setAddPagePath("add.html");
+            vo.setUpdatePagePath("update.html");
+            vo.setSearchFormRows(generaterInfo.getSearchFormRows());
+            vo.setShowFileds(generaterInfo.getShowDataList());
+            vo.setTitle("淇敼" + generaterInfo.getControllerData().title());
+            //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
+            List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
+            for (FormRowData row : vo.getSearchFormRows()) {
+                if (!row.getType().equalsIgnoreCase(Text.class.getSimpleName()) && !row.getType().equalsIgnoreCase(TextArea.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+                if ((row.getParams().get("verifyType")) != FormVerifyType.regex)
+                    continue;
+                FormInputRegexVerifyVO verifyVO = new FormInputRegexVerifyVO();
+                verifyVO.setExpression(row.getParams().get("verifyValue") + "");
+                verifyVO.setKey("_" + row.getKey());
+                verifyVO.setMsg(row.getParams().get("verifyNotifyMsg") + "");
+                verifyVOList.add(verifyVO);
+            }
+            vo.setRegexVerifyList(verifyVOList);
+            //鎻愬彇select涓殑缃戠粶璇锋眰
+            List<FormHttpRequestInfoVO> formHttpRequestInfoVOList = new ArrayList<>();
+            for (FormRowData row : vo.getSearchFormRows()) {
+                if (!row.getType().equalsIgnoreCase(Select.class.getSimpleName())) {
+                    continue;
+                }
+                if (row.getParams() == null)
+                    continue;
+
+                String apiPath = row.getParams().get("apiPath") + "";
+                if (StringUtil.isNullOrEmpty(apiPath)) {
+                    continue;
+                }
+                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
+                Map<String, String> apiParams = new HashMap<>();
+                if (((List) row.getParams().get("apiParams")).size() > 0) {
+                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
+                    for (KeyValue kv : apiParamsList) {
+                        apiParams.put(kv.getKey(), kv.getValue());
+                    }
+                }
+                requestInfoVO.setParams(apiParams);
+                requestInfoVO.setUrl(apiPath);
+                //TODO 鏆傛椂鍥哄畾涓簆ost锛屽悗闈㈠啀鏀寔鍏朵粬鐨勫姛鑳�
+                requestInfoVO.setType("POST");
+                requestInfoVO.setFillTarget("select[name=" + row.getKey() + "]");
+                formHttpRequestInfoVOList.add(requestInfoVO);
+            }
+
+
+            for (FormRowData row : vo.getSearchFormRows()) {
+                //layui鏇存敼楠岃瘉
+                String layVerify = "";
+                if (row.getParams() != null && row.getParams().get("require") != null && (Boolean) row.getParams().get("require")) {
+                    layVerify += "required|";
+                }
+                if (row.getParams() != null && row.getParams().get("verifyType") != null) {
+                    FormVerifyType verifyType = (FormVerifyType) row.getParams().get("verifyType");
+                    if (verifyType == FormVerifyType.regex) {
+                        //鑷畾涔夌殑楠岃瘉鍚嶇О涓轰笅鍒掔嚎+name
+                        layVerify += "_" + row.getKey();
+                    } else if (verifyType != FormVerifyType.none) {
+                        layVerify += verifyType.name();
+                    }
+                }
+                if (layVerify.endsWith("|"))
+                    layVerify = layVerify.substring(0, layVerify.length() - 1);
+                //閲嶆柊璧嬪�硷紝琛ㄥ崟涓洿鎺ュ彇鍊�
+                row.getParams().put("verifyValue", layVerify);
+            }
+
+            vo.setPreRequestList(formHttpRequestInfoVOList);
+            return vo;
+        }
+
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public List<FormRowData> getSearchFormRows() {
+        return searchFormRows;
+    }
+
+    public void setSearchFormRows(List<FormRowData> searchFormRows) {
+        this.searchFormRows = searchFormRows;
+    }
+
+    public List<FormHttpRequestInfoVO> getPreRequestList() {
+        return preRequestList;
+    }
+
+    public void setPreRequestList(List<FormHttpRequestInfoVO> preRequestList) {
+        this.preRequestList = preRequestList;
+    }
+
+    public List<FormInputRegexVerifyVO> getRegexVerifyList() {
+        return regexVerifyList;
+    }
+
+    public void setRegexVerifyList(List<FormInputRegexVerifyVO> regexVerifyList) {
+        this.regexVerifyList = regexVerifyList;
+    }
+
+    public String getListApi() {
+        return listApi;
+    }
+
+    public void setListApi(String listApi) {
+        this.listApi = listApi;
+    }
+
+    public String getAddPagePath() {
+        return addPagePath;
+    }
+
+    public void setAddPagePath(String addPagePath) {
+        this.addPagePath = addPagePath;
+    }
+
+    public String getUpdatePagePath() {
+        return updatePagePath;
+    }
+
+    public void setUpdatePagePath(String updatePagePath) {
+        this.updatePagePath = updatePagePath;
+    }
+
+    public List<Map<String, Object>> getShowFileds() {
+        return showFileds;
+    }
+
+    public void setShowFileds(List<Map<String, Object>> showFileds) {
+        this.showFileds = showFileds;
+    }
+}
diff --git a/src/main/resources/generater/admin/add.ftl b/src/main/resources/generater/admin/add.ftl
index 693c9e4..2de34c9 100644
--- a/src/main/resources/generater/admin/add.ftl
+++ b/src/main/resources/generater/admin/add.ftl
@@ -3,7 +3,7 @@
 
 <head>
     <meta charset="UTF-8">
-    <title>鏂板${controllerData.title}</title>
+    <title>${title}</title>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="viewport"
@@ -26,14 +26,14 @@
     <div class="layui-row">
         <form class="layui-form" lay-filter="add">
 
-            <#list addFormRows as value>
+            <#list rowsList as value>
                 <div class="layui-form-item">
                     <label for="L_appCode" class="layui-form-label">
                         <#if value.params.require??&&value.params.require>
                            <span class="x-red">*</span>
                         </#if>
                         ${value.params.title}</label>
-
+                     <div class="layui-input-block">
                     <#switch value.type>
                         <#case "CheckBox"><#include "/admin/form/checkBox.ftl" ><#break>
                         <#case "Img">  <#include "/admin/form/img.ftl"><#break>
@@ -45,6 +45,7 @@
                         <#case "TextArea">  <#include "/admin/form/textArea.ftl"><#break>
                         <#default>
                     </#switch>
+                    </div>
 
                 <#if (value.desc!"") != "">
                     <div class="layui-form-mid layui-word-aux">${value.desc}</div>
@@ -60,39 +61,101 @@
     </div>
 </div>
 <script>
+    //鍒濆鍖栦笂浼犳帶浠�
+    var uploadTool = {
+        callback: null,
+        chooseImage: {},
+        uploadArray: new Array(),
+        init: function (upload) {
+            this.uploadArray = new Array();
+              <#list rowsList as value>
+                  <#if value.type=='Img'&&value.params.uploadApi??>
+            this.uploadArray.push(upload.render({
+                elem: '#upload_${value.key}', //缁戝畾鍏冪礌
+                url: '${value.params.uploadApi}', //涓婁紶鎺ュ彛
+                <#if value.params.uploadApiParams??&&(value.params.uploadApiParams?size>0)>
+                data: {
+                    <#list value.params.uploadApiParams as item>
+                      "${item.key}": "${item.value}",
+                    </#list>
+                },
+                </#if>
+                auto: false,
+                accept: 'images',
+                acceptMime: 'image/*',
+                field: "file_${value.key}",
+                choose: function (obj) {
+                    //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
+                    var files = obj.pushFile();
+                    //棰勮鏈湴鏂囦欢锛屽鏋滄槸澶氭枃浠讹紝鍒欎細閬嶅巻銆�(涓嶆敮鎸乮e8/9)
+                    obj.preview(function (index, file, result) {
+                        console.log(index); //寰楀埌鏂囦欢绱㈠紩
+                        console.log(file); //寰楀埌鏂囦欢瀵硅薄
+                        console.log(result); //寰楀埌鏂囦欢base64缂栫爜锛屾瘮濡傚浘鐗�
+                        $("#img_${value.key}").attr("src", result);
+                        //璁板綍閫変腑鐨勬枃浠�
+                        uploadTool.chooseImage["${value.key}"] = "1";
+                    });
+                },
+                before: function (obj) {
+                    layer.load();
+                },
+                done: function (res, index, upload) {
+                    layer.closeAll('loading'); //鍏抽棴loading
+                    //涓婁紶瀹屾瘯鍚庡垹闄�
+                    if (res.code == 0) {
+                        //鑾峰彇閾炬帴
+                        $("input[name='${value.key}']").val(res.data.url);
+                        delete chooseImage["${value.key}"];
+                        if (Object.keys(chooseImage).length == 0) {
+                            //鍏ㄩ儴涓婁紶鎴愬姛
+                            callback();
+                        }
+                    } else {
+                        layer.msg(res.msg);
+                    }
+                },
+                error: function (index, upload) {
+                    layer.msg("${value.params.title}涓婁紶鍑洪敊");
+                    layer.closeAll('loading'); //鍏抽棴loading
+                }
+            }));
+                  </#if>
+              </#list>
 
-    layui.use(['form', 'layer', 'jquery'], function () {
+        },
+        upload: function (result) {
+            if (this.uploadArray.length > 0) {
+                this.callback = result;
+                //鍚屾椂涓婁紶
+                for (var i = 0; i < this.uploadArray.length; i++) {
+                    this.uploadArray[i].upload();
+                }
+            } else {
+                result();
+            }
+        }
+    };
+
+
+</script>
+
+<script>
+    layui.use(['form', 'layer', 'jquery', 'upload'], function () {
         $ = layui.jquery;
         var form = layui.form,
-                layer = layui.layer;
+                layer = layui.layer,
+                upload = layui.upload;
 
+        var verify = {};
+        <#list regexVerifyList as regex>
+        verify["${regex.key}"] = [/${regex.expression}/, '${regex.msg}'];
+        </#list>
         //鑷畾涔夐獙璇佽鍒�
-        form.verify({
-            username: function (value) {
-                if (value.length < 3) {
-                    return '鍚嶇О鑷冲皯寰�3涓瓧绗�';
-                }
-            },
-            code: function (value) {
-                if (value) {
-                    if (!(/^([A-Za-z0-9]|\-|_)+$/).test(value)) {
-                        return '鏍囪瘑鍙兘鍖呭惈 鏁板瓧銆佽嫳鏂囧瓧绗︺�乢 銆�-';
-                    }
-                }
-            },
-            packageName: [/^([A-Za-z0-9]|\-|_|\.)+$/, '鍖呭悕鍙兘鍖呭惈 鏁板瓧銆佽嫳鏂囧瓧绗︺�乢 銆�-銆�.'],
-            desc: function (value) {
-                if (value != null && value.length > 128) {
-                    return '绠�浠嬫渶澶т负128涓瓧绗�';
-                }
-            },
-            remarks: function (value) {
-                if (value != null && value.length > 128) {
-                    return '澶囨敞鏈�澶т负128涓瓧绗�';
-                }
-            },
+        form.verify(verify);
 
-        });
+        //娓叉煋涓婁紶鎺т欢
+        uploadTool.init(upload);
 
 
         //鐩戝惉鎻愪氦
@@ -112,69 +175,58 @@
                             data.field[onkeys[0]][onkeys[1]] = value;
                         }
                     }
-                    //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
-                    ksapp.postJSON('/admin/api/pushplatform-app/add', data.field, function (res) {
-                        if (res.code == 0) {
-                            layer.alert("澧炲姞鎴愬姛", {
-                                        icon: 6
-                                    },
-                                    function () {
-                                        //鍏抽棴褰撳墠frame
-                                        xadmin.close();
-                                        // 鍙互瀵圭埗绐楀彛杩涜鍒锋柊
-                                        // xadmin.father_reload();
-                                    });
-                        } else {
-                            layer.msg(res.msg);
-                        }
+                    uploadTool.upload(function(){
+                        //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
+                        ksapp.postJSON('${addApi}', data.field, function (res) {
+                            if (res.code == 0) {
+                                layer.alert("澧炲姞鎴愬姛", {
+                                            icon: 6
+                                        },
+                                        function () {
+                                            //鍏抽棴褰撳墠frame
+                                            xadmin.close();
+                                            // 鍙互瀵圭埗绐楀彛杩涜鍒锋柊
+                                            // xadmin.father_reload();
+                                        });
+                            } else {
+                                layer.msg(res.msg);
+                            }
 
-                    }, function (res) {
+                        }, function (res) {
+                        });
                     });
                     return false;
                 });
+        //璇锋眰select鐨勬暟鎹瓵PI
+         <#if preRequestList??&&(preRequestList?size>0)>
+             <#list preRequestList as request>
+                 <#assign  apiKeys=request.params?keys/>
+             var params = {};
+                 <#list apiKeys as key>
+             params["${key}"]=${request.params["${key}"]}
+                 </#list>
 
-    });
+         ksapp.postJSON('${request.url}', params, function (res) {
+             if (res.code == 0) {
+                 //濉厖鏁版嵁
+                 $("${request.fillTarget}").empty();
+                 for (var i = 0; i < res.data.length; i++) {
+                     var html = "<option value='" + res.data[i].key + "'>";
+                     html += res.data[i].value + "</option>";
+                     $("${request.fillTarget}").append(html);
+                 }
+                 //閲嶆柊娓叉煋琛ㄥ崟
+                 form.render();
+             } else {
+                 layer.msg(res.msg);
+             }
 
-
-
-    var app = new Vue({
-        el: '.layui-form',
-        data: {
-            appList: [],
-            platformList: [
-                {name: "灏忕背", platform: "xm"},
-                {name: "鍗庝负", platform: "hw"},
-                {name: "OPPO", platform: "oppo"},
-                {name: "VIVO", platform: "vivo"},
-                {name: "榄呮棌", platform: "mz"}
-            ]
-        },
-        created: function () {
-            this.getAppList();
-        },
-        watch: {
-            appList: function () {
-                app.render();
-            }
-
-        },
-        methods: {
-            getAppList: function () {
-                ksapp.post("/admin/api/app/list", {page: 1, limit: 100}, function (e) {
-                    if (e.code == 0) {
-                        app.appList = e.data.list;
-                    } else
-                        layer.msg(e.msg);
-                }, function (e) {
-                });
-            },
-            render: function () {
-                console.log("render")
-
-            }
-        }
-    });
-
+         }, function (res) {
+         });
+             </#list>
+         </#if>
+    })
+    ;
 </script>
 </body>
 
diff --git a/src/main/resources/generater/admin/adminController.template b/src/main/resources/generater/admin/adminController.template
index cc5ba65..f7d8311 100644
--- a/src/main/resources/generater/admin/adminController.template
+++ b/src/main/resources/generater/admin/adminController.template
@@ -1,92 +1,102 @@
 package ${packageName};
 
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Repository;
+import com.google.gson.*;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.yeshi.utils.JsonUtil;
+import org.yeshi.utils.TimeUtil;
 
-<#list importClasses as value>
-import ${value};
-</#list>
+import javax.annotation.Resource;
+import javax.servlet.http.HttpSession;
+import java.lang.reflect.Type;
+import java.util.Date;
+import java.util.List;
+import ${entity.clazz};
+import ${service.clazz};
+import ${query.clazz};
 
+@Controller
+@RequestMapping("${mapping}")
+public class AdminAppController {
 
-@Repository
-public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{
+    <#assign serviceObjName=${service.name?uncap_first}">
+    @Resource
+    private ${service.name} ${serviceObjName};
 
-  public void updateSelective(${entityClassName} bean) {
-        Query query = new Query();
-        Update update=new Update();
-        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
-        <#if columnDataList??>
-        	<#list columnDataList as value>
-        if(bean.${value.columnMehtod} != null) {
-            update.set("${value.columnName}", bean.${value.columnMehtod});
-        }
-        	</#list>
-        </#if>
-        update.set("updateTime", new Date());
-        update(query, update);
-  }
+    @ResponseBody
+    @RequestMapping("list")
+    public String list(${query.name} query, int page, int limit) {
+        List<${entityName}> list = ${serviceObjName}.list(query,page,limit);
+        long count = ${serviceObjName}.count(query);
+        JSONObject data = new JSONObject();
+        Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
 
+            @Override
+            public JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
+                return date == null ? new JsonPrimitive("") : new JsonPrimitive(TimeUtil.getGernalTime(date.getTime(), "yyyy.MM.dd HH:mm"));
+            }
+        }).create();
 
-  public List<${entityClassName}> list(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        if(daoQuery.sortList!=null&&daoQuery.sortList.size()>0){
-            query.with(new Sort(daoQuery.sortList));
-        }
-        query.skip(daoQuery.start);
-        query.limit(daoQuery.count);
-        return findList(query);
-  }
-
-  public long count(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        return count(query);
-  }
-
-    private Query getQuery(DaoQuery daoQuery){
-          List<Criteria> andList=new ArrayList<>();
-           <#list daoQueryColumnDataList as value>
-               <#if (value.type!"") == "Date">
-               if(daoQuery.min${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
-               }
-               if(daoQuery.max${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
-               }
-               <#else>
-               if(daoQuery.${value.columnName}!=null){
-                 <#if (value.queryType!"") == "equal">
-                    andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
-                 <#else>
-                      andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
-                 </#if>
-               }
-               </#if>
-          </#list>
-          Query query=new Query();
-          Criteria[]  ands=new Criteria[andList.size()];
-          andList.toArray(ands);
-          if(ands.length>0){
-              query.addCriteria(new Criteria().andOperator(ands));
-          }
-          return query;
+        data.put("list", gson.toJson(list));
+        data.put("count", count);
+        return JsonUtil.loadTrueResult(data);
     }
 
-  public static class DaoQuery{
-     <#if daoQueryColumnDataList??>
-       <#list daoQueryColumnDataList as value>
-        <#if (value.type!"") == "Date">
-        public ${value.type} min${value.columnName?cap_first};
-        public ${value.type} max${value.columnName?cap_first};
-        <#else>
-        public ${value.type} ${value.columnName};
-         </#if>
-       </#list>
-     </#if>
-        public int start;
-        public int count;
-        public List<Sort.Order> sortList;
-  }
+    @ResponseBody
+    @RequestMapping("delete")
+    public String delete(String ids) {
+        JSONArray array = JSONArray.fromObject(ids);
+        List<String> idList=new ArrayList<>();
+        for (int i = 0; i < array.size(); i++) {
+            idList.add(array.optString(i));
+        }
+        ${serviceObjName}.delete(idList);
+        return JsonUtil.loadTrueResult("");
+    }
+
+
+
+
+
+    @ResponseBody
+    @RequestMapping("add")
+    public String add(${entity.name} bean, HttpSession session) {
+        try{
+            ${serviceObjName}.add(bean);
+            return JsonUtil.loadTrueResult("");
+        }catch(Exception e){
+            return JsonUtil.loadFalseResult(e.getMessage);
+        }
+    }
+
+    @ResponseBody
+    @RequestMapping("get")
+    public String add(String id, HttpSession session) {
+        try{
+            ${serviceObjName}.get(id);
+            return JsonUtil.loadTrueResult("");
+        }catch(Exception e){
+            return JsonUtil.loadFalseResult(e.getMessage);
+        }
+    }
+
+
+    @ResponseBody
+    @RequestMapping("update")
+    public String update(${entity.name} bean, HttpSession session) {
+        if (app.getId() == null) {
+            return JsonUtil.loadFalseResult("ID涓嶈兘涓虹┖");
+        }
+        try{
+            ${serviceObjName}.updateSelective(bean);
+        }catch(Exception e){
+            return JsonUtil.loadFalseResult(e.getMessage);
+        }
+        return JsonUtil.loadTrueResult("");
+    }
+
+
 }
diff --git a/src/main/resources/generater/admin/form/checkBox.ftl b/src/main/resources/generater/admin/form/checkBox.ftl
index 6e2431d..12488e2 100644
--- a/src/main/resources/generater/admin/form/checkBox.ftl
+++ b/src/main/resources/generater/admin/form/checkBox.ftl
@@ -1,3 +1 @@
-                       <div class="layui-input-block">
-                            <input type="checkbox" name="${value.key}" title="鍐欎綔">
-                        </div>
\ No newline at end of file
+                            <input type="checkbox" name="${value.key}" title="${value.value}">
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/form/img.ftl b/src/main/resources/generater/admin/form/img.ftl
index 17ddfea..4bedf20 100644
--- a/src/main/resources/generater/admin/form/img.ftl
+++ b/src/main/resources/generater/admin/form/img.ftl
@@ -1,6 +1,7 @@
-                    <div class="layui-input-inline">
-                        <select id="L_appCode" name="appCode" lay-verify="required" lay-search="">
-                            <option value="">鐩存帴閫夋嫨鎴栨悳绱㈠簲鐢�</option>
-                            <option v-for="item in appList" :value="item.appCode">{{item.name}}</option>
-                        </select>
-                    </div>
+                        <#if value.params.uploadApi??&&value.params.uploadApi!="">
+                        <img id="img_${value.key}" style="display: block;margin-bottom: 10px;  <#if value.params.width gt 0 > width:${value.params.width}px;</#if> <#if value.params.height gt 0 > height:${value.params.height}px;</#if> " />
+                        <button type="button" class="layui-btn" id="upload_${value.key}" style="margin-bottom: 5px">
+                            <i class="layui-icon">&#xe67c;</i>涓婁紶鍥剧墖
+                        </button>
+                        </#if>
+                        <input  class="layui-input" type="text" name="${value.key}" placeholder="璇疯緭鍏ュ浘鐗囬摼鎺�">
diff --git a/src/main/resources/generater/admin/form/password.ftl b/src/main/resources/generater/admin/form/password.ftl
index 32a20b6..e3ba56f 100644
--- a/src/main/resources/generater/admin/form/password.ftl
+++ b/src/main/resources/generater/admin/form/password.ftl
@@ -1,4 +1,2 @@
-                    <div class="layui-input-inline">
                         <input type="password" name="${value.key}" required lay-verify="required" placeholder="璇疯緭鍏ュ瘑鐮�" autocomplete="off"
-                               class="layui-input">
-                    </div>
\ No newline at end of file
+                               class="layui-input">
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/form/radioGroup.ftl b/src/main/resources/generater/admin/form/radioGroup.ftl
index 7f117a7..f37a654 100644
--- a/src/main/resources/generater/admin/form/radioGroup.ftl
+++ b/src/main/resources/generater/admin/form/radioGroup.ftl
@@ -1,5 +1,3 @@
-                    <div class="layui-input-block">
                             <#list value.params.values as item >
-                                <input type="radio" name="${value.key}" value="${item.key}" title="${item.value}">
-                            </#list>
-                    </div>
\ No newline at end of file
+                                <input type="radio" required name="${value.key}" value="${item.key}" title="${item.value}">
+                            </#list>
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/form/select.ftl b/src/main/resources/generater/admin/form/select.ftl
index 70cbb86..0f963ec 100644
--- a/src/main/resources/generater/admin/form/select.ftl
+++ b/src/main/resources/generater/admin/form/select.ftl
@@ -1,9 +1,7 @@
-                    <div class="layui-input-block">
                         <select name="${value.key}" lay-verify="required">
                                 <#if value.params.values??&&(value.params.values?size>0)>
                                     <#list value.params.values as item>
                                       <option value="${item.key}">${item.value}</option>
                                     </#list>
                                 </#if>
-                        </select>
-                    </div>
\ No newline at end of file
+                        </select>
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/form/switch.ftl b/src/main/resources/generater/admin/form/switch.ftl
index 8c3bde9..94a7b76 100644
--- a/src/main/resources/generater/admin/form/switch.ftl
+++ b/src/main/resources/generater/admin/form/switch.ftl
@@ -1,3 +1 @@
-                    <div class="layui-input-block">
-                        <input type="checkbox" name="${value.key}" lay-skin="switch">
-                    </div>
\ No newline at end of file
+                        <input type="checkbox" name="${value.key}" lay-skin="switch">
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/form/text.ftl b/src/main/resources/generater/admin/form/text.ftl
index 39a4952..e1dba14 100644
--- a/src/main/resources/generater/admin/form/text.ftl
+++ b/src/main/resources/generater/admin/form/text.ftl
@@ -1,4 +1,2 @@
-                    <div class="layui-input-block">
-                        <input type="text" name="${value.key}" required lay-verify="required" placeholder="${value.params.placeHolder}" autocomplete="off"
+                        <input type="text" name="${value.key}" <#if value.params.verifyValue??> lay-verify="${value.params.verifyValue}" </#if> placeholder="${value.params.placeHolder}" autocomplete="off"
                                class="layui-input">
-                    </div>
diff --git a/src/main/resources/generater/admin/form/textArea.ftl b/src/main/resources/generater/admin/form/textArea.ftl
index 762d552..73f0602 100644
--- a/src/main/resources/generater/admin/form/textArea.ftl
+++ b/src/main/resources/generater/admin/form/textArea.ftl
@@ -1,3 +1 @@
-                    <div class="layui-input-block">
-                        <textarea name="${value.key}" placeholder="${value.params.placeHolder}" class="layui-textarea"></textarea>
-                    </div>
\ No newline at end of file
+                        <textarea name="${value.key}" placeholder="${value.params.placeHolder}" class="layui-textarea"></textarea>
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/list.flt b/src/main/resources/generater/admin/list.flt
deleted file mode 100644
index cc5ba65..0000000
--- a/src/main/resources/generater/admin/list.flt
+++ /dev/null
@@ -1,92 +0,0 @@
-package ${packageName};
-
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Repository;
-
-<#list importClasses as value>
-import ${value};
-</#list>
-
-
-@Repository
-public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{
-
-  public void updateSelective(${entityClassName} bean) {
-        Query query = new Query();
-        Update update=new Update();
-        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
-        <#if columnDataList??>
-        	<#list columnDataList as value>
-        if(bean.${value.columnMehtod} != null) {
-            update.set("${value.columnName}", bean.${value.columnMehtod});
-        }
-        	</#list>
-        </#if>
-        update.set("updateTime", new Date());
-        update(query, update);
-  }
-
-
-  public List<${entityClassName}> list(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        if(daoQuery.sortList!=null&&daoQuery.sortList.size()>0){
-            query.with(new Sort(daoQuery.sortList));
-        }
-        query.skip(daoQuery.start);
-        query.limit(daoQuery.count);
-        return findList(query);
-  }
-
-  public long count(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        return count(query);
-  }
-
-    private Query getQuery(DaoQuery daoQuery){
-          List<Criteria> andList=new ArrayList<>();
-           <#list daoQueryColumnDataList as value>
-               <#if (value.type!"") == "Date">
-               if(daoQuery.min${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
-               }
-               if(daoQuery.max${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
-               }
-               <#else>
-               if(daoQuery.${value.columnName}!=null){
-                 <#if (value.queryType!"") == "equal">
-                    andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
-                 <#else>
-                      andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
-                 </#if>
-               }
-               </#if>
-          </#list>
-          Query query=new Query();
-          Criteria[]  ands=new Criteria[andList.size()];
-          andList.toArray(ands);
-          if(ands.length>0){
-              query.addCriteria(new Criteria().andOperator(ands));
-          }
-          return query;
-    }
-
-  public static class DaoQuery{
-     <#if daoQueryColumnDataList??>
-       <#list daoQueryColumnDataList as value>
-        <#if (value.type!"") == "Date">
-        public ${value.type} min${value.columnName?cap_first};
-        public ${value.type} max${value.columnName?cap_first};
-        <#else>
-        public ${value.type} ${value.columnName};
-         </#if>
-       </#list>
-     </#if>
-        public int start;
-        public int count;
-        public List<Sort.Order> sortList;
-  }
-}
diff --git a/src/main/resources/generater/admin/list.ftl b/src/main/resources/generater/admin/list.ftl
new file mode 100644
index 0000000..1d4e22d
--- /dev/null
+++ b/src/main/resources/generater/admin/list.ftl
@@ -0,0 +1,330 @@
+<!DOCTYPE html>
+<html class="x-admin-sm">
+
+<head>
+    <meta charset="UTF-8">
+    <title>${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,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
+    <link rel="stylesheet" href="./css/font.css">
+    <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 type="text/javascript" src="./js/xadmin.js"></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>
+    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
+    <![endif]-->
+    <script src="./js/utils.js"></script>
+</head>
+
+<body>
+<div class="x-nav">
+            <span class="layui-breadcrumb">
+                <a href="">###</a>
+                <a>
+                    <cite>###</cite></a>
+            </span>
+    <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right"
+       onclick="location.reload()" title="鍒锋柊">
+        <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i>
+    </a>
+</div>
+<div class="layui-fluid" id="app">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body">
+                    <form class="layui-form layui-col-space5">
+                        <#list rowsList as value>
+                        <div class="layui-inline layui-show-xs-block">
+                            <#switch value.type>
+                            <#case "CheckBox"><#include "/admin/form/checkBox.ftl" ><#break>
+                            <#case "Img">  <#include "/admin/form/img.ftl"><#break>
+                            <#case "Password">  <#include "/admin/form/password.ftl"><#break>
+                            <#case "RadioGroup">  <#include "/admin/form/radioGroup.ftl"><#break>
+                            <#case "Select">  <#include "/admin/form/select.ftl"><#break>
+                            <#case "Switch">  <#include "/admin/form/switch.ftl"><#break>
+                            <#case "Text">  <#include "/admin/form/text.ftl"><#break>
+                            <#case "TextArea">  <#include "/admin/form/textArea.ftl"><#break>
+                            <#default>
+                            </#switch>
+                        </div>
+                        </#list>
+                        <div class="layui-inline layui-show-xs-block">
+                            <button id="search" class="layui-btn" lay-submit="" lay-filter="sreach">
+                                <i class="layui-icon">&#xe615;</i></button>
+                        </div>
+                    </form>
+                </div>
+                <div class="layui-card-body ">
+                    <table class="layui-table" id="table_list" lay-filter="app">
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn" onclick="xadmin.open('娣诲姞${title}','${addPagePath}',500,580)"><i
+                class="layui-icon">顦�</i>娣诲姞
+        </button>
+
+        <button class="layui-btn layui-btn-danger" lay-event="delete">
+            <i class="layui-icon">&#xe640;</i>
+            鍒犻櫎
+        </button>
+    </div>
+</script>
+
+<script type="text/html" id="deleteContainer">
+    <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>-->
+
+        <a title="鍒犻櫎" onclick="member_del(this,{{d.LAY_INDEX }},'{{d.id}}')" href="javascript:;">
+            <i class="layui-icon">&#xe640;</i>
+        </a>
+    </div>
+</script>
+
+<script type="text/html" id="statusContainer">
+    <div class="layui-btn-container">
+        {{# if(d.status==0){ }}
+        <span class="layui-btn layui-btn-mini">
+            姝e父
+        </span>
+        {{# }else{ }}
+        <span class="layui-btn layui-btn-danger layui-btn-mini">
+             宸插垹闄�
+        </span>
+        {{# } }}
+    </div>
+</script>
+
+<script type="text/html" id="switchTpl">
+    <!-- 杩欓噷鐨刢hecked鐨勭姸鎬佸彧鏄紨绀� -->
+    <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="濂硘鐢�" lay-filter="sexDemo" {{ d.id==
+           10003 ? 'checked': ''}} >
+</script>
+
+<script>
+
+    function member_del(obj, index, id) {
+        layer.confirm('纭瑕佸垹闄ゅ悧锛�', function (index) {
+            //鍙戝紓姝ュ垹闄ゆ暟鎹�
+            app.delete(obj, index, id);
+        });
+    }
+
+</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",
+            data: {
+                key: '',
+                start: '',
+                end: '',
+                appList: []
+            },
+            watch: {},
+            created: function () {
+
+            },
+            methods: {
+                init: function () {
+                    //鍒濆鍖�
+                    layui.use(['laydate', 'form', 'table'], function () {
+                        var laydate = layui.laydate,
+                                form = layui.form,
+                                table = layui.table;
+                        //娓叉煋鏃ユ湡杈撳叆妗�
+                                <#list searchForm as row >
+                                    <#if row.type??&&row.type=="Text"&&(row.params.type=="date")>
+                                laydate.render({
+                                    elem: "intput[name=${row.key}]" //鎸囧畾鍏冪礌
+                                });
+                                    </#if>
+                                </#list>
+                        //鎼滅储鏉′欢
+                        form.on('submit(search)', function (data) {
+                            app.search(data.field);
+                            return false;
+                        });
+
+                        tableIns = table.render({
+                            elem: '#table_list',
+                            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'}],
+                            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瀽鏁版嵁鍒楄〃
+                                };
+                            }
+                            //,鈥︹�� //鍏朵粬鍙傛暟
+                        });
+
+                        //澶村伐鍏锋爮浜嬩欢
+                        tableIns.on('toolbar(app)',
+                                function (obj) {
+                                    var checkStatus = table.checkStatus(obj.config.id);
+                                    switch (obj.event) {
+                                        case 'delete':
+                                            var data = checkStatus.data;
+                                            if (data == null || data.length == 0) {
+                                                layer.msg("鏈�夋嫨閫夐」");
+                                                return;
+                                            }
+                                            var ids = new Array();
+                                            for (var i = 0; i < data.length; i++)
+                                                ids.push(data[i].id);
+                                            layer.confirm('纭瑕佸垹闄ゅ悧锛�', function (index) {
+                                                //鍙戝紓姝ュ垹闄ゆ暟鎹�
+                                                app.deleteList(ids, function () {
+                                                    layer.msg("鍒犻櫎鎴愬姛");
+                                                    $("form").submit();
+                                                });
+                                            });
+
+                                            break;
+                                    }
+                                    ;
+                                });
+                        //璇锋眰鎼滅储琛ㄥ崟涓渶瑕佺殑鏁版嵁
+                         <#if preRequestList??&&(preRequestList?size>0)>
+
+                             var requestCount = 0;
+                             <#list preRequestList as request>
+                             requestCount++;
+                                 <#assign  apiKeys=request.params?keys/>
+                             var params = {};
+                                 <#list apiKeys as key>
+                             params["${key}"]=${request.params["${key}"]}
+                                 </#list>
+
+                         ksapp.postJSON('${request.url}', params, function (res) {
+                             if (res.code == 0) {
+                                 //濉厖鏁版嵁
+                                 $("${request.fillTarget}").empty();
+                                 for (var i = 0; i < res.data.length; i++) {
+                                     var html = "<option value='" + res.data[i].key + "'>";
+                                     html += res.data[i].value + "</option>";
+                                     $("${request.fillTarget}").append(html);
+                                 }
+                                 //閲嶆柊娓叉煋琛ㄥ崟
+                                 form.render();
+
+                                 requestCount--;
+                                 if (requestCount <= 0) {
+                                     //鎼滅储
+                                     $('#search').trigger("click");
+                                 }
+                             } else {
+                                 layer.msg(res.msg);
+                             }
+
+                         }, function (res) {
+                         });
+                             </#list>
+                         <#else>
+                          $('#search').trigger("click");
+                         </#if>
+                    });
+
+                },
+                delete: function (obj, index, id) {
+                    var ids = new Array();
+                    ids.push(id);
+                    app.deleteList(ids, function () {
+                        $(obj).parents("tr").remove();
+                        layer.msg('宸插垹闄�!', {icon: 1, time: 1000});
+                    });
+                },
+                deleteList: function (ids, success) {
+                    ksapp.post("${deleteApi}", {ids: JSON.stringify(ids)}, function (e) {
+                        if (e.code == 0) {
+                            success();
+                        } else {
+                            layer.msg(e.msg);
+                        }
+                    }, function (e) {
+                    });
+                },
+                search: function (params) {
+                    //鏁版嵁閲嶈浇
+                    tableIns.reload({
+                        where: params,
+                        page: {
+                            curr: 1 //閲嶆柊浠庣 1 椤靛紑濮�
+                        }
+                    });
+                },
+            }
+        }
+    })
+    ;
+    }
+    )
+    ;
+
+</script>
+
+<script>
+
+</script>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/generater/admin/update.ftl b/src/main/resources/generater/admin/update.ftl
index cc5ba65..3a33b09 100644
--- a/src/main/resources/generater/admin/update.ftl
+++ b/src/main/resources/generater/admin/update.ftl
@@ -1,92 +1,272 @@
-package ${packageName};
+<!DOCTYPE html>
+<html class="x-admin-sm">
 
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Repository;
+<head>
+    <meta charset="UTF-8">
+    <title>${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,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
+    <link rel="stylesheet" href="./css/font.css">
+    <link rel="stylesheet" href="./css/xadmin.css">
+    <script type="text/javascript" src="./lib/layui/layui.js" charset="utf-8"></script>
+    <script type="text/javascript" src="./js/xadmin.js"></script>
+    <script src="js/vue.min.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>
+    <!-- 璁㊣E8/9鏀寔濯掍綋鏌ヨ锛屼粠鑰屽吋瀹规爡鏍� -->
+    <!--[if lt IE 9]>
+    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
+    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
+    <![endif]-->
+</head>
+<body>
+<div class="layui-fluid">
+    <div class="layui-row">
+        <form class="layui-form" lay-filter="add">
 
-<#list importClasses as value>
-import ${value};
-</#list>
+            <#list rowsList as value>
+                <div class="layui-form-item">
+                    <label for="L_appCode" class="layui-form-label">
+                        <#if value.params.require??&&value.params.require>
+                           <span class="x-red">*</span>
+                        </#if>
+                        ${value.params.title}</label>
+                    <div class="layui-input-block">
+                    <#switch value.type>
+                        <#case "CheckBox"><#include "/admin/form/checkBox.ftl" ><#break>
+                        <#case "Img">  <#include "/admin/form/img.ftl"><#break>
+                        <#case "Password">  <#include "/admin/form/password.ftl"><#break>
+                        <#case "RadioGroup">  <#include "/admin/form/radioGroup.ftl"><#break>
+                        <#case "Select">  <#include "/admin/form/select.ftl"><#break>
+                        <#case "Switch">  <#include "/admin/form/switch.ftl"><#break>
+                        <#case "Text">  <#include "/admin/form/text.ftl"><#break>
+                        <#case "TextArea">  <#include "/admin/form/textArea.ftl"><#break>
+                        <#default>
+                    </#switch>
+                    </div>
 
+                <#if (value.desc!"") != "">
+                    <div class="layui-form-mid layui-word-aux">${value.desc}</div>
+                </#if>
+                </div>
+            </#list>
 
-@Repository
-public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{
+            <div class="layui-form-item">
+                <label for="L_remarks" class="layui-form-label"></label>
+                <button class="layui-btn" lay-filter="add" lay-submit="">纭畾淇敼</button>
+            </div>
+        </form>
+    </div>
+</div>
+<script>
+    //鍒濆鍖栦笂浼犳帶浠�
+    var uploadTool = {
+        callback: null,
+        chooseImage: {},
+        uploadArray: new Array(),
+        init: function (upload) {
+            this.uploadArray = new Array();
+              <#list rowsList as value>
+                  <#if value.type=='Img'&&value.params.uploadApi??>
+            this.uploadArray.push(upload.render({
+                elem: '#upload_${value.key}', //缁戝畾鍏冪礌
+                url: '${value.params.uploadApi}', //涓婁紶鎺ュ彛
+                <#if value.params.uploadApiParams??&&(value.params.uploadApiParams?size>0)>
+                data: {
+                    <#list value.params.uploadApiParams as item>
+                      "${item.key}": "${item.value}",
+                    </#list>
+                },
+                </#if>
+                auto: false,
+                accept: 'images',
+                acceptMime: 'image/*',
+                field: "file_${value.key}",
+                choose: function (obj) {
+                    //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
+                    var files = obj.pushFile();
+                    //棰勮鏈湴鏂囦欢锛屽鏋滄槸澶氭枃浠讹紝鍒欎細閬嶅巻銆�(涓嶆敮鎸乮e8/9)
+                    obj.preview(function (index, file, result) {
+                        console.log(index); //寰楀埌鏂囦欢绱㈠紩
+                        console.log(file); //寰楀埌鏂囦欢瀵硅薄
+                        console.log(result); //寰楀埌鏂囦欢base64缂栫爜锛屾瘮濡傚浘鐗�
+                        $("#img_${value.key}").attr("src", result);
+                        //璁板綍閫変腑鐨勬枃浠�
+                        uploadTool.chooseImage["${value.key}"] = "1";
+                    });
+                },
+                before: function (obj) {
+                    layer.load();
+                },
+                done: function (res, index, upload) {
+                    layer.closeAll('loading'); //鍏抽棴loading
+                    //涓婁紶瀹屾瘯鍚庡垹闄�
+                    if (res.code == 0) {
+                        //鑾峰彇閾炬帴
+                        $("input[name='${value.key}']").val(res.data.url);
+                        delete chooseImage["${value.key}"];
+                        if (Object.keys(chooseImage).length == 0) {
+                            //鍏ㄩ儴涓婁紶鎴愬姛
+                            callback();
+                        }
+                    } else {
+                        layer.msg(res.msg);
+                    }
+                },
+                error: function (index, upload) {
+                    layer.msg("${value.params.title}涓婁紶鍑洪敊");
+                    layer.closeAll('loading'); //鍏抽棴loading
+                }
+            }));
+                  </#if>
+              </#list>
 
-  public void updateSelective(${entityClassName} bean) {
-        Query query = new Query();
-        Update update=new Update();
-        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
-        <#if columnDataList??>
-        	<#list columnDataList as value>
-        if(bean.${value.columnMehtod} != null) {
-            update.set("${value.columnName}", bean.${value.columnMehtod});
+        },
+        upload: function (result) {
+            if (this.uploadArray.length > 0) {
+                this.callback = result;
+                //鍚屾椂涓婁紶
+                for (var i = 0; i < this.uploadArray.length; i++) {
+                    this.uploadArray[i].upload();
+                }
+            } else {
+                result();
+            }
         }
-        	</#list>
-        </#if>
-        update.set("updateTime", new Date());
-        update(query, update);
-  }
+    };
 
 
-  public List<${entityClassName}> list(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        if(daoQuery.sortList!=null&&daoQuery.sortList.size()>0){
-            query.with(new Sort(daoQuery.sortList));
+</script>
+
+<script>
+    //濉厖鏁版嵁
+    function fillData(form) {
+        var id = ksapp.getQueryParam("id");
+        if (id) {
+        } else {
+            layer.msg("id涓虹┖");
+            return;
         }
-        query.skip(daoQuery.start);
-        query.limit(daoQuery.count);
-        return findList(query);
-  }
 
-  public long count(DaoQuery daoQuery){
-        Query query=getQuery(daoQuery);
-        return count(query);
-  }
-
-    private Query getQuery(DaoQuery daoQuery){
-          List<Criteria> andList=new ArrayList<>();
-           <#list daoQueryColumnDataList as value>
-               <#if (value.type!"") == "Date">
-               if(daoQuery.min${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
-               }
-               if(daoQuery.max${value.columnName?cap_first}!=null){
-                    andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
-               }
-               <#else>
-               if(daoQuery.${value.columnName}!=null){
-                 <#if (value.queryType!"") == "equal">
-                    andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
-                 <#else>
-                      andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
-                 </#if>
-               }
-               </#if>
-          </#list>
-          Query query=new Query();
-          Criteria[]  ands=new Criteria[andList.size()];
-          andList.toArray(ands);
-          if(ands.length>0){
-              query.addCriteria(new Criteria().andOperator(ands));
-          }
-          return query;
+        ksapp.postJSON('${detailApi}', {id: id}, function (res) {
+            if (res.code == 0) {
+                form.data(res.data);
+            } else {
+                layer.msg(res.msg);
+            }
+        }, function (res) {
+            layer.msg("璇︽儏鑾峰彇澶辫触");
+        });
     }
+</script>
 
-  public static class DaoQuery{
-     <#if daoQueryColumnDataList??>
-       <#list daoQueryColumnDataList as value>
-        <#if (value.type!"") == "Date">
-        public ${value.type} min${value.columnName?cap_first};
-        public ${value.type} max${value.columnName?cap_first};
-        <#else>
-        public ${value.type} ${value.columnName};
+<script>
+    layui.use(['form', 'layer', 'jquery', 'upload'], function () {
+        $ = layui.jquery;
+        var form = layui.form,
+                layer = layui.layer,
+                upload = layui.upload;
+
+        var verify = {};
+        <#list regexVerifyList as regex>
+        verify["${regex.key}"] = [/${regex.expression}/, '${regex.msg}'];
+        </#list>
+        //鑷畾涔夐獙璇佽鍒�
+        form.verify(verify);
+
+        //娓叉煋涓婁紶鎺т欢
+        uploadTool.init(upload);
+
+        //濉厖琛ㄥ崟鏁版嵁
+        //璇锋眰鏁版嵁
+        //form.data();
+
+
+        //鐩戝惉鎻愪氦
+        form.on('submit(add)',
+                function (data) {
+                    console.log(data.field);
+                    //杞崲json瀵硅薄
+                    for (key in data.field) {
+                        if (key.indexOf(".") > -1) {
+                            var value = data.field[key];
+                            delete data.field[key];
+                            var onkeys = key.split(".");
+                            //鍒涘缓瀵硅薄
+                            if (data.field[onkeys[0]] == undefined) {
+                                data.field[onkeys[0]] = {};
+                            }
+                            data.field[onkeys[0]][onkeys[1]] = value;
+                        }
+                    }
+                    uploadTool.upload(function () {
+                        //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
+                        var params = data.field;
+                        params.id = ksapp.getQueryParam("id");
+
+                        ksapp.postJSON('${updateApi}', data.field, function (res) {
+                            if (res.code == 0) {
+                                layer.alert("澧炲姞鎴愬姛", {
+                                            icon: 6
+                                        },
+                                        function () {
+                                            //鍏抽棴褰撳墠frame
+                                            xadmin.close();
+                                            // 鍙互瀵圭埗绐楀彛杩涜鍒锋柊
+                                            // xadmin.father_reload();
+                                        });
+                            } else {
+                                layer.msg(res.msg);
+                            }
+
+                        }, function (res) {
+                        });
+                    });
+                    return false;
+                });
+        //璇锋眰select鐨勬暟鎹瓵PI
+
+         <#if preRequestList??&&(preRequestList?size>0)>
+             var preRequestCount = ${preRequestList?size}
+             <#list preRequestList as request>
+                 <#assign  apiKeys=request.params?keys/>
+             var params = {};
+                 <#list apiKeys as key>
+             params["${key}"]=${request.params["${key}"]}
+                 </#list>
+
+         ksapp.postJSON('${request.url}', params, function (res) {
+             if (res.code == 0) {
+                 //濉厖鏁版嵁
+                 $("${request.fillTarget}").empty();
+                 for (var i = 0; i < res.data.length; i++) {
+                     var html = "<option value='" + res.data[i].key + "'>";
+                     html += res.data[i].value + "</option>";
+                     $("${request.fillTarget}").append(html);
+                 }
+                 //閲嶆柊娓叉煋琛ㄥ崟
+                 form.render();
+                 preRequestCount--;
+                 if (preRequestCount <= 0) {
+                     //寮�濮嬪~鍏呮暟鎹�
+                     fillData(form)
+                 }
+
+             } else {
+                 layer.msg(res.msg);
+             }
+
+         }, function (res) {
+         });
+             </#list>
+         <#else>
+         fillData(form)
          </#if>
-       </#list>
-     </#if>
-        public int start;
-        public int count;
-        public List<Sort.Order> sortList;
-  }
-}
+    })
+    ;
+</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/resources/generater/service.template b/src/main/resources/generater/service.template
deleted file mode 100644
index 88774a6..0000000
--- a/src/main/resources/generater/service.template
+++ /dev/null
@@ -1,7 +0,0 @@
-package ${packageName};
-
-import ${entityClass};
-
-public interface ${serviceClassName} {
-
-}
diff --git a/src/main/resources/generater/service/method/add.template b/src/main/resources/generater/service/method/add.template
new file mode 100644
index 0000000..a34478d
--- /dev/null
+++ b/src/main/resources/generater/service/method/add.template
@@ -0,0 +1,4 @@
+//鏌ヨ涓婚敭ID鏄惁瀛樺湪
+ dao.find(if(${entity.name}.getId()))
+
+
diff --git a/src/main/resources/generater/service/method/count.template b/src/main/resources/generater/service/method/count.template
new file mode 100644
index 0000000..fd83e79
--- /dev/null
+++ b/src/main/resources/generater/service/method/count.template
@@ -0,0 +1,14 @@
+package ${packageName};
+
+import ${entityClass};
+
+
+public interface ${serviceClassName} {
+
+<#list metodInfoList as method>
+    ${method.note}
+    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
+
+</#list>
+
+}
diff --git a/src/main/resources/generater/service/method/delete.template b/src/main/resources/generater/service/method/delete.template
new file mode 100644
index 0000000..fd83e79
--- /dev/null
+++ b/src/main/resources/generater/service/method/delete.template
@@ -0,0 +1,14 @@
+package ${packageName};
+
+import ${entityClass};
+
+
+public interface ${serviceClassName} {
+
+<#list metodInfoList as method>
+    ${method.note}
+    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
+
+</#list>
+
+}
diff --git a/src/main/resources/generater/service/method/list.template b/src/main/resources/generater/service/method/list.template
new file mode 100644
index 0000000..fd83e79
--- /dev/null
+++ b/src/main/resources/generater/service/method/list.template
@@ -0,0 +1,14 @@
+package ${packageName};
+
+import ${entityClass};
+
+
+public interface ${serviceClassName} {
+
+<#list metodInfoList as method>
+    ${method.note}
+    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
+
+</#list>
+
+}
diff --git a/src/main/resources/generater/service/method/save.template b/src/main/resources/generater/service/method/save.template
new file mode 100644
index 0000000..85f8420
--- /dev/null
+++ b/src/main/resources/generater/service/method/save.template
@@ -0,0 +1,6 @@
+  if(entity.getUpdateTime()==null){
+    entity.setUpdateTime(new Date());
+  }
+  dao.save(entity);
+
+
diff --git a/src/main/resources/generater/service/method/selectByPrimaryKey.template b/src/main/resources/generater/service/method/selectByPrimaryKey.template
new file mode 100644
index 0000000..870c88d
--- /dev/null
+++ b/src/main/resources/generater/service/method/selectByPrimaryKey.template
@@ -0,0 +1,4 @@
+return dao.selectByPrimaryKey(id);
+
+
+
diff --git a/src/main/resources/generater/service/method/updateSlective.template b/src/main/resources/generater/service/method/updateSlective.template
new file mode 100644
index 0000000..03b06a9
--- /dev/null
+++ b/src/main/resources/generater/service/method/updateSlective.template
@@ -0,0 +1,2 @@
+entity.setUpdateTime(new Date());
+dao.updateSelective(entity);
\ No newline at end of file
diff --git a/src/main/resources/generater/service/queryVO.ftl b/src/main/resources/generater/service/queryVO.ftl
new file mode 100644
index 0000000..77045ac
--- /dev/null
+++ b/src/main/resources/generater/service/queryVO.ftl
@@ -0,0 +1,17 @@
+package ${packageName};
+
+public class ${className} {
+
+    //鎼滅储鍏抽敭璇�
+    private String kw;
+
+    private String getKw(){
+        return kw;
+    }
+
+    private void setKw(String kw){
+        this.kw=kw;
+    }
+
+
+}
diff --git a/src/main/resources/generater/service/service.template b/src/main/resources/generater/service/service.template
new file mode 100644
index 0000000..c7e793d
--- /dev/null
+++ b/src/main/resources/generater/service/service.template
@@ -0,0 +1,14 @@
+package ${packageName};
+
+import ${service.clazz};
+
+
+public interface ${service.name} {
+
+<#list metodInfoList as method>
+    ${method.note}
+    ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params});
+
+</#list>
+
+}
diff --git a/src/main/resources/generater/service/serviceImpl.template b/src/main/resources/generater/service/serviceImpl.template
new file mode 100644
index 0000000..6d080bb
--- /dev/null
+++ b/src/main/resources/generater/service/serviceImpl.template
@@ -0,0 +1,23 @@
+package ${packageName};
+
+import ${entity.clazz};
+import ${dao.clazz};
+import ${service.clazz};
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
+import java.util.Date;
+
+@Service
+public class ${service.name}Impl implements ${service.name}{
+
+  @Resource
+  private ${dao.name} ${dao.name?uncap_first};
+
+  <#list metodInfoList as method>
+  ${method.note}
+  ${method.visiteAccess} ${method.returnType} ${method.name}(${method.params}){
+  ${method.content}
+  }
+  </#list>
+
+}
\ No newline at end of file
diff --git a/src/main/resources/generater/serviceImpl.template b/src/main/resources/generater/serviceImpl.template
deleted file mode 100644
index 4705d93..0000000
--- a/src/main/resources/generater/serviceImpl.template
+++ /dev/null
@@ -1,16 +0,0 @@
-package ${packageName};
-
-import ${entityClass};
-import ${daoClass};
-import ${serviceClass};
-import javax.annotation.Resource;
-import org.springframework.stereotype.Service;
-import java.util.Date;
-
-@Service
-public class ${serviceClassName}Impl implements ${serviceClassName}{
-
-  @Resource
-  private ${daoClassName} ${daoClassCaseName};
-
-}
\ No newline at end of file
diff --git a/src/test/java/com/generater/GeneratorTest.java b/src/test/java/com/generater/GeneratorTest.java
index 818a88f..a3af2b0 100644
--- a/src/test/java/com/generater/GeneratorTest.java
+++ b/src/test/java/com/generater/GeneratorTest.java
@@ -4,6 +4,7 @@
 import freemarker.template.Template;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.annotation.Transient;
+import org.yeshi.utils.FileUtil;
 import org.yeshi.utils.FreemarkerUtils;
 import org.yeshi.utils.generater.SpringComponentGenerater;
 import org.yeshi.utils.generater.annotation.admin.form.CheckBox;
@@ -15,6 +16,8 @@
 import org.yeshi.utils.generater.mybatis.Column;
 import org.yeshi.utils.generater.mybatis.MyBatisMapperUtil;
 import org.yeshi.utils.generater.mybatis.Table;
+import org.yeshi.utils.generater.vo.admin.FormAddInfoVO;
+import org.yeshi.utils.generater.vo.admin.FormUpdateInfoVO;
 
 import java.io.File;
 import java.io.InputStream;
@@ -60,24 +63,23 @@
                 "admin/form/switch.ftl",
                 "admin/form/text.ftl",
                 "admin/form/textArea.ftl",
-                "admin/add.ftl"
+                "admin/add.ftl",
+                "admin/update.ftl",
+                "admin/list.ftl"
         };
 
         Map<String, InputStream> map = new HashMap<>();
         for (String st : template) {
             map.put(st, SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/" + st));
         }
-
-        String result = FreemarkerUtils.generateInputStream(info, "admin/add.ftl", map);
+        String result = FreemarkerUtils.generateInputStream(new FormUpdateInfoVO.Builder().setAdminInfo(info).build(), "admin/update.ftl", map);
+        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), "C:\\Users\\Administrator\\Documents\\HBuilderProjects\\LayuiTest\\form.html");
 
 
         System.out.println(result);
-
-
         //
 //        boolean match = Pattern.matches("^(https://){1}.*(\\.m3u8)$", "https://n1.szjal.cn/20210805/qnDXhXBa/index.m3u8123");
 //        System.out.println(match);
-
     }
 
 
diff --git a/src/test/java/com/generater/TestEntity.java b/src/test/java/com/generater/TestEntity.java
index 0d6211b..deeefd4 100644
--- a/src/test/java/com/generater/TestEntity.java
+++ b/src/test/java/com/generater/TestEntity.java
@@ -23,26 +23,26 @@
 
     @DaoQueryCondition(queryType = DaoQueryCondition.QueryType.contains)
     @Show(order = 0, title = "鏄电О")
-    @Text(title = "鏄电О", maxLength = 50, require = true, placeHolder = "璇疯緭鍏ユ樀绉�", desc = "鏄电О涓嶈兘鍖呭惈鐗规畩瀛楃", verifyType = FormVerifyType.regex, verifyValue = "^.{0-100}$", verifyNotifyMsg = "璇疯緭鍏ユ纭殑鏄电О")
+    @Text(title = "鏄电О", maxLength = 50, require = true, placeHolder = "璇疯緭鍏ユ樀绉�", desc = "鏄电О涓嶈兘鍖呭惈鐗规畩瀛楃", verifyType = FormVerifyType.none, verifyValue = "^.{0-100}$", verifyNotifyMsg = "璇疯緭鍏ユ纭殑鏄电О")
     private String nickName;
 
     @DaoQueryCondition
     @Show(order = 1, title = "绫诲瀷")
-    @Select(values = {"1,鐢�", "2,濂�"}, title = "绫诲瀷")
+    @Select(values = {"1:鐢�", "2:濂�"}, title = "绫诲瀷")
     private int type;
 
     @DaoQueryCondition
     @Show(order = 2, title = "鎬у埆")
-    @RadioGroup(values = {"1,鐢�", "2,濂�"}, title = "鎬у埆")
+    @RadioGroup(values = {"1:鐢�", "2:濂�"}, title = "鎬у埆")
     private int sex;
 
     @Show(order = 3, title = "澶村儚", showType = Show.ShowType.IMG, imgWidth = 50, imgHeight = 50)
-    @Img(width = 50, height = 50, title = "澶村儚")
+    @Img(height = 50, title = "澶村儚", uploadApi = "/admin/uploadimg", uploadApiParams = {"id:123123","type:2"})
     private String portrait;
 
     @DaoQueryCondition
     @Show(order = 4, title = "鐪�")
-    @Select(apiPath = "/admin/api/getProvince", title = "鐪�")
+    @Select(values = {"cq:閲嶅簡","js:姹熻嫃"}, title = "鐪�", apiParams = {"page:1", "pageSize:10", "id:\"test\""})
     private String province;
 
 

--
Gitblit v1.8.0