Ludong University Online Judge
鲁东大学程序设计在线测评系统与考试平台
💡 快速了解
概览
预览网站 ;您可以使用账号guest0(密码:9AF860CB)登录参观网站。
该账号可以进入后台管理,不要使用该账号破坏小破站哦😃
程序设计在线评测系统,大学生程序设计考试系统,ACM-ICPC竞赛系统
支持考试/竞赛,支持编程题、代码填空(C/C++/Java/Python3)
Web后端基于php框架 laravel 6.0 开发,php版本=7.2
Web前端使用bootstrap4、jquery,适配移动端和PC端
判题端基于C/C++和shell编程,存放于judge文件夹
前台
首页;公告/新闻,本周榜,上周榜
状态;用户提交记录与判题结果
问题;题库(编程、代码填空)
竞赛;题目(选自题库),排名(ACM,OI)可封榜,赛后补题榜,公告栏,气球派送
排名;用户解题排行榜,可按年/月/周/日查询
后台
判题机;启动/停止linux判题端进程
公告/新闻;用户访问首页可见
用户管理;账号权限分配,批量生成账号,黑名单
题目管理;增改查,公开/隐藏,重判结果,导入与导出(兼容hustoj)
竞赛管理;增删查改,公开/隐藏
系统配置;修改网站名称,打开/关闭一些全局功能,中英文切换等。
开发计划(欢迎在issue区提出建议)
讨论板增加审核功能,以及总开关。
题号重排。目前题号在数据库作为主键,不支持题号重排。
代码高亮。以及使用网页代码编辑器。
查重代码左右对比。
增加About专栏,向用户解释判题命令等。
增加echarts工具进行数据分析,包括榜单、题目通过率等的图表展示。
美化UI,首页增加竞赛、新闻、照片等信息的展示。
后台题面编辑增加markdown编辑器。
考试模式。考试期间只允许考试账号登录,限制登录ip等。
增加版本号标识,以及通过网页端升级系统。
🔧 项目安装
基于Linux Ubuntu 16.04 / 18.04
[帮助:更换软件源]
git clone https://gitee.com/iamwinter/LDUOnlineJudge.git /home/LDUOnlineJudge
# git clone https://github.com/iamwinter/LDUOnlineJudge.git /home/LDUOnlineJudge
bash /home/LDUOnlineJudge/install/ubuntu16.04/install.sh
浏览器访问服务器ip进入首页
注册用户admin自动成为管理员
mysql数据库名lduoj,默认用户lduoj@localhost(密码123456789)
nginx配置文件/etc/nginx/conf.d/lduoj.conf
基于docker(推荐)
[帮助:更换docker镜像源]
docker run -dit --restart=always --cap-add=SYS_PTRACE \
-p 8080:80 \
-v ~/lduoj_docker:/volume \
--name lduoj \
iamwinter/lduoj:latest
-p参数后的8080是主机端口,可自定义。
浏览器访问服务器ip:8080进入首页。
配置域名与端口
-v参数后的~/lduoj_docker是用于保存数据的主机目录,可自定义。
如需备份系统,只需将此文件夹打包备份。
进入容器进行管理: docker exec -it lduoj /bin/bash
🔨 项目升级
基于Linux Ubuntu安装的用户请执行后两行;
基于docker安装的用户请执行全部命令。
docker exec -it lduoj /bin/bash
git clone https://gitee.com/iamwinter/LDUOnlineJudge.git /home/lduoj_upgrade
# git clone https://github.com/iamwinter/LDUOnlineJudge.git /home/lduoj_upgrade
bash /home/lduoj_upgrade/install/ubuntu16.04/update.sh
💿 项目迁移
基于Ubuntu16.04 / 18.04
1.在原主机备份数据库、nginx配置
bash /home/LDUOnlineJudge/install/mysql/database_backup.sh
cp -f /etc/nginx/conf.d/lduoj.conf /home/LDUOnlineJudge/install/nginx/lduoj.conf
2.拷贝原主机文件夹/home/LDUOnlineJudge到新主机相同路径。
3.在新主机上执行安装。
bash /home/LDUOnlineJudge/install/ubuntu16.04/install.sh
基于docker
1.在原主机将文件夹~/lduoj_docker(或docker容器内/volume)打包,发送到新主机相同位置。
原主机 [ 进入容器 -> 打包压缩 -> 发送到新主机(用户名root;ssh端口号22;实际ipip) ]:
docker exec -it lduoj /bin/bash
tar -zcvf volume.tar.gz /volume
scp -P 22 volume.tar.gz root@ip:~/
新主机 [ 解压 -> 重命名 ]:
cd ~/
tar -zxvf volume.tar.gz
mv volume lduoj_docker
2.在新主机基于docker安装(见项目安装)。
3.若原主机自定义了nginx配置文件,可自行复制到新主机。
或参考配置域名与端口
📣 判题端使用说明
启动方式
A. 网页端进入后台首页,即可点击相应按钮启动/重启/停止判题端
B. 通过终端命令启动判题端:bash /home/LDUOnlineJudge/judge/startup.sh
判题端配置
数据库连接信息、判题线程数、判题机名称等配置项均在项目根目录下文件.env
默认判题线程数为5,可根据服务器内存及性能适当调节
📄 整体架构
主要文件
routes/web.php:路由转发文件,定义了全站路由。
config/oj/:含本OJ自定义的配置文件。
app/Http/:后端控制器Controllers、中间件Middleware等程序。
resources/views/:前端html代码。
resources/lang/:网页文字语言文件。
public/:网页访问入口index.php,js、css文件和web插件。
storage/app/:保存题目数据、文件等。
storage/app/public/:保存静态文件(如图片)等。
软连接到public/storage供网页访问。
judge/:判题程序,与laravel框架无关。
install/:用于安装本OJ,与laravel框架无关。
.env.example:配置文件,含数据库连接信息、判题设置等。
复制为.env生效。
工作原理
Web前端使用bootstrap4、jquery,适配移动端和PC端。
网页端向用户展示题目等相关信息,用户可通过题目或竞赛途径上传自己的代码。
判题机启动时,轮询程序(judge/cpp/polling.cpp)将不停查询数据库,
收集未判的提交记录(提交编号),
然后开启子进程(judge/cpp/judge.cpp)判题(最多并行5个)。
对于每一个判题进程,主要步骤是:从数据库读取代码、编译、输入数据运行、
输出结果与正确结果对比(或者特判)、将判题结论写入数据库。
💻 本地二次开发
下载源码
git clone https://gitee.com/iamwinter/LDUOnlineJudge.git
# git clone https://github.com/iamwinter/LDUOnlineJudge.git
cd LUDOnlineJudge
准备环境
推荐phpstudy(含php、mysql、nginx等环境)。推荐IDE是PhpStorm。
数据库创建:LDUOnlineJudge/install/mysql/lduoj.sql。
nginx配置:LDUOnlineJudge/install/nginx/lduoj.conf。
也可以自行配置apache服务器。
填写配置文件
cp -rf .env.example .env
然后编辑.env文件,填写mysql连接信息。
初始化项目
mkdir -p storage/app/public # 新建前端静态文件存储目录
chmod -R 777 storage bootstrap/cache # linux必需!
composer install --ignore-platform-reqs # 下载依赖
php artisan storage:link # 将静态文件存储目录软连接到public/storage
php artisan key:generate # 必需,生成.env中的APP_KEY
php artisan optimize # 必需,加载并优化所有配置信息
预览主页。
打开浏览器访问http://localhost:port显示主页则表示部署成功,
其中port请替换为nginx配置的端口号。
开始愉快的编程。
🌏 Docker镜像发布
将本项目构建为docker镜像,务必在一个新建文件夹内操作(如./lduoj_build,结束后删除即可)
mkdir lduoj_build && cd lduoj_build
git clone https://gitee.com/iamwinter/LDUOnlineJudge.git
# git clone https://github.com/iamwinter/LDUOnlineJudge.git
docker build -f ./LDUOnlineJudge/install/docker/Dockerfile -t lduoj:local .
为镜像重命名(相当于复制了一份,请将用户名iamwinter替换)
docker tag lduoj:local iamwinter/lduoj:latest
将镜像上传到dockerhub
docker login
docker push iamwinter/lduoj:latest
💝 鸣谢
📜 开源许可
iamwinter/LDUOnlineJudge is licensed under the