| package com.vincent.rsf.framework.generators; | 
|   | 
| import com.vincent.rsf.framework.common.Cools; | 
| import com.vincent.rsf.framework.generators.constant.SqlOsType; | 
| import com.vincent.rsf.framework.generators.domain.Column; | 
| import com.vincent.rsf.framework.generators.utils.GeneratorUtils; | 
| import org.springframework.core.io.ClassPathResource; | 
|   | 
| import java.io.*; | 
| import java.sql.*; | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| /** | 
|  * Created by vincent on 2019-06-18 | 
|  */ | 
| public class ReactGenerator { | 
|   | 
|     private static final String BASE_DIR = "src/main/"; | 
|     private static final String JAVA_DIR = BASE_DIR + "java/"; | 
|     private static final String XML_DIR = BASE_DIR + "resources/mapper/"; | 
|     private static final String HTML_DIR = BASE_DIR + "webapp/"; | 
|     private static final String[] ALL_TEMPLATES = new String[]{ | 
|             "Controller", | 
|             "Service", | 
|             "ServiceImpl", | 
|             "Mapper", | 
|             "Entity", | 
|             "Xml", | 
|             "Sql", | 
|             "ReactCreate", | 
|             "ReactEdit", | 
|             "ReactList", | 
|             "ReactPanel", | 
|             "Index", | 
|     }; | 
|     private static final ArrayList<String> SYSTEM_MODEL = new ArrayList<String>(){{ | 
|             add("User"); | 
|             add("Tenant"); | 
|     }}; | 
|   | 
|   | 
|     public String url; | 
|     public String username; | 
|     public String password; | 
|     public String table; | 
|     public String tableDesc; | 
|     public String packagePath; | 
|     public boolean controller = true; | 
|     public boolean service = true; | 
|     public boolean mapper = true; | 
|     public boolean entity = true; | 
|     public boolean xml = true; | 
|     public boolean react = true; | 
|     public boolean sql = true; | 
|     public SqlOsType sqlOsType; | 
|     public String backendPrefixPath; | 
|     public String frontendPrefixPath; | 
|   | 
|     private List<Column> columns = new ArrayList<>(); | 
|     private String fullEntityName;          // 大写表名 - UserRole | 
|     private String simpleEntityName;        // 小写表名 - userRole | 
|     private String entityImport;            // Entity类Import | 
|     private String entityContent;           // Entity内容 | 
|     private String primaryKeyColumn;        // 主键小驼峰 default:id | 
|     private String majorColumn;             // 显示主键小驼峰 - name / uuid | 
|     private String systemPackagePath;       // system 包路径 | 
|     private String systemPackage;           // | 
|     private String itemName;                // 包路径最后一个元素: manager(com.vincent.rsf.manager.manager) | 
|   | 
|     private String reactCreateContent;      // ReactCreate字段 | 
|     private String reactEditContent;      // ReactCreate字段 | 
|     private String reactListContent;      // ReactList字段 | 
|     private String reactListFilterRContent;      // ReactListFilter字段 | 
|     private String reactPanelContent;           // ReactPanel字段 | 
|     private String reactLocaleContent;          // 国际化配置 | 
|   | 
|     private void init() throws Exception { | 
|         gainDbInfo(); | 
|         fullEntityName = GeneratorUtils.getNameSpace(table); | 
|         simpleEntityName = fullEntityName.substring(0, 1).toLowerCase()+fullEntityName.substring(1); | 
|         entityContent = createEntityMsg(); | 
|         primaryKeyColumn = createPrimaryMsg(); | 
|         majorColumn = createMajorMsg(); | 
|         String[] packagePathSplit = packagePath.split("\\."); | 
|         systemPackagePath = packagePath.replaceAll(packagePathSplit[packagePathSplit.length-1], "system"); | 
|         String[] split = systemPackagePath.split("\\."); | 
|         systemPackage = ""; | 
|         for (int i = 1; i <= split.length; i++) { | 
|             if (i != split.length) { | 
|                 if (i == split.length - 1) { | 
|                     systemPackage = systemPackage + split[i-1]; | 
|                 } else { | 
|                     systemPackage = systemPackage + split[i-1] + "."; | 
|                 } | 
|             } | 
|         } | 
|         itemName = packagePathSplit[packagePathSplit.length - 1]; | 
|   | 
|         reactCreateContent = createReactCreateContent(); | 
|         reactEditContent = createReactEditContent(); | 
|         reactListContent = createReactListContent(); | 
|         reactListFilterRContent = createReactListFilterRContent(); | 
|         reactPanelContent = createReactPanelContent(); | 
|         reactLocaleContent = createReactLocaleContent(); | 
|     } | 
|   | 
|     public void build() throws Exception { | 
|         init(); | 
|         for (String template : ALL_TEMPLATES){ | 
|             boolean pass = false; | 
|             String lowerCase = template.toLowerCase(); | 
|             String templatePath = lowerCase.contains("impl")?lowerCase.substring(0,lowerCase.length()-4)+"/"+lowerCase.substring(lowerCase.length()-4):lowerCase; | 
|             String directory=""; | 
|             String fileName=""; | 
|             switch (template){ | 
|                 case "Controller": | 
|                     pass = controller; | 
|                     directory = backendPrefixPath + JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/"; | 
|                     fileName = fullEntityName+template+".java"; | 
|                     break; | 
|                 case "Service": | 
|                     pass = service; | 
|                     directory = backendPrefixPath + JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/"; | 
|                     fileName = fullEntityName+template+".java"; | 
|                     break; | 
|                 case "ServiceImpl": | 
|                     pass = service; | 
|                     directory = backendPrefixPath + JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/"; | 
|                     fileName = fullEntityName+template+".java"; | 
|                     break; | 
|                 case "Mapper": | 
|                     pass = mapper; | 
|                     directory = backendPrefixPath + JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/"; | 
|                     fileName = fullEntityName+template+".java"; | 
|                     break; | 
|                 case "Entity": | 
|                     pass = entity; | 
|                     directory = backendPrefixPath + JAVA_DIR + packagePath.replace(".", "/")+"/"+templatePath+"/"; | 
|                     fileName = fullEntityName+".java"; | 
|                     break; | 
|                 case "Xml": | 
|                     pass = xml; | 
|                     directory = backendPrefixPath + XML_DIR + itemName + "/"; | 
|                     fileName = fullEntityName+"Mapper.xml"; | 
|                     break; | 
|                 case "Sql": | 
|                     pass = sql; | 
|                     directory = backendPrefixPath + JAVA_DIR; | 
|                     fileName = simpleEntityName+".sql"; | 
|                     break; | 
|                 case "ReactCreate": | 
|                     pass = react; | 
|                     directory = frontendPrefixPath + "/src/page/" + simpleEntityName + "/"; | 
|                     fileName = fullEntityName + "Create.jsx"; | 
|                     break; | 
|                 case "ReactEdit": | 
|                     pass = react; | 
|                     directory = frontendPrefixPath + "/src/page/" + simpleEntityName + "/"; | 
|                     fileName = fullEntityName + "Edit.jsx"; | 
|                     break; | 
|                 case "ReactList": | 
|                     pass = react; | 
|                     directory = frontendPrefixPath + "/src/page/" + simpleEntityName + "/"; | 
|                     fileName = fullEntityName + "List.jsx"; | 
|                     break; | 
|                 case "ReactPanel": | 
|                     pass = react; | 
|                     directory = frontendPrefixPath + "/src/page/" + simpleEntityName + "/"; | 
|                     fileName = fullEntityName + "Panel.jsx"; | 
|                     break; | 
|                 case "Index": | 
|                     pass = react; | 
|                     directory = frontendPrefixPath + "/src/page/" + simpleEntityName + "/"; | 
|                     fileName = "index.jsx"; | 
|                     break; | 
|                 default: | 
|                     break; | 
|             } | 
|             if (!pass){ continue; } | 
|             String content = readFile(template); | 
|             writeFile(content, directory, fileName, template); | 
|         } | 
|     } | 
|   | 
|     private String readFile(String template){ | 
|         StringBuilder txtContentBuilder=new StringBuilder(); | 
|         ClassPathResource classPath=new ClassPathResource("templates/react-admin/"+template + ".txt"); | 
|   | 
|         try (BufferedReader reader = new BufferedReader(new InputStreamReader(classPath.getInputStream()))) { | 
|             String lineContent; | 
|             while ((lineContent = reader.readLine()) != null) { | 
|                 txtContentBuilder.append(lineContent).append("\n"); | 
|             } | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|         } | 
|         return txtContentBuilder.toString(); | 
|     } | 
|   | 
|     private void writeFile(String content, String directory, String fileName, String template) throws IOException { | 
|         File codeDirectory=new File(directory); | 
|         if(!codeDirectory.exists()){ | 
|             codeDirectory.mkdirs(); | 
|         } | 
|   | 
|         File writerFile=new File(directory+fileName); | 
|         if(!writerFile.exists()){ | 
|             content=content. | 
|                     replaceAll("@\\{TABLENAME}", table) | 
|                     .replaceAll("@\\{TABLEDESC}", tableDesc) | 
|                     .replaceAll("@\\{ENTITYIMPORT}", entityImport) | 
|                     .replaceAll("@\\{ENTITYCONTENT}", entityContent) | 
|                     .replaceAll("@\\{ENTITYNAME}", fullEntityName) | 
|                     .replaceAll("@\\{SIMPLEENTITYNAME}", simpleEntityName) | 
|                     .replaceAll("@\\{UENTITYNAME}", simpleEntityName) | 
|                     .replaceAll("@\\{COMPANYNAME}",packagePath) | 
|                     .replaceAll("@\\{ITEMNAME}",itemName) | 
| //                    .replaceAll("@\\{XMLCONTENT}", xmlContent) | 
|                     .replaceAll("@\\{MAJORCOLUMN}", GeneratorUtils.firstCharConvert(majorColumn, false))    // majorColumn UpCase | 
|                     .replaceAll("@\\{MAJORCOLUMN_LINE}", GeneratorUtils.humpToLine(majorColumn)) | 
|                     .replaceAll("@\\{MAJORCOLUMN_UP}", GeneratorUtils.firstCharConvert(majorColumn, false)) | 
|                     .replaceAll("@\\{MAJORCOLUMN_LOW}", GeneratorUtils.firstCharConvert(majorColumn, true)) | 
|                     .replaceAll("@\\{PRIMARYKEYCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false)) | 
|                     .replaceAll("@\\{PRIMARYKEYCOLUMN0}", GeneratorUtils.firstCharConvert(primaryKeyColumn, true)) | 
|                     .replaceAll("@\\{UPCASEMARJORCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false)) | 
|                     .replaceAll("@\\{SYSTEMPACKAGE}",systemPackage) | 
|   | 
|                     .replaceAll("@\\{REACTCREATECONTENT}",reactCreateContent) | 
|                     .replaceAll("@\\{REACTEDITCONTENT}",reactEditContent) | 
|                     .replaceAll("@\\{REACTLISTCONTENT}",reactListContent) | 
|                     .replaceAll("@\\{REACTLISTFILTERCONTENT}",reactListFilterRContent) | 
|                     .replaceAll("@\\{REACTPANELCONTENT}", reactPanelContent) | 
|                     .replaceAll("@\\{REACTLOCALECONTENT}", reactLocaleContent) | 
|             ; | 
|             writerFile.createNewFile(); | 
|             BufferedWriter writer=new BufferedWriter(new FileWriter(writerFile)); | 
|             writer.write(content); | 
|             writer.flush(); | 
|             writer.close(); | 
|             System.out.println(fullEntityName+template+" 源文件创建成功!"); | 
|         }else{ | 
|             System.out.println(fullEntityName+template+" 源文件已经存在创建失败!"); | 
|         } | 
|     } | 
|   | 
|     private void gainDbInfo() throws Exception { | 
|         Connection conn; | 
|         if (null == this.sqlOsType) { | 
|             throw new RuntimeException("请选择sqlOsType!"); | 
|         } | 
|         if (null == this.table) { | 
|             throw new RuntimeException("请输入table!"); | 
|         } | 
|         if (null == this.tableDesc) { | 
|             throw new RuntimeException("请输入tableDesc!"); | 
|         } | 
|         switch (this.sqlOsType) { | 
|             case MYSQL: | 
|                 Class.forName("com.mysql.jdbc.Driver").newInstance(); | 
|                 conn = DriverManager.getConnection("jdbc:mysql://"+url, username, password); | 
|                 this.columns = getMysqlColumns(conn, table, true, sqlOsType); | 
|                 break; | 
|             case SQL_SERVER: | 
|                 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); | 
|                 conn = DriverManager.getConnection("jdbc:sqlserver://"+url, username, password); | 
|                 this.columns = getSqlServerColumns(conn, table, true, sqlOsType); | 
|                 break; | 
|             default: | 
|                 throw new RuntimeException("请指定数据库类型!"); | 
|         } | 
|   | 
|     } | 
|   | 
|     // mysql | 
|     public static List<Column> getMysqlColumns(Connection conn, String table, boolean init, SqlOsType sqlOsType) throws Exception { | 
|         List<Column> result = new ArrayList<>(); | 
|         PreparedStatement ps = conn.prepareStatement("select * from " + table); | 
|         ResultSetMetaData meta = ps.executeQuery().getMetaData(); | 
|         // 单表字段数量 | 
|         int count = meta.getColumnCount(); | 
|         ResultSet resultSet = ps.executeQuery("show full columns from " + table); | 
|         for (int i = 1; i < count + 1; i++) { | 
|             String columnName = meta.getColumnName(i); | 
|             if (resultSet.next() && columnName.equals(resultSet.getString("Field"))){ | 
|                 result.add(new Column( | 
|                         conn, | 
|                         meta.getColumnName(i), | 
|                         GeneratorUtils.getType(meta.getColumnType(i)), | 
|                         resultSet.getString("Comment"), | 
|                         resultSet.getString("Key").equals("PRI"), | 
|                         resultSet.getString("Key").equals("PRI"), | 
|                         resultSet.getString("Null").equals("NO"), | 
|                         GeneratorUtils.getColumnLength(resultSet.getString("Type")), | 
|                         init, | 
|                         sqlOsType | 
|                 )); | 
|             } | 
|             result.forEach(column -> System.out.println(column.toString())); | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     // sqlserver | 
|     public static List<Column> getSqlServerColumns(Connection conn, String table, boolean init, SqlOsType sqlOsType) throws Exception { | 
|         List<Column> result = new ArrayList<>(); | 
|         PreparedStatement ps = conn.prepareStatement("select * from " + table); | 
|         ResultSetMetaData meta = ps.executeQuery().getMetaData(); | 
|         // 单表字段数量 | 
|         int count = meta.getColumnCount(); | 
|         StringBuilder sql = new StringBuilder("SELECT \n" + | 
|                 "       'Field'= a.name,\n" + | 
|                 "       'Comment'= isnull(g.[value],''),\n" + | 
|                 "       'Key'= case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then 'PRI' else '' end,\n" + | 
|                 "       'Main'= case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 'PRI' else '' end,"+ | 
|                 "       'Type'= b.name,\n" + | 
|                 "       'Length'= COLUMNPROPERTY(a.id,a.name,'PRECISION'),\n" + | 
|                 "       'Decimals'= isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),\n" + | 
|                 "       'Null'= case when a.isnullable=1 then 'Yes' else 'No' end,\n" + | 
|                 "       'Default' = isnull(e.text,'')\n" + | 
|                 "FROM  syscolumns a\n" + | 
|                 "LEFT JOIN  systypes b on a.xusertype=b.xusertype\n" + | 
|                 "INNER JOIN sysobjects d on  a.id=d.id  and d.xtype='U' and  d.name<>'dtproperties'\n" + | 
|                 "LEFT JOIN  syscomments e on  a.cdefault=e.id\n" + | 
|                 "LEFT JOIN  sys.extended_properties g on  a.id=G.major_id and a.colid=g.minor_id  \n" + | 
|                 "LEFT JOIN  sys.extended_properties f on  d.id=f.major_id and f.minor_id=0 where d.name = '") | 
|                 .append(table).append("' ORDER BY a.colorder ASC"); | 
|         ResultSet resultSet = conn.prepareStatement(sql.toString()).executeQuery(); | 
|         for (int i = 1; i < count + 1; i++) { | 
|             String columnName = meta.getColumnName(i); | 
|             if (resultSet.next() && columnName.equals(resultSet.getString("Field"))){ | 
|                 result.add(new Column( | 
|                         conn, | 
|                         meta.getColumnName(i), | 
|                         GeneratorUtils.getType(meta.getColumnType(i)), | 
|                         resultSet.getString("Comment"), | 
|                         resultSet.getString("Key").equals("PRI"), | 
|                         resultSet.getString("Main").equals("PRI"), | 
|                         resultSet.getString("Null").equals("No"), | 
|                         GeneratorUtils.getColumnLength(resultSet.getString("Type")), | 
|                         init, | 
|                         sqlOsType | 
|                 )); | 
|             } | 
|         } | 
|         result.forEach(column -> System.out.println(column.toString())); | 
|         return result; | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************* Entity动态字段 *******************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createEntityMsg(){ | 
|         if (Cools.isEmpty(systemPackagePath)) { | 
|             String[] packagePathSplit = packagePath.split("\\."); | 
|             systemPackagePath = packagePath.replaceAll(packagePathSplit[packagePathSplit.length-1], "system"); | 
|         } | 
|         if (columns.isEmpty()){ | 
|             return null; | 
|         } | 
|         StringBuilder sb = new StringBuilder(); | 
|         StringBuilder entityIm = new StringBuilder(); | 
|         boolean setTableField = true; | 
|         boolean setTableId = true; | 
|         boolean setDateTimeFormat = true; | 
|         for (Column column : columns){ | 
| //            System.out.println("------==========>"); | 
| //            System.out.println(column.getName()); | 
| //            System.out.println(column.getType()); | 
|             if (column.getType().equals("Date")){ | 
|                 entityIm.append("import java.text.SimpleDateFormat;\n") | 
|                         .append("import java.util.Date;\n"); | 
|             } | 
|   | 
|             // 注释 | 
|             if (!Cools.isEmpty(column.getComment())){ | 
|                 sb.append("    /**\n") | 
|                         .append("     * ") | 
|                         .append(column.getWholeComment()) | 
|                         .append("\n") | 
|                         .append("     */") | 
|                         .append("\n"); | 
|             } | 
|   | 
|             // swagger | 
|             sb.append("    @ApiModelProperty(value= \"") | 
|                     .append(column.getWholeComment()) | 
|                     .append("\")\n"); | 
|   | 
|   | 
|             // 主键修饰 | 
|             if (column.isMainKey()){ | 
|                 if (column.isOnly()){ | 
|                     sb.append("    ") | 
|                             .append("@TableId(value = \"") | 
|                             .append(column.getName()) | 
|                             .append("\", type = IdType.AUTO)") | 
|                             .append("\n"); | 
|                 } else { | 
|                     sb.append("    ") | 
|                             .append("@TableId(value = \"") | 
|                             .append(column.getName()) | 
|                             .append("\", type = IdType.INPUT)") | 
|                             .append("\n"); | 
|                 } | 
|   | 
|             } | 
|   | 
|             if (column.getName().equals("deleted")) { | 
|                 entityIm.append("import com.baomidou.mybatisplus.annotation.TableLogic;\n"); | 
|                 sb.append("    ") | 
|                         .append("@TableLogic\n"); | 
|             } | 
|   | 
|             if ("Date".equals(column.getType())){ | 
|                 if (setDateTimeFormat){ | 
|                     entityIm.append("import org.springframework.format.annotation.DateTimeFormat;").append("\n"); | 
|                     setDateTimeFormat = false; | 
|                 } | 
|                 sb.append("    ") | 
|                         .append("@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")") | 
|                         .append("\n"); | 
|             } | 
|   | 
|             sb.append("    ") | 
|                     .append("private ") | 
|                     .append(column.getType()) | 
|                     .append(" ") | 
|                     .append(column.getHumpName()) | 
|                     .append(";") | 
|                     .append("\n") | 
|                     .append("\n"); | 
|         } | 
|   | 
|         // default constructor | 
|         sb.append("    public ").append(fullEntityName).append("() {}\n\n"); | 
|         // full constructor | 
|         sb.append("    public ").append(fullEntityName).append("("); | 
|         for (Column column : columns){ | 
|             if (column.isOnly()){ continue;} | 
|             sb.append(column.getType()).append(" ").append(column.getHumpName()).append(","); | 
|         } | 
|         sb.deleteCharAt(sb.length()-1); | 
|         sb.append(") {\n"); | 
|         for (Column column : columns){ | 
|             if (column.isPrimaryKey()){ continue;} | 
|             sb.append("        this.").append(column.getHumpName()).append(" = ").append(column.getHumpName()).append(";\n"); | 
|         } | 
|         sb.append("    }\n\n"); | 
|         // constructor tips | 
|         sb.append("//    ").append(fullEntityName).append(" ").append(simpleEntityName).append(" = new ").append(fullEntityName).append("(\n"); | 
|         for (int i = 0; i<columns.size(); i++) { | 
|             if (columns.get(i).isOnly()){ continue;} | 
|             sb.append("//            null"); | 
|             if (i < columns.size()-1){ | 
|                 sb.append(","); | 
|             } | 
|             sb.append("    // ").append(columns.get(i).getComment()).append(columns.get(i).isNotNull()?"[非空]":""); | 
|             if (i < columns.size()-1){ | 
|                 sb.append("\n"); | 
|             } | 
|         } | 
|         sb.append("\n//    );\n\n"); | 
|   | 
|         // get set | 
|         for (Column column : columns){ | 
|             // 时间字段增加$格式化 | 
|             if ("Date".equals(column.getType())){ | 
|                 sb.append("    public String get") | 
|                         .append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1)) | 
|                         .append("\\$") | 
|                         .append("(){\n") | 
|                         .append("        if (Cools.isEmpty(this.").append(column.getHumpName()).append(")){\n") | 
|                         .append("            return \"\";\n") | 
|                         .append("        }\n") | 
|                         .append("        return new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(this.") | 
|                         .append(column.getHumpName()) | 
|                         .append(");\n") | 
|                         .append("    }\n\n"); | 
|                 // 枚举字段增加$格式化 | 
|             } else if (!Cools.isEmpty(column.getEnums())){ | 
|                 if (!column.getHumpName().equals("deleted")) { | 
|                     sb.append("    public String get") | 
|                             .append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1)) | 
|                             .append("\\$") | 
|                             .append("(){\n") | 
|                             .append("        if (null == this.").append(column.getHumpName()).append("){ return null; }\n") | 
|                             .append("        switch (this.").append(column.getHumpName()).append("){\n"); | 
|                     for (Map<String, Object> map : column.getEnums()){ | 
|                         for (Map.Entry<String, Object> entry : map.entrySet()){ | 
|                             sb.append("            case ").append(entry.getKey()).append(":\n") | 
|                                     .append("                return \"").append(entry.getValue()).append("\";\n"); | 
|                         } | 
|                     } | 
|                     sb.append("            default:\n") | 
|                             .append("                return String.valueOf(this.").append(column.getHumpName()).append(");\n") | 
|                             .append("        }\n") | 
|                             .append("    }\n\n"); | 
|                 } | 
|             } | 
|   | 
|             // 外键修饰 | 
|             if (!Cools.isEmpty(column.getForeignKey()) && !column.getForeignKey().equals("Tenant")){ | 
|                 sb.append("    public String get").append(column.getHumpName().substring(0, 1).toUpperCase()).append(column.getHumpName().substring(1)).append("\\$").append("(){\n") | 
|                         .append("        ").append(column.getForeignKey()).append("Service service = SpringUtils.getBean(").append(column.getForeignKey()).append("Service.class);\n") | 
|                         .append("        ").append(column.getForeignKey()).append(" ").append(GeneratorUtils.firstCharConvert(column.getForeignKey())) | 
|                         .append(" = service.getById(this.").append(column.getHumpName()).append(");\n") | 
|                         .append("        if (!Cools.isEmpty(").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append(")){\n") | 
|                         .append("            return String.valueOf(").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append(".get").append(column.getForeignKeyMajor()).append("());\n") | 
|                         .append("        }\n") | 
|                         .append("        return null;\n") | 
|                         .append("    }\n\n"); | 
|             } | 
|   | 
|         } | 
|         entityImport = entityIm.toString(); | 
|         return sb.toString(); | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /*********************************** Controller动态字段 *****************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createPrimaryMsg(){ | 
|         String defaultMajor = "id"; | 
|         boolean havePrimary = false; | 
|         for (Column column: columns){ | 
|             if (column.isPrimaryKey()){ | 
|                 defaultMajor = column.getHumpName(); | 
|                 havePrimary = true; | 
|             } | 
|         } | 
|         if (!havePrimary) { | 
|             for (Column column: columns){ | 
|                 if (column.isMainKey()){ | 
|                     defaultMajor = column.getHumpName(); | 
|                 } | 
|             } | 
|         } | 
|         return defaultMajor; | 
|     } | 
|   | 
|     private String createMajorMsg(){ | 
|         String defaultMajor = "id"; | 
|         for (Column column: columns){ | 
|             if (column.isPrimaryKey()){ | 
|                 defaultMajor = column.getHumpName(); | 
|             } | 
|             if (column.isMajor()){ | 
|                 return column.getHumpName(); | 
|             } | 
|         } | 
|         return defaultMajor; | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************** ReactCreat *******************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createReactCreateContent() { | 
|         StringBuilder sb = new StringBuilder(); | 
|         int count = 0; | 
|         for (Column column : columns){ | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|   | 
|             sb.append("                                <Grid item xs={6} display=\"flex\" gap={1}>\n"); | 
|             switch (column.getType()) { | 
|                 case "Boolean": | 
|                     sb.append("                                    <BooleanInput\n"); | 
|                     sb.append("                                        label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     if (columns.indexOf(column) == 1) { | 
|                         sb.append("                                        autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                        validate={required()}\n"); | 
|                     } | 
|                     sb.append("                                    />\n"); | 
|                     break; | 
|                 case "Short": | 
|                 case "Integer": | 
|                 case "Long": | 
|                 case "Double": | 
|                     if (!Cools.isEmpty(column.getForeignKeyMajor())) { | 
|                         sb.append("                                    <ReferenceInput\n"); | 
|                         sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                         sb.append("                                        reference=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("\"\n"); | 
|                         if (count == 0) { | 
|                             sb.append("                                        autoFocus\n"); | 
|                         } | 
|                         sb.append("                                    >\n"); | 
|                         sb.append("                                        <AutocompleteInput\n"); | 
|                         sb.append("                                            label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                         sb.append("                                            optionText=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append("\"\n"); | 
|                         sb.append("                                            filterToQuery={(val) => ({ ").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append(": val })}\n"); | 
|                         if (column.isNotNull()) { | 
|                             sb.append("                                            validate={required()}\n"); | 
|                         } | 
|                         sb.append("                                        />\n"); | 
|                         sb.append("                                    </ReferenceInput>\n"); | 
|                     } else { | 
|                         if (Cools.isEmpty(column.getEnums())) { | 
|                             sb.append("                                    <NumberInput\n"); | 
|                             sb.append("                                        label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                             if (count == 0) { | 
|                                 sb.append("                                        autoFocus\n"); | 
|                             } | 
|                             if (column.isNotNull()) { | 
|                                 sb.append("                                        validate={required()}\n"); | 
|                             } | 
|                             sb.append("                                    />\n"); | 
|                         } else { | 
|                             sb.append("                                    <SelectInput\n"); | 
|                             sb.append("                                        label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                        choices={[\n"); | 
|                             for (Map<String, Object> map : column.getEnums()) { | 
|                                 for (Map.Entry<String, Object> entry : map.entrySet()){ | 
|                                     sb.append("                                            { id: ").append(entry.getKey()).append(", name: '").append(entry.getValue()).append("' },\n"); | 
|                                 } | 
|                             } | 
|                             sb.append("                                        ]}\n"); | 
|                             sb.append("                                    />\n"); | 
|                         } | 
|                     } | 
|                     break; | 
|                 case "String": | 
|                     sb.append("                                    <TextInput\n"); | 
|                     sb.append("                                        label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                        parse={v => v}\n"); | 
|                     if (count == 0) { | 
|                         sb.append("                                        autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                        validate={required()}\n"); | 
|                     } | 
|                     sb.append("                                    />\n"); | 
|                     break; | 
|                 case "Date": | 
|                     sb.append("                                    <DateInput\n"); | 
|                     sb.append("                                        label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                        source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     if (count == 0) { | 
|                         sb.append("                                        autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                        validate={required()}\n"); | 
|                     } | 
|                     sb.append("                                    />\n"); | 
|                     break; | 
|                 default: | 
|                     break; | 
|             } | 
|   | 
|             sb.append("                                </Grid>\n"); | 
|             count++; | 
|         } | 
|         return sb.toString(); | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************** ReactEdit *******************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createReactEditContent() { | 
|         StringBuilder sb = new StringBuilder(); | 
|         int count = 0; | 
|         for (int i = 0; i < columns.size(); i++) { | 
|             Column column = columns.get(i); | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|   | 
|             sb.append("                        <Stack direction='row' gap={2}>\n"); | 
|   | 
|             switch (column.getType()) { | 
|                 case "Boolean": | 
|                     sb.append("                            <BooleanInput\n"); | 
|                     sb.append("                                label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     if (columns.indexOf(column) == 1) { | 
|                         sb.append("                                autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                validate={required()}\n"); | 
|                     } | 
|                     sb.append("                            />\n"); | 
|                     break; | 
|                 case "Short": | 
|                 case "Integer": | 
|                 case "Long": | 
|                 case "Double": | 
|                     if (!Cools.isEmpty(column.getForeignKeyMajor())) { | 
|                         sb.append("                            <ReferenceInput\n"); | 
|                         sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                         sb.append("                                reference=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("\"\n"); | 
|                         sb.append("                                perPage={REFERENCE_INPUT_PAGESIZE}\n"); | 
|                         if (count == 0) { | 
|                             sb.append("                                autoFocus\n"); | 
|                         } | 
|                         sb.append("                            >\n"); | 
|                         sb.append("                                <AutocompleteInput\n"); | 
|                         sb.append("                                    label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                         sb.append("                                    optionText=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append("\"\n"); | 
|                         sb.append("                                    filterToQuery={(val) => ({ ").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append(": val })}\n"); | 
|                         if (column.isNotNull()) { | 
|                             sb.append("                                    validate={required()}\n"); | 
|                         } | 
|                         sb.append("                                />\n"); | 
|                         sb.append("                            </ReferenceInput>\n"); | 
|                     } else { | 
|                         if (Cools.isEmpty(column.getEnums())) { | 
|                             sb.append("                            <NumberInput\n"); | 
|                             sb.append("                                label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                             if (count == 0) { | 
|                                 sb.append("                                autoFocus\n"); | 
|                             } | 
|                             if (column.isNotNull()) { | 
|                                 sb.append("                                validate={required()}\n"); | 
|                             } | 
|                             sb.append("                            />\n"); | 
|                         } else { | 
|                             sb.append("                            <SelectInput\n"); | 
|                             sb.append("                                label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("                                choices={[\n"); | 
|                             for (Map<String, Object> map : column.getEnums()) { | 
|                                 for (Map.Entry<String, Object> entry : map.entrySet()){ | 
|                                     sb.append("                                    { id: ").append(entry.getKey()).append(", name: '").append(entry.getValue()).append("' },\n"); | 
|                                 } | 
|                             } | 
|                             sb.append("                                ]}\n"); | 
|                             if (columns.indexOf(column) == 1) { | 
|                                 sb.append("                                autoFocus\n"); | 
|                             } | 
|                             if (column.isNotNull()) { | 
|                                 sb.append("                                validate={required()}\n"); | 
|                             } | 
|                             sb.append("                            />\n"); | 
|                         } | 
|                     } | 
|                     break; | 
|                 case "String": | 
|                     sb.append("                            <TextInput\n"); | 
|                     sb.append("                                label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                parse={v => v}\n"); | 
|                     if (count == 0) { | 
|                         sb.append("                                autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                validate={required()}\n"); | 
|                     } | 
|                     sb.append("                            />\n"); | 
|                     break; | 
|                 case "Date": | 
|                     sb.append("                            <DateInput\n"); | 
|                     sb.append("                                label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                     sb.append("                                source=\"").append(column.getHumpName()).append("\"\n"); | 
|                     if (count == 0) { | 
|                         sb.append("                                autoFocus\n"); | 
|                     } | 
|                     if (column.isNotNull()) { | 
|                         sb.append("                                validate={required()}\n"); | 
|                     } | 
|                     sb.append("                            />\n"); | 
|                     break; | 
|                 default: | 
|                     break; | 
|             } | 
|   | 
|             sb.append("                        </Stack>\n"); | 
|             count++; | 
|         } | 
|   | 
|         return sb.toString(); | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************** ReactList ********************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createReactListContent() { | 
|         StringBuilder sb = new StringBuilder(); | 
|         for (int i = 0; i < columns.size(); i++) { | 
|             Column column = columns.get(i); | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|             switch (column.getType()) { | 
|                 case "Boolean": | 
|                     sb.append("                    <BooleanField source=\"").append(column.getHumpName()).append("Bool\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" sortable={false} />\n"); | 
|                     break; | 
|                 case "Short": | 
|                 case "Integer": | 
|                 case "Long": | 
|                 case "Double": | 
|                     if (!Cools.isEmpty(column.getForeignKeyMajor())) { | 
|                         sb.append("                    <ReferenceField source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" reference=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("\" link={false} sortable={false}>\n"); | 
|                         sb.append("                        <TextField source=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append("\" />\n"); | 
|                         sb.append("                    </ReferenceField>\n"); | 
|                     } else { | 
|                         if (Cools.isEmpty(column.getEnums())) { | 
|                             sb.append("                    <NumberField source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />\n"); | 
|                         } else { | 
|                             sb.append("                    <TextField source=\"").append(column.getHumpName()).append("\\$").append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" sortable={false} />\n"); | 
|                         } | 
|                     } | 
|                     break; | 
|                 case "String": | 
|                     sb.append("                    <TextField source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />\n"); | 
|                     break; | 
|                 case "Date": | 
|                     sb.append("                    <DateField source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" showTime />\n"); | 
|                     break; | 
|                 default: | 
|                     break; | 
|             } | 
|         } | 
|         return sb.toString(); | 
|     } | 
|   | 
|     private String createReactListFilterRContent() { | 
|         StringBuilder sb = new StringBuilder(); | 
|         for (int i = 0; i < columns.size(); i++) { | 
|             Column column = columns.get(i); | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|             switch (column.getType()) { | 
|                 case "Boolean": | 
|                     sb.append("    <BooleanInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />,\n"); | 
|                     break; | 
|                 case "Short": | 
|                 case "Integer": | 
|                 case "Long": | 
|                 case "Double": | 
|                     if (!Cools.isEmpty(column.getForeignKeyMajor())) { | 
|                         sb.append("    <ReferenceInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" reference=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("\">\n"); | 
|                         sb.append("        <AutocompleteInput label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" optionText=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append("\" filterToQuery={(val) => ({ ").append(GeneratorUtils.firstCharConvert(column.getForeignKeyMajor())).append(": val })} />\n"); | 
|                         sb.append("    </ReferenceInput>,\n"); | 
|                     } else { | 
|                         if (Cools.isEmpty(column.getEnums())) { | 
|                             sb.append("    <NumberInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />,\n"); | 
|                         } else { | 
|                             sb.append("    <SelectInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\"\n"); | 
|                             sb.append("        choices={[\n"); | 
|                             for (Map<String, Object> map : column.getEnums()) { | 
|                                 for (Map.Entry<String, Object> entry : map.entrySet()){ | 
|                                     sb.append("            { id: ").append(entry.getKey()).append(", name: '").append(entry.getValue()).append("' },\n"); | 
|                                 } | 
|                             } | 
|                             sb.append("        ]}\n"); | 
|                             sb.append("    />,\n"); | 
|                         } | 
|                     } | 
|                     break; | 
|                 case "String": | 
|                     sb.append("    <TextInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />,\n"); | 
|                     break; | 
|                 case "Date": | 
|                     sb.append("    <DateInput source=\"").append(column.getHumpName()).append("\" label=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" />,\n"); | 
|                     break; | 
|                 default: | 
|                     break; | 
|             } | 
|         } | 
|         return sb.toString(); | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************** ReactPanel ********************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createReactPanelContent() { | 
|         StringBuilder sb = new StringBuilder(); | 
|         for (int i = 0; i < columns.size(); i++) { | 
|             Column column = columns.get(i); | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|   | 
|             // 特殊显示 | 
|             boolean specialShow = false; | 
|             if ("Date".equals(column.getType()) || !Cools.isEmpty(column.getEnums()) || !Cools.isEmpty(column.getForeignKeyMajor())) { | 
|                 specialShow = true; | 
|             } | 
|   | 
|             sb.append("                        <Grid item xs={6}>\n"); | 
|             sb.append("                            <PanelTypography\n"); | 
|             sb.append("                                title=\"table.field.").append(simpleEntityName).append(".").append(column.getHumpName()).append("\" \n"); | 
|             sb.append("                                property={record.").append(column.getHumpName()).append(specialShow?"\\$":"").append("}\n"); | 
|             sb.append("                            />\n"); | 
|             sb.append("                        </Grid>\n"); | 
|         } | 
|   | 
|         return sb.toString(); | 
|     } | 
|   | 
|     /**********************************************************************************************/ | 
|     /************************************** Locale ********************************************/ | 
|     /**********************************************************************************************/ | 
|   | 
|     private String createReactLocaleContent() { | 
|         StringBuilder sb = new StringBuilder("{\n"); | 
|         for (int i = 0; i < columns.size(); i++) { | 
|             Column column = columns.get(i); | 
|             if (column.isPrimaryKey() | 
|                     || column.getHumpName().equals("createTime") | 
|                     || column.getHumpName().equals("createBy") | 
|                     || column.getHumpName().equals("updateTime") | 
|                     || column.getHumpName().equals("updateBy") | 
|                     || column.getHumpName().equals("status") | 
|                     || column.getHumpName().equals("deleted") | 
|                     || column.getHumpName().equals("tenantId") | 
|                     || column.getHumpName().equals("memo") | 
|             ) { | 
|                 continue; | 
|             } | 
|             sb.append("    ").append(column.getHumpName()).append(": \"").append(column.getHumpName()).append("\",\n"); | 
|         } | 
|         sb.append("},"); | 
|         return sb.toString(); | 
|     } | 
|   | 
| } |