# 实验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框架自带的计划任务功能定时更新统计数据 ![pom文件](/img/5.png) 6. 设置计划任务的线程池大小 ![pom文件](/img/52.png) 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. 前端展示 ![pom文件](/img/11.png) ## 爬取网站 爬取全球冠状病毒实时统计数据。 在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