張 亮,李正衛(wèi),蔣 燁
(1.浙江工業(yè)大學 管理學院, 杭州 310023; 2.浙江工業(yè)大學 經濟學院, 杭州 310023)
隨著高校經管類各專業(yè)開設的實驗課程越來越多,實驗教學所占的比重逐漸增大,如何根據(jù)課程需要合理調配有限的實驗室資源,成為當前經管類實驗室管理工作亟需解決的重要問題。傳統(tǒng)使用EXCEL電子表格記錄實驗室預約信息的方式存在操作效率低、工作量大、出錯率高等問題,經常造成課程時間沖突,上課人數(shù)與實驗室機位數(shù)量不符,實驗室軟硬件配置與教師授課需求不符,極大影響了教師與學生的課堂教學體驗。而購買廠商的相關軟件產品由于其價格昂貴,后期維護成本較高,同時又難以進行個性化定制與功能擴展,無法適應各個高校在實驗室管理工作方面的實際需求。
通過總結工作經驗,分析存在的問題,提出利用軟件工程領域的前沿技術設計與開發(fā)具有較好的可擴展性的新型經管類實驗室預約系統(tǒng),優(yōu)化實驗教學管理模式,方便教師在線進行實驗室預約,同時允許師生對實驗室硬件配置、軟件資源、數(shù)字資料、面向專業(yè)與課程安排等信息進行實時查詢。
考慮到與教務處、人事處系統(tǒng)進行對接,實現(xiàn)數(shù)據(jù)的同步與共享,以及后期的管理維護與功能擴展等需要。采用MVC設計模式,將系統(tǒng)劃分為模型、視圖、控制器三層進行分層開發(fā),實現(xiàn)數(shù)據(jù)與操作之間的解耦,提高程序代碼的復用性與可擴展能力,滿足松散耦合的設計標準[1-2]。
由于每學期的課程安排比較緊湊,教師與學生人數(shù)較多,經常會出現(xiàn)課程時間安排沖突導致教學資源浪費的情況發(fā)生[3-4]。為解決這個問題,實現(xiàn)預約沖突的智能化檢測與處理[5-6],在MVC分層開發(fā)的基礎上引入面向切面(aspect-oriented programming,AOP)設計思想,將沖突檢測程序作為通用功能從主要的業(yè)務流程中抽離出來進行模塊化封裝。在系統(tǒng)運行期,根據(jù)實際需要,通過預編譯和動態(tài)代理的方式,將沖突檢測程序自動切入當前執(zhí)行的業(yè)務處理過程中,對預約操作實行動態(tài)攔截。這種設計方式能夠有效實現(xiàn)邏輯功能的分離與解耦,避免各模塊相互之間的影響與制約,從而進一步降低程序耦合度,實現(xiàn)系統(tǒng)化、智能化管理。
MVC設計模式(Design pattern),即模型、視圖、控制器(Model、View、Controller),是將應用程序的業(yè)務邏輯層、視圖顯示層進行分層設計,并通過控制器層進行連接調度的一種開發(fā)模式,最早由Trygve Reenskaug提出,為施樂帕羅奧多研究中心(Xerox PARC)的Smalltalk面向對象編程語言所采用的一種開發(fā)模式。其意義在于實現(xiàn)用戶界面與業(yè)務邏輯的分離,提高程序代碼的靈活性與復用率[7]。
模型層(Model)表示業(yè)務數(shù)據(jù)與邏輯規(guī)則,用于實現(xiàn)數(shù)據(jù)操作與業(yè)務邏輯功能。模型層通過與數(shù)據(jù)庫進行交互,實現(xiàn)數(shù)據(jù)的讀取及寫入等操作。其相對于數(shù)據(jù)來說保持中立,即與數(shù)據(jù)格式及數(shù)據(jù)庫類型無關,無論使用哪一種數(shù)據(jù)庫,都返回相同格式的數(shù)據(jù),實現(xiàn)數(shù)據(jù)與表現(xiàn)的解耦。
視圖層(View)即用戶顯示界面,對Model返回的數(shù)據(jù)進行格式化顯示輸出,也用于收集用戶輸入信息。視圖層通過瀏覽器(Web Browser)提供與用戶進行互動交流的界面,是系統(tǒng)業(yè)務邏輯與用戶之間溝通的橋梁。視圖層的組成元素包括:HTML、JavaScript、CSS、XML、Web Services等。
控制器層(Controller)負責協(xié)調模型與視圖,即根據(jù)HTTP請求URL映射獲取當前需調用的業(yè)務邏輯方法,操作完成后選擇相應的視圖,通過渲染視圖對操作返回的數(shù)據(jù)進行格式化,最后在客戶端瀏覽器中顯示輸出,完成用戶請求。
AOP面向切面設計模式,即Aspect-Oriented Programming,將通用功能從業(yè)務邏輯程序中分離出來,對其進行獨立編碼實現(xiàn);在系統(tǒng)運行時,將獨立程序動態(tài)切入到當前操作對象的方法執(zhí)行過程中,實現(xiàn)業(yè)務功能的單獨管理與動態(tài)組合。
AOP模式允許不同業(yè)務處理程序共享相同的行為,實現(xiàn)應用程序各部分之間低耦合的分離效果,業(yè)務邏輯程序的改變不影響以AOP切面進行封裝的通用功能,從而進一步提高代碼的復用率,降低程序之間的耦合度。
AOP模式涉及到的相關概念包括切面(Aspect)、連接點(JointPoint)、處理邏輯(Advice)和切點(Pointcut)。具體含義如下:
1)切面(Aspect):是將業(yè)務程序中共同的、重復的部分進行橫向切分并單獨實現(xiàn),實現(xiàn)cross-cutting功能。
2)連接點(JointPoint):是切面嵌入業(yè)務流程的觸發(fā)點,可以是在拋出異常時,方法調用時,或者修改某個變量時插入切面代碼,執(zhí)行新的行為。當程序正常流程執(zhí)行到切面連接點時,自動調用相應的處理邏輯(Advice)。
3)處理邏輯(Advice):用于實現(xiàn)切面功能,在JointPoint處插入到業(yè)務處理流程中,并告知程序有新的行為將被執(zhí)行。
4)切點(Pointcut):用于控制在JointPoint上被調用的Advice。
經管類實驗室預約系統(tǒng)將預約沖突檢測程序以AOP面向切面的方式嵌入業(yè)務處理過程中。在執(zhí)行實驗室預約操作前,系統(tǒng)通過依賴注入方式動態(tài)切入并調用檢測程序,利用事務管理和異常處理機制,實現(xiàn)預約沖突的自動檢測,如圖1所示。

圖1 AOP面向切面設計
將沖突檢測功能從主程序中分離出來,能夠在不修改業(yè)務流程的情況下,單獨對檢測程序進行修改與補充。這樣,在開發(fā)過程中能夠實現(xiàn)合理分工,各功能模塊職責明確,避免了相互之間的影響與制約,降低維護成本,提高開發(fā)效率。
系統(tǒng)基于YII2 MVC架構搭建,在MVC分層結構的基礎上引入AOP面向切面設計理念,其具體實現(xiàn)方法是在控制器(Controller)與模型(Model)之間加入過濾器(Filter)驗證功能,當調用Action方法執(zhí)行預約操作時,先觸發(fā)行為(Behavior),在行為程序中執(zhí)行過濾器驗證,即檢測預約沖突,檢測通過則繼續(xù)執(zhí)行Action,完成預約操作;檢測未通過則停止執(zhí)行Action,將沖突信息返回給視圖。基于YII2 MVC架構的AOP模式如圖2所示。

圖2 基于YII2 MVC架構的AOP模式
行為(Behavior)是yiiaseBehavior類及其子類的實例化對象,表示方法執(zhí)行過程中自動執(zhí)行的功能程序。使用行為前,需要先將其與組件進行綁定,當組件運行時,行為將其自身所包含的屬性與方法通過動態(tài)注入的方式附加到組件上,使得在組件中運行行為就像在執(zhí)行組件自己的方法一樣。行為通過與組件的綁定能夠對觸發(fā)事件(Event)做出響應,從而實現(xiàn)對組件運行流程的動態(tài)調整。
過濾器(Filter)是在Action方法執(zhí)行前后運行的程序,通過行為(Behavior)進行調用,常用于配置控制器權限(即RBAC - Role-Based Access Control權限管理)、客戶端/頁面緩存、用戶認證、內容格式檢測、HTTP請求方式驗證、跨域資源共享等操作。過濾器包括預切入過濾器(在Action方法執(zhí)行前運行的程序)、后切入過濾器(在Action方法執(zhí)行后運行的程序)。在行為中可以部署多個過濾器,并分別將其與不同的Action方法進行綁定。過濾器的精心設計與合理利用能夠有效提升系統(tǒng)開發(fā)的靈活性,通過將多個功能封裝在不同的過濾器中,實現(xiàn)通用功能與主要業(yè)務流程之間的解耦,提高代碼復用率。
架構運行流程如下:
1)用戶通過瀏覽器發(fā)送請求,交由web/index.php入口程序處理,在入口程序中加載console.php應用配置文件,根據(jù)配置信息創(chuàng)建Application實例。
2)Application實例通過urlManager路由組件對請求URL進行解析,根據(jù)解析結果定位目標Controller類與Action方法,同時創(chuàng)建Controller實例,Controller實例調用runAction方法執(zhí)行Action。部分實現(xiàn)代碼如下:
//創(chuàng)建Controller實例
parts = this->createController(route);
if (is_array(parts)) {
list(controller, actionID) = parts;
Yii::app->controller = controller;
//執(zhí)行Action
result=controller->runAction(actionID, params);
...
}
3)當Controller實例調用runAction方法時,會首先執(zhí)行beforeAction方法,根據(jù)beforeAction的返回值決定是否繼續(xù)執(zhí)行當前的Action。
4)在beforeAction內,通過調用ensureBehaviors方法將Behavior行為綁定到Controller實例上,這樣在執(zhí)行Action前,會先觸發(fā)Behavior行為,執(zhí)行在行為中部署的過濾器(Filter)。若某個過濾器返回false,則取消執(zhí)行Action。當所有過濾器均驗證通過,則繼續(xù)執(zhí)行Action。ensureBehaviors方法實現(xiàn)代碼如下:
public function ensureBehaviors() {
if (this->_behaviors === null) {
this->_behaviors = [];
foreach (this->behaviors() as name => behavior) {
//綁定Behavior行為
this->attachBehaviorInternal(name, behavior);
}
}
}
5)過濾器驗證通過后,執(zhí)行Action方法,在Action中加載模型(Model),通過DAO數(shù)據(jù)庫訪問層對MySQL數(shù)據(jù)庫進行CRUD操作,完成業(yè)務邏輯處理操作。
6)Controller實例調用render方法渲染視圖(View),即將數(shù)據(jù)處理結果傳遞給視圖,結合Layout布局文件與Widget小部件構成完整的頁面。調用render方法的代碼如下:
return this->render('index', ['param' => '...']);
7)在Response響應對象中封裝視圖渲染結果,并以HTML格式返回給瀏覽器客戶端。
系統(tǒng)采用WAMP集成環(huán)境,實現(xiàn)APACHE、MySQL、PHP的高效整合,擺脫環(huán)境配置的煩惱,提高開發(fā)效率。WAMP集成PHPMYADMIN數(shù)據(jù)庫管理工具,允許管理者直接通過Web接口對MySQL數(shù)據(jù)庫進行操作與管理,無需安裝其他客戶端軟件。開發(fā)工具選用EDITPLUS 5.0,EDITPLUS是一款輕量級且功能強大的文本編輯器,支持語法高亮、代碼折疊等功能,具有啟動速度快、界面簡潔等特點,能夠提高程序代碼的編寫效率。
為提升系統(tǒng)性能,提高運行平臺與Windows Server操作系統(tǒng)的兼容性,采用IIS7.5作為系統(tǒng)運行平臺,通過FastCGI方式配置PHP,使得應用系統(tǒng)在IIS平臺上進行部署的同時,又能夠通過WAMP進行配置與管理。
經管類實驗室預約系統(tǒng)的功能模塊如圖3所示,主要分為實驗室管理模塊、時間管理模塊、課程管理模塊、教師管理模塊、實驗室預約模塊、沖突檢測模塊與數(shù)據(jù)同步模塊[8]。

圖3 系統(tǒng)功能設計
1)實驗室管理模塊,包括對實驗室硬件配置、軟件資源、數(shù)字資源、機位數(shù)量與當前使用情況等信息的查詢與管理,便于師生隨時隨地地了解實驗室相關信息,有利于實驗教學課程的順利進行。MySQL數(shù)據(jù)庫中提取的數(shù)據(jù)信息通過Bootstrap前端技術進行柵格式與響應式的布局排版,以適應手機、平板等移動便攜設備。
2)時間管理模塊,包括對學期信息、教學周信息、教學周日期、上課時間與上課節(jié)次等信息的查詢與管理。每學期包含16個教學周,每周包含5個教學工作日,每個工作日包含12個上課節(jié)次,上午1~5節(jié)課,下午6~9節(jié)課,晚上10~12節(jié)課。系統(tǒng)可根據(jù)學期教學周第一天的日期自動計算并生成1~16周每一天的具體日期,極大方便了管理員進行日常管理與維護,避免了手動輸入操作出錯率高且效率低的問題。
3)課程管理模塊,包括對課程信息、任課教師、授課資料、上課地點、上課人數(shù)、學生信息與專業(yè)班級等信息的查詢與管理。
4)教師管理模塊,包括對教師個人簡介、所在系部、專業(yè)背景、教學成果以及學術成就的查詢與管理,允許教師使用個人賬號登錄系統(tǒng)編輯信息,便于學生對教師有更詳細的了解。
5)實驗室預約模塊,包括預約信息查詢、預約操作管理與沖突檢測功能。允許教師根據(jù)教學計劃制定的實踐教學環(huán)節(jié)與課程實際需要,結合實驗室現(xiàn)有的軟硬件設備條件,通過系統(tǒng)提供的在線預約平臺進行實驗室預約操作。
6)數(shù)據(jù)同步模塊,實現(xiàn)課程、班級信息的定期同步更新。MySQL數(shù)據(jù)庫服務器負責與教務處等相關部門進行數(shù)據(jù)對接,利用MySQL存儲過程定期監(jiān)測教務處數(shù)據(jù)的變動情況,并根據(jù)數(shù)據(jù)變化同步更新數(shù)據(jù)信息。
實驗室預約模塊是經管類實驗室預約系統(tǒng)的核心。教師登錄系統(tǒng),通過預約表單填寫預約信息,表單元素包括機房選擇框、教學周選擇框、時間選擇框、節(jié)次選擇框、課程輸入框、學生人數(shù)輸入框等。為方便教師進行預約操作,表單設計要盡可能做到界面簡潔、功能清晰,同時能夠適應手機界面顯示。采用Bootstrap技術對HTML表單元素進行重新排版與布局,以適應教師的使用需求。實驗室預約模塊主界面如圖4所示。

圖4 實驗室預約模塊主界面
教師根據(jù)課程實際需要,選擇機房、教學周、上課時間與上課節(jié)次,輸入課程名稱、學生人數(shù)與專業(yè)班級,點擊“預約”按鈕,啟動預約處理流程。預約信息通過互聯(lián)網傳輸至服務器,在服務器內處理預約請求。
在服務器內執(zhí)行的預約操作處理流程如下:
1)調用model->validate()方法,通過Rules驗證器對預約信息各個字段的輸入值進行合法性驗證。
2)驗證通過后,運行beginTransaction()開啟事務(Transaction)。
3)在事務處理的操作序列中,執(zhí)行預約操作Action。
4)預約操作Action執(zhí)行時,會首先觸發(fā)與其綁定的Behavior行為,對Action執(zhí)行過程實施動態(tài)攔截。行為程序以AOP切面形式自動嵌入Action執(zhí)行過程中,并運行部署在行為中的沖突檢測過濾器(Filter),進行預約沖突檢測。
5)預約有沖突,則終止當前Action的執(zhí)行,拋出異常(Exception),并執(zhí)行事務回滾(rollback),取消先前執(zhí)行的所有預約操作。同時捕獲異常,顯示沖突提示信息。
6)預約無沖突,則繼續(xù)執(zhí)行預約操作Action。
7)當一次預約請求過程中的多個預約操作Action都執(zhí)行完成(未出現(xiàn)預約沖突),則調用transaction->commit()提交事務,將預約信息存入MySQL數(shù)據(jù)庫,同時更新數(shù)據(jù)緩存。
預約操作處理流程如圖5所示。

圖5 預約操作處理流程
在實驗室預約管理工作中,經常會出現(xiàn)預約時間沖突,即同一實驗室在某一時間段已存在預約,無法再次進行預約的情況。因此采用相應的沖突檢測機制,自動識別預約沖突,并在客戶端顯示提示信息,便于教師合理安排上課時間。常用的沖突檢測方式包括客戶端檢測方式與服務端檢測方式。
1)客戶端檢測方式:需要預先從數(shù)據(jù)庫中獲取已存在的實驗室預約記錄,然后在客戶端瀏覽器中利用jQuery與當前預約信息進行比較,檢測預約沖突。這種方式需要預先從服務器中獲取大量的數(shù)據(jù),對網絡帶寬有較高的要求,容易造成客戶端運行卡頓,頁面響應速度慢等問題。
2)服務端檢測方式:預約請求通過網絡傳遞給相應的Action方法,在Action方法內獲取數(shù)據(jù)庫數(shù)據(jù),執(zhí)行預約沖突檢測,如存在沖突,則返回提示信息。數(shù)據(jù)讀取和檢測處理操作都在服務器端進行,大大減少了網絡的數(shù)據(jù)傳輸量,同時由于服務器端的數(shù)據(jù)處理與運算能力遠遠超過客戶端,因此在服務器端進行檢測處理操作,效率更高,速度更快。
系統(tǒng)采用服務端檢測方式,基于AOP面向切面編程技術,在運行時動態(tài)加載檢測程序[9]。
設置命名空間namespace appcomponents,導入yiiaseActionFilter基礎類,通過繼承ActionFilter創(chuàng)建過濾器(Filter)。ActionFilter類包含beforeAction與afterAction方法,分別表示在Action執(zhí)行前與執(zhí)行后調用的代碼塊。重寫Filter的beforeAction方法,并在beforeAction方法內執(zhí)行沖突檢測程序。關鍵代碼如下:
class CheckFilter extends ActionFilter {
public function beforeAction(action) {
s_data = Yii::app->request->post();
//檢測預約沖突
cr = checkConflict(s_data);
if(cr){ //檢測無沖突
return parent::beforeAction(action);
}else{ //檢測有沖突
this->redirect([‘room/dealconflict’,’cr’=>cr]);
return false;
}
}
}
在控制器中配置行為,然后在行為中部署過濾器,通過class屬性指定當前配置的過濾器類名,再通過only屬性將過濾器與相應的Action方法進行綁定。當執(zhí)行預約操作時,觸發(fā)行為,通過行為加載并調用過濾器,執(zhí)行預約沖突檢測程序。部署過濾器的關鍵代碼如下:
public function behaviors() {
return [
[ //過濾器配置
'class'=>'appcomponentsCheckFilter',
'only'=>['reserve'],
],
];
}
預約沖突檢測程序的運行時動態(tài)加載過程如下:
1)服務端在收到教師提交的實驗室預約請求后,創(chuàng)建控制器實例,調用runAction方法。
2)在runAction內,先調用createAction方法創(chuàng)建執(zhí)行實驗室預約操作的Action動作實例,然后執(zhí)行this->beforeAction(action),此處的this表示控制器實例,運行控制器的beforeAction方法。
3)在控制器的beforeAction方法內,觸發(fā)trigger函數(shù),通過ensureBehaviors綁定行為(Behavior),即將沖突檢測程序與執(zhí)行預約操作的reserveAction動作進行綁定,實現(xiàn)AOP動態(tài)切入[10]。
4)調用ActionFilter基類中的beforeFilter方法,在beforeFilter中執(zhí)行其子類CheckFilter(自定義過濾器,部署在行為中,用于執(zhí)行預約沖突檢測)的beforeAction方法,此處的beforeAction與上述通過控制器調用的不同,通過控制器調用的beforeAction方法用于綁定行為,而通過過濾器調用的beforeAction方法用于執(zhí)行實驗室預約沖突檢測操作。
5)在CheckFilter過濾器的beforeAction方法中,調用checkConflict執(zhí)行預約沖突檢測操作,如圖6所示。

圖6 沖突檢測程序的運行時動態(tài)加載過程
系統(tǒng)提供信息查詢與線上預約等功能,允許師生在線查詢實驗室預約信息、課程信息、課程面向專業(yè)、學生人數(shù)。系統(tǒng)界面采用Bootstrap實現(xiàn),通過“教學實驗室”列表,查看實驗室各個機房的課程預約信息;通過“教學周”列表查看每周的課程安排;通過“學期”列表,查看各個學期課程預約歷史記錄。在課表頁面點擊課程名稱,彈出Modal詳情頁,顯示該課程的詳細介紹,包括:實驗大綱、實驗卡片、實驗授課計劃、實驗指導數(shù)等相關資料。實驗室預約信息查詢界面圖7所示。

圖7 實驗室預約信息查詢界面
目前,經管類實驗室預約系統(tǒng)已經在浙江工業(yè)大學管理學院與經濟學院進行了部署與應用,為師生查詢實驗室信息、教學資源、課程信息與課程安排,教師預約實驗室提供了便捷的線上服務平臺。系統(tǒng)面向專業(yè)包括國際經濟與貿易、市場營銷、旅游管理、工商管理、財務管理、信息管理與信息系統(tǒng)、金融學、工程管理等8個本科專業(yè);研究生、MBA及各類工程碩士;建筑工程學院、藥學院的一體化雙專業(yè)以及全校的經濟管理類二專業(yè)和選修課。涉及的實踐教學包括44門實驗課程、172個實驗項目、21門課程設計。通過信息化手段的使用,將管理學院與經濟學院的6個學科和8個本科專業(yè)的實驗教學納入到統(tǒng)一的實驗課程預約管理綜合平臺中,實行“大平臺,統(tǒng)一管理”。
基于當前實驗教學管理工作存在的問題,分析使用成品軟件在功能擴展與二次開發(fā)方面的短板,整合現(xiàn)有實驗教學資源,基于MVC設計模式開發(fā)經管類實驗室預約系統(tǒng),系統(tǒng)采用AOP面向切面編程技術實現(xiàn)預約沖突的動態(tài)檢測,有效避免出現(xiàn)排課沖突、重復排課等教學事故。在滿足功能需求的同時,優(yōu)化系統(tǒng)架構設計,降低各模塊之間的耦合度,提高靈活性,便于功能擴展與個性化定制。同時與本科論文管理系統(tǒng)、教師數(shù)據(jù)中心等其他應用進行無縫對接,只需登陸一個賬戶便可同時使用多項應用,方便教師開展工作。系統(tǒng)架構設計靈活,只需更改相應模塊里的功能代碼即可應用于其他行業(yè)領域,在系統(tǒng)架構優(yōu)化方面有一定的參考意義。