# covidDataShow **Repository Path**: sfa007/covid-data-show ## Basic Information - **Project Name**: covidDataShow - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-17 - **Last Updated**: 2021-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 实验三 ### 获取数据并处理 #### 数据类 > 重写了CompareTo方法 ```java /* * CSV原始数据:Lat,Long经纬度 Province/State,Country/Region 省/州:!!!此项可能为空, * 1/22/20,1/23/20:日期从远到近依次排列,最后一列为最新 * record.get(record.size() - 1) 可以获取记录最后一个字段的值 * */ public class VirusData implements Comparable{ private String state;/*可能为空,有的国家没有省*/ private String country; private int totalNum;/*累计确诊数据*/ @Override /*小于返回负数,大于返回整数*/ public int compareTo(VirusData o) { if (this.getTotalNum()o.getTotalNum()) return 1; return 0; } } ``` #### 定时执行&启动时执行 > 启动时和每年凌晨获取数据 > > `@PostConstruc`:容器启动时执行 > > `@Scheduled(cron = "0 0 1 * * *")`:每天凌晨一点执行 > > 将数据类加上`@compent`注解注册入容器 > > 数据存放在全局变量中 ```java @Component public class CovidDataConfig{ public static List virusDataList; @PostConstruct @Scheduled(cron = "0 0 1 * * *") public static void init() { virusDataList=getVirusDataList(); } } ``` #### 数据处理 > 注意: > > * 理论上最后一列为最新数据,实际上可能当当天数据为空,故从尾部循环读取到第一个不为空数据作为最新数据 > * **将Region/country翻译为国家时** > > 数据中台湾并未像香港澳门一样列为中国state/province,而是列为Region/country > > 当Region/country为Taiwan时,修正数据为中国台湾省 > > ```java > if (country.contains("Taiwan")) > { > virusData.setCountry("China"); > virusData.setState("Taiwan"); > System.out.println("台湾处理完毕"); > } > ``` > > 将数据按照降序排序,使用stream的sorted方法完成升序排序后逆序处理 > > ```java > virusDataList=virusDataList.stream().sorted().collect(Collectors.toList()); > //TODO 默认排序是升序排序,再逆序实现降序排序,或者compare接口故意写反,this<其他时返回正数(正常小于返回负数) > Collections.reverse(virusDataList); > ``` > > ```java // String url="https://gitee.com/dgut-sai/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; /*将连接中的blob替换为raw才是单文件下载链接*/ String url="https://gitee.com/dgut-sai/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"; RequestEntity requestEntity=RequestEntity.get(URI.create(url)).headers(httpHeaders -> httpHeaders.add("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36")) .build(); ResponseEntity exchange=new RestTemplate().exchange(requestEntity,Resource.class); Resource body=exchange.getBody(); List virusDataList= new ArrayList<>();/*此处未分配空间,直接初始化为null,报错*/ try { Reader reader=new InputStreamReader(body.getInputStream()); CSVParser csvParser=new CSVParser(reader, CSVFormat.EXCEL.withHeader()); for (CSVRecord record:csvParser) { VirusData virusData=new VirusData(); String country=record.get("Country/Region"); String state=record.get("Province/State"); //可以获取记录某个字段名的值 //String date=record.get("11/8/20");// 可以获取某个地区的指定时间的病毒数值 int accessLeastSize=record.size()-1;//最后一列(最后一个字段) while (record.get(accessLeastSize).length()==0) { accessLeastSize--;/*保证取到最后更新的疫情数据*/ } int totalNum=Integer.parseInt(record.get(accessLeastSize)) ;//如果当天未更新数据,则字段可能为空,循环取值直到取到值为止 virusData.setTotalNum(totalNum); virusData.setCountry(country); virusData.setState(state); if (country.contains("Taiwan"))/ { virusData.setCountry("China"); virusData.setState("Taiwan"); System.out.println("台湾省处理完毕"); } /*设置疫苗数据*/ virusDataList.add(virusData); } } catch (IOException e) { e.printStackTrace(); } ``` ### Controller #### APIController > `APIController`处理请求并返回JSon数据 > > * 使用springboot内置的Json处理类将结果转为Json返回给前端 > > ```java > new ObjectMapper().writeValueAsString(data) > ``` > > * `@CrossOrigin(origins = "*",maxAge = 3600)` > > 允许跨域访问 ```java package com.darksheep.demo.controller; import com.darksheep.demo.config.CovidDataConfig; import com.darksheep.demo.model.VirusData; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.stream.Collectors; /** * Created BY DarkSheep ON 2021/5/17 21:07 **/ @RestController /*跨域controller*/ @CrossOrigin(origins = "*",maxAge = 3600) public class ApiController { @GetMapping("/total") public String total() throws JsonProcessingException { /*TODO fastJson转换为JSon传递给前端*/ String res=new ObjectMapper().writeValueAsString(CovidDataConfig.virusDataList); return res; } @GetMapping("/china") public String getChinaData() throws JsonProcessingException { List chinaData= CovidDataConfig.virusDataList.stream().filter(s->s.getCountry().equals("China")).collect(Collectors.toList()); return new ObjectMapper().writeValueAsString(chinaData); } @GetMapping("/search/{country}") public String searchByCountry(@PathVariable String country) throws JsonProcessingException { List data=CovidDataConfig.virusDataList.stream().filter(s->s.getCountry().equals(country)).collect(Collectors.toList()); return new ObjectMapper().writeValueAsString(data); } @GetMapping("/list") public String getList() throws JsonProcessingException { /*TODO 排序完毕的数组中返回前十位:疫情最严重的十个地区,会造成有的是省,有的是国家,可以再按照国家封装一次*/ List data=CovidDataConfig.virusDataList.stream().limit(10).collect(Collectors.toList()); return new ObjectMapper().writeValueAsString(data); } //TODO 对抛出的异常统一处理 } ``` #### IndexController > 视图解析:解析请求到index.html > > 忘记添加thymeleaf导致报错未解析的MVC视图 > > 注:原计划前后端分离,前端以Vue实现 > > 暂搁置 ```java @Controller public class IndexController { @GetMapping("/show") public String index() { return "index"; } /*TODO 报错未解析的MVc视图 * 未添加thymeleaf依赖 * 添加依赖后正常 * */ } ``` ### 前端 > 使用JQuery异步获取后端数据 ```js function search(){ var key = $("input").val() init(); $.ajax({ url: 'http://localhost:8080/search/'+key, type: 'get', dataType: 'json', success: function (data) { //方法中传入的参数data为后台获取的数据 console.log("开始添加") for (i in data) // { let tr; tr = '' + data[i].country + '' + '' + data[i].state + '' + '' + data[i].totalNum + '' $("#tabletest").append('' + tr + '') } } }) } ``` > 获取其他疫情信息时,使用jQuery移除表头之外的tr ```js function init() { // 查询table中第二个tr开始的所有tr,并删除 //find中的:gt表示大于,lt表示小于,eq表示等于,通过它们可以实现指定位置起的tr查询 $("#tabletest tr:gt(0)").remove(); console.log("移除完毕") } ``` > 国内疫情 ![image-20210519011031690](https://sheepnote.oss-cn-shenzhen.aliyuncs.com/2021/04/20210519011031.png) > 搜索具体国家 ![image-20210519011117185](C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20210519011117185.png) > 世界疫情:取最严重的的十个国家 ![image-world](https://sheepnote.oss-cn-shenzhen.aliyuncs.com/2021/04/20210519011057.png)