0.模塊
近日對在線考試系統有些想法,所以寫下來和大家討論一下,順便自己也記錄一下這些想法。
在線考試系統大致有這幾部分內容,下面逐一分析這些模塊和需求
1.試題庫
創建試題庫的意義在於根據知識點創建試題,比如創建一個期中的考試,只需要在試題庫中選擇知識點1,2。而期末考試需要選擇知識點1,2,3,4。這樣類似將試題分組更有利於試題的重復的利用,創建試卷配置中也能更快的找到試題。
然后分析一下試題的類型,實際生活中試題類型基本有這幾種:單選,判斷,多選,填空,問答,作文。前3種題型是可以通過判斷自動打分的,后三種只能通過人工閱卷。實際在線考試中很少用到后三種的試題,並且必然消耗大量的人力改卷。所以在這里只考慮單選,判斷,多選的考試試題類型。
試題選項和答案Json的形式保存在試題表中的,主要考慮到這些選項並不常用也很少關於選項的查詢,所以試題表不需要在多余的選項表,試題在編輯的和瀏覽操作可以通過反序列化json內容。最重要的是當生成試卷的時候這些選項json是要復制起來相當方便,這樣避免當試卷生成以后,試題被修改造成試卷邏輯混亂。
2.試卷配置
這個模塊是系統中最重要的模塊,配置一張試卷的流程如下 。
- 選擇考試學員或者配置為開放試卷讓學員自由進入考試(練習考試)
- 其他選項配置試卷,比如:考試開始時間,結束時間,及格分數線
- 設置考試引用的題庫。
- 設置大題和分數,比如:第一大題單選10題每題5分,第二大題單選10題每題10分
- 組卷就是將題庫的題目填充到大題中,組卷可以分自動組卷,或者手動組卷。
- 生成試卷是根據組卷配置將每張試卷的試題抽取出來,生成一個JSON結果集合。學員考試時,直接讀取這個集合。
(要注意的是,生成的試卷JSON結果集合不能修改但是可以停用試卷,防止學員考過以后的試卷被修改,造成之前的數據和當前的不匹配)
討論:在線考試系統的性能瓶頸在於,大批量學員同時開始考試時,系統配卷消耗大量的性能。我的處理方式是所有的試卷都預先生成,教師可以選擇隨機由系統組卷還是手動組卷。系統組卷設置一個組卷份數比如100份,當1000個學生同時進入考試時,將1000張試卷隨機分配一張給學員,生成的份數越多隨機率越高.如果教師只想給讓所有學員考同一份試卷,只需要手動組一張試卷即可。
3.學員
學員是參與考試的主體,學員通過注冊或者是后台導入的方式進入系統。如果是注冊還需要對應的審核功能。學員有兩種方式參加考試和練習,一種是主動選擇這張考卷,一種是被推送這張考卷,只有被推送的學生才能能參加考試。有些比較復雜的系統還會有考試的預先報名。通過審核以后才能獲取考試的權限。
學員的表結構相對簡單沒什么可討論的,只是建議學員的主表應該和登錄表分開,學員應該可以支持多種賬號登陸,比如注冊郵箱、准考證、身份證等登錄方式。
4.考試過程
這里我們從學員進入考試說起,當學員點擊進入時,隨機分配一個試卷給學員。頁面加載試卷的內容。 然后開辟一個內存空間用hash形式保存學員根據“本次考試ID_試題ID”保存學員的本次考試的答題記錄,學員每次點擊選項,都向服務器提交本題的數據,提交數據時需要帶上時間戳,防止先提交的數據后到達。當學員不小心關閉頁面,或者電腦死機重新打開瀏覽器的時候,我們將緩存中的數據顯示在頁面上,讓學員繼續考試。
改卷是一個異步的操作,后台一個C/s程序實時掃描數據庫,查找已完成答卷並且未改卷的試卷,在內存中提取學員的考試數據一一比對,評卷完成以后將內存的答題內容序列化JSON保存起來(類似試題的保存方式,也可以考慮保存成文本文件)。查看試卷時先加載試卷,然后加載學員的答卷內容。
5.Api
Api模塊通過REST的方式提供這幾個服務。
- 考試添加學員
- 查詢成績(批量或者單個)
- 創建試卷配置
- 學員獲得試卷(被推送試卷)時發郵件通知,並告知考試地址
- 提供試卷快速訪問地址,也就是學員點擊這個地址以后輸入賬號(或者SSO登錄)直接進入考試頁面