#
luxiaotao1123
2024-02-17 33fe528302300cb4ea8d6f10b6309778ebb6e2a9
#
10个文件已添加
1436 ■■■■■ 已修改文件
zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/BetterGenerator.java 769 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Controller.txt 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Edit.txt 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Entity.txt 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Index.txt 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Mapper.txt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Service.txt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/ServiceImpl.txt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Sql.txt 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/resources/templates/react/Xml.txt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-framework/src/main/java/com/zy/asrs/framework/generators/BetterGenerator.java
New file
@@ -0,0 +1,769 @@
package com.zy.asrs.framework.generators;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.generators.constant.SqlOsType;
import com.zy.asrs.framework.generators.domain.Column;
import com.zy.asrs.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 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;
    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 + "/";
                    fileName = "index.jsx";
                    break;
                case "Edit":
                    pass = react;
                    directory = frontendPrefixPath + "/src/pages/" + itemName + "/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];
    }
    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("@\\{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("@\\{MAJORCOLUMN0}", 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)
            ;
            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("请指定数据库类型!");
        }
        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动态字段 *******************************************/
    /**********************************************************************************************/
    /**********************************************************************************************/
    /************************************** Edit动态字段 ********************************************/
    /**********************************************************************************************/
}
zy-asrs-framework/src/main/resources/templates/react/Controller.txt
New file
@@ -0,0 +1,122 @@
package com.zy.asrs.wcs.sys.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.R;
import com.zy.asrs.wcs.common.annotation.OperationLog;
import com.zy.asrs.wcs.common.domain.BaseParam;
import com.zy.asrs.wcs.common.domain.KeyValVo;
import com.zy.asrs.wcs.common.domain.PageParam;
import com.zy.asrs.wcs.sys.entity.Role;
import com.zy.asrs.wcs.sys.service.RoleService;
import com.zy.asrs.wcs.utils.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
 * Created by vincent on 2/13/2024
 */
@RestController
@RequestMapping("/api")
public class RoleController extends BaseController {
    @Autowired
    private RoleService roleService;
    @PreAuthorize("hasAuthority('sys:role:list')")
    @PostMapping("/role/page")
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<Role, BaseParam> pageParam = new PageParam<>(baseParam, Role.class);
        return R.ok().add(roleService.page(pageParam, pageParam.buildWrapper(true)));
    }
    @PreAuthorize("hasAuthority('sys:role:list')")
    @PostMapping("/role/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(roleService.list());
    }
    @PreAuthorize("hasAuthority('sys:role:list')")
    @GetMapping("/role/{id}")
    public R get(@PathVariable("id") Long id) {
        return R.ok().add(roleService.getById(id));
    }
    @PreAuthorize("hasAuthority('sys:role:save')")
    @OperationLog("添加角色")
    @PostMapping("/role/save")
    public R save(@RequestBody Role role) {
        if (!Cools.isEmpty(role.getName())
                && roleService.count(new LambdaQueryWrapper<Role>().eq(Role::getName, role.getName())) > 0) {
            return R.error("角色名称已存在");
        }
        if (!Cools.isEmpty(role.getCode())
                && roleService.count(new LambdaQueryWrapper<Role>().eq(Role::getCode, role.getCode())) > 0) {
            return R.error("角色标识已存在");
        }
        if (!roleService.save(role)) {
            return R.error("添加失败");
        }
        return R.ok("添加成功");
    }
    @PreAuthorize("hasAuthority('sys:role:update')")
    @OperationLog("修改角色")
    @PostMapping("/role/update")
    public R update(@RequestBody Role role) {
        if (!Cools.isEmpty(role.getCode()) && roleService.count(new LambdaQueryWrapper<Role>()
                .eq(Role::getCode, role.getCode())
                .ne(Role::getId, role.getId())) > 0) {
            return R.error("角色标识已存在");
        }
        if (!Cools.isEmpty(role.getName()) && roleService.count(new LambdaQueryWrapper<Role>()
                .eq(Role::getName, role.getName())
                .ne(Role::getId, role.getId())) > 0) {
            return R.error("角色名称已存在");
        }
        if (!roleService.updateById(role)) {
            return R.error("修改失败");
        }
        return R.ok("修改成功");
    }
    @PreAuthorize("hasAuthority('sys:role:remove')")
    @OperationLog("删除角色")
    @PostMapping("/role/remove/{ids}")
    public R remove(@PathVariable Long[] ids) {
        if (!roleService.removeByIds(Arrays.asList(ids))) {
            return R.error("删除失败");
        }
        return R.ok("删除成功");
    }
    @PreAuthorize("hasAuthority('sys:role:list')")
    @PostMapping("/role/query")
    public R query(@RequestParam(required = false) String condition) {
        List<KeyValVo> vos = new ArrayList<>();
        LambdaQueryWrapper<Role> wrapper = new LambdaQueryWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like(Role::getName, condition);
        }
        roleService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getName()))
        );
        return R.ok().add(vos);
    }
    @PreAuthorize("hasAuthority('sys:role:list')")
    @PostMapping("/role/export")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(roleService.list(), Role.class), response);
    }
}
zy-asrs-framework/src/main/resources/templates/react/Edit.txt
New file
@@ -0,0 +1,112 @@
import React, { useState, useRef, useEffect } from 'react';
import {
    ProForm,
    ProFormDigit,
    ProFormText,
    ProFormSelect,
    ProFormDateTimePicker
} from '@ant-design/pro-components';
import { Form, Modal } from 'antd';
import moment from 'moment';
import Http from '@/utils/http';
const Edit = (props) => {
    const [form] = Form.useForm();
    const { } = props;
    useEffect(() => {
        form.resetFields();
        form.setFieldsValue({
            ...props.values
        })
    }, [form, props])
    const handleCancel = () => {
        props.onCancel();
    };
    const handleOk = () => {
        form.submit();
    }
    const handleFinish = async (values) => {
        props.onSubmit({ ...values });
    }
    return (
        <>
            <Modal
                title="Edit"
                width={640}
                forceRender
                destroyOnClose
                open={props.open}
                onCancel={handleCancel}
                onOk={handleOk}
            >
                <ProForm
                    form={form}
                    submitter={false}
                    onFinish={handleFinish}
                    layout="horizontal"
                    grid={true}
                >
                    <ProFormDigit
                        name="id"
                        disabled
                        hidden={true}
                    />
                    <ProForm.Group>
                        <ProFormText
                            name="name"
                            label="角色名称"
                            colProps={{ md: 12, xl: 12 }}
                            placeholder="请输入"
                            rules={[{ required: true, message: "请输入角色名称!" }]}
                        />
                        <ProFormText
                            name="code"
                            label="角色标识"
                            colProps={{ md: 12, xl: 12 }}
                            placeholder="请输入"
                            rules={[{ required: true, message: "请输入角色标识!" }]}
                        />
                    </ProForm.Group>
                    <ProForm.Group>
                        <ProFormSelect
                            name="status"
                            label="状态"
                            colProps={{ md: 12, xl: 12 }}
                            options={[
                                { label: '正常', value: 1 },
                                { label: '禁用', value: 0 },
                            ]}
                            rules={[{ required: true, message: "请选择状态!" }]}
                        />
                        <ProFormDateTimePicker
                            name="updateTime"
                            label="修改时间"
                            colProps={{ md: 12, xl: 12 }}
                            transform={(value) => {
                                return moment(value).toISOString();
                            }}
                        />
                    </ProForm.Group>
                    <ProFormSelect
                        name="hostId"
                        label="机构"
                        colProps={{ md: 12, xl: 12 }}
                        showSearch
                        debounceTime={300}
                        request={async ({ keyWords }) => {
                            const resp = await Http.doPostForm('api/hostId/query', { condition: keyWords });
                            return resp.data;
                        }}
                    />
                </ProForm>
            </Modal>
        </>
    )
}
export default Edit;
zy-asrs-framework/src/main/resources/templates/react/Entity.txt
New file
@@ -0,0 +1,28 @@
package @{COMPANYNAME}.entity;
@{ENTITYIMPORT}
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.SpringUtils;
import com.zy.asrs.common.sys.entity.User;
import com.zy.asrs.common.sys.entity.Host;
import com.zy.asrs.common.sys.service.UserService;
import com.zy.asrs.common.sys.service.HostService;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("@{TABLENAME}")
public class @{ENTITYNAME} implements Serializable {
    private static final long serialVersionUID = 1L;
@{ENTITYCONTENT}
}
zy-asrs-framework/src/main/resources/templates/react/Index.txt
New file
@@ -0,0 +1,350 @@
import React, { useState, useRef, useEffect } from 'react';
import { Button, message, Modal } from 'antd';
import {
    FooterToolbar,
    PageContainer,
    ProTable,
    LightFilter,
} from '@ant-design/pro-components';
import { PlusOutlined, ExportOutlined } from '@ant-design/icons';
import Http from '@/utils/http';
import Edit from './components/edit'
import { TextFilter, SelectFilter, DatetimeRangeFilter, LinkFilter } from '@/components/TableSearch'
const handleSave = async (val) => {
    const hide = message.loading('正在添加');
    try {
        const resp = await Http.doPost('api/role/save', val);
        if (resp.code === 200) {
            message.success('添加成功');
            return true;
        } else {
            message.error(resp.msg);
            return false;
        }
    } catch (error) {
        message.error('添加失败请重试!');
        return false;
    } finally {
        hide();
    }
};
const handleUpdate = async (val) => {
    const hide = message.loading('正在更新');
    try {
        const resp = await Http.doPost('api/role/update', val);
        if (resp.code === 200) {
            message.success('更新成功');
            return true;
        } else {
            message.error(resp.msg);
            return false;
        }
    } catch (error) {
        message.error('配置失败请重试!');
        return false;
    } finally {
        hide();
    }
};
const handleRemove = async (rows) => {
    if (!rows) return true;
    const hide = message.loading('正在删除');
    try {
        const resp = await Http.doPost('api/role/remove/' + rows.map((row) => row.id).join(','));
        if (resp.code === 200) {
            message.success('删除成功');
            return true;
        } else {
            message.error(resp.msg);
            return false;
        }
    } catch (error) {
        message.error('删除失败,请重试');
        return false;
    } finally {
        hide();
    }
};
const handleExport = async () => {
    const hide = message.loading('正在导出');
    try {
        const resp = await Http.doPostBlob('api/role/export');
        const blob = new Blob([resp], { type: 'application/vnd.ms-excel' });
        window.location.href = window.URL.createObjectURL(blob);
        message.success('导出成功');
        return true;
    } catch (error) {
        message.error('导出失败,请重试');
        return false;
    } finally {
        hide();
    }
};
const Main = () => {
    const formTableRef = useRef();
    const actionRef = useRef();
    const [selectedRows, setSelectedRows] = useState([]);
    const [modalVisible, setModalVisible] = useState(false);
    const [currentRow, setCurrentRow] = useState();
    const [searchParam, setSearchParam] = useState({});
    useEffect(() => {
    }, []);
    const columns = [
        {
            title: 'No',
            dataIndex: 'index',
            valueType: 'indexBorder',
            width: 48,
        },
        {
            title: '姓名',
            dataIndex: 'name',
            valueType: 'text',
            copyable: true,
            filterDropdown: (props) => <TextFilter
                name='name'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '标识',
            dataIndex: 'code',
            valueType: 'text',
            filterDropdown: (props) => <TextFilter
                name='code'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '机构',
            dataIndex: 'hostId$',
            valueType: 'text',
            filterDropdown: (props) => <LinkFilter
                name='hostId'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '状态',
            dataIndex: 'status$',
            valueType: 'text',
            filterDropdown: (props) => <SelectFilter
                name='status'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
                data={[
                    { label: '正常', value: 1 },
                    { label: '禁用', value: 0 },
                ]}
            />,
        },
        {
            title: '修改时间',
            dataIndex: 'updateTime$',
            valueType: 'text',
            filterDropdown: (props) => <DatetimeRangeFilter
                name='updateTime'
                {...props}
                actionRef={actionRef}
                setSearchParam={setSearchParam}
            />,
        },
        {
            title: '操作',
            dataIndex: 'option',
            width: 140,
            valueType: 'option',
            render: (_, record) => [
                <Button
                    type="link"
                    key="edit"
                    onClick={() => {
                        setModalVisible(true);
                        setCurrentRow(record);
                    }}
                >
                    编辑
                </Button>,
                <Button
                    type="link"
                    danger
                    key="batchRemove"
                    onClick={async () => {
                        Modal.confirm({
                            title: '删除',
                            content: '确定删除该项吗?',
                            onOk: async () => {
                                const success = await handleRemove([record]);
                                if (success) {
                                    if (actionRef.current) {
                                        actionRef.current.reload();
                                    }
                                }
                            },
                        });
                    }}
                >
                    删除
                </Button>,
            ],
        },
    ];
    return (
        <PageContainer>
            <div style={{ width: '100%', float: 'right' }}>
                <ProTable
                    key="role"
                    rowKey="id"
                    actionRef={actionRef}
                    formRef={formTableRef}
                    columns={columns}
                    cardBordered
                    dateFormatter="string"
                    pagination={{ pageSize: 20 }}
                    search={false}
                    toolbar={{
                        search: {
                            onSearch: (value) => {
                                setSearchParam(prevState => ({
                                    ...prevState,
                                    condition: value
                                }));
                                actionRef.current?.reload();
                            },
                        },
                        filter: (
                            <LightFilter
                                onValuesChange={(val) => {
                                }}
                            >
                            </LightFilter>
                        ),
                        actions: [
                            <Button
                                type="primary"
                                key="save"
                                onClick={async () => {
                                    setModalVisible(true)
                                }}
                            >
                                <PlusOutlined />
                                添加
                            </Button>,
                            <Button
                                key="export"
                                onClick={async () => {
                                    handleExport();
                                }}
                            >
                                <ExportOutlined />
                                导出
                            </Button>,
                        ],
                    }}
                    request={(params, sorter, filter) =>
                        Http.doPostPromise('/api/role/page', { ...params, ...searchParam }, (res) => {
                            return {
                                data: res.data.records,
                                total: res.data.total,
                                success: true,
                            }
                        })
                    }
                    rowSelection={{
                        onChange: (ids, rows) => {
                            setSelectedRows(rows);
                        }
                    }}
                    columnsState={{
                        persistenceKey: 'pro-table-role',
                        persistenceType: 'localStorage',
                        defaultValue: {
                            option: { fixed: 'right', disable: true },
                        },
                        onChange(value) {
                        },
                    }}
                />
            </div>
            {selectedRows?.length > 0 && (
                <FooterToolbar
                    extra={
                        <div>
                            已选择
                            <a style={{ fontWeight: 600 }}>{selectedRows.length}</a>
                            项
                        </div>
                    }
                >
                    <Button
                        key="remove"
                        danger
                        onClick={async () => {
                            Modal.confirm({
                                title: '删除',
                                content: '确定删除该项吗?',
                                onOk: async () => {
                                    const success = await handleRemove(selectedRows);
                                    if (success) {
                                        setSelectedRows([]);
                                        actionRef.current?.reloadAndRest?.();
                                    }
                                },
                            });
                        }}
                    >
                        批量删除
                    </Button>
                </FooterToolbar>
            )}
            <Edit
                open={modalVisible}
                values={currentRow || {}}
                onCancel={
                    () => {
                        setModalVisible(false);
                        setCurrentRow(undefined);
                    }
                }
                onSubmit={async (values) => {
                    let ok = false;
                    if (values.id) {
                        ok = await handleUpdate({ ...values })
                    } else {
                        ok = await handleSave({ ...values })
                    }
                    if (ok) {
                        setModalVisible(false);
                        setCurrentRow(undefined);
                        if (actionRef.current) {
                            actionRef.current.reload();
                        }
                    }
                }
                }
            />
        </PageContainer>
    );
};
export default Main;
zy-asrs-framework/src/main/resources/templates/react/Mapper.txt
New file
@@ -0,0 +1,12 @@
package @{COMPANYNAME}.mapper;
import @{COMPANYNAME}.entity.@{ENTITYNAME};
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface @{ENTITYNAME}Mapper extends BaseMapper<@{ENTITYNAME}> {
}
zy-asrs-framework/src/main/resources/templates/react/Service.txt
New file
@@ -0,0 +1,8 @@
package @{COMPANYNAME}.service;
import com.baomidou.mybatisplus.extension.service.IService;
import @{COMPANYNAME}.entity.@{ENTITYNAME};
public interface @{ENTITYNAME}Service extends IService<@{ENTITYNAME}> {
}
zy-asrs-framework/src/main/resources/templates/react/ServiceImpl.txt
New file
@@ -0,0 +1,12 @@
package @{COMPANYNAME}.service.impl;
import @{COMPANYNAME}.mapper.@{ENTITYNAME}Mapper;
import @{COMPANYNAME}.entity.@{ENTITYNAME};
import @{COMPANYNAME}.service.@{ENTITYNAME}Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("@{SIMPLEENTITYNAME}Service")
public class @{ENTITYNAME}ServiceImpl extends ServiceImpl<@{ENTITYNAME}Mapper, @{ENTITYNAME}> implements @{ENTITYNAME}Service {
}
zy-asrs-framework/src/main/resources/templates/react/Sql.txt
New file
@@ -0,0 +1,18 @@
-- save @{SIMPLEENTITYNAME} record
-- mysql
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}/@{SIMPLEENTITYNAME}.html', '@{SIMPLEENTITYNAME}管理', null , '2', null , '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#view', '查询', '', '3', '0', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-add', '新增', '', '3', '1', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-edit', '编辑', '', '3', '2', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-delete', '删除', '', '3', '3', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( '@{SIMPLEENTITYNAME}#btn-export', '导出', '', '3', '4', '1');
-- sqlserver
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}/@{SIMPLEENTITYNAME}.html', N'@{SIMPLEENTITYNAME}管理', null, '2', null, '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#view', N'查询', '', '3', '0', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-add', N'新增', '', '3', '1', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-edit', N'编辑', '', '3', '2', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-delete', N'删除', '', '3', '3', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'@{SIMPLEENTITYNAME}#btn-export', N'导出', '', '3', '4', '1');
zy-asrs-framework/src/main/resources/templates/react/Xml.txt
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="@{COMPANYNAME}.mapper.@{ENTITYNAME}Mapper">
</mapper>