HelloJudge2
HelloJudge2 copied to clipboard
用于算法竞赛的评测系统。
HelloJudge2
简介
用于算法竞赛的评测系统。
此仓库为API服务器,可能需要配合以下两个项目使用
- https://github.com/Officeyutong/HelloJudge3-WebApp (前端WebApp)
- https://github.com/Officeyutong/HelloJudge3-Judger (评测客户端)
Demo
http://yt2soj.top/ YT2SOJ
架构
Web端和评测端。 Web端采取前后端分离,客户端渲染,后端只提供API接口。
评测采用Celery+Redis作为消息队列,评测端通过消息队列获取评测任务,并通过HTTP上报评测结果。
更新方式
在项目根目录下,直接执行git pull进行更新。
关于数据库
从2019.11.2开始,所有更新不再需要手动修改数据库。
每次更新后执行python3 manage.py db upgrade即可。
架设
Web端
前置需求
- Python3.7或者以上版本
- MySQL
- Redis
- git
部署指南
git clone https://gitee.com/yutong_java/HelloJudge2,下载本项目至本地- 使用pip安装requirements.txt中的依赖包(
pip3 install -r requirements.txt)。 - 将
config.sample.py重命名为config.py - 修改config.py
- 初始化数据库,参考下文
- 直接使用
python3.7 run.py启动或者部署到uWSGI上运行。
初始化数据库
- 运行
python3.7 manage.py db upgrade
配置文件主要内容
见config.sample.py。
SESSION_KEY
用来加密session的密钥,在第一次运行OJ之前,请填写一个随机滚键盘生成的字符串。
DATABASE_URI
数据库URI,如果使用SQLite请填写为sqlite:///data.db,其中data.db为数据库文件名。
如果使用MySQL,请填写为mysql+mysqlconnector://username:password@host:port/database_name。
DEBUG
Flask的调试模式
APP_NAME
站点名称。
PASSWORD_SALT
用于在前端加密密码的salt,请脸滚键盘生成一个字符串。
在OJ开始运行后请不要更改,否则所有数据库中的密码都会失效。
USERNAME_REGEX
新建用户的用户名必须满足这个正则表达式
REDIS_URI
Redis的地址(用于评测队列)
CACHE_URL
Redis的地址(用于缓存)
REMOTE_JUDGE_BROKER
Redis 的地址(用于远程评测队列)
如果不想在同一个评测机实例上同时进行远程评测和本地评测,请务必保证此项不与REDIS_URI相同。
JUDGERS
Web端认可的评测机列表。
每一个评测机都应该有一个唯一的UUID,Web端有这个评测机的UUID时,评测机才可以接到Web端发出的评测任务。
{
"一个评测机的UUID":"这个评测机在前端显示的名字"
}
PROBLEMS_PER_PAGE
每页显示的题目数量。
SUBMISSIONS_PER_PAGE
每页显示的提交记录数量。
DISCUSSION_PER_PAGE
每页显示的讨论数量。
COMMENTS_PER_PAGE
每页显示的评论数量。
COMPILE_TIME_LIMIT
编译程序的时间上限(ms)。
COMPILE_RESULT_LENGTH_LIMIT
发送给前端的编译结果的大小上限(bytes)
SPJ_EXECUTE_TIME_LIMIT
SPJ的执行时间上限(ms)
其他配置说明见config_default.py
如何添加语言请参考下文。
运行方式
Flask内建服务器
直接运行python3.7 run.py即可。
如何添加语言
在langs中新建语言ID.py,其中需要有以下七个字符串常量。
| 常量名 | 意义 | 例 |
|---|---|---|
| SOURCE_FILE | 源文件名(包括后缀) | {filename}.cpp,{filename}.java等 |
| OUTPUT_FILE | 目标文件名(包括后缀) | {filename}.out,{filename}.class |
| COMPILE | 编译命令行 | 使用{source}表示源文件,{output}表示目标文件 |
| RUN | 运行命令行 | |
| DISPLAY | 语言显示名 | C++ 17 |
| VERSION | 版本 | G++ 8.3 |
| ACE_MODE | 用于ACE.js的代码样式,见static/ace/mode-xxx.js | c_cpp |
其他
评测端部署指南见https://gitee.com/yutong_java/HelloJudge2-Judger
权限管理
使用manage.py进行部分权限管理(用户添加\删除权限,设置管理员). 2020.1.23更新: 已支持在Web端进行用户权限管理
- setadmin 用户ID - 设置管理员 (将用户移动到admin组并添加permission.manage权限,然后刷新缓存)
- addperm 用户ID 权限字符串 - 用户添加权限(会刷新缓存)
- removeperm 用户ID 权限字符串 - 用户删除权限(会刷新缓存)
代码行数统计(已忽略static文件夹)
309 text files.
284 unique files.
167 files ignored.
github.com/AlDanial/cloc v 1.74 T=11.70 s (12.5 files/s, 1455.6 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
HTML 37 278 39 6691
Python 96 793 2067 6296
Markdown 3 142 0 504
C++ 4 10 3 105
INI 2 11 0 42
Mako 2 14 0 36
JSON 1 0 0 3
C/C++ Header 1 0 0 1
-------------------------------------------------------------------------------
SUM: 146 1248 2109 13678
-------------------------------------------------------------------------------
TodoList
- 新的统一上传文件API
捐助
如果您觉得此项目对您有帮助,欢迎通过以下方式对作者进行捐助。

如果您在捐助时注明了您的姓名,那么您将会出现在下面的列表上。
- 2019.10.20 黑白棋子 微信 0.01
- 2019.10.20 Crystal 微信 5.20
- 2020.1.28 Johnson 支付宝 23.33