201571030115-李雪芬 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12416880.html
我的课程学习目标 通过本次实验可以对整个软件工程的过程有一个更加清楚的掌握,同时对于用到的知识加以梳理,对于一些未涉及的知识进行学习,增强自学能力和解决问题的能力。而且要更加适应这种学习模式,以更大程度的提升学习思维方法。
这个作业在哪些方面帮助我实现学习目标 首先是这个作业的完成方式,在一个整体项目的思考上,通过PSP的辅助让自己对整个工程的一个过程更加清晰,其次是这个作业的内容让我认识到软件工程和社会的当前需求紧密联系,最后就是本次作业对自身而言的难度,可以让我在挑战中收获更多。
项目Github的仓库链接地址 https://github.com/k20465/Systemjava2

实验目的

(1)掌握软件项目个人开发流程。
(2)掌握Github发布软件项目的操作方法。

实验内容

任务1:陈述学生疫情每日上报子系统使用体验;

整体体验较好,首先有清晰的图形界面,可以得知需要填写的信息,同时有些信息配置有选择项,无需自己去填写,而且对于刚开始大家提出的无法保留填写痕迹的问题很快做了改进,说明软件的可维护性很强,并且有很大的进展空间,基于目前对于软件工程的理解,在时间紧迫的条件下学校做出这样的疫情上报系统很值得肯定。

任务2:总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。

开发要求:

  • 第一类开发要求:
    有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序, 支持查询某人在某一天的疫情情况, 查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
  • 第二类开发要求:
    1. 系统可采集学生疫情有效信息;
    2. 系统支持用户在线使用;
    3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止;
    4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办;
    5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件。

阅读了邹欣老师的《构建之法》第1、2章,给了我很深的启发,尤其是对软件工程的认识,刚开始因为自身能力的不足,总觉得软件工程是一门枯燥又难学的课程,但是这本书给我的感觉很轻快,尤其是PSP这一部分的讲解,无论是团队还是个人,对于工程的认识和流程的梳理都非常重要,自己在提起了兴趣的同时,也构建了自己的PSP。

两类开发要求各有千秋,这次实践选择了第一类开发要求。

1. 需求分析

项目开发背景简介:

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

  以上是老师对本次项目开发的基本需求,提出的需求相当明确,在这里基于自己的理解做以分析:首先目前的疫情形势依旧有潜在的风险,而且学校是一个“大家庭”,为了全体师生的安全,对于学生和教职工的疫情情况统计便是迫在眉睫的事,而且现在社会各层都面临着很大的压力,作为一所有担当的高校,拿出自己的应对方案和可行的防护措施是一份责任更是一种担当。统计并上报大家的疫情情况不仅是对现在的工作负责,更是对未来安全隐患的最优防御。

2. 功能设计

基本功能:首先是应用于我们本校的系统,那么本校人员信息的采集是首要工作,基本信息比如学号和姓名可以通过不同平台间的数据连接采集,学校系统已经实现,不再赘述。其次就是每是上报系统的实现,需要实现最基本的人员出行,人员安全等信息并留存,其次是上报时间的限制功能,而对于第一类开发要求,最主要的是对于信息的查询和统计,这里首先要考虑数据库中信息的存放问题和数据量的冗余问题,其次就是程序中功能的实现。
主要需要实现功能有:
  (1) 基本信息输入保存;
  (2) 对输入信息的甄别和提取(因为是疫情统计,所以对于有疫情接触情况的要格外关注);
  (3) 对信息的查询功能,通过表中姓名和日期可以查询本人当天的疫情情况;
  (4) 实现通过某种数据对于疫情情况的查询统计(月/周);
  (5) 将统计结果用柱状图显示出来。

3. 设计实现

  (1)首先是数据的获取,我是通过先将excel表格中自己创建的数据导入到数据库中,在数据库中为各类数据设置合适的数据类型,然后在eclipse中首先建立了查询类Find.java;
  (2)此时考虑的就是怎样将java程序跟MySQL中的数据联系起来,通过查询需要在java项目中导入MySQL驱动,创建DatabaseConnection()类,用于数据库的连接,然后在java程序中加载驱动对数据库中的数据进行操作;
  (3)接下来用java代码对数据库中创建的表进行操作,首先创建一个用户学生Student()类,包括学生的学号(Ssno)、姓名(Sname)、所在学院(Scollege)、班级(Sclass)、日期(Sdata)、联系电话(Snum)、所在省份(Sprovince)、所在市(Scity)、所在区(Sarea)、是否为武汉户籍(Swuhan)、是否为留学生(Sabroad)、是否确诊(Sinfec),这些都跟数据库中表的列名一致。我的思路是先将学生类的所有功能实现了,然后教职工的所有操作只需要将数据导入,再添加身份的选项就可以实现对于不同职务的操作。
  (4)再创建一个StudentOperation类,用于操作数据库,包括以下方法
  - getInstance() //返回StudentOperation类实例的静态方法
  - saveStudent() //向数据库中加入数据(测试)
  - selectStudent() //从数据库中获取数据(测试)
  - updateStudent() //加入数据后更新数据
  - vitalStudent() //统计疫情确诊情况
  (5)创建Insert类方法实现通过控制台输入信息添加到数据库中
  (6)创建BarChart()类方法展示疫情统计情况柱状图

4. 测试运行

  (1)添加信息

  

  (2)更新信息和疫情情况统计(从更新的表中可以看到新添加的信息,同时对于确诊感染疫情的人数先做一个统计)

  

  (3)用柱状图表示疫情信息(分别表示出总人数和感染人数)

  

5. 代码片段

主要代码块

  • 连接数据库
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DatabaseConnection {

public static void main(String[] args) {
     System.out.println("连接数据库");
	 getConn();
   } 
	public static Connection getConn() {
		Connection conn = null;
		try { 
			//classLoader,加载对应驱动   
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");     
			}
		catch (ClassNotFoundException e) {   
			e.printStackTrace();   
			}  
		String url = "jdbc:sqlserver://localhost:1433;DatabaseName=SYSTEM"; 
		//数据库账户
		String username = "sa"; 
		//数据库密码 
		String password = "123456";    
		try{   
			conn = DriverManager.getConnection(url, username, password);  
			System.out.println("连接数据库成功");
			} 
		catch (SQLException e)
		{   
			e.printStackTrace(); 
		} 
		return conn;
		}
	}
  • 向数据库中添加数据

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class Insert {

	public static void main() throws SQLException, ClassNotFoundException {
		System.out.println("请输入相应信息:"); 
    	//System.out.println("学生学号	学生姓名	所在学院	所在班级	填报日期		所在省份	所在城市	所在地区	是否为武汉户籍	是否为留学生	是否确诊");
    	Scanner scan = new Scanner(System.in); 
        System.out.println("请输入学号");
        String sno=scan.nextLine();
        System.out.println("请输入姓名");
        String name=scan.nextLine();
        System.out.println("请输入学院");
        String college=scan.nextLine();
        System.out.println("请输入班级");
        String classs=scan.nextLine();
        System.out.println("请输入日期");
        String data=scan.nextLine();
        System.out.println("请输入联系方式");
        String num=scan.nextLine();
        System.out.println("请输入省份");
        String province=scan.nextLine();
        System.out.println("请输入城市");
        String city=scan.nextLine();
        System.out.println("请输入地区");
        String area=scan.nextLine();
        System.out.println("是否为武汉户籍");
        String wuhan=scan.nextLine();
        System.out.println("是否为留学生");
        String abroad=scan.nextLine();
        System.out.println("是否确诊感染");
        String infect=scan.nextLine();
        Connection conn = DatabaseConnection.getConn();
        String sql="insert into Student(Ssno,Sname,Scollege,Sclass,Sdata,Snum,Sprovince,Scity,Sarea,Swuhan,Sabroad,Sinfect) values(?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement state=conn.prepareStatement(sql);                    
        state.setString(1, sno);                                       
        state.setString(2, name);
        state.setString(3, college);
        state.setString(4, classs);
        state.setString(5, data);
        state.setString(6, num);
        state.setString(7, province);
        state.setString(8, city);
        state.setString(9, area);
        state.setString(10, wuhan);
        state.setString(11, abroad);
        state.setString(12, infect);
        
        state.execute();
        System.out.println("添加成功,请选择更新查看最新信息");
	}
}
  • 更新数据

    private static void updateStudent() { 
        Connection conn = DatabaseConnection.getConn(); 
			//StudentOperation.getInstance();
			List<Student> stuList = StudentOperation.selectStudent();
			System.out.println("学生学号		学生姓名	所在学院		所在班级		填报日期				所在省份	所在城市	所在地区	是否为武汉户籍	是否为留学生	是否确诊");
			for (Student emp : stuList) {
				System.out.print(emp.getSsno()+"	"+emp.getSname()+"	"+emp.getScollege()+"		"+emp.getSclass()+"	"+emp.getSdata()+"		"+emp.getSprovince()+"	"+emp.getScity()+"	"+emp.getSarea()+"	"+emp.getSwuhan()+"		"+emp.getSabroad()+"		"+emp.getSinfect());
				System.out.println();
				//System.out.println("数据更新成功,请选择统计查看疫情具体情况");
			}
	 }
	//从数据库中查询所有数据
	 public static List<Student> selectStudent() {       
	        List<Student> stuList = new ArrayList<Student>();
	        Connection conn = DatabaseConnection.getConn();
	        try {
	            Statement stmt = conn.createStatement();
	            //执行SQL并返回结果集
	            ResultSet rs = stmt.executeQuery("select * from Student");
	            while (rs.next()) {
	            	Student emp = new Student();
	                emp.setSsno(rs.getString("Ssno"));   
	                emp.setSname(rs.getString("Sname"));   
	                emp.setScollege(rs.getString("Scollege"));  
	                emp.setSclass(rs.getString("Sclass"));
	                emp.setSdata(rs.getString("Sdata"));
	                emp.setSnum(rs.getString("Snum"));
	                emp.setSprovince(rs.getString("Sprovince"));
	                emp.setScity(rs.getString("Scity"));
	                emp.setSarea(rs.getString("Sarea"));
	                emp.setSwuhan(rs.getString("Swuhan"));
	                emp.setSabroad(rs.getString("Sabroad"));
	                emp.setSinfect(rs.getString("Sinfect"));
	                stuList.add(emp);
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        } finally {
	            try {
	            	//关闭连接
	                conn.close();                                         
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	      //返回结果
	      return stuList;                                             
	    }

6. 总结

  本次项目实现的整个过程遇到了很多困难,对于数据库和编程的几乎完全陌生让我倍感压力,但是最深的感触就是竟然完成了,虽然结果并不是很理想,因为从一开始拿到题目就觉得这对我来说不可能完成,所以这次项目的收获特别大。首先是对软件工程项目的理解,刚开始一周没有认识到PSP的重要性几乎一无所获,直到第二次实验课经过老师的提醒和同学们的经验分享才有了一些头绪,后来根据PSP制定了基本的流程之后按任务内容划分阶段去实施,效率提高了很多,而且慢慢克服了焦燥情绪。在设计的过程中一步一步学会了程序的语法规则以及数据库语句的书写,刚开始只能实现数据的查询,始终没有实现将数据从java程序控制台能输入到数据库的表中,查询了很多方法和例子,但是因为本身出发点的不同一直被困扰,后来改变了方法,去研究实现这个过程的每一个语句,理解了基本语句的意思,自己也能构建出想要的方法来,最终实现了这个功能,但是确实不能确定自己实现的这个过程中代码有没有过于复杂或者是不符合规范的地方,希望老师可以多多指点,也特别感谢在整个过程中愿意牺牲自己的时间帮助我的同学们。最后就是实现整个项目的模块化原则的遵守,刚开始设计的时候没有考虑到这个问题,设计了多个类,在使用的时候调用起来很不方便,后来专门参考了这方面的资料,加强了模式功能的相对强度,降低了模块间接口的复杂性。

7. 展示PSP

  首先不得不再次强调一下这个Psp的重要性,有了流程就知道了下一步要怎么走,当时做计划的时候对于每一步所需的时间是完全没有标准只能按照老师给的参考数据设置,结果自己实际完成后才发现对比太大了,尤其是在编程方面,与计划的时间差距超过了一倍,以后在编程方面还是要克服畏惧心理,勇于实践。同时这个过程可以很容易发现自己哪方面的能力不足,也可以通过与别人的时间作对比,跟同学们讨论学习找出自己的不足并加以改进。

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 8 15
· Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 8 15
Development 开发 545 1326
·· Analysis 需求分析 (包括学习新技术) 8 15
· Design Spec · 生成设计文档 18 25
· Design Review · 设计复审 (和同事审核设计文档) 4 6
· Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 10
· Design 具体设计 30 50
· Coding 具体编码 400 1050
· Code Review · 代码复审 20 40
· Test · 测试(自我测试,修改代码,提交修改) 60 130
Reporting 报告 16 32
·· Test Report · 测试报告 8 12
· Size Measurement 计算工作量 3 5
· Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划 5 15
原文地址:https://www.cnblogs.com/lixuefen/p/12490768.html