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