- 本項目旨在設計一個簡化的企業管理信息系統(Enterprise Management Information System,EMIS)項目
2. 需求分析
2.1. 總體需求
企業管理信息系統主要用於實現對企業基本信息的管理。具體包括對企業部門的管理、對企業員工的管理,以及對管理信息系統本身的管理。
其中,對管理信息系統本身的管理主要是指對管理員的管理,這方面的需求可被歸納為管理需求,而對企業部門和員工的管理則被歸納為業務管理。2.2. 管理需求
管理需求主要包括:
- 增加管理員:根據屏幕提示依次輸入管理員的用戶名和密碼,系統自動為其分配ID號,並向用戶提供反饋信息。
- 刪除管理員:根據屏幕提示輸入欲刪除管理員的ID號,系統將該管理員刪除,並向用戶提供反饋信息。
- 列出所有管理員:系統以列表形式顯示所有管理員的ID號、用戶名和密碼。
2.3. 業務需求
業務需求主要包括:
- 部門管理包括:
- 增加部門:根據屏幕提示輸入部門名稱,系統自動為其分配ID號,並向用戶提供反饋信息。
- 刪除部門:根據屏幕提示輸入欲刪除部門的ID號,系統將該部門刪除,並向用戶提供反饋信息。
- 生成部門列表:系統以列表形式顯示所有部門的ID號、部門名稱和員工人數。
- 員工管理則包括:
- 增加員工:根據屏幕提示依次輸入員工的姓名、性別、年齡,以及所屬部門的ID號等信息,系統自動為其分配ID號,並向用戶提供反饋信息。
- 刪除員工:根據屏幕提示輸入欲刪除員工的ID號,系統將該員工刪除,並向用戶提供反饋信息。
- 修改員工信息:根據屏幕提示選擇要修改的員工信息然后並輸入,系統更新與該員工有關的信息數據,並向用戶提供反饋信息。
- 生成員工列表:根據屏幕提示輸入部門的ID號,系統以列表形式顯示該部門所有員工的ID號、姓名、性別和年齡。
- 列出所有員工:系統以列表形式顯示所有員工的部門、ID號、姓名、性別和年齡。
3. 概要設計
3.1. 總體架構
根據前述需求分析,本案在邏輯上可被划分為管理子系統和業務子系統兩大模塊,分別用於實現對管理員的管理和對部門及員工的管理功能。此外還需提供必要的數據存儲策略,以實現對所有數據的持久化。系統總體架構如圖所示:
管理子系統:實現對管理員的管理功能。具體包括增加管理員、刪除管理員、列出所有管理員。
用戶界面:顯示主菜單、接受用戶輸入、向用戶顯示提示信息、處理結果和必要的反饋。
業務邏輯:具體實現主菜單的各個功能項,以邏輯對象為載體,在用戶界面和數據訪問之間傳遞有關管理員的信息數據。
數據訪問:實現邏輯對象與數據存儲之間的序列化與反序列化。
邏輯對象:實現管理員對象的邏輯模型。
業務子系統:實現對部門及員工的管理功能。具體包括增加部門、刪除部門、列出部門、增加員工、刪除員工、修改員工信息、列出部門員工、列出所有員工。
用戶界面:顯示運營管理子菜單、接受用戶輸入、向用戶顯示提示信息、處理結果和必要的反饋。
業務邏輯:具體實現運營管理子菜單的各個功能項,以邏輯對象為載體,在用戶界面和數據訪問之間傳遞有關部門及員工的信息數據。
數據訪問:實現邏輯對象與數據存儲之間的序列化與反序列化。
邏輯對象:實現部門及員工對象的邏輯模型。
數據存儲:實現整個管理信息系統的數據持久化。3.2. 體系架構
本案在水平方向上采用三層體系架構。如圖所示:
用戶界面層:處理與最終用戶的交互,既負責從用戶處收集信息,也負責向用戶展現結果、給出提示或反饋。
業務邏輯層:針對用戶界面層所體現的功能項,以數據訪問層為基礎,實現與業務邏輯相關的算法和流程。
數據訪問層:實現對數據存儲介質的訪問,為業務邏輯層提供數據源,並接受其處理結果。3.3. 邏輯模型
本案在垂直方向上采用三層邏輯模型。如圖所示:
接口層:定義各功能模塊的抽象接口,降低模塊間的耦合性,提高代碼復用率,降低維護成本。
實現層:對抽象接口的具體實現。本案用戶界面層的接口實現擬采用控制台方式,而數據訪問層的接口實現則采用文件系統方式。
邏輯對象層:以邏輯模型的方式對系統中的相關數據加以組織,並構成從用戶界面到業務邏輯再到數據訪問各層之間的信息載體。邏輯對象包括:管理員、部門和員工。3.4. 平台約束
平台約束 說明 硬件環境 32 位 Intelx86 及其兼容處理器的個人計算機 操作系統 Ubuntu 12.04 LTS 開發工具 GCC4.6.3,C/C++標准庫 應用類型 命令行應用程序 用戶界面 非全屏模式的控制台字符界面 數據存儲 二進制及純文本文件 平台中立 不要求 交叉編譯 不要求 4. 詳細設計
4.1 管理子系統
本案管理子系統由用戶界面、業務邏輯、數據訪問和邏輯對象四部分組成。
其中用戶界面、業務邏輯和數據訪問又分別包括接口和實現兩部分。如圖所示:4.1.1. 用戶界面
4.1.1.1. 接口類:ManagerView
作為管理子系統用戶界面層的接口類,ManagerView 類被定義為純抽象類,由 4 個純虛函數組成。
- menu():顯示主菜單
- add():處理增加管理員菜單項
- del():處理刪除管理員菜單項
- list():處理列出所有管理員菜單項
4.1.1.2. 實現類:ManagerViewConsoleImpl
作為管理子系統用戶界面層的實現類,ManagerViewConsoleImpl 從純抽象類 ManagerView 繼承,並對基類中的 4 個純虛函數提供覆蓋版本。
- menu():通過控制台顯示主菜單。在一個無限循環中不停顯示菜單,接受用戶選擇,並根據用戶所選菜單項調用其它三個接口函數。當用戶選擇進入運營管理子菜單時,應創建ServiceViewConsoleImpl對象,並調用其menu()接口。當用戶選擇退出時,終止循環,返回main()函數
- add():通過控制台處理增加管理員菜單項。根據用戶輸入的管理員用戶名和密碼創建Manager對象,調用ManagerService::addManager()接口函數增加管理員
- del():通過控制台處理刪除管理員菜單項。根據用戶輸入的管理員ID號,調用ManagerService::deleteManager()接口函數刪除管理員
- list():通過控制台處理列出所有管理員菜單項。調用ManagerService::listManager()接口函數獲得管理員容器,遍歷該容器並列表顯示
- ManagerService* service:業務邏輯對象。構造函數中動態創建ManagerServiceImpl對象。
4.1.2. 業務邏輯
4.1.2.1. 接口類:ManagerService
作為管理子系統業務邏輯層的接口類,ManagerService 類被定義為純抽象類,由 3 個純虛函數組成。
- addManager():增加管理員
- deleteManager():刪除管理員
- listManager():列出所有管理員
4.1.2.2. 實現類:ManagerServiceImpl
作為管理子系統業務邏輯層的實現類,ManagerServiceImpl 從純抽象類 ManagerService 繼承,並對基類中的 3 個純虛函數提供覆蓋版本。
- addManager():增加管理員。將從參數傳入的Manager對象加入managers容器
- deleteManager():刪除管理員。從managers容器中刪除符合特定ID號的Manager對象
- listManager():列出所有管理員。返回managers容器
- ManagerDao* dao:數據訪問對象。構造函數中動態創建ManagerDaoFileImpl對象vector managers管理員對象容器。
4.1.3. 數據訪問
4.1.3.1. 接口類:ManagerDao
作為管理子系統數據訪問層的接口類,ManagerDao 類被定義為純抽象類,由 2 個純虛函數組成。
- load():從數據存儲讀取管理員信息
- save():將管理員信息寫入數據存儲
4.1.3.2. 實現類:ManagerDaoFileImpl
作為管理子系統數據訪問層的實現類,ManagerDaoFileImpl 從純抽象類 ManagerDao 繼承,並對基類中的 2 個純虛函數提供覆蓋版本。
- load():從文件讀取管理員信息。以二進制方式整塊讀取Manager對象,加入從參數傳入的管理員容器
- save():將管理員信息寫入文件。遍歷從參數傳入的管理員容器,以二進制方式整塊寫入每一個Manager對象
4.1.4. 邏輯對象
4.1.4.1. 管理員類:Manager
- int id:ID號
- char name[20]:用戶名
- char password[20]:密碼
4.2. 業務子系統
本案業務子系統由用戶界面、業務邏輯、數據訪問和邏輯對象四部分組成。
其中用戶界面、業務邏輯和數據訪問又分別包括接口和實現兩部分。如圖所示:4.2.1. 用戶界面
4.2.1.1. 接口類:ServiceView
作為業務子系統用戶界面層的接口類,ServiceView 類被定義為純抽象類,由 9 個純虛函數組成。
- menu():顯示運營管理子菜單
- addDept():處理增加部門菜單項
- deleteDept():處理刪除部門菜單項
- listDept():處理列出部門菜單項
- addEmp():處理增加員工菜單項
- deleteEmp():處理刪除員工菜單項
- modifyEmp():處理修改員工信息菜單項
- listEmp():處理列出部門員工菜單項
- listAllEmp():處理列出部門員工菜單項
4.2.1.2. 實現類:ServiceViewConsoleImpl
作為業務子系統用戶界面層的實現類,ServiceViewConsoleImpl 從純抽象類 ServiceView 繼承,並對基類中的 9 個純虛函數提供覆蓋版本。
- menu():通過控制台顯示運營管理子菜單。在一個無限循環中不停顯示菜單,接受用戶選擇,並根據用戶所選菜單項調用其它八個接口函數。當用戶選擇返回時,終止循環,返回ManagerViewConsoleImpl的menu()函數
- addDept():通過控制台處理增加部門菜單項。根據用戶輸入的部門名稱創建Department對象,調用Service::addDept()接口函數增加部門
- deleteDept():通過控制台處理刪除部門菜單項。根據用戶輸入的部門ID號,調用Service::deleteDept()接口函數刪除部門
- listDept():通過控制台處理列出部門菜單項。調用Service::listDept()接口函數獲得部門容器,遍歷該容器並列表顯示
- addEmp():通過控制台處理增加員工菜單項。根據用戶輸入的員工姓名、性別和年齡創建Employee對象。再根據用戶輸入的部門ID號,調用Service::addEmp()接口函數增加員工。
- deleteEmp():通過控制台處理刪除員工菜單項。根據用戶輸入的員工ID號,調用Service::deleteEmp()接口函數刪除部門
- modifyEmp():通過控制台處理修改員工信息菜單項。根據用戶輸入的員工姓名、性別和年齡創建Employee對象,調用Service::modifyEmp()接口函數修改員工信息
- listEmp():通過控制台處理列出部門員工菜單項。根據用戶輸入的部門ID號,調用Service::listEmp()接口函數列出部門員工
- listAllEmp():通過控制台處理列出所有員工菜單項。調用
- Service::listAllEmp():接口函數列出所有員工
- Service* m_pService:業務邏輯對象。構造函數中動態創建ServiceImpl對象
4.2.2. 業務邏輯
4.2.2.1. 接口類:Service
作為業務子系統業務邏輯層的接口類,Service 類被定義為純抽象類,由 8 個純虛函數組成。
- addDept():增加部門
- deleteDept():刪除部門
- listDept():列出部門
- addEmp():增加員工
- deleteEmp():刪除員工
- modifyEmp():修改員工信息
- listEmp():列出部門員工
- listAllEmp():列出所有員工
4.2.2.2. 實現類:ServiceImpl
作為業務子系統業務邏輯層的實現類,ServiceImpl 從純抽象類 Service 繼承,並對基類中的 8 個純虛函數提供覆蓋版本。
- addDept():增加部門。將從參數傳入的Department對象加入m_vecDepts容器
- deleteDept():刪除部門。從m_vecDepts容器中刪除符合特定ID號的Department對象
- listDept():列出部門。返回m_vecDepts容器
- addEmp():增加員工。根據部門ID號找到該員工所隸屬的部門,將參數Employee對象加入該部門的m_vecEmps容器
- deleteEmp():刪除員工。依次調用每個部門的deleteEmp()接口函數
- modifyEmp():修改員工信息。依次調用每個部門的modifyEmp()接口函數
- listEmp():列出部門員工。根據部門ID號找到相應的部門,返回該部門的m_vecEmps容器
- listAllEmp():列出所有員工。依次調用每個部門listEmp()接口函數,將處理結果匯總到一個容器中返回
- ServiceDao* m_pDao數據訪問對象。構造函數中動態創建ServiceDaoFileImpl對象
- vector m_vecDepts:部門對象容器
4.2.3. 數據訪問
4.2.3.1. 接口類:ServiceDao
作為業務子系統數據訪問層的接口類,ServiceDao 類被定義為純抽象類,由 2 個純虛函數組成。
- load():從數據存儲讀取部門及員工信息
- save():將部門及員工信息寫入數據存儲
4.2.3.2. 實現類:ServiceDaoFileImpl
作為業務子系統數據訪問層的實現類,ServiceDaoFileImpl 從純抽象類 ServiceDao 繼承,並對基類中的 2 個純虛函數提供覆蓋版本。
- load():從文件讀取部門及員工信息。以文本方式讀取全部部門和員工信息,加入從參數傳入的部門容器
- save():將部門及員工信息寫入文件。遍歷從參數傳入的部門容器,以文本方式寫入每一個部門及其所有員工的信息
4.2.4. 邏輯對象
4.2.4.1. 部門類:Department
- deleteEmp():刪除本部門的員工。根據從參數傳入的員工ID號,從m_vecEmps容器中刪除相應員工,沒找到則返回false
- listEmp():列出本部門的員工。遍歷m_vecEmps容器,將本部門的每位員工逐一加入從參數傳入的員工容器
- modifyEmp():修改本部門的員工信息。根據從參數傳入的員工對象的ID號屬性,從m_vecEmps容器中找到相應員工,更新其信息,沒找到則返回false
- int m_nId:ID號
- string m_strName:名稱
- vector m_vecEmps:員工對象容器
4.2.4.2. 員工類:Employee
- int m_nId:ID號
- string m_strName:姓名
- bool m_bGender:性別,true表示男性,false表示女性
- int m_nAge:年齡
4.3. 基礎設施及輔助工具
- generator_MgrId():生成唯一的管理員ID號。
- generator_DeptId():生成唯一的部門ID號。
- generator_EmpId():生成唯一的員工ID號。
- 注意:從id.dat配置文件中讀取上次生成的ID號,將其加1后重新寫入,同時返回新生成的ID號。*
4.4. 配置文件
- id.dat:唯一ID號配置文件。保存最后一次生成的ID號,每次新生成的ID號即在此基礎上加1。
4.5. 數據存儲
managers.dat:管理員信息數據庫。以二進制形式保存全部Manager對象
services.dat:部門及員工信息數據庫。形如:<wiz_code_mirror>11004 研發部 103
21008 王曦文 109
31009 李政 136
41010 楊超 135
51005 銷售部 102
61012 林豪 025
71006 財務部 101
81011 戚鈞恆 028
- 部門記錄,包括三個字段:部門ID號、部門名稱和該部門的員工人數。程序可以以部門員工人數字段的值作為后續讀取員工記錄的循環控制上限;
- 每個部門記錄下面緊跟着隸屬於該部門的員工記錄,包括四個字段:員工ID號、員工姓名、員工性別(1表示男性,0表示女性)和員工年齡;
- 為了便於程序通過標准I/O流進行格式化訪問,各字段之間以空格分隔。
5. 文件組織
5.1. 代碼文件
5.1.1. 管理子系統
- managerview.h:定義ManagerView抽象基類
- managerview_console_impl.h:聲明ManagerViewConsoleImpl類
- managerview_console_impl.cpp:實現ManagerViewConsoleImpl類
- managerservice.h:定義ManagerService抽象基類
- managerservice_impl.h:聲明ManagerServiceImpl類
- managerservice_impl.cpp:實現ManagerServiceImpl類
- managerdao.h:定義ManagerDao抽象基類
- managerdao_file_impl.h:聲明ManagerDaoFileImpl類
- managerdao_file_impl.cpp:實現ManagerDaoFileImpl類
- manager.h:聲明Manager類
- manager.cpp:實現Manager類
5.1.2. 業務子系統
- serviceview.h:定義ServiceView抽象基類
- serviceview_console_impl.h:聲明ServiceViewConsoleImpl類
- serviceview_console_impl.cpp:實現ServiceViewConsoleImpl類
- service.h:定義Service抽象基類
- service_impl.h:聲明ServiceImpl類
- service_impl.cpp:實現ServiceImpl類
- servicedao.h:定義ServiceDao抽象基類
- servicedao_file_impl.h:聲明ServiceDaoFileImpl類
- servicedao_file_impl.cpp:實現ServiceDaoFileImpl類
- department.h:聲明Department類
- department.cpp:實現Department類
- employee.h:聲明Employee類
- employee.cpp:實現Employee類
5.1.3. 基礎設施及輔助工具
- main.cpp:定義main()函數
- emis.h:聲明全局變量
- emis.cpp:定義全局變量
- tools.h:聲明工具函數
- tools.cpp:定義工具函數
5.2. 腳本文件
- makefile:項目制作腳本