package com.zy.acs.framework.generators; 
 | 
  
 | 
import com.zy.acs.framework.common.Cools; 
 | 
import com.zy.acs.framework.generators.constant.SqlOsType; 
 | 
import com.zy.acs.framework.generators.domain.Column; 
 | 
import com.zy.acs.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 BetterGenerator { 
 | 
  
 | 
    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", 
 | 
            "Index", 
 | 
            "Edit", 
 | 
            "Sql"}; 
 | 
    private static final ArrayList<String> SYSTEM_MODEL = new ArrayList<String>(){{ 
 | 
            add("User"); 
 | 
            add("Host"); 
 | 
    }}; 
 | 
  
 | 
  
 | 
    public String url; 
 | 
    public String username; 
 | 
    public String password; 
 | 
    public String table; 
 | 
    public String tableName; 
 | 
    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; 
 | 
    private String simpleEntityName; 
 | 
    private String entityImport; 
 | 
    private String entityContent; 
 | 
    private String xmlContent; 
 | 
    private String htmlContent; 
 | 
    private String htmlDialogContent; 
 | 
    private String jsTableContent; 
 | 
    private String jsForeignKeyContent; 
 | 
    private String jsDateContent; 
 | 
    private String jsPrimaryKeyDoms; 
 | 
    private String primaryKeyColumn; 
 | 
    private String majorColumn; 
 | 
    private String systemPackagePath; 
 | 
    private String systemPackage; 
 | 
    private String itemName; 
 | 
    private String tableColumns; 
 | 
    private String formEditColumns; 
 | 
  
 | 
    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 "Index": 
 | 
                    pass = react; 
 | 
                    directory = frontendPrefixPath + "/src/pages/" + itemName + "/"  + simpleEntityName + "/"; 
 | 
                    fileName = "index.jsx"; 
 | 
                    break; 
 | 
                case "Edit": 
 | 
                    pass = react; 
 | 
                    directory = frontendPrefixPath + "/src/pages/" + itemName + "/" +  simpleEntityName + "/components/"; 
 | 
                    fileName = "edit.jsx"; 
 | 
                    break; 
 | 
                default: 
 | 
                    break; 
 | 
            } 
 | 
            if (!pass){ continue; } 
 | 
            String content = readFile(template); 
 | 
            writeFile(content, directory, fileName, template); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void init() throws Exception { 
 | 
        gainDbInfo(); 
 | 
        fullEntityName = GeneratorUtils.getNameSpace(table); 
 | 
        simpleEntityName = fullEntityName.substring(0, 1).toLowerCase()+fullEntityName.substring(1); 
 | 
        entityContent = createEntityMsg(); 
 | 
        htmlContent = createHtmlMsg(); 
 | 
        htmlDialogContent = createHtmlDialogMsg(); 
 | 
        jsTableContent = createJsTableMsg(); 
 | 
        jsForeignKeyContent = createJsFkContent(); 
 | 
        jsDateContent = createJsDateContent(); 
 | 
        jsPrimaryKeyDoms = createJsPrimaryKeyMsg(); 
 | 
        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]; 
 | 
        tableColumns = createTableColumns(); 
 | 
        formEditColumns = createFormEditColumns(); 
 | 
    } 
 | 
  
 | 
    private String readFile(String template){ 
 | 
        StringBuilder txtContentBuilder=new StringBuilder(); 
 | 
        ClassPathResource classPath=new ClassPathResource("templates/react/"+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}", tableName) 
 | 
                    .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("@\\{HTMLCONTENT}", htmlContent) 
 | 
                    .replaceAll("@\\{HTMLDIALOGCONTENT}", htmlDialogContent) 
 | 
                    .replaceAll("@\\{JSTABLECONTENT}", jsTableContent) 
 | 
                    .replaceAll("@\\{JSFOREIGNKEYCONTENT}", jsForeignKeyContent) 
 | 
                    .replaceAll("@\\{JSDATECONTENT}", jsDateContent) 
 | 
                    .replaceAll("@\\{JSPRIMARYKEYDOMS}", jsPrimaryKeyDoms) 
 | 
                    .replaceAll("@\\{MAJORCOLUMN}", GeneratorUtils.humpToLine(majorColumn)) 
 | 
                    .replaceAll("@\\{MAJORCOLUMN}", GeneratorUtils.firstCharConvert(majorColumn, false)) 
 | 
                    .replaceAll("@\\{MAJORCOLUMN_UP}", GeneratorUtils.firstCharConvert(majorColumn, false)) 
 | 
                    .replaceAll("@\\{PRIMARYKEYCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false)) 
 | 
                    .replaceAll("@\\{PRIMARYKEYCOLUMN0}", GeneratorUtils.firstCharConvert(primaryKeyColumn, true)) 
 | 
                    .replaceAll("@\\{UPCASEMARJORCOLUMN}", GeneratorUtils.firstCharConvert(primaryKeyColumn, false)) 
 | 
                    .replaceAll("@\\{SYSTEMPACKAGE}",systemPackage) 
 | 
                    .replaceAll("@\\{TABLECOLUMNS}", tableColumns) 
 | 
                    .replaceAll("@\\{FORMEDITCOLUMNS}", formEditColumns) 
 | 
            ; 
 | 
            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.tableName) { 
 | 
            throw new RuntimeException("请输入tableName!"); 
 | 
        } 
 | 
        switch (this.sqlOsType) { 
 | 
            case MYSQL: 
 | 
                Class.forName("com.mysql.cj.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){ 
 | 
            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())){ 
 | 
                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.getForeignKeyMajor())){ 
 | 
                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; 
 | 
    } 
 | 
  
 | 
    /**********************************************************************************************/ 
 | 
    /************************************** Html动态字段 *******************************************/ 
 | 
    /**********************************************************************************************/ 
 | 
  
 | 
    private String createHtmlMsg(){ 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns){ 
 | 
            if (column.isPrimaryKey()){ continue;} 
 | 
            if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                sb.append("    <div class=\"layui-inline\">\n") 
 | 
                        .append("        <div class=\"layui-input-inline cool-auto-complete\">\n") 
 | 
                        .append("            <input id=\"").append(column.getHumpName()).append("\"") 
 | 
                        .append(" class=\"layui-input\" name=\"").append(column.getName()).append("\" type=\"text\" placeholder=\"请输入\" autocomplete=\"off\" style=\"display: none\">\n") 
 | 
                        .append("            <input id=\"").append(column.getHumpName()).append("\\$") 
 | 
                        .append("\" class=\"layui-input cool-auto-complete-div\" onclick=\"autoShow(this.id)\" type=\"text\" placeholder=\"").append(GeneratorUtils.supportHtmlName(column.getComment())).append("\" onfocus=this.blur()>\n") 
 | 
                        .append("            <div class=\"cool-auto-complete-window\">\n") 
 | 
                        .append("                <input class=\"cool-auto-complete-window-input\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("\" onkeyup=\"autoLoad(this.getAttribute('data-key'))\">\n") 
 | 
                        .append("                <select class=\"cool-auto-complete-window-select\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("Select\" onchange=\"confirmed(this.getAttribute('data-key'))\" multiple=\"multiple\">\n") 
 | 
                        .append("                </select>\n") 
 | 
                        .append("            </div>\n") 
 | 
                        .append("        </div>\n") 
 | 
                        .append("    </div>\n"); 
 | 
            } 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String createHtmlDialogMsg() { 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns){ 
 | 
            if (column.isPrimaryKey()) { 
 | 
                continue; 
 | 
            } 
 | 
            sb.append("                <div class=\"layui-form-item\">\n"); 
 | 
            sb.append("                    <label class=\"layui-form-label"); 
 | 
            if (column.isNotNull()){ 
 | 
                sb.append(" layui-form-required"); 
 | 
            } 
 | 
            sb.append("\">").append(column.getComment()).append(": </label>\n"); 
 | 
            sb.append("                    <div class=\"layui-input-block"); 
 | 
            // 关联外键 
 | 
            if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                sb.append(" cool-auto-complete"); 
 | 
            } 
 | 
            sb.append("\">\n"); 
 | 
            // 输入框类型 
 | 
            if (Cools.isEmpty(column.getEnums())){ 
 | 
                sb.append("                        <input class=\"layui-input\" name=\"").append(column.getHumpName()); 
 | 
                if ("Date".equals(column.getType())){ 
 | 
                    sb.append("\" id=\"").append(column.getHumpName()).append("\\$"); 
 | 
                } 
 | 
                sb.append("\" placeholder=\"请输入").append(column.getComment()).append("\""); 
 | 
                if (column.isNotNull()){ 
 | 
                    sb.append(" lay-vertype=\"tips\" lay-verify=\"required\""); 
 | 
                } 
 | 
                // 关联外键 
 | 
                if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                    sb.append(" style=\"display: none\""); 
 | 
                } 
 | 
                sb.append(">\n"); 
 | 
  
 | 
                // 关联外键 
 | 
                if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                    sb.append("                        <input id=\"").append(column.getHumpName()).append("\\$").append("\" name=\"").append(column.getHumpName()).append("\\$") 
 | 
                            .append("\" class=\"layui-input cool-auto-complete-div\" onclick=\"autoShow(this.id)\" type=\"text\" placeholder=\"请输入").append(column.getComment()).append("\" onfocus=this.blur()>\n"); 
 | 
                    sb.append("                        <div class=\"cool-auto-complete-window\">\n") 
 | 
                            .append("                            <input class=\"cool-auto-complete-window-input\" data-key=\"") 
 | 
                            .append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("\" onkeyup=\"autoLoad(this.getAttribute('data-key'))\">\n") 
 | 
                            .append("                            <select class=\"cool-auto-complete-window-select\" data-key=\"").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("Query").append("By").append(column.getHumpName()).append("Select\" onchange=\"confirmed(this.getAttribute('data-key'))\" multiple=\"multiple\">\n") 
 | 
                            .append("                            </select>\n") 
 | 
                            .append("                        </div>\n"); 
 | 
                } 
 | 
            // 枚举类型 
 | 
            } else { 
 | 
                sb.append("                        <select name=\"").append(column.getHumpName()).append("\""); 
 | 
                if (column.isNotNull()){ 
 | 
                    sb.append(" lay-vertype=\"tips\" lay-verify=\"required\""); 
 | 
                } 
 | 
                sb.append(">\n"); 
 | 
                sb.append("                            <option value=\"\">").append("请选择").append(column.getComment()).append("</option>\n"); 
 | 
                for (Map<String, Object> map : column.getEnums()){ 
 | 
                    for (Map.Entry<String, Object> entry : map.entrySet()){ 
 | 
                        sb.append("                            <option value=\"") 
 | 
                                .append(entry.getKey()) 
 | 
                                .append("\">") 
 | 
                                .append(entry.getValue()) 
 | 
                                .append("</option>\n"); 
 | 
                    } 
 | 
                } 
 | 
                sb.append("                        </select>\n"); 
 | 
            } 
 | 
  
 | 
            sb.append("                    </div>\n"); 
 | 
            sb.append("                </div>\n"); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String createJsTableMsg(){ 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns){ 
 | 
//            if (column.isPrimaryKey()){ continue;} 
 | 
            sb.append("            ,{field: '"); 
 | 
            if ("Date".equals(column.getType()) || !Cools.isEmpty(column.getEnums())){ 
 | 
                // 时间、枚举  格式化 
 | 
                sb.append(column.getHumpName()).append("\\$"); 
 | 
            } else { 
 | 
                // 主键修饰 
 | 
                if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                    sb.append(column.getHumpName()).append("\\$"); 
 | 
                } else { 
 | 
                    sb.append(column.getHumpName()); 
 | 
                } 
 | 
            } 
 | 
            sb.append("', align: 'center',title: '").append(column.getComment()).append("'"); 
 | 
            // 复选框 
 | 
            if (column.isCheckBox()){ 
 | 
                sb.append(", templet:function(row){\n") 
 | 
                        .append("                    var html = \"<input value='") 
 | 
                        .append(column.getHumpName()).append("' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='\"+row.LAY_TABLE_INDEX+\"'\";\n") 
 | 
                        .append("                    if(row.").append(column.getHumpName()).append(" === 'Y'){html += \" checked \";}\n") 
 | 
                        .append("                    html += \">\";\n") 
 | 
                        .append("                    return html;\n") 
 | 
                        .append("                }"); 
 | 
            } 
 | 
            sb.append("}\n"); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String createJsFkContent(){ 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns){ 
 | 
            // 如果有关联外健 
 | 
            if (!Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                sb.append("    window.load").append(column.getForeignKey()).append("Sel = function () {").append("\n") 
 | 
                        .append("        return xmSelect.render({").append("\n") 
 | 
                        .append("            el: '#").append(GeneratorUtils.firstCharConvert(column.getForeignKey(), true)).append("XmlSel',").append("\n") 
 | 
                        .append("            autoRow: true,").append("\n") 
 | 
                        .append("            filterable: true,").append("\n") 
 | 
                        .append("            remoteSearch: true,").append("\n") 
 | 
                        .append("            radio: true,").append("\n") 
 | 
                        .append("            remoteMethod: function (val, cb, show) {").append("\n") 
 | 
                        .append("                \\$.ajax({").append("\n") 
 | 
                        .append("                    url: baseUrl + \"/").append(GeneratorUtils.firstCharConvert(column.getForeignKey(), true)).append("/all/get/kv\",").append("\n") 
 | 
                        .append("                    headers: {'token': localStorage.getItem('token')},").append("\n") 
 | 
                        .append("                    data: {").append("\n") 
 | 
                        .append("                        condition: val").append("\n") 
 | 
                        .append("                    },").append("\n") 
 | 
                        .append("                    method: 'POST',").append("\n") 
 | 
                        .append("                    success: function (res) {").append("\n") 
 | 
                        .append("                        if (res.code === 200) {").append("\n") 
 | 
                        .append("                            cb(res.data)").append("\n") 
 | 
                        .append("                        } else {").append("\n") 
 | 
                        .append("                            cb([]);").append("\n") 
 | 
                        .append("                            layer.msg(res.msg, {icon: 2});").append("\n") 
 | 
                        .append("                        }").append("\n") 
 | 
                        .append("                    }").append("\n") 
 | 
                        .append("                });").append("\n") 
 | 
                        .append("            }").append("\n") 
 | 
                        .append("        });").append("\n") 
 | 
                        .append("    }").append("\n") 
 | 
                        .append("\n"); 
 | 
            } 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String createJsDateContent(){ 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns) { 
 | 
            if (column.isPrimaryKey()) { 
 | 
                continue; 
 | 
            } 
 | 
            if ("Date".equals(column.getType())){ 
 | 
                sb.append("            layDate.render({\n") 
 | 
                        .append("                elem: '#").append(column.getHumpName()).append("\\\\\\\\\\$',\n") 
 | 
                        .append("                type: 'datetime',\n") 
 | 
                        .append("                value: data!==undefined?data['").append(column.getHumpName()).append("\\$'").append("]:null\n") 
 | 
                        .append("            });\n"); 
 | 
            } 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String createJsPrimaryKeyMsg(){ 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns) { 
 | 
            if (column.isPrimaryKey()) { 
 | 
                sb.append("#").append(column.getHumpName()).append(","); 
 | 
            } 
 | 
        } 
 | 
        if (sb.length() > 1){ 
 | 
            if (sb.substring(sb.length() - 1).equals(",")) { 
 | 
                sb.deleteCharAt(sb.length()-1); 
 | 
            } 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    /**********************************************************************************************/ 
 | 
    /************************************** Index动态字段 *******************************************/ 
 | 
    /**********************************************************************************************/ 
 | 
  
 | 
    private String createTableColumns() { 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (Column column : columns) { 
 | 
            if (column.isPrimaryKey() 
 | 
                    || column.getHumpName().equals("deleted") 
 | 
                    || column.getHumpName().equals("hostId") 
 | 
            ) { 
 | 
                continue; 
 | 
            } 
 | 
            sb.append("        {\n") 
 | 
                    .append("            title: '").append(column.getComment()).append("',\n") 
 | 
                    .append("            dataIndex: '"); 
 | 
            if ("Date".equals(column.getType()) || !Cools.isEmpty(column.getEnums()) || !Cools.isEmpty(column.getForeignKeyMajor())){ 
 | 
                // 时间、枚举  格式化  主键修饰 
 | 
                sb.append(column.getHumpName()).append("\\$"); 
 | 
            } else { 
 | 
                sb.append(column.getHumpName()); 
 | 
            } 
 | 
            sb.append("',\n") 
 | 
                    .append("            valueType: 'text',\n") 
 | 
                    .append("            hidden: false,\n") 
 | 
                    .append("            width: 140,\n"); 
 | 
            if (column.isMajor()) { 
 | 
                sb.append("            copyable: true,\n"); 
 | 
            } 
 | 
            sb.append("            filterDropdown: (props) => <").append(getAntProFilterType(column)).append("\n") 
 | 
                    .append("                name='").append(column.getHumpName()).append("'\n"); 
 | 
  
 | 
            if (!Cools.isEmpty(column.getForeignKey())) { 
 | 
                sb.append("                major='").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("'\n"); 
 | 
            } 
 | 
  
 | 
            sb.append("                {...props}\n") 
 | 
                    .append("                actionRef={actionRef}\n") 
 | 
                    .append("                setSearchParam={setSearchParam}\n"); 
 | 
            if (!Cools.isEmpty(column.getEnums())) { 
 | 
                sb.append("                data={[\n"); 
 | 
                for (Map<String, Object> map : column.getEnums()) { 
 | 
                    for (Map.Entry<String, Object> entry : map.entrySet()){ 
 | 
                        sb.append("                    { label: '").append(entry.getValue()).append("', value: ").append(entry.getKey()).append(" },\n"); 
 | 
                    } 
 | 
                } 
 | 
                sb.append("                ]}\n"); 
 | 
            } 
 | 
            sb.append("            />,\n") 
 | 
                    .append("        },\n"); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
    private String getAntProFilterType(Column column){ 
 | 
        String filter = "TextFilter"; 
 | 
        switch (column.getType()) { 
 | 
            case "Boolean": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "Short": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "Integer": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "Long": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "Double": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "String": 
 | 
                filter = "TextFilter"; 
 | 
                break; 
 | 
            case "Date": 
 | 
                filter = "DatetimeRangeFilter"; 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
        } 
 | 
        if (!Cools.isEmpty(column.getEnums())) { 
 | 
            filter = "SelectFilter"; 
 | 
        } 
 | 
        if (!Cools.isEmpty(column.getForeignKey())) { 
 | 
            filter = "LinkFilter"; 
 | 
        } 
 | 
        return filter; 
 | 
    } 
 | 
  
 | 
    /**********************************************************************************************/ 
 | 
    /************************************** Edit动态字段 ********************************************/ 
 | 
    /**********************************************************************************************/ 
 | 
  
 | 
    private String createFormEditColumns() { 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        int times = 0; 
 | 
        boolean has = false;boolean init = false; 
 | 
        for (Column column : columns) { 
 | 
            if (column.isPrimaryKey() 
 | 
                    || column.getHumpName().equals("deleted") 
 | 
                    || column.getHumpName().equals("hostId") 
 | 
            ) { 
 | 
                continue; 
 | 
            } 
 | 
            if (times%2 == 0) { 
 | 
                sb.append("                    <ProForm.Group>\n"); 
 | 
                has = true;init=true; 
 | 
            } 
 | 
  
 | 
            String itemType = "ProFormText"; 
 | 
            String precision = ""; 
 | 
            switch (column.getType()) { 
 | 
                case "Boolean": 
 | 
                    itemType = "ProFormText"; 
 | 
                    break; 
 | 
                case "Short": 
 | 
                    itemType = "ProFormDigit"; 
 | 
                    precision = "0"; 
 | 
                    break; 
 | 
                case "Integer": 
 | 
                    itemType = "ProFormDigit"; 
 | 
                    precision = "0"; 
 | 
                    break; 
 | 
                case "Long": 
 | 
                    itemType = "ProFormDigit"; 
 | 
                    precision = "0"; 
 | 
                    break; 
 | 
                case "Double": 
 | 
                    itemType = "ProFormDigit"; 
 | 
                    precision = "2"; 
 | 
                    break; 
 | 
                case "String": 
 | 
                    itemType = "ProFormText"; 
 | 
                    break; 
 | 
                case "Date": 
 | 
                    itemType = "ProFormDateTimePicker"; 
 | 
                    break; 
 | 
                default: 
 | 
                    break; 
 | 
            } 
 | 
            if (!Cools.isEmpty(column.getEnums())) { 
 | 
                itemType = "ProFormSelect"; 
 | 
            } 
 | 
            if (!Cools.isEmpty(column.getForeignKey())) { 
 | 
                itemType = "ProFormSelect"; 
 | 
            } 
 | 
  
 | 
            sb.append("                        <").append(itemType).append("\n") 
 | 
                    .append("                            name=\"").append(column.getHumpName()).append("\"\n") 
 | 
                    .append("                            label=\"").append(column.getComment()).append("\"\n") 
 | 
                    .append("                            colProps={{ md: 12, xl: 12 }}\n"); 
 | 
            // 数字小数点 
 | 
            if (!Cools.isEmpty(precision) && Cools.isEmpty(column.getEnums())) { 
 | 
                sb.append("                            fieldProps={{ precision: ").append(precision).append(" }}\n"); 
 | 
            } 
 | 
  
 | 
            // 非空 
 | 
            if (column.isNotNull()) { 
 | 
                sb.append("                            rules={[{ required: true }]}\n"); 
 | 
            } 
 | 
  
 | 
            // 枚举 
 | 
            if (!Cools.isEmpty(column.getEnums())) { 
 | 
                sb.append("                            options={[\n"); 
 | 
                for (Map<String, Object> map : column.getEnums()) { 
 | 
                    for (Map.Entry<String, Object> entry : map.entrySet()){ 
 | 
                        sb.append("                                { label: '").append(entry.getValue()).append("', value: ").append(entry.getKey()).append(" },\n"); 
 | 
                    } 
 | 
                } 
 | 
                sb.append("                            ]}\n"); 
 | 
            } 
 | 
  
 | 
            // 时间 
 | 
            if ("Date".equals(column.getType())) { 
 | 
                sb.append("                            transform={(value) => moment(value).toISOString()}\n"); 
 | 
            } 
 | 
  
 | 
            // 关联表 
 | 
            if (!Cools.isEmpty(column.getForeignKey())) { 
 | 
                sb.append("                            showSearch\n") 
 | 
                        .append("                            debounceTime={300}\n") 
 | 
                        .append("                            request={async ({ keyWords }) => {\n") 
 | 
                        .append("                                const resp = await Http.doPostForm('api/").append(GeneratorUtils.firstCharConvert(column.getForeignKey())).append("/query', { condition: keyWords });\n") 
 | 
                        .append("                                return resp.data;\n") 
 | 
                        .append("                            }}\n"); 
 | 
            } 
 | 
  
 | 
            sb.append("                        />\n"); 
 | 
  
 | 
            if (times%2 != 0) { 
 | 
                sb.append("                    </ProForm.Group>\n"); 
 | 
                has = false; 
 | 
            } 
 | 
            times++; 
 | 
        } 
 | 
        if (init && has) { 
 | 
            sb.append("                    </ProForm.Group>\n"); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
} 
 |