大家好,我是Fred913。

之前,我看过各种OJ(OpenJudge)

但是,还是没有自己做的好。

所以,我就来写了这篇教程。

环境

这次,我打算使用这些:
PHP 5.6

Nginx/Apache

Python

Python可以使用命令

For Ubuntu/Debian:
apt install python3 -y For CentOS:
yum install python3 -y

安装Python

那么,环境安装就结束了

代码部分

刚刚,我们准备好了环境,现在就是代码部分。

因为OJ需要在线运行代码的能力,所以我们在站点根目录下新建一个文件夹:api

在api文件夹里新建一个文件:python.php

代码如下:

<?php
//Powered By ShengFAN
//使用世界上最好的语言PHP进行开发-_-
$randint = rand();//为用户的代码取一个随机数作为唯一码
$f = fopen("/tmp/usrcode".$randint.".py", "w");
fwrite($f,$_GET['code']);
fclose($f);
echo str_replace("\n","<br>",passthru("python3 /tmp/usrcode".$randint.".py 2>&1")); //把换行转为html格式
unlink("/tmp/usrcode".$randint.".py"); //删除用户代码,以免造成tmp目录拥挤

这就是我们Python代码的处理器了。

接下来,我们去使用ACE编辑器制作自由模式(不添加判题系统)

在网站根目录创建editor目录

去Github上获取ACE编辑器的官方demo

这里我已经准备好了命令

git clone git://github.com/ajaxorg/ace.git

大家直接执行即可。

应该有这些东西

我们将index.html修改为index.php

然后放入这些代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>FredTools IDE</title>
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
function runcode(code,type)
{
if(type == "python")
{
console.log(code);
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","http://ide.ft2.club/api/python.php?code=" + escape(code),false);
xmlhttp.send();
var data = xmlhttp.responseText;
$("#output").html("<pre class=\"fillall\">" + data.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>") + "</pre>");
}
if(type=="html")
{
$("#output").html('<iframe style="width=100%;height=100%;" id="iframe" class="fillall" src="http://ide.ft2.club/api/mirror.php?code=' + escape(editor.getValue()) + '"></iframe>');
}
if(type == "php")
{
console.log(code);
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","http://ide.ft2.club/api/php.php?code=" + escape(code),false);
xmlhttp.send();
var data = xmlhttp.responseText;
$("#output").html("<pre class=\"fillall\">" + data.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>") + "</pre>");
} }
</script>
<style type="text/css" media="screen">
#editor {
margin: 0;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.container {
margin: 0;
//position: absolute;
top: 0;
bottom: 0;
}
#editordiv {
margin: 0;
position: absolute;
top: 0;
bottom: 0;
left:0;
right:58.33333333333334%;
}
#iframediv {
margin: 0;
position: absolute;
top: 0;
bottom: 50%;
left: 41.66666666666667%;
right:16.66666666666667%;
}
#stepdiv {
margin: 0;
position: absolute;
top: 50%;
bottom: 0;
left: 41.66666666666667%;
right:16.66666666666667%;
}
.col-md-2 {
margin: 0;
position: absolute;
top: 0;
bottom: 0;
left: 83.33333333333334%;
right:0;
}
</style>
</head>
<body> <div class="container">
<div class="col-md-5 column" id="editordiv">
<pre id="editor"></pre>
</div>
<div class="col-md-5 column" id="iframediv">
<h3>运行结果:</h3>
<div id="output"></div>
</div>
<div class="col-md-5 column" id="stepdiv">
<h3 id="stepcount">自由模式</h3>
<p id="steptext">在此模式下,你可以自由的使用FredTools IDE。</p>
<p id="task">任务:无</p>
</div>
<div class="col-md-2 column">
<!-- 更改语言-start -->
<div class="form-group">
<select name="language" id="language" class="form-control">
<option value="python" selected>Python(.py)</option>
</select> <button id="changelang" class="btn btn-default">
更改语言
</button>
</div>
<!-- 更改语言-end -->
<br>
<!-- 更改皮肤-end -->
<div class="form-group">
<select name="skin" id="skin" class="form-control">
<?php require "../skin.html"; ?>
</select>
<button id="changeskin" class="btn btn-default">
更改皮肤
</button>
</div>
<!-- 更改语言-end -->
<button class="btn btn-default" id="cheak">
<span class="glyphicon glyphicon-play-circle"></span>运行代码
</button>
<br><br>
<div class="form-group">
<input type="text" id="filename" placeholder="请输入此文件文件名......" class="form-control">
<button class="btn btn-default" id="savecode">
<span class="glyphicon glyphicon-save"></span>保存代码(通过Cookie)
</button>
<button class="btn btn-default" id="readcode">
<span class="glyphicon glyphicon-open"></span>读入代码(通过Cookie)
</button>
</div>
</div>
</div>
<script src="src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
var editor = ace.edit("editor");
editor.setOptions({enableLiveAutocompletion: true});
editor.setTheme("ace/theme/Chrome");
editor.session.setMode("ace/mode/python");
$("#changelang").click(function(){
editor.session.setMode("ace/mode/" + $("#language").val());
});
$("#changeskin").click(function(){
editor.setTheme("ace/theme/" + $("#skin").val());
});
$("#cheak").click(function(){
var result = runcode(editor.getValue(), $("#language").val());
});
$("#savecode").click(function(){
$.cookie("File-" + $("#filename").val(), editor.getValue());
});
$("#readcode").click(function(){
editor.setValue($.cookie("File-" + $("#filename").val()));
});
</script>
</body>
</html>

这次,我使用了Bootstrap3进行美化,效果应该是这样的:

我们还需要添加更多皮肤的支持。

index.php代码138行,使用了网站根目录的skin.html

里面存有ace编辑器的所有皮肤,我已经整理好了

大家依旧可以直接拿去用

 <option value='chrome'>Chrome</option>
<option value='clouds'>Clouds</option>
<option value='crimson editor'>Crimson Editor</option>
<option value='dawn'>Dawn</option>
<option value='dreamweaver'>Dreamweaver</option>
<option value='eclipse'>Eclipse</option>
<option value='github'>GitHub</option>
<option value='iplastic'>IPlastic</option>
<option value='solarized light'>Solarized Light</option>
<option value='textmate'>TextMate</option>
<option value='tomorrow'>Tomorrow</option>
<option value='xcode'>XCode</option>
<option value='kuroir'>Kuroir</option>
<option value='katzenmilch'>KatzenMilch</option>
<option value='sqlserver'>SQL Server</option>
<option value='ambiance'>Ambiance</option>
<option value='chaos'>Chaos</option>
<option value='clouds_midnight'>Clouds Midnight</option>
<option value='cobalt'>Cobalt</option>
<option value='gruvbox'>Gruvbox</option>
<option value='gob'>Green on Black</option>
<option value='idle_fingers'>idle Fingers</option>
<option value='kr_theme'>krTheme</option>
<option value='merbivore'>Merbivore</option>
<option value='merbivore_soft'>Merbivore Soft</option>
<option value='mono_industrial'>Mono Industrial</option>
<option value='monokai'>Monokai</option>
<option value='pastel_on_dark'>Pastel on dark</option>
<option value='solarized_dark'>Solarized Dark</option>
<option value='terminal'>Terminal</option>
<option value='tomorrow_night'>Tomorrow Night</option>
<option value='tomorrow_night_blue'>Tomorrow Night Blue</option>
<option value='tomorrow_night_bright'>Tomorrow Night Bright</option>
<option value='tomorrow_night_eighties'>Tomorrow Night 80s</option>
<option value='twilight'>Twilight</option>
<option value='vibrant_ink'>Vibrant Ink</option>

skin.html

那么,大家就可以访问你的网站根目录下/editor了

是不是灰常简单呢?

对了,如果还有问题,可以在评论区回复我哦

最新文章

  1. 部署私有的Nuget服务器
  2. 【Unity3D游戏开发】之利用语法糖添加自定义拓展方法(下) (十八)
  3. php--部分session与cookie
  4. JAVA集合小结
  5. 【Qt for Android】OpenGL ES 绘制彩色立方体
  6. 黑马程序员:Java基础总结----java注解
  7. POI实现Excel导入导出
  8. Docker 镜像仓库
  9. Docker 部署应用过程记录
  10. 消息通讯之关于消息队列MQ必须了解的相关概念
  11. Python3基础 os.path.dirname 对路径字符串进行处理 返回所在文件夹的路径
  12. Python - Django - 登录页面
  13. 代码整洁之道读书笔记(Ch4-Ch7)
  14. 对于应用需要记录某个方法耗时的场景,必须使用clock_gettime传入CLOCK_MONOTONIC参数,该参数获得的是自系统开机起单调递增的纳秒级别精度时钟,相比gettimeofday精度提高不少,并且不受NTP等外部服务影响,能准确更准确来统计耗时(java中对应的是System.nanoTime),也就是说所有使用gettimeofday来统计耗时(java中是System.curre
  15. Emgu CV的配置以及在VS 2012中进行图像处理的步骤和实例
  16. 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)(Finchley版本)
  17. 【转】SonarQube配置自定义的CheckStyle代码规则
  18. java基础编程——用两个栈来实现一个队列
  19. port_443
  20. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

热门文章

  1. 【POJ - 1573】Robot Motion
  2. 关于使用 AJax 生成Form表单,且表单提交需要验证,验证实效的解决方法
  3. sizeof()和lstrlen()和strlen()区别
  4. bzoj2431 || 洛谷P1521 求逆序对
  5. Y服务-你真的懂 Yaml 吗
  6. [git] 基础命令笔记
  7. Linux系统安装Tomcat——.tar.gz版(old)
  8. window平台下 cmd 命令窗口的编码设置
  9. 前端jQuery学习(一)
  10. IDEA自定义配置