張 亮,李正衛(wèi),蔣 燁
(1.浙江工業(yè)大學(xué) 管理學(xué)院, 杭州 310023; 2.浙江工業(yè)大學(xué) 經(jīng)濟(jì)學(xué)院, 杭州 310023)
隨著高校經(jīng)管類各專業(yè)開設(shè)的實(shí)驗(yàn)課程越來越多,實(shí)驗(yàn)教學(xué)所占的比重逐漸增大,如何根據(jù)課程需要合理調(diào)配有限的實(shí)驗(yàn)室資源,成為當(dāng)前經(jīng)管類實(shí)驗(yàn)室管理工作亟需解決的重要問題。傳統(tǒng)使用EXCEL電子表格記錄實(shí)驗(yàn)室預(yù)約信息的方式存在操作效率低、工作量大、出錯(cuò)率高等問題,經(jīng)常造成課程時(shí)間沖突,上課人數(shù)與實(shí)驗(yàn)室機(jī)位數(shù)量不符,實(shí)驗(yàn)室軟硬件配置與教師授課需求不符,極大影響了教師與學(xué)生的課堂教學(xué)體驗(yàn)。而購買廠商的相關(guān)軟件產(chǎn)品由于其價(jià)格昂貴,后期維護(hù)成本較高,同時(shí)又難以進(jìn)行個(gè)性化定制與功能擴(kuò)展,無法適應(yīng)各個(gè)高校在實(shí)驗(yàn)室管理工作方面的實(shí)際需求。
通過總結(jié)工作經(jīng)驗(yàn),分析存在的問題,提出利用軟件工程領(lǐng)域的前沿技術(shù)設(shè)計(jì)與開發(fā)具有較好的可擴(kuò)展性的新型經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng),優(yōu)化實(shí)驗(yàn)教學(xué)管理模式,方便教師在線進(jìn)行實(shí)驗(yàn)室預(yù)約,同時(shí)允許師生對實(shí)驗(yàn)室硬件配置、軟件資源、數(shù)字資料、面向?qū)I(yè)與課程安排等信息進(jìn)行實(shí)時(shí)查詢。
考慮到與教務(wù)處、人事處系統(tǒng)進(jìn)行對接,實(shí)現(xiàn)數(shù)據(jù)的同步與共享,以及后期的管理維護(hù)與功能擴(kuò)展等需要。采用MVC設(shè)計(jì)模式,將系統(tǒng)劃分為模型、視圖、控制器三層進(jìn)行分層開發(fā),實(shí)現(xiàn)數(shù)據(jù)與操作之間的解耦,提高程序代碼的復(fù)用性與可擴(kuò)展能力,滿足松散耦合的設(shè)計(jì)標(biāo)準(zhǔn)[1-2]。
由于每學(xué)期的課程安排比較緊湊,教師與學(xué)生人數(shù)較多,經(jīng)常會(huì)出現(xiàn)課程時(shí)間安排沖突導(dǎo)致教學(xué)資源浪費(fèi)的情況發(fā)生[3-4]。為解決這個(gè)問題,實(shí)現(xiàn)預(yù)約沖突的智能化檢測與處理[5-6],在MVC分層開發(fā)的基礎(chǔ)上引入面向切面(aspect-oriented programming,AOP)設(shè)計(jì)思想,將沖突檢測程序作為通用功能從主要的業(yè)務(wù)流程中抽離出來進(jìn)行模塊化封裝。在系統(tǒng)運(yùn)行期,根據(jù)實(shí)際需要,通過預(yù)編譯和動(dòng)態(tài)代理的方式,將沖突檢測程序自動(dòng)切入當(dāng)前執(zhí)行的業(yè)務(wù)處理過程中,對預(yù)約操作實(shí)行動(dòng)態(tài)攔截。這種設(shè)計(jì)方式能夠有效實(shí)現(xiàn)邏輯功能的分離與解耦,避免各模塊相互之間的影響與制約,從而進(jìn)一步降低程序耦合度,實(shí)現(xiàn)系統(tǒng)化、智能化管理。
MVC設(shè)計(jì)模式(Design pattern),即模型、視圖、控制器(Model、View、Controller),是將應(yīng)用程序的業(yè)務(wù)邏輯層、視圖顯示層進(jìn)行分層設(shè)計(jì),并通過控制器層進(jìn)行連接調(diào)度的一種開發(fā)模式,最早由Trygve Reenskaug提出,為施樂帕羅奧多研究中心(Xerox PARC)的Smalltalk面向?qū)ο缶幊陶Z言所采用的一種開發(fā)模式。其意義在于實(shí)現(xiàn)用戶界面與業(yè)務(wù)邏輯的分離,提高程序代碼的靈活性與復(fù)用率[7]。
模型層(Model)表示業(yè)務(wù)數(shù)據(jù)與邏輯規(guī)則,用于實(shí)現(xiàn)數(shù)據(jù)操作與業(yè)務(wù)邏輯功能。模型層通過與數(shù)據(jù)庫進(jìn)行交互,實(shí)現(xiàn)數(shù)據(jù)的讀取及寫入等操作。其相對于數(shù)據(jù)來說保持中立,即與數(shù)據(jù)格式及數(shù)據(jù)庫類型無關(guān),無論使用哪一種數(shù)據(jù)庫,都返回相同格式的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)與表現(xiàn)的解耦。
視圖層(View)即用戶顯示界面,對Model返回的數(shù)據(jù)進(jìn)行格式化顯示輸出,也用于收集用戶輸入信息。視圖層通過瀏覽器(Web Browser)提供與用戶進(jìn)行互動(dòng)交流的界面,是系統(tǒng)業(yè)務(wù)邏輯與用戶之間溝通的橋梁。視圖層的組成元素包括:HTML、JavaScript、CSS、XML、Web Services等。
控制器層(Controller)負(fù)責(zé)協(xié)調(diào)模型與視圖,即根據(jù)HTTP請求URL映射獲取當(dāng)前需調(diào)用的業(yè)務(wù)邏輯方法,操作完成后選擇相應(yīng)的視圖,通過渲染視圖對操作返回的數(shù)據(jù)進(jìn)行格式化,最后在客戶端瀏覽器中顯示輸出,完成用戶請求。
AOP面向切面設(shè)計(jì)模式,即Aspect-Oriented Programming,將通用功能從業(yè)務(wù)邏輯程序中分離出來,對其進(jìn)行獨(dú)立編碼實(shí)現(xiàn);在系統(tǒng)運(yùn)行時(shí),將獨(dú)立程序動(dòng)態(tài)切入到當(dāng)前操作對象的方法執(zhí)行過程中,實(shí)現(xiàn)業(yè)務(wù)功能的單獨(dú)管理與動(dòng)態(tài)組合。
AOP模式允許不同業(yè)務(wù)處理程序共享相同的行為,實(shí)現(xiàn)應(yīng)用程序各部分之間低耦合的分離效果,業(yè)務(wù)邏輯程序的改變不影響以AOP切面進(jìn)行封裝的通用功能,從而進(jìn)一步提高代碼的復(fù)用率,降低程序之間的耦合度。
AOP模式涉及到的相關(guān)概念包括切面(Aspect)、連接點(diǎn)(JointPoint)、處理邏輯(Advice)和切點(diǎn)(Pointcut)。具體含義如下:
1)切面(Aspect):是將業(yè)務(wù)程序中共同的、重復(fù)的部分進(jìn)行橫向切分并單獨(dú)實(shí)現(xiàn),實(shí)現(xiàn)cross-cutting功能。
2)連接點(diǎn)(JointPoint):是切面嵌入業(yè)務(wù)流程的觸發(fā)點(diǎn),可以是在拋出異常時(shí),方法調(diào)用時(shí),或者修改某個(gè)變量時(shí)插入切面代碼,執(zhí)行新的行為。當(dāng)程序正常流程執(zhí)行到切面連接點(diǎn)時(shí),自動(dòng)調(diào)用相應(yīng)的處理邏輯(Advice)。
3)處理邏輯(Advice):用于實(shí)現(xiàn)切面功能,在JointPoint處插入到業(yè)務(wù)處理流程中,并告知程序有新的行為將被執(zhí)行。
4)切點(diǎn)(Pointcut):用于控制在JointPoint上被調(diào)用的Advice。
經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng)將預(yù)約沖突檢測程序以AOP面向切面的方式嵌入業(yè)務(wù)處理過程中。在執(zhí)行實(shí)驗(yàn)室預(yù)約操作前,系統(tǒng)通過依賴注入方式動(dòng)態(tài)切入并調(diào)用檢測程序,利用事務(wù)管理和異常處理機(jī)制,實(shí)現(xiàn)預(yù)約沖突的自動(dòng)檢測,如圖1所示。
圖1 AOP面向切面設(shè)計(jì)
將沖突檢測功能從主程序中分離出來,能夠在不修改業(yè)務(wù)流程的情況下,單獨(dú)對檢測程序進(jìn)行修改與補(bǔ)充。這樣,在開發(fā)過程中能夠?qū)崿F(xiàn)合理分工,各功能模塊職責(zé)明確,避免了相互之間的影響與制約,降低維護(hù)成本,提高開發(fā)效率。
系統(tǒng)基于YII2 MVC架構(gòu)搭建,在MVC分層結(jié)構(gòu)的基礎(chǔ)上引入AOP面向切面設(shè)計(jì)理念,其具體實(shí)現(xiàn)方法是在控制器(Controller)與模型(Model)之間加入過濾器(Filter)驗(yàn)證功能,當(dāng)調(diào)用Action方法執(zhí)行預(yù)約操作時(shí),先觸發(fā)行為(Behavior),在行為程序中執(zhí)行過濾器驗(yàn)證,即檢測預(yù)約沖突,檢測通過則繼續(xù)執(zhí)行Action,完成預(yù)約操作;檢測未通過則停止執(zhí)行Action,將沖突信息返回給視圖。基于YII2 MVC架構(gòu)的AOP模式如圖2所示。
圖2 基于YII2 MVC架構(gòu)的AOP模式
行為(Behavior)是yiiaseBehavior類及其子類的實(shí)例化對象,表示方法執(zhí)行過程中自動(dòng)執(zhí)行的功能程序。使用行為前,需要先將其與組件進(jìn)行綁定,當(dāng)組件運(yùn)行時(shí),行為將其自身所包含的屬性與方法通過動(dòng)態(tài)注入的方式附加到組件上,使得在組件中運(yùn)行行為就像在執(zhí)行組件自己的方法一樣。行為通過與組件的綁定能夠?qū)τ|發(fā)事件(Event)做出響應(yīng),從而實(shí)現(xiàn)對組件運(yùn)行流程的動(dòng)態(tài)調(diào)整。
過濾器(Filter)是在Action方法執(zhí)行前后運(yùn)行的程序,通過行為(Behavior)進(jìn)行調(diào)用,常用于配置控制器權(quán)限(即RBAC - Role-Based Access Control權(quán)限管理)、客戶端/頁面緩存、用戶認(rèn)證、內(nèi)容格式檢測、HTTP請求方式驗(yàn)證、跨域資源共享等操作。過濾器包括預(yù)切入過濾器(在Action方法執(zhí)行前運(yùn)行的程序)、后切入過濾器(在Action方法執(zhí)行后運(yùn)行的程序)。在行為中可以部署多個(gè)過濾器,并分別將其與不同的Action方法進(jìn)行綁定。過濾器的精心設(shè)計(jì)與合理利用能夠有效提升系統(tǒng)開發(fā)的靈活性,通過將多個(gè)功能封裝在不同的過濾器中,實(shí)現(xiàn)通用功能與主要業(yè)務(wù)流程之間的解耦,提高代碼復(fù)用率。
架構(gòu)運(yùn)行流程如下:
1)用戶通過瀏覽器發(fā)送請求,交由web/index.php入口程序處理,在入口程序中加載console.php應(yīng)用配置文件,根據(jù)配置信息創(chuàng)建Application實(shí)例。
2)Application實(shí)例通過urlManager路由組件對請求URL進(jìn)行解析,根據(jù)解析結(jié)果定位目標(biāo)Controller類與Action方法,同時(shí)創(chuàng)建Controller實(shí)例,Controller實(shí)例調(diào)用runAction方法執(zhí)行Action。部分實(shí)現(xiàn)代碼如下:
//創(chuàng)建Controller實(shí)例
parts = this->createController(route);
if (is_array(parts)) {
list(controller, actionID) = parts;
Yii::app->controller = controller;
//執(zhí)行Action
result=controller->runAction(actionID, params);
...
}
3)當(dāng)Controller實(shí)例調(diào)用runAction方法時(shí),會(huì)首先執(zhí)行beforeAction方法,根據(jù)beforeAction的返回值決定是否繼續(xù)執(zhí)行當(dāng)前的Action。
4)在beforeAction內(nèi),通過調(diào)用ensureBehaviors方法將Behavior行為綁定到Controller實(shí)例上,這樣在執(zhí)行Action前,會(huì)先觸發(fā)Behavior行為,執(zhí)行在行為中部署的過濾器(Filter)。若某個(gè)過濾器返回false,則取消執(zhí)行Action。當(dāng)所有過濾器均驗(yàn)證通過,則繼續(xù)執(zhí)行Action。ensureBehaviors方法實(shí)現(xiàn)代碼如下:
public function ensureBehaviors() {
if (this->_behaviors === null) {
this->_behaviors = [];
foreach (this->behaviors() as name => behavior) {
//綁定Behavior行為
this->attachBehaviorInternal(name, behavior);
}
}
}
5)過濾器驗(yàn)證通過后,執(zhí)行Action方法,在Action中加載模型(Model),通過DAO數(shù)據(jù)庫訪問層對MySQL數(shù)據(jù)庫進(jìn)行CRUD操作,完成業(yè)務(wù)邏輯處理操作。
6)Controller實(shí)例調(diào)用render方法渲染視圖(View),即將數(shù)據(jù)處理結(jié)果傳遞給視圖,結(jié)合Layout布局文件與Widget小部件構(gòu)成完整的頁面。調(diào)用render方法的代碼如下:
return this->render('index', ['param' => '...']);
7)在Response響應(yīng)對象中封裝視圖渲染結(jié)果,并以HTML格式返回給瀏覽器客戶端。
系統(tǒng)采用WAMP集成環(huán)境,實(shí)現(xiàn)APACHE、MySQL、PHP的高效整合,擺脫環(huán)境配置的煩惱,提高開發(fā)效率。WAMP集成PHPMYADMIN數(shù)據(jù)庫管理工具,允許管理者直接通過Web接口對MySQL數(shù)據(jù)庫進(jìn)行操作與管理,無需安裝其他客戶端軟件。開發(fā)工具選用EDITPLUS 5.0,EDITPLUS是一款輕量級且功能強(qiáng)大的文本編輯器,支持語法高亮、代碼折疊等功能,具有啟動(dòng)速度快、界面簡潔等特點(diǎn),能夠提高程序代碼的編寫效率。
為提升系統(tǒng)性能,提高運(yùn)行平臺(tái)與Windows Server操作系統(tǒng)的兼容性,采用IIS7.5作為系統(tǒng)運(yùn)行平臺(tái),通過FastCGI方式配置PHP,使得應(yīng)用系統(tǒng)在IIS平臺(tái)上進(jìn)行部署的同時(shí),又能夠通過WAMP進(jìn)行配置與管理。
經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng)的功能模塊如圖3所示,主要分為實(shí)驗(yàn)室管理模塊、時(shí)間管理模塊、課程管理模塊、教師管理模塊、實(shí)驗(yàn)室預(yù)約模塊、沖突檢測模塊與數(shù)據(jù)同步模塊[8]。
圖3 系統(tǒng)功能設(shè)計(jì)
1)實(shí)驗(yàn)室管理模塊,包括對實(shí)驗(yàn)室硬件配置、軟件資源、數(shù)字資源、機(jī)位數(shù)量與當(dāng)前使用情況等信息的查詢與管理,便于師生隨時(shí)隨地地了解實(shí)驗(yàn)室相關(guān)信息,有利于實(shí)驗(yàn)教學(xué)課程的順利進(jìn)行。MySQL數(shù)據(jù)庫中提取的數(shù)據(jù)信息通過Bootstrap前端技術(shù)進(jìn)行柵格式與響應(yīng)式的布局排版,以適應(yīng)手機(jī)、平板等移動(dòng)便攜設(shè)備。
2)時(shí)間管理模塊,包括對學(xué)期信息、教學(xué)周信息、教學(xué)周日期、上課時(shí)間與上課節(jié)次等信息的查詢與管理。每學(xué)期包含16個(gè)教學(xué)周,每周包含5個(gè)教學(xué)工作日,每個(gè)工作日包含12個(gè)上課節(jié)次,上午1~5節(jié)課,下午6~9節(jié)課,晚上10~12節(jié)課。系統(tǒng)可根據(jù)學(xué)期教學(xué)周第一天的日期自動(dòng)計(jì)算并生成1~16周每一天的具體日期,極大方便了管理員進(jìn)行日常管理與維護(hù),避免了手動(dòng)輸入操作出錯(cuò)率高且效率低的問題。
3)課程管理模塊,包括對課程信息、任課教師、授課資料、上課地點(diǎn)、上課人數(shù)、學(xué)生信息與專業(yè)班級等信息的查詢與管理。
4)教師管理模塊,包括對教師個(gè)人簡介、所在系部、專業(yè)背景、教學(xué)成果以及學(xué)術(shù)成就的查詢與管理,允許教師使用個(gè)人賬號登錄系統(tǒng)編輯信息,便于學(xué)生對教師有更詳細(xì)的了解。
5)實(shí)驗(yàn)室預(yù)約模塊,包括預(yù)約信息查詢、預(yù)約操作管理與沖突檢測功能。允許教師根據(jù)教學(xué)計(jì)劃制定的實(shí)踐教學(xué)環(huán)節(jié)與課程實(shí)際需要,結(jié)合實(shí)驗(yàn)室現(xiàn)有的軟硬件設(shè)備條件,通過系統(tǒng)提供的在線預(yù)約平臺(tái)進(jìn)行實(shí)驗(yàn)室預(yù)約操作。
6)數(shù)據(jù)同步模塊,實(shí)現(xiàn)課程、班級信息的定期同步更新。MySQL數(shù)據(jù)庫服務(wù)器負(fù)責(zé)與教務(wù)處等相關(guān)部門進(jìn)行數(shù)據(jù)對接,利用MySQL存儲(chǔ)過程定期監(jiān)測教務(wù)處數(shù)據(jù)的變動(dòng)情況,并根據(jù)數(shù)據(jù)變化同步更新數(shù)據(jù)信息。
實(shí)驗(yàn)室預(yù)約模塊是經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng)的核心。教師登錄系統(tǒng),通過預(yù)約表單填寫預(yù)約信息,表單元素包括機(jī)房選擇框、教學(xué)周選擇框、時(shí)間選擇框、節(jié)次選擇框、課程輸入框、學(xué)生人數(shù)輸入框等。為方便教師進(jìn)行預(yù)約操作,表單設(shè)計(jì)要盡可能做到界面簡潔、功能清晰,同時(shí)能夠適應(yīng)手機(jī)界面顯示。采用Bootstrap技術(shù)對HTML表單元素進(jìn)行重新排版與布局,以適應(yīng)教師的使用需求。實(shí)驗(yàn)室預(yù)約模塊主界面如圖4所示。
圖4 實(shí)驗(yàn)室預(yù)約模塊主界面
教師根據(jù)課程實(shí)際需要,選擇機(jī)房、教學(xué)周、上課時(shí)間與上課節(jié)次,輸入課程名稱、學(xué)生人數(shù)與專業(yè)班級,點(diǎn)擊“預(yù)約”按鈕,啟動(dòng)預(yù)約處理流程。預(yù)約信息通過互聯(lián)網(wǎng)傳輸至服務(wù)器,在服務(wù)器內(nèi)處理預(yù)約請求。
在服務(wù)器內(nèi)執(zhí)行的預(yù)約操作處理流程如下:
1)調(diào)用model->validate()方法,通過Rules驗(yàn)證器對預(yù)約信息各個(gè)字段的輸入值進(jìn)行合法性驗(yàn)證。
2)驗(yàn)證通過后,運(yùn)行beginTransaction()開啟事務(wù)(Transaction)。
3)在事務(wù)處理的操作序列中,執(zhí)行預(yù)約操作Action。
4)預(yù)約操作Action執(zhí)行時(shí),會(huì)首先觸發(fā)與其綁定的Behavior行為,對Action執(zhí)行過程實(shí)施動(dòng)態(tài)攔截。行為程序以AOP切面形式自動(dòng)嵌入Action執(zhí)行過程中,并運(yùn)行部署在行為中的沖突檢測過濾器(Filter),進(jìn)行預(yù)約沖突檢測。
5)預(yù)約有沖突,則終止當(dāng)前Action的執(zhí)行,拋出異常(Exception),并執(zhí)行事務(wù)回滾(rollback),取消先前執(zhí)行的所有預(yù)約操作。同時(shí)捕獲異常,顯示沖突提示信息。
6)預(yù)約無沖突,則繼續(xù)執(zhí)行預(yù)約操作Action。
7)當(dāng)一次預(yù)約請求過程中的多個(gè)預(yù)約操作Action都執(zhí)行完成(未出現(xiàn)預(yù)約沖突),則調(diào)用transaction->commit()提交事務(wù),將預(yù)約信息存入MySQL數(shù)據(jù)庫,同時(shí)更新數(shù)據(jù)緩存。
預(yù)約操作處理流程如圖5所示。
圖5 預(yù)約操作處理流程
在實(shí)驗(yàn)室預(yù)約管理工作中,經(jīng)常會(huì)出現(xiàn)預(yù)約時(shí)間沖突,即同一實(shí)驗(yàn)室在某一時(shí)間段已存在預(yù)約,無法再次進(jìn)行預(yù)約的情況。因此采用相應(yīng)的沖突檢測機(jī)制,自動(dòng)識(shí)別預(yù)約沖突,并在客戶端顯示提示信息,便于教師合理安排上課時(shí)間。常用的沖突檢測方式包括客戶端檢測方式與服務(wù)端檢測方式。
1)客戶端檢測方式:需要預(yù)先從數(shù)據(jù)庫中獲取已存在的實(shí)驗(yàn)室預(yù)約記錄,然后在客戶端瀏覽器中利用jQuery與當(dāng)前預(yù)約信息進(jìn)行比較,檢測預(yù)約沖突。這種方式需要預(yù)先從服務(wù)器中獲取大量的數(shù)據(jù),對網(wǎng)絡(luò)帶寬有較高的要求,容易造成客戶端運(yùn)行卡頓,頁面響應(yīng)速度慢等問題。
2)服務(wù)端檢測方式:預(yù)約請求通過網(wǎng)絡(luò)傳遞給相應(yīng)的Action方法,在Action方法內(nèi)獲取數(shù)據(jù)庫數(shù)據(jù),執(zhí)行預(yù)約沖突檢測,如存在沖突,則返回提示信息。數(shù)據(jù)讀取和檢測處理操作都在服務(wù)器端進(jìn)行,大大減少了網(wǎng)絡(luò)的數(shù)據(jù)傳輸量,同時(shí)由于服務(wù)器端的數(shù)據(jù)處理與運(yùn)算能力遠(yuǎn)遠(yuǎn)超過客戶端,因此在服務(wù)器端進(jìn)行檢測處理操作,效率更高,速度更快。
系統(tǒng)采用服務(wù)端檢測方式,基于AOP面向切面編程技術(shù),在運(yùn)行時(shí)動(dòng)態(tài)加載檢測程序[9]。
設(shè)置命名空間namespace appcomponents,導(dǎo)入yiiaseActionFilter基礎(chǔ)類,通過繼承ActionFilter創(chuàng)建過濾器(Filter)。ActionFilter類包含beforeAction與afterAction方法,分別表示在Action執(zhí)行前與執(zhí)行后調(diào)用的代碼塊。重寫Filter的beforeAction方法,并在beforeAction方法內(nèi)執(zhí)行沖突檢測程序。關(guān)鍵代碼如下:
class CheckFilter extends ActionFilter {
public function beforeAction(action) {
s_data = Yii::app->request->post();
//檢測預(yù)約沖突
cr = checkConflict(s_data);
if(cr){ //檢測無沖突
return parent::beforeAction(action);
}else{ //檢測有沖突
this->redirect([‘room/dealconflict’,’cr’=>cr]);
return false;
}
}
}
在控制器中配置行為,然后在行為中部署過濾器,通過class屬性指定當(dāng)前配置的過濾器類名,再通過only屬性將過濾器與相應(yīng)的Action方法進(jìn)行綁定。當(dāng)執(zhí)行預(yù)約操作時(shí),觸發(fā)行為,通過行為加載并調(diào)用過濾器,執(zhí)行預(yù)約沖突檢測程序。部署過濾器的關(guān)鍵代碼如下:
public function behaviors() {
return [
[ //過濾器配置
'class'=>'appcomponentsCheckFilter',
'only'=>['reserve'],
],
];
}
預(yù)約沖突檢測程序的運(yùn)行時(shí)動(dòng)態(tài)加載過程如下:
1)服務(wù)端在收到教師提交的實(shí)驗(yàn)室預(yù)約請求后,創(chuàng)建控制器實(shí)例,調(diào)用runAction方法。
2)在runAction內(nèi),先調(diào)用createAction方法創(chuàng)建執(zhí)行實(shí)驗(yàn)室預(yù)約操作的Action動(dòng)作實(shí)例,然后執(zhí)行this->beforeAction(action),此處的this表示控制器實(shí)例,運(yùn)行控制器的beforeAction方法。
3)在控制器的beforeAction方法內(nèi),觸發(fā)trigger函數(shù),通過ensureBehaviors綁定行為(Behavior),即將沖突檢測程序與執(zhí)行預(yù)約操作的reserveAction動(dòng)作進(jìn)行綁定,實(shí)現(xiàn)AOP動(dòng)態(tài)切入[10]。
4)調(diào)用ActionFilter基類中的beforeFilter方法,在beforeFilter中執(zhí)行其子類CheckFilter(自定義過濾器,部署在行為中,用于執(zhí)行預(yù)約沖突檢測)的beforeAction方法,此處的beforeAction與上述通過控制器調(diào)用的不同,通過控制器調(diào)用的beforeAction方法用于綁定行為,而通過過濾器調(diào)用的beforeAction方法用于執(zhí)行實(shí)驗(yàn)室預(yù)約沖突檢測操作。
5)在CheckFilter過濾器的beforeAction方法中,調(diào)用checkConflict執(zhí)行預(yù)約沖突檢測操作,如圖6所示。
圖6 沖突檢測程序的運(yùn)行時(shí)動(dòng)態(tài)加載過程
系統(tǒng)提供信息查詢與線上預(yù)約等功能,允許師生在線查詢實(shí)驗(yàn)室預(yù)約信息、課程信息、課程面向?qū)I(yè)、學(xué)生人數(shù)。系統(tǒng)界面采用Bootstrap實(shí)現(xiàn),通過“教學(xué)實(shí)驗(yàn)室”列表,查看實(shí)驗(yàn)室各個(gè)機(jī)房的課程預(yù)約信息;通過“教學(xué)周”列表查看每周的課程安排;通過“學(xué)期”列表,查看各個(gè)學(xué)期課程預(yù)約歷史記錄。在課表頁面點(diǎn)擊課程名稱,彈出Modal詳情頁,顯示該課程的詳細(xì)介紹,包括:實(shí)驗(yàn)大綱、實(shí)驗(yàn)卡片、實(shí)驗(yàn)授課計(jì)劃、實(shí)驗(yàn)指導(dǎo)數(shù)等相關(guān)資料。實(shí)驗(yàn)室預(yù)約信息查詢界面圖7所示。
圖7 實(shí)驗(yàn)室預(yù)約信息查詢界面
目前,經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng)已經(jīng)在浙江工業(yè)大學(xué)管理學(xué)院與經(jīng)濟(jì)學(xué)院進(jìn)行了部署與應(yīng)用,為師生查詢實(shí)驗(yàn)室信息、教學(xué)資源、課程信息與課程安排,教師預(yù)約實(shí)驗(yàn)室提供了便捷的線上服務(wù)平臺(tái)。系統(tǒng)面向?qū)I(yè)包括國際經(jīng)濟(jì)與貿(mào)易、市場營銷、旅游管理、工商管理、財(cái)務(wù)管理、信息管理與信息系統(tǒng)、金融學(xué)、工程管理等8個(gè)本科專業(yè);研究生、MBA及各類工程碩士;建筑工程學(xué)院、藥學(xué)院的一體化雙專業(yè)以及全校的經(jīng)濟(jì)管理類二專業(yè)和選修課。涉及的實(shí)踐教學(xué)包括44門實(shí)驗(yàn)課程、172個(gè)實(shí)驗(yàn)項(xiàng)目、21門課程設(shè)計(jì)。通過信息化手段的使用,將管理學(xué)院與經(jīng)濟(jì)學(xué)院的6個(gè)學(xué)科和8個(gè)本科專業(yè)的實(shí)驗(yàn)教學(xué)納入到統(tǒng)一的實(shí)驗(yàn)課程預(yù)約管理綜合平臺(tái)中,實(shí)行“大平臺(tái),統(tǒng)一管理”。
基于當(dāng)前實(shí)驗(yàn)教學(xué)管理工作存在的問題,分析使用成品軟件在功能擴(kuò)展與二次開發(fā)方面的短板,整合現(xiàn)有實(shí)驗(yàn)教學(xué)資源,基于MVC設(shè)計(jì)模式開發(fā)經(jīng)管類實(shí)驗(yàn)室預(yù)約系統(tǒng),系統(tǒng)采用AOP面向切面編程技術(shù)實(shí)現(xiàn)預(yù)約沖突的動(dòng)態(tài)檢測,有效避免出現(xiàn)排課沖突、重復(fù)排課等教學(xué)事故。在滿足功能需求的同時(shí),優(yōu)化系統(tǒng)架構(gòu)設(shè)計(jì),降低各模塊之間的耦合度,提高靈活性,便于功能擴(kuò)展與個(gè)性化定制。同時(shí)與本科論文管理系統(tǒng)、教師數(shù)據(jù)中心等其他應(yīng)用進(jìn)行無縫對接,只需登陸一個(gè)賬戶便可同時(shí)使用多項(xiàng)應(yīng)用,方便教師開展工作。系統(tǒng)架構(gòu)設(shè)計(jì)靈活,只需更改相應(yīng)模塊里的功能代碼即可應(yīng)用于其他行業(yè)領(lǐng)域,在系統(tǒng)架構(gòu)優(yōu)化方面有一定的參考意義。