项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
课程学习目标 | 掌握软件项目个人开发流程、掌握Github发布软件项目的操作方法 |
本作业在哪些方面帮助我实现学习目标 | 通过个人项目,让我更好的领会软件工程的意义和流程 |
项目Github的仓库链接地址 | https://github.com/YHwzt/Query-system |
一、陈述学生疫情每日上报子系统使用体验
就最近一个月对企业微信疫情上报系统的使用,我的个人感受是:
界面简洁直观,底端还有提示性文字简化了熟悉过程,而且填写之后能够生成表单预览填写信息是否有误,这些个优点是毋庸置疑的。但也伴随着缺点,因为一个系统开发初始肯定不是那么完美的,但在使用了一段时间,接受了一些大众意见,后期改善后,相应的功能也完善了很多,比如能够留存之前填报的信息,这样就不用每天浪费一定的时间重复填写。毕竟是一款即时性开发软件,而且也不会长期以往的使用下去,希望以后也不会再使用,所以就这款软件而言,能在需要的时段内,达到预期的软件使用目的,这才是最重要的。
二、开发一款自己心目中的西北师范大学学生疫情每日填报系统。
可在以下两类开发要求选择一种完成项目开发任务:
第一类开发要求:
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序,支持查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
第二类开发要求:
1. 系统可采集学生疫情有效信息;
2. 系统支持用户在线使用;
3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
我选择第一类要求进行开发,而且在基础要求上添加了一些功能
1、项目开发背景简介:
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
2、需求分析
(1)首先要求有一个数据文件,保存100天,2000 个教职工/学生的所有防疫信息,保存数据文件的方式有很多,txt,excal,sql都可以,为了修改数据方便起见,建立MySQL数据库保存教职工/学生的防疫信息,其中包括(学号,姓名,学院,班级,填报日期,是否湖北籍,是否在武汉,是否在湖北,是否疑似病例,是否确诊病例),如下图所示。
(2)其次项目要求设计一个命令行程序,这应该是最基础的要求,任何高级语言的学习最开始的程序基本都是命令行程序,如C,python,Java都在考虑适用范围内。
(3)程序软件支持查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。在这里的要求稍有模糊,“查询某种数据的周/月疫情统计情况”,疫情情况就现在普遍调查来看,基本为是否确认和是否疑似这两种情况,这个实现起来并不困难,采用字段匹配查询就可以。
(4)最后要求柱状图显示统计结果。这个要求就有些冲突,可能是因为做项目较少的原因,未曾遇到过命令行程序结果可视化的要求。刚开始甚至都考虑用C语言“-”和“*”符号画出一个柱状图了。最后确定了较为适合的开发语言——Java,并且对功能升级,做一个GUI,这样也便于用户操作。当然,linux系统就要另说了。
3、功能设计
(1)基本功能:
-
能存储2000 个教职工/学生100天的所有防疫信息
-
支持查询单个人在某一天的情况
-
查询确诊和疑似的周/月情况
-
柱状图显示统计结果
(2)扩展功能:
-
项目采用GUI设计,舍弃较为老套的命令行形式
-
可以添加新的教职工/学生疫情状况
-
能够删除某(些)成教职工/学生的疫情状况
-
可利用【高级查询】对数据组合筛选,以可视化方式展示关键疫情数据统计情况
-
能够精选准确查询和模糊查询
4、设计实现
定义一个学生类(Student),声明私有变量private的序号(id),姓名(username),学号(sno),学院(school),班级(myclass),填报日期(mydate),是否湖北籍(isinhbstudent),是否在武汉(isinwh),是否在湖北(isinhb),是否疑似(islike),是否确诊(isconfirm)和封装各自属性的方法:set(),getName(),因为属性是私有的,不可直接访问,例如id在外边不可直接设置,可通过setId方法来设置id的值。
student类为Javabean类,其他类有窗体类(frame)服务类(service)数据操作类(dao),frame类依赖service和dao,其他类都依赖student类
5、测试运行
基本功能
-
存储2000 个教职工/学生100天的所有防疫信息
-
查询确诊和疑似的周/月情况
- 柱状图显示统计结果
- 查询单个人在某一天的情况
扩展功能
- 添加新的教职工/学生疫情状况
- 删除某(些)成教职工/学生的疫情状况
- 利用【高级查询】对数据组合筛选,以可视化方式展示关键疫情数据统计情况
- 能够选择准确查询和模糊查询
6、代码展示
public class StudentFrame extends JFrame {
// 创建Student对应的service对象
private StudentService studentService = new StudentServiceImpl();
// 定义窗体宽高属性
private Integer WIDTH = 600, HEIGHT = 400;
// 声明表格对象的引用
private JTable jTable;
// 声明添加按钮的引用
private JButton insert;
// 声明刷新按钮的引用
private JButton flush;
// 声明删除按钮的引用
private JButton delete;
// 声明更新按钮的引用
private JButton update;
// 声明条件查询按钮的引用
private JButton whereQuery;
// 创建表头数组对象
private String[] tittle = {"id","学号","姓名","学院","班级","填报日期","是否湖北籍","是否在武汉","是否在湖北","是否疑似病例","是否确诊病例"};
// 声明List集合
private List<Student> list;
/**
* 无参构造器
*/
public StudentFrame() {
// 设置窗体标题
setTitle("冠状病毒统计列表");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// 设置宽高
setBounds(((int) screenSize.getWidth() - WIDTH) / 2, ((int) screenSize.getHeight() - HEIGHT) / 2, WIDTH, HEIGHT);
this.WIDTH = this.WIDTH / 2;
this.HEIGHT = (int) (this.HEIGHT * 0.8);
// 设置退出并结束程序
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 创建面板对象
JPanel southjPanel = new JPanel();
// 创建添加按钮对象
insert = new JButton("添加");
// 把添加按钮对象添加到面板中
southjPanel.add(insert);
// 创建刷新按钮对象
flush = new JButton("刷新");
// 把刷新按钮对象添加到面板中
southjPanel.add(flush);
// 创建删除按钮对象
delete = new JButton("删除");
// 把删除按钮对象添加到面板中
southjPanel.add(delete);
// 创建更新按钮对象
update = new JButton("更新");
// 把更新按钮对象添加到面板中
southjPanel.add(update);
// 创建条件查询按钮对象
whereQuery = new JButton("条件查询");
// 把条件查询按钮对象添加到面板中
southjPanel.add(whereQuery);
// 把面板对象添加到窗体底部中
add(southjPanel, BorderLayout.SOUTH);
// 创建表格对象
jTable = new JTable();
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 创建滚动面板对象
JScrollPane jScrollPane = new JScrollPane();
// 把表格对象对象添加到滚动面板中
jScrollPane.setViewportView(jTable);
// 把滚动面板对象添加到窗体中
add(jScrollPane);
// 刷新表格数据
flush();
// 显示窗体
setVisible(true);
7、总结:程序如何实现软件设计的“模块化”原则
遵循单一职责,降低类的复杂度,一个类只负责一项职责,每个方法负责单一属性,其逻辑要比负责多项职责简单的多,而且提高了类的可读性,修改一个功能时,能够显著降低对其他功能的影响。因为个人能力限制,本次项目还有很多不足之处。随着以后的学习,会努力真正完全理解模块化设计之后,设计出较为可观的项目软件出来。
8、展示PSP
PSP2.1 | 内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 27 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 27 |
Development | 开发 | 1000 | 845 |
Analysis | 需求分析 (包括学习新技术) | 120 | 120 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 0 | 0 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 15 |
Design | 具体设计 | 240 | 180 |
Coding | 具体编码 | 480 | 300 |
Code Review | 代码复审 | 60 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 150 |
Reporting | 报告 | 120 | 130 |
Test Report | 测试报告 | 40 | 40 |
Size Measurement | 计算工作量 | 40 | 30 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 40 | 60 |
预估时间和消耗时间相差最大的就是开发阶段,原因在于对自身能力的认知不足。而在开发阶段,又属编码和测试两个环节预估与实际消耗时间相差较大,原本以为编写会麻烦重重的程序,理清设计思路之后,逻辑异常的通顺。但在测试的时候还是出了很多Bug,所以在这个环节也相应的花费的时间要多上许多。
相应的耗时最多的也是这个阶段,原本一个软件开发耗时最多的应该是需求分析阶段,但本次设计因为客户需求给的比较具体,只要再细致化一下就基本已经成型,所以并未耗费太多的时间。
9、经验分享
说起经验,倒也没太多分享的,因为我觉得大家都很厉害。在这里反思一下,
- 要对自己的能力有正确的认识,不能眼高手低
- 一些写文档的阶段不能因为与技术无关就随意处理,不管任何阶段都要认真去对待,这不仅是对自己的负责,也是对客户的负责。
- “我亦无他,唯手熟尔”,因为不常用Java设计GUI界面,借着本次项目又回过头去复习了一下GUI板块的知识
- 顺便吐槽一下以项目驱动课程理解的学习方式“很累,但收获也颇多”
三、将项目源码的完整工程文件提交到Github仓库
1.代码规范说明已添加到github项目仓库的read me当中。
2.本想采用eclipse中的扩展接口导入到仓库更加方便一点,但扩展插件下载速度实在让人汗颜,就采用了git bash窗口,以git命令的方式将项目导入到仓库中。