# springboot+vue疫情数据统计 **Repository Path**: chenhebin/expriment3 ## Basic Information - **Project Name**: springboot+vue疫情数据统计 - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-05-11 - **Last Updated**: 2021-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##

东莞理工学院网络空间安全学院

####

实验报告模板

课程名称:企业级开发框架专题                                 学期:2020春季

`实验名称`:利用Spring boot的自动装配特性实现动态注册组件    `实验序号`:三 `姓名`:陈和斌        `学号`:201741404201        `班级`:17软卓1班 `实验地址`:居家       `实验日期`:2020-5-11        `指导老师`:黎志雄 `教师评语`:XXX        `实验成绩`:XXX             `百分制`:XXX `同组同学`:无 #### 一、实验目标 1、 掌握使用Spring框架自带的RestTemplate工具类爬取网络数据; 2、 掌握使用Spring框架自带的计划任务功能; 3、 掌握使用Apache Commons CSV组件解释CSV文件; 4、 掌握Java 8的Stream API处理集合类型数据; 5、 了解使用模板引擎或前端框架展示数据。 #### 二、实验环境 1、 JDK 1.8或更高版本 2、 Maven 3.6+ 3、 IntelliJ IDEA 4、 commons-csv 1.8+ 5. Vue cli3.x #### 三、实验内容与实验步骤 ##### 1、通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目 #### `步骤`: File->new Project->选择Spring Initializr->填写项目信息,具体如下图:
##### 2、添加功能模块:spring MVC、lombok、commons-csv等 #### `步骤`: 在pom文件中添加依赖具体如下:
##### 3、使用Spring框架自带的RestTemplate工具类爬取数据。 #### `步骤`: 在fetchVirusData()函数中添加如下代码: ``` String CORONA_VIRUS_DATA_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; Reader reader = null; RequestEntity requestEntity = RequestEntity .get(URI.create(CORONA_VIRUS_DATA_URL)) .headers(httpHeaders -> httpHeaders.add("User-Agent", "Mozilla/5.0")) .build(); ResponseEntity exchange = new RestTemplate().exchange(requestEntity, Resource.class); Resource body = exchange.getBody(); ``` #### `说明`: RestTemplate采用同步方式执行 HTTP 请求的类,上述代码添加了User-Agengt头部。 ##### 4、 分析csv文件的数据结构,定义model类 #### `步骤`: 创建一个RegionInfection类,并添加构造方法,代码如下: ``` @Data public class RegionInfection { private int key; private String province; private String country; private int totalCases; private int increaseCases; } ``` #### `说明`: key为数组索引,province表示省或州,country表示国家或地区,totalCase表示感染总数,increaseCases表示昨日新增人数。 ##### 5、用Apache Commons CSV组件解释CSV文件。 #### `步骤`: 1. 将CSV文件的输入流转换成modle类的对象数组,主要代码如下所示: ``` final CSVParser records = new CSVParser(Objects.requireNonNull(reader), CSVFormat.EXCEL.withHeader()); try { int k=0; for (final CSVRecord record : records) { String province = record.get("Province/State"); String country = record.get("Country/Region"); int totalCases = Integer.parseInt(record.get(record.size()-1)); int increaseCases = totalCases - Integer.parseInt(record.get(record.size()-2)); RegionInfection regionInfection = new RegionInfection( k,province,country,totalCases,increaseCases); k++; regionInfectionList.add(regionInfection); } } ``` #### `说明`: 根据字段或位置选择性地获取所需的数据,进行一定的处理后设置为model类的属性 ##### 6、 使用Spring框架自带的计划任务功能定时更新统计数据。 #### `步骤`: 1. 在获取并解析数据的函数上面填加定时处理注解,具体如下所示:
#### `说明`: 1. @Scheduled是定时处理注解 2. "0 0 1 * * *"表示每天凌晨1点执行,6个字符分别表示Seconds Minutes Hours DayofMonth Month DayodWeek,*表示所有 3. @PostConstruct 确保应用程序启动时,获取一次统计数据。 ##### 7. 编写单元测试。 #### `步骤`: 添加一个测试类用于测试Service层是否能正确获取并解析数据,具体代码如下所示: ``` @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = {VirusDataService.class}) class VirusDataServiceTest { @Autowired VirusDataService virusDataService; @Test void testVirusDataService() throws IOException { virusDataService.fetchVirusData(); Assertions.assertNotEquals(0,virusDataService.getRegionInfectionList().size()); System.out.println(virusDataService.getRegionInfectionList().get(0)); } } ``` #### `说明`: 1. 不使用web环境使测试速度更快; 2. 断言成功表示正确获得了数据 3. 输入第一条数据判断是否数据异常 ##### 8、 定义Cotroller控制器。 #### `步骤`: 1. 封装返回的json数据样式: ``` @Data //意思是Tree这个类里面需要用到另外一个类, // 但是又不能确定要用到的那个类的具体类型,所以暂时用T来代替。 public class ResultVO { private Integer code; private String msg; private T data; } ``` 2. 定义controller返回受冠状病毒感染人数的json数据: ``` @Controller @ResponseBody public class InfectionDataController { @Autowired VirusDataService virusDataService; @RequestMapping("/infectionCases/all") public ResultVO getInfectionData(){ return ResultVOUtil.success(virusDataService.getRegionInfectionList()); } } ``` 说明: 1. @ResponseBody将对象转换成json对象传输 2. ResultVOUtil是自定义自动设置dataz中code和msg值的工具类 3. 查询功能可以由前端完成 ##### 9、 定义前端数据展示页面。 #### `步骤`: 1. 用命令行创建vue cli3的项目 2. 添加支持Resource和Ant Design Vue 3. 在生命周期函数created()中根据后端api获取数据 4. 使用Ant Design Vue的table组件展示数据,支持根据国家查找和根据感染人数降序或升序排序 5. 用js计算全世界或某个国家总感染人数和单日新增人数,并展示 部分核心代码如下图所示: ``` created() { this.$http.get("/infectionCases/all/") .then(function (resp) { this.infectionData = resp.data.data; var totalCases = 0; var totalIncreaseCases = 0; this.infectionData.forEach(sumCases); function sumCases(item) { totalCases += item.totalCases; totalIncreaseCases += item.increaseCases; } this.totalCases = totalCases; this.totalIncreaseCases = totalIncreaseCases; }, function (error) { console.log(error); }) } ``` ``` onFilter: (value, record) => record.country .toString() .includes(value), onFilterDropdownVisibleChange: visible => { if (visible) { setTimeout(() => { // this.searchInput.focus(); }); } }, ``` #### 四、实验结果 ##### 1、Service获取并处理csv数据的测试结果:
#### `说明`: 测试结果正确, Service能正确获取并处理csv数据 ##### 2、前端效果展示 1. 浏览器地址栏输入“localhost:8080/”,显示初始界面:
#### `说明`: 支持分页显示,初始以降序排列各个国家和地区的感染新冠肺炎的情况,统计总感染人数和昨日新增人数 2. 点击TotalCases右边的小箭头可更改排序方式,以下是升序排列:
#### `说明`: 排序由前端完成 3. 点击Country/Region右边的小号放大镜,弹出搜索栏:
4. 在搜索栏中输入“China”回车或点击Search,结果如下所示:
5. 在搜索栏中输入“US”回车或点击Search,结果如下所示:
#### 五、实验总结 ``` 1.本次实验让我们逐步了解用java爬取csv数据并解析 2.对前后端交互有了更深的理解 ```