李星儒 北方民族大學
關鍵字:LAMP OJ 在線編程測評平臺
隨著國內(nèi)外各大算法競賽的興起,如藍橋杯,ACM/ICPC等。各大高校也越來越重視學生算法編程能力的培養(yǎng),也吸引了不少學子前去參賽,我校也不例外。但是我校目前還沒有一個能投入使用的在線評測平臺。鑒于此,我們開發(fā)了基于LAMP的在線編程測評平臺。LAMP是指基于Linux的,使用Apache作為網(wǎng)頁服務器,MySQL作為數(shù)據(jù)庫系統(tǒng),PHP作為編程語言的網(wǎng)站建站方案。在線編程評測平臺是一個在線的判題系統(tǒng)。使用者可以在上提交多種程序源代碼,并交由平臺自動編譯測評。
1.1 前臺使用
首先,系統(tǒng)部署完成后,用戶訪問系統(tǒng)網(wǎng)址,在導航欄上可見題庫、評測狀態(tài)等幾個功能區(qū)。在用戶登錄后且具有管理員權限時,會出現(xiàn)“控制臺”功能區(qū)。
(1)題庫功能區(qū)
題庫功能區(qū)是整個評測系統(tǒng)最核心的部分,在這個功能區(qū),可以看到諸如題目標題、題目難度、題目提交數(shù)和正確通過數(shù)等重要的信息。
(2)評測狀態(tài)功能區(qū)
從這個功能區(qū)可以看到整個服務器的評測狀態(tài)。該功能區(qū)展示了一個列表,詳細顯示了目前正在排隊的測試案例和正在測評的測試案例。
(3)我的功能區(qū)
這里是用戶中心。用戶可以從這個功能區(qū)看到至今為止的自身測評統(tǒng)計數(shù)據(jù):總提交數(shù)、總通過數(shù)、通過率等。
(4)控制臺功能區(qū)
打開控制臺功能區(qū),其中又細分為下列幾個小功能區(qū):題目管理、組卷管理、用戶管理欄目。
2.2 數(shù)據(jù)庫設計概要
平臺數(shù)據(jù)庫由 coder_questions、sessions、tests、submit、users五個表組成。其中,coder_questions用于存儲題庫里的題目,sessions用于保存用戶登錄憑證,tests用于保存組卷信息,submit用于保存用戶提交的代碼供后臺測評,users用于保存平臺注冊的所有用戶信息。
(1)頁面路由顯示過程分析
對整個平臺訪問將自動重定向到index.php。這個文件是首頁路由文件,再根據(jù)指定的規(guī)則過濾用戶請求之后,它將根據(jù)用戶的要求呈現(xiàn)不同的頁面。首頁路由文件核心代碼如下所示:
$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)題庫讀取顯示關鍵代碼分析
如下面所示,頁面首先會向數(shù)據(jù)庫發(fā)送查詢SQL請求,請求讀取題庫信息。為防止保存時亂碼,題庫數(shù)據(jù)都是經(jīng)過base64編碼過的,因此讀取之后需要經(jīng)過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)題目答案代碼提交過程分析 核心代碼如下所示,當頁面嘗試提交代碼時,會通過WebSocket與后臺服務器建立連接,然后將會話憑據(jù)(sessionid)、base64編碼后的代碼(code)等編碼為JSON數(shù)據(jù)后發(fā)送至后臺服務器。 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)); } 然后后臺服務器接收到前端發(fā)過來的代碼,會將其插入數(shù)據(jù)庫的submit表,等待系統(tǒng)測評。 經(jīng)過長達1年的艱苦建設,我校在線評測系統(tǒng)終于初步建成。這極大地提高了我校計算機學院學生們的算法及編程水平,也為以后我校參加諸如藍橋杯等競賽的選手提供了訓練平臺,相信在優(yōu)越的條件下,我校相關專業(yè)學生能在算法類競賽取得更好的成績。3 結語