0. 概述
本文主要針對學生選課系統這一工程實踐項目,從設計模式、軟件架構和各類視圖角度分析了軟件系統的特點,結合項目的接口API、數據庫設計,基於上述分析,形成了該軟件系統的概念原型[1]。
對於該項目的基礎需求分析,可以參見上一文“從學生選課系統的設計中體會《從需求分析到軟件設計》”。該系統可以為學生、教師和管理員三者提供選課、退課、成績登記等功能[2]。
1. 系統架構
在系統架構方面,選課系統項目采用Web系統常用的MVC的模式開發,使用SpringMVC作為項目的主要架構。MVC模式是軟件工程中的一種軟件架構模式,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller),即MVC。下圖給出了一個通用MVC的三層架構圖。模型和視圖有着業務層面的業務數據緊密耦合關系,控制器的核心工作就是業務邏輯處理。這種架構的最大特點就是用戶界面容易隨着需求的變更而改變,可以包容需求上的變化導致修改用戶界面的程序而不變影響軟件的核心功能代碼。不難想到,鑒於MVC架構的特點,可以較為完善的解決我們的需求。
結合MVC和選課系統的業務特點,我們將系統的數據流通過的過程分為三層:視圖層、應用層和數據層。視圖層主要負責數據的展現;應用層主要負責業務邏輯處理;數據庫層負責數據的讀寫以及數據的持久化。系統架構圖、實現方案如下圖所示。由SpringMVC+MyBatis為主要框架,前端采用bootsrap框架,后端使用mysql8.0配置主從復制實現讀寫分離[3]。
2. 接口API
該項目的接口較為眾多且繁雜,這里以學生登錄用例為例子說明在MVC架構下的系統的接口API設計。在MVC架構下,我們采取的設計模式為“中介者模式”,其接口的UML圖如下所示:
在登錄用例中,學生模型中封裝了學生類這一數據結構,並對外提供了訪問學生類信息的接口(get,set方法)。視圖設定為登錄視圖,用於顯示登錄信息、按鈕等相關信息,完成交互。將視圖和模型聯系起來的便是登錄控制器,將從頁面獲得的賬號密碼信息在數據庫中查詢,完成核心的邏輯操作。
3. 系統視圖
3.1 執行視圖
執行視圖如系統流圖,可以較為明顯的展現了系統運行時的時序結構特點,他可以最終分解到軟件的基本元素和軟件的基本結構,可以對系統整體的業務邏輯有較為直觀的體現。下圖給出了本項目的系統視圖,從不同用戶的登錄用例開始,根據用戶的需求,系統會根據用戶的交互結果依次執行下去。
3.2 分解視圖
分解視圖通過划分軟件系統為子系統、包、類、組件等不同的系統結構,可以體現出不同的抽象層級中軟件模塊的層次化結構。下圖給出了本項目的分解視圖:我們將選課系統划分為三個子系統,即登錄子系統、選課子系統和信息子系統,對於這些子系統,又可以划分為若干類,如課程類、學生類、管理員類等。
3.3 泛化視圖
泛化視圖展現了軟件模塊之間的一般化或者具體化的關系,典型的例子就是類之間的繼承關系。如下圖所示了本項目的繼承關系,學生、教師和管理員這三種用戶類型都繼承自基本用戶,並通過課程進行相互聯系。這種視圖有利於我們了解系統的抽象層次結構,也有利於系統功能的擴展。
3.4 項目活動視圖
活動是某件事情正在進行時的狀態,它既可以是現實生活中正在進行的某一項工作,也可以是軟件系統中正在運行的某個對象的一個操作。活動具體表現為一系列動作組成的視圖,而活動圖就可以用於描述用例內部的工作流程。下圖給出了學生選課用例的活動視圖,可以看到學生用戶和管理員內部在該用例下的聯系和工作方式。
3.5 部署視圖
由SpringMVC+MyBatis為主要框架,mysql8.0配置主從復制實現讀寫分離,主機叢機分別為騰訊雲的服務器,而項目部署在阿里雲上。具體實現視圖如下所示:
3.6 工作分配視圖
工作分配視圖可以清晰的展現出項目分工。工作分配視圖有利於跟蹤不同項目團隊和成員的工作任務的進度,對於不同團隊成員所擅長的地方進行合適的分工可以較大限度的提升團隊的工作效率。下圖給出了本項目的一個工作分配視圖。
4. 數據庫設計
4.1 學生表
數據名 |
數據類型 |
數據長度 |
能否NULL |
是否為主鍵 |
備注 |
student_id |
bigint |
16 |
N |
Y |
學生id |
account |
varchar |
20 |
N |
N |
賬號 |
password |
varchar |
20 |
N |
N |
密碼 |
name |
varchar |
20 |
N |
N |
姓名 |
college |
varchar |
20 |
N |
N |
所屬學院 |
major |
varchar |
20 |
N |
N |
專業 |
phonenumber |
bigint |
16 |
Y |
N |
電話 |
|
varchar |
20 |
Y |
N |
郵箱地址 |
lesson |
set |
1000 |
Y |
N |
所選課程 |
4.2 教師表
數據名 |
數據類型 |
數據長度 |
能否NULL |
是否為主鍵 |
備注 |
Teacher_id |
bigint |
16 |
N |
Y |
教師id |
account |
varchar |
20 |
N |
N |
賬號 |
password |
varchar |
20 |
N |
N |
密碼 |
name |
varchar |
20 |
N |
N |
姓名 |
phonenumber |
bigint |
16 |
Y |
N |
電話 |
|
varchar |
20 |
Y |
N |
郵箱地址 |
college |
varchar |
20 |
Y |
N |
所屬學院 |
lesson |
set |
1000 |
Y |
N |
教學課程 |
4,3 管理員表
數據名 |
數據類型 |
數據長度 |
能否為NULL |
是否為主鍵 |
備注 |
account_id |
bigint |
16 |
N |
Y |
管理員id |
account |
varchar |
20 |
N |
N |
賬號 |
password |
varchar |
20 |
N |
N |
密碼 |
name |
varchar |
20 |
N |
N |
姓名 |
jurisdiction |
int |
16 |
N |
N |
權限等級 |
phonenumber |
bigint |
16 |
Y |
N |
電話 |
|
varchar |
20 |
Y |
N |
郵箱地址 |
4.4 課程表
數據名 |
數據類型 |
數據長度 |
能否為NULL |
是否為主鍵 |
備注 |
lesson_id |
bigint |
16 |
N |
Y |
課程id |
lesson_time |
varchar |
20 |
N |
N |
課程時間 |
lesson_name |
varchar |
20 |
N |
N |
課程名 |
teacher_id |
bigint |
16 |
N |
N |
教師id |
credit |
bigint |
16 |
N |
N |
學分 |
5. 項目實現視圖
實現視圖是描述軟件架構和源文件之間的映射關系,通常可以由軟件的項目源文件的目錄樹呈現。
下圖給出了本項目的實現視圖。回顧本項目的系統架構為MVC架構,下面就此架構說明項目的實現視圖。
模型部分由selc.sql文件和pojo文件下定義的類決定(如course、student、teacher類等),並在mapper文件夾中定義了這些類的訪問接口。
視圖部分由webapp文件夾決定,以webapp文件下的student為例,提供了各類交互方法,如退選課程、選擇課程、修改個人信息等操作:
控制器部分,以handler文件為例,其中實現了將視圖層和模型層聯系起來的眾多方法,如LoginHandler代碼中,集成了教師、學生和管理員的登錄和退出登錄的操作,這些操作完成的時候,會將模型數據和頁面顯示結合起來,即實現了MVC架構的核心功能。
public class LoginHandler { @Autowired AdminService adminServiceImpl; @Autowired StudentService studentService; @Autowired TeacherService teacherService; //管理員登錄 @RequestMapping("/adminlogin") public String loginStudent(@RequestParam("aname") String aname, @RequestParam("apassword") String apassword, Model model, HttpSession httpSession) { ... } // 管理員退出登錄 @RequestMapping("/adminlogout") public ModelAndView adminLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } // 學生登錄 @RequestMapping("/studentlogin") public ModelAndView loginStudent(@RequestParam("sid") String sid, @RequestParam("spassword") String spassword, Model model, HttpSession httpSession, HttpServletRequest httpRequest) { ... } // 學生退出登錄 @RequestMapping("/studentlogout") public ModelAndView studentLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } // 教師登錄 @RequestMapping("/teacherlogin") public ModelAndView loginTeacher(@RequestParam("tid") String tid, @RequestParam("tpassword") String tpassword, Model model, HttpSession httpSession) { ... } // 教師退出登錄 @RequestMapping("/teacherlogout") public ModelAndView teacherLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } }
6. 系統運行環境
本項目的運行環境和技術選型如下表所示:由SpringMVC+MyBatis為主要框架,mysql8.0配置主從復制實現讀寫分離,主機叢機分別為騰訊雲的服務器,而項目部署在阿里雲上。前端主要由bootstrap完成,背景用particles.js插件。數據庫交互查詢用到pagehelper分頁。
開發工具 |
Eclipse、navicat |
系統運行環境 |
JDK1.8、tomcat9.0、mysql8.0 |
前端工具 |
JavaScript、jQuery、bootstrap4、particles.js |
后端工具 |
maven、SpringMVC、MyBatis、ajax、mysql讀寫分離、mybatis分頁 |
7. 概念原型及工作機制
7.1 概念原型概念
概念是人對能代表某種事物或者發展過程的特點及其意義所形成的思維結論,而概念原型是一種虛擬化的、理想化的軟件產品形式。我們可以得到這樣的公式:概念原型=用例+數據模型。[5]
7.2 系統工作機制
概念原型需要結合具體的用例與數據模型去分析,就好像程序是由算法和數據結構兩部分組成的。
學生用戶輸入學號和密碼,登錄系統,可以點擊個人中心修改個人信息(登錄密碼、郵箱、出生年月、聯系方式等);在選課允許的時間內,選擇和退選課程,查看課表和成績,這些都是業務操作的結果。在教師用例下,教師用戶登錄后,可以查看自己的課程安排,在期末的時候也能對學生的課程進行成績評定。而對於管理員用例來說,具有最高的權限,統籌課程、用戶和成績的管理,對於這些信息進行全局的維護與增刪改查,完成相關業務工作后,管理員即可退出系統。對於這些業務操作都是經過相應的操作器,完成后端數據模型和視圖進行交互。
8. 總結
本文從系統架構為基礎,從設計模式出發,從項目的各種視圖角度分析了項目的層次角度和工作原理,結合數據庫設計、API接口設計,得出了系統的概念原型和系統的工作機制。由於本人才疏學淺,項目也處於初級階段,文章也可能存在諸多問題,還希望大家多多見諒,批評指正。
參考文獻
[1] https://gitee.com/mengning997/se/tree/master/ppt,軟件科學基礎概論
[2] https://www.cnblogs.com/cszjc/p/14076994.html,從學生選課系統的設計中體會《從需求分析到軟件設計》
[3]基於分布式緩存和消息中間件的選課系統設計與實現,陳鵬
[4] https://github.com/fuzui/StudentInfo, 基於SSM的學生信息管理系統(選課)
[5] https://gitee.com/mengning997/se/tree/master/ppt,從需求分析到軟件設計