# 实验3-springboot_covidData
**Repository Path**: chenbairui/springboot_covidData
## Basic Information
- **Project Name**: 实验3-springboot_covidData
- **Description**: 爬取全球新冠病毒的实时数据
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-05-10
- **Last Updated**: 2021-05-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
##
实验三 全球新型冠状病毒实时数据统计应用程序的设计与实现
课程名称:企业级开发框架专题 学期:2020春季
|
实验名称 | 全球新型冠状病毒实时数据统计应用程序的设计与实现 | 实验序号 | 三 |
|
姓 名 | 陈伯瑞 | 学 号 | 201741412102 | 班 级 | 17软卓1班 |
|
实验地点 | 在家 | 实验日期 | 2020/5/7 | 指导老师 | 黎志雄 |
|
教师评语 | | 实验成绩 | 评阅教师 |
| 百分制 | |
|
同组同学 | 无 |
## 实验目的:
1. 掌握使用Spring框架自带的RestTemplate工具类爬取网络数据;
2. 掌握使用Spring框架自带的计划任务功能;
3. 掌握使用Apache Commons CSV组件解释CSV文件;
4. 掌握Java 8的Stream API处理集合类型数据;
5. 了解使用模板引擎或前端框架展示数据。
## 实验环境:
- jdk14
- maven3.6.1
- IntelliJ IDEA
- springboot 2.2.5
- commons-csv 1.8+
## 实验过程
1. 在IntelliJ IDEA创建Spring Boot项目,添加项目依赖,添加功能模块:spring MVC、lombok、commons-csv、freemark等
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-freemarker
org.projectlombok
lombok
true
org.apache.commons
commons-csv
1.8
2. 使用Spring框架自带的RestTemplate工具类爬取数据
RequestEntity requestEntity = RequestEntity
.get(URI.create(CORONA_VIRUS_DATA_URI))
.headers(httpHeaders -> httpHeaders.add("User-Agent", "Mozilla/5.0"))
.build();
ResponseEntity response = new RestTemplate().exchange(requestEntity, Resource.class);
Resource body = response.getBody();
3. 分析csv文件的数据结构,定义model类
@Data
public class RegionStatus {
/**
*解析csv文件数据
*/
/* 省,洲*/
private String state;
/* 国家*/
private String country;
/*当前病例数*/
private int latestTotalCases;
/*前一天病例数*/
private int latestPreTotalCases;
/* 当前日期*/
private String latestDay;
}
4. 使用Apache Commons CSV组件解析爬取的csv文件得到数据对象(解析出最新日期的数据)
Reader in = new InputStreamReader(body.getInputStream(), "UTF-8");
Iterable records = CSVFormat.RFC4180.parse(in);
boolean isHeader = true;
String lastDay = "";
for (CSVRecord record : records) {
//获取表头
RegionStatus status = new RegionStatus();
if (isHeader) {
isHeader = false;
String[] split = record.get(record.size() - 1).split("/");
lastDay = "20" + split[2] + "/" + split[0] + "/" + split[1];
} else {
status.setLatestDay(lastDay);
status.setState(record.get(0));
status.setCountry(record.get(1));
status.setLatestTotalCases(Integer.parseInt(record.get(record.size() - 1)));
status.setLatestPreTotalCases(Integer.parseInt(record.get(record.size() - 2)));
regionStatuses.add(status);
}
}
5. 使用Spring框架自带的计划任务功能定时更新统计数据

6. 设置计划任务的线程池大小

7. 确保应用程序启动时,获取一次统计数据
@Configuration
public class InitializingBean {
/**
*每次启动自动获取一次数据
*/
@Bean
public CommandLineRunner commandLineRunner(covidTrackService covidTrackService){
return args ->{
System.out.println("CommandLineRunner!!!!!!!!!!");
covidTrackService.getLastCovidData();
};
}
}
8.控制器获取数据对象
@Autowired
private covidTrackService covidTrackService;
@GetMapping("/")
public ModelAndView getALLRegions(Map map) {
List statuses=covidTrackService.getLastStatesData();
Integer gogalData= 0;
Integer addData= 0;
for(RegionStatus status:statuses){
gogalData+=status.getLatestTotalCases();
addData+=status.getLatestPreTotalCases();
}
addData=gogalData-addData;
map.put("statuses",statuses);
map.put("gogalData",gogalData);
map.put("addData",addData);
return new ModelAndView("index",map);
}
9. 对国家名称搜索数据并按增加病例数目排序
@GetMapping("/byCountry")
public ModelAndView getByRegions(String country, Map map) throws IOException {
List statuses=covidTrackService.getLastStatesDataByStates(country);
List statusesAll=covidTrackService.getLastStatesData();
Integer gogalData= 0;
Integer addData= 0;
for(RegionStatus statusAll:statusesAll){
gogalData+=statusAll.getLatestTotalCases();
addData+=statusAll.getLatestPreTotalCases();
}
addData=gogalData-addData;
map.put("statuses",statuses);
map.put("gogalData",gogalData);
map.put("addData",addData);
return new ModelAndView("index",map);
}
@Override
public List getLastStatesDataByStates(String country) throws IOException {
List result = new ArrayList<>();
this.regionStatuses.forEach((e) -> {
if (e.getCountry().toLowerCase().contains(country.toLowerCase())) {
result.add(e);
}
});
List newresult =result.stream().sorted(Comparator.comparing(RegionStatus::getLatestPreTotalCases).reversed()).collect(Collectors.toList());
return newresult;
}
10. 所有控制器 与 Service 组件使用单元测试用例进行测试
controller:
@SpringBootTest
@AutoConfigureMockMvc
class RegionControllerTest {
@Autowired
RegionController regionController;
@Autowired
private MockMvc mvc;
@Test
void getALLRegions() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
@Test
void getByRegions() throws Exception {
String region="us";
mvc.perform(MockMvcRequestBuilders.get("/byCountry?country=us").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
}
service:
@SpringBootTest
class covidTrackServiceTest {
@Autowired
covidTrackService covidTrackService;
@Test
void getLastStatesData() throws IOException {
Assertions.assertNotEquals(null, covidTrackService.getLastCovidData());
System.out.println(covidTrackService.getLastCovidData().toString());
}
}
11. 前端展示

## 爬取网站
爬取全球冠状病毒实时统计数据。
在Github上,有一个由约翰·霍普金斯大学系统科学与工程中心(JHU CSSE)运营的2020年新型冠状病毒可视化仪表板的数据仓库,大家可以从该仓库中爬取全球新型冠状病毒最新的统计数据。
Github仓库地址:https://docs.qq.com/scenario/link.html?url=https%3A%2F%2Fgithub.com%2FCSSEGISandData%2FCOVID-19&pid=300000000$RQeslpiqqOPH&cid=5856113
该仓库会把全球新型冠状病毒最新的统计数据汇总到一个csv文件上,在爬取数据时,获取这个csv文件即可。
csv文件地址:https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv