项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | 通过本次实验可以对结对完成项目的过程有一个更深的理解,同时更加熟练地使用github |
这个作业在哪些方面帮助我实现学习目标 | 首先是这个作业的完成方式,通过结对完成项目更加深刻地体会到了1+1>2的感受,也对GitHub的操作性和实用性有了更加深刻的了解 |
结对方学号-姓名 | 201771030119-邵阳阳 |
结对方本次作业博客链接 | https://www.cnblogs.com/syy2020/p/12589684.html |
本项目Github的仓库链接地址 | https://github.com/k20465/student |
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
- 评论已完成 结对方博客链接
- 评论如下图:
(2)复审同伴项目代码和记录。
克隆下载同伴代码
代码核查表
1、概要部分
代码基本符合要求和规格说明,代码设计方面对于功能的实现考虑的不是很周全,没有完全突出疫情上报系统的特色,对于基本功能有比较良好的实现,因为开发工具的统一性和规范性,代码的可读性非常好,而且设计风格很好,同时代码有很强的维护性,框架结构清楚,维护起来更加方便,对于每一行代码都做了认真的核查。
2、设计规范部分
代码的设计模式遵循一贯的java设计规范,容易理解和修改,有部分的字符串和数字存在,代码的设计对于平台没有依赖,可根据需要进行移植,新写的代码可以用已有的Lifrary/SDK/Framework中的功能实现,本项目中也存在类似的功能可以调用而不用全部重新实现,有部分无用代码需要清除,因为新的写的功能已经完全覆盖,而且留着并不会带来更好的效果和更多的用处。
3、代码规范部分
修改过的代码符合代码标准和风格。
4、具体代码部分
对代码中错误和异常进行了处理,同时对于兼容性做了一定的处理;参数的传递没有出现错误,代码中字符串的长度是字节的长度,而且计数是以1开始计数;
对于用户要进行的操作选择使用Switch语句控制,代码检查中没有发现default,通过测试运行,确保不会出现死循环;
没有做到用断言来保证我们认为不变的条件真的满足,对于资源的利用实现在类中的申请和释放,而且对于资源有严格的控制,不会导致泄漏,数据结构中无用的元素都已经在检查过程中进行删除。
5、效能
代码设计和实现的效能都有一定的保证,最坏情况的话可能会因为使用的平台不同产生一定的兼容性问题;在代码循环部分没有可优化的部分;对于因网络而导致的超时问题进行了异常处理。
6、可读性
代码的可读性良好,注释清楚,并且很规范。
7、可测试性
代码中已经创建了测试类,针对单元测试,但是缺少针对更加复杂的数据来源的测试。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
-
Fork:
-
Clone:
-
Push:
-
Pull request:
-
Merge pull request:
任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
1、需求分析
(1)项目更新需求:目前疫情的传染趋势依旧不容乐观,全球共同抗疫成为了热点,面对当前的局势,准确快速地掌控每一个人的疫情情况迫在眉睫,针对之前开发的疫情上报系统因为操作界面和功能的不完善,已经无法适应现在的需求,所以尽快地拿出切实可行的有效软件来帮助大家统计疫情信息成为了必要。
(2)用户需求:针对用户使用更加方便有效,尽量使设计成果满足多功能少麻烦,用户只需要填写一次自身信息,便可留存在数据库,方便以后的每次填报和查询。
(3)管理员需求:根据管理范围的不同,管理员的权限和职责也不同,管理员需要有权限获取所有数据进行统计并将统计结果随时发布,同时不同层次的管理员还需要将自己负责的数据以excle形式导出,方便留存数据。
(4)开发人员需求:开发人员要认真了解当前的疫情情况和大家填报过程中存在的问题,也要对用户的现实需要做出可靠的分析和验证,而且开发出来的项目可维护性要强,以便应对以后不同时期的需求。
2、软件设计说明
(1)软件基本功能
- 全校师生所有信息的填写和录入
- 学校二级部门对信息的修改和查询
- 管理员对信息情况的统计
- 将所需数据导出为excle表格
(2)软件拓展功能 - 定时填报提醒
3、代码实现
重要代码片段
package student;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
class LoginFrame extends JFrame implements ActionListener, ItemListener {
JPanel p1 = null,p2 = null,p3 = null;
JLabel userNumber = new JLabel("用户:");
JTextField txtUser = new JTextField();
JLabel password = new JLabel("密码:");
JPasswordField txtPwd = new JPasswordField();
JLabel role = new JLabel("身份:");
JComboBox cbrole = new JComboBox();
JButton btnLogin = new JButton("登录");
JButton btnReset = new JButton("重置");
JButton btnCancel = new JButton("取消");
JLabel imageLabel;
Icon image;
static int OK = 1;
static int CANCEL = 0;
static String loginName="";
int actionCode = 0;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
int index = 0;
public LoginFrame() {// 构造方法
super("西北师范大学疫情上报系统");
p1 = new JPanel();
p1.setBounds(80, 10, 340, 120);
p2 = new JPanel();
p3 = new JPanel();
p3.setBounds(80, 257, 340, 37);
cbrole.addItem("学校负责人");
cbrole.addItem("学生");
cbrole.addItem("学院负责人");
image = new ImageIcon("src/images/shu.png");
p1.setLayout(new BorderLayout(0, 0));
imageLabel = new JLabel(image);
p1.add(imageLabel, BorderLayout.EAST);
this.setBounds(200, 200, 500, 345);
p2.setBounds(150, 147, 200, 110);
p2.setLayout(new GridLayout(4, 2));
p2.add(userNumber);
p2.add(txtUser);
p2.add(password);
p2.add(txtPwd);
p2.add(role);
p2.add(cbrole);
p3.add(btnLogin);
p3.add(btnReset);
p3.add(btnCancel);
getContentPane().setLayout(null);
getContentPane().add(p1);
getContentPane().add(p2);
getContentPane().add(p3);
//this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
this.setVisible(true);
//添加监听事件
btnLogin.addActionListener(this);
cbrole.addItemListener(this);
btnReset.addActionListener(this);
btnCancel.addActionListener(this);
}
// 连接数据库
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();
}
}
//获取用户所选择身份的下标
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JComboBox jcb = (JComboBox) e.getSource();
index = jcb.getSelectedIndex();
}
}
//登录选项按钮的监听
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
String un = null;
String pw = null;
//监听到点击的按钮是登录按钮
if (source == btnLogin) {
// 判断是否输入了用户名和密码
if (txtUser.getText().equals("") || txtPwd.getPassword().equals("")) {
JOptionPane.showMessageDialog(null, "登录名和密码不能为空!");
}else {
if(index==0) {//管理员登录
if(txtUser.getText().equals("1")){
if(String.valueOf(txtPwd.getPassword()).equals("1")) {
new ManagerFrame();// 进入管理员界面
setVisible(false);
}else {
JOptionPane.showMessageDialog(null, "密码错误!");
txtPwd.setText("");
}
}else {
JOptionPane.showMessageDialog(null, "登录名错误!");
txtUser.setText("");
txtPwd.setText("");
}
}else if(index==1) {//学生登录
connDB();
try {
rs = stmt.executeQuery("select * from s");
boolean user=false;
while (rs.next()) {
un = rs.getString("用户名").trim();
pw = rs.getString("密码").trim();
if (txtUser.getText().equals(un)) {//登录名正确
user=true;
if (String.valueOf(txtPwd.getPassword()).equals(pw)) {//密码正确
actionCode = OK;
this.setVisible(false);
loginName=un;
new StudentFrame();
break;
} else {//密码错误
JOptionPane.showMessageDialog(null, "密码错误!");
txtPwd.setText("");
}
}
}
if(!user) {
JOptionPane.showMessageDialog(null, "登录名错误!");
txtUser.setText("");
txtPwd.setText("");
}
}catch (SQLException e1) {
e1.printStackTrace();
}
closeDB();
}else
{
connDB();
try {
rs = stmt.executeQuery("select * from t");
boolean user=false;
while (rs.next()) {
un = rs.getString("用户名").trim();
pw = rs.getString("密码").trim();
if (txtUser.getText().equals(un)) {//登录名正确
user=true;
if (String.valueOf(txtPwd.getPassword()).equals(pw)) {//密码正确
actionCode = OK;
this.setVisible(false);
loginName=un;
new TeacherFrame();//
break;
} else {//密码错误
JOptionPane.showMessageDialog(null, "密码错误!");
txtPwd.setText("");
}
}
}
if(!user) {
JOptionPane.showMessageDialog(null, "登录名错误!");
txtUser.setText("");
txtPwd.setText("");
}
}catch (SQLException e1) {
e1.printStackTrace();
}
closeDB();
}
}
} else if (source == btnReset) {
//监听到点击的按钮是重置按钮
txtUser.setText("");
txtPwd.setText("");
} else if (source == btnCancel) {
//监听到点击的按钮是取消按钮
System.exit(0);
}
}
}
4、运行测试
(1)数据库设计和编程规范
(2)界面设计
(3)系统首页(包括个人信息查看和修改、密码修改和疫情上报三部分内容可选)
(4)个人信息的修改
(5)疫情子系统(包括学生信息管理、疫情上报情况信息管理和学院负责人信息管理三部分内容,包括各部分信息内容的增删改查。)
(6)添加疫情信息
(7)学院负责人操作界面
5、结对完成项目过程
(1)通过github进行代码的克隆、修改和提交
(2)通过qq聊天和语音进行问题探讨和技术交流
6、本次项目PSP
PSP3.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 5 | 8 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 5 | 8 |
Development | 开发 | 1008 | 1901 |
·· Analysis | 需求分析 (包括学习新技术) | 5 | 10 |
· Design Spec | · 生成设计文档 | 15 | 25 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 26 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 8 | 10 |
· Design | 具体设计 | 50 | 50 |
· Coding | 具体编码 | 500 | 680 |
· Code Review | · 代码复审 | 260 | 900 |
· Test | · 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 25 | 32 |
·· Test Report | · 测试报告 | 10 | 12 |
· Size Measurement | 计算工作量 | 5 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 10 | 15 |
7、项目总结
(1)首先分析一下psp中计划时间与实际完成任务时间的差距和原因,本次项目完成过程中更多的时间是用在了代码的复审方面,因为之前完成的项目是命令行输入的,这次改为界面之后有很多知识需要去及时的补充,而且前期因为对于结对项目的这个实质和流程并没有太掌握,两个人的交流缺乏一定的深度,所以在代码审核的时候有些问题没有积极地去跟同伴讨论耽误了太多的时间。
(2)其次就是项目的功能和实现,整体项目完成的过程还是比较艰辛的,基本功能都已实现,但是拓展的功能还没有实现,而且基本功能中要求的各部分实现的比较认真,系统实现更加细致。
(3)最后就是结对项目中对于1+1>2的感受,通过本次结对项目的整个过程,切实感受到了这种合作带来的收获,对方的观点不仅可以帮助自己发现自己学习的盲区而且对于一些问题的解决真的是事半功倍,同时在共同学习的过程中更能体会到学习的快乐,提高学习的兴趣。