From fac5d01bfcddfc8edef0a5fd3d401b1fe383fe16 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期二, 29 三月 2022 16:48:15 +0800
Subject: [PATCH] 采用配置文件自动化生成代码

---
 src/main/java/org/yeshi/utils/generater/GeneraterManager.java                                |   12 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoData.java                        |   39 
 src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java                              |  391 +++++++++
 src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java                 |  279 ++++++
 src/main/resources/schemas/generator.dtd                                                     |  110 ++
 src/main/java/org/yeshi/utils/generater/util/NameUtil.java                                   |   32 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java                  |    6 
 src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java                             |   45 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentImg.java        |   52 +
 src/main/resources/generater/admin/adminController.template                                  |   62 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/GenertorConfig.java                     |   50 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminData.java                    |   28 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminPageData.java                |   57 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentRadioGroup.java |   26 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ColumnData.java                   |   86 ++
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentText.java       |   86 ++
 src/test/test.xml                                                                            |   88 ++
 src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java                     |    4 
 src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminControllerInfoVO.java       |   26 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/SearchFormData.java               |   43 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSwitch.java     |   13 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java          |   59 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java                 |  425 +++++++++
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/ApiData.java                       |   30 
 src/test/java/com/generater/GeneratorTest.java                                               |   14 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java              |   29 
 src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java                           |   42 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ListPageData.java                 |   85 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoQuery.java                       |   31 
 src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java                              |    3 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AddPageData.java                  |   44 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/VerifyData.java                    |   52 +
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSelect.java     |   46 +
 src/main/java/org/yeshi/utils/generater/TestEntity3.java                                     |   91 ++
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/FormComponent.java                 |   38 
 src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java                        |   11 
 src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/UpdatePageData.java               |   44 +
 37 files changed, 2,496 insertions(+), 83 deletions(-)

diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
index ed8d621..87d4a31 100644
--- a/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterManager.java
@@ -10,6 +10,7 @@
 import org.yeshi.utils.generater.params.AdminGeneraterParams;
 import org.yeshi.utils.generater.params.DaoGeneraterParams;
 import org.yeshi.utils.generater.params.ServiceGeneraterParams;
+import org.yeshi.utils.generater.util.NameUtil;
 import org.yeshi.utils.generater.vo.ExceptionVO;
 import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
 import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
@@ -17,6 +18,7 @@
 import org.yeshi.utils.generater.vo.service.QueryVO;
 import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
 import org.yeshi.utils.generater.vo.service.ServiceInfoVO;
+import org.yeshi.utils.generater.vo.xmlconfig.GenertorConfig;
 import org.yeshi.utils.mongo.MongodbBaseDao;
 import org.yeshi.utils.mybatis.BaseMapper;
 
@@ -44,6 +46,7 @@
 
     private String classRootDir;
     private Class entity;
+
 
     public static GeneraterManager getInstance() {
         if (instance == null)
@@ -104,7 +107,8 @@
      * @param: packageName
      **/
     public MongoDBDaoVO createDao(String packageName) throws Exception {
-        String daoName = entity.getSimpleName() + "Dao";
+
+        String daoName = NameUtil.getDefaultDaoName(entity);
         String path = getDirPath(packageName);
         MongoDBDaoVO vo = new MongoDBDaoVO.Builder()
                 .setBaseDao(new ClassInfo(MongodbBaseDao.class.getSimpleName(), MongodbBaseDao.class.getName()))
@@ -125,7 +129,7 @@
      * @param: mapperDir
      **/
     public MyBatisDBDaoVO createMapper(String packageName, String mapperDir) throws Exception {
-        String mapperName = entity.getSimpleName() + "Mapper";
+        String mapperName =  NameUtil.getDefaultMapperName(entity);
         String path = getDirPath(packageName);
         MyBatisDBDaoVO vo = new MyBatisDBDaoVO.Builder()
                 .setBaseMapper(new ClassInfo(BaseMapper.class.getSimpleName(), BaseMapper.class.getName()))
@@ -172,7 +176,7 @@
 
 
         //鍒涘缓service鎺ュ彛
-        String serviceName = entity.getSimpleName() + "Service";
+        String serviceName = NameUtil.getDefaultServiceName(entity);
         String path = getDirPath(interPackageName);
         ServiceInfoVO vo = new ServiceInfoVO.Builder()
                 .setPackageName(interPackageName)
@@ -184,7 +188,7 @@
         saveFile(result, new File(path, serviceName + ".java").getAbsolutePath());
 
         //鍒涘缓service瀹炵幇
-        String serviceImplName = entity.getSimpleName() + "ServiceImpl";
+        String serviceImplName = NameUtil.getDefaultServiceImplName(entity);
         path = getDirPath(implPackageName);
         ServiceImplInfoVO implVO = new ServiceImplInfoVO.Builder()
                 .setDao(dao)
diff --git a/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java b/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
new file mode 100644
index 0000000..959dadc
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
@@ -0,0 +1,391 @@
+package org.yeshi.utils.generater;
+
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.yeshi.utils.FileUtil;
+import org.yeshi.utils.StringUtil;
+import org.yeshi.utils.generater.entity.ClassInfo;
+import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
+import org.yeshi.utils.generater.mybatis.Table;
+import org.yeshi.utils.generater.util.NameUtil;
+import org.yeshi.utils.generater.vo.ExceptionVO;
+import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
+import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
+import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
+import org.yeshi.utils.generater.vo.service.QueryVO;
+import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
+import org.yeshi.utils.generater.vo.service.ServiceInfoVO;
+import org.yeshi.utils.generater.vo.xmlconfig.GenertorConfig;
+import org.yeshi.utils.mongo.MongodbBaseDao;
+import org.yeshi.utils.mybatis.BaseMapper;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+
+/**
+ * @author Administrator
+ * @title: GeneraterManager
+ * @description: 鑷姩鍖栦唬鐮佺敓鎴愮鐞嗗櫒(閲囩敤瑙f瀽xml閰嶇疆鏂囦欢鐨勫舰寮�)
+ * @date 2021/10/13 14:48
+ */
+
+/**
+ * Title
+ *
+ * @Description //TODO
+ * @Author hxh
+ * @Date 18:11 2021/10/13
+ **/
+public class GeneraterManagerV2 {
+
+    private static GeneraterManagerV2 instance;
+
+    private String classRootDir;
+    private GenertorConfig config;
+
+    public static GeneraterManagerV2 getInstance() {
+        if (instance == null)
+            instance = new GeneraterManagerV2();
+        return instance;
+    }
+
+
+    public void init(String classRootDir, GenertorConfig config) {
+        this.classRootDir = classRootDir;
+        this.config = config;
+    }
+
+    //鑾峰彇鏂囦欢澶圭殑璺緞
+    private String getDirPath(String packageName) {
+        File f = new File(classRootDir);
+        if (!f.exists()) {
+            f.mkdirs();
+        }
+        f = new File(f.getAbsolutePath(), packageName.replace(".", "/"));
+        if (!f.exists()) {
+            f.mkdirs();
+        }
+        return f.getAbsolutePath();
+    }
+
+    /**
+     * @return void
+     * @author hxh
+     * @description 淇濆瓨鏂囦欢
+     * @date 10:06 2021/10/14
+     * @param: data
+     * @param: path
+     **/
+    private void saveFile(String data, String path) throws IOException {
+        if (!new File(path).exists())
+            new File(path).createNewFile();
+        FileUtil.saveAsFileByte(data.getBytes("UTF-8"), path);
+    }
+
+    public void createException(Class base) throws Exception {
+        if (config.getService().getException() == null) {
+            throw new Exception("灏氭湭閰嶇疆寮傚父淇℃伅");
+        }
+
+        String path = getDirPath(config.getService().getException().getPkg());
+        try {
+            ExceptionVO vo = new ExceptionVO.Builder().setEntity(config.getEntity()).setPackageName(config.getService().getException().getPkg()).setBase(new ClassInfo(base.getSimpleName(), base.getName())).build();
+            String result = GeneraterUtil.createException(vo);
+            //淇濆瓨
+            saveFile(result, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void createDao() throws Exception {
+
+        Annotation[] as = config.getEntity().getAnnotations();
+        for (Annotation a : as) {
+            if (a instanceof Table) {
+                createMapper();
+                break;
+            } else if (a instanceof Document) {
+                createMongoDBDao();
+                break;
+            }
+        }
+    }
+
+    /**
+     * @return org.yeshi.utils.generater.vo.dao.MongoDBDaoVO
+     * @author hxh
+     * @description 鑷姩鐢熸垚Dao
+     * @date 18:24 2021/10/13
+     * @param: packageName
+     **/
+    public MongoDBDaoVO createMongoDBDao() throws Exception {
+        if (config.getDao() == null) {
+            throw new Exception("灏氭湭閰嶇疆Dao淇℃伅");
+        }
+
+        String daoName = NameUtil.getDefaultDaoName(config.getEntity());
+        String path = getDirPath(config.getDao().getPkg());
+        MongoDBDaoVO vo = new MongoDBDaoVO.Builder()
+                .setBaseDao(new ClassInfo(MongodbBaseDao.class.getSimpleName(), MongodbBaseDao.class.getName()))
+                .setDao(new ClassInfo(daoName, config.getDao().getPkg() + "." + daoName))
+                .setEntity(config.getEntity()).setDaoData(config.getDao()).build();
+        String result = GeneraterUtil.createMongoDBDao(vo);
+        //淇濆瓨
+        saveFile(result, new File(path, daoName + ".java").getAbsolutePath());
+        return vo;
+    }
+
+    /**
+     * @return org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO
+     * @author hxh
+     * @description 鑷姩鐢熸垚Mapper
+     * @date 18:24 2021/10/13
+     * @param: packageName
+     * @param: mapperDir
+     **/
+    public MyBatisDBDaoVO createMapper() throws Exception {
+        if (config.getDao() == null) {
+            throw new Exception("灏氭湭閰嶇疆Dao淇℃伅");
+        }
+
+        if (StringUtil.isNullOrEmpty(config.getDao().getMapperDir())) {
+            throw new Exception("Mapper瀛樻斁鐩綍涓虹┖");
+        }
+
+        String mapperName = NameUtil.getDefaultMapperName(config.getEntity());
+        String path = getDirPath(config.getDao().getPkg());
+        MyBatisDBDaoVO vo = new MyBatisDBDaoVO.Builder()
+                .setBaseMapper(new ClassInfo(BaseMapper.class.getSimpleName(), BaseMapper.class.getName()))
+                .setMapper(new ClassInfo(mapperName, config.getDao().getPkg() + "." + mapperName))
+                .setEntity(config.getEntity())
+                .setDaoData(config.getDao())
+                .build();
+
+        String result = GeneraterUtil.createMybatisDBMapper(vo);
+        //淇濆瓨
+        saveFile(result, new File(path, mapperName + ".java").getAbsolutePath());
+        if (!new File(config.getDao().getMapperDir()).exists())
+            new File(config.getDao().getMapperDir()).mkdirs();
+        result = GeneraterUtil.createMybatisDBMapperXML(vo);
+        saveFile(result, new File(config.getDao().getMapperDir(), mapperName + ".xml").getAbsolutePath());
+        return vo;
+    }
+
+    /**
+     * @return org.yeshi.utils.generater.vo.service.QueryVO
+     * @author hxh
+     * @description /鍒涘缓鏌ヨQuery
+     * @date 18:24 2021/10/13
+     * @param: packageName
+     **/
+    public QueryVO createQuery(String packageName) throws Exception {
+        //鍒涘缓Query
+        String path = getDirPath(packageName);
+        QueryVO queryVO = new QueryVO.Builder().setEntity(config.getEntity()).setPackageName(packageName).build();
+        String result = GeneraterUtil.createQuery(queryVO);
+        saveFile(result, new File(path, queryVO.getClassName() + ".java").getAbsolutePath());
+        return queryVO;
+    }
+
+    /**
+     * @return org.yeshi.utils.generater.vo.service.ServiceInfoVO
+     * @author hxh
+     * @description 鑷姩鐢熸垚鏈嶅姟
+     * @date 18:23 2021/10/13
+     * @param: interPackageName
+     * @param: implPackageName
+     * @param: query
+     * @param: dao
+     **/
+    public ServiceInfoVO createService(ClassInfo dao) throws Exception {
+
+        if (config.getService() == null) {
+            throw new Exception("灏氭湭閰嶇疆service");
+        }
+
+        if (config.getDao() == null && dao == null) {
+            throw new Exception("璇峰湪xml涓厤缃瓺ao锛屾垨鑰呬紶鍏ao淇℃伅");
+        }
+
+        if (dao == null) {
+            if (StringUtil.isNullOrEmpty(config.getDao().getMapperDir())) {
+                String daoName = NameUtil.getDefaultDaoName(config.getEntity());
+                dao = new ClassInfo(daoName, config.getDao().getPkg() + "." + daoName);
+            } else {
+                String daoName = NameUtil.getDefaultMapperName(config.getEntity());
+                dao = new ClassInfo(daoName, config.getDao().getPkg() + "." + daoName);
+            }
+        }
+
+        QueryVO queryVO = createQuery(config.getService().getQueryPackage());
+
+        ClassInfo query = new ClassInfo(queryVO.getClassName(), queryVO.getPackageName() + "." + queryVO.getClassName());
+
+        //鍒涘缓service鎺ュ彛
+        String serviceName = NameUtil.getDefaultServiceName(config.getEntity());
+        String path = getDirPath(config.getService().getInterPackage());
+        ServiceInfoVO vo = new ServiceInfoVO.Builder()
+                .setPackageName(config.getService().getInterPackage())
+                .setEntity(config.getEntity())
+                .setQuery(query)
+                .setService(new ClassInfo(serviceName, config.getService().getInterPackage() + "." + serviceName))
+                .build();
+        String result = GeneraterUtil.createService(vo);
+        saveFile(result, new File(path, serviceName + ".java").getAbsolutePath());
+
+        //鍒涘缓service瀹炵幇
+        String serviceImplName = NameUtil.getDefaultServiceImplName(config.getEntity());
+        path = getDirPath(config.getService().getImplPackage());
+        ServiceImplInfoVO implVO = new ServiceImplInfoVO.Builder()
+                .setDao(dao)
+                .setPackageName(config.getService().getImplPackage())
+                .setEntity(config.getEntity())
+                .setQuery(query)
+                .setService(new ClassInfo(serviceName, config.getService().getInterPackage() + "." + serviceName))
+                .setDaoQuery(new ClassInfo("DaoQuery", dao.getClazz() + ".DaoQuery"))
+                .build();
+        result = GeneraterUtil.createServiceImpl(implVO);
+        saveFile(result, new File(path, serviceImplName + ".java").getAbsolutePath());
+        return vo;
+    }
+
+
+    /**
+     * @return void
+     * @author hxh
+     * @description 鑷姩鐢熸垚绠$悊妯″潡
+     * @date 18:23 2021/10/13
+     * @param: controllerPackage
+     * @param: htmlDir
+     * @param: query
+     * @param: service
+     **/
+    public void createAdmin(ClassInfo query, ClassInfo service) throws Exception {
+        if (config.getAdmin() == null) {
+            throw new Exception("灏氭湭閰嶇疆admin");
+        }
+
+        if (service == null) {
+            if (config.getService() == null) {
+                throw new Exception("璇蜂紶鍏ervice鎴栬�呭湪xml涓厤缃畇ervice");
+            }
+            String serviceName = NameUtil.getDefaultServiceName(config.getEntity());
+            service = new ClassInfo(serviceName, config.getService().getInterPackage() + "." + serviceName);
+        }
+
+        if (query == null) {
+            if (config.getService() == null) {
+                throw new Exception("璇蜂紶鍏ervice鎴栬�呭湪xml涓厤缃畇ervice");
+            }
+            String queryName = NameUtil.getDefaultQueryName(config.getEntity());
+            query = new ClassInfo(queryName, config.getService().getQueryPackage() + "." + queryName);
+        }
+
+
+        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();
+        String controllerName = vo.getControllerName();
+        //鐢熸垚controller
+        String result = GeneraterUtil.createAdminController(vo);
+        saveFile(result, new File(path, controllerName + ".java").getAbsolutePath());
+
+
+        if (!new File(generaterInfo.getPageDir()).exists()) {
+            new File(generaterInfo.getPageDir()).mkdirs();
+        }
+
+        String htmlNamePrefix = getHtmlNameFromEntityName(config.getEntity().getSimpleName());
+
+        if (generaterInfo.getShowDataList() != null && generaterInfo.getShowDataList().size() > 0) {
+            result = GeneraterUtil.createAdminPageForList(generaterInfo);
+            saveFile(result, new File(generaterInfo.getPageDir(), generaterInfo.getListFileName() != null ? generaterInfo.getListFileName() : htmlNamePrefix + "_list.html").getAbsolutePath());
+        }
+
+        if (config.getAdmin().getPages().getAdd() != null && generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
+            result = GeneraterUtil.createAdminPageForAdd(generaterInfo);
+            saveFile(result, new File(generaterInfo.getPageDir(), generaterInfo.getAddFileName() != null ? generaterInfo.getAddFileName() : htmlNamePrefix + "_add.html").getAbsolutePath());
+        }
+
+        if (config.getAdmin().getPages().getUpdate() != null && generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0) {
+            result = GeneraterUtil.createAdminPageForUpdate(generaterInfo);
+            saveFile(result, new File(generaterInfo.getPageDir(), generaterInfo.getUpdateFileName() != null ? generaterInfo.getUpdateFileName() : htmlNamePrefix + "_update.html").getAbsolutePath());
+        }
+    }
+
+
+    /**
+     * @return void
+     * @author hxh
+     * @description 鍒涘缓鏁翠釜鍔熻兘妯″潡
+     * @date 18:19 2021/10/13
+     * @param: daoParams
+     * @param: serviceParams
+     * @param: adminParams
+     **/
+    public void createWholeFunction() throws Exception {
+        Annotation[] as = config.getEntity().getAnnotations();
+        int type = -1;
+        for (Annotation a : as) {
+            if (a instanceof Table) {
+                type = 1;
+                break;
+            } else if (a instanceof Document) {
+                type = 2;
+                break;
+            }
+        }
+        if (type == -1) {
+            throw new Exception("瀹炰綋鏈厤缃甿ybatis鎴栬�卪ongodb");
+        }
+
+        createDao();
+        createService(null);
+        createAdmin(null, null);
+    }
+
+    /**
+     * @return java.lang.String
+     * @author hxh
+     * @description 閫氳繃entity鐨勫悕绉拌幏鍙杊tml鏂囦欢鐨勫墠缂�鍚嶇О
+     * @date 18:25 2021/10/13
+     * @param: entityName
+     **/
+    private static String getHtmlNameFromEntityName(String entityName) {
+        StringBuffer sb = new StringBuffer();
+        StringBuffer buffer = null;
+        for (int i = 0; i < entityName.length(); i++) {
+            if (entityName.charAt(i) >= 65 && entityName.charAt(i) <= 90) {
+                //澶у啓瀛楁瘝
+                if (buffer == null)
+                    buffer = new StringBuffer();
+                buffer.append(entityName.charAt(i));
+            } else {
+                if (buffer != null) {
+                    sb.append("_" + buffer.toString().toLowerCase());
+                    buffer = null;
+                }
+                sb.append(entityName.charAt(i));
+            }
+        }
+
+        if (buffer != null) {
+            sb.append("_" + buffer.toString().toLowerCase());
+        }
+
+        if (sb.charAt(0) == '_')
+            sb = sb.replace(0, 1, "");
+        return sb.toString();
+    }
+
+
+    public static void main(String[] args) {
+        System.out.print(getHtmlNameFromEntityName("TTestEEntity"));
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/TestEntity3.java b/src/main/java/org/yeshi/utils/generater/TestEntity3.java
new file mode 100644
index 0000000..275d9db
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/TestEntity3.java
@@ -0,0 +1,91 @@
+package org.yeshi.utils.generater;
+
+import org.springframework.data.annotation.Id;
+import org.yeshi.utils.generater.mybatis.Column;
+import org.yeshi.utils.generater.mybatis.Table;
+
+import java.util.Date;
+
+/**
+ * @author Administrator
+ * @title: TestEntity
+ * @description: 娴嬭瘯entity
+ * @date 2021/9/23 14:22
+ */
+@Table("table_test")
+public class TestEntity3 {
+    @Id
+    private String id;
+
+    @Column(name = "nick_name")
+    private String nickName;
+
+    private Integer type;
+
+    private Integer sex;
+
+    private String portrait;
+
+    private String province;
+
+    private Date createTime;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getPortrait() {
+        return portrait;
+    }
+
+    public void setPortrait(String portrait) {
+        this.portrait = portrait;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+
+}
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 480ad85..ab34430 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
@@ -1,11 +1,18 @@
 package org.yeshi.utils.generater.entity.admin;
 
 import org.yeshi.utils.generater.annotation.admin.AdminController;
+import org.yeshi.utils.generater.annotation.admin.form.*;
+import org.yeshi.utils.generater.entity.KeyValue;
 import org.yeshi.utils.generater.util.AnotationUtil;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.AdminControllerData;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.AdminData;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.ColumnData;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.SearchFormData;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.form.*;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
 
 import java.lang.annotation.Annotation;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author Administrator
@@ -18,7 +25,7 @@
     //entity绫�
     private Class entity;
     //controller娉ㄨВ瀵硅薄
-    private AdminController controllerData;
+    private AdminControllerData controllerData;
     //淇敼鐨勮〃鍗曡鏁版嵁
     private List<FormRowData> updateFormRows;
     //娣诲姞鐨勮〃鍗曡鏁版嵁
@@ -28,6 +35,24 @@
 
     private List<Map<String, Object>> showDataList;
 
+    private String title;
+    private String pageDir;
+    private String listFileName;
+    private String addFileName;
+    private String updateFileName;
+
+    private boolean delete;
+    private boolean add;
+    private boolean edit;
+
+
+    public String getPageDir() {
+        return pageDir;
+    }
+
+    public void setPageDir(String pageDir) {
+        this.pageDir = pageDir;
+    }
 
     public Class getEntity() {
         return entity;
@@ -37,11 +62,11 @@
         this.entity = entity;
     }
 
-    public AdminController getControllerData() {
+    public AdminControllerData getControllerData() {
         return controllerData;
     }
 
-    public void setControllerData(AdminController controllerData) {
+    public void setControllerData(AdminControllerData controllerData) {
         this.controllerData = controllerData;
     }
 
@@ -77,13 +102,75 @@
         this.showDataList = showDataList;
     }
 
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getListFileName() {
+        return listFileName;
+    }
+
+    public void setListFileName(String listFileName) {
+        this.listFileName = listFileName;
+    }
+
+    public String getAddFileName() {
+        return addFileName;
+    }
+
+    public void setAddFileName(String addFileName) {
+        this.addFileName = addFileName;
+    }
+
+    public String getUpdateFileName() {
+        return updateFileName;
+    }
+
+    public void setUpdateFileName(String updateFileName) {
+        this.updateFileName = updateFileName;
+    }
+
+    public boolean isDelete() {
+        return delete;
+    }
+
+    public void setDelete(boolean delete) {
+        this.delete = delete;
+    }
+
+    public boolean isAdd() {
+        return add;
+    }
+
+    public void setAdd(boolean add) {
+        this.add = add;
+    }
+
+    public boolean isEdit() {
+        return edit;
+    }
+
+    public void setEdit(boolean edit) {
+        this.edit = edit;
+    }
 
     public static class Builder {
 
         private Class entity;
 
+        private AdminData adminData;
+
         public Builder setEntityClass(Class clazz) {
             this.entity = clazz;
+            return this;
+        }
+
+        public Builder setAdminData(AdminData adminData) {
+            this.adminData = adminData;
             return this;
         }
 
@@ -91,24 +178,180 @@
             if (entity == null) {
                 throw new Exception("灏氭湭璁剧疆entity");
             }
-            //鏌ヨ鏄惁闇�瑕佺敓鎴愮鐞嗙晫闈笌controller
-            Annotation[] ans = entity.getAnnotations();
-            for (Annotation an : ans) {
-                if (an instanceof AdminController) {
-                    Class searchFormClass = ((AdminController) an).searchForm();
-                    AdminGeneraterInfo info = new AdminGeneraterInfo();
-                    info.setEntity(entity);
-                    info.setControllerData((AdminController) an);
-                    info.setSearchFormRows(AnotationUtil.getFormRowData(searchFormClass));
-                    info.setAddFormRows(AnotationUtil.getFormRowData(entity));
-                    info.setUpdateFormRows(AnotationUtil.getUpdateFormRowData(entity));
-                    info.setShowDataList(AnotationUtil.getShowDataList(entity));
-                    return info;
+
+            if (adminData != null) {
+                //xml閰嶇疆鏂囦欢鏂瑰紡鐢熸垚
+                AdminGeneraterInfo info = new AdminGeneraterInfo();
+                info.setEntity(entity);
+                info.setControllerData(adminData.getController());
+                info.setTitle(adminData.getPages().getTitle());
+                info.setPageDir(adminData.getPages().getPageDir());
+                info.setEdit(adminData.getPages().getList().isEdit());
+                info.setDelete(adminData.getPages().getList().isDelete());
+                info.setAdd(adminData.getPages().getAdd() != null);
+
+
+                if (adminData.getPages().getList() != null) {
+                    info.setListFileName(adminData.getPages().getList().getFileName());
+                    if (adminData.getPages().getList().getSearchForm() != null) {
+                        List<FormRowData> searchFormList = new ArrayList<>();
+                        for (ColumnData columnData : adminData.getPages().getList().getSearchForm().getColumns()) {
+                            FormRowData rowData = getFormRowData(columnData);
+                            searchFormList.add(rowData);
+                        }
+                        info.setSearchFormRows(searchFormList);
+                    }
+
+                    List<Map<String, Object>> showList = new ArrayList<>();
+
+                    for (ColumnData columnData : adminData.getPages().getList().getColumns()) {
+                        Map<String, Object> map = new HashMap<>();
+                        map.put("identifier", columnData.getProperty());
+                        map.put("title", columnData.getTitle());
+                        map.put("order", columnData.getOrder());
+                        map.put("imgWidth", columnData.getImgWidth());
+                        map.put("imgHeight", columnData.getImgHeight());
+                        map.put("showType", columnData.getShowType().name());
+                        showList.add(map);
+                    }
+
+                    Comparator<Map<String, Object>> cm = (Map<String, Object> o1, Map<String, Object> o2) -> {
+                        return (int) (o1.get("order")) - (int) (o2.get("order"));
+                    };
+                    Collections.sort(showList, cm);
+                    info.setShowDataList(showList);
+                }
+
+                if (adminData.getPages().getAdd() != null) {
+                    info.setAddFileName(adminData.getPages().getAdd().getFileName());
+                    List<FormRowData> rowList = new ArrayList<>();
+                    for (ColumnData columnData : adminData.getPages().getAdd().getColumns()) {
+                        FormRowData rowData = getFormRowData(columnData);
+                        rowList.add(rowData);
+                    }
+                    info.setAddFormRows(rowList);
+                }
+
+                if (adminData.getPages().getUpdate() != null) {
+                    info.setUpdateFileName(adminData.getPages().getUpdate().getFileName());
+                    List<FormRowData> rowList = new ArrayList<>();
+                    for (ColumnData columnData : adminData.getPages().getUpdate().getColumns()) {
+                        FormRowData rowData = getFormRowData(columnData);
+                        rowList.add(rowData);
+                    }
+                    info.setUpdateFormRows(rowList);
+                }
+
+                return info;
+            } else {
+                //娉ㄨВ鏂瑰紡鐢熸垚
+                //鏌ヨ鏄惁闇�瑕佺敓鎴愮鐞嗙晫闈笌controller
+                Annotation[] ans = entity.getAnnotations();
+                for (Annotation an : ans) {
+                    if (an instanceof AdminController) {
+                        Class searchFormClass = ((AdminController) an).searchForm();
+                        AdminGeneraterInfo info = new AdminGeneraterInfo();
+                        info.setEntity(entity);
+
+                        AdminControllerData adminControllerData = new AdminControllerData();
+                        AdminController adminController = (AdminController) an;
+                        adminControllerData.setMapping(adminController.mapping());
+                        adminControllerData.setResponseBody(true);
+                        adminControllerData.setPkg(null);
+                        adminControllerData.setJsonp(false);
+
+                        info.setEdit(adminController.edit());
+                        info.setDelete(adminController.delete());
+                        info.setAdd(true);
+
+                        info.setControllerData(adminControllerData);
+                        info.setSearchFormRows(AnotationUtil.getFormRowData(searchFormClass));
+                        info.setAddFormRows(AnotationUtil.getFormRowData(entity));
+                        info.setUpdateFormRows(AnotationUtil.getUpdateFormRowData(entity));
+                        info.setShowDataList(AnotationUtil.getShowDataList(entity));
+                        return info;
+                    }
                 }
             }
             return null;
         }
 
+        private FormRowData getFormRowData(ColumnData columnData) {
+            FormRowData rowData = new FormRowData();
+            rowData.setKey(columnData.getProperty());
+            FormComponent component = columnData.getComponent();
+            Map<String, Object> params = new HashMap<>();
+            params.put("desc", component.getDesc());
+            params.put("disable", !component.isEnable());
+            params.put("title", columnData.getTitle());
+            if (component instanceof FormComponentText) {
+                rowData.setType(Text.class.getSimpleName());
+
+                FormComponentText formComponentText = (FormComponentText) component;
+                params.put("dateFormat", formComponentText.getDateFormat());
+                params.put("inputType", formComponentText.getInputType().name());
+                params.put("maxLength", formComponentText.getMaxLength() == null ? -1 : formComponentText.getMaxLength());
+                params.put("minLength", formComponentText.getMinLength() == null ? -1 : formComponentText.getMinLength());
+                params.put("placeHolder", formComponentText.getPlaceHolder());
+                if (formComponentText.getVerify() != null) {
+                    params.put("require", formComponentText.getVerify().isRequire());
+                    params.put("verifyType", formComponentText.getVerify().getType());
+                    params.put("verifyValue", formComponentText.getVerify().getExpress());
+                    params.put("verifyNotifyMsg", formComponentText.getVerify().getNotify());
+                }
+
+            } else if (component instanceof FormComponentRadioGroup) {
+                rowData.setType(RadioGroup.class.getSimpleName());
+                FormComponentRadioGroup formComponentRadioGroup = (FormComponentRadioGroup) component;
+                Map<String, Object> map = formComponentRadioGroup.getValues();
+                List<KeyValue> list = new ArrayList<>();
+                for (Iterator<String> its = map.keySet().iterator(); its.hasNext(); ) {
+                    String key = its.next();
+                    list.add(new KeyValue(key, map.get(key) + ""));
+                }
+                params.put("values", list);
+            } else if (component instanceof FormComponentImg) {
+                rowData.setType(Img.class.getSimpleName());
+                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) + ""));
+                    }
+                    params.put("uploadApiParams", list);
+                }
+            } else if (component instanceof FormComponentSwitch) {
+                rowData.setType(Switch.class.getSimpleName());
+            } else if (component instanceof FormComponentSelect) {
+                rowData.setType(Select.class.getSimpleName());
+                FormComponentSelect formComponentSelect = (FormComponentSelect) component;
+                if (formComponentSelect.getApi() != null) {
+                    params.put("apiPath", formComponentSelect.getApi().getPath());
+                    List<KeyValue> list = new ArrayList<>();
+                    for (Iterator<String> its = formComponentSelect.getApi().getParams().keySet().iterator(); its.hasNext(); ) {
+                        String key = its.next();
+                        list.add(new KeyValue(key, formComponentSelect.getApi().getParams().get(key) + ""));
+                    }
+                    params.put("apiParams", list);
+                }
+
+                if (formComponentSelect.getValues() != null) {
+                    List<KeyValue> list = new ArrayList<>();
+                    for (Iterator<String> its = formComponentSelect.getValues().keySet().iterator(); its.hasNext(); ) {
+                        String key = its.next();
+                        list.add(new KeyValue(key, formComponentSelect.getValues().get(key) + ""));
+                    }
+                    params.put("values", list);
+                }
+            }
+            rowData.setParams(params);
+            return rowData;
+        }
+
     }
 
 
diff --git a/src/main/java/org/yeshi/utils/generater/util/NameUtil.java b/src/main/java/org/yeshi/utils/generater/util/NameUtil.java
new file mode 100644
index 0000000..be3c69c
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/util/NameUtil.java
@@ -0,0 +1,32 @@
+package org.yeshi.utils.generater.util;
+
+/**
+ * @author hxh
+ * @title: NameUtil
+ * @description: 鍙栧悕宸ュ叿绫�
+ * @date 2022/3/29 15:59
+ */
+public class NameUtil {
+
+    public static String getDefaultDaoName(Class entity) {
+        return entity.getSimpleName() + "Dao";
+    }
+
+    public static String getDefaultMapperName(Class entity) {
+        return entity.getSimpleName() + "Mapper";
+    }
+
+    public static String getDefaultServiceName(Class entity) {
+        return entity.getSimpleName() + "Service";
+    }
+
+    public static String getDefaultQueryName(Class entity) {
+        return entity.getSimpleName() + "Query";
+    }
+
+    public static String getDefaultServiceImplName(Class entity) {
+        return entity.getSimpleName() + "ServiceImpl";
+    }
+
+
+}
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 a90b56a..124e173 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
@@ -19,6 +19,8 @@
     private ClassInfo service;
     private ClassInfo query;
     private boolean jsonp;
+
+    private boolean responseBody;
     //涓婚敭绫诲瀷
     private String identifyIdType;
 
@@ -38,6 +40,8 @@
         private ClassInfo query;
         //
         private ClassInfo service;
+
+        private boolean responseBody;
 
 
         public Builder setAdminInfo(AdminGeneraterInfo generaterInfo) {
@@ -60,6 +64,11 @@
             return this;
         }
 
+        public Builder setResponseBody(boolean responseBody) {
+            this.responseBody = responseBody;
+            return this;
+        }
+
         public AdminControllerInfoVO build() throws Exception {
             if (generaterInfo == null) {
                 throw new Exception("generaterInfo涓嶈兘涓虹┖");
@@ -75,15 +84,16 @@
             }
 
             AdminControllerInfoVO vo = new AdminControllerInfoVO();
-            vo.setMapping(generaterInfo.getControllerData().mapping());
+            vo.setMapping(generaterInfo.getControllerData().getMapping());
             vo.setEntity(new ClassInfo(generaterInfo.getEntity().getSimpleName(), generaterInfo.getEntity().getName()));
-            vo.setJsonp(generaterInfo.getControllerData().jsonp());
+            vo.setJsonp(generaterInfo.getControllerData().isJsonp());
             vo.setPackageName(packageName);
             vo.setQueryVO(query);
             vo.setService(service);
             vo.setAdd(generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0);
-            vo.setUpdate(generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0 && generaterInfo.getControllerData().edit());
-            vo.setDelete(generaterInfo.getControllerData().delete());
+            vo.setUpdate(generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0 );
+            vo.setDelete(true);
+            vo.setResponseBody(generaterInfo.getControllerData().isResponseBody());
 
             vo.setIdentifyIdType(EntityUtil.getIdentifyId(generaterInfo.getEntity()).getType().getSimpleName());
             vo.setControllerName(vo.getEntity().getName() + "AdminController");
@@ -184,4 +194,12 @@
     public void setDelete(boolean delete) {
         this.delete = delete;
     }
+
+    public boolean isResponseBody() {
+        return responseBody;
+    }
+
+    public void setResponseBody(boolean responseBody) {
+        this.responseBody = responseBody;
+    }
 }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
index 049eb12..c8292a7 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
@@ -40,9 +40,9 @@
 
         public FormAddInfoVO build() {
             FormAddInfoVO vo = new FormAddInfoVO();
-            vo.setAddApi(generaterInfo.getControllerData().mapping() + "/add");
+            vo.setAddApi(generaterInfo.getControllerData().getMapping() + "/add");
             vo.setRowsList(generaterInfo.getAddFormRows());
-            vo.setTitle("鏂板" + generaterInfo.getControllerData().title());
+            vo.setTitle("鏂板" + generaterInfo.getTitle());
             //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
             List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
             for (FormRowData row : vo.getRowsList()) {
diff --git a/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
index ffaf0ea..04da1ed 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
@@ -41,10 +41,10 @@
 
         public FormUpdateInfoVO build() {
             FormUpdateInfoVO vo = new FormUpdateInfoVO();
-            vo.setUpdateApi(generaterInfo.getControllerData().mapping() + "/update");
-            vo.setDetailApi(generaterInfo.getControllerData().mapping() + "/get");
+            vo.setUpdateApi(generaterInfo.getControllerData().getMapping() + "/update");
+            vo.setDetailApi(generaterInfo.getControllerData().getMapping() + "/get");
             vo.setRowsList(generaterInfo.getUpdateFormRows());
-            vo.setTitle("淇敼" + generaterInfo.getControllerData().title());
+            vo.setTitle("淇敼" + generaterInfo.getTitle());
             //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
             List<FormInputRegexVerifyVO> verifyVOList = new ArrayList<>();
             for (FormRowData row : vo.getRowsList()) {
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 e4f1496..2432a60 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
@@ -51,7 +51,7 @@
 
         public ListInfoVO build() {
             ListInfoVO vo = new ListInfoVO();
-            vo.setListApi(generaterInfo.getControllerData().mapping() + "/list");
+            vo.setListApi(generaterInfo.getControllerData().getMapping() + "/list");
             if (generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
                 vo.setAddPagePath(generaterInfo.getEntity().getSimpleName().toLowerCase() + "_add.html");
             }
@@ -61,10 +61,10 @@
             }
             vo.setSearchFormRows(generaterInfo.getSearchFormRows());
             vo.setShowFileds(generaterInfo.getShowDataList());
-            vo.setTitle(generaterInfo.getControllerData().title());
+            vo.setTitle(generaterInfo.getTitle());
 
-            if (generaterInfo.getControllerData().delete()) {
-                vo.setDeleteApi(generaterInfo.getControllerData().mapping() + "/delete");
+            if (generaterInfo.isDelete()) {
+                vo.setDeleteApi(generaterInfo.getControllerData().getMapping() + "/delete");
             }
 
             //閬嶅巻闇�瑕佹鍒欒〃杈惧紡鐨凾ext鎴栬�匱extArea
@@ -132,6 +132,9 @@
                 if (layVerify.endsWith("|"))
                     layVerify = layVerify.substring(0, layVerify.length() - 1);
                 //閲嶆柊璧嬪�硷紝琛ㄥ崟涓洿鎺ュ彇鍊�
+                if (row.getParams() == null) {
+                    row.setParams(new HashMap<>());
+                }
                 row.getParams().put("verifyValue", layVerify);
             }
 
diff --git a/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java b/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
index 9bc53a3..159938f 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
@@ -5,6 +5,8 @@
 import org.yeshi.utils.StringUtil;
 import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
 import org.yeshi.utils.generater.entity.*;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoQuery;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
@@ -31,6 +33,8 @@
         private Class entity;
         private ClassInfo dao;
 
+        private DaoData daoData;
+
         public Builder setBaseDao(ClassInfo baseDao) {
             this.baseDao = baseDao;
             return this;
@@ -43,6 +47,11 @@
 
         public Builder setDao(ClassInfo dao) {
             this.dao = dao;
+            return this;
+        }
+
+        public Builder setDaoData(DaoData daoData) {
+            this.daoData = daoData;
             return this;
         }
 
@@ -95,16 +104,34 @@
                 }
 
                 //鑾峰彇鏌ヨ鏉′欢
-                for (Annotation a : as) {
-                    if (a instanceof DaoQueryCondition) {
-                        MybatisColumnData columnData=new MybatisColumnData(columName);
-                        if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
-                            daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName),columnData, fd.getType().getSimpleName(),  DaoQueryCondition.QueryType.lt));
-                            daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName),columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
-                        } else {
-                            daoQueryColumnList.add(new DaoQueryColumnData(columName,columnData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
+
+                if (daoData != null) {
+                    //鏌ヨ鏉′欢浠庡閮ㄤ紶鍏�
+                    for (DaoQuery query : daoData.getQueryList()) {
+                        if (query.getName().equalsIgnoreCase(columName)) {
+                            MybatisColumnData columnData = new MybatisColumnData(columName);
+                            if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
+                                daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
+                                daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
+                            } else {
+                                daoQueryColumnList.add(new DaoQueryColumnData(columName, columnData, fd.getType().getSimpleName(), query.getQueryType()));
+                            }
                         }
-                        break;
+                    }
+
+                } else {
+                    //鏍规嵁娉ㄨВ璁剧疆鐨勬煡璇㈡潯浠�
+                    for (Annotation a : as) {
+                        if (a instanceof DaoQueryCondition) {
+                            MybatisColumnData columnData = new MybatisColumnData(columName);
+                            if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
+                                daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
+                                daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
+                            } else {
+                                daoQueryColumnList.add(new DaoQueryColumnData(columName, columnData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
+                            }
+                            break;
+                        }
                     }
                 }
 
diff --git a/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java b/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
index aba2762..b86b3bc 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
@@ -9,6 +9,8 @@
 import org.yeshi.utils.generater.mybatis.ColumnParseUtil;
 import org.yeshi.utils.generater.mybatis.Table;
 import org.yeshi.utils.generater.vo.ExceptionVO;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoQuery;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
@@ -28,11 +30,13 @@
     private List<DaoQueryColumnData> queryList;
     private String table;
 
+
     public static class Builder {
 
         private ClassInfo baseMapper;
         private Class entity;
         private ClassInfo mapper;
+        private DaoData daoData;
 
         public Builder setBaseMapper(ClassInfo baseMapper) {
             this.baseMapper = baseMapper;
@@ -46,6 +50,11 @@
 
         public Builder setMapper(ClassInfo mapper) {
             this.mapper = mapper;
+            return this;
+        }
+
+        public Builder setDaoData(DaoData daoData) {
+            this.daoData = daoData;
             return this;
         }
 
@@ -133,16 +142,31 @@
                 columlist.add(columData);
 
 
-                //鑾峰彇鏌ヨ鏉′欢
-                for (Annotation a : as) {
-                    if (a instanceof DaoQueryCondition) {
-                        if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
-                            daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
-                            daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
-                        } else {
-                            daoQueryColumnList.add(new DaoQueryColumnData(columData.getProperty(), columData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
+                if (daoData != null) {
+                    //鏌ヨ鏉′欢浠庡閮ㄤ紶鍏�
+                    for (DaoQuery query : daoData.getQueryList()) {
+                        if (query.getName().equalsIgnoreCase(columData.getProperty())) {
+                            if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
+                                daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
+                                daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
+                            } else {
+                                daoQueryColumnList.add(new DaoQueryColumnData(columData.getProperty(), columData, fd.getType().getSimpleName(), query.getQueryType()));
+                            }
                         }
-                        break;
+                    }
+
+                } else {
+                    //鑾峰彇娉ㄨВ鏌ヨ鏉′欢
+                    for (Annotation a : as) {
+                        if (a instanceof DaoQueryCondition) {
+                            if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
+                                daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
+                                daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
+                            } else {
+                                daoQueryColumnList.add(new DaoQueryColumnData(columData.getProperty(), columData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
+                            }
+                            break;
+                        }
                     }
                 }
             }
diff --git a/src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java b/src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java
index 796b659..b55747b 100644
--- a/src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java
+++ b/src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java
@@ -2,6 +2,7 @@
 
 import org.yeshi.utils.generater.entity.BaseData;
 import org.yeshi.utils.generater.util.EntityUtil;
+import org.yeshi.utils.generater.util.NameUtil;
 
 import java.lang.reflect.Field;
 
@@ -41,7 +42,7 @@
             }
             QueryVO vo = new QueryVO();
             vo.setPackageName(packageName);
-            vo.setClassName(entity.getSimpleName() + "Query");
+            vo.setClassName(NameUtil.getDefaultQueryName(entity));
             return vo;
         }
 
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/GenertorConfig.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/GenertorConfig.java
new file mode 100644
index 0000000..73c46cf
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/GenertorConfig.java
@@ -0,0 +1,50 @@
+package org.yeshi.utils.generater.vo.xmlconfig;
+
+import org.yeshi.utils.generater.vo.xmlconfig.admin.AdminData;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData;
+import org.yeshi.utils.generater.vo.xmlconfig.service.ServiceData;
+
+/**
+ * @author hxh
+ * @title: GenertorConfig
+ * @description: xml鏄犲皠鐨勬暟鎹В鏋愮粨鏋�
+ * @date 2022/3/28 11:53
+ */
+public class GenertorConfig {
+    private Class entity;
+    private DaoData dao;
+    private ServiceData service;
+    private AdminData admin;
+
+    public Class getEntity() {
+        return entity;
+    }
+
+    public void setEntity(Class entity) {
+        this.entity = entity;
+    }
+
+    public DaoData getDao() {
+        return dao;
+    }
+
+    public void setDao(DaoData dao) {
+        this.dao = dao;
+    }
+
+    public ServiceData getService() {
+        return service;
+    }
+
+    public void setService(ServiceData service) {
+        this.service = service;
+    }
+
+    public AdminData getAdmin() {
+        return admin;
+    }
+
+    public void setAdmin(AdminData admin) {
+        this.admin = admin;
+    }
+}
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
new file mode 100644
index 0000000..0ba0094
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java
@@ -0,0 +1,425 @@
+package org.yeshi.utils.generater.vo.xmlconfig;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+import org.yeshi.utils.generater.GeneraterManagerV2;
+import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+import org.yeshi.utils.generater.annotation.admin.Show;
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.*;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.form.*;
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+import org.yeshi.utils.generater.vo.xmlconfig.base.VerifyData;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData;
+import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoQuery;
+import org.yeshi.utils.generater.vo.xmlconfig.service.ExceptionData;
+import org.yeshi.utils.generater.vo.xmlconfig.service.ServiceData;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author hxh
+ * @title: XmlConfigParseUtil
+ * @description: xml閰嶇疆鏂囦欢瑙f瀽宸ュ叿绫�
+ * @date 2022/3/28 15:02
+ */
+public class XmlConfigParseUtil {
+
+    public static GenertorConfig parse(InputStream inputStream) throws IOException, ParserConfigurationException, SAXException, ClassNotFoundException {
+        if (inputStream == null) {
+            throw new FileNotFoundException();
+        }
+        GenertorConfig genertorConfig = new GenertorConfig();
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        Document root = builder.parse(inputStream);
+        NodeList nodelist = root.getElementsByTagName("generator-config");
+        Node rootNode = nodelist.item(0);
+        String clazz = rootNode.getAttributes().getNamedItem("class").getNodeValue();
+        genertorConfig.setEntity(Class.forName(clazz));
+
+        nodelist = rootNode.getChildNodes();
+        for (int i = 0; i < nodelist.getLength(); i++) {
+            Node node = nodelist.item(i);
+
+            switch (node.getNodeName()) {
+                case "dao": {
+                    genertorConfig.setDao(parseDao(node));
+                }
+                break;
+                case "service": {
+                    genertorConfig.setService(parseService(node));
+                }
+                break;
+                case "admin": {
+                    genertorConfig.setAdmin(parseAdmin(node));
+                }
+                break;
+
+
+            }
+
+
+        }
+
+
+        return genertorConfig;
+    }
+
+    private static DaoData parseDao(Node node) {
+        DaoData daoData = new DaoData();
+        daoData.setPkg(node.getAttributes().getNamedItem("package").getNodeValue());
+        daoData.setMapperDir(getNodeAttributeValue(node, "mapperDir"));
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            if (nodeList.item(i).getNodeName().equalsIgnoreCase("queryList")) {
+                nodeList = nodeList.item(i).getChildNodes();
+                List<DaoQuery> queryList = new ArrayList<>();
+                for (int j = 0; j < nodeList.getLength(); j++) {
+                    Node node1 = nodeList.item(j);
+                    if (node1.getNodeName().equalsIgnoreCase("query")) {
+                        DaoQuery daoQuery = new DaoQuery();
+                        daoQuery.setName(getNodeAttributeValue(node1, "name"));
+                        daoQuery.setQueryType(DaoQueryCondition.QueryType.valueOf(getNodeAttributeValue(node1, "type")));
+                        queryList.add(daoQuery);
+                    }
+                }
+                daoData.setQueryList(queryList);
+                break;
+            }
+        }
+        return daoData;
+    }
+
+    private static ServiceData parseService(Node node) {
+        ServiceData data = new ServiceData();
+        data.setInterPackage(getNodeAttributeValue(node, "interPackage"));
+        data.setImplPackage(getNodeAttributeValue(node, "implPackage"));
+        data.setQueryPackage(getNodeAttributeValue(node, "queryPackage"));
+
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            if (nodeList.item(i).getNodeName().equalsIgnoreCase("exception")) {
+                ExceptionData exceptionData = new ExceptionData();
+                exceptionData.setPkg(getNodeAttributeValue(nodeList.item(i), "package"));
+                exceptionData.setName(getNodeAttributeValue(nodeList.item(i), "name"));
+                data.setException(exceptionData);
+                break;
+            }
+        }
+        return data;
+    }
+
+    private static AdminData parseAdmin(Node node) {
+        AdminData adminData = new AdminData();
+
+        //瑙f瀽page鏁版嵁
+
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+
+            switch (nodeList.item(i).getNodeName()) {
+
+                case "pages": {
+                    Node node1 = nodeList.item(i);
+                    AdminPageData adminPageData = new AdminPageData();
+                    adminPageData.setTitle(getNodeAttributeValue(node1, "title"));
+                    adminPageData.setPageDir(getNodeAttributeValue(node1, "pageDir"));
+                    NodeList nodeList1 = node1.getChildNodes();
+                    for (int i1 = 0; i1 < nodeList1.getLength(); i1++) {
+                        Node node2 = nodeList1.item(i1);
+                        switch (node2.getNodeName()) {
+                            case "list": {
+                                ListPageData listPageData = new ListPageData();
+                                listPageData.setDelete(Boolean.parseBoolean(getNodeAttributeValue(node2, "delete")));
+                                listPageData.setEdit(Boolean.parseBoolean(getNodeAttributeValue(node2, "edit")));
+                                listPageData.setPage(Boolean.parseBoolean(getNodeAttributeValue(node2, "page")));
+                                listPageData.setFileName(getNodeAttributeValue(node2, "fileName"));
+
+                                NodeList nodeList2 = node2.getChildNodes();
+                                for (int i2 = 0; i2 < nodeList2.getLength(); i2++) {
+                                    Node node3 = nodeList2.item(i2);
+                                    if (node3.getNodeName().equalsIgnoreCase("searchForm")) {
+                                        SearchFormData searchFormData = new SearchFormData();
+                                        NodeList nodeList3 = node3.getChildNodes();
+                                        for (int i3 = 0; i3 < nodeList3.getLength(); i3++) {
+                                            if (nodeList3.item(i3).getNodeName().equalsIgnoreCase("columns")) {
+                                                searchFormData.setColumns(parseColumns(nodeList3.item(i3)));
+                                                break;
+                                            }
+                                        }
+                                        searchFormData.setPkg(getNodeAttributeValue(node3, "package"));
+                                        searchFormData.setName(getNodeAttributeValue(node3, "name"));
+                                        listPageData.setSearchForm(searchFormData);
+                                    } else if (node3.getNodeName().equalsIgnoreCase("columns")) {
+                                        listPageData.setColumns(parseColumns(node3));
+                                    }
+                                }
+                                adminPageData.setList(listPageData);
+                            }
+                            break;
+
+                            case "add": {
+                                AddPageData addPageData = new AddPageData();
+                                addPageData.setColumns(parseColumns(node2));
+                                addPageData.setApi(null);
+                                addPageData.setFileName(getNodeAttributeValue(node2, "fileName"));
+                                adminPageData.setAdd(addPageData);
+
+                            }
+                            break;
+
+                            case "update": {
+                                UpdatePageData updatePageData = new UpdatePageData();
+                                updatePageData.setColumns(parseColumns(node2));
+                                updatePageData.setApi(null);
+                                updatePageData.setFileName(getNodeAttributeValue(node2, "fileName"));
+                                adminPageData.setUpdate(updatePageData);
+                            }
+                            break;
+                        }
+                    }
+                    adminData.setPages(adminPageData);
+                }
+                break;
+
+                case "controller": {
+                    Node node1 = nodeList.item(i);
+                    AdminControllerData adminControllerData = new AdminControllerData();
+                    adminControllerData.setJsonp(Boolean.parseBoolean(getNodeAttributeValue(node1, "jsonp")));
+                    adminControllerData.setMapping(getNodeAttributeValue(node1, "mapping"));
+                    adminControllerData.setName(getNodeAttributeValue(node1, "name"));
+                    adminControllerData.setPkg(getNodeAttributeValue(node1, "package"));
+                    adminControllerData.setResponseBody(Boolean.parseBoolean(getNodeAttributeValue(node1, "responseBody")));
+                    adminData.setController(adminControllerData);
+                }
+                break;
+            }
+        }
+
+
+        return adminData;
+    }
+
+    private static String getNodeAttributeValue(Node node, String attr) {
+        if (node.getAttributes().getNamedItem(attr) != null) {
+            return node.getAttributes().getNamedItem(attr).getNodeValue();
+        }
+        return null;
+    }
+
+    private static List<ColumnData> parseColumns(Node node) {
+        List<ColumnData> list = new ArrayList<>();
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            Node node1 = nodeList.item(i);
+            if (node1.getNodeName().equalsIgnoreCase("column")) {
+                list.add(parseColumn(node1));
+            }
+        }
+        return list;
+    }
+
+    private static ColumnData parseColumn(Node node) {
+        ColumnData columnData = new ColumnData();
+        columnData.setTitle(getNodeAttributeValue(node, "title"));
+        columnData.setProperty(getNodeAttributeValue(node, "property"));
+        String order = getNodeAttributeValue(node, "order");
+        if (order != null) {
+            columnData.setOrder(Integer.parseInt(order));
+        }
+
+        String showType = getNodeAttributeValue(node, "showType");
+        if (showType != null) {
+            columnData.setShowType(Show.ShowType.valueOf(showType));
+        }
+
+        columnData.setImgHeight(Integer.parseInt(getNodeAttributeValue(node, "imgHeight")));
+        columnData.setImgWidth(Integer.parseInt(getNodeAttributeValue(node, "imgWidth")));
+
+
+        NodeList nodeList = node.getChildNodes();
+        if (nodeList != null) {
+            for (int i = 0; i < nodeList.getLength(); i++) {
+                FormComponent formComponent = parseFormComponent(nodeList.item(i));
+                if (formComponent != null) {
+                    columnData.setComponent(formComponent);
+                    break;
+                }
+            }
+        }
+
+
+        return columnData;
+    }
+
+
+    private static FormComponent parseFormComponent(Node node) {
+
+        switch (node.getNodeName()) {
+
+            case "text": {
+                FormComponentText formComponentText = new FormComponentText();
+                formComponentText.setDateFormat(getNodeAttributeValue(node, "dateFormat"));
+                formComponentText.setDesc(getNodeAttributeValue(node, "desc"));
+                formComponentText.setInputType(Text.Type.valueOf(getNodeAttributeValue(node, "inputType")));
+                String maxLength = getNodeAttributeValue(node, "maxLength");
+                String minlength = getNodeAttributeValue(node, "minlength");
+                if (maxLength != null) {
+                    formComponentText.setMaxLength(Integer.parseInt(maxLength));
+                }
+
+                if (minlength != null) {
+                    formComponentText.setMinLength(Integer.parseInt(minlength));
+                }
+
+                formComponentText.setPlaceHolder(getNodeAttributeValue(node, "placeHolder"));
+                formComponentText.setTextArea(Boolean.parseBoolean(getNodeAttributeValue(node, "isTextArea")));
+
+                formComponentText.setEnable(Boolean.parseBoolean(getNodeAttributeValue(node, "enable")));
+                formComponentText.setNotify(getNodeAttributeValue(node, "notify"));
+
+                NodeList nodeList = node.getChildNodes();
+                for (int i = 0; i < nodeList.getLength(); i++) {
+                    if (nodeList.item(i).getNodeName().equalsIgnoreCase("verify")) {
+                        formComponentText.setVerify(parseVerify(nodeList.item(i)));
+                    }
+                }
+                return formComponentText;
+            }
+            case "select": {
+                FormComponentSelect select = new FormComponentSelect();
+                NodeList nodeList = node.getChildNodes();
+                for (int i = 0; i < nodeList.getLength(); i++) {
+                    switch (nodeList.item(i).getNodeName()) {
+                        case "api": {
+                            select.setApi(parseApi(nodeList.item(i)));
+                        }
+                        break;
+                        case "values": {
+                            select.setValues(parseValues(nodeList.item(i)));
+                        }
+                        break;
+                        case "verify": {
+                            select.setVerify(parseVerify(nodeList.item(i)));
+                        }
+                        break;
+                    }
+                }
+
+                select.setEnable(Boolean.parseBoolean(getNodeAttributeValue(node, "enable")));
+                select.setNotify(getNodeAttributeValue(node, "notify"));
+
+                return select;
+            }
+            case "switch": {
+                FormComponentSwitch formComponentSwitch = new FormComponentSwitch();
+                formComponentSwitch.setEnable(Boolean.parseBoolean(getNodeAttributeValue(node, "enable")));
+                formComponentSwitch.setNotify(getNodeAttributeValue(node, "notify"));
+                return formComponentSwitch;
+            }
+            case "img": {
+                FormComponentImg img = new FormComponentImg();
+                img.setEditLink(Boolean.parseBoolean(getNodeAttributeValue(node, "editLink")));
+
+                NodeList nodeList = node.getChildNodes();
+                for (int i = 0; i < nodeList.getLength(); i++) {
+                    if (nodeList.item(i).getNodeName().equalsIgnoreCase("api")) {
+                        img.setApi(parseApi(nodeList.item(i)));
+                        break;
+                    }
+                }
+
+                String height = getNodeAttributeValue(node, "height");
+                if (height != null) {
+                    img.setHeight(Integer.parseInt(height));
+                }
+                String width = getNodeAttributeValue(node, "width");
+                if (width != null) {
+                    img.setWidth(Integer.parseInt(width));
+                }
+                img.setEnable(Boolean.parseBoolean(getNodeAttributeValue(node, "enable")));
+                img.setNotify(getNodeAttributeValue(node, "notify"));
+                return img;
+            }
+            case "radioGroup": {
+                FormComponentRadioGroup radioGroup = new FormComponentRadioGroup();
+                NodeList nodeList = node.getChildNodes();
+                for (int i = 0; i < nodeList.getLength(); i++) {
+                    if (nodeList.item(i).getNodeName().equalsIgnoreCase("values")) {
+                        radioGroup.setValues(parseValues(nodeList.item(i)));
+                        break;
+                    }
+                }
+                radioGroup.setEnable(Boolean.parseBoolean(getNodeAttributeValue(node, "enable")));
+                radioGroup.setNotify(getNodeAttributeValue(node, "notify"));
+                return radioGroup;
+            }
+        }
+        return null;
+    }
+
+    private static VerifyData parseVerify(Node node) {
+
+        if (node == null) {
+            return null;
+        }
+
+        VerifyData verifyData = new VerifyData();
+        verifyData.setType(FormVerifyType.valueOf(getNodeAttributeValue(node, "type")));
+        verifyData.setExpress(getNodeAttributeValue(node, "express"));
+        verifyData.setNotify(getNodeAttributeValue(node, "notify"));
+        verifyData.setRequire(Boolean.parseBoolean(getNodeAttributeValue(node, "require")));
+        return verifyData;
+    }
+
+    private static ApiData parseApi(Node node) {
+        if (node == null) {
+            return null;
+        }
+        ApiData apiData = new ApiData();
+        apiData.setPath(getNodeAttributeValue(node, "path"));
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            if (nodeList.item(i).getNodeName().equalsIgnoreCase("params")) {
+                apiData.setParams(parseValues(nodeList.item(i)));
+            }
+        }
+        return apiData;
+    }
+
+    private static Map<String, Object> parseValues(Node node) {
+        if (node == null) {
+            return null;
+        }
+        Map<String, Object> values = new HashMap<>();
+        NodeList nodeList = node.getChildNodes();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            if (nodeList.item(i).getNodeName().equalsIgnoreCase("value")) {
+                values.put(getNodeAttributeValue(nodeList.item(i), "key"), nodeList.item(i).getNodeValue());
+            }
+        }
+        return values;
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        GenertorConfig config = XmlConfigParseUtil.parse(new FileInputStream("D:\\workspace\\server\\utils\\src\\test\\test.xml"));
+        GeneraterManagerV2.getInstance().init("D:\\workspace\\server\\utils\\src\\test\\java", config);
+        GeneraterManagerV2.getInstance().createWholeFunction();
+        System.out.println(config);
+    }
+
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AddPageData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AddPageData.java
new file mode 100644
index 0000000..ca0644c
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AddPageData.java
@@ -0,0 +1,44 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+
+import java.util.List;
+
+/**
+ * @author hxh
+ * @title: ListPageData
+ * @description: 鏂板椤甸潰
+ * @date 2022/3/28 14:08
+ */
+public class AddPageData {
+    private List<ColumnData> columns;
+    //璇锋眰鎺ュ彛
+    private ApiData api;
+
+    //鏂囦欢鍚嶇О
+    private String fileName;
+
+    public List<ColumnData> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<ColumnData> columns) {
+        this.columns = columns;
+    }
+
+    public ApiData getApi() {
+        return api;
+    }
+
+    public void setApi(ApiData api) {
+        this.api = api;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+}
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
new file mode 100644
index 0000000..2a81800
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminControllerData.java
@@ -0,0 +1,59 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+/**
+ * @author hxh
+ * @title: AdminControllerData
+ * @description: 绠$悊Controller鏁版嵁
+ * @date 2022/3/28 14:23
+ */
+public class AdminControllerData {
+
+    private String pkg;
+    private String name;
+    private String mapping;
+    //鏄惁responseBody
+    private boolean responseBody;
+    //鎺ュ彛鏄惁jsonp
+    private boolean jsonp;
+
+
+    public String getPkg() {
+        return pkg;
+    }
+
+    public void setPkg(String pkg) {
+        this.pkg = pkg;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMapping() {
+        return mapping;
+    }
+
+    public void setMapping(String mapping) {
+        this.mapping = mapping;
+    }
+
+    public boolean isResponseBody() {
+        return responseBody;
+    }
+
+    public void setResponseBody(boolean responseBody) {
+        this.responseBody = responseBody;
+    }
+
+    public boolean isJsonp() {
+        return jsonp;
+    }
+
+    public void setJsonp(boolean jsonp) {
+        this.jsonp = jsonp;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminData.java
new file mode 100644
index 0000000..a454a45
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminData.java
@@ -0,0 +1,28 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+/**
+ * @author hxh
+ * @title: AdminData
+ * @description: 绠$悊淇℃伅
+ * @date 2022/3/28 14:17
+ */
+public class AdminData {
+    private AdminPageData pages;
+    private AdminControllerData controller;
+
+    public AdminPageData getPages() {
+        return pages;
+    }
+
+    public void setPages(AdminPageData pages) {
+        this.pages = pages;
+    }
+
+    public AdminControllerData getController() {
+        return controller;
+    }
+
+    public void setController(AdminControllerData controller) {
+        this.controller = controller;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminPageData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminPageData.java
new file mode 100644
index 0000000..de0452b
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/AdminPageData.java
@@ -0,0 +1,57 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+/**
+ * @author hxh
+ * @title: AdminPageData
+ * @description: TODO
+ * @date 2022/3/28 14:31
+ */
+public class AdminPageData {
+    private ListPageData list;
+    private AddPageData add;
+    private UpdatePageData update;
+    //椤甸潰鏂囦欢鐩綍璺緞
+    private String pageDir;
+    //鍔熻兘鍚嶇О
+    private String title;
+
+    public ListPageData getList() {
+        return list;
+    }
+
+    public void setList(ListPageData list) {
+        this.list = list;
+    }
+
+    public AddPageData getAdd() {
+        return add;
+    }
+
+    public void setAdd(AddPageData add) {
+        this.add = add;
+    }
+
+    public UpdatePageData getUpdate() {
+        return update;
+    }
+
+    public void setUpdate(UpdatePageData update) {
+        this.update = update;
+    }
+
+    public String getPageDir() {
+        return pageDir;
+    }
+
+    public void setPageDir(String pageDir) {
+        this.pageDir = pageDir;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ColumnData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ColumnData.java
new file mode 100644
index 0000000..8e20c4e
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ColumnData.java
@@ -0,0 +1,86 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+import org.yeshi.utils.generater.annotation.admin.Show;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+
+/**
+ * @author hxh
+ * @title: ColumnData
+ * @description: 鍒椾俊鎭�
+ * @date 2022/3/28 14:05
+ */
+public class ColumnData {
+    //鏄剧ず鏍囬
+    private String title;
+    //灞炴�у瓧娈�
+    private String property;
+    //鎺掑簭瀛楁
+    private Integer order;
+
+    //鏄剧ず绫诲瀷
+    private Show.ShowType showType;
+
+    private int imgWidth;
+
+    private int imgHeight;
+
+    //缂栬緫鎺т欢
+    private FormComponent component;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    public Integer getOrder() {
+        return order;
+    }
+
+    public void setOrder(Integer order) {
+        this.order = order;
+    }
+
+    public FormComponent getComponent() {
+        return component;
+    }
+
+    public void setComponent(FormComponent component) {
+        this.component = component;
+    }
+
+    public Show.ShowType getShowType() {
+        return showType;
+    }
+
+    public void setShowType(Show.ShowType showType) {
+        this.showType = showType;
+    }
+
+
+    public int getImgWidth() {
+        return imgWidth;
+    }
+
+    public void setImgWidth(int imgWidth) {
+        this.imgWidth = imgWidth;
+    }
+
+    public int getImgHeight() {
+        return imgHeight;
+    }
+
+    public void setImgHeight(int imgHeight) {
+        this.imgHeight = imgHeight;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ListPageData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ListPageData.java
new file mode 100644
index 0000000..ef7c41b
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/ListPageData.java
@@ -0,0 +1,85 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+
+import java.util.List;
+
+/**
+ * @author hxh
+ * @title: ListPageData
+ * @description: 鍒楄〃椤甸潰
+ * @date 2022/3/28 14:08
+ */
+public class ListPageData {
+    private List<ColumnData> columns;
+    private SearchFormData searchForm;
+    //璇锋眰鎺ュ彛
+    private ApiData api;
+
+    //鏄惁鍙垹闄�
+    private boolean delete;
+    //鏄惁鍙紪杈�
+    private boolean edit;
+
+    //鏂囦欢鍚嶇О
+    private String fileName;
+
+    //鏄惁鍙垎椤�
+    private boolean page;
+
+    public List<ColumnData> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<ColumnData> columns) {
+        this.columns = columns;
+    }
+
+    public SearchFormData getSearchForm() {
+        return searchForm;
+    }
+
+    public void setSearchForm(SearchFormData searchForm) {
+        this.searchForm = searchForm;
+    }
+
+    public ApiData getApi() {
+        return api;
+    }
+
+    public void setApi(ApiData api) {
+        this.api = api;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public boolean isDelete() {
+        return delete;
+    }
+
+    public void setDelete(boolean delete) {
+        this.delete = delete;
+    }
+
+    public boolean isEdit() {
+        return edit;
+    }
+
+    public void setEdit(boolean edit) {
+        this.edit = edit;
+    }
+
+    public boolean isPage() {
+        return page;
+    }
+
+    public void setPage(boolean page) {
+        this.page = page;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/SearchFormData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/SearchFormData.java
new file mode 100644
index 0000000..99f7ee8
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/SearchFormData.java
@@ -0,0 +1,43 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+import java.util.List;
+
+/**
+ * @author hxh
+ * @title: SearchFormData
+ * @description: 鎼滅储鏉′欢琛ㄥ崟
+ * @date 2022/3/28 14:10
+ */
+public class SearchFormData {
+    //鍒�
+    private List<ColumnData> columns;
+    //鍖呭悕
+    private String pkg;
+    //绫诲悕绉�
+    private String name;
+
+
+    public List<ColumnData> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<ColumnData> columns) {
+        this.columns = columns;
+    }
+
+    public String getPkg() {
+        return pkg;
+    }
+
+    public void setPkg(String pkg) {
+        this.pkg = pkg;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/UpdatePageData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/UpdatePageData.java
new file mode 100644
index 0000000..e5055c0
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/UpdatePageData.java
@@ -0,0 +1,44 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+
+import java.util.List;
+
+/**
+ * @author hxh
+ * @title: ListPageData
+ * @description: 鏇存柊椤甸潰
+ * @date 2022/3/28 14:08
+ */
+public class UpdatePageData {
+    private List<ColumnData> columns;
+    //璇锋眰鎺ュ彛
+    private ApiData api;
+
+    //鏂囦欢鍚嶇О
+    private String fileName;
+
+    public List<ColumnData> getColumns() {
+        return columns;
+    }
+
+    public void setColumns(List<ColumnData> columns) {
+        this.columns = columns;
+    }
+
+    public ApiData getApi() {
+        return api;
+    }
+
+    public void setApi(ApiData api) {
+        this.api = api;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentImg.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentImg.java
new file mode 100644
index 0000000..920e6de
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentImg.java
@@ -0,0 +1,52 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin.form;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+
+/**
+ * @author hxh
+ * @title: FormComponentSelect
+ * @description: 鍥剧墖鎺т欢
+ * @date 2022/3/28 13:56
+ */
+public class FormComponentImg extends FormComponent {
+
+    //鍥剧墖涓婁紶閾炬帴
+    private ApiData api;
+    //鏄惁鍙紪杈戝浘鐗囬摼鎺�
+    private boolean editLink;
+    private Integer width;
+    private Integer height;
+
+    public ApiData getApi() {
+        return api;
+    }
+
+    public void setApi(ApiData api) {
+        this.api = api;
+    }
+
+    public boolean isEditLink() {
+        return editLink;
+    }
+
+    public void setEditLink(boolean editLink) {
+        this.editLink = editLink;
+    }
+
+    public Integer getWidth() {
+        return width;
+    }
+
+    public void setWidth(Integer width) {
+        this.width = width;
+    }
+
+    public Integer getHeight() {
+        return height;
+    }
+
+    public void setHeight(Integer height) {
+        this.height = height;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentRadioGroup.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentRadioGroup.java
new file mode 100644
index 0000000..3119bdc
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentRadioGroup.java
@@ -0,0 +1,26 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin.form;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author hxh
+ * @title: FormComponentSelect
+ * @description: 鍗曢�夋帶浠�
+ * @date 2022/3/28 13:56
+ */
+public class FormComponentRadioGroup extends FormComponent {
+    //鍐呭甯搁噺鎺ュ彛
+    private Map<String, Object> values;
+
+    public Map<String, Object> getValues() {
+        return values;
+    }
+
+    public void setValues(Map<String, Object> values) {
+        this.values = values;
+    }
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSelect.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSelect.java
new file mode 100644
index 0000000..2724359
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSelect.java
@@ -0,0 +1,46 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin.form;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.ApiData;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+import org.yeshi.utils.generater.vo.xmlconfig.base.VerifyData;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author hxh
+ * @title: FormComponentSelect
+ * @description: 閫夋嫨鎺т欢
+ * @date 2022/3/28 13:56
+ */
+public class FormComponentSelect extends FormComponent {
+    //鍐呭甯搁噺鎺ュ彛
+    private Map<String, Object> values;
+    //鍐呭鐨凙PI鎺ュ彛
+    private ApiData api;
+    private VerifyData verify;
+
+    public Map<String, Object> getValues() {
+        return values;
+    }
+
+    public void setValues(Map<String, Object> values) {
+        this.values = values;
+    }
+
+    public ApiData getApi() {
+        return api;
+    }
+
+    public void setApi(ApiData api) {
+        this.api = api;
+    }
+
+    public VerifyData getVerify() {
+        return verify;
+    }
+
+    public void setVerify(VerifyData verify) {
+        this.verify = verify;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSwitch.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSwitch.java
new file mode 100644
index 0000000..47d65da
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentSwitch.java
@@ -0,0 +1,13 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin.form;
+
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+
+/**
+ * @author hxh
+ * @title: FormComponentSelect
+ * @description: 寮�鍏虫帶浠�
+ * @date 2022/3/28 13:56
+ */
+public class FormComponentSwitch extends FormComponent {
+
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentText.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentText.java
new file mode 100644
index 0000000..0d88632
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/admin/form/FormComponentText.java
@@ -0,0 +1,86 @@
+package org.yeshi.utils.generater.vo.xmlconfig.admin.form;
+
+import org.yeshi.utils.generater.annotation.admin.form.Text;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+import org.yeshi.utils.generater.vo.xmlconfig.base.VerifyData;
+
+/**
+ * @author hxh
+ * @title: FormComponentText
+ * @description: 琛ㄥ崟缁勪欢涔嬫枃鏈粍浠�
+ * @date 2022/3/28 12:13
+ */
+public class FormComponentText extends FormComponent {
+    private String desc;
+    private String dateFormat;
+    private Integer maxLength;
+    private Integer minLength;
+    private Text.Type inputType;
+    private String placeHolder;
+    private boolean isTextArea;
+    private VerifyData verify;
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDateFormat() {
+        return dateFormat;
+    }
+
+    public void setDateFormat(String dateFormat) {
+        this.dateFormat = dateFormat;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public Text.Type getInputType() {
+        return inputType;
+    }
+
+    public void setInputType(Text.Type inputType) {
+        this.inputType = inputType;
+    }
+
+    public String getPlaceHolder() {
+        return placeHolder;
+    }
+
+    public void setPlaceHolder(String placeHolder) {
+        this.placeHolder = placeHolder;
+    }
+
+    public boolean isTextArea() {
+        return isTextArea;
+    }
+
+    public void setTextArea(boolean textArea) {
+        isTextArea = textArea;
+    }
+
+    public VerifyData getVerify() {
+        return verify;
+    }
+
+    public void setVerify(VerifyData verify) {
+        this.verify = verify;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/ApiData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/ApiData.java
new file mode 100644
index 0000000..1b6db6b
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/ApiData.java
@@ -0,0 +1,30 @@
+package org.yeshi.utils.generater.vo.xmlconfig.base;
+
+import java.util.Map;
+
+/**
+ * @author hxh
+ * @title: ApiConfig
+ * @description: 鎺ュ彛鏁版嵁
+ * @date 2022/3/28 12:08
+ */
+public class ApiData {
+    private String path;
+    private Map<String, Object> params;
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public Map<String, Object> getParams() {
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params) {
+        this.params = params;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/FormComponent.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/FormComponent.java
new file mode 100644
index 0000000..f7b5e2b
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/FormComponent.java
@@ -0,0 +1,38 @@
+package org.yeshi.utils.generater.vo.xmlconfig.base;
+
+/**
+ * @author hxh
+ * @title: EditComponent
+ * @description: 琛ㄥ崟缁勪欢
+ * @date 2022/3/28 12:12
+ */
+public class FormComponent {
+    private boolean enable;
+    private String notify;
+    private String desc;
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getNotify() {
+        return notify;
+    }
+
+    public void setNotify(String notify) {
+        this.notify = notify;
+    }
+
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/VerifyData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/VerifyData.java
new file mode 100644
index 0000000..ae59c47
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/base/VerifyData.java
@@ -0,0 +1,52 @@
+package org.yeshi.utils.generater.vo.xmlconfig.base;
+
+import org.yeshi.utils.generater.entity.admin.FormVerifyType;
+
+/**
+ * @author hxh
+ * @title: VerifyConfig
+ * @description: 楠岃瘉閰嶇疆
+ * @date 2022/3/28 13:47
+ */
+public class VerifyData {
+    //楠岃瘉绫诲瀷
+    private FormVerifyType type;
+    //type涓簉egex鐨勮〃杈惧紡
+    private String express;
+    //鏄惁蹇呴』
+    private boolean require;
+    //鎻愮ず淇℃伅
+    private String notify;
+
+    public FormVerifyType getType() {
+        return type;
+    }
+
+    public void setType(FormVerifyType type) {
+        this.type = type;
+    }
+
+    public String getExpress() {
+        return express;
+    }
+
+    public void setExpress(String express) {
+        this.express = express;
+    }
+
+    public boolean isRequire() {
+        return require;
+    }
+
+    public void setRequire(boolean require) {
+        this.require = require;
+    }
+
+    public String getNotify() {
+        return notify;
+    }
+
+    public void setNotify(String notify) {
+        this.notify = notify;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoData.java
new file mode 100644
index 0000000..d2f500c
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoData.java
@@ -0,0 +1,39 @@
+package org.yeshi.utils.generater.vo.xmlconfig.dao;
+
+import java.util.List;
+
+/**
+ * @author hxh
+ * @title: DaoData
+ * @description: Dao鏁版嵁
+ * @date 2022/3/28 14:44
+ */
+public class DaoData {
+    private String pkg;
+    private String mapperDir;
+    private List<DaoQuery> queryList;
+
+    public String getPkg() {
+        return pkg;
+    }
+
+    public void setPkg(String pkg) {
+        this.pkg = pkg;
+    }
+
+    public String getMapperDir() {
+        return mapperDir;
+    }
+
+    public void setMapperDir(String mapperDir) {
+        this.mapperDir = mapperDir;
+    }
+
+    public List<DaoQuery> getQueryList() {
+        return queryList;
+    }
+
+    public void setQueryList(List<DaoQuery> queryList) {
+        this.queryList = queryList;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoQuery.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoQuery.java
new file mode 100644
index 0000000..8711600
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/dao/DaoQuery.java
@@ -0,0 +1,31 @@
+package org.yeshi.utils.generater.vo.xmlconfig.dao;
+
+import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
+
+/**
+ * @author hxh
+ * @title: DaoQuery
+ * @description: dao鏉′欢鏌ヨ
+ * @date 2022/3/28 14:42
+ */
+public class DaoQuery {
+    //瀛楁鍚嶇О
+    private String name;
+    private DaoQueryCondition.QueryType queryType;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public DaoQueryCondition.QueryType getQueryType() {
+        return queryType;
+    }
+
+    public void setQueryType(DaoQueryCondition.QueryType queryType) {
+        this.queryType = queryType;
+    }
+}
diff --git a/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java
new file mode 100644
index 0000000..18a72d2
--- /dev/null
+++ b/src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java
@@ -0,0 +1,29 @@
+package org.yeshi.utils.generater.vo.xmlconfig.service;
+
+/**
+ * @author hxh
+ * @title: ExceptionData
+ * @description: 寮傚父鏁版嵁
+ * @date 2022/3/28 14:39
+ */
+public class ExceptionData {
+
+    private String pkg;
+    private String name;
+
+    public String getPkg() {
+        return pkg;
+    }
+
+    public void setPkg(String pkg) {
+        this.pkg = pkg;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/resources/generater/admin/adminController.template b/src/main/resources/generater/admin/adminController.template
index 5a7f9a2..4a64762 100644
--- a/src/main/resources/generater/admin/adminController.template
+++ b/src/main/resources/generater/admin/adminController.template
@@ -18,7 +18,10 @@
 import ${entity.clazz};
 import ${service.clazz};
 import ${query.clazz};
-
+<#if responseBody>
+<#else>
+import java.io.PrintWriter;
+</#if>
 @Controller
 @RequestMapping("${mapping}")
 public class ${controllerName} {
@@ -28,18 +31,27 @@
     @Resource
     private ${service.name} ${serviceObjName};
 
-
-    private String loadPrint(String callback, String root){
+    <#macro print data>
+      <#if responseBody>
         <#if jsonp>
-        return JsonUtil.loadJSONP(callback,root);
+return JsonUtil.loadJSONP(callback,${data});
         <#else>
-          return root;
+return ${data};
         </#if>
-    }
+      <#else>
+       <#if jsonp>
+out.print(JsonUtil.loadJSONP(callback,${data}));
+        return;
+        <#else>
+out.print(${data});
+        return;
+        </#if>
+       </#if>
+    </#macro>
 
-    @ResponseBody
+   ${responseBody?string("@ResponseBody","")}
     @RequestMapping("list")
-    public String list(${query.name} query, int page, int limit, String callback) {
+    public ${responseBody?string("String","void")} list(${query.name} query, int page, int limit${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")} ) {
         List<${entity.name}> list = ${serviceObjName}.list(query,page,limit);
         long count = ${serviceObjName}.count(query);
         JSONObject data = new JSONObject();
@@ -53,58 +65,58 @@
 
         data.put("list", gson.toJson(list));
         data.put("count", count);
-        return loadPrint(callback,JsonUtil.loadTrueResult(data));
+        <@print data="JsonUtil.loadTrueResult(data)" > </@print>
     }
 
     <#if delete>
-    @ResponseBody
+    ${responseBody?string("@ResponseBody","")}
     @RequestMapping("delete")
-    public String delete(String ids, String callback) {
+    public ${responseBody?string("String","void")} delete(String ids${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         Type type = new TypeToken<List<${identifyIdType}>>(){}.getType();
         List<${identifyIdType}> idList=new Gson().fromJson(ids,type);
         ${serviceObjName}.delete(idList);
-        return loadPrint(callback, JsonUtil.loadTrueResult(""));
+        <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
     }
      </#if>
 
     <#if add>
-    @ResponseBody
+    ${responseBody?string("@ResponseBody","")}
     @RequestMapping("add")
-    public String add(${entity.name} bean, HttpSession session, String callback) {
+    public ${responseBody?string("String","void")} add(${entity.name} bean, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         try{
             ${serviceObjName}.add(bean);
-            return loadPrint(callback, JsonUtil.loadTrueResult(""));
+            <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
         }catch(Exception e){
-            return loadPrint(callback, JsonUtil.loadFalseResult(e.getMessage()));
+            <@print data="JsonUtil.loadFalseResult(e.getMessage())" > </@print>
         }
     }
     </#if>
 
-    @ResponseBody
+    ${responseBody?string("@ResponseBody","")}
     @RequestMapping("get")
-    public String get(${identifyIdType} id, HttpSession session, String callback) {
+    public ${responseBody?string("String","void")} get(${identifyIdType} id, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         ${entity.name} entity = ${serviceObjName}.get(id);
         if (entity !=null){
-            return loadPrint(callback,JsonUtil.loadTrueResult(entity));
+            <@print data="JsonUtil.loadTrueResult(entity)" > </@print>
         } else {
-            return loadPrint(callback,JsonUtil.loadFalseResult("ID涓嶅瓨鍦�"));
+            <@print data="JsonUtil.loadFalseResult(\"ID涓嶅瓨鍦╘")" > </@print>
         }
     }
 
 
     <#if update>
-    @ResponseBody
+    ${responseBody?string("@ResponseBody","")}
     @RequestMapping("update")
-    public String update(${entity.name} bean, HttpSession session,String callback) {
+    public ${responseBody?string("String","void")} update(${entity.name} bean, HttpSession session${jsonp?string(", String callback","")}${responseBody?string("",",PrintWriter out")}) {
         if (bean.getId() == null) {
-            return loadPrint(callback, JsonUtil.loadFalseResult("ID涓嶈兘涓虹┖"));
+           <@print data="JsonUtil.loadFalseResult(\"ID涓嶈兘涓虹┖\")" > </@print>
         }
         try{
             ${serviceObjName}.update(bean);
         }catch(Exception e){
-            return loadPrint(callback,JsonUtil.loadFalseResult(e.getMessage()));
+            <@print data="JsonUtil.loadFalseResult(e.getMessage())" > </@print>
         }
-        return loadPrint(callback,JsonUtil.loadTrueResult(""));
+        <@print data="JsonUtil.loadTrueResult(\"\")" > </@print>
     }
     </#if>
 
diff --git a/src/main/resources/schemas/generator.dtd b/src/main/resources/schemas/generator.dtd
new file mode 100644
index 0000000..63026be
--- /dev/null
+++ b/src/main/resources/schemas/generator.dtd
@@ -0,0 +1,110 @@
+<!--
+鑷姩鍖栦唬鐮佺敓鎴愬櫒锛屽寘鍚嚜鍔ㄧ敓鎴�
+-->
+
+
+        <!ELEMENT generator-config  (dao?,service?,admin?)>
+        <!ATTLIST generator-config class CDATA #REQUIRED>
+        <!-- dao閰嶇疆淇℃伅 -->
+        <!ELEMENT dao  (queryList?)>
+        <!ATTLIST dao mapperDir CDATA #IMPLIED>
+        <!ATTLIST dao package CDATA #REQUIRED>
+        <!ELEMENT queryList  (query+)>
+        <!ELEMENT query  EMPTY>
+        <!ATTLIST query name CDATA #REQUIRED>
+        <!ATTLIST query type (start|end|contains|equal|gt|gte|lt|lte) #REQUIRED>
+
+
+        <!ELEMENT service  (exception?)>
+        <!ATTLIST service interPackage CDATA #REQUIRED>
+        <!ATTLIST service implPackage CDATA #REQUIRED>
+        <!ATTLIST service queryPackage CDATA #REQUIRED>
+        <!ELEMENT exception  EMPTY>
+        <!ATTLIST exception package CDATA #REQUIRED>
+        <!ATTLIST exception name CDATA #IMPLIED>
+
+
+        <!--琛ㄥ崟閰嶇疆淇℃伅 -->
+        <!ELEMENT admin  (controller?,pages?)>
+
+        <!ELEMENT controller  EMPTY>
+        <!ATTLIST controller package CDATA #REQUIRED>
+        <!ATTLIST controller name CDATA #IMPLIED>
+        <!ATTLIST controller mapping CDATA #REQUIRED>
+        <!ATTLIST controller responseBody (true|false) "true">
+        <!ATTLIST controller jsonp (true|false) "true">
+
+
+        <!ELEMENT pages  (list?,add?,update?)>
+        <!ATTLIST pages title CDATA #REQUIRED>
+        <!ATTLIST pages pageDir CDATA #REQUIRED>
+
+        <!ELEMENT list  (searchForm?,columns,api?)>
+        <!ATTLIST list fileName CDATA #IMPLIED>
+        <!ATTLIST list delete (true|false) "true">
+        <!ATTLIST list edit (true|false) "true">
+        <!ATTLIST list page (true|false) "true">
+
+        <!ELEMENT columns  (column*)>
+        <!ELEMENT searchForm  (columns)>
+
+        <!ELEMENT column  (text?|select?|radioGroup?|switch?|img?)>
+        <!ATTLIST column property CDATA #REQUIRED>
+        <!ATTLIST column title CDATA #REQUIRED>
+        <!ATTLIST column order CDATA "0">
+        <!ATTLIST column showType (TEXT|IMG|SWITCH) #IMPLIED>
+        <!ATTLIST column imgWidth CDATA "-1">
+        <!ATTLIST column imgHeight CDATA "-1">
+
+        <!ELEMENT add  (column+)>
+        <!ATTLIST add fileName CDATA #IMPLIED>
+        <!ELEMENT update  (column+)>
+        <!ATTLIST update fileName CDATA #IMPLIED>
+
+        <!--琛ㄥ崟涓殑text -->
+        <!ELEMENT text  (verify*)>
+        <!ATTLIST text maxLength CDATA #IMPLIED>
+        <!ATTLIST text minlength CDATA #IMPLIED>
+        <!ATTLIST text inputType (TEXT|DATE|DATETIME) #REQUIRED>
+        <!ATTLIST text dateFormat CDATA #IMPLIED>
+        <!ATTLIST text placeHolder CDATA "">
+        <!ATTLIST text desc CDATA #IMPLIED>
+        <!ATTLIST text enable (true|false) "true">
+        <!ATTLIST text isTextArea (true|false) "false">
+
+
+        <!ELEMENT verify  EMPTY>
+        <!ATTLIST verify type (number|phone|email|date|url|identity|regex|none) #REQUIRED>
+        <!ATTLIST verify express CDATA #IMPLIED>
+        <!ATTLIST verify notify CDATA #IMPLIED>
+        <!ATTLIST verify require (true|false) #IMPLIED>
+
+        <!--琛ㄥ崟涓殑select -->
+        <!ELEMENT select  ((values|api),verify?)>
+        <!ATTLIST select notify CDATA #IMPLIED>
+        <!ATTLIST select enable (true|false) "true">
+        <!ELEMENT values  (value*)>
+        <!ELEMENT value  (#PCDATA)>
+        <!ATTLIST value key CDATA #REQUIRED>
+        <!ELEMENT api  (params?)>
+        <!ATTLIST api path CDATA #REQUIRED>
+        <!ELEMENT params  (value+)>
+
+        <!--琛ㄥ崟涓殑radioGroup -->
+        <!ELEMENT radioGroup  (values)>
+        <!ATTLIST radioGroup enable (true|false) "true">
+
+        <!--琛ㄥ崟涓殑switch -->
+        <!ELEMENT switch  EMPTY>
+        <!ATTLIST switch enable (true|false) "true">
+
+        <!--琛ㄥ崟涓殑img -->
+        <!ELEMENT img  (api?)>
+        <!ATTLIST img enable (true|false) "true">
+        <!ATTLIST img editLink (true|false) "false">
+        <!ATTLIST img width CDATA #IMPLIED>
+        <!ATTLIST img height CDATA #IMPLIED>
+
+
+
+
diff --git a/src/test/java/com/generater/GeneratorTest.java b/src/test/java/com/generater/GeneratorTest.java
index ba1ba09..f7d2b62 100644
--- a/src/test/java/com/generater/GeneratorTest.java
+++ b/src/test/java/com/generater/GeneratorTest.java
@@ -3,16 +3,14 @@
 import org.springframework.data.annotation.Id;
 import org.yeshi.utils.FileUtil;
 import org.yeshi.utils.FreemarkerUtils;
-import org.yeshi.utils.generater.GeneraterManager;
 import org.yeshi.utils.generater.GeneraterUtil;
 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.Table;
-import org.yeshi.utils.generater.params.AdminGeneraterParams;
-import org.yeshi.utils.generater.params.DaoGeneraterParams;
-import org.yeshi.utils.generater.params.ServiceGeneraterParams;
 import org.yeshi.utils.generater.vo.ExceptionVO;
+import org.yeshi.utils.generater.vo.xmlconfig.base.FormComponent;
+import org.yeshi.utils.generater.vo.xmlconfig.admin.form.FormComponentText;
 import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
 import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
 import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
@@ -153,6 +151,14 @@
 //        AdminGeneraterParams adminGeneraterParams=new AdminGeneraterParams("com.generater.temp.controller","D:\\workspace\\server\\utils\\src\\test");
 //
 //        GeneraterManager.getInstance().createWholeFunction(new DaoGeneraterParams("com.generater.temp.dao", "D:\\workspace\\server\\utils\\src\\test"), new ServiceGeneraterParams("com.generater.temp.query","com.generater.temp.service","com.generater.temp.service.impl"), adminGeneraterParams);
+        FormComponent fc=new FormComponentText();
+
+        System.out.println(fc instanceof  FormComponentText);
+
+        FormComponentText text=(FormComponentText) fc;
+
+        System.out.println(text);
+
     }
 
 
diff --git a/src/test/test.xml b/src/test/test.xml
new file mode 100644
index 0000000..00a2986
--- /dev/null
+++ b/src/test/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

--
Gitblit v1.8.0