201771010134-杨其菊 实验二 个人项目-<西北师范大学学生疫情上报系统>项目报告

实验二 软件工程准备

项目 内容
课程班级博客链接 https://www.cnblogs.com/nwnu-daizh/
作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12416880.html
我的课程学习目标 (1)学习软件工程基础概念和理论;(2)学习个人在团队中如何发挥作用;(3)团队如何更好协作;(4)熟悉项目开发的流程
这个作业在哪些方面帮助我实现课程目标 (1)掌握软件项目个人开发流程。(2)掌握Github发布软件项目的操作方法。
项目仓库Github链接 https://github.com/Tanya11010

任务1:陈述学生疫情每日上报子系统使用体验;
对于该系统我的使用体验如下:首先是使用的第一天可能由于用户访问时间点比较密集,系统很不稳定,我持续尝试了一小时都没有成功的提交信息。但由于大多数同学目前都在家,而且填报时间早上10点钟就截止,大家容易忘记上报疫情信息。不过界面简单整齐,很多问题设置“是”或“否”按钮,填写简单方便,而且学校 老师在很短的时间内做出这个子系统供我们使用,当时我还觉得挺惊讶,病情出现没多久就有这个子系统。

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

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

1.需求分析
(1)需要一个保存了100天 2000 个教职工/学生的防疫信息的数据文件;我用MySQL建立数据库保存防疫信息。
(2)设计一个命令行程序,程序可以查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况;我选择用java来写该命令行程序。
(3)用柱状图显示统计结果,可以用java中的第三方包: jfreechart-1.0.13.jar、 jcommon-1.0.16.jar、 gnujaxp.jar等来实现。

2.功能设计,获得题目需求后,要对项目做功能设计,但题目需求是项目的基本功能要求,自己思考和调研会有超出题目要求的需求,甚至你的奇思妙想会设计出特色的功能。因此,功能会有:
基本功能:
1)登录功能,用户分为两类,学生和管理员;
2)学生可填报信息;
3)学生可修改登录密码;
4)管理员可以增加、删除,修改学生填报的信息支持;
5)查询某人在某一天的疫情情况;
6)查询每月确诊新增人数的统计情况及用柱形图显示的结果
7)查询每月疑似例新增人数的统计情况及用柱形图显示的结果

3.设计实现,设计包括你会有哪些类,这些类分别负责什么功能,他们之间的关系怎样?你会设计哪些重要的函数,关键的函数是否需要画出流程图?函数之间的逻辑关系如何?(10分)
1)com.tjl.jdbc 数据库连接
JDBCUtils.java 封装JDBC工具类,连接、释放资源
2)com.tjl.view 视图包
view.java 包含各类视图菜单类
3)com.tjl.test 测试类包
JDBCUtilsTest.java 测试mysql进行语句类
ViewTest.java 测试各种视图的类
4)com.tjl.bean 用户类包
User.java 封装用户类
5)com.tjl.chart 柱形图包
Chart.java 封装柱形图类
5)创建数据库(data),数据表(info)
6)com.tjl.dao 对数据库访问的类实现
UserDao.java 借口(登录、增删、改、查)
UserDao_Imp.java 借口的实现类(mtsql具体执行)
7)Main 主程序
Main.Java 程序入口

4.测试运行,你的项目必须是可运行的,请展示项目代码的运行截图,包括题目要求实现功能对应的运行截图。这些截图说明你确实完成了项目需求,如果实现了扩展需求,也请大方秀出来。(5分)
(1)数据库

(2)登录界面

(3)学生界面

修改密码:

登录及退出

(5)管理员界面

添加信息


删除信息

修改密码

查询信息

确诊人数统计界面:

柱形图显示统计结果

疑似例统计界面:

柱形图显示统计结果:

5.粘贴自己觉得比较独特的或满意的代码片段,用博客园代码控件来显示。(提示:要有必要的注释说明,不要贴所有代码!不符合规定的要倒扣分)(5分)
数据库连接部分:

package com.tjl.jdbc;

import java.sql.DriverManager;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
/**
 * jdbc连接数据库
 * @author by yqj;
 */
public class JDBC {

	public static void main(String[] args) {		
		try {
//          加载驱动器
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("驱动加载成功");
//          连接数据库,获得连接对象conn;
//          数据库地址,账号,密码
			Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/data?useSSL=false&serverTimezone=UTC","root","root");
			System.out.println("数据库连接成功");         
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("驱动加载失败");
			System.out.println("数据库连接失败");			
		}
	}
}


改进到:


package com.tjl.jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * 自建JDBC接口,将前面的程序进行封装
 */
public class JDBCUtils {
    static Properties properties = null;
    static {
        //加载JDBCUtil类时调用
        properties = new Properties();
        try {
            String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath();
            properties.load(new FileInputStream(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static Connection getMysqlConn(){       
        try {
            //加载驱动类
            Class.forName(properties.getProperty("driver"));
            //建立连接
            return DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"), 
                    properties.getProperty("password"));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    
    //关闭资源
    public static void close(ResultSet rs, PreparedStatement ps,Connection connection){
        try {
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(ps!=null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(connection!=null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    

    
    public static void close(ResultSet rs, PreparedStatement ps){
        try {
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(ps!=null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }        
    }

    
    public static void close(PreparedStatement ps,Connection connection){

        try {
            if(ps!=null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(connection!=null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static void close(Connection connection){

        try {
            if(connection!=null){
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

6.总结:你设计的程序如何实现软件设计的“模块化”原则。

  • 将整个程序分为了视图模块、用户模块、数据库、入口程序操作等几个模块,每个模块可独立编写,每个模块可以修改同时又不需要修改系统中的其他模块。最后组装成完整的程序每个模块都是单入口和单出口,模块规模适中,如此使得程序的结构清晰,容易阅读、测试和修改。
  • java中的类、接口、对象等概念,使得我们的模块化更加容易。分类封装,一个类调用其他类中的方法,可以直接调用(静态方法),或者实例化一个类对象后再调用其中的方法。

7.展示PSP,这个环节重要的是让自己看到自己的估计和实际消耗时间,哪个环节耗时最多,哪个环节估计和实践相差巨大?为什么?(5分)
PSP:

PSP2.1 计划共需要完成时间(min) 实际完成需要的时间(min)
计划 15 30
估计这个任务需要多少时间、并规划大致工作步骤 15 30
开发 930 1175
需求分析(包括学习新技术) 30 50
生成设计文档 30 15
设计复审( 30 30
代码规范 30 20
具体设计 120 60
具体编码 600 800
测试(自我测试,修改代码,提交修改) 120 200
报告 130 140
测试报告 60 70
计算工作量 20 10
事后总结,并提出过程改进计划 50 60

测试部分的预估时间与实践实践相差较大,编写的代码问题较多,需要修改的部分较多。

任务3:完成任务2项目开发,将项目源码的完整工程文件提交到本人注册Github账号的项目仓库中。(50分)
(已成功导入到Github)

以及Github中PR流程图:

之前编写系统时,没按PSP流程做过预估和计划,尤其需求分析和功能设计部分处于模糊状态。我一般都直接开始入手写程序,写的过程才一边加入新功能模块,编写程序时一团乱,也不怎么特意做模块划分,思考需要写什么类,用什么方法,函数之间的调用方法,思路不清晰,以至于效率很低,且代码质量不高,此次实验让我熟悉了PSP流程,学会在开发前有个整体把握和设计,搞清方向,才能在入手时高效高质量的完成任务,这是我本次实验最大的收获。
总结:由于编程能力不足,我通过学习一个教学视频来做本次实验,但只实现了部分功能,在本次实验中意识到很多学习方面的问题,会在后续学习中继续努力,补上未完成功能,但第一次完成这样的实验作业,收获知识和遇到的困难都让我挫败和兴奋,只有扎做好每一步才能提高专业能力。

原文地址:https://www.cnblogs.com/yqj-yf-111/p/12508399.html