首页 > 技术文章 > 牛莉梅 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

niulimei 2020-03-27 17:31 原文

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12521474.html
我的课程学习目标 1、熟练博客操作
2、掌握软件项目个人开发流程
3、掌握Github的操作方法
这个作业在哪些方面帮助我实现学习目标 1、锻炼了我的动手能力,规范了我书写的代码
2、让我对软件项目个人开发流程有了简单的了解
3、熟悉了用Github发布软件项目的基本操作
结对方学号-姓名 <201771030120-王嫄>
结对方本次博客作业链接 https://www.cnblogs.com/Jenna-wang/p/12545576.html
本项目Github的仓库链接地址 https://github.com/Jenna-yuan/NWNU-WEB

任务2:

  • 两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:

    (1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。

    (2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。

    (3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。

一、结对方博客链接 请点这

二、结对方Github项目仓库链接 请点这

三、博客评论如下图:

四、代码核查表:

1.概要部分

  • 结对同学的代码基本符合需求和规格说明,无论是变量的命名,方法的命名,类的命名,以及缩进,都符合Java的编写规范,代码设计部分也考虑的比较周全,有dao层,接口层,service层,也有jsp层等,各层负责相应的功能。同时,代码有适当的注释,增加了代码的可读性,由于代码是用Java编写的,而Java是面向对象的语言,所以,结对同学的代码很容易维护,此外,我也花了很长时间一行一行仔细阅读结对同学的代码,我相信,细心和耐心是一个编码人员应该有的品质。

2.设计规范部分

  • 结对同学遵从我们所熟悉的Java框架,同时有数据库的连接,使得该系统的灵活性很强,但是,一个32位的eclipse对应一个32位的JDK,一个64位的eclipse对应一个64位的JDK,否则有可能出现eclipse与JDK不匹配的错误。有一个简单的解决办法就是eclipse上设置vm,每个Eclipse在启动时读取自己所需要的javaw.exe,即可解决多种形式的eclipse在同一环境下同时运行,eclipse提供了这样的功能,在eclipse目录有一个eclipse.ini文件,eclipse.ini文件提供Eclipse的运行的参数设置。我们只需要将vm参数设置好就可以了。如下图所示:

结对同伴所编写的代码用已有的Library中的功能实现了相应的操作,且不存在类似的功能可以调用而重新书写的情况,每一段代码都有其相应的作用,但也会有少部分注释显得多余,经过我们两人的商讨,我对结对同伴代码进行了相应的修改。

3.代码规范部分

  • eclipse有自动的排版功能,这极大的方便了我们去规范自己编写的代码,结对同学的代码符合代码规范,代码风格很好,我并未对其代码风格进行修改。

4.具体代码部分

try {
			if (StringUtils.isEmpty(student.getCode())) {
				Student student1 = (Student) session.getAttribute("USER_SESSION");
				student1.setCollege(student1.getCollege());
				student1.setClass_name(student1.getClass_name());
				student1.setTime(new Date());
				student1.setName(student1.getName());
				student1.setCode(student1.getCode());
				student1.setNumber(student1.getNumber());
				student1.setProvince(student1.getProvince());
				student1.setCity(student1.getCity());
				student1.setArea(student1.getArea());
				student1.setAn(student1.getAn());
				student1.setBn(student1.getBn());
				student1.setCn(student1.getCn());
				student1.setDn(student1.getDn());
				student1.setEn(student1.getEn());
				student1.setFn(student1.getFn());
				student1.setGn(student1.getGn());
				student1.setHn(student1.getHn());
				student1.setIn(student1.getIn());
				student1.setJn(student1.getJn());
				rows = this.studentService.insertStudent(student1);
				message = "提交成功";
			} else {
				// rows = this.studentService.updateStudent(student);
				message = "提交错误 ";
			}

			if (rows < 0) {
				message = "操作失败";
				aj.setSuccess(false);
			}
		} catch (Exception e) {
			message = "请联系管理员";
			aj.setSuccess(false);
		}
		aj.setMsg(message);
		return aj;
	}
  • 由上面代码片段可以看出,结对同伴对异常进行了处理,通过message对象来接受提示信息,但是对于具体的输入信息是否有效,比如电话号码的长度等,并未验证,我也及时的给出了意见。暂时,参数传递并未发现错误,字符串定义为了String类型,如果后续有需要,可以进行强制类型转换,结对同伴并未用到switch语句,而是使用if语句代替,针对循环部分,目前还未出现死循环的情况。并未使用断言( Assert)来保证我们认为不变的条件真的得到满足。同时,该项目数据库都是自己新建的,不会出现资源泄露等问题,具体是否对空间有优化,并未体现出来,相信这也是代码可以改进的地方。采用Java编程,定义的每一个属性都是有特定含义的,所以不存在数据结构中用不到的元素等情况。

5.效能

  • 代码的效能不是很高,因为结对同伴所编写的代码所用的测试数据也只是一小部分,并不是上万条,经测试,如果加大测试数据量,系统响应速度会很慢。由于该项目有前端界面,也有后台,在自己电脑上运行不会超时,但是在别人电脑上如何运行,是否会出现404错误?我和结对同伴就此问题也展开了讨论,讨论的结果是可能需要连接服务器等,否则会出现404错误,但是目前我们还未掌握相关的技术,于是只能将代码拷贝到自己的平台上运行,这样来说,效能就不是很好,这也是我们大家所面临的问题。

6.可读性

  • 整体来说,代码的可读性还是很好的,但是这只是针对学过Java的人来说,结对同伴的代码还涉及Javaee相关的知识,如果对这方面的知识不是很了解的话,那么结对同伴的注释应该再多一点,方便基础薄弱的同学学习。

7.可测试性

  • 如果获取到了足够多的测试数据,那么,代码的可测试性还是很高的,后续如果代码更新是在Github上面更新,如果有需要可以从上面下载和测试。

五、结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据

  • 由下图可以看出我clone了同伴代码
  • 由下图可以看到我fork了同伴的代码、并且发送了pull request给结对同伴,我push了结对同伴的请求并且Merge pull request了来自同伴的修改。

任务3

采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒

一、commit提交如下图所示,可以看到各自的提交记录和合作的过程:

二、规范文档提交如下图所示:

任务4:对任务3进行如下分析:

一、需求分析陈述。

功能性需求:

  • 普通用户需求:

    • 可以填报自己的疫情信息
    • 可以查看自己的疫情信息
  • 各二级部门疫情防控工作负责人需求:

    • 登陆
    • 可查看本部门人员疫情信息汇总
    • 【高级查询】功能进行多属性组合查询
    • 可视化统计功能(统计填报人数和未填报人数)
  • 学校防控办指定负责人需求:

    • 登陆
    • 可浏览所有人员填报汇总数据清单
    • 利用【高级查询】可进行数据组合筛选
    • 可视化统计功能(统计填报人数和未填报人数、各个学院有疫情疑似症状的人数)
    • 导出EXCEL数据
  • 非功能性需求:

    • 该系统要允许多个用户同时访问,这对系统性能要求非常高,同时要具有安全性和可维护性。

二、软件设计说明。

  • 总体框架:
    • 该软件分为两个框架,疫情上报和填报数据统计
  • 子模块设计:
    • 点击疫情上报,有三个子模块,分别是学生疫情信息上报模块和教职工疫情信息上报模块,以及管理员登陆模块。
    • 学院管理员和学校管理员可选择自己的身份进行登陆,分别浏览学院、学校的相关数据,学院负责人可以通过学号或者姓名检索相关人员的疫情信息,并且查看自己学院填报和未填报的人数,这里以饼状图的方式给出。学校负责人可浏览全校学生的疫情信息,并且可以导出相关的excel表格,同时可以通过【高级检索】(学院+有无疫情疑似症状)来检索相关数据,数据以统计图的方式给出。
  • 数据库设计:
    • 主要包含三个表:管理员表、学生表和教职工表格

三、软件实现及核心功能代码展示:软件包括哪些类,这些类分别负责什么功能,他们之间的关系怎样?类内有哪些重要的方法,关键的方法是否需要画出流程图?

  • 程序的主要类和界面如下,其中Chart是提供图表类,controller层为控制层,提供MannagerController、StudentController、TeacherController类用来控制疫情信息的填报,pojo中的Manager、Student、Teacher类报提供用户的属性等:

  • jsp界面如下:

  • 功能图如下:

  • 流程图如下:

  • 代码展示:

//教师填报
@ResponseBody
	public AjaxJson saveTeacher(Teacher teacher, HttpSession session) {
		AjaxJson aj = new AjaxJson();
		String message = "操作成功";
		Integer rows = null;
		try {
			if (StringUtils.isEmpty(teacher.getT_code())) {
				Teacher teacher1 = (Teacher) session.getAttribute("USER_SESSION");
				teacher1.setT_work_place(teacher1.getT_work_place());
				teacher1.setT_time(new Date());
				teacher1.setT_name(teacher1.getT_name());
				teacher1.setT_code(teacher1.getT_code());
				teacher1.setT_number(teacher1.getT_number());
				teacher1.setT_province(teacher1.getT_province());
				teacher1.setT_city(teacher1.getT_city());
				teacher1.setT_area(teacher1.getT_area());
				teacher1.setAm(teacher1.getAm());
				teacher1.setBm(teacher1.getBm());
				teacher1.setCm(teacher1.getCm());
				teacher1.setDm(teacher1.getDm());
				teacher1.setEm(teacher1.getEm());
				teacher1.setFm(teacher1.getFm());
				teacher1.setGm(teacher1.getGm());
				rows = this.teacherService.insertTeacher(teacher1);
				message = "提交成功";
			} else {
				// rows = this.studentService.updateStudent(student);
				message = "提交错误 ";
			}

			if (rows < 0) {
				message = "操作失败";
				aj.setSuccess(false);
			}
		} catch (Exception e) {
			message = "请联系管理员";
			aj.setSuccess(false);
		}
		aj.setMsg(message);
		return aj;
	}

四、程序运行:

  • 疫情填报系统首页:

  • 学生疫情信息填报:

  • 学生疫情信息填报成功:

  • 教职工疫情信息填报:

  • 教职工疫情信息填报成功:

  • 登陆:这里可以选择学院管理员或者学校管理员登陆

  • 二级部门疫情防控负责人(院负责人)查看本部门人员疫情汇总,这里以计工院为例:

  • 二级部门疫情防控负责人(院负责人)使用高级查询功能(学号/工号+姓名)查看人员信息,这里以16710301+刘颜星老师为例:

  • 二级部门疫情防控负责人(院负责人)查看疫情信息填报和未填报人数:

  • 学校防控办指定负责人浏览所有人员填报汇总数据

  • 学校防控办指定负责人利用【高级查询】(学院+有疫情疑似情况)查询信息:

  • 查询结果如下:

  • 学校防控办指定负责人查看各学院有疫情疑似症状的统计数据和全校疫情信息已填报和未填报人数统计数据:

  • 全校数据导出:

五、描述结对的过程,提供两人在讨论、细化和编程时的微信或QQ截图(截图要完整,能够显示结对双方姓名)

  • 此次结对,是在线上进行的,我们首先确定项目实施的计划,然后按照计划具体实施
  • 首先,我们确定编程语言以及编程环境,然后分析需求,两个人一个负责web界面部分,一个人负责数据可视化部分
  • 之后,两个人合作复审代码,共同完成此次项目。截图如下:



六、提供此次结对作业的PSP。

  • 此次作业按照PSP计划如期完成
PSP2.1 任务内容 计划共完成需要的时间(小时) 实际完成需要的时间(小时)
Planning 计划 80 87
. Estimate . 估计这个任务需要多少时间,并规划大致工作步骤 80 87
Development 开发 75 83
Analysis 需求分析 (包括学习新技术) 5 5
Design Spec 生成设计文档 10 5
Design Review 设计复审 (和同事审核设计文档) 5 10
Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 5
Design 具体设计 10 5
Coding 具体编码 20 30
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 10 13
. Reporting . 报告 5 5
Test Report 测试报告 2 3
Size Measurement 计算工作量 2 1
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 1 1

七、小结感受

俗话说人多力量大,两个人合作有很多好处,能够带来1+1>2的效果。两个人所擅长的领域不同,在合作的过程中,可以弥补对方的不足两个人思想不同,对问题有不同的理解,在合作的过程中可以创造出思想的火花,能使得问题很好的解决,通过这次合作,我也感受到了及时交流的重要性,同时,也要多听取别人给的建议,尊重别人的看法,也要多付出,只有多付出,才会有收获。需要说明的是,由于该博客背景的原因,有的地方看不太清楚,所以浏览该博客时,可以适当放大浏览器

推荐阅读