实验二《西北师范大学学生疫情上报系统》项目报告
项目 | 内容 |
---|---|
课程班级博客 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
课程学习目标 | (1)学习软件项目的个人开发流程(2)掌握GitHub的操作方法 |
本次在哪些方面帮助我实现学习目标 | 软件开发流程的方面和运用学习工具的方面 |
项目的Github仓库链接 | https://github.com/wyq1998/- |
任务1:陈述学生疫情每日上报子系统使用体验
我觉得学校设计的疫情每日上报系统挺好用的,考虑了学生的基本情况,界面也十分的整洁清新。如果有需要改进的地方,那么我希望学校可以在系统上加个能够记录我们前一天所填报内容的功能,这样就能更快捷的填写(一键复制昨天的内容)。
实验内容
任务2:
1 需求分析
2019年12月以来,湖北省武汉市持续开展流感及相关疾病监测,发现多起病毒性肺炎病例,均诊断为病毒性肺炎/肺部感染,并造成了大规模的疫情。后经研究发现,这次的病毒性肺炎疫情是由2019新型冠状病毒(2019-nCoV)引起的。为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施:2020年1月23日10时起对武汉“封城”,全国31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
此次疫情中,许多互联网企业相继投入到了疫情的防控工作当中,开发了很多与防疫相关的软件,为政府的防疫工作减少了许多的麻烦,有效地降低了疫情在某些生活方面的传播可能。这也放映出了软件产品对于遏制疫情发展起到了重要的作用。同时,虽然已经有很多的软件产品已经投入到了疫情的遏制工作当中,但是这个量还是远远不够的,需求仍然很大,并且仍然有很多领域未涉及到,需要我们不断地探索。
2 功能设计
这里我需要再看一下题目:
二选一:
第一类开发要求:
有一个数据文件,保存了 100天 2000个 教职工/学生的所有防疫信息,请设计一个命令行程序,支持查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
第二类开发要求:
-
系统可采集学生疫情有效信息;
-
系统支持用户在线使用;
-
每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
-
各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
-
学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
这里我选择第一个要求进行开发。
从这里可以分析出,第一个要求的客户对象应该是管理人员,需要我们达到以下功能:
- 基本功能
- 支持查询某人在某一天的疫情情况
- 查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果
- 可以存储以下信息:学号;与本人相关的防疫信息a.有无发热,b.是否为留校学生,c.是否为湖北籍,d.是否与武汉疫区人员接触,e.是否与湖北疫区人员接触,f.是否在武汉,g.是否在湖北,h.今天从外地返校(参照学校的学生疫情情况每日上报表)
-扩展功能
-既然是疫情上报系统,并且是面向管理人员的,那么肯定要有相应的管理功能。
-因此,我在里面添加了删除人员信息和增加人员信息的功能。
3 设计实现
-
应用了两个类实现相关功能,利用MySQL存放数据:
Anti对象:
(1)在Anti对象里定义了学生/教职工的编号id、学号/职工号name、疫情信息situation、登记时间date。生成了构造方法和toString()方法;以及getting()和setting()方法,但后两种在程序里没用到(方便日后的扩展)。
(2)之所以我没有用到姓名,是因为一个学校里,可能会有一些重名的学生或教职工,那么就会导致查询的不便利。另外,它具有唯一性,并且教职工的职工号和学生的学号构成方式不同,是很不错的区分方式,可以减少软件开发的工作量。在程序当中,我就默认使用学号/职工编号代替姓名。(其实把姓名的部分加上,只需要多写几行代码,改一下相关的数据类型即可)
主程序TestFly:
TestFly类中有实现各种功能的函数,包括 1.列出防疫信息,2.按时间查询,3.按防疫信息查询,4.按姓名查询,5.按姓名,日期進行準確查询,6.删除人员信息,7.添加人员信息, 8.退出系统。
MySQL数据库:
(1)运用数据库安全的存放相关的数据
(2)数据库名字是Fly,数据表是plane;在getcon()函数中注册驱动、获取连接
表的设计结构:
-
主要函数
- listMessage():临时存放人员信息
- showMessage():展示人员信息
- showNum():计算数据个数
- selectDate():以时间进行筛选的函数
- selectSituation():以人员情况进行筛选的函数
- selectAntiNum():以教职工编号/学生学号进行筛选的函数
- deleteFly():删除人员信息函数
- creatAnti():添加人员信息函数
4 测试运行
主界面:
已经导出可运行的jar文件,可以通过命令行运行
截图:
列出所有的防疫信息:
支持查询某人在某一天的疫情情况:
查询了我在3-5和3-6的流动信息
查询了我在3-5流动信息
查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果:
核心:如果要按周/月对某数据进行统计的话,最好把数据按周/月的形式存在数据库当中(查询的时候,java调用的数据库语句就是"select * from anti"+"x";x代表第几周/月的表,是用户进行输入并选择的),这样也能优化程序的查询性能(针对老师在评论中提出的建议):
因为这里我只进行测试,所以就先建立一张以周/月为单位的表(anti表),并以人员信息为标准,进行查询(这里以有无发热为例,统计人数):
查询了数据中是否有无发热人员,并统计人数
以时间进行查询:
查询3-5进行数据登记的人数
添加和删除人员信息:
参考了老师在3月9号给我的评论,我查阅了相关资料,实现了生成柱状图的功能(界面可能有些不太美观):
查阅了相关的资料,因为使用java生成SVG图片的柱状图比较难实现,所以我还是用命令行调用java swing的方法生成柱状图:
这里的代码我就不上传github了,给个博客链接在此。
5 代码片段(核心)
//注册驱动,获取连接
public static Connection getCon() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/fly", "root", "19981228");
return con;
}
//创建初始信息,插入信息
public static void creatAnti(String name,String situation, String situation1, String situation2, String situation3, String situation4, String situation5, String situation6, String situation7,String date) throws Exception{
getCon();
String sql = "insert into anti values (null,?,?,?,?,?,?,?,?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, situation);
ps.setString(3, situation1);
ps.setString(4, situation2);
ps.setString(5, situation3);
ps.setString(6, situation4);
ps.setString(7, situation5);
ps.setString(8, situation6);
ps.setString(9, situation7);
ps.setString(10, date);
ps.executeUpdate();
ps.close();
con.close();
selectAntiNum(name);
}
//系统主菜单
public static void show(){
System.out.println("请选择操作:(1.列出防疫信息,2.按时间查询,3.按防疫信息查询,4.按姓名(学号)查询,5.按姓名(学号)查询和日期,进行准确查询,6.删除人员信息,7.添加人员信息, 8.退出系統)");
}
//获取结果集合输出
public static void showMessage(Set<Anti> set){
System.out.println("\n********************************版权所有:wyq***********************************\n");
if(set.size() == 0){
System.out.println("未匹配到任何数据!");
System.out.println("\n********************************版权所有:wyq***********************************\n");
return;
}
System.out.println("Anti\t\t姓名\t\t有无发热\t\t是否为留校学生/是否为湖北籍/是否与武汉疫区人员接触/是否与湖北疫区人员接触/是否在武汉\t是否在湖北\t是否今天从外地返校 时间");
for( Anti value : set){
System.out.println(value);
}
System.out.println("\n********************************版权所有:wyq***********************************\n");
}
//获取此数据的人数
public static void showNum(Set<Anti> set){
int x=0;
for( Anti value : set){
x++;
System.out.println(value);
}
System.out.println("\n***数据统计***\n");
System.out.println("共有"+x+"人");
System.out.println("\n***数据统计***\n");
}
//列出防疫信息
public static Set<Anti> listMessage() throws Exception{
getCon();
String sql = "select * from anti";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
Set<Anti> set = new HashSet<>();
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String situation = rs.getString("situation");
String situation1 = rs.getString("situation1");
String situation2 = rs.getString("situation2");
String situation3 = rs.getString("situation3");
String situation4 = rs.getString("situation4");
String situation5 = rs.getString("situation5");
String situation6 = rs.getString("situation6");
String situation7 = rs.getString("situation7");
String dateTime = rs.getString("date");
Anti anti = new Anti(id, name, situation, situation1, situation2, situation3, situation4, situation5, situation6, situation7,dateTime);
set.add(anti);
}
ps.close();
con.close();
return set;
}
任务3:完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。
已经导入,链接见博文开头。
导入方法:可以参考这篇博客
遇到的问题:git使用git push 命令跳出remote: Permission to A denied to B的问题
解决方法:我参考这篇博客
6 总结
我的程序主要以分类进行编写的方式(分为TestFly类和Anti类)实现软件设计的“模块化”原则;对于不好进行分类的代码,我力争分步进行代码的编写,把函数写一起,把模块实现的部分写一起......
7 展示PSP
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 6 |
Development | 开发 | 235 | 350 |
· Analysis | 需求分析 (包括学习新技术) | 15 | 10 |
· Design Spec | · 生成设计文档 | 5 | 5 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 120 | 180 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 15 | 15 |
· Test Report | · 测试报告 | 5 | 5 |
· Size Measurement | · 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 5 | 5 |
因为编程能力的水平不足,所以个人感觉PSP内的主要时间花在了项目的测试上面。 |
总体感受
在本次实验中,我通过阅读书籍与查询相关资料,学习并掌握了软件开发的流程,使我受益匪浅。在疫情信息管理系统的开发过程中,我使用了PSP的方法,快速的实现了该系统,基本实现了相关功能,让我体会到了有计划的去开发软件的好处,但是也暴露出我编写代码的能力还是有些生疏的。另外,我还有两点遗憾:第一点遗憾是没有实现柱状图显示统计信息功能:这个要求我在命令行限制下无法实现(也可能是我没找到方法)。不过,显示柱状图的功能是可以在java swing中实现的(利用jfreechart插件和导入相关jar包)。第二点遗憾是有些数据项目没有考虑到(看了看后面同学的作业,例如学院,联系电话等),还有就是个人感觉自己的命令行的界面做的不是特别好看,代码存在冗余。以上两点我会在日后进行完善。
第一点遗憾已经成功弥补
对于老师的第二个评论:
因为根据本人的以往经验,我觉得这种信息系统所消耗的时间主要在数据的遍历上,那么我就应该改进数据的存储形式,所以就把数据按周/月的形式编辑成表并存在数据库当中,查询的时候就只用查询相应时间的表,就可以节约很多的遍历时间。具体数据我就不放了,消耗的时间大概就是改进前遍历整张表(20w条数据),改进后只用遍历一张小的表。