提交 91296989 authored 作者: czq's avatar czq

Merge branch 'master' of git.yfzx.zjtys.com.cn:912-system/monitor/inspect into czq

package com.zjty.inspect.controller; package com.zjty.inspect.controller;
import com.zjty.inspect.entity.InspectParameter; import com.zjty.inspect.dao.TechnologyDao;
import com.zjty.inspect.entity.ReportVo; import com.zjty.inspect.entity.*;
import com.zjty.inspect.entity.Warn;
import com.zjty.inspect.service.InspectService; import com.zjty.inspect.service.InspectService;
import com.zjty.inspect.service.ParameterService;
import com.zjty.inspect.service.ReportService;
import com.zjty.inspect.service.TechnologyService;
import com.zjty.inspect.utils.*; import com.zjty.inspect.utils.*;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -33,7 +35,14 @@ public class InspectController { ...@@ -33,7 +35,14 @@ public class InspectController {
@Autowired @Autowired
private InspectService inspectService; private InspectService inspectService;
@Autowired
private TechnologyService technologyService;
@Autowired
private ParameterService parameterService;
@Autowired
private ReportService reportService;
/** /**
* 上传代码进行评估 * 上传代码进行评估
* @param years 系统开发时间 * @param years 系统开发时间
...@@ -52,52 +61,71 @@ public class InspectController { ...@@ -52,52 +61,71 @@ public class InspectController {
@PostMapping("/path") @PostMapping("/path")
@ApiOperation("上传代码进行评估") @ApiOperation("上传代码进行评估")
public ResponseEntity inspect(Integer years,Integer systemFund,Integer modules public ResponseEntity inspect(Integer years,Integer systemFund,Integer modules
,String valid,Double framework,Double safety,Double disaster,Integer data ,String valid,Integer framework,Integer safety,Integer disaster,Integer data
,Integer admin,String projectName,String fileName, MultipartFile multfile) throws IOException { ,Integer admin,String projectName,Integer tables,String databaseType,Integer method, MultipartFile multfile) throws IOException {
File file = FileUtil.saveToLocal(multfile); File file = FileUtil.saveToLocal(multfile);
InspectParameter inspectParameter = new InspectParameter(); InspectParameter inspectParameter = new InspectParameter();
inspectParameter.setSourceAddress(file.getPath()); inspectParameter.setSourceAddress(file.getCanonicalPath());
inspectParameter.setSystemFund(systemFund); inspectParameter.setSystemFund(systemFund);
inspectParameter.setAdmin(admin); inspectParameter.setAdmin(admin);
inspectParameter.setModules(modules); inspectParameter.setModules(modules);
inspectParameter.setSafety(safety); inspectParameter.setSafety(safety);
inspectParameter.setTables(tables);
inspectParameter.setValid(valid); inspectParameter.setValid(valid);
inspectParameter.setYears(years); inspectParameter.setYears(years);
inspectParameter.setDisaster(disaster); inspectParameter.setDisaster(disaster);
inspectParameter.setData(data); inspectParameter.setData(data);
inspectParameter.setFramework(framework); inspectParameter.setFramework(framework);
inspectParameter.setPath(file.getCanonicalPath()); inspectParameter.setPath(file.getCanonicalPath());
inspectParameter.setRecastMethod(method);
inspectParameter.setId(UUIDUtil.getUUID()); inspectParameter.setId(UUIDUtil.getUUID());
ReportVo reportVo = new ReportVo(); ReportVo reportVo = new ReportVo();
int count = technologyService.findAllTechnologyCount();
reportVo.setTechnologiesNum(count);
int support = technologyService.findAllTechnologyNotSupport();
reportVo.setTechnologiesRepair(support);
reportVo.setId(TimeUtil.getNowDate()); reportVo.setId(RandomUtil.getRandom());
reportVo.setUploadType("文件上传"); reportVo.setUploadType("文件上传");
reportVo.setFileName(fileName); reportVo.setFileName(file.getName());
reportVo.setProjectName(projectName); reportVo.setProjectName(projectName);
reportVo.setSourceAddress(file.getCanonicalPath()); reportVo.setSourceAddress(file.getCanonicalPath());
reportVo.setDatabaseType(databaseType);
ReportVo inspect = inspectService.inspect(reportVo,inspectParameter); ReportVo inspect = inspectService.inspect(reportVo,inspectParameter);
// Map map=new HashMap();
// map.put("inspect",inspect);
// HashMap<String, List<Warn>> warnDetails = inspect.getWarnDetails();
// map.put("warnDetails",warnDetails);
// try {
// String template = FreemarkerUtils.getTemplate("pg.ftl", map);
// String s = inspectService.generateHtml(template, map);
// } catch (TemplateException e) {
// e.printStackTrace();
// }
Map map=new HashMap();
map.put("inspect",inspect);
map.put("time",TimeUtil.getTime());
HashMap<String, List<Warn>> warnMap = inspect.getWarnDetails();
List<Technology> technologies = inspect.getTechnologies();
Map techMap=new HashMap();
for (Technology technology : technologies) {
techMap.put(technology.getTechnologyName(),technology.getSupport());
}
map.put("techMap",techMap);
map.put("warnMap",warnMap);
map.put("technologies",technologies);
try {
String template = FreemarkerUtils.getTemplate("pg.ftl", map);
String s = inspectService.generateHtml(template, map);
String filePath = FileUtil.createFilePath();
File file1 = new File("./pgbg/" + filePath + "/" + file.getName() + ".html");
FileUtil.write(s,"./pgbg/"+filePath+"/"+file.getName()+".html");
reportVo.setHtmlAddress(file1.getCanonicalPath());
System.out.println("内容"+s);
} catch (TemplateException e) {
e.printStackTrace();
}
Report report = new Report();
String random = RandomUtil.getRandom();
report.setId(RandomUtil.getRandom());
report.setHtmlAddress(reportVo.getHtmlAddress());
reportService.saveReport(report);
inspectParameter.setReportId(random);
parameterService.saveParameter(inspectParameter);
return ResponseEntity.ok(inspect); return ResponseEntity.ok(inspect);
} }
...@@ -111,13 +139,13 @@ public class InspectController { ...@@ -111,13 +139,13 @@ public class InspectController {
public ResponseEntity inspect1(@RequestBody InspectParameter inspectParameter){ public ResponseEntity inspect1(@RequestBody InspectParameter inspectParameter){
String path = GitLabUtil.downLoadProject(inspectParameter.getGitAddress(),inspectParameter.getGitName()); String path = GitLabUtil.downLoadProject(inspectParameter.getGitAddress(),inspectParameter.getGitName());
inspectParameter.setId(UUIDUtil.getUUID()); inspectParameter.setId(UUIDUtil.getUUID());
inspectParameter.setPath(path); inspectParameter.setSourceAddress(path);
ReportVo reportVo = new ReportVo(); ReportVo reportVo = new ReportVo();
reportVo.setUploadType("git下载"); reportVo.setUploadType("git下载");
reportVo.setSourceAddress(path); reportVo.setSourceAddress(path);
reportVo.setGitAddress(inspectParameter.getGitAddress()); reportVo.setGitAddress(inspectParameter.getGitAddress());
inspectService.inspect(reportVo,inspectParameter); ReportVo inspect = inspectService.inspect(reportVo, inspectParameter);
return ResponseEntity.ok(200); return ResponseEntity.ok(inspect);
} }
@PostMapping("/frontend") @PostMapping("/frontend")
......
package com.zjty.inspect.controller;
import com.zjty.inspect.service.ReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Mcj
* @date 2020-03-05 19:22
*/
@RestController
@RequestMapping("/report")
@Api(value = "报告管理页面接口",description = "报告管理页面接口,提供页面的增、删、改、查")
public class ReportController {
@Autowired
private ReportService reportService;
@GetMapping("/page/{page}")
@ApiOperation("根据页码获取数据")
public ResponseEntity getReportByPage(@PathVariable int page){
return ResponseEntity.ok(reportService.findReportByPage(page));
}
@GetMapping("/id/{id}")
@ApiOperation("根据id获取数据")
public ResponseEntity getReportById(@PathVariable String id){
return ResponseEntity.ok(reportService.findReportById(id));
}
}
...@@ -79,7 +79,16 @@ public class RuleController { ...@@ -79,7 +79,16 @@ public class RuleController {
return ResponseEntity.ok(ruleService.findAll()); return ResponseEntity.ok(ruleService.findAll());
} }
/**
* 查询所有规则
* @return 规则
*/
@ApiOperation("查询所有规则")
@GetMapping("/test")
public ResponseEntity test(){
ruleService.test();
return ResponseEntity.ok(200);
}
/** /**
* 分页+多条件查询 * 分页+多条件查询
* @param searchMap 查询条件封装 * @param searchMap 查询条件封装
......
package com.zjty.inspect.dao;
import com.zjty.inspect.entity.Config;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @author Mcj
* @date 2020-03-05 20:55
*/
public interface ConfigParamDao extends JpaRepository<Config,Integer> {
}
package com.zjty.inspect.dao;
import com.zjty.inspect.entity.Report;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ReportDao extends JpaRepository<Report,String> {
}
...@@ -24,4 +24,15 @@ public interface RuleDao extends JpaRepository<Rule,String>,JpaSpecificationExec ...@@ -24,4 +24,15 @@ public interface RuleDao extends JpaRepository<Rule,String>,JpaSpecificationExec
Rule findAllByTargetEqualsAndTechnologyIdEquals(String target,String techId); Rule findAllByTargetEqualsAndTechnologyIdEquals(String target,String techId);
List<Rule> findAllByTargetLike(String target); List<Rule> findAllByTargetLike(String target);
Rule findByTarget(String target);
Rule findByTargetAndSuffixEquals(String target,String suffix);
/**
* 根据技术id查询规则
* @param ids 技术id
* @return
*/
List<Rule> findAllByTechnologyIdIn(List<String> ids);
} }
...@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; ...@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import java.util.List; import java.util.List;
import java.util.Optional;
public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpecificationExecutor<Technology> { public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpecificationExecutor<Technology> {
...@@ -15,7 +16,12 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec ...@@ -15,7 +16,12 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec
* @return Technology * @return Technology
*/ */
Technology findAllByTechnologyNameEquals(String name); Technology findAllByTechnologyNameEquals(String name);
Optional<Technology> findById(String id);
/**
* 模糊查询技术名称
* @param name
* @return
*/
List<Technology> findAllByTechnologyNameLike(String name); List<Technology> findAllByTechnologyNameLike(String name);
/** /**
...@@ -28,4 +34,18 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec ...@@ -28,4 +34,18 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec
@Query("select technologyName from Technology ") @Query("select technologyName from Technology ")
List<String> getTechnologyNames(); List<String> getTechnologyNames();
/**
* 查询不支持的技术个数
* @param support 是否支持
* @return
*/
int countAllBySupportIsNot(Integer support);
/**
* 查询前端或者后端依赖技术
* @param backOrFront
* @return
*/
List<Technology> findAllByBackorfrontEquals(String backOrFront);
} }
package com.zjty.inspect.entity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 预算
* @author Mcj
* @date 2020-02-27 19:05
*/
@Data
public class BudgetVo {
private List<Budget> budget = new ArrayList<>();
private List<CoefficientModelVo> coefficientModelVos = new ArrayList<>();
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Category {
@Id
@Column(length = 48)
private String id;
private String typeName;
}
...@@ -45,7 +45,10 @@ public class CoefficientModel { ...@@ -45,7 +45,10 @@ public class CoefficientModel {
private Integer scale; private Integer scale;
public Double countCoefficient(Double data) { public Double countCoefficient(Integer data) {
if(data==null){
return 1D;
}
if(data<min){ if(data<min){
return 1+belowCoefficient; return 1+belowCoefficient;
}else if(data>max){ }else if(data>max){
......
package com.zjty.inspect.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
/**
* 系数计算
*
* @author Mcj
*/
@Data
public class CoefficientModelVo {
/**
* 系数名称
*/
private String name;
/**
* 系数
*/
private double value;
}
package com.zjty.inspect.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Config {
@Id
@Column(length = 48)
private String id;
private String name;
private String value;
private Integer type;
private String des;
private String arrs;
}
...@@ -51,10 +51,25 @@ public class InspectParameter { ...@@ -51,10 +51,25 @@ public class InspectParameter {
* 数据量 * 数据量
*/ */
private Integer data; private Integer data;
/**
* 代码量
*/
private Integer codeSize;
/**
* 内容
*/
private Integer content;
/** /**
* 架构 * 架构
*/ */
private Double framework; private Integer framework;
/**
* 数据库表数量
*/
private Integer tables;
/** /**
* 安全能力 * 安全能力
...@@ -62,7 +77,7 @@ public class InspectParameter { ...@@ -62,7 +77,7 @@ public class InspectParameter {
* 2:弱 * 2:弱
* 3:强 * 3:强
*/ */
private Double safety; private Integer safety;
/** /**
* 容灾 * 容灾
...@@ -70,7 +85,7 @@ public class InspectParameter { ...@@ -70,7 +85,7 @@ public class InspectParameter {
* 2:有0,无-0.05 * 2:有0,无-0.05
* 3:有0,无-0.1 * 3:有0,无-0.1
*/ */
private Double disaster; private Integer disaster;
/** /**
* git地址 * git地址
...@@ -87,11 +102,6 @@ public class InspectParameter { ...@@ -87,11 +102,6 @@ public class InspectParameter {
*/ */
private String reportAddress; private String reportAddress;
/**
* 预算报告地址
*/
private String budgetAddress;
/** /**
* git上传地址 * git上传地址
*/ */
...@@ -113,4 +123,16 @@ public class InspectParameter { ...@@ -113,4 +123,16 @@ public class InspectParameter {
* 0:否 * 0:否
*/ */
private Integer admin; private Integer admin;
/**
* 方式
* 1:修改
* 2:适配:
*/
private Integer recastMethod;
/**
* 报告id
*/
private String reportId;
} }
package com.zjty.inspect.entity;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mcj
* @date 2020-03-05 19:24
*/
public class Page<T> {
private int totalPage;
private int totalElement;
private List<T> objects = new ArrayList<T>();
public void add(T t){
objects.add(t);
}
public void addAll(List<T> t){
objects.addAll(t);
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public void setTotalElement(int totalElement) {
this.totalElement = totalElement;
}
public int getTotalPage() {
return totalPage;
}
public int getTotalElement() {
return totalElement;
}
public List<T> getObjects() {
return objects;
}
}
...@@ -13,45 +13,19 @@ import java.sql.Timestamp; ...@@ -13,45 +13,19 @@ import java.sql.Timestamp;
* 报告 * 报告
* @author mcj * @author mcj
*/ */
@Entity
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class Report { public class Report {
/** @Id
* git源代码地址 private String id;
*/
private String gitAddress;
/**
* 架构,整合型还是分离型,根据jsp数量决定
*/
private String framework;
/**
* 代码管理方式,
*/
private String manager;
/**
* 语言
*/
private String language;
/** /**
* 生成报告存储地址 * 生成报告存储地址
*/ */
private String htmlAddress; private String htmlAddress;
/**
* 适配方式
* 1:适配
* 2:重构
*/
@Column(length = 5)
private Integer recastMethod;
//前端适配预算 //前端适配预算
//代码重构预算 //代码重构预算
//代码修改预算 //代码修改预算
...@@ -69,11 +43,4 @@ public class Report { ...@@ -69,11 +43,4 @@ public class Report {
@Column(name="update_time",columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = false) @Column(name="update_time",columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = false)
@Generated(GenerationTime.ALWAYS) @Generated(GenerationTime.ALWAYS)
private Timestamp updateDate; private Timestamp updateDate;
public enum DependenceManagement{
MAVEN,GRADLE,ANT
}
public enum Language{
JAVA,PYTHON,CPP,JSP,ASP,ONLYVIEW,UNKNOW,JAVASCRIPT,GO,VUE,HTML
}
} }
package com.zjty.inspect.entity;
import lombok.Data;
/**
* @author Mcj
* @date 2020-03-05 19:49
*/
@Data
public class ReportManage {
Report report;
InspectParameter inspectParameter;
}
...@@ -35,12 +35,12 @@ public class ReportVo { ...@@ -35,12 +35,12 @@ public class ReportVo {
/** /**
* 架构,整合型还是分离型,根据jsp数量决定 * 架构,整合型还是分离型,根据jsp数量决定
*/ */
private String framework; private Integer framework;
/** /**
* 代码管理方式, * 代码管理方式,
*/ */
private String manager; private Integer manager;
/** /**
* 数据库类型 * 数据库类型
...@@ -50,7 +50,7 @@ public class ReportVo { ...@@ -50,7 +50,7 @@ public class ReportVo {
/** /**
* 语言 * 语言
*/ */
private String language; private Integer language;
/** /**
* 生成报告存储地址 * 生成报告存储地址
...@@ -59,11 +59,10 @@ public class ReportVo { ...@@ -59,11 +59,10 @@ public class ReportVo {
/** /**
* 适配方式 * 适配方式
* 1:适配 * 1:适配重构
* 2:重构 * 2:代码修改
*/ */
@Column(length = 5) private Integer recastMethod;
private String recastMethod;
/** /**
* 源代码地址 * 源代码地址
...@@ -73,7 +72,7 @@ public class ReportVo { ...@@ -73,7 +72,7 @@ public class ReportVo {
/** /**
* 预算详情 * 预算详情
*/ */
private List<Budget> budgets; private BudgetVo budgets;
/** /**
* 依赖 * 依赖
...@@ -85,12 +84,22 @@ public class ReportVo { ...@@ -85,12 +84,22 @@ public class ReportVo {
*/ */
private List<Technology> technologies; private List<Technology> technologies;
private HashMap<String,Technology> technologyNameMap = new HashMap<>();
/** /**
* 告警点 * 告警点
*/ */
private HashMap<String, List<Warn>> warnDetails; private HashMap<String, List<Warn>> warnDetails;
/**
* 关键技术个数
*/
private Integer technologiesNum;
/**
* 需要改造的技术
*/
private Integer technologiesRepair;
/** /**
* 评估时间 * 评估时间
*/ */
......
...@@ -2,6 +2,8 @@ package com.zjty.inspect.entity; ...@@ -2,6 +2,8 @@ package com.zjty.inspect.entity;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* 规则 * 规则
* @author Mcj * @author Mcj
...@@ -21,7 +23,7 @@ public class RuleQo { ...@@ -21,7 +23,7 @@ public class RuleQo {
/** /**
* 匹配的文件后缀 * 匹配的文件后缀
*/ */
private String suffix; private List<String> suffix;
/** /**
* 适配技术id * 适配技术id
......
package com.zjty.inspect.entity; package com.zjty.inspect.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Generated; import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime; import org.hibernate.annotations.GenerationTime;
...@@ -17,6 +19,7 @@ import java.sql.Timestamp; ...@@ -17,6 +19,7 @@ import java.sql.Timestamp;
@Entity @Entity
@Data @Data
@ApiModel(description = "关键技术类")
public class Technology { public class Technology {
@Id @Id
...@@ -36,6 +39,7 @@ public class Technology { ...@@ -36,6 +39,7 @@ public class Technology {
/** /**
* 金额(万元) * 金额(万元)
*/ */
@ApiModelProperty(value = "金额",example = "123")
private Integer fund; private Integer fund;
/** /**
...@@ -43,6 +47,7 @@ public class Technology { ...@@ -43,6 +47,7 @@ public class Technology {
* 2:不支持 * 2:不支持
* 3:未知 * 3:未知
*/ */
@ApiModelProperty(value = "是否支持",example = "1")
private Integer support; private Integer support;
/** /**
...@@ -50,7 +55,9 @@ public class Technology { ...@@ -50,7 +55,9 @@ public class Technology {
* 1:前端技术 * 1:前端技术
* 2:后端技术 * 2:后端技术
*/ */
private Integer backOrFront=2; @ApiModelProperty(value = "技术类型",example = "2")
@Column(name = "back_or_front")
private Integer backorfront =2;
/** /**
* 数据创建时间 * 数据创建时间
*/ */
......
...@@ -11,10 +11,27 @@ public enum DependenceManagement { ...@@ -11,10 +11,27 @@ public enum DependenceManagement {
/** /**
* maven方式 * maven方式
*/ */
MAVEN, MAVEN("maven",1),
/** /**
* gradle方式 * gradle方式
*/ */
GRADLE, GRADLE("gradle",2);
DependenceManagement(String name,Integer status){
this.name=name;
this.status=status;
}
private String name;
private Integer status;
public String getName() {
return name;
}
public Integer getStatus() {
return status;
}
} }
package com.zjty.inspect.enums;
public enum Framework {
/**
* 架构
*/
分离型架构("分离型架构",1),
混合型架构("混合型架构",2);
Framework(String name,Integer status){
this.name=name;
this.status=status;
}
private String name;
private Integer status;
public String getName() {
return name;
}
public Integer getStatus() {
return status;
}
}
...@@ -9,29 +9,58 @@ public enum Language { ...@@ -9,29 +9,58 @@ public enum Language {
/** /**
* java类型 * java类型
*/ */
JAVA, C("c#",8),
JAVA("java",1),
/**
* java类型
*/
VUE("java",2),
/**
* java类型
*/
CPP("cpp",2),
/** /**
* pyth类型 * pyth类型
*/ */
PYTHON, PYTHON("python",3),
/** /**
* asp * asp
*/ */
ASP, ASP("asp",4),
/** /**
* js * js
*/ */
JAVASCRIPT, JAVASCRIPT("js",5),
/** /**
* go * go
*/ */
GO, GO("go",6),
/** /**
* html * html
*/ */
HTML, HTML("html",7),
UNKNOW, UNKNOW("unknowun",9);
Language(String name,Integer status){
this.name=name;
this.status=status;
}
private String name;
private Integer status;
public String getName() {
return name;
}
public Integer getStatus() {
return status;
}
} }
package com.zjty.inspect.enums;
public enum RecastMethod {
/**
* 架构
*/
适配重构("适配重构",1),
代码修改("代码修改",2);
RecastMethod(String name, Integer status){
this.name=name;
this.status=status;
}
private String name;
private Integer status;
public String getName() {
return name;
}
public Integer getStatus() {
return status;
}
}
...@@ -2,6 +2,10 @@ package com.zjty.inspect.inspect; ...@@ -2,6 +2,10 @@ package com.zjty.inspect.inspect;
import com.zjty.inspect.dao.*; import com.zjty.inspect.dao.*;
import com.zjty.inspect.entity.*; import com.zjty.inspect.entity.*;
import com.zjty.inspect.enums.DependenceManagement;
import com.zjty.inspect.enums.Framework;
import com.zjty.inspect.enums.Language;
import com.zjty.inspect.enums.RecastMethod;
import com.zjty.inspect.utils.*; import com.zjty.inspect.utils.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
...@@ -15,8 +19,6 @@ import java.io.IOException; ...@@ -15,8 +19,6 @@ import java.io.IOException;
import java.nio.file.*; import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.*; import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -55,7 +57,7 @@ public class Inspector { ...@@ -55,7 +57,7 @@ public class Inspector {
* key:mysql-connect : * * key:mysql-connect : *
* mysql-connect:* * mysql-connect:*
* mysql-connect:.java * mysql-connect:.java
* * <p>
* value:随意 * value:随意
*/ */
private HashMap<String, Rule> ruleMap = new HashMap<>(); private HashMap<String, Rule> ruleMap = new HashMap<>();
...@@ -78,6 +80,7 @@ public class Inspector { ...@@ -78,6 +80,7 @@ public class Inspector {
*/ */
private InspectParameter inspectParameter; private InspectParameter inspectParameter;
private double codeSize = 0;
/** /**
* 报告对象 * 报告对象
*/ */
...@@ -95,7 +98,7 @@ public class Inspector { ...@@ -95,7 +98,7 @@ public class Inspector {
* key:properties * key:properties
* value:[{/Users/path},{/Users/path}] * value:[{/Users/path},{/Users/path}]
*/ */
private Map<String, Report.Language> suffixLanguageMapping = new HashMap<>(); private Map<String, Language> suffixLanguageMapping = new HashMap<>();
/** /**
* 规则列表 * 规则列表
...@@ -129,18 +132,15 @@ public class Inspector { ...@@ -129,18 +132,15 @@ public class Inspector {
* @return 报告 * @return 报告
*/ */
public ReportVo inspect() { public ReportVo inspect() {
ruleSuffixFileMap=new HashMap<>(); ruleSuffixFileMap = new HashMap<>();
ruleSuffixMap = new HashMap<>(); ruleSuffixMap = new HashMap<>();
warns.clear(); warns.clear();
rules.clear(); rules.clear();
//查询技术,构造支持与非支持技术对象
findExistTechnology();
//统计项目组成文件构成
statisticsLanguage(); statisticsLanguage();
this.ruleList=ruleDao.findAll();
//统计项目组成文件构成
//统计配置文件地址 //统计配置文件地址
statisticsConfigFile(); statisticsConfigFile();
//查询所有规则
ruleTransform();
try { try {
//以下为计算文件名称匹配正则表达式 //以下为计算文件名称匹配正则表达式
FileSystem aDefault = FileSystems.getDefault(); FileSystem aDefault = FileSystems.getDefault();
...@@ -175,6 +175,8 @@ public class Inspector { ...@@ -175,6 +175,8 @@ public class Inspector {
for (Map.Entry<String, PathMatcher> entry : languageSuffixMatcherMapping.entrySet()) { for (Map.Entry<String, PathMatcher> entry : languageSuffixMatcherMapping.entrySet()) {
//通过正则表达式匹配.java类型后缀文件,并+1 //通过正则表达式匹配.java类型后缀文件,并+1
if (entry.getValue().matches(file)) { if (entry.getValue().matches(file)) {
long length = file.toFile().length();
codeSize += length / 1024;
languageMatchMap.get(entry.getKey()).plus(); languageMatchMap.get(entry.getKey()).plus();
} }
} }
...@@ -223,7 +225,7 @@ public class Inspector { ...@@ -223,7 +225,7 @@ public class Inspector {
pomDependency.setSupport(1); pomDependency.setSupport(1);
} else { } else {
//为普通用户上传,依赖需要检查是否支持。 //为普通用户上传,依赖需要检查是否支持。
int i = valiWarn(ruleList, file,patten, 0); int i = valiWarn(ruleList, file, patten, 0);
//如果值为0则代表是有不支持技术到匹配 //如果值为0则代表是有不支持技术到匹配
pomDependency.setSupport(i); pomDependency.setSupport(i);
} }
...@@ -245,6 +247,7 @@ public class Inspector { ...@@ -245,6 +247,7 @@ public class Inspector {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
inspectParameter.setCodeSize((int) codeSize);
return analysis(); return analysis();
} }
...@@ -257,6 +260,11 @@ public class Inspector { ...@@ -257,6 +260,11 @@ public class Inspector {
public ReportVo analysis() { public ReportVo analysis() {
DependencyVo dependencyVo = new DependencyVo(); DependencyVo dependencyVo = new DependencyVo();
setReportLanguageAndFrame(); setReportLanguageAndFrame();
//查询技术,构造支持与非支持技术对象
findExistTechnology();
//查询所有规则
ruleTransform(report.getRecastMethod());
//解析配置文件集合 //解析配置文件集合
for (Map.Entry<String, List<Path>> entry : configFileTypePathsMapping.entrySet()) { for (Map.Entry<String, List<Path>> entry : configFileTypePathsMapping.entrySet()) {
switch (entry.getKey()) { switch (entry.getKey()) {
...@@ -267,7 +275,7 @@ public class Inspector { ...@@ -267,7 +275,7 @@ public class Inspector {
for (Path path : entry.getValue()) { for (Path path : entry.getValue()) {
if (path.getFileName().endsWith("pom.xml")) { if (path.getFileName().endsWith("pom.xml")) {
// TODO: 2020-02-28 解析maven树文件,设置依赖保存到redis // TODO: 2020-02-28 解析maven树文件,设置依赖保存到redis
report.setManager(Report.DependenceManagement.MAVEN.name()); report.setManager(DependenceManagement.MAVEN.getStatus());
ProjectPom projectPom = analysisFile.analysisPom(path); ProjectPom projectPom = analysisFile.analysisPom(path);
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
...@@ -282,7 +290,7 @@ public class Inspector { ...@@ -282,7 +290,7 @@ public class Inspector {
for (Path path : entry.getValue()) { for (Path path : entry.getValue()) {
if (path.getFileName().endsWith("build.gradle")) { if (path.getFileName().endsWith("build.gradle")) {
ProjectPom projectPom = new ProjectPom(); ProjectPom projectPom = new ProjectPom();
report.setManager(Report.DependenceManagement.GRADLE.name()); report.setManager(DependenceManagement.GRADLE.getStatus());
List<PomDependency> pomDependencies = AnalysisFile.analysisGradle(path); List<PomDependency> pomDependencies = AnalysisFile.analysisGradle(path);
projectPom.setDependencies(pomDependencies); projectPom.setDependencies(pomDependencies);
//设置依赖 //设置依赖
...@@ -330,7 +338,7 @@ public class Inspector { ...@@ -330,7 +338,7 @@ public class Inspector {
} }
//计算预算 //计算预算
if (inspectParameter.getValid() != null) { if (inspectParameter.getValid() != null) {
List<Budget> budget = budgetUitl.getBudget(fund, inspectParameter); BudgetVo budget = budgetUitl.getBudget(fund, report, inspectParameter);
report.setBudgets(budget); report.setBudgets(budget);
inspectParameter.setId(UUIDUtil.getUUID()); inspectParameter.setId(UUIDUtil.getUUID());
parameterDao.save(inspectParameter); parameterDao.save(inspectParameter);
...@@ -349,37 +357,51 @@ public class Inspector { ...@@ -349,37 +357,51 @@ public class Inspector {
HashMap<String, List<Warn>> warnMap = getWarnMap(map); HashMap<String, List<Warn>> warnMap = getWarnMap(map);
ruleDao.saveAll(rules); ruleDao.saveAll(rules);
report.setWarnDetails(warnMap); report.setWarnDetails(warnMap);
report.setTechnologyNameMap(map);
return report; return report;
} }
private void setReportLanguageAndFrame() { private void setReportLanguageAndFrame() {
String most = null; String most = null;
int mostStatus = 0;
int maxnum = 0; int maxnum = 0;
//统计文件最多的 //统计文件最多的
for (Map.Entry<String, Counter> entry : languageMatchMap.entrySet()) { for (Map.Entry<String, Counter> entry : languageMatchMap.entrySet()) {
if (entry.getValue().getNumber() > maxnum) { if (entry.getValue().getNumber() > maxnum) {
most = suffixLanguageMapping.get(entry.getKey()).name(); most = suffixLanguageMapping.get(entry.getKey()).name();
Language language = Language.valueOf(most);
mostStatus = language.getStatus();
maxnum = entry.getValue().getNumber(); maxnum = entry.getValue().getNumber();
} }
} }
//设置语言 //设置语言
report.setLanguage(most == null ? Report.Language.UNKNOW.name() : most); report.setLanguage(most == null ? Language.UNKNOW.getStatus() : mostStatus);
//设置架构 //设置架构
report.setFramework(languageMatchMap.get("jsp").i > 0 ? "混合型架构" : "分离型架构"); report.setFramework(languageMatchMap.get("jsp").i > 0 ? Framework.混合型架构.getStatus() : Framework.分离型架构.getStatus());
//设置是否需要重构 //设置是否需要重构
if (languageMatchMap.get("jsp").i == 0 & languageMatchMap.get("java").i == 0) { if (languageMatchMap.get("jsp").i == 0 & languageMatchMap.get("java").i == 0) {
report.setRecastMethod("建议重构"); report.setRecastMethod(RecastMethod.适配重构.getStatus());
} else { } else {
report.setRecastMethod("建议适配"); report.setRecastMethod(RecastMethod.代码修改.getStatus());
} }
} }
/** /**
* rule所需要数据装配 * rule所需要数据装配
*/ */
private void ruleTransform() { private void ruleTransform(int i) {
this.ruleList = ruleDao.findAll(); if(i==1){
List<Technology> front = technologyDao.findAllByBackorfrontEquals("1");
List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList());
this.ruleList=ruleDao.findAllByTechnologyIdIn(ids);
}else{
if(inspectParameter.getRecastMethod()==1){
this.ruleList=ruleDao.findAll();
}else{
List<Technology> front = technologyDao.findAllByBackorfrontEquals("1");
List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList());
this.ruleList=ruleDao.findAllByTechnologyIdIn(ids);
}
}
Set<String> id = ruleList.stream().map(Rule::getTechnologyId).collect(Collectors.toSet()); Set<String> id = ruleList.stream().map(Rule::getTechnologyId).collect(Collectors.toSet());
List<Technology> technologies = technologyDao.findAllByIdIn(new ArrayList<>(id)); List<Technology> technologies = technologyDao.findAllByIdIn(new ArrayList<>(id));
for (Technology technology : technologies) { for (Technology technology : technologies) {
...@@ -393,10 +415,10 @@ public class Inspector { ...@@ -393,10 +415,10 @@ public class Inspector {
} }
//根据后缀名进行规则收集 //根据后缀名进行规则收集
for (Rule rule : ruleList) { for (Rule rule : ruleList) {
if(!ruleSuffixMap.containsKey(rule.getSuffix())){ if (!ruleSuffixMap.containsKey(rule.getSuffix())) {
ruleSuffixMap.put(rule.getSuffix(), new ArrayList<>()); ruleSuffixMap.put(rule.getSuffix(), new ArrayList<>());
ruleSuffixMap.get(rule.getSuffix()).add(rule); ruleSuffixMap.get(rule.getSuffix()).add(rule);
}else{ } else {
ruleSuffixMap.get(rule.getSuffix()).add(rule); ruleSuffixMap.get(rule.getSuffix()).add(rule);
} }
} }
...@@ -514,7 +536,7 @@ public class Inspector { ...@@ -514,7 +536,7 @@ public class Inspector {
} else if (technologyHashMap.get(rule.getTechnologyId()).getSupport() == 3) { } else if (technologyHashMap.get(rule.getTechnologyId()).getSupport() == 3) {
warns.add(warn); warns.add(warn);
supportStatus = 3; supportStatus = 3;
}else if (technologyHashMap.get(rule.getTechnologyId()).getSupport() == 1) { } else if (technologyHashMap.get(rule.getTechnologyId()).getSupport() == 1) {
warns.add(warn); warns.add(warn);
supportStatus = 1; supportStatus = 1;
} }
......
...@@ -16,7 +16,7 @@ public interface ParameterService { ...@@ -16,7 +16,7 @@ public interface ParameterService {
public void saveParameter(InspectParameter inspectParameter); public void saveParameter(InspectParameter inspectParameter);
/** /**
* 保存参数 * 根据id获取参数
* @param id id * @param id id
*/ */
public InspectParameter getParameterById(String id); public InspectParameter getParameterById(String id);
......
package com.zjty.inspect.service; package com.zjty.inspect.service;
import com.zjty.inspect.entity.ReportVo; import com.zjty.inspect.entity.Page;
import org.springframework.data.domain.Page; import com.zjty.inspect.entity.Report;
import com.zjty.inspect.entity.ReportManage;
import java.util.List;
public interface ReportService { public interface ReportService {
public Page findReportByPage(int page);
public ReportManage findReportById(String id);
void saveReport(Report report);
} }
...@@ -44,4 +44,5 @@ public interface RuleService { ...@@ -44,4 +44,5 @@ public interface RuleService {
List<Rule> findByName(String name); List<Rule> findByName(String name);
Page<Rule> findSearch(Map searchMap, int page, int size); Page<Rule> findSearch(Map searchMap, int page, int size);
void test();
} }
...@@ -30,4 +30,18 @@ public interface TechnologyService { ...@@ -30,4 +30,18 @@ public interface TechnologyService {
void update(Technology technology); void update(Technology technology);
Page<Technology> findSearch(Map searchMap, int page, int size); Page<Technology> findSearch(Map searchMap, int page, int size);
/**
* 查询全部技术个数
* @return 查询技术数量
*/
int findAllTechnologyCount();
/**
* 查询不支持的技术个数
* @return 查询技术数量
*/
int findAllTechnologyNotSupport();
Technology findByid(String technologyId);
} }
package com.zjty.inspect.service.impl; package com.zjty.inspect.service.impl;
import com.zjty.inspect.dao.ReportDao;
import com.zjty.inspect.entity.InspectParameter; import com.zjty.inspect.entity.InspectParameter;
import com.zjty.inspect.entity.Report; import com.zjty.inspect.entity.Report;
import com.zjty.inspect.entity.ReportVo; import com.zjty.inspect.entity.ReportVo;
import com.zjty.inspect.enums.Language;
import com.zjty.inspect.service.InspectService; import com.zjty.inspect.service.InspectService;
import com.zjty.inspect.inspect.Inspector; import com.zjty.inspect.inspect.Inspector;
import com.zjty.inspect.service.ParameterService;
import com.zjty.inspect.utils.RandomUtil;
import freemarker.cache.StringTemplateLoader; import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
...@@ -26,29 +30,38 @@ public class InspectServiceImpl implements InspectService { ...@@ -26,29 +30,38 @@ public class InspectServiceImpl implements InspectService {
@Autowired @Autowired
Inspector inspector; Inspector inspector;
@Autowired
private ReportDao reportDao;
@Autowired
private ParameterService parameterService;
@Transactional @Transactional
@Override @Override
public ReportVo inspect(ReportVo reportVo,InspectParameter inspectParameter) { public ReportVo inspect(ReportVo reportVo,InspectParameter inspectParameter) {
//统计文件后缀数量 //统计文件后缀数量
Map<String, Report.Language> suffixLanguageMapping = new HashMap<>(); Map<String, Language> suffixLanguageMapping = new HashMap<>();
suffixLanguageMapping.put("java", Report.Language.JAVA); suffixLanguageMapping.put("java", Language.JAVA);
suffixLanguageMapping.put("vue", Report.Language.VUE); suffixLanguageMapping.put("aspx", Language.C);
suffixLanguageMapping.put("cpp", Report.Language.CPP); suffixLanguageMapping.put("cs", Language.C);
suffixLanguageMapping.put("py", Report.Language.PYTHON); suffixLanguageMapping.put("resx", Language.C);
suffixLanguageMapping.put("jsp", Report.Language.JAVA); suffixLanguageMapping.put("vue", Language.VUE);
suffixLanguageMapping.put("go", Report.Language.GO); suffixLanguageMapping.put("cpp", Language.CPP);
suffixLanguageMapping.put("js", Report.Language.JAVASCRIPT); suffixLanguageMapping.put("py", Language.PYTHON);
suffixLanguageMapping.put("html", Report.Language.HTML); suffixLanguageMapping.put("jsp", Language.JAVA);
suffixLanguageMapping.put("go", Language.GO);
suffixLanguageMapping.put("js", Language.JAVASCRIPT);
suffixLanguageMapping.put("html", Language.HTML);
//构造成员变量 //构造成员变量
inspector.setInspectParameter(inspectParameter); inspector.setInspectParameter(inspectParameter);
//构造报告vo //构造报告vo
inspector.setReport(reportVo); inspector.setReport(reportVo);
//需要重构 //需要重构
inspector.setSuffixLanguageMapping(suffixLanguageMapping); inspector.setSuffixLanguageMapping(suffixLanguageMapping);
ReportVo report = inspector.inspect(); ReportVo reportVoReturn = inspector.inspect();
return report; return reportVoReturn;
} }
//执行静态化 //执行静态化
......
package com.zjty.inspect.service.impl; package com.zjty.inspect.service.impl;
import com.zjty.inspect.dao.ReportDao;
import com.zjty.inspect.dao.TechnologyDao; import com.zjty.inspect.dao.TechnologyDao;
import com.zjty.inspect.entity.*; import com.zjty.inspect.entity.*;
import com.zjty.inspect.service.ParameterService;
import com.zjty.inspect.service.ReportService; import com.zjty.inspect.service.ReportService;
import com.zjty.inspect.utils.RedisUtil;
import freemarker.cache.StringTemplateLoader; import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import java.util.Map; import java.util.Map;
import java.util.Optional;
/** /**
* @author Mcj * @author Mcj
...@@ -24,14 +27,12 @@ public class ReportServiceImpl implements ReportService { ...@@ -24,14 +27,12 @@ public class ReportServiceImpl implements ReportService {
@Autowired @Autowired
private TechnologyDao technologyDao; private TechnologyDao technologyDao;
@Autowired
private RedisUtil redisUtil;
public ReportVo set(Report report){ @Autowired
private ParameterService parameterService;
return new ReportVo(); @Autowired
} private ReportDao reportDao;
//执行静态化 //执行静态化
private String generateHtml(String templateContent, Map model ){ private String generateHtml(String templateContent, Map model ){
...@@ -54,4 +55,33 @@ public class ReportServiceImpl implements ReportService { ...@@ -54,4 +55,33 @@ public class ReportServiceImpl implements ReportService {
return null; return null;
} }
@Override
public Page findReportByPage(int page) {
PageRequest of = PageRequest.of(page - 1, 10);
org.springframework.data.domain.Page<Report> all = reportDao.findAll(of);
Page<Report> reportPage = new Page<>();
reportPage.setTotalElement((int) all.getTotalElements());
reportPage.setTotalPage(all.getTotalPages());
reportPage.addAll(all.getContent());
return reportPage;
}
@Override
public ReportManage findReportById(String id) {
Optional<Report> report = reportDao.findById(id);
ReportManage reportManage = new ReportManage();
if(report.isPresent()){
reportManage.setReport(report.get());
InspectParameter inspectParameter = parameterService.getParameterById(report.get().getId());
reportManage.setInspectParameter(inspectParameter);
}
return reportManage;
}
@Override
public void saveReport(Report report) {
reportDao.save(report);
}
} }
...@@ -6,6 +6,7 @@ import com.zjty.inspect.entity.Technology; ...@@ -6,6 +6,7 @@ import com.zjty.inspect.entity.Technology;
import com.zjty.inspect.entity.Rule; import com.zjty.inspect.entity.Rule;
import com.zjty.inspect.entity.RuleQo; import com.zjty.inspect.entity.RuleQo;
import com.zjty.inspect.service.RuleService; import com.zjty.inspect.service.RuleService;
import com.zjty.inspect.service.TechnologyService;
import com.zjty.inspect.utils.UUIDUtil; import com.zjty.inspect.utils.UUIDUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
...@@ -39,7 +40,18 @@ public class RuleServiceImpl implements RuleService { ...@@ -39,7 +40,18 @@ public class RuleServiceImpl implements RuleService {
*/ */
@Autowired @Autowired
private RuleDao ruleDao; private RuleDao ruleDao;
@Autowired
private TechnologyService technologyService;
@Override
public void test(){
List<Rule> rules = ruleDao.findAll();
for (Rule rule : rules) {
Technology technology = technologyService.findByid(rule.getTechnologyId());
rule.setTechnologyName(technology.getTechnologyName());
}
ruleDao.saveAll(rules);
}
/** /**
* 新增规则 * 新增规则
* *
...@@ -47,14 +59,21 @@ public class RuleServiceImpl implements RuleService { ...@@ -47,14 +59,21 @@ public class RuleServiceImpl implements RuleService {
*/ */
@Override @Override
public void addRule(RuleQo ruleQo) { public void addRule(RuleQo ruleQo) {
// TODO: 2020-02-27 适配技术与扫描关键字关联
for (String suffix : ruleQo.getSuffix()) {
Rule rule1 = ruleDao.findByTargetAndSuffixEquals(ruleQo.getTarget(),suffix);
if(rule1!=null){
return;
}
Rule rule = new Rule(); Rule rule = new Rule();
rule.setTarget(ruleQo.getTarget()); rule.setTarget(ruleQo.getTarget());
rule.setSuffix(ruleQo.getSuffix()); rule.setSuffix(suffix);
rule.setTechnologyId(ruleQo.getTechnologyId()); rule.setTechnologyId(ruleQo.getTechnologyId());
rule.setTechnologyName(ruleQo.getTechnologyName());
rule.setId(UUIDUtil.getUUID()); rule.setId(UUIDUtil.getUUID());
ruleDao.save(rule); ruleDao.save(rule);
} }
}
/** /**
* 条件查询+分页 * 条件查询+分页
...@@ -96,13 +115,20 @@ public class RuleServiceImpl implements RuleService { ...@@ -96,13 +115,20 @@ public class RuleServiceImpl implements RuleService {
@Override @Override
public void upRule(RuleQo ruleQo) { public void upRule(RuleQo ruleQo) {
for (String suffix : ruleQo.getSuffix()) {
Rule rule1 = ruleDao.findByTarget(ruleQo.getTarget());
if(rule1!=null){
return;
}
Rule rule = new Rule(); Rule rule = new Rule();
rule.setTarget(ruleQo.getTarget()); rule.setTarget(ruleQo.getTarget());
rule.setSuffix(ruleQo.getSuffix()); rule.setSuffix(suffix);
rule.setTechnologyId(ruleQo.getTechnologyId()); rule.setTechnologyId(ruleQo.getTechnologyId());
rule.setTechnologyName(ruleQo.getTechnologyName());
rule.setId(ruleQo.getId()); rule.setId(ruleQo.getId());
ruleDao.save(rule); ruleDao.save(rule);
} }
}
@Override @Override
public void deleteById(String id) { public void deleteById(String id) {
......
...@@ -19,6 +19,7 @@ import javax.persistence.criteria.Root; ...@@ -19,6 +19,7 @@ import javax.persistence.criteria.Root;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
/** /**
* 适配技术 * 适配技术
...@@ -89,6 +90,10 @@ public class TechnologyServiceImpl implements TechnologyService { ...@@ -89,6 +90,10 @@ public class TechnologyServiceImpl implements TechnologyService {
return technologyDao.findAllByTechnologyNameLike("%"+name+"%"); return technologyDao.findAllByTechnologyNameLike("%"+name+"%");
} }
/**
* 更新技术细节
* @param technology
*/
@Override @Override
public void update(Technology technology) { public void update(Technology technology) {
technologyDao.save(technology); technologyDao.save(technology);
...@@ -100,6 +105,26 @@ public class TechnologyServiceImpl implements TechnologyService { ...@@ -100,6 +105,26 @@ public class TechnologyServiceImpl implements TechnologyService {
PageRequest pageRequest = PageRequest.of(page-1, size); PageRequest pageRequest = PageRequest.of(page-1, size);
return technologyDao.findAll(specification, pageRequest); return technologyDao.findAll(specification, pageRequest);
} }
@Override
public int findAllTechnologyCount() {
return (int) technologyDao.count();
}
@Override
public int findAllTechnologyNotSupport() {
return technologyDao.countAllBySupportIsNot(1);
}
@Override
public Technology findByid(String technologyId) {
Optional<Technology> optional = technologyDao.findById(technologyId);
if(optional.isPresent()){
return optional.get();
}
return null;
}
/** /**
* 动态条件构建 * 动态条件构建
* @param searchMap * @param searchMap
......
package com.zjty.inspect.utils; package com.zjty.inspect.utils;
import com.zjty.inspect.dao.CoefficientModelDao; import com.zjty.inspect.dao.CoefficientModelDao;
import com.zjty.inspect.entity.Budget; import com.zjty.inspect.dao.ConfigParamDao;
import com.zjty.inspect.entity.CoefficientModel; import com.zjty.inspect.entity.*;
import com.zjty.inspect.entity.InspectParameter;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -20,6 +20,8 @@ import java.util.stream.Collectors; ...@@ -20,6 +20,8 @@ import java.util.stream.Collectors;
@Component @Component
public class BudgetUitl { public class BudgetUitl {
@Autowired
private ConfigParamDao configParamDao;
@Autowired @Autowired
private CoefficientModelDao coefficientModelDao; private CoefficientModelDao coefficientModelDao;
...@@ -27,12 +29,22 @@ public class BudgetUitl { ...@@ -27,12 +29,22 @@ public class BudgetUitl {
/** /**
* 获取预算数据 * 获取预算数据
* @param fund 技术费用 * @param fund 技术费用
* @param report
* @param inspectParameter 计算所需数据 * @param inspectParameter 计算所需数据
* @return * @return
*/ */
public List<Budget> getBudget(Integer fund, InspectParameter inspectParameter){ public BudgetVo getBudget(Integer fund, ReportVo report, InspectParameter inspectParameter){
inspectParameter.setMoneyRate(1.04);
inspectParameter.setProportion(0.6); BudgetVo budgetVo = new BudgetVo();
// TODO: 2020-03-05 查询年复利率,查询修改,适配和重构占比
List<Config> all = configParamDao.findAll();
HashMap<Integer, String> doubleHashMap = new HashMap<>();
for (Config config : all) {
if(!doubleHashMap.containsKey(config.getType())){
doubleHashMap.put(config.getType(),config.getValue());
}
}
int scale; int scale;
Integer systemFund = inspectParameter.getSystemFund(); Integer systemFund = inspectParameter.getSystemFund();
if(systemFund==0){ if(systemFund==0){
...@@ -46,58 +58,126 @@ public class BudgetUitl { ...@@ -46,58 +58,126 @@ public class BudgetUitl {
}else{ }else{
scale=3; scale=3;
} }
Budget budget = new Budget(); inspectParameter.setMoneyRate(Double.valueOf(doubleHashMap.get(1)));
budget.setBudgetName("代码重构预算");
Double moneyRate = inspectParameter.getMoneyRate(); Double moneyRate = inspectParameter.getMoneyRate();
int i = 2020 - inspectParameter.getYears(); int years = inspectParameter.getYears();
double pow = Math.pow(moneyRate, i); double pow = Math.pow(moneyRate, years);
//不带修正系数资金
double v = inspectParameter.getProportion() * pow * systemFund + fund;
//带修正系数资金 //带修正系数资金
ArrayList<String> strings = new ArrayList<>(); ArrayList<String> strings = new ArrayList<>();
Double v1 = v;
strings.add("安全能力"); strings.add("安全能力");
strings.add("容灾能力"); strings.add("容灾能力");
strings.add("架构"); strings.add("架构");
strings.add("数据量"); strings.add("数据量");
strings.add("模块数"); strings.add("模块数");
strings.add("数据库表");
strings.add("代码量");
strings.add("内容");
double coefficient = 1;
List<CoefficientModel> nameIn = coefficientModelDao.findAllByNameIn(strings); List<CoefficientModel> nameIn = coefficientModelDao.findAllByNameIn(strings);
List<CoefficientModel> collect = nameIn.stream().filter(a -> a.getScale() == scale).collect(Collectors.toList()); List<CoefficientModel> collect = nameIn.stream().filter(a -> a.getScale() == scale).collect(Collectors.toList());
for (CoefficientModel model : collect) { for (CoefficientModel model : collect) {
CoefficientModelVo coefficientModelVo = new CoefficientModelVo();
coefficientModelVo.setName(model.getName());
if("架构".equals(model.getName())){ if("架构".equals(model.getName())){
Double aDouble = model.countCoefficient(inspectParameter.getFramework()); Double value = model.countCoefficient(inspectParameter.getFramework());
v1*=aDouble; coefficientModelVo.setValue(value);
coefficient*=value;
}else if("容灾能力".equals(model.getName())){ }else if("容灾能力".equals(model.getName())){
Double aDouble = model.countCoefficient(inspectParameter.getDisaster()); Double value = model.countCoefficient(inspectParameter.getDisaster());
v1*=aDouble; coefficientModelVo.setValue(value);
coefficient*=value;
} }
else if("安全能力".equals(model.getName())){ else if("安全能力".equals(model.getName())){
Double aDouble = model.countCoefficient(inspectParameter.getSafety()); Double value = model.countCoefficient(inspectParameter.getSafety());
v1*=aDouble; coefficientModelVo.setValue(value);
coefficient*=value;
} }
else if("数据量".equals(model.getName())){ else if("数据量".equals(model.getName())){
Double aDouble = model.countCoefficient(Double.valueOf(inspectParameter.getData())); Double value = model.countCoefficient(inspectParameter.getData());
v1*=aDouble; coefficientModelVo.setValue(value);
coefficient*=value;
} }
else if("模块数".equals(model.getName())){ else if("模块数".equals(model.getName())){
Double aDouble = model.countCoefficient(Double.valueOf(inspectParameter.getModules())); Double value = model.countCoefficient(inspectParameter.getModules());
v1*=aDouble; coefficientModelVo.setValue(value);
coefficient*=value;
}
else if("数据库表".equals(model.getName())){
Double value = model.countCoefficient(inspectParameter.getTables());
coefficientModelVo.setValue(value);
coefficient *=value;
}
else if("代码量".equals(model.getName())){
Double value = model.countCoefficient(inspectParameter.getCodeSize());
coefficientModelVo.setValue(value);
coefficient*=value;
}else if("内容".equals(model.getName())){
Double value = model.countCoefficient(inspectParameter.getContent());
coefficientModelVo.setValue(value);
coefficient*=value;
} }
budgetVo.getCoefficientModelVos().add(coefficientModelVo);
} }
if(v<v1){ if(inspectParameter.getRecastMethod()==1){
budget.setFund(v +"--"+v1); //用户需要适配
}else if(v>v1){ double refactorProportion = Double.valueOf(doubleHashMap.get(4));
budget.setFund(v1 +"--"+v); inspectParameter.setProportion(refactorProportion);
Budget codeRefactor = new Budget();
codeRefactor.setBudgetName("代码修改预算");
double fundNotRepair = inspectParameter.getProportion() * pow * systemFund + fund;
double fundRepair=fundNotRepair*coefficient;
if(fundNotRepair<fundRepair){
codeRefactor.setFund(fundNotRepair +"--"+fundRepair);
}else if(fundNotRepair>fundRepair){
codeRefactor.setFund(fundRepair +"--"+fundNotRepair);
}else{ }else{
budget.setFund(v1 +"--"+v); codeRefactor.setFund(fundRepair +"--"+fundNotRepair);
}
codeRefactor.setFundDetail("普通业务开发费用:"+fundNotRepair);
codeRefactor.setFundDetail("普通业务开发费用(修正):"+fundRepair);
codeRefactor.setFundDetail("关键适配技术成本:"+fund);
budgetVo.getBudget().add(codeRefactor);
if(report.getRecastMethod()==1){
double refactorProportion1 = Double.valueOf(doubleHashMap.get(2));
inspectParameter.setProportion(refactorProportion1);
Budget codeRefactor1 = new Budget();
codeRefactor1.setBudgetName("代码重构预算");
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund + fund;
double fundRepair1=fundNotRepair1*coefficient;
if(fundNotRepair1<fundRepair1){
codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1);
}else if(fundNotRepair1>fundRepair1){
codeRefactor1.setFund(fundRepair1 +"--"+fundNotRepair1);
}else{
codeRefactor1.setFund(fundRepair1 +"--"+fundNotRepair1);
}
codeRefactor1.setFundDetail("普通业务开发费用:"+fundNotRepair1);
codeRefactor1.setFundDetail("普通业务开发费用(修正):"+fundRepair1);
codeRefactor1.setFundDetail("关键适配技术成本:"+fund);
budgetVo.getBudget().add(codeRefactor1);
}
}else{
double refactorProportion = Double.valueOf(doubleHashMap.get(3));
inspectParameter.setProportion(refactorProportion);
Budget codeRefactor1 = new Budget();
codeRefactor1.setBudgetName("代码修改预算");
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund + fund;
double fundRepair1=fundNotRepair1*coefficient;
if(fundNotRepair1<fundRepair1){
codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1);
}else if(fundNotRepair1>fundRepair1){
codeRefactor1.setFund(fundRepair1 +"--"+fundNotRepair1);
}else{
codeRefactor1.setFund(fundRepair1 +"--"+fundNotRepair1);
}
codeRefactor1.setFundDetail("普通业务开发费用:"+fundNotRepair1);
codeRefactor1.setFundDetail("普通业务开发费用(修正):"+fundRepair1);
codeRefactor1.setFundDetail("关键适配技术成本:"+fund);
budgetVo.getBudget().add(codeRefactor1);
} }
budget.setFundDetail("普通业务开发费用:"+v);
budget.setFundDetail("普通业务开发费用(修正):"+v1);
budget.setFundDetail("关键适配技术成本:"+fund);
ArrayList<Budget> budgets = new ArrayList<>(); return budgetVo;
budgets.add(budget);
return budgets;
} }
} }
package com.zjty.inspect.utils; package com.zjty.inspect.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.junrar.Archive; import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader; import com.github.junrar.rarfile.FileHeader;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.core.ZipFile;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
@Slf4j @Slf4j
public class FileUtil { public class FileUtil {
static int BUFFER_SIZE = 1024; static int BUFFER_SIZE = 1024;
public static String createFilePath(){
//"./"+name+"/"+split1[0]
String[] split = UUIDUtil.getUUID().split("-");
String time = LocalDate.now().toString();
String filePath = time + "/"+split[0];
return filePath;
}
/** /**
* 保存文件到本地 * 保存文件到本地
...@@ -113,16 +117,50 @@ public class FileUtil { ...@@ -113,16 +117,50 @@ public class FileUtil {
log.error("unpack rar file fail....", e.getMessage(), e); log.error("unpack rar file fail....", e.getMessage(), e);
} }
} }
/**
* 将内容写人文件中
* @param content 写入内容
* @param path 文件路径(如:F:/a/b/test.txt)
*/
public static void write(String content, String path) {
// 检测文件夹是否存在,不存在则创建文件夹和文件
createFile(path);
FileWriter writer = null;
try {
writer = new FileWriter(path);
writer.write(content);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
public static void main(String[] args) throws IOException { * 创建文件
System.out.println(LocalDate.now().toString()); * @param path 文件路径
String[] split1 = UUIDUtil.getUUID().split("-"); * @return 文件路径(如:F:/a/b/test.txt)
System.out.println(split1[0]); */
// FileUtil.unPackZip(new File("/Users/mcj/Downloads/acq-server.zip"),"", "./"); private static File createFile(String path) {
//FileUtils.deleteDirectory(new File("./acq-server")); // 创建文件夹
SAXReader reader = new SAXReader(); if (path.contains("/")) {
Document document = null; String[] split = path.split("/");
String fileName = split[split.length-1];
String dirPath = path.replace(fileName, "");
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdirs();
}
} }
File file = new File(path);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
} }
package com.zjty.inspect.utils;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Stack;
/**
* @author Mcj
* @date 2020-03-05 19:20
*/
public class RandomUtil {
public synchronized static String getRandom()
{
String digths = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int base = digths.length();
long now = System.currentTimeMillis();
try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}
StringBuffer str = new StringBuffer("");
Stack<Character> s = new Stack<Character>();
while(now != 0){
s.push(digths.charAt((int)(now%base)));
now/=base;
}
while(!s.isEmpty()){
str.append(s.pop());
}
StringBuilder stringBuilder = new StringBuilder();
LocalDateTime date = LocalDateTime.now();
String[] split = UUIDUtil.getUUID().split("-");
stringBuilder.append(date.getYear())
.append(date.getMonth())
.append(date.getDayOfMonth())
.append(date.getHour() )
.append(date.getMinute())
.append(date.getSecond())
.append(split[0]);
return stringBuilder.toString();
}
}
package com.zjty.inspect.utils; package com.zjty.inspect.utils;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date;
public class TimeUtil { public class TimeUtil {
public static String getNowDate(){ public static String getNowDate(){
...@@ -19,9 +21,14 @@ public class TimeUtil { ...@@ -19,9 +21,14 @@ public class TimeUtil {
return stringBuilder.toString(); return stringBuilder.toString();
} }
public static String getTime(){
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("当前时间:" + sdf.format(d));
return sdf.format(d);
}
public static void main(String[] args) { public static void main(String[] args) {
String nowDate = TimeUtil.getNowDate(); String nowDate = TimeUtil.getNowDate();
System.out.println(nowDate); System.out.println(getTime());
} }
} }
...@@ -58,7 +58,10 @@ spring.datasource.password=root ...@@ -58,7 +58,10 @@ spring.datasource.password=root
maven.home=/usr/share/maven maven.home=/usr/share/maven
maven.command=dependency:tree -DoutputType=txt -DoutputFile= maven.command=dependency:tree -DoutputType=txt -DoutputFile=
maven.treefile=./tree maven.treefile=./tree
spring.freemarker.charset=UTF-8
spring.freemarker.suffix=.ftl
spring.freemarker.content-type=text/html; charset=utf-8
spring.freemarker.template-loader-path=classpath:/templates
#spring.redis.host=127.0.0.1 #spring.redis.host=127.0.0.1
##Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3 ##Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
#spring.redis.port=6379 #spring.redis.port=6379
......
...@@ -57,7 +57,10 @@ spring.datasource.password=root ...@@ -57,7 +57,10 @@ spring.datasource.password=root
maven.home=/Users/mcj/apache-maven-3.6.1 maven.home=/Users/mcj/apache-maven-3.6.1
maven.command=dependency:tree -DoutputType=txt -DoutputFile= maven.command=dependency:tree -DoutputType=txt -DoutputFile=
maven.treefile=./hello maven.treefile=./hello
spring.freemarker.charset=UTF-8
spring.freemarker.suffix=.ftl
spring.freemarker.content-type=text/html; charset=utf-8
spring.freemarker.template-loader-path=classpath:/templates
#spring.redis.host=127.0.0.1 #spring.redis.host=127.0.0.1
##Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3 ##Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
#spring.redis.port=6379 #spring.redis.port=6379
......
...@@ -74,6 +74,16 @@ ...@@ -74,6 +74,16 @@
right: 40px; right: 40px;
top: 30px; top: 30px;
} }
.onClick {
width:0;
height:0;
border-width:17px 17px 0;
border-style:solid;
border-color:grey transparent transparent;/*灰 透明 透明 */
margin:40px auto;
position:relative;
top: 20px;
}
.key-title { .key-title {
color: #d32d2d; color: #d32d2d;
...@@ -87,6 +97,7 @@ ...@@ -87,6 +97,7 @@
table{ table{
width: 100%; width: 100%;
} }
.table-body{width:100%; height:300px;overflow-y:scroll;}
td{ td{
text-align: center; text-align: center;
height: 30px; height: 30px;
...@@ -114,7 +125,7 @@ ...@@ -114,7 +125,7 @@
} }
.className { .className {
transform:rotate(180deg); transform:rotate(180deg) !important ;
} }
</style> </style>
</head> </head>
...@@ -123,20 +134,20 @@ ...@@ -123,20 +134,20 @@
<p class="detailContentT">应用系统信创评估详情</p> <p class="detailContentT">应用系统信创评估详情</p>
<div class="systemName"> <div class="systemName">
<img src="./img/system.png" alt=""> <img src="./img/system.png" alt="">
<div class="nav-title">系统名称:<span>${projectName}</span></div> <div class="nav-title">系统名称:<span>${inspect.projectName?default("")}</span></div>
<div class="nav-time">评估时间:<span>${createDate}</span></div> <div class="nav-time">评估时间:<span>${time?default("")}</span></div>
<div class="clearfloat"></div> <div class="clearfloat"></div>
<div class="line"></div> <div class="line"></div>
<div class="systemNameCon"> <div class="systemNameCon">
<div>编号:<span>${createDate}</span></div> <div>编号:<span>${inspect.id?default("")}</span></div>
<div>上传类型:<span>${uploadType}</span></div> <div>上传类型:<span>${inspect.uploadType?default("")}</span></div>
<div>文件名:<span>${fileName}</span></div> <div>文件名:<span>${inspect.fileName?default("")}</span></div>
<div>架构:<span>${framework}</span></div> <div>架构:<span>${inspect.framework?default("")}</span></div>
</div> </div>
<div class="systemNameCon"> <div class="systemNameCon">
<div>数据库类型:<span>${databaseType}</span></div> <div>数据库类型:<span>${inspect.databaseType?default("")}</span></div>
<div>依赖管理工具:<span>${manager}</span></div> <div>依赖管理工具:<span>${inspect.manager?default("")}</span></div>
<div>语言: <span>${language}</span></div> <div>语言: <span>${inspect.language?default("")}</span></div>
<div></div> <div></div>
</div> </div>
<div class="systemNameCon"> <div class="systemNameCon">
...@@ -145,14 +156,28 @@ ...@@ -145,14 +156,28 @@
</div> </div>
<div class="keyTec"> <div class="keyTec">
<#if warnDetails??>
<#list warnDetails as warn> <#assign keys=warnMap?keys/>
<#list keys as key>
<#assign warns= warnMap[key]/>
<div class="first"> <div class="first">
<div class="first-title"> <div class="first-title">
<img src="./img/key.png" alt=""> <img src="./img/key.png" alt="">
<div class="nav-title key-title">关键技术:<span>${warn.}Java依赖(支持国产化)</span> <span>需替换</span> </div> <div class="nav-title
<#if techMap[key]==1>
keySecond-title
<#elseif techMap[key]==2>
key-title
<#else>
keyThird-title
</#if>">关键技术:<span>${key?default("")} </div>
<div class="rightPic"> <div class="rightPic">
<img onclick="showDiv()" id="pic" src="./img/down.png" alt=""> <!--<img onclick="showDiv()" id="pic" src="./img/down.png" alt="">-->
<div id="pic" onclick="showDiv()">
<span class="onClick"></span>
</div>
</div> </div>
</div> </div>
...@@ -164,47 +189,38 @@ ...@@ -164,47 +189,38 @@
<th>所在文件</th> <th>所在文件</th>
<th>行数</th> <th>行数</th>
</tr> </tr>
<tr> <#list warns as warn>
<td>mysql</td> <tr >
<td>pp.xl</td> <td class="<#if techMap[key]==1>
<td>100</td> keySecond-title
</tr> <#elseif techMap[key]==2>
<tr> key-title
<td>mysql</td> <#else>
<td>pp.xl</td> keyThird-title
<td>100</td> </#if> ">${warn.rule?default("")}</td>
</tr> <td class="<#if techMap[key]==1>
<tr> keySecond-title
<td>mysql</td> <#elseif techMap[key]==2>
<td>pp.xl</td> key-title
<td>100</td> <#else>
keyThird-title
</#if> ">${warn.filePath?default("")}</td>
<td class=" <#if techMap[key]==1>
keySecond-title
<#elseif techMap[key]==2>
key-title
<#else>
keyThird-title
</#if>">${warn.lineNum?default("")}</td>
</tr> </tr>
</#list>
</table> </table>
</div> </div>
</div> </div>
</#list> </#list>
</#if>
<div class="second">
<div class="first-title">
<img src="./img/key.png" alt="">
<div class="nav-title keySecond-title">关键技术:<span>Java依赖(支持国产化)</span> <span>无需替换</span> </div>
<div class="rightPic">
<img id="pic1" onclick="showDiv1()" src="./img/down.png" alt="">
</div>
</div>
<div class="line"></div>
<div id="secondClick">
</div>
</div>
<div class="third"> <div class="third">
<div class="first-title">
<img src="./img/key.png" alt="">
<div class="nav-title keyThird-title">关键技术:<span>Java依赖(支持国产化)</span> <span>未知</span> </div>
<div class="rightPic ">
<img id="pic2" onclick="showDiv2()" src="./img/down.png" alt="">
</div>
</div>
<div class="line"></div> <div class="line"></div>
<div class="onAnaly" id="thirdClick"> <div class="onAnaly" id="thirdClick">
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论