金強(qiáng) 王亮 方春華
摘 要:本文詳細(xì)地闡述了基于PHP、Mysql、Smarty技術(shù)的大學(xué)計(jì)算機(jī)信息技術(shù)課程在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),作者以一次正式考試的流程介紹了系統(tǒng)數(shù)據(jù)庫(kù)中主要幾個(gè)數(shù)據(jù)表的設(shè)計(jì)和作用,剖析了在線考試組卷的方法及過(guò)程,闡述了從考生登錄、考試頁(yè)面生成、考試中頁(yè)面的檢查、試卷的提交、答案的保存、考試的評(píng)分到成績(jī)的查詢等全部過(guò)程的設(shè)計(jì)方法,以圖文并茂的方式介紹了系統(tǒng)前、后臺(tái)頁(yè)面功能設(shè)計(jì),并對(duì)整個(gè)考試系統(tǒng)的性能進(jìn)行了測(cè)試與完善。
關(guān)鍵詞:計(jì)算機(jī)信息技術(shù);PHP;Mysql;Smarty;在線考試
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):2096-1472(2018)-11-59-04
1 引言(Introduction)
當(dāng)今,計(jì)算機(jī)與信息技術(shù)的應(yīng)用已滲透到幾乎所有的學(xué)科和專業(yè),“計(jì)算機(jī)信息處理”已成為高等學(xué)校普遍開(kāi)設(shè)的公共基礎(chǔ)課[1],江蘇省每位大學(xué)生都需要參加省計(jì)算機(jī)一級(jí)統(tǒng)考,但由于省考練習(xí)系統(tǒng)機(jī)考理論部分沒(méi)有評(píng)分系統(tǒng),學(xué)生在做了理論題后不知道對(duì)錯(cuò),更沒(méi)有答案解析,因此有必要設(shè)計(jì)一個(gè)考試系統(tǒng),把歷年考試的理論試題,按照題型、分值、答案、必要的解析和最后的評(píng)分融合在一起,用這個(gè)系統(tǒng)對(duì)學(xué)生進(jìn)行理論知識(shí)的強(qiáng)化訓(xùn)練,使學(xué)生較好地掌握理論知識(shí)、通過(guò)考試,隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,基于Web的在線考試系統(tǒng)應(yīng)運(yùn)而生[2],從開(kāi)發(fā)技術(shù)的角度進(jìn)行劃分,目前的web網(wǎng)頁(yè)可以分為前端開(kāi)發(fā)和后臺(tái)的開(kāi)發(fā)[3],本系統(tǒng)基于PHP、Mysql和Smarty技術(shù),采用B/S模式,前后臺(tái)通過(guò)PHP和Smarty模板進(jìn)行數(shù)據(jù)庫(kù)操作和頁(yè)面的生成,能夠?qū)崿F(xiàn)在線考試及評(píng)分。
2 在線考試系統(tǒng)的設(shè)計(jì)(Design of online examination system)
2.1 數(shù)據(jù)庫(kù)設(shè)計(jì)
數(shù)據(jù)庫(kù)名為db_online,它主要包含以下數(shù)據(jù)表:用戶表(tb_user)、正式考試考生表(tb_examination_user)、正式考試試卷表(tb_examination)、模擬考試考生表(tb_mockexaminations_user)、模擬考試試卷表(tb_mockexaminations)、在線考生表(tb_onlineuser)、課程分類表(tb_types_course)、卷面題型分配模板表(tb_problemtemplate)、卷面總分、及格分?jǐn)?shù)線表(tb_examattribute)、試題表(tb_exam_problem)、試卷題型表(tb_exam_type)、難度系數(shù)表(tb_degree)、單項(xiàng)練習(xí)表(tb_useranswer)它們之間的關(guān)系如下圖所示:
圖1中所有表的text類型和varchar類型的字段編碼均為utf8_unicode_ci,數(shù)據(jù)庫(kù)存儲(chǔ)引擎為MyISAM,下面以計(jì)算機(jī)基礎(chǔ)課程的一次正式考試流程來(lái)介紹幾個(gè)主要數(shù)據(jù)表(以下簡(jiǎn)稱試題表、試卷表、模板表、考生表)的內(nèi)容:管理員在后臺(tái)使用試題表(包含`id`,`content`,`search_list`,`answer`,`fraction`,`pro_type`,`pro_class`,`upload_date`,`resolve`,`isactive`,`degreeid`,`sound`,`mustknown`字段)手工添加試題,表中`id`字段是每條試題的試題號(hào),int類型,自動(dòng)增長(zhǎng),具有唯一性,`content`字段填寫試題內(nèi)容,text類型,`search_list`字段填寫每種題型的選項(xiàng)個(gè)數(shù),整型,本課程單選題(radio)、多選題(checkbox)個(gè)數(shù)取4,判斷題(judgment)和填空題(fill)取0,`answer`字段填寫每題正確答案,text類型,`fraction`字段填寫每題分值,int類型,`pro_type`字段填寫題型,varchar類型,`pro_class`字段填寫課程類別,int類型,`upload_date`字段填寫試題添加或更新日期,date類型,`resolve`字段填寫試題解析,text類型,`isactive`字段填寫試題是否啟用或禁用,varchar類型,`degreeid`字段填寫難度系數(shù),int類型,對(duì)應(yīng)難度系數(shù)表中的較易、中等、較難3個(gè)選項(xiàng),`mustknown`字段填寫是否必須掌握,int類型,默認(rèn)為1(必須掌握),`sound`字段填寫語(yǔ)音上傳文件(可選),varchar類型。由于信息技術(shù)課程只有單選、判斷和填空三種題型,因此試題表中無(wú)需添加多選題,當(dāng)數(shù)據(jù)庫(kù)中添加了一定數(shù)量不同題型的試題后,管理員便可隨機(jī)生成試卷表(包含`id`,`radio`,`checkbox`,`fill`,`judgment`,`title`,`pro_class`,`exam_user`,`start_exam`,`over_exam`,`dates`,`templateid`字段),表中的`id`字段填寫的是生成的試卷號(hào),int類型,自動(dòng)增長(zhǎng),具有唯一性,`radio`、`fill`、`judgment`三個(gè)字段分別填寫的是由隨機(jī)選出的3種不同題型的試題號(hào)組成的字符串,text類型,每個(gè)試題號(hào)對(duì)應(yīng)于試題表的`id`字段值,每種題型由試題號(hào)之間的@符號(hào)連接而成,譬如`radio`字段:9475@9493@9494@9495,數(shù)字9475代表試題表中某條試題的`id`值,而非試題內(nèi)容,字符串的長(zhǎng)度或者準(zhǔn)確說(shuō)每種題型的個(gè)數(shù)依據(jù)`templateid`字段值,`title`字段填寫試卷標(biāo)題,text類型,`pro_class`字段填寫課程類別,int類型,`exam_user`字段填寫參加考試人員,text類型,其值是一組由@符號(hào)組成的字符串,譬如90@88@89,數(shù)字90表示用戶表中的`id`用戶,`start_exam`字段填寫開(kāi)考準(zhǔn)確時(shí)間,`over_exam`填寫考試結(jié)束時(shí)間,兩個(gè)字段均為varchar類型,`dates`填寫試卷生成的日期,date類型,`templateid`字段填寫試卷模板,int類型,其值等于模板表(包含`id`,`name`,`emattrid`,`typedistribute`,`degreedistribute`字段)的`id`字段值,譬如信息技術(shù)課程的`templateid`值為29,其值就是模板表id為29的值,管理員在隨機(jī)生成試卷時(shí),首先要選擇課程類別和試卷模版,試卷模板依據(jù)模板表的`typedistribute`字段,譬如信息課程的模板為radio@50@checkbox@0@fill@20@judgment@30,表示單選題50分,填空題20分,判斷題30分,無(wú)多選題。模板表中`id`字段表示試卷模板號(hào),int類型,自動(dòng)增長(zhǎng),具有唯一性,`name`字段填寫模板名稱,varchar類型,`emattrid`字段填寫與總分、及格分?jǐn)?shù)線表關(guān)聯(lián)的`id`值,int類型,`typedistribute`字段填寫題型分配,`degreedistribute`字段填寫難度系數(shù)分配,二者均為varchar類型。每場(chǎng)考試完畢,系統(tǒng)要把考試結(jié)果填寫到考生表(包含`id`,`title`,`examination_id`,`name`,`admission`,`pro_class`,`fraction`,`sub_answer`,`sub_time`,`nameid`字段)中,表中`id`字段填寫考試編號(hào),int類型,自動(dòng)增長(zhǎng)、唯一,`title`字段填寫試卷標(biāo)題,varchar類型,examination_id`字段填寫試卷`id`號(hào),int類型,其值與試卷表的`id`相關(guān)聯(lián),`name`字段、`admission`字段,分別填寫考生姓名、準(zhǔn)考證號(hào),varchar類型,`pro_class`字段填寫課程類別、`fraction`字段填寫成績(jī)總分,int類型,`sub_answer`字段填寫考試答案,text類型,其值是形如*9541@radio@A@A@1*9491...@judgment@正確@正確@1*...*9517@fill@路由器@路由器@1*...的一個(gè)長(zhǎng)字符串,每條試題答案之間用“*”連接,`sub_time`字段填寫試卷提交日期和時(shí)間,datetime類型,`nameid`字段填寫考生`id`,int類型,其值與用戶表的`id`相關(guān)聯(lián)。
2.2 組卷過(guò)程設(shè)計(jì)
組卷時(shí),系統(tǒng)首先通過(guò)試卷模板得到題型和數(shù)量,然后通過(guò)隨機(jī)函數(shù)抽題,如果抽題成功,則將生成的試卷號(hào)`id`值添加到數(shù)據(jù)庫(kù)試卷表中,通常情況下,每個(gè)課程的考題數(shù)量要大于試卷模板要求的考題數(shù)量,譬如信息技術(shù)課程單選題有500多條(當(dāng)然我們可以通過(guò)啟用和禁用字段進(jìn)行選擇),而試卷模板單選題只考50條(每題1分,也可每題2分25條),因此隨機(jī)抽題時(shí),抽題的范圍是500條,而抽到試題的數(shù)量由模板表下此題型的數(shù)量決定,假如500條單選題通過(guò)禁用,剩下30條,如果還是每條1分,顯然題數(shù)不夠,不能成功抽取,如果每題2分,那就在30條里面抽取25條,試題越多,分散度就越大,以單選題抽取為例,系統(tǒng)使用array_rand($radios,number)函數(shù)隨機(jī)從試題表中取得number數(shù)量個(gè)單選題鍵名(即ID值)組成的數(shù)組,通過(guò)for語(yǔ)句循環(huán)讀取獲取的鍵值,然后根據(jù)鍵值從試題表中獲取指定`id`的試題,并添加到試題數(shù)組中,最后通過(guò)$radio=implode('@',$radio_exam),對(duì)生成的試題數(shù)組進(jìn)行由數(shù)組到字符串的轉(zhuǎn)換,以@為分隔符,形如9475@9493@9494@...@9689,最后將變量$radio通過(guò)SQL插入語(yǔ)句填寫到試卷表對(duì)應(yīng)的`radio`字段中,字符串@的個(gè)數(shù)即為單選題的數(shù)量,系統(tǒng)獲得所有題型和數(shù)量之后,將試卷標(biāo)題、考試時(shí)間一并添加進(jìn)試卷表,組卷成功。
2.3 考試和評(píng)分過(guò)程設(shè)計(jì)
下面以正式考試情景介紹考試和評(píng)分過(guò)程的設(shè)計(jì),考生在前臺(tái)頁(yè)面選擇正式考試單元,系統(tǒng)彈出登錄窗體,考生輸入準(zhǔn)考證號(hào)、密碼,在下拉列表中選擇考試名稱,點(diǎn)擊登錄按鈕,開(kāi)始進(jìn)入考試,這里要說(shuō)明的是考試名稱除了教師在后臺(tái)生成的名稱之外,考生還可以選擇隨機(jī)生成考卷,系統(tǒng)根據(jù)考生的準(zhǔn)考證號(hào),查詢用戶數(shù)據(jù)表,取得考生的課程類別,根據(jù)課程類別和該課程類別下一個(gè)固定的試卷模版,生成名為隨機(jī)考試的試卷,其抽題原理與后臺(tái)管理員組卷過(guò)程基本相同??忌卿洉r(shí)的準(zhǔn)考證號(hào)和密碼如果和用戶表中一致,系統(tǒng)便會(huì)讀取試卷表中的開(kāi)考時(shí)間,如果登錄時(shí)間與開(kāi)考時(shí)間相同,則開(kāi)始考試,如果開(kāi)考時(shí)間未到,系統(tǒng)會(huì)彈出考試時(shí)間未到并顯示等待時(shí)間窗口,如果考試時(shí)間已超過(guò)15分鐘,會(huì)彈出已超時(shí)窗口??忌卿洺晒?,系統(tǒng)會(huì)將考生id、試卷id、準(zhǔn)考證號(hào)、姓名、開(kāi)考科目等信息存儲(chǔ)到服務(wù)器的Session變量中,然后系統(tǒng)根據(jù)Session變量中的試卷id值,去數(shù)據(jù)庫(kù)試卷表中查詢得到試卷標(biāo)題、開(kāi)考時(shí)間和結(jié)束時(shí)間,并將上述時(shí)間分別轉(zhuǎn)換為unix時(shí)間戳,存儲(chǔ)到服務(wù)器Session變量中,同時(shí)根據(jù)兩個(gè)unix時(shí)間戳的差值計(jì)算考試總時(shí)間,具備以上條件,則可生成考試頁(yè)面。
生成的考試頁(yè)面應(yīng)包含考生姓名、準(zhǔn)考證號(hào)、考核類型、試卷標(biāo)題、題型、數(shù)量、分值、考試計(jì)時(shí)、剩余時(shí)間,以及每條具體試題內(nèi)容,由于存儲(chǔ)在試卷表中的試題是按題型分類的試題題號(hào),而不是試題內(nèi)容本身,因此要根據(jù)試卷表中的每個(gè)題型的id值,去試題表中將具體試題內(nèi)容查詢出來(lái),下面以單選題(radio)為例,分析如何根據(jù)試題題號(hào)得到具體試題內(nèi)容的過(guò)程:系統(tǒng)首先根據(jù)試卷的id值,通過(guò)$radio=explode('@',$kst['radio'])函數(shù)讀取試卷表中單選題(`radio`字段)中的數(shù)據(jù),將形如9475@9493@9494@...樣式的字符串拆分成數(shù)組,然后通過(guò)for循環(huán)語(yǔ)句讀取數(shù)組中每條單選題的id,根據(jù)此id值向試題表查詢得到試題內(nèi)容,譬如題號(hào)id為9475,則可在試題表中將id為9475的試題內(nèi)容(`content`字段)讀取出來(lái),用同樣的方法可取得所有題型的考試試題??忌M(jìn)入考試后,系統(tǒng)運(yùn)用Ajax技術(shù),無(wú)刷新實(shí)現(xiàn)在考試頁(yè)面頭部顯示考試計(jì)時(shí)時(shí)間和剩余時(shí)間,考試剩余時(shí)間由SESSION變量中的考試結(jié)束時(shí)間值減去當(dāng)前時(shí)間的unix時(shí)間戳得到,而計(jì)時(shí)開(kāi)始時(shí)間值為當(dāng)前unix時(shí)間戳減去SESSION變量中的開(kāi)考時(shí)間,系統(tǒng)運(yùn)用jQuery Ajax的post方法,利用回調(diào)函數(shù)來(lái)實(shí)現(xiàn)考試期間已答和未答試題的統(tǒng)計(jì)顯示,采用數(shù)組$sub_answer=array()存儲(chǔ)考生答案,采用變量$fraction存儲(chǔ)分?jǐn)?shù),當(dāng)計(jì)時(shí)時(shí)間到或者考生提前交卷,系統(tǒng)獲取表單提交的數(shù)據(jù),計(jì)算并保存考試結(jié)果,以題號(hào)9541單選題答題為例:系統(tǒng)首先判斷有無(wú)單選題題型存在,如果存在,則將考生提交答案與試題表中id為9541試題的正確答案進(jìn)行比較,如果提交答案與正確答案相同,則按照試題表下每題分值(`fraction`字段)大小進(jìn)行加分,如果答錯(cuò)或者未答則給予0分,通過(guò)for循環(huán)語(yǔ)句遍歷所有單選題,將形如9541@radio@A@A@1的字符串結(jié)果存入$sub_answer[]數(shù)組中,同時(shí)計(jì)算單選題總分,當(dāng)所有題型遍歷完后,計(jì)算試卷總分,并把考試結(jié)果數(shù)據(jù)填寫到考生表中,表中考生答案(`sub_answer`字段)用implode("*",$sub_answer)函數(shù)拼接成字符串,如果填寫成功,表示完成試卷信息的提交,系統(tǒng)彈出試卷提交成功信息,并同時(shí)顯示成績(jī)結(jié)果頁(yè)面。
考生也可以在考試結(jié)束后根據(jù)準(zhǔn)考證號(hào)和試卷名稱查詢成績(jī),顯示成績(jī)結(jié)果頁(yè)面。系統(tǒng)利用$ar=explode("*",$sub_answer)函數(shù),拆分得到每條試題的考試結(jié)果,利用for循環(huán)讀取每條試題的數(shù)據(jù),利用$dates=explode("@",$ar[$i])將每條試題的數(shù)據(jù)再拆分到數(shù)組中,利用$array_type[]=$dates[1]將題型存儲(chǔ)到數(shù)組中,利用$answers[]=$dates[2]將正確的答案存儲(chǔ)到數(shù)組中,利用$answer[]=$dates[3]將提交的答案存儲(chǔ)到數(shù)組中,利用$array_answer[]=$dates將每條試題的所有數(shù)據(jù)存儲(chǔ)到數(shù)組中。由于成績(jī)頁(yè)面中要顯示具體的試題內(nèi)容、正確答案、提交答案,因此,系統(tǒng)根據(jù)試卷id值,將試卷的題型先放到變量$examtype中,通過(guò)foreach語(yǔ)句遍歷該題型下的所有試題id值,然后根據(jù)試題id值將試題內(nèi)容從試題表中取出來(lái),付給頁(yè)面模板。在頁(yè)面模板中,以單選題為例,系統(tǒng)利用雙重循環(huán)語(yǔ)句進(jìn)行遍歷,遍歷的條件就是考生表中`sub_answer`字段包含的試題id、題型分別與試題表中的試題id、題型相等,遍歷結(jié)果中的試題內(nèi)容取自試題表中的`content`字段、正確答案取自試題表中的`answer`字段、提交答案取自考生表中的`sub_answer`字段、問(wèn)題解析取自試題表中的`resolve`字段。頁(yè)面中,考生還可以通過(guò)單擊查看答題情況按鈕查看所有答題情況,單擊正確或錯(cuò)誤按鈕,頁(yè)面會(huì)跳轉(zhuǎn)到對(duì)應(yīng)試題所在位置實(shí)現(xiàn)單條試題的結(jié)果查詢。
2.4 系統(tǒng)前后臺(tái)功能設(shè)計(jì)
客戶端程序在功能設(shè)計(jì)上共分為前臺(tái)和后臺(tái)兩大部分,前臺(tái)設(shè)計(jì)主要包括首頁(yè)設(shè)計(jì),以及單項(xiàng)練習(xí)、模擬考試、正式考試、成績(jī)查詢、新聞公告五大模塊入口設(shè)計(jì),如圖2所示。由于系統(tǒng)采用了Smarty模版引擎技術(shù),它將應(yīng)用程序分成視圖和邏輯控制兩部分[4],有效地實(shí)現(xiàn)了邏輯代碼與內(nèi)容表現(xiàn)的分離,專注于內(nèi)容表現(xiàn),避免了標(biāo)簽與程序的混合,使得邏輯內(nèi)容的改變不會(huì)影響到前臺(tái)視圖[5],因此大大減輕了頁(yè)面設(shè)計(jì)的工作量,每個(gè)模板頁(yè)面通過(guò)對(duì)應(yīng)PHP文件的$smarty->display方法指定,頁(yè)面的變量通過(guò)對(duì)應(yīng)PHP文件的$smarty->assign方法指定。在單項(xiàng)練習(xí)模塊的頁(yè)面設(shè)計(jì)中,運(yùn)用了Jquery的Ajax技術(shù),對(duì)提交按鈕進(jìn)行判斷,構(gòu)建function checkInput(id,type)函數(shù)對(duì)單選題、判斷題、多選題進(jìn)行題型檢查,構(gòu)建function checkAnswer(id,type)函數(shù)對(duì)是否選擇了答案進(jìn)行檢查,構(gòu)建function createInputHidden(id)函數(shù)創(chuàng)建用戶已答試題的隱藏域,記錄用戶所答的問(wèn)題。與模擬考試和正式考試不同的是,單項(xiàng)練習(xí)模塊的答案是提交到當(dāng)前頁(yè)面,在隱藏域里利用setAttribute方法創(chuàng)建input元素的name值'hid',根據(jù)$_POST['hid']方法到數(shù)據(jù)庫(kù)試題表中查詢?cè)搃d試題的正確答案,將提交的答案與之比較,正確則加分,然后將提交答案和正確答案輸出到當(dāng)前頁(yè)中,用戶每答一題,就向單項(xiàng)練習(xí)表中添加一條記錄,保存用戶所做的數(shù)據(jù)。模擬考試模塊與正式考試模塊的功能設(shè)計(jì)基本相同,區(qū)別只在于模擬考試使用的是測(cè)試賬號(hào),登錄時(shí)用戶只需選擇考題名稱而無(wú)須輸入準(zhǔn)考證號(hào)和登錄密碼。
后臺(tái)頁(yè)面設(shè)計(jì)采用了框架布局的形式,管理員在后臺(tái)進(jìn)行登錄時(shí),系統(tǒng)首先運(yùn)用JavaScript對(duì)登錄賬號(hào)、密碼、權(quán)限是否填寫進(jìn)行檢查,然后去數(shù)據(jù)庫(kù)用戶表驗(yàn)證所填寫的賬號(hào)、密碼是否正確,賬戶是否被凍結(jié),驗(yàn)證通過(guò)后進(jìn)入后臺(tái)管理系統(tǒng)首頁(yè),后臺(tái)首頁(yè)分為頭部、左部導(dǎo)航欄、右部功能展示區(qū),頭部主要顯示登錄賬戶、用戶權(quán)限和上次登錄時(shí)間,導(dǎo)航欄包含所有功能菜單,它使用JavaScript實(shí)現(xiàn)子菜單的展開(kāi)和折疊,所有功能如圖3所示,其中類別管理菜單既可以添加主課程類別,也可以添加該課程下的子課程類別,添加考生信息子菜單中的添加考生方法既可以使用富文本編輯器CKeditor手工逐條添加,也可以用Excel文件批量導(dǎo)入,新聞公告菜單主要實(shí)現(xiàn)考試信息及相關(guān)新聞的發(fā)布,試題管理菜單主要用于試題的增刪改查,試題除了可以手工逐條輸入之外,也可以進(jìn)行批量導(dǎo)入,導(dǎo)入前需分別為四種題型建立對(duì)應(yīng)的Excel文件,導(dǎo)入時(shí)在頁(yè)面先選擇課程類別、題型、題型分值,然后選擇要導(dǎo)入的文件,文件格式要求單選題和多選題應(yīng)包含序號(hào)、試題內(nèi)容、A—D選項(xiàng)內(nèi)容,答案(大寫字母A—D)、解析等字段,判斷題和填空題應(yīng)包含序號(hào)、試題內(nèi)容、答案(判斷題用數(shù)字1表示正確、0表示錯(cuò)誤)、解析等字段,除了導(dǎo)入功能,試題還可以導(dǎo)出為word文檔,方便打印紙質(zhì)試卷。試卷管理菜單下的分?jǐn)?shù)和分?jǐn)?shù)線設(shè)定子菜單,可以設(shè)置總分和及格分?jǐn)?shù)線,按照總分和分?jǐn)?shù)線可以在模板定義子菜單中設(shè)定不同題型的試題數(shù)量,并保存為新模板。在模板管理子菜單中可以修改各個(gè)題型的數(shù)量占比,在管理題型子菜單中不但可以更改或刪除現(xiàn)有題型,而且還可以增加其他非客觀題型,進(jìn)行人工閱卷。成績(jī)管理菜單可以用于正式考試成績(jī)的查詢和統(tǒng)計(jì),在使用成績(jī)查詢子菜單進(jìn)行查詢時(shí),查詢的選項(xiàng)可以是考生姓名、考試名稱、課程類別和考試不及格者,可以將查詢的結(jié)果導(dǎo)出為Excel格式的文件。在成績(jī)統(tǒng)計(jì)子菜單,系統(tǒng)利用JpGraph圖表類庫(kù)實(shí)現(xiàn)某個(gè)考試名稱的成績(jī)統(tǒng)計(jì)與分析,利用直線圖表示所有考生的考試成績(jī),利用3d餅圖表示考試通過(guò)率。權(quán)限管理菜單可以實(shí)現(xiàn)從用戶表中添加用戶為教師、管理員或超級(jí)管理員角色,也可以對(duì)已添加的角色進(jìn)行權(quán)限更改,根據(jù)管理權(quán)限的不同,用戶以教師身份角色登錄后臺(tái)時(shí)導(dǎo)航欄沒(méi)有權(quán)限管理菜單,以教師和管理員角色登錄后臺(tái)時(shí)導(dǎo)航欄含有數(shù)據(jù)庫(kù)管理菜單,可用于對(duì)考試數(shù)據(jù)庫(kù)進(jìn)行備份或還原,保證考試數(shù)據(jù)的安全。
3 系統(tǒng)測(cè)試和完善(System testing and improvement)
實(shí)現(xiàn)系統(tǒng)的穩(wěn)定性是運(yùn)行在線考試的關(guān)鍵[6],系統(tǒng)使用PHP技術(shù)使得考試數(shù)據(jù)得以及時(shí)更新,但頻繁的數(shù)據(jù)讀取卻給服務(wù)器帶來(lái)了巨大的壓力,特別是當(dāng)并發(fā)訪問(wèn)[7]量較大時(shí),服務(wù)器頻繁工作于用戶請(qǐng)求與數(shù)據(jù)庫(kù)響應(yīng)兩個(gè)操作之間,就會(huì)造成用戶請(qǐng)求多與數(shù)據(jù)庫(kù)響應(yīng)慢兩者之間相互等待的局面,嚴(yán)重者則會(huì)導(dǎo)致系統(tǒng)崩潰。相對(duì)于其他模板引擎來(lái)說(shuō),采用Smarty模板編寫的應(yīng)用程序可以獲得更大效能,在應(yīng)用程序第一次運(yùn)行時(shí),Smarty會(huì)將程序編譯成一個(gè)非模板格式的PHP文件,并將最終輸出的內(nèi)容緩存成一個(gè)靜態(tài)的HTML文件,若在源代碼未變動(dòng)或緩存時(shí)間尚未過(guò)期的情況下,下次再訪問(wèn)模板時(shí),Smarty會(huì)將用戶請(qǐng)求直接定位到這個(gè)HTML文件上,而不再進(jìn)行重編譯,既省去了業(yè)務(wù)邏輯[8]處理麻煩,又降低了訪問(wèn)量較大引發(fā)的服務(wù)器工作負(fù)荷,有效提升了應(yīng)用程序的性能和服務(wù)器的響應(yīng)速度。系統(tǒng)在完成了整個(gè)考試系統(tǒng)的前后臺(tái)設(shè)計(jì)之后,必須對(duì)系統(tǒng)的穩(wěn)定性和并發(fā)能力進(jìn)行測(cè)試,測(cè)試的首要項(xiàng)目是服務(wù)器單機(jī)測(cè)試,系統(tǒng)在加載Apache服務(wù)和Mysql服務(wù)之后,檢查前臺(tái)登錄各個(gè)單元模塊是否流暢,是否存在服務(wù)器端口沖突,后臺(tái)試題導(dǎo)
入、考生數(shù)據(jù)表導(dǎo)入有無(wú)問(wèn)題,前后臺(tái)頁(yè)面有無(wú)遲滯現(xiàn)象,單機(jī)測(cè)試合格后再進(jìn)行內(nèi)網(wǎng)測(cè)試,用一臺(tái)或者多臺(tái)服務(wù)器通過(guò)內(nèi)網(wǎng)進(jìn)行測(cè)試,選任意一臺(tái)考生用機(jī)進(jìn)入指定一臺(tái)或多臺(tái)服務(wù)器,檢查系統(tǒng)運(yùn)行是否正常、流暢,考試登錄、計(jì)時(shí)、交卷、評(píng)分、成績(jī)查詢各個(gè)環(huán)節(jié)有無(wú)錯(cuò)誤,有無(wú)遲滯現(xiàn)象,內(nèi)網(wǎng)測(cè)試合格后,進(jìn)行60人同時(shí)在線考試,測(cè)試系統(tǒng)在多人上線時(shí)的穩(wěn)定性和并發(fā)性,在服務(wù)器上檢查在線考生表的數(shù)量是否與參考人數(shù)相等,有無(wú)掉線現(xiàn)象,分析掉線產(chǎn)生的原因,測(cè)試一臺(tái)考試服務(wù)器最大考試客戶機(jī)連接數(shù),在實(shí)際考試中,我們最好在每個(gè)機(jī)房安裝一臺(tái)服務(wù)器操作系統(tǒng),并安裝PhpStudy集成軟件包和在線考試系統(tǒng)軟件,考試結(jié)束后,將每個(gè)機(jī)房的考試成績(jī)分別導(dǎo)出,再按考場(chǎng)和課程匯總,得到該門課程的全部考試成績(jī)[9]。
4 結(jié)論(Conclusion)
本系統(tǒng)基于PHP、Mysql和Smarty技術(shù),采用B/S模式,能夠?qū)崿F(xiàn)在線單項(xiàng)練習(xí)、模擬和正式考試及評(píng)分,系統(tǒng)經(jīng)測(cè)試、使用,并發(fā)能力強(qiáng),服務(wù)器運(yùn)行穩(wěn)定可靠,能夠顯著提高大學(xué)生計(jì)算機(jī)一級(jí)考試?yán)碚搼?yīng)試成績(jī),該系統(tǒng)也可以用于其他課程的在線練習(xí)、考試。
參考文獻(xiàn)(References)
[1] 張福炎,孫志揮.大學(xué)計(jì)算機(jī)信息技術(shù)教程[M].南京大學(xué)出版社,2017,8.
[2] 劉洪江.在線考試系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2012,8 (3):508-511.
[3] 萬(wàn)茹.基于HTML5的Web富客戶端網(wǎng)頁(yè)設(shè)計(jì)方法[J].電腦編程技巧與維護(hù),2015(13):67-69.
[4] 馮興利,徐墨,鎖志海.基于模板引擎Smarty的信息管理系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2012,35(18):25-28.
[5] 劉耀欽,袁承芬.基于PHP的招聘報(bào)名系統(tǒng)設(shè)計(jì)與研究[J].計(jì)算機(jī)時(shí)代,2014(5):39-41.
[6] 李偉為.基于ASP.NET2.0的在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2011,28(9):163-165.
[7] 王鑫.并發(fā)數(shù)據(jù)訪問(wèn)代碼缺陷分析[J].航天控制,2011,29(2):81-92.
[8]孫小淋.會(huì)話外觀模式在業(yè)務(wù)邏輯集成中的應(yīng)用[J].微處理機(jī),2014(1):25-28.
[9] PHP項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)入門[M].明日科技.吉林:吉林大學(xué)出版社,2017,3.
作者簡(jiǎn)介:
金 強(qiáng)(1970-),男,碩士,高級(jí)講師.研究領(lǐng)域:控制工程,軟件工程.
王 亮(1979-),男,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)網(wǎng)絡(luò),信息安全.
方春華(1973-),女,本科,講師.研究領(lǐng)域:數(shù)據(jù)挖掘,數(shù)據(jù)庫(kù)開(kāi)發(fā).