ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代码自动生成

2022-07-06 17:33:13  阅读:107  来源: 互联网

标签:writeContent String writeContent2 代码 生成 add 自动 param2 put


   最近开发几个查询接口,从代码来看,基本的格式都是一样的。就想着写一个代码生成工具。直接生成代码。省时省力。经过测试,生成的代码完全可用,节省了至少80%的时间。这里做一个记录。以后有类似的情况就可以拿来改一改就可以用了。

package com.insigma.business.uploadreport.zCode;

import cn.hutool.core.util.StrUtil;

import java.io.*;
import java.net.URISyntaxException;
import java.util.*;

/**
 * 自动生成代码
 *  查询接口代码自动生成工具:只需定义好要生成的接口  功能名称,注释信息,列表接口和详情接口的入参出参。
 *  就可以生成controller,service,mapper的相应方法。
 *  注意:生成的provider中对应的查询方法是留空的。需要自己完善。
 *
 * @author ank
 * @version 1.0
 * @date 2022/7/5 10:37
 */
public class AutomaticallyGenerateCode {
    /**
     * 指定路径文件 从 flagStr 按行添加 writeContent
     * @param writeContent
     * @param path
     * @param flagStr
     * @throws IOException
     * @throws URISyntaxException
     */
    public static void write2File(List<String> writeContent, String path, String flagStr) throws IOException, URISyntaxException {
        // 创建临时文件
        File outFile = File.createTempFile("fileTmp", ".tmp");
        //  源文件
        File testFile = new File(path);
        // 源文件输入流
        FileInputStream fis = new FileInputStream(testFile);
        BufferedReader in = new BufferedReader(new InputStreamReader(fis));
        // 源文件输出流
        FileOutputStream fos = new FileOutputStream(outFile);
        PrintWriter out = new PrintWriter(fos);
        // 保存一行数据
        String thisLine;
        // jvm 退出 临时文件删除
        outFile.deleteOnExit();
        while ((thisLine = in.readLine()) != null) {
            System.out.println(thisLine);
            //  当读取到目标行时 写入需要写入的内容
            if (thisLine.equals(flagStr)) {
                writeContent.forEach(s-> {
                    out.println(s);
                });
            }
            // 输出读取到的数据
            out.println(thisLine);
        }
        // 各种关
        out.flush();
        out.close();
        in.close();
        // 删除原始文件
        testFile.delete();
        // 把临时文件改名为原文件名
        outFile.renameTo(testFile);
    }

    /**
     * 生成java文件
     * @param writeContent
     * @param filepath
     * @throws IOException
     */
    public static void autoGenJava(List<String> writeContent, String filepath) throws IOException {
        // 创建文件
        File outFile = new File(filepath);
        // 源文件输出流
        FileOutputStream fos = new FileOutputStream(outFile);
        PrintWriter out = new PrintWriter(fos);
        writeContent.forEach(s-> {
            out.println(s);
        });
        // 各种关
        out.flush();
        out.close();
    }

    /**
     * 生成vo对象
     * @param param1
     * @param param2
     * @param listMap 列表vo对象的  <属性:注释> 键值对
     * @param infoMap 详情vo对象的  <属性:注释> 键值对
     * @throws IOException
     */
    public static void autoGenVO(String param1, String param2, Map<String,String> listMap, Map<String,String> infoMap) throws IOException {

        String param3 = param2.replace("情况","");
        String filepath = "D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\vo\\" + StrUtil.upperFirst(param2) + "VO.java";
        String filepath2 = "D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\vo\\" + StrUtil.upperFirst(param2) + "InfoVO.java";
        List<String> writeContent = new ArrayList<String>();
        writeContent.add("package com.insigma.business.uploadreport.vo;");
        writeContent.add("");
        writeContent.add("import io.swagger.annotations.ApiModelProperty;");
        writeContent.add("import lombok.Data;");
        writeContent.add("");
        writeContent.add("import javax.validation.constraints.NotBlank;");
        writeContent.add("");
        writeContent.add("/**");
        writeContent.add(" * "+param1+"列表传入参数");
        writeContent.add(" * @author ank");
        writeContent.add(" * @date 2022/07/04");
        writeContent.add(" */");
        writeContent.add("@Data");
        writeContent.add("public class "+ StrUtil.upperFirst(param2) +"VO {");
        if(null == listMap){
            writeContent.add("");
            writeContent.add("    @ApiModelProperty(\"所属省/市行政区划代码\")");
            writeContent.add("    private String aab301;");
            writeContent.add("");
            writeContent.add("    @NotBlank(message = \"父级行政区划代码不能为空\")");
            writeContent.add("    @ApiModelProperty(\"父级行政区划代码\")");
            writeContent.add("    private String aaa148;");
            writeContent.add("");
            writeContent.add("    @ApiModelProperty(\""+param3+"上报时间-开始\")");
            writeContent.add("    private String ape727_s;");
            writeContent.add("");
            writeContent.add("    @ApiModelProperty(\""+param3+"上报时间-结束\")");
            writeContent.add("    private String ape727_e;");
            writeContent.add("");
        }else{
            Set<Map.Entry<String, String>> entries = listMap.entrySet();
            for (Map.Entry<String, String> entry : entries) {
                writeContent.add("");
                writeContent.add("    @ApiModelProperty(\""+entry.getValue()+"\")");
                writeContent.add("    private String "+entry.getKey()+";");
            }
        }

        writeContent.add("}");
        writeContent.add("");

        List<String> writeContent2 = new ArrayList<String>();
        writeContent2.add("package com.insigma.business.uploadreport.vo;");
        writeContent2.add("");
        writeContent2.add("import io.swagger.annotations.ApiModelProperty;");
        writeContent2.add("import lombok.Data;");
        writeContent2.add("");
        writeContent2.add("/**");
        writeContent2.add(" * "+param1+"详情传入参数");
        writeContent2.add(" * @author ank");
        writeContent2.add(" * @date 2022/07/04");
        writeContent2.add(" */");
        writeContent2.add("@Data");
        writeContent2.add("public class "+ StrUtil.upperFirst(param2) +"InfoVO {");
        Set<Map.Entry<String, String>> entries = infoMap.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            writeContent2.add("");
            writeContent2.add("    @ApiModelProperty(\""+entry.getValue()+"\")");
            writeContent2.add("    private String "+entry.getKey()+";");
        }
        writeContent2.add("");
        writeContent2.add("");
        writeContent2.add("}");
        writeContent2.add("");
        try {
            AutomaticallyGenerateCode.autoGenJava(writeContent, filepath);
            AutomaticallyGenerateCode.autoGenJava(writeContent2, filepath2);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成dto对象
     * @param param1
     * @param param2
     * @param listMap2 列表dto对象的  <属性:注释> 键值对
     * @param infoMap2 详情dto对象的  <属性:注释> 键值对
     * @throws IOException
     */
    public static void autoGenDTO(String param1, String param2, Map<String,String> listMap2,Map<String,String> infoMap2) throws IOException {

        String param3 = param2.replace("情况","");
        String filepath = "D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\dto\\" + StrUtil.upperFirst(param2) + "DTO.java";
        String filepath2 = "D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\dto\\" + StrUtil.upperFirst(param2) + "InfoDTO.java";
        List<String> writeContent = new ArrayList<String>();
        writeContent.add("package com.insigma.business.uploadreport.dto;");
        writeContent.add("");
        writeContent.add("");
        writeContent.add("import com.insigma.business.util.excel.ExcelColumn;");
        writeContent.add("import io.swagger.annotations.ApiModelProperty;");
        writeContent.add("import lombok.Data;");
        writeContent.add("");
        writeContent.add("import java.io.Serializable;");
        writeContent.add("");
        writeContent.add("/**");
        writeContent.add(" * 查询"+param3+"返回列表");
        writeContent.add(" * @author ank");
        writeContent.add(" * @date 2022/07/04");
        writeContent.add(" */");
        writeContent.add("@Data");
        writeContent.add("public class "+ StrUtil.upperFirst(param2) +"DTO implements Serializable {");
        writeContent.add("");
        writeContent.add("    private static final long serialVersionUID = 1L;");
        if(null == listMap2){
            writeContent.add("");
            writeContent.add("    @ExcelColumn(title = \"地方名称\")");
            writeContent.add("    private String aaa146;");
            writeContent.add("");
            writeContent.add("    private String aaf018;");
            writeContent.add("");
            writeContent.add("    @ExcelColumn(title = \""+param3+"总数\")");
            writeContent.add("    private Integer total;");
        }else{
            Set<Map.Entry<String, String>> entries = listMap2.entrySet();
            for (Map.Entry<String, String> entry : entries) {
                writeContent.add("");
                writeContent.add("    @ApiModelProperty(\""+entry.getValue()+"\")");
                writeContent.add("    private String "+entry.getKey()+";");
            }
        }
        writeContent.add("}");
        writeContent.add("");

        List<String> writeContent2 = new ArrayList<String>();
        writeContent2.add("package com.insigma.business.uploadreport.dto;");
        writeContent2.add("");
        writeContent2.add("import io.swagger.annotations.ApiModelProperty;");
        writeContent2.add("import lombok.Data;");
        writeContent2.add("import java.io.Serializable;");
        writeContent2.add("");
        writeContent2.add("/**");
        writeContent2.add(" * "+param2+"详情返回结果");
        writeContent2.add(" * @author ank");
        writeContent2.add(" * @date 2022/07/04");
        writeContent2.add(" */");
        writeContent2.add("@Data");
        writeContent2.add("public class "+ StrUtil.upperFirst(param2) +"InfoDTO  implements Serializable {");
        writeContent2.add("");
        writeContent2.add("    private static final long serialVersionUID = 1L;");
        Set<Map.Entry<String, String>> entries = infoMap2.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            writeContent2.add("");
            writeContent2.add("    @ApiModelProperty(\""+entry.getValue()+"\")");
            writeContent2.add("    private String "+entry.getKey()+";");
        }
        writeContent2.add("");
        writeContent2.add("");
        writeContent2.add("}");
        writeContent2.add("");
        try {
            AutomaticallyGenerateCode.autoGenJava(writeContent, filepath);
            AutomaticallyGenerateCode.autoGenJava(writeContent2, filepath2);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成controller方法
     */
    public static void autoGenControllerMethod(String param1,String param2){
        String controllerPath = new String("D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\controller\\LocalReportingController.java");

        String flagStr = "}";

        //插入方法内容
        List<String> writeContent = new ArrayList<String>();
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     * "+param1+"列表");
        writeContent.add("     * @param "+param2+"VO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    @ApiOperation(\""+param1+"列表\")");
        writeContent.add("    @PostMapping(\"/"+param2+"/list\")");
        writeContent.add("    public ResponseMessage get"+ StrUtil.upperFirst(param2) +"List(@Valid @RequestBody "+ StrUtil.upperFirst(param2) +"VO "+param2+"VO) {");
        writeContent.add("        return localReportingService.get"+ StrUtil.upperFirst(param2) +"List("+param2+"VO);");
        writeContent.add("    }");
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     * "+param1+"详情");
        writeContent.add("     * @param "+param2+"InfoVO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    @ApiOperation(\""+param1+"详情\")");
        writeContent.add("    @PostMapping(\"/"+param2+"/info\")");
        writeContent.add("    public ResponseMessage get"+ StrUtil.upperFirst(param2) +"Info(@RequestBody "+ StrUtil.upperFirst(param2) +"InfoVO "+param2+"InfoVO) {");
        writeContent.add("        return localReportingService.get"+ StrUtil.upperFirst(param2) +"Info("+param2+"InfoVO);");
        writeContent.add("    }");

        try {
            AutomaticallyGenerateCode.write2File(writeContent, controllerPath, flagStr);
        }catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成service方法
     */
    public static void autoGenServiceMethod(String param1,String param2){
        String servicePath = new String("D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\service\\LocalReportingService.java");
        String serviceImplPath = new String("D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\service\\impl\\LocalReportingServiceImpl.java");

        String flagStr = "}";

        //插入方法内容
        List<String> writeContent = new ArrayList<String>();
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     * "+param1+"列表");
        writeContent.add("     * @param "+param2+"VO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    ResponseMessage get"+ StrUtil.upperFirst(param2) +"List("+ StrUtil.upperFirst(param2) +"VO "+param2+"VO);");
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     *  "+param1+"详情");
        writeContent.add("     * @param "+param2+"InfoVO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    ResponseMessage get"+ StrUtil.upperFirst(param2) +"Info("+ StrUtil.upperFirst(param2) +"InfoVO "+param2+"InfoVO);");


        List<String> writeContent2 = new ArrayList<String>();
        writeContent2.add("");
        writeContent2.add("    @Override");
        writeContent2.add("    public ResponseMessage get"+ StrUtil.upperFirst(param2) +"List("+ StrUtil.upperFirst(param2) +"VO "+param2+"VO) {");
        writeContent2.add("        try {");
        writeContent2.add("            //获取数据");
        writeContent2.add("            List<"+ StrUtil.upperFirst(param2) +"DTO> list = localReportingMapper.get"+ StrUtil.upperFirst(param2) +"List("+param2+"VO);");
        writeContent2.add("            return ResponseMessage.ok(\"获取成功\", list);");
        writeContent2.add("        } catch (Exception e) {");
        writeContent2.add("            log.error(\"查询"+param1+"-列表异常\", e);");
        writeContent2.add("            return ResponseMessage.error(\"查询"+param1+"-列表异常\");");
        writeContent2.add("        }");
        writeContent2.add("    }");
        writeContent2.add("");
        writeContent2.add("    @Override");
        writeContent2.add("    public ResponseMessage get"+ StrUtil.upperFirst(param2) +"Info("+ StrUtil.upperFirst(param2) +"InfoVO "+param2+"InfoVO) {");
        writeContent2.add("        try {");
        writeContent2.add("            //获取数据");
        writeContent2.add("            List<"+ StrUtil.upperFirst(param2) +"InfoDTO> list = localReportingMapper.get"+ StrUtil.upperFirst(param2) +"Info("+param2+"InfoVO);");
        writeContent2.add("            return ResponseMessage.ok(\"获取成功\", list);");
        writeContent2.add("        } catch (Exception e) {");
        writeContent2.add("            log.error(\"查询"+param1+"详情异常\", e);");
        writeContent2.add("            return ResponseMessage.error(\"查询"+param1+"详情异常\");");
        writeContent2.add("        }");
        writeContent2.add("    }");

        try {
            AutomaticallyGenerateCode.write2File(writeContent, servicePath, flagStr);
            AutomaticallyGenerateCode.write2File(writeContent2, serviceImplPath, flagStr);
        }catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成mapper方法
     */
    public static void autoGenMapperMethod(String param1,String param2){
        String mapperPath = new String("D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\mapper\\LocalReportingMapper.java");
        String providerPath = new String("D:\\editor\\workspace\\migrantWorkers\\managesystem-backend\\insiis-web\\src\\main\\java\\com\\insigma\\business\\uploadreport\\mapper\\provider\\LocalReportingMapperProvider.java");

        String flagStr = "}";

        //插入方法内容
        List<String> writeContent = new ArrayList<String>();
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     * "+param1+"列表");
        writeContent.add("     * @param "+param2+"VO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    @SelectProvider(type = LocalReportingMapperProvider.class, method = \"get"+ StrUtil.upperFirst(param2) +"List\")");
        writeContent.add("    List<"+ StrUtil.upperFirst(param2) +"DTO> get"+ StrUtil.upperFirst(param2) +"List(@Param(\""+param2+"Req\") "+ StrUtil.upperFirst(param2) +"VO "+param2+"VO);");
        writeContent.add("");
        writeContent.add("    /**");
        writeContent.add("     * "+param1+"详情");
        writeContent.add("     * @param "+param2+"InfoVO");
        writeContent.add("     * @return");
        writeContent.add("     */");
        writeContent.add("    @SelectProvider(type = LocalReportingMapperProvider.class, method = \"get"+ StrUtil.upperFirst(param2) +"Info\")");
        writeContent.add("    List<"+ StrUtil.upperFirst(param2) +"InfoDTO> get"+ StrUtil.upperFirst(param2) +"Info(@Param(\""+param2+"InfoReq\") "+ StrUtil.upperFirst(param2) +"InfoVO "+param2+"InfoVO);");


        List<String> writeContent2 = new ArrayList<String>();
        writeContent2.add("    /**");
        writeContent2.add("     * "+param1+"列表");
        writeContent2.add("     * @param "+param2+"VO");
        writeContent2.add("     * @return");
        writeContent2.add("     */");
        writeContent2.add("    public String get"+ StrUtil.upperFirst(param2) +"List(@Param(\""+param2+"Req\") "+ StrUtil.upperFirst(param2) +"VO "+param2+"VO) {");
        writeContent2.add("        SQL sql = new SQL();");
        writeContent2.add("        // TODO");
        writeContent2.add("        return sql.toString();");
        writeContent2.add("    }");
        writeContent2.add("");
        writeContent2.add("    /**");
        writeContent2.add("     * "+param1+"详情");
        writeContent2.add("     * @param "+param2+"InfoVO");
        writeContent2.add("     * @return");
        writeContent2.add("     */");
        writeContent2.add("    public String get"+ StrUtil.upperFirst(param2) +"Info(@Param(\""+param2+"InfoReq\") "+ StrUtil.upperFirst(param2) +"InfoVO "+param2+"InfoVO) {");
        writeContent2.add("        SQL sql = new SQL();");
        writeContent2.add("        // TODO");
        writeContent2.add("        return sql.toString();");
        writeContent2.add("    }");

        try {
            AutomaticallyGenerateCode.write2File(writeContent, mapperPath, flagStr);
            AutomaticallyGenerateCode.write2File(writeContent2, providerPath, flagStr);
        }catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成代码
     * @param param1 功能注释
     * @param param2  功能名
     * @param listMap  列表查询参数 可为null
     * @param listMap2  列表返回参数  可为null
     * @param infoMap  详情查询参数
     * @param infoMap2  详情返回属性
     * @throws IOException
     * @throws URISyntaxException
     */
    public static void genCode(String param1,String param2,Map listMap,Map listMap2,Map infoMap,Map infoMap2) throws IOException, URISyntaxException{
        autoGenControllerMethod(param1,param2);
        autoGenServiceMethod(param1,param2);
        autoGenMapperMethod(param1,param2);
        autoGenVO(param1,param2,listMap,infoMap);
        autoGenDTO(param1,param2,listMap2,infoMap2);
    }


    public static void main(String[] args) throws IOException, URISyntaxException {

//        String param1 = "保证金情况";
//        String param2 = "securityDeposit";
//        // vo详情字段   传入参数
//        Map<String,String> map = new HashMap<String,String>();
//        map.put("aaf018","所属省行政区划代码");
//        map.put("ape727_s","保证金信息上报时间-开始");
//        map.put("ape727_e","保证金信息上报时间-结束");
//        map.put("aaf017","所属市行政区划代码");
//        map.put("aae044","项目名称");
//        map.put("abb127","保证金缴纳主体");
//        // dto详情字段  传出参数
//        Map<String,String> map2 = new HashMap<String,String>();
//        map2.put("aaa146","地方名称");
//        map2.put("aae044","项目名称");
//        map2.put("abb127","保证金缴纳主体名称");
//        map2.put("abb156","保证金缴纳主体统一社会信用代码");
//        map2.put("abb128","保证金缴纳方式");
//        map2.put("abb129","应缴金额");
//        map2.put("abe166","是否享受优惠政策");
//        map2.put("abb131","减免缓金额");
//        map2.put("ape727","保证金缴纳时间");
//        genCode(param1,param2,null,null,infoMap,infoMap2);

        String param1 = "工资支付情况";
        String param2 = "salaryPayment";

        // vo列表字段  传入参数
        Map<String,String> listMap = new HashMap<String,String>();
        listMap.put("aab301","所属行政区划代码(本级)");
        listMap.put("aaa148","所属行政区划代码(父级)");
        listMap.put("ape727_s","工资支付上报时间-开始");
        listMap.put("ape727_e","工资支付上报时间-结束");

        // dto列表字段  传出参数
        Map<String,String> listMap2 = new HashMap<String,String>();
        listMap2.put("aaa146","地方名称");
        listMap2.put("aaf018","所属省行政区划代码");
        listMap2.put("salaryTotal","应发工资总额度(万元)");
        listMap2.put("netSalaryTotal","实发工资总额度(万元)");

        // vo详情字段   传入参数
        Map<String,String> infoMap = new HashMap<String,String>();
        infoMap.put("aaf018","所属省行政区划代码");
        infoMap.put("ape727_s","工资支付上报时间-开始");
        infoMap.put("ape727_e","工资支付上报时间-结束");
        infoMap.put("aaf017","所属市行政区划代码");
        infoMap.put("aae044","项目名称");
        infoMap.put("abe175","银行支付业务流水号");
        infoMap.put("abc110","支付方式");
        // dto详情字段  传出参数
        Map<String,String> infoMap2 = new HashMap<String,String>();
        infoMap2.put("abe121","支付账号");
        infoMap2.put("aaa146","地方名称");
        infoMap2.put("aae044","项目名称");
        infoMap2.put("aae149","所属年月");
        infoMap2.put("abc112Total","当月应发工资总额");
        infoMap2.put("abc113Total","当月扣发工资总额");
        infoMap2.put("abc114Total","当月实发工资总额");
        infoMap2.put("attendanceTotal","当月考勤总人数");
        infoMap2.put("abc117","工资发放人数");
        infoMap2.put("abc110","工资支付方式");

//        genCode(param1,param2,listMap,listMap2,infoMap,infoMap2);

        // 编写查询sql
        //............2233


    }

}

  

标签:writeContent,String,writeContent2,代码,生成,add,自动,param2,put
来源: https://www.cnblogs.com/anningkang/p/16451700.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有