admin
2022-04-07 211840b64fa1132d76d6dff6c779e9ba2c0c450f
优化自动化代码
19个文件已修改
2个文件已添加
836 ■■■■ 已修改文件
src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/GeneraterUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/entity/ColumnData.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/entity/admin/FormVerifyType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/mybatis/ColumnUtil.java 364 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminVOVO.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/admin/add.ftl 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/admin/adminVO.template 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/admin/list.ftl 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/admin/update.ftl 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/dao/mybatisDBXML.ftl 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/schemas/generator.dtd 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/GeneraterManagerV2.java
@@ -9,6 +9,7 @@
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.admin.controller.AdminVOVO;
import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
import org.yeshi.utils.generater.vo.service.QueryVO;
@@ -82,7 +83,7 @@
        FileUtil.saveAsFileByte(data.getBytes("UTF-8"), path);
    }
    public void createException(Class base) throws Exception {
    public void createException(ClassInfo base) throws Exception {
        if (config.getService().getException() == null) {
            throw new Exception("尚未配置异常信息");
        }
@@ -90,7 +91,7 @@
        String exceptionName = NameUtil.getDefaultExceptionName(config.getEntity());
        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();
            ExceptionVO vo = new ExceptionVO.Builder().setEntity(config.getEntity()).setPackageName(config.getService().getException().getPkg()).setBase(base).build();
            String result = GeneraterUtil.createException(vo);
            //保存
            saveFile(result, new File(path, exceptionName + ".java").getAbsolutePath());
@@ -98,6 +99,25 @@
            e.printStackTrace();
        }
    }
    public void createAdminVO() throws Exception {
        if (StringUtil.isNullOrEmpty(config.getService().getAdminVOPackage())) {
            throw new Exception("尚未配置AdminVO");
        }
        String name = NameUtil.getDefaultExceptionName(config.getEntity());
        String path = getDirPath(config.getService().getAdminVOPackage());
        try {
            AdminVOVO vo = new AdminVOVO.Builder().setEntity(config.getEntity()).setPackageName(config.getService().getAdminVOPackage()).build();
            String result = GeneraterUtil.createAdminVO(vo);
            //保存
            saveFile(result, new File(path, name + ".java").getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void createDao() throws Exception {
@@ -220,7 +240,15 @@
        }
        if (config.getService().getException() != null) {
            createException(Exception.class);
            if (config.getService().getException().getBase() != null) {
                createException(config.getService().getException().getBase());
            } else {
                createException(ClassInfo.create(Exception.class));
            }
        }
        if (config.getService().getAdminVOPackage() != null) {
            createAdminVO();
        }
        QueryVO queryVO = createQuery(config.getService().getQueryPackage());
@@ -388,8 +416,12 @@
    }
    public static void main(String[] args) {
        System.out.print(getHtmlNameFromEntityName("TTestEEntity"));
    public static void main(String[] args) throws Exception {
//        System.out.print(getHtmlNameFromEntityName("TTestEEntity"));
//        AdminVOVO vo = new AdminVOVO.Builder().setEntity(TestEntity3.class).setPackageName("test.vo.admin").build();
//        String result = GeneraterUtil.createAdminVO(vo);
//        System.out.println(result);
    }
src/main/java/org/yeshi/utils/generater/GeneraterUtil.java
@@ -4,6 +4,7 @@
import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
import org.yeshi.utils.generater.vo.ExceptionVO;
import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
import org.yeshi.utils.generater.vo.admin.controller.AdminVOVO;
import org.yeshi.utils.generater.vo.admin.page.FormAddInfoVO;
import org.yeshi.utils.generater.vo.admin.page.FormUpdateInfoVO;
import org.yeshi.utils.generater.vo.admin.page.ListInfoVO;
@@ -26,6 +27,12 @@
        return result;
    }
    public static String createAdminVO(AdminVOVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/admin/adminVO.template"));
        System.out.println(result);
        return result;
    }
    public static String createMongoDBDao(MongoDBDaoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/dao/mongoDBDao.template"));
        System.out.println(result);
src/main/java/org/yeshi/utils/generater/annotation/admin/Show.java
@@ -37,7 +37,7 @@
    //显示类型
    enum ShowType {
        TEXT, IMG,SWITCH;
        TEXT,DATETIME, IMG,SWITCH;
    }
src/main/java/org/yeshi/utils/generater/entity/ColumnData.java
@@ -4,6 +4,7 @@
    private String columnName;
    private String columnMehtod;
    private String type;
    private String setColumnMehtodName;
    public ColumnData() {
@@ -13,6 +14,7 @@
        this.columnName = columnName;
        this.type = type;
        this.columnMehtod = "get" + (columnName.subSequence(0, 1) + "").toUpperCase() + columnName.subSequence(1, columnName.length()) + "()";
        this.setColumnMehtodName = "set" + (columnName.subSequence(0, 1) + "").toUpperCase() + columnName.subSequence(1, columnName.length());
    }
    public String getColumnName() {
@@ -39,4 +41,12 @@
    public void setType(String type) {
        this.type = type;
    }
    public String getSetColumnMehtodName() {
        return setColumnMehtodName;
    }
    public void setSetColumnMehtodName(String setColumnMehtodName) {
        this.setColumnMehtodName = setColumnMehtodName;
    }
}
src/main/java/org/yeshi/utils/generater/entity/admin/AdminGeneraterInfo.java
@@ -331,12 +331,14 @@
                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) + ""));
                    if(formComponentSelect.getApi().getParams()!=null) {
                        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);
                    }
                    params.put("apiParams", list);
                }
                if (formComponentSelect.getValues() != null) {
src/main/java/org/yeshi/utils/generater/entity/admin/FormVerifyType.java
@@ -7,7 +7,7 @@
 * @date 2021/9/23 14:00
 */
public enum FormVerifyType {
    number("数字"), phone("电话号码"), email("邮箱"), date("日期"), url("链接"), identity("身份证"), regex("正则"),none("无验证规则");
    number("数字"), phone("电话号码"), email("邮箱"), date("日期"),datetime("时间"), url("链接"), identity("身份证"), regex("正则"),none("无验证规则");
    private FormVerifyType(String desc) {
src/main/java/org/yeshi/utils/generater/mybatis/ColumnUtil.java
@@ -13,187 +13,221 @@
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.AbstractAttribute;
import org.yeshi.utils.StringUtil;
public class ColumnUtil {
    @SuppressWarnings("rawtypes")
    public static void addColumnToMapper(String path, String columnName, String property, String type) {
        File xmlPath = new File(path);
        SAXReader reader = new SAXReader();
        Document document = null;
        try {
            document = reader.read(xmlPath);
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
            // 遍历所有子节点
            for (Element e : elementList) {
                if (e.getName().equals("resultMap")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("BaseResultMap".equalsIgnoreCase(attr.getValue())) {
                        List list = e.elements("result");
                        boolean isE = false;
                        for (int i = 0; i < list.size(); i++) {
                            Element item = (Element) list.get(i);
                            attr = (AbstractAttribute) item.attribute("property");
                            if (attr.getValue().trim().equalsIgnoreCase(property)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> li = new ArrayList<>();
                            li.add(new KeyPair("column", columnName));
                            li.add(new KeyPair("property", property));
                            li.add(new KeyPair("jdbcType", type));
                            e.add(createElement("result", li, null));
                        }
                    }
                } else if (e.getName().equals("sql")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("Base_Column_List".equalsIgnoreCase(attr.getValue())) {
                        String columns = e.getText();
                        String[] cs = columns.split(",");
                        boolean isE = false;
                        for (String c : cs) {
                            if (c.trim().equalsIgnoreCase(columnName)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            columns += ("," + columnName);
                            e.setText(columns);
                        }
                    }
                } else if (e.getName().equals("insert")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("insert".equalsIgnoreCase(attr.getValue())) {
                        String insert = e.getText();
                        String[] cs = insert.split("values ");
                        if (cs.length > 1) {
                            int start = cs[0].indexOf("(");
                            int end = cs[0].indexOf(")");
                            String columns = cs[0].substring(start, end);
                            String[] cols = columns.split(",");
                            boolean isE = false;
                            for (String col : cols) {
                                if (col.trim().equalsIgnoreCase(columnName)) {
                                    isE = true;
                                    break;
                                }
                            }
                            if (!isE) {
                                cs[0] = cs[0].replace(columns, columns + ("," + columnName));
                                start = cs[1].indexOf("(");
                                end = cs[1].indexOf(")");
                                String columns2 = cs[1].substring(start, end);
                                cs[1] = cs[1].replace(columns2,
                                        columns2 + String.format(",#{%s,jdbcType=%s}", property, type));
                                insert = cs[0] + " values " + cs[1];
                                e.setText(insert);
                            }
                        }
    /**
     * @author hxh
     * @description 根据属性获取sql中的驼峰字段
     * @date 15:44 2022/3/31
     * @param: property
     * @return java.lang.String
     **/
    public static String getColumnFromProperty(String property) {
        StringBuffer buffer = new StringBuffer();
        List<String> temp = new ArrayList<>();
        for (int i = 0; i < property.length(); i++) {
            //是否为大写
            if (property.charAt(i) >= 65 && property.charAt(i) <= 90) {
                temp.add(property.charAt(i) + "");
            } else {
                //消费之前的
                if (temp.size() > 0) {
                    buffer.append(("_" + StringUtil.concat(temp, "")).toLowerCase());
                    temp.clear();
                }
                buffer.append(property.charAt(i));
            }
        }
                    } else if ("insertSelective".equalsIgnoreCase(attr.getValue())) {
                        List trims = e.elements("trim");
                        Element els = (Element) trims.get(0);
                        boolean isE = false;
                        for (int i = 0; i < els.elements("if").size(); i++) {
                            String cn = ((Element) els.elements("if").get(i)).getText().replace(",", "").trim();
                            if (columnName.equalsIgnoreCase(cn)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> list = new ArrayList<>();
                            list.add(new KeyPair("test", String.format("%s != null", property)));
                            els.add(createElement("if", list, columnName + ","));
        if (temp.size() > 0) {
            buffer.append(("_" + StringUtil.concat(temp, "")).toLowerCase());
            temp.clear();
        }
        return buffer.toString();
    }
                            els = (Element) trims.get(1);
                            list = new ArrayList<>();
                            list.add(new KeyPair("test", String.format("%s != null", property)));
                            els.add(createElement("if", list, String.format("#{%s,jdbcType=%s}", property, type)));
                        }
                    }
                } else if (e.getName().equals("update")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("updateByPrimaryKeySelective".equalsIgnoreCase(attr.getValue())) {
                        List list = ((Element) e.elements("set").get(0)).elements("if");
                        boolean isE = false;
                        for (int i = 0; i < list.size(); i++) {
                            if (((Element) list.get(i)).getText().indexOf(columnName) > -1) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> klist = new ArrayList<>();
                            klist.add(new KeyPair("test", String.format("%s !=null", property)));
                            ((Element) e.elements("set").get(0)).add(createElement("if", klist,
                                    String.format("%s =#{%s,jdbcType=%s},", columnName, property, type)));
                        }
                    } else if ("updateByPrimaryKey".equalsIgnoreCase(attr.getValue())) {
                        String value = e.getText();
                        // 不存在该列
                        if (value.indexOf(columnName) <= -1) {
                            int wpos = value.indexOf("where ");
                            if (value.substring(0, wpos).trim().endsWith(","))
                                value = value.substring(0, wpos)
                                        + String.format("%s =#{%s,jdbcType=%s},", columnName, property, type) + " "
                                        + value.substring(wpos);
                            else
                                value = value.substring(0, wpos) + ","
                                        + String.format("%s =#{%s,jdbcType=%s},", columnName, property, type) + " "
                                        + value.substring(wpos);
    @SuppressWarnings("rawtypes")
    public static void addColumnToMapper(String path, String columnName, String property, String type) {
        File xmlPath = new File(path);
        SAXReader reader = new SAXReader();
        Document document = null;
        try {
            document = reader.read(xmlPath);
            Element root = document.getRootElement();
            // 得到根元素的所有子节点
            List<Element> elementList = root.elements();
            // 遍历所有子节点
            for (Element e : elementList) {
                if (e.getName().equals("resultMap")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("BaseResultMap".equalsIgnoreCase(attr.getValue())) {
                        List list = e.elements("result");
                        boolean isE = false;
                        for (int i = 0; i < list.size(); i++) {
                            Element item = (Element) list.get(i);
                            attr = (AbstractAttribute) item.attribute("property");
                            if (attr.getValue().trim().equalsIgnoreCase(property)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> li = new ArrayList<>();
                            li.add(new KeyPair("column", columnName));
                            li.add(new KeyPair("property", property));
                            li.add(new KeyPair("jdbcType", type));
                            e.add(createElement("result", li, null));
                        }
                    }
                } else if (e.getName().equals("sql")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("Base_Column_List".equalsIgnoreCase(attr.getValue())) {
                        String columns = e.getText();
                        String[] cs = columns.split(",");
                        boolean isE = false;
                        for (String c : cs) {
                            if (c.trim().equalsIgnoreCase(columnName)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            columns += ("," + columnName);
                            e.setText(columns);
                        }
                    }
                            e.setText(value);
                        }
                    }
                } else if (e.getName().equals("insert")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("insert".equalsIgnoreCase(attr.getValue())) {
                        String insert = e.getText();
                        String[] cs = insert.split("values ");
                        if (cs.length > 1) {
                            int start = cs[0].indexOf("(");
                            int end = cs[0].indexOf(")");
                            String columns = cs[0].substring(start, end);
                            String[] cols = columns.split(",");
                            boolean isE = false;
                            for (String col : cols) {
                                if (col.trim().equalsIgnoreCase(columnName)) {
                                    isE = true;
                                    break;
                                }
                            }
                            if (!isE) {
                                cs[0] = cs[0].replace(columns, columns + ("," + columnName));
                                start = cs[1].indexOf("(");
                                end = cs[1].indexOf(")");
                                String columns2 = cs[1].substring(start, end);
                                cs[1] = cs[1].replace(columns2,
                                        columns2 + String.format(",#{%s,jdbcType=%s}", property, type));
                                insert = cs[0] + " values " + cs[1];
                                e.setText(insert);
                            }
                        }
                }
            }
        } catch (DocumentException e1) {
            e1.printStackTrace();
        }
        if (document != null) {
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            try {
                XMLWriter writer = new XMLWriter(new FileOutputStream(path), format);
                writer.write(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
                    } else if ("insertSelective".equalsIgnoreCase(attr.getValue())) {
                        List trims = e.elements("trim");
                        Element els = (Element) trims.get(0);
                        boolean isE = false;
                        for (int i = 0; i < els.elements("if").size(); i++) {
                            String cn = ((Element) els.elements("if").get(i)).getText().replace(",", "").trim();
                            if (columnName.equalsIgnoreCase(cn)) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> list = new ArrayList<>();
                            list.add(new KeyPair("test", String.format("%s != null", property)));
                            els.add(createElement("if", list, columnName + ","));
    private static Element createElement(String qName, List<KeyPair> keyPairList, String value) {
        Element element = DocumentHelper.createElement(qName);
        for (KeyPair kp : keyPairList) {
            element.addAttribute(kp.key, kp.value);
        }
        if (value != null)
            element.setText(value);
        return element;
    }
                            els = (Element) trims.get(1);
                            list = new ArrayList<>();
                            list.add(new KeyPair("test", String.format("%s != null", property)));
                            els.add(createElement("if", list, String.format("#{%s,jdbcType=%s}", property, type)));
                        }
                    }
                } else if (e.getName().equals("update")) {
                    AbstractAttribute attr = (AbstractAttribute) e.attribute("id");
                    if ("updateByPrimaryKeySelective".equalsIgnoreCase(attr.getValue())) {
                        List list = ((Element) e.elements("set").get(0)).elements("if");
                        boolean isE = false;
                        for (int i = 0; i < list.size(); i++) {
                            if (((Element) list.get(i)).getText().indexOf(columnName) > -1) {
                                isE = true;
                                break;
                            }
                        }
                        if (!isE) {
                            List<KeyPair> klist = new ArrayList<>();
                            klist.add(new KeyPair("test", String.format("%s !=null", property)));
                            ((Element) e.elements("set").get(0)).add(createElement("if", klist,
                                    String.format("%s =#{%s,jdbcType=%s},", columnName, property, type)));
                        }
                    } else if ("updateByPrimaryKey".equalsIgnoreCase(attr.getValue())) {
                        String value = e.getText();
                        // 不存在该列
                        if (value.indexOf(columnName) <= -1) {
                            int wpos = value.indexOf("where ");
                            if (value.substring(0, wpos).trim().endsWith(","))
                                value = value.substring(0, wpos)
                                        + String.format("%s =#{%s,jdbcType=%s},", columnName, property, type) + " "
                                        + value.substring(wpos);
                            else
                                value = value.substring(0, wpos) + ","
                                        + String.format("%s =#{%s,jdbcType=%s},", columnName, property, type) + " "
                                        + value.substring(wpos);
                            e.setText(value);
                        }
                    }
                }
            }
        } catch (DocumentException e1) {
            e1.printStackTrace();
        }
        if (document != null) {
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            try {
                XMLWriter writer = new XMLWriter(new FileOutputStream(path), format);
                writer.write(document);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private static Element createElement(String qName, List<KeyPair> keyPairList, String value) {
        Element element = DocumentHelper.createElement(qName);
        for (KeyPair kp : keyPairList) {
            element.addAttribute(kp.key, kp.value);
        }
        if (value != null)
            element.setText(value);
        return element;
    }
}
class KeyPair {
    String key;
    String value;
    String key;
    String value;
    public KeyPair(String key, String value) {
        this.key = key;
        this.value = value;
    }
    public KeyPair(String key, String value) {
        this.key = key;
        this.value = value;
    }
    public KeyPair() {
    public KeyPair() {
    }
    }
}
src/main/java/org/yeshi/utils/generater/vo/admin/controller/AdminVOVO.java
New file
@@ -0,0 +1,119 @@
package org.yeshi.utils.generater.vo.admin.controller;
import org.springframework.data.annotation.Transient;
import org.yeshi.utils.generater.entity.ClassInfo;
import org.yeshi.utils.generater.entity.ColumnData;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
 * @author hxh
 * @title: AdminVO
 * @description: TODO
 * @date 2022/4/7 18:24
 */
public class AdminVOVO {
    private String name;
    private String packageName;
    private ClassInfo entity;
    private List<ColumnData> columns;
    public static class Builder {
        private Class entity;
        private String packageName;
        public Builder setEntity(Class entity) {
            this.entity = entity;
            return this;
        }
        public Builder setPackageName(String packageName) {
            this.packageName = packageName;
            return this;
        }
        public AdminVOVO build() throws Exception {
            if (entity == null) {
                throw new Exception("entity不能为空");
            }
            if (packageName == null) {
                throw new Exception("packageName不能为空");
            }
            AdminVOVO vo = new AdminVOVO();
            vo.setEntity(ClassInfo.create(entity));
            vo.setName(entity.getSimpleName() + "AdminVO");
            vo.setPackageName(packageName);
            List<ColumnData> columnList = new ArrayList<>();
            Field[] fields = entity.getDeclaredFields();
            for (Field fd : fields) {
                //private/public 非final,static属性才会参与解析
                if (fd.getModifiers() != 1 && fd.getModifiers() != 2) {
                    continue;
                }
                boolean valid = true;
                Annotation[] as = fd.getAnnotations();
                for (Annotation a : as) {
                    //不参与解析
                    if (a instanceof Transient || a instanceof java.beans.Transient) {
                        valid = false;
                        break;
                    }
                }
                if (!valid) {
                    continue;
                }
                String property = fd.getName();
                if(property.equalsIgnoreCase("createTime")||property.equalsIgnoreCase("updateTime")){
                    continue;
                }
                String type = fd.getType().getSimpleName();
                ColumnData columnData = new ColumnData(property, type);
                columnList.add(columnData);
            }
            vo.setColumns(columnList);
            return vo;
        }
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPackageName() {
        return packageName;
    }
    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }
    public ClassInfo getEntity() {
        return entity;
    }
    public void setEntity(ClassInfo entity) {
        this.entity = entity;
    }
    public List<ColumnData> getColumns() {
        return columns;
    }
    public void setColumns(List<ColumnData> columns) {
        this.columns = columns;
    }
}
src/main/java/org/yeshi/utils/generater/vo/admin/page/FormAddInfoVO.java
@@ -75,10 +75,12 @@
                }
                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
                Map<String, String> apiParams = new HashMap<>();
                if (((List) row.getParams().get("apiParams")).size() > 0) {
                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                    for (KeyValue kv : apiParamsList) {
                        apiParams.put(kv.getKey(), kv.getValue());
                if (row.getParams().get("apiParams") != null) {
                    if (((List) row.getParams().get("apiParams")).size() > 0) {
                        List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                        for (KeyValue kv : apiParamsList) {
                            apiParams.put(kv.getKey(), kv.getValue());
                        }
                    }
                }
                requestInfoVO.setParams(apiParams);
src/main/java/org/yeshi/utils/generater/vo/admin/page/FormUpdateInfoVO.java
@@ -77,10 +77,12 @@
                }
                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
                Map<String, String> apiParams = new HashMap<>();
                if (((List) row.getParams().get("apiParams")).size() > 0) {
                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                    for (KeyValue kv : apiParamsList) {
                        apiParams.put(kv.getKey(), kv.getValue());
                if(row.getParams().get("apiParams")!=null) {
                    if (((List) row.getParams().get("apiParams")).size() > 0) {
                        List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                        for (KeyValue kv : apiParamsList) {
                            apiParams.put(kv.getKey(), kv.getValue());
                        }
                    }
                }
                requestInfoVO.setParams(apiParams);
src/main/java/org/yeshi/utils/generater/vo/admin/page/ListInfoVO.java
@@ -8,6 +8,7 @@
import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
import org.yeshi.utils.generater.entity.admin.FormRowData;
import org.yeshi.utils.generater.entity.admin.FormVerifyType;
import org.yeshi.utils.generater.mybatis.ColumnUtil;
import java.util.ArrayList;
import java.util.HashMap;
@@ -53,11 +54,11 @@
            ListInfoVO vo = new ListInfoVO();
            vo.setListApi(generaterInfo.getControllerData().getMapping() + "/list");
            if (generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
                vo.setAddPagePath(generaterInfo.getEntity().getSimpleName().toLowerCase() + "_add.html");
                vo.setAddPagePath(ColumnUtil.getColumnFromProperty(generaterInfo.getEntity().getSimpleName()) + "_add.html");
            }
            if (generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0) {
                vo.setUpdatePagePath(generaterInfo.getEntity().getSimpleName().toLowerCase() + "_update.html");
                vo.setUpdatePagePath(ColumnUtil.getColumnFromProperty(generaterInfo.getEntity().getSimpleName()) + "_update.html");
            }
            vo.setSearchFormRows(generaterInfo.getSearchFormRows());
            vo.setShowFileds(generaterInfo.getShowDataList());
@@ -99,10 +100,12 @@
                }
                FormHttpRequestInfoVO requestInfoVO = new FormHttpRequestInfoVO();
                Map<String, String> apiParams = new HashMap<>();
                if (((List) row.getParams().get("apiParams")).size() > 0) {
                    List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                    for (KeyValue kv : apiParamsList) {
                        apiParams.put(kv.getKey(), kv.getValue());
                if (row.getParams().get("apiParams") != null) {
                    if (((List) row.getParams().get("apiParams")).size() > 0) {
                        List<KeyValue> apiParamsList = (List<KeyValue>) row.getParams().get("apiParams");
                        for (KeyValue kv : apiParamsList) {
                            apiParams.put(kv.getKey(), kv.getValue());
                        }
                    }
                }
                requestInfoVO.setParams(apiParams);
src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
@@ -7,6 +7,7 @@
import org.yeshi.utils.generater.entity.*;
import org.yeshi.utils.generater.mybatis.Column;
import org.yeshi.utils.generater.mybatis.ColumnParseUtil;
import org.yeshi.utils.generater.mybatis.ColumnUtil;
import org.yeshi.utils.generater.mybatis.Table;
import org.yeshi.utils.generater.vo.ExceptionVO;
import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData;
@@ -113,13 +114,18 @@
                }
                String property = fd.getName();
                String column = fd.getName();
                String column = null;
                for (Annotation a : as) {
                    //不参与解析
                    if (a instanceof Column) {
                        column = ((Column) a).name();
                        break;
                    }
                }
                //驼峰写法,首字母小写
                if (column == null) {
                    column = ColumnUtil.getColumnFromProperty(fd.getName());
                }
                MybatisColumnData columData = new MybatisColumnData(column, property, fd.getType().getSimpleName(), ColumnParseUtil.getJDBCType(fd.getType().getName()));
@@ -144,16 +150,19 @@
                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()));
                    if (daoData.getQueryList() != 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()));
                                }
                            } else if (query.getName().equalsIgnoreCase(columData.getColumn())) {
                                daoQueryColumnList.add(new DaoQueryColumnData(columData.getColumn(), columData, fd.getType().getSimpleName(), query.getQueryType()));
                            }
                        }
                    }
                } else {
                    //获取注解查询条件
@@ -236,4 +245,6 @@
    public void setTable(String table) {
        this.table = table;
    }
}
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/XmlConfigParseUtil.java
@@ -7,6 +7,7 @@
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.ClassInfo;
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.*;
@@ -36,7 +37,7 @@
 */
public class XmlConfigParseUtil {
    public static GenertorConfig parse(InputStream inputStream) throws Exception {
    public static GenertorConfig parse(InputStream inputStream, ClassLoader classLoader) throws Exception {
        if (inputStream == null) {
            throw new FileNotFoundException();
        }
@@ -50,7 +51,7 @@
        }
        Node rootNode = nodelist.item(0);
        String clazz = rootNode.getAttributes().getNamedItem("class").getNodeValue();
        genertorConfig.setEntity(Class.forName(clazz));
        genertorConfig.setEntity(classLoader.loadClass(clazz));
        nodelist = rootNode.getChildNodes();
        for (int i = 0; i < nodelist.getLength(); i++) {
@@ -69,8 +70,6 @@
                    genertorConfig.setAdmin(parseAdmin(node));
                }
                break;
            }
@@ -110,6 +109,7 @@
        data.setInterPackage(getNodeAttributeValue(node, "interPackage"));
        data.setImplPackage(getNodeAttributeValue(node, "implPackage"));
        data.setQueryPackage(getNodeAttributeValue(node, "queryPackage"));
        data.setAdminVOPackage(getNodeAttributeValue(node, "adminVOPackage"));
        NodeList nodeList = node.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
@@ -117,6 +117,10 @@
                ExceptionData exceptionData = new ExceptionData();
                exceptionData.setPkg(getNodeAttributeValue(nodeList.item(i), "package"));
                exceptionData.setName(getNodeAttributeValue(nodeList.item(i), "name"));
                String base = getNodeAttributeValue(nodeList.item(i), "base");
                if (base != null) {
                    exceptionData.setBase(new ClassInfo(base.split("\\.")[base.split("\\.").length - 1], base));
                }
                data.setException(exceptionData);
                break;
            }
@@ -418,7 +422,7 @@
    public static void main(String[] args) throws Exception {
        GenertorConfig config = XmlConfigParseUtil.parse(new FileInputStream("D:\\workspace\\server\\utils\\src\\test\\test.xml"));
        GenertorConfig config = XmlConfigParseUtil.parse(new FileInputStream("D:\\workspace\\server\\utils\\src\\test\\test.xml"), null);
        GeneraterManagerV2.getInstance().init("D:\\workspace\\server\\utils\\src\\test\\java", config);
        GeneraterManagerV2.getInstance().createWholeFunction();
        System.out.println(config);
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ExceptionData.java
@@ -1,5 +1,7 @@
package org.yeshi.utils.generater.vo.xmlconfig.service;
import org.yeshi.utils.generater.entity.ClassInfo;
/**
 * @author hxh
 * @title: ExceptionData
@@ -10,6 +12,8 @@
    private String pkg;
    private String name;
    private ClassInfo base;
    public String getPkg() {
        return pkg;
@@ -26,4 +30,12 @@
    public void setName(String name) {
        this.name = name;
    }
    public ClassInfo getBase() {
        return base;
    }
    public void setBase(ClassInfo base) {
        this.base = base;
    }
}
src/main/java/org/yeshi/utils/generater/vo/xmlconfig/service/ServiceData.java
@@ -12,6 +12,8 @@
    private String queryPackage;
    private ExceptionData exception;
    private String adminVOPackage;
    public String getInterPackage() {
        return interPackage;
    }
@@ -43,4 +45,12 @@
    public void setQueryPackage(String queryPackage) {
        this.queryPackage = queryPackage;
    }
    public String getAdminVOPackage() {
        return adminVOPackage;
    }
    public void setAdminVOPackage(String adminVOPackage) {
        this.adminVOPackage = adminVOPackage;
    }
}
src/main/resources/generater/admin/add.ftl
@@ -8,12 +8,12 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
    <link rel="stylesheet" href="./css/font.css">
    <link rel="stylesheet" href="./css/xadmin.css">
    <script type="text/javascript" src="./lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="./js/xadmin.js"></script>
    <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/http.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="../css/font.css">
    <link rel="stylesheet" href="../css/xadmin.css">
    <script type="text/javascript" src="../lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="../js/xadmin.js"></script>
    <script src="../js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="../js/http.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
    <!--[if lt IE 9]>
@@ -33,7 +33,7 @@
                           <span class="x-red">*</span>
                        </#if>
                        ${value.params.title}</label>
                     <div class="layui-input-block">
                    <div class="layui-input-block">
                    <#switch value.type>
                        <#case "CheckBox"><#include "/admin/form/checkBox.ftl" ><#break>
                        <#case "Img">  <#include "/admin/form/img.ftl"><#break>
@@ -141,11 +141,12 @@
</script>
<script>
    layui.use(['form', 'layer', 'jquery', 'upload'], function () {
    layui.use(['form', 'layer', 'jquery', 'upload', 'laydate'], function () {
        $ = layui.jquery;
        var form = layui.form,
                layer = layui.layer,
                upload = layui.upload;
                upload = layui.upload,
                laydate = layui.laydate;
        var verify = {};
        <#list regexVerifyList as regex>
@@ -156,6 +157,15 @@
        //渲染上传控件
        uploadTool.init(upload);
        <#list rowsList as row >
               <#if (row.type=="Text" && (row.params.inputType=="DATE"||row.params.inputType=="DATETIME"))>
                    laydate.render({
                          elem: "intput[name=${row.key}]", //指定元素
                          type: ${row.params.inputType?lower_case}
                    });
               </#if>
        </#list>
        //监听提交
@@ -175,7 +185,7 @@
                            data.field[onkeys[0]][onkeys[1]] = value;
                        }
                    }
                    uploadTool.upload(function(){
                    uploadTool.upload(function () {
                        //发异步,把数据提交给php
                        ksapp.post('${addApi}', data.field, function (res) {
                            if (res.code == 0) {
src/main/resources/generater/admin/adminVO.template
New file
@@ -0,0 +1,76 @@
package ${packageName};
import org.yeshi.utils.TimeUtil;
import ${entity.clazz};
import java.util.Date;
public class ${name} {
<#list columns as column >
   <#if column.type=='Date'>
    private String ${column.columnName};
   <#elseif column.type=='Boolean'>
    private String ${column.columnName};
   <#else>
    private ${column.type} ${column.columnName};
   </#if>
</#list>
    public ${entity.name} toEntity(SystemEnum system) {
        ${entity.name} entity = new ${entity.name}();
        <#list columns as column >
          <#if column.type=='Date'>
        entity.${column.setColumnMehtodName}(new Date(TimeUtil.convertToTimeTemp(${column.columnName}, "yyyy-MM-dd HH:mm:ss")));
         <#elseif column.type=='Boolean'>
        entity.${column.setColumnMehtodName}("on".equalsIgnoreCase(${column.columnName}) ? true : false);
         <#else>
        entity.${column.setColumnMehtodName}(${column.columnName});
          </#if>
        </#list>
        return entity;
    }
    public static ${name} create(${entity.name} entity) {
        ${name} vo = new ${name}();
        <#list columns as column >
         <#if column.type=='Date'>
        vo.${column.setColumnMehtodName}(TimeUtil.getGernalTime(entity.${column.columnMehtod}.getTime(), "yyyy-MM-dd HH:mm:ss"));
         <#elseif column.type=='Boolean'>
        vo.${column.setColumnMehtodName}(entity.${column.columnMehtod} ? "on" : null);
          <#else>
        vo.${column.setColumnMehtodName}(entity.${column.columnMehtod});
          </#if>
        </#list>
        return vo;
    }
    <#list columns as column >
     <#if column.type=='Date'>
     public String ${column.columnMehtod} {
        return ${column.columnName};
     }
      public void ${column.setColumnMehtodName}(String ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
      }
      <#elseif column.type=='Boolean'>
     public String ${column.columnMehtod} {
        return ${column.columnName};
     }
      public void ${column.setColumnMehtodName}(String ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
      }
      <#else>
     public ${column.type} ${column.columnMehtod} {
        return ${column.columnName};
     }
      public void ${column.setColumnMehtodName}(${column.type} ${column.columnName}) {
        this.${column.columnName} = ${column.columnName};
      }
      </#if>
    </#list>
}
src/main/resources/generater/admin/list.ftl
@@ -8,19 +8,19 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
    <link rel="stylesheet" href="./css/font.css">
    <link rel="stylesheet" href="./css/xadmin.css">
    <script src="./lib/layui/layui.js" charset="utf-8"></script>
    <link rel="stylesheet" href="./css/theme3049.min.css">
    <script src="./js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" src="./js/xadmin.js"></script>
    <script src="./js/http.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="../css/font.css">
    <link rel="stylesheet" href="../css/xadmin.css">
    <script src="../lib/layui/layui.js" charset="utf-8"></script>
    <link rel="stylesheet" href="../css/theme3049.min.css">
    <script src="../js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" src="../js/xadmin.js"></script>
    <script src="../js/http.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
    <script src="./js/utils.js"></script>
    <script src="../js/utils.js"></script>
</head>
<body>
@@ -145,9 +145,9 @@
<script>
    var tableIns = null;
    var app=null;
    $(function () {
        var app = new Vue({
        app = new Vue({
            el: "#app",
            data: {
                key: '',
@@ -170,7 +170,7 @@
                                <#list searchFormRows as row >
                                    <#if (row.type=="Text" && row.params.inputType=="DATE")>
                                laydate.render({
                                    elem: "intput[name=${row.key}]" //指定元素
                                    elem: "input[name=${row.key}]" //指定元素
                                });
                                    </#if>
                                </#list>
@@ -189,8 +189,10 @@
                                 <#list showFileds as field >
                                    <#if field.showType=='TEXT'>
                                    {field: '${field.identifier}', width: 120, sort: false, title: "${field.title}"},
                                    <#elseif field.showType=='DATETIME'>
                                    {field: '${field.identifier}', width: 150, sort: false, title: "${field.title}"},
                                    <#elseif field.showType=='SWITCH'>
                                    {field: '${field.identifier}', width: 120, sort: false, title: "${field.title}",templet:function(res){
                                    {field: '${field.identifier}', width: 80, sort: false, title: "${field.title}",templet:function(res){
                                         if(res.${field.identifier}){
                                             return " <input type=\"checkbox\" checked='true'  disabled  lay-skin=\"switch\"";
                                         }else{
@@ -269,6 +271,7 @@
                             if (res.code == 0) {
                                 //填充数据
                                 $("${request.fillTarget}").empty();
                                 $("${request.fillTarget}").append("<option value=''>请选择</option>");
                                 for (var i = 0; i < res.data.length; i++) {
                                     var html = "<option value='" + res.data[i].key + "'>";
                                     html += res.data[i].value + "</option>";
@@ -316,9 +319,16 @@
                },
                </#if>
                search: function (params) {
                    var ps = {};
                    for (var key in params) {
                        if (params[key].length > 0) {
                            ps[key] = params[key];
                        }
                    }
                    //数据重载
                    tableIns.reload({
                        where: params,
                        where: ps,
                        page: {
                            curr: 1 //重新从第 1 页开始
                        }
src/main/resources/generater/admin/update.ftl
@@ -8,12 +8,12 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
          content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
    <link rel="stylesheet" href="./css/font.css">
    <link rel="stylesheet" href="./css/xadmin.css">
    <script type="text/javascript" src="./lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="./js/xadmin.js"></script>
    <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/http.js" type="text/javascript" charset="utf-8"></script>
    <link rel="stylesheet" href="../css/font.css">
    <link rel="stylesheet" href="../css/xadmin.css">
    <script type="text/javascript" src="../lib/layui/layui.js" charset="utf-8"></script>
    <script type="text/javascript" src="../js/xadmin.js"></script>
    <script src="../js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="../js/http.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
    <!--[if lt IE 9]>
@@ -163,11 +163,12 @@
</script>
<script>
    layui.use(['form', 'layer', 'jquery', 'upload'], function () {
    layui.use(['form', 'layer', 'jquery', 'upload','laydate'], function () {
        $ = layui.jquery;
        var form = layui.form,
                layer = layui.layer,
                upload = layui.upload;
                upload = layui.upload,
                laydate= layui.laydate;
        var verify = {};
        <#list regexVerifyList as regex>
@@ -176,6 +177,15 @@
        //自定义验证规则
        form.verify(verify);
        <#list rowsList as row >
            <#if (row.type=="Text" && (row.params.inputType=="DATE"||row.params.inputType=="DATETIME"))>
                    laydate.render({
                        elem: "intput[name=${row.key}]", //指定元素
                        type: ${row.params.inputType?lower_case}
                    });
            </#if>
        </#list>
        //渲染上传控件
        uploadTool.init(upload);
src/main/resources/generater/dao/mybatisDBXML.ftl
@@ -49,7 +49,7 @@
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
        <#list columnList as column>
            <#noparse>#{</#noparse>${column.property}},jdbcType=${column.jdbcType}},
            <#noparse>#{</#noparse>${column.property},jdbcType=${column.jdbcType}},
        </#list>
        </trim>
src/main/resources/schemas/generator.dtd
@@ -19,9 +19,13 @@
        <!ATTLIST service interPackage CDATA #REQUIRED>
        <!ATTLIST service implPackage CDATA #REQUIRED>
        <!ATTLIST service queryPackage CDATA #REQUIRED>
        <!ATTLIST service adminVOPackage CDATA #IMPLIED>
        <!ELEMENT exception  EMPTY>
        <!ATTLIST exception package CDATA #REQUIRED>
        <!ATTLIST exception name CDATA #IMPLIED>
        <!ATTLIST exception base CDATA #IMPLIED>
        <!--表单配置信息 -->
@@ -52,7 +56,7 @@
        <!ATTLIST column property CDATA #REQUIRED>
        <!ATTLIST column title CDATA #REQUIRED>
        <!ATTLIST column order CDATA "0">
        <!ATTLIST column showType (TEXT|IMG|SWITCH) #IMPLIED>
        <!ATTLIST column showType (TEXT|DATETIME|IMG|SWITCH) #IMPLIED>
        <!ATTLIST column imgWidth CDATA "-1">
        <!ATTLIST column imgHeight CDATA "-1">
@@ -74,7 +78,7 @@
        <!ELEMENT verify  EMPTY>
        <!ATTLIST verify type (number|phone|email|date|url|identity|regex|none) #REQUIRED>
        <!ATTLIST verify type (number|phone|email|date|datetime|url|identity|regex|none) #REQUIRED>
        <!ATTLIST verify express CDATA #IMPLIED>
        <!ATTLIST verify notify CDATA #IMPLIED>
        <!ATTLIST verify require (true|false) #IMPLIED>