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流程,學會在開發前有個整體把握和設計,搞清方向,才能在入手時高效高質量的完成任務,這是我本次實驗最大的收獲。
總結:由於編程能力不足,我通過學習一個教學視頻來做本次實驗,但只實現了部分功能,在本次實驗中意識到很多學習方面的問題,會在后續學習中繼續努力,補上未完成功能,但第一次完成這樣的實驗作業,收獲知識和遇到的困難都讓我挫敗和興奮,只有扎做好每一步才能提高專業能力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM