李星儒 北方民族大學(xué)
關(guān)鍵字:LAMP OJ 在線編程測(cè)評(píng)平臺(tái)
隨著國(guó)內(nèi)外各大算法競(jìng)賽的興起,如藍(lán)橋杯,ACM/ICPC等。各大高校也越來(lái)越重視學(xué)生算法編程能力的培養(yǎng),也吸引了不少學(xué)子前去參賽,我校也不例外。但是我校目前還沒(méi)有一個(gè)能投入使用的在線評(píng)測(cè)平臺(tái)。鑒于此,我們開(kāi)發(fā)了基于LAMP的在線編程測(cè)評(píng)平臺(tái)。LAMP是指基于Linux的,使用Apache作為網(wǎng)頁(yè)服務(wù)器,MySQL作為數(shù)據(jù)庫(kù)系統(tǒng),PHP作為編程語(yǔ)言的網(wǎng)站建站方案。在線編程評(píng)測(cè)平臺(tái)是一個(gè)在線的判題系統(tǒng)。使用者可以在上提交多種程序源代碼,并交由平臺(tái)自動(dòng)編譯測(cè)評(píng)。
1.1 前臺(tái)使用
首先,系統(tǒng)部署完成后,用戶訪問(wèn)系統(tǒng)網(wǎng)址,在導(dǎo)航欄上可見(jiàn)題庫(kù)、評(píng)測(cè)狀態(tài)等幾個(gè)功能區(qū)。在用戶登錄后且具有管理員權(quán)限時(shí),會(huì)出現(xiàn)“控制臺(tái)”功能區(qū)。
(1)題庫(kù)功能區(qū)
題庫(kù)功能區(qū)是整個(gè)評(píng)測(cè)系統(tǒng)最核心的部分,在這個(gè)功能區(qū),可以看到諸如題目標(biāo)題、題目難度、題目提交數(shù)和正確通過(guò)數(shù)等重要的信息。
(2)評(píng)測(cè)狀態(tài)功能區(qū)
從這個(gè)功能區(qū)可以看到整個(gè)服務(wù)器的評(píng)測(cè)狀態(tài)。該功能區(qū)展示了一個(gè)列表,詳細(xì)顯示了目前正在排隊(duì)的測(cè)試案例和正在測(cè)評(píng)的測(cè)試案例。
(3)我的功能區(qū)
這里是用戶中心。用戶可以從這個(gè)功能區(qū)看到至今為止的自身測(cè)評(píng)統(tǒng)計(jì)數(shù)據(jù):總提交數(shù)、總通過(guò)數(shù)、通過(guò)率等。
(4)控制臺(tái)功能區(qū)
打開(kāi)控制臺(tái)功能區(qū),其中又細(xì)分為下列幾個(gè)小功能區(qū):題目管理、組卷管理、用戶管理欄目。
2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)概要
平臺(tái)數(shù)據(jù)庫(kù)由 coder_questions、sessions、tests、submit、users五個(gè)表組成。其中,coder_questions用于存儲(chǔ)題庫(kù)里的題目,sessions用于保存用戶登錄憑證,tests用于保存組卷信息,submit用于保存用戶提交的代碼供后臺(tái)測(cè)評(píng),users用于保存平臺(tái)注冊(cè)的所有用戶信息。
(1)頁(yè)面路由顯示過(guò)程分析
對(duì)整個(gè)平臺(tái)訪問(wèn)將自動(dòng)重定向到index.php。這個(gè)文件是首頁(yè)路由文件,再根據(jù)指定的規(guī)則過(guò)濾用戶請(qǐng)求之后,它將根據(jù)用戶的要求呈現(xiàn)不同的頁(yè)面。首頁(yè)路由文件核心代碼如下所示:
$path=$_SERVER[`REQUEST_URI`];
$path=preg_replace("/(?[w&=%:+-]*)/","",$path);
if(file_exists("../smarty/tpl/oj-".$file_name.".tpl"))
$smarty->display("oj-$file_name.tpl");
else
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
(2)題庫(kù)讀取顯示關(guān)鍵代碼分析
如下面所示,頁(yè)面首先會(huì)向數(shù)據(jù)庫(kù)發(fā)送查詢SQL請(qǐng)求,請(qǐng)求讀取題庫(kù)信息。為防止保存時(shí)亂碼,題庫(kù)數(shù)據(jù)都是經(jīng)過(guò)base64編碼過(guò)的,因此讀取之后需要經(jīng)過(guò)base64解碼。最后顯示到屏幕上。
$ret=mysqli_query($GLOBALS[`db_conn`],"SELECT`id`,`title`,`ac`,`come_from` FROM `coder_questions` WHERE`showable`= 1");
for($id=0;$id $question[$id]=mysqli_fetch_assoc($ret); foreach ($question[$id] as $key => $value) if($key!=`ac` ) $question[$id][$key]=base64_decode($value); (3)題目答案代碼提交過(guò)程分析 核心代碼如下所示,當(dāng)頁(yè)面嘗試提交代碼時(shí),會(huì)通過(guò)WebSocket與后臺(tái)服務(wù)器建立連接,然后將會(huì)話憑據(jù)(sessionid)、base64編碼后的代碼(code)等編碼為JSON數(shù)據(jù)后發(fā)送至后臺(tái)服務(wù)器。 var ws = new WebSocket("ws://{$domain}:3698"); ws.onopen = function () { var params={`sessionid`:info[`sessionid`], method:`push`, code:window.btoa(unescape(encodeURIComponent(editor.getValue()))),type:$("#lang").val(),qid:info[`qid`] }; ws.send(JSON.stringify(params)); } 然后后臺(tái)服務(wù)器接收到前端發(fā)過(guò)來(lái)的代碼,會(huì)將其插入數(shù)據(jù)庫(kù)的submit表,等待系統(tǒng)測(cè)評(píng)。 經(jīng)過(guò)長(zhǎng)達(dá)1年的艱苦建設(shè),我校在線評(píng)測(cè)系統(tǒng)終于初步建成。這極大地提高了我校計(jì)算機(jī)學(xué)院學(xué)生們的算法及編程水平,也為以后我校參加諸如藍(lán)橋杯等競(jìng)賽的選手提供了訓(xùn)練平臺(tái),相信在優(yōu)越的條件下,我校相關(guān)專業(yè)學(xué)生能在算法類競(jìng)賽取得更好的成績(jī)。3 結(jié)語(yǔ)