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