项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的学习目标 | 掌握软件项目个人开发流程;掌握Github发布软件项目的操作方法; |
这个作业在哪些方面帮助我实现学习目标 | 掌握了个人软件项目开发的大致流程;熟悉了GitHub托管发布项目的基本流程。 |
项目Github的仓库链接地址 | https://github.com/syy2020/student |
任务1:陈述学生疫情每日上报子系统使用体验;
刚开始使用学生疫情每日上报子系统时,系统出现了问题,不能够正常进行打卡。在随后的使用过程中,系统进行了完善,界面更加友好,填报信息也比较完善。但是在打卡时间方面,由于时间截止早上十点,经常会忘记打卡。
任务2:总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
第二类开发要求:
1. 系统可采集学生疫情有效信息;
2. 系统支持用户在线使用;
3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
我选择第二类开发要求
项目开发背景简介:
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
1.需求分析
系统可采集学生疫情有效信息;系统支持用户在线使用;每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办; 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。
2.功能实现
实现学生、学院负责人及学校负责人登录系统,进行疫情信息管理。
实现用户的疫情上报功能;
实现学生个人信息管理的功能;
学生可以进行个人信息修改;
登陆密码的修改。
3.设计实现
设计包括以下类
学生类 Student.java;负责学生信息的增加,修改等相关操作;
教师类 Teacher.java;负责教师信息的增加,修改等相关操作。
数据库连接函数负责程序与sql server数据库的连接。
4.测试运行
数据库部分建了四张表,如下所示:
登陆界面如下:
代码片段
public class StudentDetail extends JPanel implements ActionListener,Listener{
JTable table; //用于显示学生详细信息
JScrollPane scroll;
JButton btnAlter = new JButton("信息修改");
JPanel panel=new JPanel();
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Object[][] columnValues;
String[] columnNames;
DefaultTableModel tableModel;
StudentDetail() {
connDB();
btnAlter.addActionListener(this);
setLayout(new BorderLayout(0, 0));
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
panel.add(btnAlter);
add(panel, BorderLayout.NORTH);
columnValues = new Object[1][5];
columnNames = new String []{ "学号", "姓名", "性别","年龄", "专业" };
try {
rs = stmt.executeQuery("select * from s where 用户名='" + LoginFrame.loginName
+ "'"); //查询数据库中与登录名一致的学生信息
rs.next();
columnValues[0][0] = rs.getString("学号");
columnValues[0][1] = rs.getString("姓名");
columnValues[0][2] = rs.getString("性别");
columnValues[0][3] = rs.getInt("年龄");
columnValues[0][4] = rs.getString("专业");
} catch (SQLException e) {
e.printStackTrace();
}
tableModel = new DefaultTableModel(columnValues,columnNames);
table = new JTable(tableModel);
scroll = new JScrollPane(table);
add(scroll);
closeDB();
}
public void connDB() { // 连接数据库
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager
.getConnection(
"jdbc:sqlserver://localhost:1433; DatabaseName=ers",
"SA", "111111");
stmt = con.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void closeDB() { // 关闭连接
try {
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
StudentAdd sadd = new StudentAdd(this);
sadd.setTitle("修改");
sadd.tsno.setText(columnValues[0][0].toString());
sadd.tsname.setText(columnValues[0][1].toString());
sadd.cbssex.setSelectedItem(columnValues[0][2].toString());
sadd.tsage.setText(columnValues[0][3].toString());
sadd.cbsdept.setSelectedItem(columnValues[0][4].toString());
sadd.tsno.setEnabled(false);
}
@Override
public void refreshUI() {
connDB();
try {
rs = stmt.executeQuery("select * from s where 用户名='" + LoginFrame.loginName
+ "'"); //查询数据库中与登录名一致的学生信息
rs.next();
columnValues[0][0] = rs.getString("学号");
columnValues[0][1] = rs.getString("姓名");
columnValues[0][2] = rs.getString("性别");
columnValues[0][3] = rs.getInt("年龄");
columnValues[0][4] = rs.getString("专业");
} catch (SQLException e) {
e.printStackTrace();
}
tableModel.setDataVector(columnValues, columnNames);
tableModel.fireTableDataChanged();
closeDB();
}
@Override
public void getMessage(String message) {
}
}
总结
通过本次实验项目的学习实践,进一步熟练了github的操作。熟悉了PSP的基本流程,认识到PSP对于个人软件项目开发的重要性。自己在过程中并没有很好的按照计划过程来进行,导致出现了许多问题。暴露出了自己在个人软件开发上的缺点。
psp
PSP | 任务内容 | 计划共需的时间(min) | 实际所需的时间(min) |
---|---|---|---|
planning | 计划 | 35 | 25 |
Estimate | 估计这个任务所需时间,并作规划 | 35 | 45 |
Development | 开发 | 650 | 900 |
Analysis | 需求分析 | 300 | 240 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审(和同事审核设计文档) | 0 | 0 |
Coding Standar | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 220 | 180 |
Coding | 具体编码400 | 500 | |
Code Review | 代码复审 | 150 | 180 |
Test | 测试 | 50 | 200 |
Reporting | 报告 | 50 | 50 |
Test Report | 测试报告 | 35 | 45 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划10 | 20 |