蘇婉怡,揣小龍,趙國松,王煜堯
(吉林農(nóng)業(yè)科技學(xué)院,吉林 吉林 130000)
隨著計(jì)算機(jī)軟件應(yīng)用技術(shù)在高校的普及,線上教育教學(xué)模式已成為一種新的教育手段和方法。傳統(tǒng)的筆試考試已經(jīng)難以滿足課程考試的需求,線上考試系統(tǒng)成為一種新的考試方法,一種當(dāng)前高校課程考核的新手段[1]。
線上考試已經(jīng)是一個成熟的技術(shù)領(lǐng)域,考試系統(tǒng)通過在線的方式可以隨時隨地進(jìn)行考試,不再受眾多因素約束。試卷會根據(jù)設(shè)置好的參數(shù)進(jìn)行隨機(jī)組卷,通過極簡化的操作流程減少了管理人員不必要的重復(fù)操作,后續(xù)能夠?qū)崿F(xiàn)自動化處理。
Spring Boot是基于Spring的全新單體框架,與Spring相比,集成了第三方庫配置,使搭建和開發(fā)變得更容易,讓開發(fā)人員更加注重業(yè)務(wù)模塊,增加了功能的多樣性[2]。
Spring Cloud是一套當(dāng)下流行的微服務(wù)框架,是Spring Boot的有序集合,將各個獨(dú)立的Spring Boot系統(tǒng)通過接口間的調(diào)用組合起來,形成一個微服務(wù)系統(tǒng)[3]。
通過深入分析系統(tǒng)所需的功能,發(fā)現(xiàn)使用Spring Cloud框架會更方便。各子系統(tǒng)間粘連性不高,可進(jìn)行獨(dú)立的開發(fā),更節(jié)約開發(fā)成本和時間。
首先,對系統(tǒng)功能進(jìn)行需求分析,做出功能模塊。其次,根據(jù)功能模塊得到所需的各種屬性,根據(jù)屬性做出系統(tǒng)各個功能的表。最后,為避免將多屬性寫進(jìn)一張表里出現(xiàn)錯誤,將其分為多個部分。當(dāng)有些功能需要共同使用的表的數(shù)量超過一個時,使用數(shù)據(jù)庫的左鏈接可以得到相關(guān)信息。
3.1.1 試題模塊
題庫的導(dǎo)入導(dǎo)出使用的是EasyExcel技術(shù),EasyExcel是Excel的開源項(xiàng)目,在節(jié)約內(nèi)存的條件下支持讀寫Excel。
導(dǎo)入Excel表格,前端將通過API傳值到后端,之后存入數(shù)據(jù)庫。前端即為編寫頁面,負(fù)責(zé)將文件的值傳到后端。
后端的編寫:首先,引入依賴;其次,在controller層寫一個接口承接前端傳輸?shù)臄?shù)據(jù),讀取Excel數(shù)據(jù)的方法為“ExcelUtil.readExcel(file)”;隨后通過在service 接口層中寫入這個方法的接口,實(shí)現(xiàn)類里有存入題目的方法體;最后,在dao數(shù)據(jù)層使用實(shí)現(xiàn)類中的方法體和數(shù)據(jù)的添加代碼,可以將題目存入數(shù)據(jù)庫中進(jìn)行使用。
3.1.2 試卷模塊
本系統(tǒng)具有自動組卷功能,在此功能中使用了遺傳算法。遺傳算法借鑒了達(dá)爾文進(jìn)化論中自然選擇和遺傳學(xué)中基因突變、基因重組原理的方法[4]。
(1)設(shè)試題庫中有m道題,將這m道題編為A1,A2,A3……,當(dāng)A1為1時該題被選中,A1為0時則該題未被選中。需要注意的是,編碼時應(yīng)將相同類型的題目放在一起。同時,為了避免試卷中出現(xiàn)重復(fù)的知識點(diǎn),各知識點(diǎn)在每條染色體中的編碼必須相同。
(2)生成隨機(jī)初始體Z(0),設(shè)群體規(guī)模為H,根據(jù)經(jīng)驗(yàn)或試驗(yàn)數(shù)據(jù),在100~250中確定適應(yīng)度數(shù)。
(3)將個體按照適應(yīng)度逐一遞減的順序進(jìn)行排序,如個體適應(yīng)度值沒達(dá)到規(guī)定范圍,則對該個體進(jìn)行淘汰,并從庫中選擇新的個體替代。
(4)相同題型整段進(jìn)行交叉。令RANDOM(N)為0,n的隨機(jī)數(shù)i(N為題型數(shù),i為整數(shù)),若交叉條件滿足RANDOM(N) (5)題目的適應(yīng)度值達(dá)到預(yù)先設(shè)定值時,在輸出最優(yōu)解后,算法停止。 3.1.3 防切屏模塊 為了控制切屏次數(shù),首先,要在Vue生命周期的mounted里面添加一個監(jiān)聽事件visibilitychange;其次,為事件添加一個函數(shù),在此函數(shù)中獲取頁面元素的狀態(tài)document.VisibilityState;最后,調(diào)用后臺接口,獲取在考試管理中是否設(shè)置了開啟切屏功能以及可切屏的最大次數(shù)和剩余次數(shù)的數(shù)據(jù)。 Window.addEventListener(“visibilitychage”, this.pageHidden) 上述即為添加事件監(jiān)聽頁面顯示與隱藏事件的代碼,當(dāng)頁面的內(nèi)容變得可見或者被隱藏時,就會觸發(fā)visibilitychange事件[5]。 3.1.4 答題模塊 本系統(tǒng)采用前后端分離的架構(gòu)實(shí)現(xiàn)該功能,當(dāng)用戶答完一道題后,通過API傳到后端。使用Ajax中的get,post,put等方法傳遞參數(shù),參數(shù)通常是通過juery或者是body體傳遞。 數(shù)據(jù)傳到后端業(yè)務(wù)層后,先經(jīng)由controller層,該層是控制類,是前端請求的入口,負(fù)責(zé)前后端的交互一層。隨后到達(dá)service業(yè)務(wù)層,該層包括了service接口和serviceImpl實(shí)現(xiàn)類,其中service接口可實(shí)現(xiàn)接口與實(shí)現(xiàn)類的解耦,代碼的調(diào)用先于代碼的實(shí)現(xiàn),可以先寫好接口,用于controller層的調(diào)用,后續(xù)再到實(shí)現(xiàn)類去實(shí)現(xiàn)與數(shù)據(jù)庫交互接口,編寫方法體。最后在dao層,該層Java與數(shù)據(jù)庫連接,使用實(shí)現(xiàn)類中的方法體和具體數(shù)據(jù)庫添加、修改、刪除的代碼,即可將用戶的答案存入數(shù)據(jù)庫中。 3.1.5 時間模塊 規(guī)定時間收卷是每場考試的結(jié)果,線上考試同樣也不例外。在Java中實(shí)現(xiàn)收卷功能主要應(yīng)用了具有定時調(diào)用、能固定時間執(zhí)行功能的Timer和TimerTask類。 首先,定義一個Run方法中包含任務(wù)代碼的TimerTask的子類;其次,要實(shí)例化Timer類,創(chuàng)建計(jì)時器后臺線程,將任務(wù)對象(new RemindTask () )實(shí)例化;最后,用schedule方法指定執(zhí)行計(jì)劃,用一個參數(shù)delay延遲執(zhí)行的毫秒數(shù),即在delay毫秒后第一次執(zhí)行來表示TimerTask對象,另一個參數(shù)period則是重復(fù)執(zhí)行的時間間隔,表示開始執(zhí)行前的延時時間。 3.1.6 判卷模塊 判卷的本質(zhì)是題庫中的正確答案與提交答案的對比。這個模塊在bean中實(shí)例化對象,后端controller層編寫判卷的接口。調(diào)用題庫系統(tǒng)先遍歷題庫,找到同一個題,然后使用一個增強(qiáng)for循環(huán),里面用if語句判斷題庫中的正確答案與提交的答案是否相同,相同則加分,不相同則不加分。一直重復(fù)這兩個操作完成所有題。前端顯示分?jǐn)?shù)的接口來承接后端接口,前端即可顯示用戶得分。 3.2.1 密碼模塊 考試周期較長是考試的特征。每個學(xué)生注冊賬號,難免會出現(xiàn)狀況,所以編寫密碼模塊。 用戶需要提交賬號和新密碼,前端接收到信息,通過接口將參數(shù)傳給后臺controller層。給controller類的方法創(chuàng)建外來資源訪問的名稱和相對應(yīng)的請求方法,接收到前臺傳來的賬號和密碼參數(shù)值后,生成6位隨機(jī)數(shù),并使用MD5方法對前臺傳來用戶輸入的密碼進(jìn)行加密處理,隨后再加鹽值生成出最終數(shù)據(jù)庫所需存儲的用戶密碼,將用戶新密碼的明碼和隨機(jī)生成的6位鹽值存儲于數(shù)據(jù)庫中,最后把經(jīng)過加密的密碼加入map。 3.2.2 用戶登錄模塊 為避免在考試過程中出現(xiàn)切換客戶端的情況,要保證用戶登錄的唯一性,以確??荚嚥粫霈F(xiàn)多人登錄同一個賬號,進(jìn)行多人答同一套試卷的行為,即一端登錄另一端便會強(qiáng)制下線??荚囍忻總€人都需要一個Session,人數(shù)越多對Session的需求也越多,而大量Session存在服務(wù)器上會占用許多內(nèi)存,容易使服務(wù)器崩潰而導(dǎo)致系統(tǒng)無法使用,因此使用Cookie而非Session。 登錄時以用戶的id為key在緩存中保存時間戳,在Cookie中以一個全局變量為key保存時間戳。Cookie保存在瀏覽器本地,緩存保存在服務(wù)端。用戶在另一個終端登錄,會觸發(fā)相同的代碼,更新在服務(wù)端的緩存key相同,時間戳value就會發(fā)生變化。 接下來在每個頁面的引入功能寫入功能js文件即可,寫一個實(shí)現(xiàn)每次載入頁面都會定時器10執(zhí)行的查詢后臺的flag對應(yīng)的緩存value,并與本地Cookie中的時間戳相比較,如果不一致,則說明用戶在別的客戶端登錄過,可以清空Cookie強(qiáng)制退出,由于后一次登錄更改服務(wù)器緩存的時間戳,所以前一次的登錄會被強(qiáng)制退出。 3.3.1 數(shù)據(jù)模塊 首先,在前端HTML中添加視頻上傳的頁面,在js中添加上傳視頻/圖片的方法和組件,視頻/圖片上傳的前端執(zhí)行便完成。其次,新建一個文件,寫視頻播放的頁面,再寫接口將前端的值傳到后端,在后端controller層寫兩個接口。隨后,在service業(yè)務(wù)層中,寫service接口和serviceImpl實(shí)現(xiàn)類。需要添加這兩個數(shù)據(jù)庫視頻表和圖片的實(shí)體類,這里的變量必須和數(shù)據(jù)庫的字段一樣,否則會報(bào)錯。最后,在dao層寫用于后端鏈接數(shù)據(jù)庫增、刪、改、查等操作的接口,視頻便能存入數(shù)據(jù)庫。 3.3.2 視頻模塊 編寫前端代碼。寫出進(jìn)度條模型用代碼,運(yùn)行代碼檢查是否正確,確認(rèn)無誤后將寫完的代碼放進(jìn)項(xiàng)目中,并且修改進(jìn)度條下數(shù)據(jù)的獲取途徑,改為request。 寫兩個接口,一個用于獲取進(jìn)度條數(shù)據(jù),一個用于刷新進(jìn)度條數(shù)據(jù)。前端寫好這兩個接口是實(shí)現(xiàn)前后端數(shù)據(jù)交互的過程之一。 該項(xiàng)目中的進(jìn)度條主要用來體現(xiàn)觀看視頻的進(jìn)度,而觀看視頻進(jìn)度主要代碼邏輯在于觀看的時間和視頻總時間的比較,進(jìn)度條的數(shù)據(jù)計(jì)算方式是:百分?jǐn)?shù)=(觀看的時間/視頻的總時間)×100%。在controller層中新增兩個接口接前端,隨后在service業(yè)務(wù)層中,寫service接口和serviceImpl實(shí)現(xiàn)類。最后在dao層,這層Java與數(shù)據(jù)庫連接,將進(jìn)度存入數(shù)據(jù)庫中,下次觀看時直接從上次觀看處繼續(xù)播放。 線上教育已經(jīng)成為一種新興的輔助教育模式,為了更充分地發(fā)揮線上教育優(yōu)勢,本系統(tǒng)結(jié)合線上教育的實(shí)際情況,使用前后端分離的Spring Cloud框架做了線上考試系統(tǒng)。數(shù)據(jù)處理使用Redis緩存,MySQL儲存用戶信息,保證學(xué)習(xí)和考試功能的正常運(yùn)行。在考試系統(tǒng)實(shí)現(xiàn)過程中,對關(guān)鍵問題進(jìn)行分析,并確定解決問題相關(guān)技術(shù)和方法,例如:使用了遺傳算法來自動組卷、廣度優(yōu)先遍歷題庫,哈希算法來處理密碼等,這些算法和技術(shù)為線上輔助教學(xué)及考試提供保障。雖然為系統(tǒng)順利開發(fā)實(shí)現(xiàn)做了充足的準(zhǔn)備,也具備了系統(tǒng)開發(fā)實(shí)現(xiàn)的條件,但是這些算法都只是針對客觀題設(shè)計(jì)實(shí)現(xiàn),無法完成主觀題相關(guān)解答。3.2 用戶方面
3.3 資源管理方面
4 結(jié)語