201771030117-祁甜 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | 学会简单的个人软件项目开发 |
这个作业在哪些方面帮助我实现学习目标 | 运用了PSP完成了一个简单的系统开发 |
项目Github的仓库链接地址 | https://github.com/Gu19901212/NewSystem |
任务一 陈述学生疫情每日上报子系统使用体验
由于疫情需要学校要求我们于每天十点以前填报自己当天的疫情信息,但是第一天的时候遇到了和大多数人都一样的问题就是人数太多导致系统崩溃,但是后来的时候有意识的错峰填报就没有出现过此类问题了。还有一个就是刚刚开始填报的时候需要每天都填写各类信息非常麻烦,这个问题后来也解决了。总的来说使用体验很好。
任务二 总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统
我选择的是第二类开发要求:
1. 系统可采集学生疫情有效信息;
2. 系统支持用户在线使用;
3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
任务三 完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中
本项目Github项目仓库https://github.com/Gu19901212/NewSystem
一、需求分析
1、背景
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
突如其来的疫情我们无法返回学校,这在一定程度上减少了疫情的传播,但是也给学校的防疫工作带来了难度。学校无法及时了解学生的健康状况,所以开发了学生疫情上报系统,便于学校及时掌握学生的疫情信息。
2、需求分析
(1)学校需要及时掌握学生的疫情信息,在线填报比较方便;
(2)每一个人需要完成的工作不同,系统可以将每个人要完成的分开。
二、系统功能
三、设计实现
主要的类包括:
(1)BaseDao.java:数据库操作基础类,利用泛型和反射机制来抽象数据库基本的增删该查操作;
(2)CollegeadminServlet.java:各学院负责人查看本学院学生信息;
(3)LoginServlet.java:控制不同身份的人登录;
(4)SchoolOfficeServlet.java:学校防疫办获取各学院已经提交的学生信息;
(5)StudentServlet.java:学院负责人查看本学院的疫情信息并提交给学校防疫办;
(6)yiqingServlet.java:学生填报疫情信息以及控制条件。
isEffectiveDate(Date nowTime, Date startTime, Date endTime)函数:控制学生在每天十点以前填报疫情情况,如果在十点以前返回true,否则返回false。
四、测试运行
系统在eclipse中的运行图:
如果登录身份错误的话会拒绝该用户登录系统并给出相应提示,同样的密码等错误也会给出相应提示。
1、学生登录系统
学生填报疫情情况界面:
点击提交按钮后页面提示“提交成功”
当重复提交提交时会提示“你今天已经提交过了,不可重复提交!”
当超过十点提交时会提示“请于每天十点填写!”
2、学院负责人登录系统
查看本院的学填报情况:
点击提交按钮后会将本院学生填报情况提交给学校防控办,页面提示“success”
查看本院学生的基本信息:
其他学院负责人于此相同
3、学校防控办登录系统
查看全校已经提交的学院的学生疫情信息,由于只有计算机学院和设计学院的学院负责人向上提交了,所以只能看到计算机学院和设计学院的信息:
五、关键代码
/*判断时间是否在每天十点以前*/
//从系统获取当前时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String now =df.format(new Date());
//从系统获取是哪一天
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd ");
String start =df2.format(new Date());
//从系统获取是哪一天
SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd ");
String end =df3.format(new Date());
String format = "yyyy-MM-dd HH:mm";
Date nowTime = new SimpleDateFormat(format).parse(now);
Date startTime = new SimpleDateFormat(format).parse(start+"00:00");
Date endTime = new SimpleDateFormat(format).parse(end+"10:00");
System.out.println(isEffectiveDate(nowTime, startTime, endTime));
if(isEffectiveDate(nowTime, startTime, endTime)){
if(studentDao.add(student)){
msg = "提交成功";
}
}
else {
msg="请于每天十点填写!";
}
studentDao.closeConnection();
resp.getWriter().write(msg);
}
/**
* 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
}
六、存在的问题
系统的大部分功能都已实现,但是【导出】EXCEL文件没有实现,另外我遇到了一个问题,在学生填报疫情信息的时候需要填报姓名等信息,但其他信息都可以存到数据库中,只有姓名字段无法存入,我试了好多方法都没有解决。
如图所示当学生进行疫情填报的时候无法将姓名属性存入数据库
在yiqingServlet.java中
String name = new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
可以获取到JSP页面传过来的name值但是无法存入数据库,其他字段都可以存入。
这个问题现在已经解决:在存储疫情信息的表中总是存不进去第一个属性,所以我设置了一个允许为null的属性,当填报疫情的时候不用填这个属性,默认为null。这样的话姓名属性就可以存入数据库中了,但是具体原因现在还不太清楚
七、总结
本系统通过以下方法来实现软件设计的“模块化”原则:
(1)制定PSP,严格按照PSP进行每一步的工作;
(2)将数据库的基本操作去不封装在BaseDao.java类中,利用泛型和反射机制来抽象数据库基本的增删该查操作;
(3)每个身份的人需要完成的工作不一样,所以从登陆开始就将身份不同的人分开进行下一步的编程。
(4)将各个功能分开编程,比如验证码生成、学生功能、学院负责人功能等。
八、PSP展示
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间 |
---|---|---|---|
Planning | 计划 | 30 | 25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 30 |
Development | 开发 | 1735 | 2340 |
Analysis | 需求分析(包括学习新技术) | 90 | 120 |
Design Spec | 生成设计文档 | 30 | 20 |
Design Review | 设计复审(和同事审核设计文档) | 0 | 0 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 15 |
Design | 具体设计 | 30 | 25 |
Coding | 具体编码 | 1200 | 1800 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 180 | 165 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem&Process Improvement Plan | 事后总结并提出过程改进计划 | 60 | 50 |
在估计时间和实际用的时间中,我在具体编程用的时间最多也差别最大,因为我的编程能力比较弱,这是由于平时练习不多,下去我会努力提升自己的编程能力。
九、经验
在以往的学习中虽然接触过比较简单的系统开发但大多都是和同学一起完成的,刚刚开始看见这个作业的时候感觉很难,但是还是硬着头皮做下去了。做着做着就会发现,当你解决一个问题的时候很有成就感,所以要对自己有信心。在以往的学习中都是一上来就开始编程,就会出现很多问题比如需求不明确需求,对功能理解有偏差等,这次采用了PSP,在编程之间做了很多准备工作,就会很大程度上避免这些问题的出现。虽然这次的系统存在一些问题,但我会继续进行改进,争取完成期望的功能。