From 47e3087067abd35e6337c011f96d2338c0bb1aae Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 25 七月 2024 13:39:31 +0800
Subject: [PATCH] 优化自动化代码

---
 src/main/java/org/yeshi/utils/generater/GeneraterManager.java                          |    2 
 src/main/java/org/yeshi/utils/annotation/MapUtil.java                                  |   82 ++-
 src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java                        |   25 
 src/test/java/com/generater/TestEntity2.java                                           |    1 
 src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java           |   16 
 src/main/resources/schemas/generator.dtd                                               |    3 
 src/main/java/org/yeshi/utils/generater/util/NameUtil.java                             |    4 
 src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java                  |    6 
 src/main/resources/generater/admin/adminController.template                            |   39 +
 src/main/java/org/yeshi/utils/QRCodeUtil.java                                          |  564 +++++++++++++-------------
 src/main/resources/generater/admin/adminVO.template                                    |   14 
 src/main/resources/generater/admin/update.ftl                                          |   38 +
 src/main/resources/generater/admin/form/checkBox.ftl                                   |    2 
 src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java |   19 
 src/main/java/org/yeshi/utils/generater/mybatis/ColumnParseUtil.java                   |   21 +
 src/main/resources/generater/admin/form/img.ftl                                        |    2 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java    |   10 
 src/main/resources/generater/admin/list.ftl                                            |   18 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java           |    3 
 src/test/java/com/generater/GeneratorTest.java                                         |    6 
 src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java                 |   99 ++++
 src/main/java/org/yeshi/utils/tencentcloud/COSManager.java                             |   11 
 src/main/java/org/yeshi/utils/wx/WXAppLoginUtil.java                                   |   19 
 src/main/java/org/yeshi/utils/generater/TestEntity3.java                               |    1 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java          |   10 
 src/main/resources/generater/admin/add.ftl                                             |   43 +
 src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java                  |    5 
 src/main/java/org/yeshi/utils/mq/TDMQUtil.java                                         |   82 ++-
 src/main/resources/test.xml                                                            |   88 ++++
 29 files changed, 774 insertions(+), 459 deletions(-)

diff --git a/src/main/java/org/yeshi/utils/QRCodeUtil.java b/src/main/java/org/yeshi/utils/QRCodeUtil.java
index 8d5ecbc..2a41b2c 100644
--- a/src/main/java/org/yeshi/utils/QRCodeUtil.java
+++ b/src/main/java/org/yeshi/utils/QRCodeUtil.java
@@ -26,327 +26,309 @@
 import com.google.zxing.Result;
 import com.google.zxing.WriterException;
 import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.common.HybridBinarizer;
 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 
 /**
  * 浜岀淮鐮佺敓鎴�
- * 
- * @author Administrator
  *
+ * @author Administrator
  */
 public class QRCodeUtil {
-	private static final String CHARSET = "UTF-8";
-	private static final String FORMAT_NAME = "JPG";
-	// 浜岀淮鐮佸昂瀵�
-	int QRCODE_SIZE = 200;
-	// LOGO瀹藉害
-	int WIDTH = 60;
-	// LOGO楂樺害
-	int HEIGHT = 60;
+    private static final String CHARSET = "UTF-8";
+    private static final String FORMAT_NAME = "JPG";
 
-	static QRCodeUtil qrCodeUtil;
+    // 浜岀淮鐮佸昂瀵�
+    int QRCODE_SIZE = 200;
+    // LOGO瀹藉害
+    int WIDTH = 60;
+    // LOGO楂樺害
+    int HEIGHT = 60;
 
-	public static QRCodeUtil getInstance(int size) {
-		if (qrCodeUtil == null) {
-			qrCodeUtil = new QRCodeUtil();
-		}
-		qrCodeUtil.QRCODE_SIZE = size;
-		return qrCodeUtil;
-	}
+    static QRCodeUtil qrCodeUtil;
 
-	public static QRCodeUtil getInstance(int size, int imgSize) {
-		if (qrCodeUtil == null) {
-			qrCodeUtil = new QRCodeUtil();
-		}
-		qrCodeUtil.QRCODE_SIZE = size;
-		qrCodeUtil.HEIGHT = imgSize;
-		qrCodeUtil.WIDTH = imgSize;
-		return qrCodeUtil;
-	}
+    public static QRCodeUtil getInstance(int size) {
+        if (qrCodeUtil == null) {
+            qrCodeUtil = new QRCodeUtil();
+        }
+        qrCodeUtil.QRCODE_SIZE = size;
+        return qrCodeUtil;
+    }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param logoImgPath
-	 *            Logo
-	 * @param needCompress
-	 *            鏄惁鍘嬬缉Logo
-	 * @return 杩斿洖浜岀淮鐮佸浘鐗�
-	 * @throws WriterException
-	 * @throws IOException
-	 *             BufferedImage TODO 鍒涘缓浜岀淮鐮佸浘鐗�
-	 */
-	private BufferedImage createImage(String content, InputStream logoImg, boolean needCompress)
-			throws WriterException, IOException {
-		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
-		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
-		hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
-		hints.put(EncodeHintType.MARGIN, 1);
-		BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
-				hints);
-        
-		int width = bitMatrix.getWidth();
-		int height = bitMatrix.getHeight();
-		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-		for (int x = 0; x < width; x++) {
-			for (int y = 0; y < height; y++) {
-				image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
-			}
-		}
-		if (logoImg == null) {
-			return image;
-		}
-		
-		// 鎻掑叆鍥剧墖
-		insertImage(image, logoImg, needCompress);
-		return image;
-	}
+    public static QRCodeUtil getInstance(int size, int imgSize) {
+        if (qrCodeUtil == null) {
+            qrCodeUtil = new QRCodeUtil();
+        }
+        qrCodeUtil.QRCODE_SIZE = size;
+        qrCodeUtil.HEIGHT = imgSize;
+        qrCodeUtil.WIDTH = imgSize;
+        return qrCodeUtil;
+    }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param logoImgPath
-	 *            Logo
-	 * @param needCompress
-	 *            鏄惁鍘嬬缉Logo
-	 * @return 杩斿洖浜岀淮鐮佸浘鐗�
-	 * @throws WriterException
-	 * @throws IOException
-	 *             BufferedImage TODO 鍒涘缓浜岀淮鐮佸浘鐗�
-	 */
-	private BufferedImage createImageDeleteWhite(String content, InputStream logoImg, boolean needCompress)
-			throws WriterException, IOException {
-		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
-		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
-		hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
-		hints.put(EncodeHintType.MARGIN, 1);
-		BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
-				hints);
-		
-		//璋冪敤鍘婚櫎鐧借竟鏂规硶
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29
+     *
+     * @param content      浜岀淮鐮佸唴瀹�
+     * @param logoImgPath  Logo
+     * @param needCompress 鏄惁鍘嬬缉Logo
+     * @return 杩斿洖浜岀淮鐮佸浘鐗�
+     * @throws WriterException
+     * @throws IOException
+     */
+    private BufferedImage createImage(String content, InputStream logoImg, boolean needCompress)
+            throws WriterException, IOException {
+        return this.createImage(content, logoImg, 0xFF000000, 0xFFFFFFFF, needCompress);
+    }
+
+
+    public BufferedImage createImage(String content, InputStream logoImg, int color, int bgColor, boolean needCompress)
+            throws WriterException, IOException {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
+                hints);
+
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? color : bgColor);
+            }
+        }
+        if (logoImg == null) {
+            return image;
+        }
+
+        if (logoImg != null) {
+            // 鎻掑叆鍥剧墖
+            insertImage(image, logoImg, needCompress);
+        }
+
+        return image;
+    }
+
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:31:29
+     *
+     * @param content      浜岀淮鐮佸唴瀹�
+     * @param logoImgPath  Logo
+     * @param needCompress 鏄惁鍘嬬缉Logo
+     * @return 杩斿洖浜岀淮鐮佸浘鐗�
+     * @throws WriterException
+     * @throws IOException
+     */
+    private BufferedImage createImageDeleteWhite(String content, InputStream logoImg, boolean needCompress)
+            throws WriterException, IOException {
+        return createImageDeleteWhite(content, logoImg, 0xFF000000, 0xFFFFFFFF, needCompress);
+    }
+
+
+    public BufferedImage createImageDeleteWhite(String content, InputStream logoImg, int color, int bgColor, boolean needCompress)
+            throws WriterException, IOException {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
+                hints);
+
+        //璋冪敤鍘婚櫎鐧借竟鏂规硶
         bitMatrix = deleteWhite(bitMatrix);
-        
-		int width = bitMatrix.getWidth();
-		int height = bitMatrix.getHeight();
-		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-		for (int x = 0; x < width; x++) {
-			for (int y = 0; y < height; y++) {
-				image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
-			}
-		}
-		if (logoImg == null) {
-			return image;
-		}
-		
-		// 鎻掑叆鍥剧墖
-		insertImage(image, logoImg, needCompress);
-		return image;
-	}
-	
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:30:09
-	 * 
-	 * @param source
-	 *            浜岀淮鐮佸浘鐗�
-	 * @param logoImgPath
-	 *            Logo
-	 * @param needCompress
-	 *            鏄惁鍘嬬缉Logo
-	 * @throws IOException
-	 *             void TODO 娣诲姞Logo
-	 */
-	private void insertImage(BufferedImage source, InputStream logoImg, boolean needCompress) throws IOException {
-		Image src = ImageIO.read(logoImg);
-		int width = src.getWidth(null);
-		int height = src.getHeight(null);
-		if (needCompress) { // 鍘嬬缉LOGO
-			if (width > WIDTH) {
-				width = WIDTH;
-			}
 
-			if (height > HEIGHT) {
-				height = HEIGHT;
-			}
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? color : bgColor);
+            }
+        }
+        if (logoImg == null) {
+            return image;
+        }
 
-			Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-			BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-			Graphics g = tag.getGraphics();
-			g.drawImage(image, 0, 0, null); // 缁樺埗缂╁皬鍚庣殑鍥�
-			g.dispose();
-			src = image;
-		}
+        // 鎻掑叆鍥剧墖
+        if (logoImg != null) {
+            insertImage(image, logoImg, needCompress);
+        }
+        return image;
+    }
 
-		// 鎻掑叆LOGO
-		Graphics2D graph = source.createGraphics();
-		int x = (QRCODE_SIZE - width) / 2;
-		int y = (QRCODE_SIZE - height) / 2;
-		graph.drawImage(src, x, y, width, height, null);
-		Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
-		graph.setStroke(new BasicStroke(3f));
-		graph.draw(shape);
-		graph.dispose();
-	}
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:30:09
+     *
+     * @param source       浜岀淮鐮佸浘鐗�
+     * @param logoImgPath  Logo
+     * @param needCompress 鏄惁鍘嬬缉Logo
+     * @throws IOException void TODO 娣诲姞Logo
+     */
+    private void insertImage(BufferedImage source, InputStream logoImg, boolean needCompress) throws IOException {
+        Image src = ImageIO.read(logoImg);
+        int width = src.getWidth(null);
+        int height = src.getHeight(null);
+        if (needCompress) { // 鍘嬬缉LOGO
+            if (width > WIDTH) {
+                width = WIDTH;
+            }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:32:32
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param logoImgPath
-	 *            Logo
-	 * @param destPath
-	 *            浜岀淮鐮佽緭鍑鸿矾寰�
-	 * @param needCompress
-	 *            鏄惁鍘嬬缉Logo
-	 * @throws Exception
-	 *             void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜
-	 */
-	public void encode(String content, InputStream logoImg, String destPath, boolean needCompress) throws Exception {
-		BufferedImage image = createImage(content, logoImg, needCompress);
-		ImageIO.write(image, FORMAT_NAME, new File(destPath));
-	}
+            if (height > HEIGHT) {
+                height = HEIGHT;
+            }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:35:44
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param destPath
-	 *            浜岀淮鐮佽緭鍑鸿矾寰�
-	 * @throws Exception
-	 *             void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜
-	 */
-	public void encode(String content, String destPath) throws Exception {
-		encode(content, null, destPath, false);
-	}
+            Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics g = tag.getGraphics();
+            g.drawImage(image, 0, 0, null); // 缁樺埗缂╁皬鍚庣殑鍥�
+            g.dispose();
+            src = image;
+        }
 
-	public InputStream encode(String content) throws Exception {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		encode(content, null, out, false);
-		return new ByteArrayInputStream(out.toByteArray());
-	}
+        // 鎻掑叆LOGO
+        Graphics2D graph = source.createGraphics();
+        int x = (QRCODE_SIZE - width) / 2;
+        int y = (QRCODE_SIZE - height) / 2;
+        graph.drawImage(src, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+    }
 
-	
-	public InputStream encodeDeleteWhite(String content) throws Exception {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		encodeDeleteWhite(content, null, out, false);
-		return new ByteArrayInputStream(out.toByteArray());
-	}
-	
-	
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:36:58
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param logoImgPath
-	 *            Logo
-	 * @param output
-	 *            杈撳嚭娴�
-	 * @param needCompress
-	 *            鏄惁鍘嬬缉Logo
-	 * @throws Exception
-	 *             void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴�
-	 */
-	public void encode(String content, InputStream logoImg, OutputStream output, boolean needCompress)
-			throws Exception {
-		BufferedImage image = createImage(content, logoImg, needCompress);
-		ImageIO.write(image, FORMAT_NAME, output);
-	}
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:32:32
+     *
+     * @param content      浜岀淮鐮佸唴瀹�
+     * @param logoImgPath  Logo
+     * @param destPath     浜岀淮鐮佽緭鍑鸿矾寰�
+     * @param needCompress 鏄惁鍘嬬缉Logo
+     * @throws Exception void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜
+     */
+    public void encode(String content, InputStream logoImg, String destPath, boolean needCompress) throws Exception {
+        BufferedImage image = createImage(content, logoImg, needCompress);
+        ImageIO.write(image, FORMAT_NAME, new File(destPath));
+    }
 
-	/**
-	 * 
-	 * @param content
-	 * @param logoImg
-	 * @param output
-	 *            浜岃繘鍒惰緭鍑烘祦
-	 * @param needCompress
-	 * @throws Exception
-	 */
-	public void encode(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress)
-			throws Exception {
-		BufferedImage image = createImage(content, logoImg, needCompress);
-		ImageIO.write(image, FORMAT_NAME, output);
-	}
-	
-	/**
-	 * 
-	 * @param content
-	 * @param logoImg
-	 * @param output
-	 *            浜岃繘鍒惰緭鍑烘祦
-	 * @param needCompress
-	 * @throws Exception
-	 */
-	public void encodeDeleteWhite(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress)
-			throws Exception {
-		BufferedImage image = createImageDeleteWhite(content, logoImg, needCompress);
-		ImageIO.write(image, FORMAT_NAME, output);
-	}
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:35:44
+     *
+     * @param content  浜岀淮鐮佸唴瀹�
+     * @param destPath 浜岀淮鐮佽緭鍑鸿矾寰�
+     * @throws Exception void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜
+     */
+    public void encode(String content, String destPath) throws Exception {
+        encode(content, null, destPath, false);
+    }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:38:02
-	 * 
-	 * @param content
-	 *            浜岀淮鐮佸唴瀹�
-	 * @param output
-	 *            杈撳嚭娴�
-	 * @throws Exception
-	 *             void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴�
-	 */
-	public void encode(String content, OutputStream output) throws Exception {
-		encode(content, null, output, false);
-	}
+    public InputStream encode(String content) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        encode(content, null, out, false);
+        return new ByteArrayInputStream(out.toByteArray());
+    }
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:10
-	 * 
-	 * @param file
-	 *            浜岀淮鐮�
-	 * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭
-	 * @throws Exception
-	 *             String TODO 浜岀淮鐮佽В鏋�
-	 */
-	public String decode(File file) throws Exception {
-		BufferedImage image;
-		image = ImageIO.read(file);
-		if (image == null) {
-			return null;
-		}
-		BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
-		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
-		Result result;
-		Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
-		hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
-		result = new MultiFormatReader().decode(bitmap, hints);
-		String resultStr = result.getText();
-		return resultStr;
-	}
 
-	/**
-	 * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:48
-	 * 
-	 * @param path
-	 *            浜岀淮鐮佸瓨鍌ㄤ綅缃�
-	 * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭
-	 * @throws Exception
-	 *             String TODO 浜岀淮鐮佽В鏋�
-	 */
-	public String decode(String path) throws Exception {
-		return decode(new File(path));
-	}
+    public InputStream encodeDeleteWhite(String content) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        encodeDeleteWhite(content, null, out, false);
+        return new ByteArrayInputStream(out.toByteArray());
+    }
 
-	 private static BitMatrix deleteWhite(BitMatrix matrix) {
+
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:36:58
+     *
+     * @param content      浜岀淮鐮佸唴瀹�
+     * @param logoImgPath  Logo
+     * @param output       杈撳嚭娴�
+     * @param needCompress 鏄惁鍘嬬缉Logo
+     * @throws Exception void TODO 鐢熸垚甯ogo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴�
+     */
+    public void encode(String content, InputStream logoImg, OutputStream output, boolean needCompress)
+            throws Exception {
+        BufferedImage image = createImage(content, logoImg, needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * @param content
+     * @param logoImg
+     * @param output       浜岃繘鍒惰緭鍑烘祦
+     * @param needCompress
+     * @throws Exception
+     */
+    public void encode(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress)
+            throws Exception {
+        BufferedImage image = createImage(content, logoImg, needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * @param content
+     * @param logoImg
+     * @param output       浜岃繘鍒惰緭鍑烘祦
+     * @param needCompress
+     * @throws Exception
+     */
+    public void encodeDeleteWhite(String content, InputStream logoImg, ByteArrayOutputStream output, boolean needCompress)
+            throws Exception {
+        BufferedImage image = createImageDeleteWhite(content, logoImg, needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:38:02
+     *
+     * @param content 浜岀淮鐮佸唴瀹�
+     * @param output  杈撳嚭娴�
+     * @throws Exception void TODO 鐢熸垚涓嶅甫Logo鐨勪簩缁寸爜锛屽苟杈撳嚭鍒版寚瀹氱殑杈撳嚭娴�
+     */
+    public void encode(String content, OutputStream output) throws Exception {
+        encode(content, null, output, false);
+    }
+
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:10
+     *
+     * @param file 浜岀淮鐮�
+     * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭
+     * @throws Exception String TODO 浜岀淮鐮佽В鏋�
+     */
+    public String decode(File file) throws Exception {
+        BufferedImage image;
+        image = ImageIO.read(file);
+        if (image == null) {
+            return null;
+        }
+        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+        Result result;
+        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
+        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
+        result = new MultiFormatReader().decode(bitmap, hints);
+        String resultStr = result.getText();
+        return resultStr;
+    }
+
+    /**
+     * user: Rex date: 2016骞�12鏈�29鏃� 涓婂崍12:39:48
+     *
+     * @param path 浜岀淮鐮佸瓨鍌ㄤ綅缃�
+     * @return 杩斿洖瑙f瀽寰楀埌鐨勪簩缁寸爜鍐呭
+     * @throws Exception String TODO 浜岀淮鐮佽В鏋�
+     */
+    public String decode(String path) throws Exception {
+        return decode(new File(path));
+    }
+
+    private static BitMatrix deleteWhite(BitMatrix matrix) {
         int[] rec = matrix.getEnclosingRectangle();
         int resWidth = rec[2] + 1;
         int resHeight = rec[3] + 1;
- 
+
         BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
         resMatrix.clear();
         for (int i = 0; i < resWidth; i++) {
diff --git a/src/main/java/org/yeshi/utils/annotation/MapUtil.java b/src/main/java/org/yeshi/utils/annotation/MapUtil.java
index 6c8d79a..ecb8f87 100644
--- a/src/main/java/org/yeshi/utils/annotation/MapUtil.java
+++ b/src/main/java/org/yeshi/utils/annotation/MapUtil.java
@@ -1,36 +1,66 @@
 package org.yeshi.utils.annotation;
 
+import com.google.gson.Gson;
+import net.sf.json.JSONObject;
+import org.yeshi.utils.StringUtil;
+
+import java.io.UnsupportedEncodingException;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.Properties;
 
 public class MapUtil {
 
-	public static Object parseMap(Class<?> clazz, Properties ps) {
-		System.out.println(clazz.getName());
-		Object target = null;
-		try {
-			Class clz = Class.forName(clazz.getName());
-			target = clz.newInstance();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		Field[] fields = clazz.getDeclaredFields();
-		for (Field fd : fields) {
-			fd.setAccessible(true);
-			Annotation[] as = fd.getAnnotations();
-			for (Annotation a : as) {
-				if (a instanceof Map) {
-					Map c = (Map) a;
-					try {
-						fd.set(target, new String(ps.getProperty(c.value()).getBytes("ISO-8859-1"), "UTF-8"));
-					} catch (Exception e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		return target;
-	}
+    public static Object parseMap(Class<?> clazz, Properties ps) {
+        System.out.println(clazz.getName());
+        Object target = null;
+        try {
+            Class clz = Class.forName(clazz.getName());
+            target = clz.newInstance();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field fd : fields) {
+            fd.setAccessible(true);
+            Annotation[] as = fd.getAnnotations();
+            for (Annotation a : as) {
+                if (a instanceof Map) {
+                    Map c = (Map) a;
+                    try {
+                        fd.set(target, new String(ps.getProperty(c.value()).getBytes("ISO-8859-1"), "UTF-8"));
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        return target;
+    }
+
+
+    public static Object parseMapByJson(Class<?> clazz, Properties ps, String encoding) {
+        if (StringUtil.isNullOrEmpty(encoding)) {
+            encoding = "ISO-8859-1";
+        }
+        JSONObject json = new JSONObject();
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field fd : fields) {
+            fd.setAccessible(true);
+            Annotation[] as = fd.getAnnotations();
+            for (Annotation a : as) {
+                if (a instanceof Map) {
+                    Map c = (Map) a;
+                    try {
+                        json.put(fd.getName(), new String(ps.getProperty(c.value()).getBytes(encoding), "UTF-8"));
+                    } catch (UnsupportedEncodingException e) {
+                        e.printStackTrace();
+                    }
+
+                }
+            }
+        }
+        return new Gson().fromJson(json.toString(), clazz);
+    }
 
 }
diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
index 87d4a31..d0b4547 100644
--- a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
@@ -317,7 +317,7 @@
      * @date 18:25 2021/10/13
      * @param: entityName
      **/
-    private static String getHtmlNameFromEntityName(String entityName) {
+    public static String getHtmlNameFromEntityName(String entityName) {
         StringBuffer sb = new StringBuffer();
         StringBuffer buffer = null;
         for (int i = 0; i < entityName.length(); i++) {
diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java b/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
index 99af5a4..2f70d3b 100644
--- a/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
@@ -101,21 +101,24 @@
     }
 
 
-    public void createAdminVO() throws Exception {
-        if (StringUtil.isNullOrEmpty(config.getService().getAdminVOPackage())) {
-            throw new Exception("灏氭湭閰嶇疆AdminVO");
+    public AdminVOVO createAdminVO() throws Exception {
+        if (StringUtil.isNullOrEmpty(config.getAdmin().getController().getAdminVOPackage())) {
+            return null;
         }
 
-        String name = NameUtil.getDefaultExceptionName(config.getEntity());
-        String path = getDirPath(config.getService().getAdminVOPackage());
+        String name = NameUtil.getDefaultAdminVOName(config.getEntity());
+        String path = getDirPath(config.getAdmin().getController().getAdminVOPackage());
         try {
-            AdminVOVO vo = new AdminVOVO.Builder().setEntity(config.getEntity()).setPackageName(config.getService().getAdminVOPackage()).build();
+            AdminVOVO vo = new AdminVOVO.Builder().setEntity(config.getEntity()).setPackageName(config.getAdmin().getController().getAdminVOPackage()).build();
             String result = GeneraterUtil.createAdminVO(vo);
             //淇濆瓨
             saveFile(result, new File(path, name + ".java").getAbsolutePath());
+            return vo;
         } catch (Exception e) {
             e.printStackTrace();
         }
+
+        return null;
     }
 
 
@@ -247,9 +250,6 @@
             }
         }
 
-        if (config.getService().getAdminVOPackage() != null) {
-            createAdminVO();
-        }
 
         QueryVO queryVO = createQuery(config.getService().getQueryPackage());
 
@@ -315,13 +315,18 @@
             query = new ClassInfo(queryName, config.getService().getQueryPackage() + "." + queryName);
         }
 
+        AdminVOVO adminVOVO = null;
+        if (config.getAdmin().getController().getAdminVOPackage() != null) {
+            adminVOVO = createAdminVO();
+        }
+
 
         String path = getDirPath(config.getAdmin().getController().getPkg());
 
         AdminGeneraterInfo generaterInfo = new AdminGeneraterInfo.Builder().setEntityClass(config.getEntity()).setAdminData(config.getAdmin()).build();
 
 
-        AdminControllerInfoVO vo = new AdminControllerInfoVO.Builder().setAdminInfo(generaterInfo).setPackageName(generaterInfo.getControllerData().getPkg()).setQueryVO(query).setService(service).build();
+        AdminControllerInfoVO vo = new AdminControllerInfoVO.Builder().setAdminVO(adminVOVO == null ? null : new ClassInfo(adminVOVO.getName(), adminVOVO.getPackageName() + "." + adminVOVO.getName())).setAdminInfo(generaterInfo).setPackageName(generaterInfo.getControllerData().getPkg()).setQueryVO(query).setService(service).build();
         String controllerName = vo.getControllerName();
         //鐢熸垚controller
         String result = GeneraterUtil.createAdminController(vo);
diff --git a/src/main/java/org/yeshi/utils/generater/TestEntity3.java b/src/main/java/org/yeshi/utils/generater/TestEntity3.java
index 275d9db..2303e3d 100644
--- a/src/main/java/org/yeshi/utils/generater/TestEntity3.java
+++ b/src/main/java/org/yeshi/utils/generater/TestEntity3.java
@@ -15,6 +15,7 @@
 @Table("table_test")
 public class TestEntity3 {
     @Id
+    @Column(name = "id")
     private String id;
 
     @Column(name = "nick_name")
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 680df76..f35f6cb 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
@@ -315,14 +315,16 @@
                 FormComponentImg formComponentImg = (FormComponentImg) component;
                 params.put("width", formComponentImg.getWidth() == null ? -1 : formComponentImg.getWidth());
                 params.put("height", formComponentImg.getHeight() == null ? -1 : formComponentImg.getHeight());
-                params.put("uploadApi", formComponentImg.getApi().getPath());
-                if (formComponentImg.getApi().getParams() != null) {
-                    List<KeyValue> list = new ArrayList<>();
-                    for (Iterator<String> its = formComponentImg.getApi().getParams().keySet().iterator(); its.hasNext(); ) {
-                        String key = its.next();
-                        list.add(new KeyValue(key, formComponentImg.getApi().getParams().get(key) + ""));
+                if( formComponentImg.getApi()!=null) {
+                    params.put("uploadApi", formComponentImg.getApi().getPath());
+                    if (formComponentImg.getApi().getParams() != null) {
+                        List<KeyValue> list = new ArrayList<>();
+                        for (Iterator<String> its = formComponentImg.getApi().getParams().keySet().iterator(); its.hasNext(); ) {
+                            String key = its.next();
+                            list.add(new KeyValue(key, formComponentImg.getApi().getParams().get(key) + ""));
+                        }
+                        params.put("uploadApiParams", list);
                     }
-                    params.put("uploadApiParams", list);
                 }
             } else if (component instanceof FormComponentSwitch) {
                 rowData.setType(Switch.class.getSimpleName());
diff --git a/src/main/java/org/yeshi/utils/generater/mybatis/ColumnParseUtil.java b/src/main/java/org/yeshi/utils/generater/mybatis/ColumnParseUtil.java
index 5d52228..b0df6b0 100644
--- a/src/main/java/org/yeshi/utils/generater/mybatis/ColumnParseUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/mybatis/ColumnParseUtil.java
@@ -87,4 +87,25 @@
         }
     }
 
+
+    public static String getMysqlType(String type) {
+        if (type.endsWith("java.lang.Long")) {
+            return "bigint";
+        } else if (type.endsWith("java.lang.Integer")) {
+            return "int";
+        } else if (type.endsWith("java.lang.String")) {
+            return "varchar";
+        } else if (type.endsWith("java.lang.Boolean")) {
+            return "tinyint";
+        } else if (type.endsWith("java.math.BigDecimal")) {
+            return "decimal";
+        } else if (type.endsWith("java.util.Date")) {
+            return "datetime";
+        } else if (type.endsWith("java.lang.Double")) {
+            return "double";
+        } else {
+            return "varchar";
+        }
+    }
+
 }
diff --git a/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java b/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
index e8427d3..e6e7c37 100644
--- a/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/mybatis/MyBatisMapperUtil.java
@@ -14,6 +14,7 @@
 import org.dom4j.DocumentHelper;
 import org.dom4j.io.OutputFormat;
 import org.dom4j.io.XMLWriter;
+import org.springframework.data.annotation.Id;
 import org.yeshi.utils.generater.entity.MybatisColumnData;
 
 public class MyBatisMapperUtil {
@@ -409,6 +410,101 @@
         }
     }
 
+
+    public static String createSQL(Class<?> clz){
+        List<AttributeColumnMap> keysList = new ArrayList<>();
+        Field[] fields = clz.getDeclaredFields();
+        for (Field fd : fields) {
+            Annotation[] as = fd.getAnnotations();
+            AttributeColumnMap columnMap=null;
+            for (Annotation a : as) {
+                if (a instanceof Column) {
+                    Column c = (Column) a;
+                    columnMap = new AttributeColumnMap(fd.getName(), c.name(), fd.getType().getName());
+                    columnMap.length = c.length();
+                    break;
+                }
+            }
+            for (Annotation a : as) {
+                if(a instanceof Id){
+                    // 涓婚敭
+                    columnMap.mainKey = true;
+                    break;
+                }
+            }
+            if(columnMap!=null){
+                keysList.add(columnMap);
+            }
+        }
+        String tableName = "";
+        Annotation[] as = clz.getAnnotations();
+        for (Annotation a : as) {
+            if (a instanceof Table) {
+                Table t = (Table) a;
+                tableName = t.value();
+            }
+        }
+
+        StringBuffer buffer=new StringBuffer();
+        buffer.append("create table `").append(tableName).append("`(\n");
+        for(AttributeColumnMap columnMap:keysList){
+            String mysqlType = ColumnParseUtil.getMysqlType(columnMap.type);
+
+            buffer.append("\t`").append(columnMap.column).append("`");
+
+
+            if(columnMap.mainKey) {
+                if(mysqlType.equalsIgnoreCase("bigint")) {
+                    buffer.append(" bigint(20) ");
+                    buffer.append(" unsigned NOT NULL AUTO_INCREMENT ");
+                }else if(mysqlType.equalsIgnoreCase("varchar")){
+                    buffer.append(" varchar(32) ");
+                    buffer.append(" NOT NULL ");
+                }
+                buffer.append(",\n");
+                buffer.append("\tPRIMARY KEY (`"+columnMap.column+"`),\n");
+            }else{
+                String lengthStr=null;
+                int length = columnMap.length;
+                switch(mysqlType){
+                    case "varchar":
+                        if(length<=0){
+                            length = 32;
+                        }
+                        lengthStr="("+length+")";
+                        break;
+                    case "int":
+                        if(length<=0){
+                            length = 11;
+                        }
+                        lengthStr="("+length+")";
+                        break;
+                    case "datetime":
+                        lengthStr="";
+                        break;
+
+                    case "decimal":
+                        if(length<=0){
+                            length = 8;
+                        }
+                        lengthStr="("+length+",2)";
+                        break;
+                     default:
+                         lengthStr="";
+                }
+                buffer.append(mysqlType).append(lengthStr).append(" DEFAULT NULL,\n");
+            }
+        }
+
+        String fs=buffer.toString().trim();
+        if(fs.endsWith(",")){
+            fs = fs.substring(0,fs.length()-1);
+        }
+        fs+= "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
+        return fs;
+    }
+
+
     private static AttributeColumnMap getAttributeColumnMapByAttribute(String attributeName,
                                                                        List<AttributeColumnMap> list) {
         for (AttributeColumnMap acm : list)
@@ -434,6 +530,8 @@
     String attribute;
     String column;
     String type;
+    boolean mainKey;
+    int length;
 
     public AttributeColumnMap(String attribute, String column, String type) {
         this.attribute = attribute;
@@ -441,6 +539,7 @@
         this.type = type;
     }
 
+
     public AttributeColumnMap() {
 
     }
diff --git a/src/main/java/org/yeshi/utils/generater/util/NameUtil.java b/src/main/java/org/yeshi/utils/generater/util/NameUtil.java
index 4c820af..3349fa8 100644
--- a/src/main/java/org/yeshi/utils/generater/util/NameUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/util/NameUtil.java
@@ -24,6 +24,10 @@
         return entity.getSimpleName() + "Exception";
     }
 
+    public static String getDefaultAdminVOName(Class entity) {
+        return entity.getSimpleName() + "AdminVO";
+    }
+
     public static String getDefaultQueryName(Class entity) {
         return entity.getSimpleName() + "Query";
     }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
index 124e173..f889bf7 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java
@@ -18,6 +18,7 @@
     private ClassInfo entity;
     private ClassInfo service;
     private ClassInfo query;
+    private ClassInfo adminVO;
     private boolean jsonp;
 
     private boolean responseBody;
@@ -43,6 +44,8 @@
 
         private boolean responseBody;
 
+        private ClassInfo adminVO;
+
 
         public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
             this.generaterInfo = generaterInfo;
@@ -61,6 +64,11 @@
 
         public Builder setService(ClassInfo service) {
             this.service = service;
+            return this;
+        }
+
+        public Builder setAdminVO(ClassInfo adminVO) {
+            this.adminVO = adminVO;
             return this;
         }
 
@@ -90,8 +98,9 @@
             vo.setPackageName(packageName);
             vo.setQueryVO(query);
             vo.setService(service);
+            vo.setAdminVO(adminVO);
             vo.setAdd(generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0);
-            vo.setUpdate(generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0 );
+            vo.setUpdate(generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0);
             vo.setDelete(true);
             vo.setResponseBody(generaterInfo.getControllerData().isResponseBody());
 
@@ -202,4 +211,12 @@
     public void setResponseBody(boolean responseBody) {
         this.responseBody = responseBody;
     }
+
+    public ClassInfo getAdminVO() {
+        return adminVO;
+    }
+
+    public void setAdminVO(ClassInfo adminVO) {
+        this.adminVO = adminVO;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
index 757c026..0f16264 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
@@ -1,6 +1,7 @@
 package org.yeshi.utils.generater.vo.admin.page;
 
 import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.GeneraterManager;
 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;
@@ -54,11 +55,11 @@
             ListInfoVO vo = new ListInfoVO();
             vo.setListApi(generaterInfo.getControllerData().getMapping() + "/list");
             if (generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
-                vo.setAddPagePath(ColumnUtil.getColumnFromProperty(generaterInfo.getEntity().getSimpleName()) + "_add.html");
+                vo.setAddPagePath(GeneraterManager.getHtmlNameFromEntityName(generaterInfo.getEntity().getSimpleName()) + "_add.html");
             }
 
             if (generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0) {
-                vo.setUpdatePagePath(ColumnUtil.getColumnFromProperty(generaterInfo.getEntity().getSimpleName()) + "_update.html");
+                vo.setUpdatePagePath(GeneraterManager.getHtmlNameFromEntityName(generaterInfo.getEntity().getSimpleName()) + "_update.html");
             }
             vo.setSearchFormRows(generaterInfo.getSearchFormRows());
             vo.setShowFileds(generaterInfo.getShowDataList());
diff --git a/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
index 3374de1..e78d87f 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
@@ -1,6 +1,5 @@
 package org.yeshi.utils.generater.vo.service;
 
-import org.springframework.stereotype.Service;
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.bean.BeanUtil;
 import org.yeshi.utils.generater.entity.BaseData;
@@ -18,7 +17,7 @@
     private ClassInfo service;
     //鏂规硶鍒楄〃
     private List<ServiceMetodInfoVO> metodInfoList;
-    private ClassInfo query;
+    private ClassInfo query;;
 
 
     public static class Builder {
@@ -27,6 +26,7 @@
         private ClassInfo service;
         private ClassInfo query;
         private ClassInfo exception;
+
 
 
         public Builder setEntity(Class entity) {
@@ -53,6 +53,7 @@
             this.exception = exception;
             return this;
         }
+
 
         private String getRemarksLine(String content) {
             return "\t * " + content + "\n";
@@ -210,4 +211,5 @@
     public void setImportList(List<String> importList) {
         this.importList = importList;
     }
+
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java
index c7bffe1..f9a2b7d 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java
@@ -109,7 +109,7 @@
         data.setInterPackage(getNodeAttributeValue(node, "interPackage"));
         data.setImplPackage(getNodeAttributeValue(node, "implPackage"));
         data.setQueryPackage(getNodeAttributeValue(node, "queryPackage"));
-        data.setAdminVOPackage(getNodeAttributeValue(node, "adminVOPackage"));
+
 
         NodeList nodeList = node.getChildNodes();
         for (int i = 0; i < nodeList.getLength(); i++) {
@@ -208,6 +208,7 @@
                     adminControllerData.setMapping(getNodeAttributeValue(node1, "mapping"));
                     adminControllerData.setName(getNodeAttributeValue(node1, "name"));
                     adminControllerData.setPkg(getNodeAttributeValue(node1, "package"));
+                    adminControllerData.setAdminVOPackage(getNodeAttributeValue(node1, "adminVOPackage"));
                     adminControllerData.setResponseBody(Boolean.parseBoolean(getNodeAttributeValue(node1, "responseBody")));
                     adminData.setController(adminControllerData);
                 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java
index 2a81800..71b40fb 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java
@@ -16,6 +16,8 @@
     //鎺ュ彛鏄惁jsonp
     private boolean jsonp;
 
+    private String adminVOPackage;
+
 
     public String getPkg() {
         return pkg;
@@ -56,4 +58,12 @@
     public void setJsonp(boolean jsonp) {
         this.jsonp = jsonp;
     }
+
+    public String getAdminVOPackage() {
+        return adminVOPackage;
+    }
+
+    public void setAdminVOPackage(String adminVOPackage) {
+        this.adminVOPackage = adminVOPackage;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java
index 3b1c4d4..e4b5514 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java
@@ -12,7 +12,7 @@
     private String queryPackage;
     private ExceptionData exception;
 
-    private String adminVOPackage;
+
 
     public String getInterPackage() {
         return interPackage;
@@ -44,13 +44,5 @@
 
     public void setQueryPackage(String queryPackage) {
         this.queryPackage = queryPackage;
-    }
-
-    public String getAdminVOPackage() {
-        return adminVOPackage;
-    }
-
-    public void setAdminVOPackage(String adminVOPackage) {
-        this.adminVOPackage = adminVOPackage;
     }
 }
diff --git a/src/main/java/org/yeshi/utils/mq/TDMQUtil.java b/src/main/java/org/yeshi/utils/mq/TDMQUtil.java
index 11902f3..92b42bc 100644
--- a/src/main/java/org/yeshi/utils/mq/TDMQUtil.java
+++ b/src/main/java/org/yeshi/utils/mq/TDMQUtil.java
@@ -2,6 +2,8 @@
 
 import com.qcloud.cmq.Account;
 import com.qcloud.cmq.Message;
+import com.qcloud.cmq.Queue;
+import com.qcloud.cmq.entity.CmqResponse;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
@@ -10,6 +12,7 @@
 import com.tencentcloudapi.tdmq.v20200217.models.*;
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 //鑵捐CMQ娑堟伅
@@ -204,6 +207,21 @@
 
     public String sendMsg(String queueName, String msg) {
         return this.sendMsg(queueName, msg, 0L);
+    }
+
+    // 鍙戦�佹秷鎭�
+    public List<CmqResponse> batchSendMsg(String queueName, List<String> msgList, long delaySeconds) throws Exception {
+        Queue queue = account.getQueue(queueName);
+        if (delaySeconds > 0) {
+            return queue.batchSend(msgList, (int) delaySeconds);
+        } else {
+            return queue.batchSend(msgList);
+        }
+    }
+
+    // 鍙戦�佹秷鎭�
+    public List<CmqResponse> batchSendMsg(String queueName, List<String> msgList) throws Exception {
+        return batchSendMsg(queueName, msgList, 0);
     }
 
 
@@ -451,32 +469,32 @@
     public static void main(String[] args) {
         TDMQUtil.getInstance().init("AKIDTlpgJhLjOozvd6QI2XnpfGbgV4NQJk25", "xhCSUHo55oHUQ6XicFcmfIgspX0EEzWo", true);
 
-        String queueName = "test1";
-        String topicName = "topic_test";
-
-        //鍒涘缓
-        TDMQUtil.getInstance().createQueue(queueName);
-
-        //鍙戦�佹秷鎭�
-        TDMQUtil.getInstance().sendMsg(queueName, "娴嬭瘯娑堟伅");
-
-        //鍒涘缓涓婚
-        TDMQUtil.getInstance().createTopic(topicName);
-
-        //鍒涘缓璁㈤槄
-        TDMQUtil.getInstance().subscribeTopic(topicName, topicName + queueName, queueName);
-
-        //鍙戦�佽闃呮秷鎭�
-        TDMQUtil.getInstance().publishTopicMessage(topicName, "涓婚娑堟伅");
+        String queueName = "makemoney-goldcorn-settle";
+//        String topicName = "topic_test";
+//
+//        //鍒涘缓
+//        TDMQUtil.getInstance().createQueue(queueName);
+//
+//        //鍙戦�佹秷鎭�
+//        TDMQUtil.getInstance().sendMsg(queueName, "娴嬭瘯娑堟伅");
+//
+//        //鍒涘缓涓婚
+//        TDMQUtil.getInstance().createTopic(topicName);
+//
+//        //鍒涘缓璁㈤槄
+//        TDMQUtil.getInstance().subscribeTopic(topicName, topicName + queueName, queueName);
+//
+//        //鍙戦�佽闃呮秷鎭�
+//        TDMQUtil.getInstance().publishTopicMessage(topicName, "涓婚娑堟伅");
 
         //娑堣垂娑堟伅
-        try {
-            Message message = TDMQUtil.getInstance().recieveMsg(queueName);
-            System.out.println("鎺ュ彈鍒扮殑娑堟伅:" + message.msgBody);
-            TDMQUtil.getInstance().deleteMsg(queueName, message.receiptHandle);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+//        try {
+//            Message message = TDMQUtil.getInstance().recieveMsg(queueName);
+//            System.out.println("鎺ュ彈鍒扮殑娑堟伅:" + message.msgBody);
+//            TDMQUtil.getInstance().deleteMsg(queueName, message.receiptHandle);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
 
         try {
             List<Message> messages = TDMQUtil.getInstance().recieveMsg(10, queueName);
@@ -489,14 +507,14 @@
         }
 
 
-        //鍒犻櫎璁㈤槄
-        TDMQUtil.getInstance().deleteSubscribeTopic(topicName, topicName + queueName);
-
-        //鍒犻櫎涓婚
-        TDMQUtil.getInstance().deleteTopic(topicName);
-
-        //鍒犻櫎闃熷垪
-        TDMQUtil.getInstance().deleteQueue(queueName);
+//        //鍒犻櫎璁㈤槄
+//        TDMQUtil.getInstance().deleteSubscribeTopic(topicName, topicName + queueName);
+//
+//        //鍒犻櫎涓婚
+//        TDMQUtil.getInstance().deleteTopic(topicName);
+//
+//        //鍒犻櫎闃熷垪
+//        TDMQUtil.getInstance().deleteQueue(queueName);
     }
 
 
diff --git a/src/main/java/org/yeshi/utils/tencentcloud/COSManager.java b/src/main/java/org/yeshi/utils/tencentcloud/COSManager.java
index 8ac6606..66958ff 100644
--- a/src/main/java/org/yeshi/utils/tencentcloud/COSManager.java
+++ b/src/main/java/org/yeshi/utils/tencentcloud/COSManager.java
@@ -172,7 +172,7 @@
         return false;
     }
 
-    public boolean deleteFile(String url) {
+    public boolean deleteFileByUrl(String url) {
         String key = url.replace(String.format("https://%s.file.myqcloud.com", totalBucketName), "");
         try {
             cosClient.deleteObject(totalBucketName, key);
@@ -182,6 +182,15 @@
         return false;
     }
 
+    public boolean deleteFileByKey(String key) {
+        try {
+            cosClient.deleteObject(totalBucketName, key);
+            return true;
+        } catch (Exception e) {
+        }
+        return false;
+    }
+
     public static String getUploadVideoUrl(String name) {
         if (name != null && !name.startsWith("/"))
             name = "/" + name;
diff --git a/src/main/java/org/yeshi/utils/wx/WXAppLoginUtil.java b/src/main/java/org/yeshi/utils/wx/WXAppLoginUtil.java
index 2d18928..ba4d186 100644
--- a/src/main/java/org/yeshi/utils/wx/WXAppLoginUtil.java
+++ b/src/main/java/org/yeshi/utils/wx/WXAppLoginUtil.java
@@ -1,7 +1,6 @@
 package org.yeshi.utils.wx;
 
-import org.json.JSONException;
-import org.json.JSONObject;
+import net.sf.json.JSONObject;
 import org.yeshi.utils.HttpUtil;
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.entity.wx.WeiXinUser;
@@ -23,12 +22,8 @@
     public static WeiXinUser getWeiXinUser(WeiXinUserParam param) {
         String result = HttpUtil.getAsString(String.format(weiXinUrl2, param.getAccessToken(), param.getOpenId()),
                 "ISO-8859-1", "UTF-8");
-        JSONObject jsonObject = null;
-        try {
-            jsonObject = new JSONObject(result);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
+        JSONObject jsonObject = JSONObject.fromObject(result);
+
         String nickname = jsonObject.optString("nickname");
         String province = jsonObject.optString("province");
         String city = jsonObject.optString("city");
@@ -64,12 +59,8 @@
 
     private static WeiXinUserParam parseWeiXinUserParam(String result) {
         WeiXinUserParam weiXinUserParam = new WeiXinUserParam();
-        JSONObject jsonObject = null;
-        try {
-            jsonObject = new JSONObject(result);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
+        JSONObject jsonObject = JSONObject.fromObject(result);
+
         String openId = jsonObject.optString("openid");
         if ("".equals(openId)) {
             return null;
diff --git a/src/main/resources/generater/admin/add.ftl b/src/main/resources/generater/admin/add.ftl
index 5c2a16e..a9c8825 100644
--- a/src/main/resources/generater/admin/add.ftl
+++ b/src/main/resources/generater/admin/add.ftl
@@ -8,13 +8,16 @@
     <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>
+    <link rel="stylesheet" href="/admin/css/font.css">
+    <link rel="stylesheet" href="/admin/css/xadmin.css">
+    <link rel="stylesheet" href="/admin/css/theme3049.min.css">
+
+    <script src="/admin/lib/layui/layui.js" charset="utf-8"></script>
+    <script src="/admin/js/vue.min.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/xadmin.js" type="text/javascript"></script>
+    <script src="/admin/js/http.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/jquery.min.js" type="text/javascript"></script>
+    <script src="/admin/js/utils.js"></script>
     <!-- 璁㊣E8/9鏀寔濯掍綋鏌ヨ锛屼粠鑰屽吋瀹规爡鏍� -->
     <!--[if lt IE 9]>
     <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
@@ -83,7 +86,7 @@
                 auto: false,
                 accept: 'images',
                 acceptMime: 'image/*',
-                field: "file_${value.key}",
+                field: "file_url",
                 choose: function (obj) {
                     //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
                     var files = obj.pushFile();
@@ -106,10 +109,10 @@
                     if (res.code == 0) {
                         //鑾峰彇閾炬帴
                         $("input[name='${value.key}']").val(res.data.url);
-                        delete chooseImage["${value.key}"];
-                        if (Object.keys(chooseImage).length == 0) {
+                        delete uploadTool.chooseImage["${value.key}"];
+                        if (Object.keys(uploadTool.chooseImage).length == 0) {
                             //鍏ㄩ儴涓婁紶鎴愬姛
-                            callback();
+                            uploadTool.callback(true);
                         }
                     } else {
                         layer.msg(res.msg);
@@ -125,7 +128,7 @@
 
         },
         upload: function (result) {
-            if (this.uploadArray.length > 0) {
+            if (this.uploadArray.length > 0 && Object.keys(this.chooseImage).length > 0) {
                 this.callback = result;
                 //鍚屾椂涓婁紶
                 for (var i = 0; i < this.uploadArray.length; i++) {
@@ -159,14 +162,13 @@
         uploadTool.init(upload);
 
         <#list rowsList as row >
-               <#if (row.type=="Text" && (row.params.inputType=="DATE"||row.params.inputType=="DATETIME"))>
+            <#if (row.type=="Text" && (row.params.inputType=="DATE"||row.params.inputType=="DATETIME"))>
                     laydate.render({
-                          elem: "intput[name=${row.key}]", //鎸囧畾鍏冪礌
-                          type: ${row.params.inputType?lower_case}
+                        elem: "input[name=${row.key}]", //鎸囧畾鍏冪礌
+                        type: '${row.params.inputType?lower_case}'
                     });
-               </#if>
+            </#if>
         </#list>
-
 
         //鐩戝惉鎻愪氦
         form.on('submit(add)',
@@ -185,7 +187,12 @@
                             data.field[onkeys[0]][onkeys[1]] = value;
                         }
                     }
-                    uploadTool.upload(function () {
+                    uploadTool.upload(function (hasFile) {
+                        if (hasFile) {
+                            //浠庢柊鎻愪氦琛ㄥ崟
+                            $("button[lay-filter=add]").click();
+                            return;
+                        }
                         //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
                         ksapp.post('${addApi}', data.field, function (res) {
                             if (res.code == 0) {
diff --git a/src/main/resources/generater/admin/adminController.template b/src/main/resources/generater/admin/adminController.template
index 4a64762..eee5247 100644
--- a/src/main/resources/generater/admin/adminController.template
+++ b/src/main/resources/generater/admin/adminController.template
@@ -18,6 +18,10 @@
 import ${entity.clazz};
 import ${service.clazz};
 import ${query.clazz};
+<#if adminVO??>
+import ${adminVO.clazz};
+</#if>
+
 <#if responseBody>
 <#else>
 import java.io.PrintWriter;
@@ -82,7 +86,18 @@
     <#if add>
     ${responseBody?string("@ResponseBody","")}
     @RequestMapping("add")
-    public ${responseBody?string("String","void")} add(${entity.name} bean, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
+
+     <#if adminVO??>
+    public ${responseBody?string("String","void")} add(${adminVO.name} vo,AcceptAdminData acceptAdminData${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
+        try{
+            ${serviceObjName}.add(vo.toEntity(acceptAdminData.getSystem()));
+            <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
+        }catch(Exception e){
+            <@print data="JsonUtil.loadFalseResult(e.getMessage())" > </@print>
+        }
+    }
+     <#else>
+    public ${responseBody?string("String","void")} add(${entity.name} bean, AcceptAdminData acceptAdminData${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         try{
             ${serviceObjName}.add(bean);
             <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
@@ -91,10 +106,11 @@
         }
     }
     </#if>
+    </#if>
 
     ${responseBody?string("@ResponseBody","")}
     @RequestMapping("get")
-    public ${responseBody?string("String","void")} get(${identifyIdType} id, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
+    public ${responseBody?string("String","void")} get(${identifyIdType} id, AcceptAdminData acceptAdminData${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         ${entity.name} entity = ${serviceObjName}.get(id);
         if (entity !=null){
             <@print data="JsonUtil.loadTrueResult(entity)" > </@print>
@@ -107,7 +123,23 @@
     <#if update>
     ${responseBody?string("@ResponseBody","")}
     @RequestMapping("update")
-    public ${responseBody?string("String","void")} update(${entity.name} bean, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
+    <#if adminVO??>
+
+    public ${responseBody?string("String","void")} update( ${adminVO.name} vo ,AcceptAdminData acceptAdminData${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
+        if (vo.getId() == null) {
+           <@print data="JsonUtil.loadFalseResult(\"ID涓嶈兘涓虹┖\")" > </@print>
+        }
+        try{
+            ${serviceObjName}.update(vo.toEntity(null));
+        }catch(Exception e){
+            <@print data="JsonUtil.loadFalseResult(e.getMessage())" > </@print>
+        }
+        <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
+    }
+
+    <#else>
+
+    public ${responseBody?string("String","void")} update( ${entity.name} bean , AcceptAdminData acceptAdminData${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         if (bean.getId() == null) {
            <@print data="JsonUtil.loadFalseResult(\"ID涓嶈兘涓虹┖\")" > </@print>
         }
@@ -119,6 +151,7 @@
         <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
     }
     </#if>
+    </#if>
 
 
 }
diff --git a/src/main/resources/generater/admin/adminVO.template b/src/main/resources/generater/admin/adminVO.template
index 887ab7a..3f0b18d 100644
--- a/src/main/resources/generater/admin/adminVO.template
+++ b/src/main/resources/generater/admin/adminVO.template
@@ -9,8 +9,6 @@
 <#list columns as column >
    <#if column.type=='Date'>
     private String ${column.columnName};
-   <#elseif column.type=='Boolean'>
-    private String ${column.columnName};
    <#else>
     private ${column.type} ${column.columnName};
    </#if>
@@ -21,8 +19,6 @@
         <#list columns as column >
           <#if column.type=='Date'>
         entity.${column.setColumnMehtodName}(new Date(TimeUtil.convertToTimeTemp(${column.columnName}, "yyyy-MM-dd HH:mm:ss")));
-         <#elseif column.type=='Boolean'>
-        entity.${column.setColumnMehtodName}("on".equalsIgnoreCase(${column.columnName}) ? true : false);
          <#else>
         entity.${column.setColumnMehtodName}(${column.columnName});
           </#if>
@@ -36,8 +32,6 @@
         <#list columns as column >
          <#if column.type=='Date'>
         vo.${column.setColumnMehtodName}(TimeUtil.getGernalTime(entity.${column.columnMehtod}.getTime(), "yyyy-MM-dd HH:mm:ss"));
-         <#elseif column.type=='Boolean'>
-        vo.${column.setColumnMehtodName}(entity.${column.columnMehtod} ? "on" : null);
           <#else>
         vo.${column.setColumnMehtodName}(entity.${column.columnMehtod});
           </#if>
@@ -47,14 +41,6 @@
 
     <#list columns as column >
      <#if column.type=='Date'>
-     public String ${column.columnMehtod} {
-        return ${column.columnName};
-     }
-
-      public void ${column.setColumnMehtodName}(String ${column.columnName}) {
-        this.${column.columnName} = ${column.columnName};
-      }
-      <#elseif column.type=='Boolean'>
      public String ${column.columnMehtod} {
         return ${column.columnName};
      }
diff --git a/src/main/resources/generater/admin/form/checkBox.ftl b/src/main/resources/generater/admin/form/checkBox.ftl
index 12488e2..516a5f6 100644
--- a/src/main/resources/generater/admin/form/checkBox.ftl
+++ b/src/main/resources/generater/admin/form/checkBox.ftl
@@ -1 +1 @@
-                            <input type="checkbox" name="${value.key}" title="${value.value}">
\ No newline at end of file
+                            <input type="checkbox" name="${value.key}" title="${value.value}" value="true">
\ 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 4bedf20..9388f09 100644
--- a/src/main/resources/generater/admin/form/img.ftl
+++ b/src/main/resources/generater/admin/form/img.ftl
@@ -1,5 +1,5 @@
                         <#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> " />
+                        <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 > max-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>
diff --git a/src/main/resources/generater/admin/list.ftl b/src/main/resources/generater/admin/list.ftl
index fe300e6..9cf9bd1 100644
--- a/src/main/resources/generater/admin/list.ftl
+++ b/src/main/resources/generater/admin/list.ftl
@@ -8,14 +8,16 @@
     <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>
+    <link rel="stylesheet" href="/admin/css/font.css">
+    <link rel="stylesheet" href="/admin/css/xadmin.css">
+    <link rel="stylesheet" href="/admin/css/theme3049.min.css">
+
+    <script src="/admin/lib/layui/layui.js" charset="utf-8"></script>
+    <script src="/admin/js/vue.min.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/xadmin.js" type="text/javascript"></script>
+    <script src="/admin/js/http.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/jquery.min.js" type="text/javascript"></script>
+    <script src="/admin/js/utils.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>
diff --git a/src/main/resources/generater/admin/update.ftl b/src/main/resources/generater/admin/update.ftl
index 4134409..d695d9a 100644
--- a/src/main/resources/generater/admin/update.ftl
+++ b/src/main/resources/generater/admin/update.ftl
@@ -8,13 +8,16 @@
     <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>
+    <link rel="stylesheet" href="/admin/css/font.css">
+    <link rel="stylesheet" href="/admin/css/xadmin.css">
+    <link rel="stylesheet" href="/admin/css/theme3049.min.css">
+
+    <script src="/admin/lib/layui/layui.js" charset="utf-8"></script>
+    <script src="/admin/js/vue.min.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/xadmin.js" type="text/javascript"></script>
+    <script src="/admin/js/http.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/admin/js/jquery.min.js" type="text/javascript"></script>
+    <script src="/admin/js/utils.js"></script>
     <!-- 璁㊣E8/9鏀寔濯掍綋鏌ヨ锛屼粠鑰屽吋瀹规爡鏍� -->
     <!--[if lt IE 9]>
     <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
@@ -83,7 +86,7 @@
                 auto: false,
                 accept: 'images',
                 acceptMime: 'image/*',
-                field: "file_${value.key}",
+                field: "file_url",
                 choose: function (obj) {
                     //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
                     var files = obj.pushFile();
@@ -106,10 +109,10 @@
                     if (res.code == 0) {
                         //鑾峰彇閾炬帴
                         $("input[name='${value.key}']").val(res.data.url);
-                        delete chooseImage["${value.key}"];
-                        if (Object.keys(chooseImage).length == 0) {
+                        delete uploadTool.chooseImage["${value.key}"];
+                        if (Object.keys(uploadTool.chooseImage).length == 0) {
                             //鍏ㄩ儴涓婁紶鎴愬姛
-                            callback();
+                            uploadTool.callback(true);
                         }
                     } else {
                         layer.msg(res.msg);
@@ -125,7 +128,7 @@
 
         },
         upload: function (result) {
-            if (this.uploadArray.length > 0) {
+            if (this.uploadArray.length > 0&&Object.keys(this.chooseImage).length>0) {
                 this.callback = result;
                 //鍚屾椂涓婁紶
                 for (var i = 0; i < this.uploadArray.length; i++) {
@@ -180,8 +183,8 @@
         <#list rowsList as row >
             <#if (row.type=="Text" && (row.params.inputType=="DATE"||row.params.inputType=="DATETIME"))>
                     laydate.render({
-                        elem: "intput[name=${row.key}]", //鎸囧畾鍏冪礌
-                        type: ${row.params.inputType?lower_case}
+                        elem: "input[name=${row.key}]", //鎸囧畾鍏冪礌
+                        type: '${row.params.inputType?lower_case}'
                     });
             </#if>
         </#list>
@@ -211,7 +214,12 @@
                             data.field[onkeys[0]][onkeys[1]] = value;
                         }
                     }
-                    uploadTool.upload(function () {
+                    uploadTool.upload(function (hasFile) {
+                        if (hasFile) {
+                            //浠庢柊鎻愪氦琛ㄥ崟
+                            $("button[lay-filter=update]").click();
+                            return;
+                        }
                         //鍙戝紓姝ワ紝鎶婃暟鎹彁浜ょ粰php
                         var params = data.field;
                         params.id = ksapp.getQueryParam("id");
diff --git a/src/main/resources/schemas/generator.dtd b/src/main/resources/schemas/generator.dtd
index 046b776..596bea4 100644
--- a/src/main/resources/schemas/generator.dtd
+++ b/src/main/resources/schemas/generator.dtd
@@ -19,7 +19,7 @@
         <!ATTLIST service interPackage CDATA #REQUIRED>
         <!ATTLIST service implPackage CDATA #REQUIRED>
         <!ATTLIST service queryPackage CDATA #REQUIRED>
-        <!ATTLIST service adminVOPackage CDATA #IMPLIED>
+
 
 
         <!ELEMENT exception  EMPTY>
@@ -37,6 +37,7 @@
         <!ATTLIST controller mapping CDATA #REQUIRED>
         <!ATTLIST controller responseBody (true|false) "true">
         <!ATTLIST controller jsonp (true|false) "true">
+        <!ATTLIST controller adminVOPackage CDATA #IMPLIED>
 
 
         <!ELEMENT pages  (list?,add?,update?)>
diff --git a/src/main/resources/test.xml b/src/main/resources/test.xml
new file mode 100644
index 0000000..00a2986
--- /dev/null
+++ b/src/main/resources/test.xml
@@ -0,0 +1,88 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE generator-config  PUBLIC "-//yeshitv.com//DTD generator_code 1.0//EN"
+        "http://192.168.3.122:8848/buwan-web/dtd/generator.dtd">
+
+<generator-config class="org.yeshi.utils.generater.TestEntity3">
+    <dao package="com.generater.test.mapper" mapperDir="D:/workspace/server/utils/src/test/java/mapper">
+        <queryList>
+            <query name="nickName" type="contains"></query>
+        </queryList>
+    </dao>
+    <service interPackage="com.generater.test.service.inter" implPackage="com.generater.test.service.impl"
+             queryPackage="com.generater.test.query">
+        <exception package="com.generater.test.exception"></exception>
+    </service>
+    <admin>
+        <controller package="com.generater.test.controller.admin" mapping="/test" />
+        <pages title="娴嬭瘯" pageDir="D:/workspace/server/utils/src/test/java/html">
+            <list fileName="list.html">
+                <searchForm>
+                    <columns>
+                        <column property="nickName" title="鏄电О">
+                            <text inputType="TEXT" maxLength="100"></text>
+                        </column>
+                    </columns>
+                </searchForm>
+
+                <columns>
+                    <column property="id" title="ID" showType="TEXT"></column>
+                    <column property="nickName" title="鏄电О" showType="TEXT"></column>
+                    <column property="sex" title="鎬у埆" showType="TEXT"></column>
+                    <column property="portrait" title="澶村儚" showType="IMG"></column>
+                </columns>
+            </list>
+            <add fileName="add.html">
+                <column property="nickName" title="鏄电О">
+                    <text inputType="TEXT" dateFormat="" placeHolder="">
+                        <verify type="regex" express="*" require="true" notify=""></verify>
+                    </text>
+                </column>
+                <column property="sex" title="鎬у埆">
+                    <select>
+                        <values>
+                            <value key="0">鏈煡</value>
+                            <value key="1">鐢�</value>
+                            <value key="2">濂�</value>
+                        </values>
+                    </select>
+
+
+                </column>
+
+                <column property="province" title="鐪佷唤">
+                    <select>
+                        <api path="api/getCountrys">
+                            <params>
+                                <value key="cq">閲嶅簡</value>
+                                <value key="sc">鍥涘窛</value>
+                            </params>
+                        </api>
+                        <verify type="none" require="true"></verify>
+                    </select>
+                </column>
+
+                <column property="show" title="鏄惁鏄剧ず">
+                    <switch></switch>
+                </column>
+
+                <column property="portrait" title="澶村儚">
+                    <img enable="false" editLink="true">
+                        <api path="/api/uploadImg">
+                            <params>
+                                <value key="type">portrait</value>
+                            </params>
+                        </api>
+                    </img>
+                </column>
+            </add>
+            <update fileName="update.html">
+                <column property="nickName" title="鏄电О">
+                    <text inputType="TEXT">
+                        <verify type="regex" express="*" require="true" notify=""></verify>
+                    </text>
+                </column>
+            </update>
+        </pages>
+
+    </admin>
+</generator-config>
\ 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 f7d2b62..f618df0 100644
--- a/src/test/java/com/generater/GeneratorTest.java
+++ b/src/test/java/com/generater/GeneratorTest.java
@@ -4,9 +4,11 @@
 import org.yeshi.utils.FileUtil;
 import org.yeshi.utils.FreemarkerUtils;
 import org.yeshi.utils.generater.GeneraterUtil;
+import org.yeshi.utils.generater.TestEntity3;
 import org.yeshi.utils.generater.entity.ClassInfo;
 import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
 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.ExceptionVO;
 import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
@@ -49,7 +51,9 @@
         //
 //        boolean match = Pattern.matches("^(https://){1}.*(\\.m3u8)$", "https://n1.szjal.cn/20210805/qnDXhXBa/index.m3u8123");
 //        System.out.println(match);
-        generater();
+//        generater();
+       String sql =  MyBatisMapperUtil.createSQL(TestEntity3.class);
+       System.out.println(sql);
     }
 
     private static void generateAdminPage() throws Exception {
diff --git a/src/test/java/com/generater/TestEntity2.java b/src/test/java/com/generater/TestEntity2.java
index e99b2ea..9608f5c 100644
--- a/src/test/java/com/generater/TestEntity2.java
+++ b/src/test/java/com/generater/TestEntity2.java
@@ -25,6 +25,7 @@
 @Table("table_test")
 public class TestEntity2 {
     @Id
+    @Column(name="id")
     private String id;
 
     @Column(name="nick_name")

--
Gitblit v1.8.0