这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 作业要求 |
结对学号 | 221701125 & 221701126 |
这个作业的目标 | 实现通过地图的形式来直观显示 疫情的大致分布情况,还可以查 看具体省份的疫情统计情况;点 击某个省份显示该省疫情的具体 情况;学习与队友进行合作;学 习使用github进行团队合作;学 习如何进行前后端数据交互。 |
作业正文 | 正文 |
其他参考文献 | echarts官网 W3Cschool教程 |
1、仓库地址&代码规范
Github仓库地址
代码规范
2、展示作品
(1)首页如图所示,上半部分显示整体疫情,下半部分以中国地图来显示整体疫情,地图根据疫情显示不同颜色
(2)当鼠标移动到中国地图的某个省份,将会出现浮动窗口显示该省份的疫情,并且该省份地图会高亮显示。
(3)地图左边可查看根据确诊人数显示的不同颜色深浅,例如将鼠标移到100-999的部分,符合该部分的省份都将高亮显示
(4)鼠标点击100-999的图标,将重置所有疫情符合100-999的省份为白色,其他部分的颜色功能相同,点击即重置为白色,再次点击又会重新显示出颜色。
(5)中间的输入框可选择日期
(6)选择日期后,整个界面将统计该日期的疫情,地图的颜色也会根据疫情人数有所改变
(7)点击地图上某个省份,跳转到新页面显示该省份的疫情界面
(8)将鼠标移动到折线图上,将会跳出浮动窗显示具体数据(新增确诊趋势、新增疑似趋势、治愈趋势、死亡趋势)
(9)
折线图上方有四个标题,点击某个标题可隐藏该折线图,再次点击又可显示
(10)中间的输入框可选择日期,选择后将显示该省份该日期的具体疫情(现有确诊、累计确诊、累计治愈、累计死亡)
(11)折线图右上方有个下载的图标,点击可下载折线图界面
3、结对讨论过程描述
刚拿到题目后,和队友进行讨论,总结了以下问题:
(1)该用什么语言来写,需要能支持服务器(javaee还是php)?
(2)后端数据怎么获取?怎么处理?怎么统计?
(3)后端接口要如何返回数据?
(4)前端如何接收后端传来的数据?
(5)前端界面要如何规划?每个界面要如何划分模块?
(6)前端中国地图要如何绘制?前端折线图要如何绘制?
(7)前端如何实现不同省份不同疫情要显示不同颜色?鼠标移动如何显示浮窗?颜色高亮?
(8)前端如何实现日期选择?
经过讨论,并且上网查找资料后,基本解决了所有问题:
用javaee来做这个项目
后端读取日志文件,并写算法统计数据,讲数据封装到哈希表
后端接口返回int []类型的数组
前端用jsp来写,可直接写java代码调用后端接口传数据
前端首页和折线图页面都分为上下两部分,上半部分显示疫情数字,下半部分显示图表
中国地图和折线图都用echarts来绘制
echarts可设置不同数量显示不同颜色,中国地图echarts自带浮窗和显示高亮
前端日期选择用HTML5中的input标签,将属性type设置为date
echarts的用法可在官网找到使用教程
两人结对讨论截图:
4、设计实现过程
设计实现过程:后端处理数据后,前端调用后端接口获取数据,填充到echarts显示,中国地图点击某省份,跳转到折线图时,应该在跳转的URL后添加参数省份的id,调用方法request.getParameter()可获取input输入选择的日期,根据不同日期做相应的计算显示数据。
功能结构图:
5、关键代码
Entry.java 读取日志文件,处理数据,封装到哈希表中
/* * 处理每一个文件 */ public static void solveTheFile(String[] fileList) { Province nationwide = map.get("全国"); // TODO Auto-generated method stub for(String aFile : fileList) { String fileDate = aFile.substring(0, aFile.indexOf(".")); Date nationwideDate = new Date(); nationwideDate.setDate(fileDate); try { File file = new File(path + "\\" + aFile); InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file), "GB2312"); BufferedReader bf = new BufferedReader(inputReader); String str; while ((str = bf.readLine()) != null && str.indexOf("//") != 0) { if(str.length() == 0) continue; String[] information = str.split("\\s+"); String provinceName = information[0];//先取到省份 int number = getNumber(information);//取出各行人数 if(map.get(provinceName) != null) { Province province = map.get(provinceName); Map<String, Date> dateMap = province.getDateMap(); Date date = new Date(); if(dateMap.get(fileDate) != null) { date = province.getDateMap().get(fileDate); } else { date = new Date(); date.setDate(fileDate); } switch (information[1]) { case "新增": if(information[2].equals("感染患者")) { int ip = date.getIp(); ip += number; date.setIp(ip); int nationwideIp = nationwideDate.getIp();