李星儒 北方民族大学
关键字: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 结语