| | |
| | | |
| | | 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")); |
| | | |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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() { |
| | |
| | | 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) { |
| | |
| | | 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) { |
| | |
| | | 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); |
| | |
| | | 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); |