项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | 1.掌握软件项目个人开发流程; 2.学习在GitHub上托管项目。 |
作业对我实现学习目标的帮助 | 1.掌握了个人软件项目开发的大致流程; 2.熟悉了GitHub托管发布项目的基本流程。 |
项目Github的仓库链接地址 | https://github.com/luorrr/SchoolInfoSystem |
参考文献 | [1]中国抗击新型冠状病毒:进展和影响[EB/OL]. (2020-02-01)/[2020-03-04]. http://cn.chinadaily.com.cn/a/202002/01/WS5e358d1fa3107bb6b579c92b.html. |
任务一. 陈述学生疫情每日上报子系统使用体验
在系统刚上线时,由于服务器以及网络拥堵等原因,经常有系统崩溃的情况发生,在之后一段时间的使用中,这一现象逐渐好转。此外,最初系统是没有自动生成每个用户数据填写记录的功能的,每天在填报信息时都需要重新输入数据,在系统运行了一段时间后,加入了这一功能,使得每天的数据填写提交方便了许多。总体来说,系统的使用体验变得越来越好。
任务二. 总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
**(一). **实验题目选择
在实验要求提出的两类开发要求中,我选择了第一类开发要求,即:设计一个命令行程序,支持在一个保存了100天2000个教职工/学生的所有防疫信息的数据文件中,查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
**(二). **项目开发背景简介
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
**(三). **需求分析
1. 设计一个命令行程序;
2. 程序能够实现学校2000名师生在100天中疫情信息的查询;
3. 程序能查询某个成员在某一天的疫情相关信息;
4. 程序能够查询某种数据在一段日期区间(如周、月等)内的情况;
5. 程序能够根据4中查询得到的结果绘制生成相应的疫情统计柱状图。
**(四). **功能设计
* 1. *基本功能
1. 使用命令行完成信息的展示与相关操作命令的选择;
2. 程序能够根据输入的学号/工号与日期数据查询指定的学校成员在某一天录入系统的疫情数据;
3. 程序能够根据输入的起止日期数据查询所有学校成员在指定的一段时间内录入系统的染疫情况;
4. 程序能够根据3中查询得到的数据绘制生成相应的柱状统计图。
* 2. *扩展功能
1. 程序能够通过键盘输入完成一个学校成员(教师/学生)的相关疫情信息在系统中的录入;
2. 程序能够通过输入的学号/工号数据的查询指定的某个学校成员的相关疫情信息;
3. 程序能够通过输入起止日期查询指定的一段时间内被感染人员的地区分布情况并绘制生成相应的统计图;
4. 程序能够通过读取文件自动生成可以在数据库中插入随机成员信息数据的随机SQL语句。
**(五). **设计实现
* 1. *基础功能实现
为实现基础的数据查询功能,我设计有以下几个类:
(1). 学生类 Student.java
(2). 教师类 Teacher.java
(3). 数据库连接类 DbUtil.java
(4). 学生功能类 StudentDao.java
(5). 教师功能类 TeacherDao.java
(6). 显示菜单类 SystemMenu.java
(7). 系统测试类 SystemTest.java
其中,学生类与教师类提供学生与教师的数据类型,包含有个人基本的数据;数据库连接类中的数据库连接函数负责程序与mysql数据库的连接;学生功能类与教师功能类提供程序查询数据库的函数方法;显示菜单类用于主菜单与其他二级菜单的打印;系统测试类中包含主函数Main,负责系统的运行测试。
* 2. *其他功能实现
为实现系统的其他功能,我设计有以下几个类:
(1). 柱状图显示类 BarChart.java
(2). SQL语句生成类 SqlCreate.java
其中,柱状图显示类负责通过导入的Jfreechart包内的方法来完成统计信息的柱状图的绘制;SQL语句生成类用于读取数据,以生成随机的SQL语句从而扩充数据库中的数据。
* 3. *数据部分设计
在数据部分我使用了MySQL数据库来完成实现,数据库名为schooldb,其中有两个表,分别为学生信息表studentinfo与教师信息表teacherinfo,两类表的设定如下图:
图2.5.1 studentinfo
图2.5.2 teacherinfo
其中学生信息主要包括学号id、姓名name、性别sex、学院college、专业major、电话号码phoneNumber、记录日期recordDate、所在省province、所在市city、是否感染diagnosed与体温temperature;教师的信息除了没有专业major一项以外,仅在工号id上有所不同,学生的学号设定为12位,教师的工号设定为4位。
两张表均插入了随机生成的用户数据,在学生表中由于第一次插入的数据信息考虑不周,生成的数据有一点问题(这个在之后的测试环节会说明),因此在原先数据的基础上又插入了部分数据,因此,学生表中有大约2400名学生在100余天内的信息,而教师表中越有50名教师在100余天内的信息,两个表中的数据加起来越有25万条左右。
**(六). **测试运行
* 1. *程序界面
图2.6.1 主界面
* 2. *基础功能测试
首先测试插入用户(教师/学生)数据如下图,可见数据插入成功。
图2.6.2 插入学生数据
图2.6.3 插入教师数据
之后测试通过学号或工号查询用户(教师/学生)数据信息如下,输入用户类型与学号/工号即可查询用户所有的上报数据,由于数据过多无法完全截取图片。
图2.6.4 查询教师数据
图2.6.5 查询学生数据
最后测试通过组合查询学号与工号的方式查询用户(教师/学生)数据信息如下,输入用户类型、学号/工号与需要查询的日期即可查询用户当天的上报数据。
图2.6.6 查询教师数据
图2.6.7 查询学生数据
* 3. *其它功能测试
首先测试统计某一日期区间内的感染人数如下,输入需要查询的起始日期即可查询期间用户的疫情感染情况。
图2.6.8 用户感染情况初次数据
图2.6.8所绘制的是最初加入的2000人的数据,由于在随机生成数据的过程中考虑不周,将每个人在100天内的感染情况固定为了一个数据,即一个人在这100天内均没有感染或一个人在这100天内均感染,因此查询得到的结果每一天都是一致的。之后我又再次生成了300多人在100天内的随机感染数据如图2.6.9,从而使得感染人员数量统计有所变化,如图2.6.10
图2.6.9 新的随机数据录入
图2.6.10 添加数据后的用户感染情况数据
之后测试统计某一日期区间内的感染人员地区分布情况如下,输入需要查询的起始日期即可进行查询。
图2.6.11 感染人员地区分布情况
最后测试完成,退出系统。
图2.6.12 系统退出
**(七). **代码展示
此段代码实现系统查询日期区间内的感染学生的人数与学生的人员地区分布情况。
/**
* ·通过起始日期查询数据
*
* @param dateBegin
* @param dateEnd
* @param isProvince
* @return 学生信息列表
* @throws SQLException
*/
public List quaryByDate(Date dateBegin, Date dateEnd, boolean isProvince) throws SQLException {
Connection conn = DbUtil.getConnection();
Statement stmt = conn.createStatement();
//SQL
String sql = "";
if (isProvince) {
sql = "select count(*) count,province from studentinfo where recordDate between '" + dateBegin + "' and '" +
dateEnd + "' and diagnosed = '1' Group By province;";
} else {
sql = "select count(*) count,recordDate from studentinfo where recordDate between '" + dateBegin + "' and '" +
dateEnd + "' and diagnosed = '1' Group By recordDate;";
}
//执行
ResultSet rs = stmt.executeQuery(sql);
//添加用户信息
List stuList = new ArrayList();
Student s = null;
while(rs.next()) {
if (isProvince) {
s = new Student(rs.getInt("count"), null, rs.getString("province"));
} else {
s = new Student(rs.getInt("count"), rs.getDate("recordDate"), null);
}
stuList.add(s);
}
return stuList;
}
**(七). **实验总结
在此次实验中,我了解了PSP对于个人软件项目开发的重要性,也熟悉了PSP的基本流程,这对我之后的软件开发学习提供了帮助。同时,我在这次实验中也学习了模块化的开发原则,如在Java中使用类、包等结构来划分模块,而不是将大量无关代码方法写入一个类、一个包中。除了以上几点外,我也熟悉了在Github上创建项目并发表等操作。总的来说,在这次实验中我学习到了许多,希望在之后的实验中我能越做越好。
**(八). **PSP展示
PSP | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 0.2 | 0.25 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 0.2 | 0.25 |
Development | 开发 | 13.05 | 14.2 |
Analysis | 需求分析 (包括学习新技术) | 0.25 | 1.5 |
Design Spec | 生成设计文档 | 0.1 | 0.1 |
Design Review | 设计复审 (和同事审核设计文档) | 0.1 | 0.1 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0.1 | 0.2 |
Design | 具体设计 | 1 | 0.8 |
Coding | 具体编码 | 8 | 7 |
Code Review | 代码复审 | 2 | 2 |
Test | 测试(自我测试,修改代码,提交修改) | 1.5 | 2.5 |
Reporting | 报告 | 1.3 | 1.8 |
Test Report | 测试报告 | 1 | 1.5 |
Size Measurement | 计算工作量 | 0.1 | 0.1 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 0.2 | 0.2 |
在这次实验中,前期设计规划上用时基本符合预期。在代码部分用时最超出预期的有两个部分,一是前期或者中期查阅资料的时间,一是在数据库中录入数据的过程,查阅资料主要是因为有一段时间没有使用java语言有些生疏且需要查询柱状图生成方法,而数据库部分主要是因为数据过多,额外编写了随机生成sql语句的方法。在总结部分用时最多的书写博客部分,主要还是对Markdown语法不够熟悉的原因。总之,在这次的实验中我有许多的不足之处,希望之后能做得更好。
任务三. 完成任务二项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。
GitHub提交界面如下,包括issues与在他人项目中pull requests。
图3.1.1 GitHub提交
图3.1.2 GitHub issues
图3.1.3 GitHub在他人项目中pull request