实验三 软件工程结对项目
项目 | 内容 |
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ |
这个作业要求链接 | https://www.cnblogs.com/nwnu-daizh/p/12521474.html |
我的课程学习目标 | 学习软件工程中结对编程(Pair programming) |
这个作业在哪些方面帮助我实现学习目标 | 软件开发流程中的结对编程的方法内容 |
结对方学号-姓名 | 王志成-2017710101 |
结对方本次博客作业链接 | |
本项目Github的仓库链接地址 | https://github.com/Wei-Ron/epidemic-user-message |
任务一 阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
任务二 两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
任务三 采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统。
- 实现功能如下:
-
该系统分为用户和管理员两部分
-
数据库如下:
-
登录界面:
-
信息填写界面
-
管理员界面
-
全部查询功能
-
分类查询功能
-
按学号查询
-
按时间查询
-
查询患病人员及生成柱状图
-
-
- 信息更新
- 信息删除
- 关键代码如下
public Logup()
{
try{
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch(ClassNotFoundException e){}
try{
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8","root","123456");
sql = con.createStatement();
}
catch(SQLException ee){}
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="退出")
{
System.exit(0);
}else if(e.getActionCommand()=="登录")
{
if(!jtf.getText().isEmpty() && !jpf.getText().isEmpty())
{
//:当点击登录按钮时,首先与数据库建立连接
//:如果选中管理员登录
if(jrb1.isSelected())
{
try {
queryman();
} catch (SQLException e1) {
//:TODO Auto-generated catch block
e1.printStackTrace();
}
//:首先判断是否存在该用户,即是否得到了密码
if(pwd ==null)
{
this.clear();
}else
{
//:调用登录方法
this.manlogin();
}
}else if(jrb2.isSelected()) //:用户登录系统
{
try {
queryuse();
} catch (SQLException e1) {
//:TODO Auto-generated catch block
e1.printStackTrace();
}
//:首先判断是否存在该用户,即是否得到了密码
if(pwd ==null)
{
this.clear();
}else
{
//:调用登录方法
this.uselogin();
}
}
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
}
}else if(e.getActionCommand()=="重置")
{
this.clear();
}
}
//:清空文本框和密码框
public void clear()
{
jtf.setText("");
jpf.setText("");
}
//:用户登录判断方法
public void uselogin()
{
if(pwd.equals(jpf.getText()))
{
JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
//:关闭当前界面
dispose();
//:创建一个新界面
Uselog usel = new Uselog();
usel.setVisible(true);
usel.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else
{
JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
//:清空输入框
this.clear();
}
}
public void queryuse() throws SQLException{
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8","root","123456");
ResultSet rs = sql.executeQuery("SELECT* FROM list_1 WHERE name='用户'");
if (rs.next()) {
userword = rs.getString(3);
pwd = rs.getString(4);
System.out.println("成功获取到密码和用户名from数据库");
System.out.println(userword + "\t" + pwd + "\t");
//:调用登录方法
}else
{
JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
}
//:管理员登录判断方法
public void manlogin()
{
if(pwd.equals(jpf.getText()))
{
JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
this.clear();
//:关闭当前界面
dispose();
//:创建一个新界面,适用于管理员来管理用户
UseManagement useM = new UseManagement();
useM.setVisible(true);
useM.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jtf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
}else if(jpf.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
}else
{
JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
//:清空输入框
this.clear();
}
}
public void queryman() throws SQLException{
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8","root","123456");
ResultSet rs = sql.executeQuery("SELECT* FROM list_1 WHERE name='管理员'");
if (rs.next()) {
//:将管理员的用户名和密码取出
userword = rs.getString(3);
pwd = rs.getString(4);
System.out.println("成功获取到密码和用户名from数据库");
System.out.println(userword + "\t" + pwd + "\t");
//:调用登录方法
}else
{
JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
}
}
public class query extends JPanel implements ActionListener{
Connection con; //与特定数据库的连接(会话)。
Statement sql; //用于执行静态 SQL 语句并返回它所生成结果的对象。
JButton b1,b2;//定义两个按钮
Object[] columns={"编号","姓名","学院","是否确诊患病","是否在武汉","是否在湖北","近期是否到达武汉","近期是否到达湖北",
"是否与武汉人员接触","是否与湖北人员接触","时间"};//字段
Object[][] data=new Object[200][11];
JTable table;
JScrollPane sc;
query (){
try{ //:错误处理机制
Class.forName("com.mysql.cj.jdbc.Driver"); //:通过 Class.forName为数据库管理系统加载一个JDBC驱动程序。
}
catch(ClassNotFoundException e){} //:如果加载驱动失败 控制台抛出异常
try{ //:如果加载驱动成功, 调用驱动连接特定数据库
con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=utf8","root","12");
sql=con.createStatement(); //:调取con成员方法获取Statement对象
}
catch(SQLException ee){}//:异常处理块
setLayout(new BorderLayout());//:布局为边框布局
JPanel p1=new JPanel();//:定义一个面板的对象为p1
table = new JTable(data, columns);
table.setPreferredScrollableViewportSize(new Dimension(400, 300));
sc = new JScrollPane(table) {
public Dimension getPreferredSize() {
return new Dimension(1300, 400);//:括号内参数,可以根据需要更改
}
};
p1.add(sc);
add(p1,"Center");
setSize(350,300);
setBackground(Color.pink);
b1=new JButton("查询全部");
b2=new JButton("清空");
//:给两个按钮添加监视器
b1.addActionListener(this);
b2.addActionListener(this);
//:将两个按钮添加到面板p1
p1.add(b1);
p1.add(b2);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b1){
try{insert();}
catch(SQLException ee){}
}
else if(e.getSource()==b2){
((DefaultTableModel) table.getModel()).getDataVector().clear(); //:清除表格数据
((DefaultTableModel) table.getModel()).fireTableDataChanged();//:通知模型更新
table.updateUI();
}
}
public void insert() throws SQLException{
int i,j;
con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/useruseUnicode=true&
characterEncoding=utf8","root","12");
ResultSet rs = sql.executeQuery("SELECT* FROM message" );
i=0;
j=0;
while(rs.next()){
data[i][j++]=rs.getString("id");
data[i][j++]=rs.getString("name");
data[i][j++]=rs.getString("college");
data[i][j++]=rs.getString("hot_message");
data[i][j++]=rs.getString("where_wuhan");
data[i][j++]=rs.getString("where_hubei");
data[i][j++]=rs.getString("come_wuhan");
data[i][j++]=rs.getString("come_hubei");
data[i][j++]=rs.getString("touch_wuhan");
data[i][j++]=rs.getString("touch_wuhan");
data[i][j]=rs.getString("time");
i++;
j=0;
}
con.close();
}
}
-
小组讨论
- 我们主要分工负责系统中用户和管理员两部分内容
- 我们主要分工负责系统中用户和管理员两部分内容
PSP | 内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 20 | 30 |
*Estimate | 预计开发时长,规划大致工作步骤 | 15 | 20 |
Development | 开发 | 400 | 500 |
*Analysis | 需求分析 (包括学习新技术) | 60 | 90 |
*Design Spec | 生成设计文档 | 30 | 30 |
*Design Review | 设计复审 (和同学审核设计文档) | 10 | 15 |
*Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
*Design | 具体设计 | 100 | 120 |
*Coding | 具体编码 | 400 | 500 |
*Code Review | 代码复审 | 60 | 30 |
*Test | 测试(自我测试,修改代码,提交修改 | 60 | 120 |
*Reporting | 报告 | 50 | 60 |
*Test Report | 测试报告 | 60 | 70 |
*Size Measurement | 计算工作量 | 5 | 5 |
*Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 30 | 30 |
总结
这次实验,我们基本上完成了一个疫情管理系统。该系统主要分为用户和管理员两个模块,用户可以对每天的个人疫情信息进行填写,并且查询自己所填报的信息,而管理员可以对所有的信息进行查询、修改、删除、更新。但是对于提醒填报的通知功能我们没有实现.但是,对于这次的工作,我还是觉得两个人协作会有更有效、更好的效果,而且和我合作的同学能力比我强,我也学习到了很多。