#
Junjie
1 天以前 2d2fd991826837d7189cc488aee6f309a6f5e216
src/main/java/com/core/generators/CoolGenerator.java
@@ -31,7 +31,7 @@
    private static final String[] ALL_TEMPLATES = {
            "Controller", "Service", "ServiceImpl", "Mapper", "Entity",
            "Xml", "Html", "HtmlDetail", "Js", "Sql"
            "Xml", "Html", "Js", "Sql"
    };
    private static final Set<String> SYSTEM_MODEL = new LinkedHashSet<>(Arrays.asList("User", "Host"));
@@ -46,7 +46,6 @@
    public boolean entity = true;
    public boolean xml = true;
    public boolean html = true;
    public boolean htmlDetail = false;
    public boolean js = true;
    public boolean sql = true;
    public SqlOsType sqlOsType;
@@ -61,9 +60,11 @@
    private String xmlContent;
    private String htmlSearchContent;
    private String htmlDialogContent;
    private String htmlDetailContent;
    private String jsTableContent;
    private String jsDateContent;
    private String vueFieldMetaContent;
    private String vueSearchRangeField;
    private String vueSearchRangeLabel;
    private String primaryKeyColumn;
    private String primaryKeyType;
    private String majorColumn;
@@ -115,11 +116,6 @@
                    enabled = html;
                    fileDir = frontendPrefixPath + "src/main/webapp//views/" + simpleEntityName + "/";
                    fileName = simpleEntityName + ".html";
                    break;
                case "HtmlDetail":
                    enabled = htmlDetail;
                    fileDir = frontendPrefixPath + "src/main/webapp//views/" + simpleEntityName + "/";
                    fileName = simpleEntityName + "_detail.html";
                    break;
                case "Js":
                    enabled = js;
@@ -182,9 +178,12 @@
        xmlContent = buildXmlContent();
        htmlSearchContent = buildHtmlSearchContent();
        htmlDialogContent = buildHtmlDialogContent();
        htmlDetailContent = buildHtmlDetailContent();
        jsTableContent = buildJsTableContent();
        jsDateContent = buildJsDateContent();
        vueFieldMetaContent = buildVueFieldMetaContent();
        Column rangeColumn = resolveRangeSearchColumn();
        vueSearchRangeField = rangeColumn == null ? "" : rangeColumn.getName();
        vueSearchRangeLabel = rangeColumn == null ? "" : GeneratorUtils.supportHtmlName(rangeColumn.getComment());
    }
    private void validate() {
@@ -559,39 +558,6 @@
        return trimTrailingBlankLines(builder.toString());
    }
    private String buildHtmlDetailContent() {
        StringBuilder builder = new StringBuilder();
        for (Column column : columns) {
            String field = column.getHumpName();
            String label = GeneratorUtils.supportHtmlName(column.getComment());
            if (column.isPrimaryKey()) {
                builder.append("        <div class=\"layui-inline\" style=\"display: none\">\n");
                builder.append("            <label class=\"layui-form-label\">").append(label).append(":</label>\n");
                builder.append("            <div class=\"layui-input-inline\">\n");
                builder.append("                <input id=\"").append(field).append("\" class=\"layui-input\" type=\"text\" placeholder=\"")
                        .append(column.getComment()).append("\">\n");
                builder.append("            </div>\n");
                builder.append("        </div>\n");
                continue;
            }
            builder.append("        <div class=\"layui-inline\">\n");
            builder.append("            <label class=\"layui-form-label\">");
            if (column.isNotNull()) {
                builder.append("<span class=\"not-null\">*</span>");
            }
            builder.append(label).append(":</label>\n");
            builder.append("            <div class=\"layui-input-inline");
            if (!Cools.isEmpty(column.getForeignKeyMajor())) {
                builder.append(" cool-auto-complete");
            }
            builder.append("\">\n");
            appendDetailFormField(builder, column, "                ");
            builder.append("            </div>\n");
            builder.append("        </div>\n");
        }
        return trimTrailingBlankLines(builder.toString());
    }
    private String buildJsTableContent() {
        StringBuilder builder = new StringBuilder();
        for (Column column : columns) {
@@ -631,6 +597,140 @@
            builder.append("            });\n");
        }
        return trimTrailingBlankLines(builder.toString());
    }
    private String buildVueFieldMetaContent() {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < columns.size(); i++) {
            Column column = columns.get(i);
            builder.append("    {\n");
            builder.append("        field: '").append(column.getHumpName()).append("',\n");
            builder.append("        columnName: '").append(column.getName()).append("',\n");
            builder.append("        label: '").append(escapeJs(GeneratorUtils.supportHtmlName(column.getComment()))).append("',\n");
            builder.append("        tableProp: '").append(resolveDisplayField(column)).append("',\n");
            builder.append("        exportField: '").append(resolveDisplayField(column)).append("',\n");
            builder.append("        kind: '").append(resolveVueFieldKind(column)).append("',\n");
            builder.append("        valueType: '").append(resolveVueValueType(column)).append("',\n");
            builder.append("        required: ").append(column.isNotNull()).append(",\n");
            builder.append("        primaryKey: ").append(column.isPrimaryKey()).append(",\n");
            builder.append("        sortable: ").append(column.isPrimaryKey()).append(",\n");
            builder.append("        textarea: ").append(isLongTextField(column)).append(",\n");
            builder.append("        minWidth: ").append(resolveVueMinWidth(column)).append(",\n");
            builder.append("        enumOptions: ").append(buildVueEnumOptions(column)).append(",\n");
            builder.append("        foreignQuery: '")
                    .append(Cools.isEmpty(column.getForeignKey()) ? "" : escapeJs(GeneratorUtils.firstCharConvert(column.getForeignKey())))
                    .append("',\n");
            builder.append("        checkboxActiveRaw: '").append(resolveCheckboxActiveRaw(column)).append("',\n");
            builder.append("        checkboxInactiveRaw: '").append(resolveCheckboxInactiveRaw(column)).append("'\n");
            builder.append("    }");
            if (i < columns.size() - 1) {
                builder.append(",");
            }
            builder.append("\n");
        }
        return trimTrailingBlankLines(builder.toString());
    }
    private String resolveVueFieldKind(Column column) {
        if (column.isImage()) {
            return "image";
        }
        if (column.isCheckBox()) {
            return "checkbox";
        }
        if ("Date".equals(column.getType())) {
            return "date";
        }
        if (!Cools.isEmpty(column.getEnums())) {
            return "enum";
        }
        if (!Cools.isEmpty(column.getForeignKeyMajor())) {
            return "foreign";
        }
        return "text";
    }
    private String resolveVueValueType(Column column) {
        return isNumericType(column.getType()) ? "number" : "string";
    }
    private boolean isNumericType(String type) {
        return "Integer".equals(type)
                || "Long".equals(type)
                || "Double".equals(type)
                || "Float".equals(type)
                || "Short".equals(type)
                || "BigDecimal".equals(type)
                || "Byte".equals(type);
    }
    private String buildVueEnumOptions(Column column) {
        if (Cools.isEmpty(column.getEnums())) {
            return "[]";
        }
        StringBuilder builder = new StringBuilder("[");
        boolean first = true;
        for (Map<String, Object> map : column.getEnums()) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                if (!first) {
                    builder.append(", ");
                }
                builder.append("{ rawValue: '").append(escapeJs(String.valueOf(entry.getKey())))
                        .append("', label: '").append(escapeJs(String.valueOf(entry.getValue()))).append("' }");
                first = false;
            }
        }
        builder.append("]");
        return builder.toString();
    }
    private boolean isLongTextField(Column column) {
        if (column.isImage()) {
            return false;
        }
        if (column.getLength() != null && column.getLength() >= 120) {
            return true;
        }
        String name = column.getName() == null ? "" : column.getName().toLowerCase();
        String comment = column.getComment() == null ? "" : column.getComment();
        return name.contains("memo")
                || name.contains("remark")
                || name.contains("response")
                || name.contains("request")
                || name.contains("content")
                || comment.contains("备注")
                || comment.contains("响应")
                || comment.contains("报文")
                || comment.contains("描述")
                || comment.contains("内容");
    }
    private int resolveVueMinWidth(Column column) {
        if (column.isPrimaryKey()) {
            return 90;
        }
        if ("Date".equals(column.getType())) {
            return 168;
        }
        if (column.isImage()) {
            return 140;
        }
        if (isLongTextField(column)) {
            return 180;
        }
        if (!Cools.isEmpty(column.getEnums()) || column.isCheckBox()) {
            return 120;
        }
        int base = GeneratorUtils.supportHtmlName(column.getComment()).length() * 18 + 26;
        return Math.max(110, Math.min(base, 180));
    }
    private String resolveCheckboxActiveRaw(Column column) {
        return isNumericType(column.getType()) ? "1" : "Y";
    }
    private String resolveCheckboxInactiveRaw(Column column) {
        return isNumericType(column.getType()) ? "0" : "N";
    }
    private String resolveDisplayField(Column column) {
@@ -716,51 +816,6 @@
        builder.append(inputIndent).append("</select>\n");
    }
    private void appendDetailFormField(StringBuilder builder, Column column, String inputIndent) {
        String field = column.getHumpName();
        if (Cools.isEmpty(column.getEnums())) {
            if (!Cools.isEmpty(column.getForeignKeyMajor())) {
                String queryKey = GeneratorUtils.firstCharConvert(column.getForeignKey()) + "QueryBy" + field;
                builder.append(inputIndent).append("<input id=\"").append(field)
                        .append("\" class=\"layui-input\" type=\"text\" style=\"display: none\">\n");
                builder.append(inputIndent).append("<input id=\"").append(field).append("$\" class=\"layui-input cool-auto-complete-div\" onclick=\"autoShow(this.id)\" type=\"text\" placeholder=\"请输入")
                        .append(column.getComment()).append("\" onfocus=this.blur() autocomplete=\"off\">\n");
                builder.append(inputIndent).append("<div class=\"cool-auto-complete-window\">\n");
                builder.append(inputIndent).append("    <input class=\"cool-auto-complete-window-input\" data-key=\"")
                        .append(queryKey).append("\" onkeyup=\"autoLoad(this.getAttribute('data-key'))\">\n");
                builder.append(inputIndent).append("    <select class=\"cool-auto-complete-window-select\" data-key=\"")
                        .append(queryKey).append("Select\" onchange=\"confirmed(this.getAttribute('data-key'))\" multiple=\"multiple\">\n");
                builder.append(inputIndent).append("    </select>\n");
                builder.append(inputIndent).append("</div>\n");
                return;
            }
            builder.append(inputIndent).append("<input id=\"").append(field);
            if ("Date".equals(column.getType())) {
                builder.append("$");
            }
            builder.append("\" class=\"layui-input\" type=\"text\" placeholder=\"").append(column.getComment())
                    .append("\" autocomplete=\"off\"");
            if (column.isNotNull()) {
                builder.append(" lay-verify=\"required\"");
            }
            builder.append(">\n");
            return;
        }
        builder.append(inputIndent).append("<select id=\"").append(field).append("\"");
        if (column.isNotNull()) {
            builder.append(" lay-verify=\"required\"");
        }
        builder.append(">\n");
        builder.append(inputIndent).append("    <option value=\"\">请选择").append(column.getComment()).append("</option>\n");
        for (Map<String, Object> map : column.getEnums()) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                builder.append(inputIndent).append("    <option value=\"").append(entry.getKey()).append("\">")
                        .append(entry.getValue()).append("</option>\n");
            }
        }
        builder.append(inputIndent).append("</select>\n");
    }
    private String renderTemplate(String template) {
        Map<String, String> values = new LinkedHashMap<>();
        values.put("COMPANYNAME", packagePath);
@@ -773,9 +828,11 @@
        values.put("XMLCONTENT", xmlContent);
        values.put("HTMLSEARCHCONTENT", htmlSearchContent);
        values.put("HTMLDIALOGCONTENT", htmlDialogContent);
        values.put("HTMLDETAILCONTENT", htmlDetailContent);
        values.put("JSTABLECONTENT", jsTableContent);
        values.put("JSDATECONTENT", jsDateContent);
        values.put("VUEFIELDMETA", vueFieldMetaContent);
        values.put("VUESEARCHRANGEFIELD", vueSearchRangeField);
        values.put("VUESEARCHRANGELABEL", vueSearchRangeLabel);
        values.put("PRIMARYKEYCOLUMN", GeneratorUtils.firstCharConvert(primaryKeyColumn, false));
        values.put("PRIMARYKEYCOLUMN0", primaryKeyColumn);
        values.put("PRIMARYKEYTYPE", primaryKeyType);