201771010126-王燕 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12416880.html
我的课程学习目标 实现疫情上报管理系统以及学习使用github
这个作业在哪些方面帮助我实现学习目标 独立开发软件以及GitHub的使用
项目Github的仓库链接地址 https://github.com/wy-an
结对方学号-姓名 201771010124-王海珍
结对方本次作业链接 https://www.cnblogs.com/www-whz-1997/p/12586200.html
本项目Github的仓库链接地址 https://github.com/yanzhidandang/second.git

任务1:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念;

代码设计规范 代码风格规范
原则是:简明,易读,无二义性。提示:这里谈的风格是一家之言,如遇争执,关键是要本着“保持简明,让代码更容易读”的原则,看看争执中的代码规范能否让程序员们更好地理解和维护程序。 代码设计规范不光是程序书写的格式问题,而且牵涉到程序设计、模块之间的关系、设计模式等方方面面,这里又有不少内容与具体程序设计语言息息相关(如C、C++、Java、 C#),但是也有通用的原则,这里主要讨论通用的原则。如果你写的程序会被很多人使用,并且你得加班调试自己的程序,那最好还是遵守下面的规定。

代码复审

名称 形式 目的
自我复审 自己vs.自己 用同伴复审的标准来要求自己。不一-定最有效, 因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处
同伴复审 复审者vs.开发者 简便易行
团队复审 团队vs.开发者 有比较严格的规定和流程,适用于关键的代码,以及复审后不再更新的代码覆盖率高一有很多双眼睛盯着程序,但效率可能不高(全体人员都要到会)软件工程中最基本的复审手段,就是同伴复审。

结对编程概念
结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。结对编程是极端编程的组成部分。
任务2:两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价,具体要求如下:
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。

(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》

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

任务3:采用两人结对编程方式,结合我校师生疫情每日上报系统使用体验,设计开发一款符合我校疫情防控工作需求的信息系统,使之具有以下功能:
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
需求分析陈述
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
软件设计说明
(1)可采集全校各类师生员工疫情信息;
(2)各二级部门疫情防控工作负责人可查看本部门人员疫情汇总,并提供高级查询功能进行多属性组合查询和可视化统计功能;
(3)学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有人员填报汇总数据清单,利用【高级查询】可进行数据组合筛选,系统以图形化方式展示各学院已填报和未填报学生统计情况和关键疫情数据统计情况,可【导出】查询列表的EXCEL文件;
(4)人机交互界面要求GUI界面(WEB页面、APP页面都可);
(5)附加分功能:定时填报提醒
** 软件实现及核心功能代码展示**

public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
	String method = request.getParameter("method");
	if("toStudentListView".equals(method)){
		studentList(request,response);
	}else if("AddStudent".equals(method)){
		addStudent(request,response);
	}else if("StudentList".equals(method)){
		getStudentList(request,response);
	}else if("EditStudent".equals(method)){
		editStudent(request,response);
	}else if("DeleteStudent".equals(method)){
		deleteStudent(request,response);
	}
}
    private void deleteStudent(HttpServletRequest request,
		HttpServletResponse response) {
	// TODO Auto-generated method stub
	String[] ids = request.getParameterValues("ids[]");
	String idStr = "";
	for(String id : ids){
		idStr += id + ",";
	}
	idStr = idStr.substring(0, idStr.length()-1);
	StudentDao studentDao = new StudentDao();
	if(studentDao.deleteStudent(idStr)){
		try {
			response.getWriter().write("success");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			studentDao.closeCon();
		}
	}
}
private void editStudent(HttpServletRequest request,
		HttpServletResponse response) {
	// TODO Auto-generated method stub
	String name = request.getParameter("name");
	int id = Integer.parseInt(request.getParameter("id"));
	String sex = request.getParameter("sex");
	String mobile = request.getParameter("mobile");
	String temperature = request.getParameter("temperature");
	String address = request.getParameter("address");
	String hubei = request.getParameter("hubei");
	String wuhan = request.getParameter("wuhan");
	int clazzId = Integer.parseInt(request.getParameter("clazzid"));
	Student student = new Student();
	student.setClazzId(clazzId);
	student.setMobile(mobile);
	student.setName(name);
	student.setId(id);
	student.setTemperature(temperature);
	student.setAddress(address);
	student.setHubei(hubei);
	student.setWuhan(wuhan);
	student.setSex(sex);
	StudentDao studentDao = new StudentDao();
	if(studentDao.editStudent(student)){
		try {
			response.getWriter().write("success");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			studentDao.closeCon();
		}
	}
}
private void getStudentList(HttpServletRequest request,
		HttpServletResponse response) {
	// TODO Auto-generated method stub
	String name = request.getParameter("studentName");
	Integer currentPage = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page"));
	Integer pageSize = request.getParameter("rows") == null ? 999 : Integer.parseInt(request.getParameter("rows"));
	Integer clazz = request.getParameter("clazzid") == null ? 0 : Integer.parseInt(request.getParameter("clazzid"));
	//获取当前登录用户类型
	int userType = Integer.parseInt(request.getSession().getAttribute("userType").toString());
	Student student = new Student();
	student.setName(name);
	student.setClazzId(clazz);
	if(userType == 2){
		//如果是学生,只能查看自己的信息
		Student currentUser = (Student)request.getSession().getAttribute("user");
		student.setId(currentUser.getId());
	}
	StudentDao studentDao = new StudentDao();
	List<Student> clazzList = studentDao.getStudentList(student, new Page(currentPage, pageSize));
	int total = studentDao.getStudentListTotal(student);
	studentDao.closeCon();
	response.setCharacterEncoding("UTF-8");
	Map<String, Object> ret = new HashMap<String, Object>();
	ret.put("total", total);
	ret.put("rows", clazzList);
	try {
		String from = request.getParameter("from");
		if("combox".equals(from)){
			response.getWriter().write(JSONArray.fromObject(clazzList).toString());
		}else{
			response.getWriter().write(JSONObject.fromObject(ret).toString());
		}
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
private void addStudent(HttpServletRequest request,
		HttpServletResponse response) {
	// TODO Auto-generated method stub
	String name = request.getParameter("name");
	String password = request.getParameter("password");
	String sex = request.getParameter("sex");
	String mobile = request.getParameter("mobile");
	String temperature = request.getParameter("temperature");
	String address = request.getParameter("address");
	String hubei = request.getParameter("hubei");
	String wuhan = request.getParameter("wuhan");
	int clazzId = Integer.parseInt(request.getParameter("clazzid"));
	Student student = new Student();
	student.setClazzId(clazzId);
	student.setMobile(mobile);
	student.setName(name);
	student.setPassword(password);
	student.setTemperature(temperature);
	student.setAddress(address);
	student.setHubei(hubei);
	student.setWuhan(wuhan);
	student.setSex(sex);
	student.setSn(SnGenerateUtil.generateSn(clazzId));
	StudentDao studentDao = new StudentDao();
	if(studentDao.addStudent(student)){
		try {
			response.getWriter().write("success");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			studentDao.closeCon();
		}
	}
}
private void studentList(HttpServletRequest request,
		HttpServletResponse response) throws IOException {
	// TODO Auto-generated method stub
	try {
		request.getRequestDispatcher("view/studentList.jsp").forward(request, response);
	} catch (ServletException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

** 软件包括哪些类**

这些类分别负责什么功能
管理员对教师信息,学生信息,班级信息可以进行修改添加删除
关键的方法是否需要画出流程图?

程序运行
程序运行时每个功能界面截图。
系统登录界面

学生疫情管理界面登录成功

管理员登录成功界面

添加学生个人信息



对学生信息可以进行修改添加删除




对教师信息可以进行修改添加删除


对班级信息进行添加修改查询





学生修改个人密码

显示统计条状图



各个学院打卡信息




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


此次结对作业的PSP

任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
计划 20 20
估计这个任务需要多少时间,并规划大致工作步骤 30 30
需求分析 (包括学习新技术) 50 50
生成设计文档 40 40
设计复审 (和同事审核设计文档) 30 30
代码规范 (为目前的开发制定合适的规范) 20 20
具体设计 60 100
具体编码 400 650
代码复审 50 50
测试(自我测试,修改代码,提交修改) 40 40
报告 35 30
测试报告 20 20
计算工作量 20 20
事后总结 ,并提出过程改进计划 30 30

小结感受
通过本次结对编程实验,觉得两人合作能够带来1+1>2的效果,是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。在结对编程中,提出改进的意见,或将来可能出现的问题以便处理。结对编程对开发程序会增加纪律性,写出更好的代码。

原文地址:https://www.cnblogs.com/wy201771010126/p/12587412.html