结对第二次作业——某次疫情统计可视化的实现
格式描述
这个作业属于哪个课程 | 2020春|S班 (福州大学) |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
结对学号 | 221701236、221701239 |
这个作业的目标 | 实现疫情统计可视化、锻炼与同学合作的能力。 |
作业正文 | .... |
其他参考文献 | 博客园 |
github仓库地址:https://github.com/bzzd2333/InfectStatisticWeb
代码规范链接:https://github.com/bzzd2333/InfectStatisticWeb/blob/master/codestyle.md
一.成品展示
- 实现了数据显示功能,如图使用了echarts,可以将查看某个省份的现有确诊和累计确诊信息
- 实现了总体信息页面日期选择的功能,如图,可以选择更新的最后日期以查看不同时间的疫情分布情况
- 点击地图中的某个省份,可以进入该省份的详细疫情情况显示页面
- 在详情页面里,可以选择查看该省份的新增确诊趋势、累计确诊趋势、累计治愈/死亡图
- 同样,在详情页面里,也可以选择具体的日期,如图所示,选择了日期后显示了相对应的图表
二.结对过程
- 以下是我们结对过程中的聊天记录:
三.设计实现过程与代码说明
- 这是本次肺炎疫情统计开发的思维导图
本次作业的大体思路是,jsp向servlet请求数据,servlet调用后台的方法得到数据后返回jsp。 - 这是servlet要用到的方法,因为代码大多取自寒假第二次作业,所以不做赘述,仅给出函数声明:
ProvinceDAO的代码:
public interface ProvinceDAO
{
//初始化
public HashMap<String,Province> init();
//处理全国一天的情况
public List<Province> dealOneDay(String date) throws IOException;
//处理指定省份从疫情开始以来每天的情况
public HashMap<String, List<Province>> dealOneProvince(String date,String province) throws IOException;;
//处理日志中的一行
public void dealOneLine(HashMap<String,Province> map, String[] array);
//统计全国数据
public void allStatistic(HashMap<String,Province> map);
//获取全国数据
public Province getCountry();
//HashMap转换为List
public List<Province> mapToList(HashMap<String,Province> map);
}
- 因为要实现打开JSP页面时自动加载数据,所以我用了土办法:写一个test.jsp发送数据,然后主页面index.jsp
使用include指令读取test.jsp中的代码,这样运行index.jsp就可以直接加载数据:
test.jsp的代码:
<%
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
ProvinceDAO provinceDAO = new ProvinceDAOImpl();
Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
Date yesterday = calendar.getTime();
String year = String.format("%tY", today);
String month = String.format("%tm", today);
String day = String.format("%td", today);
//获取今日全国数据
List<Province> todayProvince = provinceDAO.dealOneDay(df.format(today));
Province todayCountry = provinceDAO.getCountry();
int[] todayData = todayCountry.getData();
//获取昨日全国数据
List<Province> yesterdayProvince = provinceDAO.dealOneDay(df.format(yesterday));
Province yesterdayCountry = provinceDAO.getCountry();
int[] yesterdayData = yesterdayCountry.getData();
//存放今日与昨日的对比
String[] compareData = new String[6];
for (int i = 0; i < 6; i ++)
{
if ((todayData[i] - yesterdayData[i]) >= 0)
{
compareData[i] = "+" + (todayData[i] - yesterdayData[i]);
}
else
{
compareData[i] = "" + (todayData[i] - yesterdayData[i]);
}
}
//发送今日日期
request.setAttribute("today", today);
request.setAttribute("year", year);
request.setAttribute("month", month);
request.setAttribute("day", day);
//发送今日全国数据
request.setAttribute("todayCountry", todayCountry);
//发送昨日全国对比数据
request.setAttribute("compareData", compareData);
%>
-
选择日期功能的实现:前端使用表单读取指定的日期,然后跳转到dateRes.jsp页面取指定的日期从后台
取到数据后跳转到date.jsp页面显示指定日期的数据。dateRes.jsp的代码与test.jsp大体相同,只是dateRes.jsp接收的参数为指定的日期;
date.jsp代码与index.jsp代码也大体相同,只是date.jsp没有include指令。 -
主页echarts获取数据的实现:JSP使用ajax向servlet读取数据。
前台ajax代码:
$.ajax
({
url:'IndexServlet',
type:'post',
async:'true',
data:{},
dataType:'json',
success:function(data){
for(var i = 0 ; i < data.length ; i++){
dataList1.push({ name: data[i].name, value: data[i].allInfection});
//document.write(dataList[i+1].name + "。");
}
myChart.hideLoading();
myChart.setOption({
series : [
{
name: '累计确诊',
type: 'map',
geoIndex: 0,
data:dataList1
}
]
});
},
error:function(){
alert("图表数据加载失败");
myChart.hideLoading();
}
});
IndexServlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.setCharacterEncoding("utf-8");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String flag = request.getParameter("flag");
String date = request.getParameter("Date");
System.out.println(date);
//选择日期选项
if (flag != null && flag.equals("date"))
{
ProvinceDAO provinceDAO = new ProvinceDAOImpl();
//获取今日全国数据
List<Province> todayProvince = provinceDAO.dealOneDay(date);
//发送各省现有、累计确诊数据
Gson json = new Gson();
String result = json.toJson(todayProvince);
System.out.print(result);
response.getWriter().write(result);
}
//默认页面
else
{
ProvinceDAO provinceDAO = new ProvinceDAOImpl();
Date today = new Date();
//获取今日全国数据
List<Province> todayProvince = provinceDAO.dealOneDay(df.format(today));
//发送各省现有、累计确诊数据
Gson json = new Gson();
String result = json.toJson(todayProvince);
//System.out.print(result);
response.getWriter().write(result);
}
}
- 点击省份实现跳转的实现:给echarts添加click事件,点击即传递省份名称并跳转到DetailServlet,
DetailServlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//必须设置,否则跳转页面中文乱码
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
ProvinceDAO provinceDAO = new ProvinceDAOImpl();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String flag = request.getParameter("flag");
String province = request.getParameter("province");
String date = request.getParameter("year") + "-" + request.getParameter("month") + "-" + request.getParameter("day");
Date today = new Date();
//指定日期
if (flag != null && !date.equals(df.format(today)))
{
//指定日期代码仅与默认页面有接收参数的区别,故省略。
}
//默认页面
else
{
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
Date yesterday = calendar.getTime();
String year = String.format("%tY", today);
String month = String.format("%tm", today);
String day = String.format("%td", today);
//获取今天该省份数据
HashMap<String, List<Province>> todayData = provinceDAO.dealOneProvince(df.format(today), province);
List<Province> todayOneList = todayData.get("1");
List<Province> todayAllList = todayData.get("2");
Province todayData1 = todayAllList.get(todayAllList.size() - 1);
Province yesterdayData1 = todayAllList.get(todayAllList.size() - 2);
int[] todayArray = todayData1.getData();
int[] yesterdayArray = yesterdayData1.getData();
//存放今日与昨日的对比
String[] compareData = new String[6];
for (int i = 0; i < 6; i ++)
{
if ((todayArray[i] - yesterdayArray[i]) >= 0)
{
compareData[i] = "+" + (todayArray[i] - yesterdayArray[i]);
}
else
{
compareData[i] = "" + (todayArray[i] - yesterdayArray[i]);
}
}
//发送省份名称
request.setAttribute("provinceName", todayData1.getName());
//发送日期
request.setAttribute("year", year);
request.setAttribute("month", month);
request.setAttribute("day", day);
//发送今日省份数据
request.setAttribute("todayData", todayData1);
//发送昨日省份对比数据
request.setAttribute("compare1", compareData);
request.getRequestDispatcher("detail.jsp").forward(request, response);
}
}
- 详情页面的ehcharts的数据由JsonServlet发送
JsonServlet关键代码:
//获取今天该省份数据
HashMap<String, List<Province>> todayData = provinceDAO.dealOneProvince(df.format(today), province);
List<Province> todayOneList = todayData.get("1");
List<Province> todayAllList = todayData.get("2");
todayOneList.addAll(todayAllList);
Gson json = new Gson();
String result = json.toJson(todayOneList);
response.getWriter().write(result);
四.心路历程与收获
-
221701239:
本次肺炎疫情项目主要是用javaee开发,我们将这次代码分为前端和服务器端部分,一个人编写前端,
一个人编写后端,在编写过程中发现,在进度上一定要及时交流,以保证前端的界面代码可以匹配后端的
编写思路,如果一口气写完才进行交流,可能会带来前后端匹配上的难度.第二个就是问题解决的及时性
,在因一个问题而导致整个项目无法向前开发时,前后端的编写者应该同时想解决方法来提高项目的进度.
还有就是时间分配的问题,我发现这种分为前后端的工作,应该是前端现做一个简陋但是可以满足交互功
能的界面来供后端审核,然后后端觉得没问题时再进行最后的布局以及样式设计,这样的话效率会提高很多.
经过此次团队编程,我感受到了以后在工作时的工作状态,我学会了如何对一个软件工程项目进行分
工合作,更明确了各个位置需要做出的工作,并对今后的项目开发有了更大的积极性与信心. -
221701236:
本次作业我的心态变化较大,一开始我看了题目有了大体的思路后觉得这次作业比较简单很
好实现,后台的代码进展也比较快,但是当我开始把后台的代码传到前台时却遇到了各种问题,这
让我心态大崩,这也导致该程序的逻辑比较乱。最后在我静下心来之后,我一一实现了程序的功能。
我本次的收获是,许多东西的难度只有在上手之后才能体会到,因此我应该尽早对整个项目
的技术难点有一定的了解。同时因为我javaee的知识还比较薄弱,所以有些功能的实现方式不是
很优雅,我还应该继续深入地对javaee进行学习。
五.对伙伴的评价
-
221701239: 这次的队友交流很及时,我一有问题问他,他基本能在一分钟之内回应,所以这一方面大大促进的
项目的开展.这次的编程设计是他设计的,而且这次我是前端编程,在难度方面较后端来说会小很多,工作量较大也
比较辛苦.而且他在一些代码的错误方面也及时给我提示,很快解决了问题.总的一句话,他是真滴牛! -
221701236: 我的队友221701239十分靠谱,这次项目的任务主要是我在分配,他总是能按时并
保质保量地完成。所以我想说他是真滴行!