本身生活在一个小学校中,但是对计算机的渴望又是那么深,所以深切的想做出点什么东西。鉴于学校的ACM还算玩的比较有意思,所以想,写一个Virtual Judge系统吧,算是给后辈们留下个可玩的东西(其实是和别人打赌写出来2333....)。

设计一个Virtual Judge系统,远比设计一个Online Judge系统的事情少得多,但是仍然不简单(对于没接触过的人来说),首先要解决的问题就是采题。说白了就是去别人的OJ扒题。这里抛弃道德的问题(因为我并没有联系OJ的作者或者管理员2333....),只谈谈技术上的实现。

后端语言采用的是PHP实现,截止我开发出来为止PHP7还没出来(你懂的,频繁跳票),所以基于PHP5.6版本开发。这里我使用了我很久以前简单封装的一个CMS叫做AlxwCMS(其实是不想写用户模块了2333....),我封装了一个MySQL的库用来实现链式调用,所以数据库的配置部分基本略过。

下面说说采题。其实说白了很简单,无非是抓题目的页面。但是需要注意的是,页面中可并不是只有文本,还有图片和其他的东西等。鉴于我们学校所采用的封闭式比赛,那么我们的系统一定要能够隔绝内网与公网,酱紫只有服务器本身联网,其余内网机器只能够看得到我们的系统服务器。

这里的采集直接用PHP函数 file_get_contents 实现。我们的数据库表有一个名字为Problem,用来存储题目,结构如图:


这里id是我们本地的题目id,递增;pid是远程OJ上面题目的id,当然后面的OJ就是相应的OJ。鉴于题目随时可能改变,这里并没有存储题目内容。如果进行存储,相信会进一步加速页面载入题目的速度。鉴于题目列表是经常展示的页面,这里对题目的标题进行了存储,页面效果如图:


然后就是问题显示页面的渲染效果。这里我获取到页面内容后,写了一个HTML的匹配库,用以实现内容的提取,如图:


至于前面所说的页面中的资源,可以通过 .htaccess 配合 mod_rewrite 实现(这里是Apache2),直接贴代码:

.htaccess:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . ./get.php [L]

get.php:

<?php /**
        Author: SpringHack - springhack@live.cn
        Last modified: 2015-12-08 10:29:25
        Filename: get.php
        Description: Created by SpringHack using vim automatically.
**/ ?>
<?php
 	require_once("api.php");
	require_once("classes/Problem.php");
	$id = explode("id=", $_SERVER["HTTP_REFERER"]);
	$id = isset($id[1])?$id[1]:0;
	$db = new MySQL();
	$info = $db->from("Problem")->where("`id` = '".$id."'")->select()->fetch_one();
	$prefix = "";
	switch ($info['oj'])
	{
		case "POJ":
			$prefix = "http://poj.org";
		break;
		case "HDOJ":
			$prefix = "http://acm.hdu.edu.cn";
		break;
		default:
		break;
	}
	echo file_get_contents($prefix.$_SERVER["REQUEST_URI"]);
?>

这里我就不多说了,贴上我的项目地址,后面的博文还会分析Virtual Judge系统其他部分的实现,传送门:https://github.com/springhack/sk_vjudge