项目 | 内容 |
---|---|
班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
学习目标 | (1)在学生管理系统中添加疫情上报功能; (2)掌握Github发布软件项目的操作方法; |
本作业在哪方面帮我完成学习目标 | 根据实际需求独立开发项目 |
github仓库地址 | https://github.com/AlexCrizs/Software-Engineering |
一、实验目的与要求
(1)掌握软件项目个人开发流程。
(2)掌握Github发布软件项目的操作方法。
二、实验内容和步骤
项目开发背景
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
任务1:陈述学生疫情每日上报子系统使用体验
这些天我在同时参与着好几个设计,所以本次设计的时间不多,界面还很简陋,功能也不是很完善,很多我能想到的功能也没有加进去,确实是一个遗憾,
之后如果时间允许的话,我会继续完善这个项目,将其他已经想到的功能添加进去,界面也要设计地更加美观一点
任务2:
总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
第一类开发要求:
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,
请设计一个命令行程序, 支持查询某人在某一天的疫情情况,
查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
第二类开发要求
- 系统可采集学生疫情有效信息;
- 系统支持用户在线使用;
- 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
- 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
- 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
我选择了第一类开发要求
需求分析
1.录入当天疫情信息
2.删除学生信息
3.查询疫情信息
4.查询某种数据的统计情况(用柱状图显示统计结果)功能
设计实现
1.数据库设计两个表格,一个为管理员(存储用户名和密码),一个是用户表(存储用户数据)
2.登录界面
3.添加学生信息
4.查询学生疫情信息
5.查询学生是否感染,并显示柱状图
6.随机生成学生信息代码,然后生成sql语句保存在TXT文件中,最后在mysql中执行,生成大量学生信息
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class UserTest {
public static void main(String[] args) {
try {
writeToFile();
//readFromFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* DOC 往文件里写入数据.
*
* @throws IOException
*/
private static void writeToFile() throws IOException {
String writerContent = "";// 要写入的文本
File file = new File("H:\user.txt");// 要写入的文本文件
if (!file.exists()) {// 如果文件不存在,则创建该文件
file.createNewFile();
}
FileWriter writer = new FileWriter(file);// 获取该文件的输出流
for (int i = 10 ;i < 100; i ++ ) {
writerContent = "insert into user VALUES("+"美术学院"+","+"17美术"+","
+calcTime("",(i+1))+","+"zwj"+i+","+"2017310201"+i+","+"湖北省"+","+"荆州市"+","
+"城关区"+","+"是"+","+"否"+","+"否"+")"+"
";
writer.write(writerContent);// 写内容
}
writer.flush();// 清空缓冲区,立即将输出流里的内容写到文件里
writer.close();// 关闭输出流,施放资源
}
/**
* 2020-03-10 15:29:20
* @param type 往前计算的类型(week、month、year,“”表示day
* @param count 往前计算的数量
* @return
*/
private static String calcTime(String type ,int count){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
if (type .equals("week")) {
//周
calendar.add(Calendar.WEEK_OF_YEAR, count);
}else if (type .equals("month")) {
//月
calendar.add(Calendar.MONTH, count);
}else if (type .equals("year")) {
//12个月
calendar.add(Calendar.MONTH, count);
}else {
//日
calendar.add(Calendar.DATE, count);
}
java.util.Date date = calendar.getTime();
return sdf.format(date);
}
}
7.关键部分代码
private static void managerServer() throws SQLException {
ManagerDao_Imp managerDao_Imp = new ManagerDao_Imp();
while (true) {
int item = View.managerMenuView();
boolean flag;
switch (item) {
case 1:
// 添加用户
User user = View.addMenuView();
flag = managerDao_Imp.insert(user);
System.out.println(flag ? "添加成功" : "添加失败");
break;
case 2:
// 删除用户
String stuid = View.deleteMenuView();
flag = managerDao_Imp.delete(stuid);
System.out.println(flag ? "删除成功" : "删除失败");
break;
case 3:
// 查询用户信息
View.selectMenuView();
int a1;
do {
a1 = View.selectMenuView();
switch (a1) {
case 3:
System.out.println("已退出");
System.exit(-1);
break;
case 1:
String college = View.select();
User selectedUser = managerDao_Imp.select(college);
break;
case 5:
String city = View.selectCity();
User selectedCity = managerDao_Imp.selectCity(city);
case 2:
String isReturn = View.selectIsReturn();
User selectedIsReturn = managerDao_Imp.selectIsReturn(isReturn);
break;
case 4:
String isSuspect = View.selectIsSuspect();
User selectedIsSuspect = managerDao_Imp.selectIsSuspect(isSuspect);
break;
default:
break;
}
} while (a1 != 5);
break;
case 4:
//柱状图查看
View.barMenuView();
int b1;
do {
b1 = View.barMenuView();
Selectbar bar = new Selectbar();
switch (b1) {
case 2:
System.out.println("已退出");
System.exit(-1);
break;
case 1:
bar.Selectbar1();
break;
default:
break;
}
} while (b1 != 3);
break;
case 5:
System.out.println("已退出");
System.exit(-1);
break;
default:
break;
}
}
}
任务3:完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。
commit 10次,pr、release、issues都已使用。
总结
1.实现软件设计的“模块化”原则上,参数传递信息的结构尽量简单,不用复杂参数结构(如过程、指针等类型参数),参数的个数也不宜太多,如果太多,则说明模块的功能过于庞大复杂。
尽可能改进软件结构提高模块独立性,如果某两项功能有公共子功能,就将次子功能独立设计成一个模块,以此来优化结构
本次单独完成一个项目,深刻地认识到了自己在编程方面的不足,技术能力还有待加强。在测试环节出现了很多问题,解决这些问题花了很多时间。
我觉得我们要把代码中常见的异常情况了解清楚,那么在以后的编程中就会省下很多的时间,接下来我也会自学Java web,希望以后的项目上可以用到。
2.一些经验:一定要学会怎么查看自己的错误,认识一些常见的异常,如空指针异常等,学会排查错误,这样可以很大的提高自己的效率。
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 15 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 40 |
Development | 开发 | 600 | 720 |
Analysis | 需求分析(包括学习新技术) | 60 | 90 |
Design Spec | 生成设计文档 | 10 | 15 |
Design Review | 设计复审 | 15 | 15 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 25 | 15 |
Design | 具体设计 | 30 | 45 |
Coding | 具体编码 | 300 | 330 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 120 |
Reporting | 报告 | 15 | 20 |
Test Report | 测试报告 | 15 | 15 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 | 15 | 15 |