🗣 Wd提问: oj网站开发
🤖 Ai回答: 开发一个 OJ(Online Judge,在线判题)网站是一个复杂但非常有意义的项目,它涉及前端、后端、数据库、编译/执行环境、评测系统等多个模块。下面我将为你提供一个完整的 OJ 网站开发指南,涵盖架构设计、技术选型、核心功能实现以及部署建议。
一、项目目标
构建一个支持用户提交代码、自动评测、显示结果、排行榜、题目管理等功能的在线判题系统。
核心功能
1、用户系统:注册、登录、权限管理。
2、题目系统:增删改查题目,支持多语言(C++、Python、Java等)。
3、提交系统:用户提交代码,系统自动评测。
4、评测系统:运行代码并比对输出,判断正确性。
5、排行榜:按通过率、解题数、积分排序。
6、题库管理:分类、标签、难度等级。
7、实时反馈:显示“编译错误”、“运行超时”、“答案错误”、“正确”等状态。
二、技术栈推荐(可自定义)
| 模块 | 推荐技术 |
| 前端 | React/Vue + Tailwind CSS / Bootstrap |
| 后端 | Node.js (Express/NestJS) / Python (Django/FastAPI) / Java (Spring Boot) |
| 数据库 | PostgreSQL / MySQL / MongoDB |
| 代码执行 | Docker + 容器隔离 + 超时控制 |
| 文件存储 | 本地 / MinIO / AWS S3 |
| 队列系统 | Redis + Celery / BullMQ(异步任务处理) |
| 日志监控 | ELK / Sentry / Prometheus + Grafana |
✅ 推荐组合:Vue + FastAPI + PostgreSQL + Docker + Redis + Celery
三、系统架构设计
[用户浏览器]
↓
[前端 (Vue/React)] → [API Gateway (FastAPI)]
↓
[后端服务]
├── 用户服务
├── 题目服务
├── 提交服务
└── 评测服务 (异步)
↓
[Redis 任务队列] → [Docker 容器执行器]
↓
[结果写回数据库]
↓
[前端实时更新结果]
四、核心模块详解
1、用户系统
注册/登录(JWT 或 OAuth)
权限控制(普通用户、管理员)
个人信息管理
python
FastAPI 示例:用户模型
from pydantic import BaseModel
from typing import Optional
class UserCreate(BaseModel):
username: str
password: str
email: str
class UserLogin(BaseModel):
username: str
password: str
2、题目管理
题目字段:标题、描述、输入格式、输出格式、样例、测试数据、时间/空间限制、难度、标签。
支持 Markdown 编辑器(如 `markdown-it`)。
json
{
title: 两数之和,
description: 给定数组和目标值,返回两个数的下标。,
input_format: 第一行是n,第二行是n个整数。,
output_format: 输出两个下标,用空格分隔。,
sample_input: 5\n2 7 11 15\n9,
sample_output: 0 1,
time_limit_ms: 1000,
memory_limit_kb: 262144,
difficulty: easy
}
3、提交代码流程
1、用户提交代码(语言、代码内容)。
2、后端生成唯一提交 ID,保存到数据库。
3、将任务放入 Redis 队列(如 `celery`)。
4、评测服务从队列中取出任务,使用 Docker 容器执行代码。
5、比较输出与标准答案。
6、返回结果(AC/WA/TLE/CE)并更新数据库。
示例:评测任务(Celery)
python
tasks.py
from celery import Celery
import docker
import os
import tempfile
app = Celery('oj_tasks', broker='redis://localhost:6379')
@app.task
def evaluate_submission(submission_id, code, language, test_case_dir):
client = docker.from_env()
1、创建临时目录
with tempfile.TemporaryDirectory() as tmpdir:
写入代码文件
lang_map = {
'cpp': 'main.cpp',
'python': 'main.py',
'java': 'Main.java'
}
filename = lang_map.get(language, 'main')
with open(os.path.join(tmpdir, filename), 'w') as f:
f.write(code)
2、运行容器
try:
container = client.containers.run(
image=f'{language}-runtime',
volumes={tmpdir: {'bind': '/code', 'mode': 'ro'}},
working_dir='/code',
command=['timeout', '1s', './run.sh'], 限制时间
network_disabled=True,
mem_limit='256m',
remove=True,
stdout=True,
stderr=True
)
output = container.decode('utf-8')
except Exception as e:
return {status: TLE, error: str(e)}
3、比对输出
expected = open(os.path.join(test_case_dir, 'output.txt')).read()
if output.strip() == expected.strip():
status = AC
else:
status = WA
4、更新数据库
update_submission_status(submission_id, status, output)
return {status: status, output: output}
⚠️ 注意:必须使用 Docker 容器隔离,防止恶意代码破坏服务器。
4、安全机制(关键!)
| 风险 | 防护措施 |
| 恶意代码执行 | 使用 Docker 容器,限制资源(内存、时间) |
| 无限循环 | `timeout` 命令限制执行时间 |
| 读取敏感文件 | 挂载只读目录,禁止访问 `/etc`, `/root` |
| DoS 攻击 | 限制单用户提交频率(Redis 计数) |
| 代码注入 | 输入过滤 + 白名单语言 |
5、实时反馈(前端)
使用 WebSocket(Socket.IO)或轮询方式更新提交状态。
javascript
// Vue + Socket.IO
socket.on('submission_result', (data) = {
const { submissionId, status, output } = data;
// 更新页面展示
});
五、部署建议
1、服务器配置
至少 4GB RAM,2 CPU,50GB SSD
Linux(Ubuntu/CentOS)
2、Docker Compose 部署示例
yaml
docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
8000:8000
depends_on:
redis
db
redis:
image: redis:alpine
db:
image: postgres:15
environment:
POSTGRES_DB: oj_db
POSTGRES_USER: oj_user
POSTGRES_PASSWORD: oj_pass
volumes:
pgdata:/var/lib/postgresql/data
worker:
build: .
command: celery -A tasks.celery_app worker -l info
depends_on:
redis
db
volumes:
pgdata:
3、Nginx 反向代理 + HTTPS
nginx
server {
listen 443 ssl;
server_name oj.65.hk;
ssl_certificate_file /path/to/cert.pem;
ssl_certificate_key_file /path/to/privkey.pem;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /ws/ {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}
}
六、扩展功能(进阶)
| 功能 | 说明 |
| 在线编程编辑器 | 使用 Monaco Editor(VS Code 同源) |
| 多人比赛(Contest) | 支持定时赛、排名、倒计时 |
| 题解社区 | 用户发布题解、评论 |
| 代码审核 | 自动检测冗余代码、风格问题 |
| 机器学习推荐 | 根据用户水平推荐题目 |
七、开源项目参考
1、[Judge0](https://github.com/judge0/api) – 开源在线评测引擎,支持多种语言。
2、[Codeforces](https://github.com/codeforces) – 高并发比赛系统(可研究其架构)。
3、[Timus Online Judge](https://github.com/timus-online-judge) – 经典老项目。
4、[OpenOJ](https://github.com/OpenOJ/OpenOJ) – 中文开源 OJ。
八、总结
| 步骤 | 建议 |
| 1、从最小可用产品开始 | 实现「提交→评测→返回结果」核心链路 |
| 2、用 Docker 隔离执行环境 | 安全第一 |
| 3、异步任务 + 队列 | 避免阻塞主服务 |
| 4、逐步添加功能 | 用户系统 → 题库 → 比赛 → 社区 |
| 5、监控 & 日志 | 保证稳定性 |
如果你希望我帮你:
搭建一个完整可运行的 OJ 项目模板?
提供 GitHub 仓库结构?
写一个完整的 `Dockerfile` + `FastAPI` 示例?
请告诉我你的技术偏好(如:用 Python?Node.js?),我可以为你生成完整代码框架!
🚀 你现在就可以开始第一步:创建一个 `main.py` 和 `Dockerfile`!
📣 商家广告:





0
IP地址: 58.82.237.176
搜索次数: 0
提问时间: 2025-10-26 00:08:14
🛒 域名购买:
61.chat
sou.gg
83.gs
xiongsou.com.cn
pjtf.cn
sbnjt.com.cn
w-t.cn
27.gold
gz.gold
826.net.cn
❓️ 热门提问:
蜘蛛池技术支持SEO优化
程序脚本云服务器
dns cdn
网店托管代运营多少钱
云服务器和云主机哪个好
idc icp isp
站群SEO网站SEO外链策略
云计算hadoop
VPS高防服务器推荐
国产短视频SEO
豌豆Ai站群搜索引擎系统
🌐 域名评估:
dji.ah.cn
j.hl.cn
sou.gg
nxve.cn
3q.ah.cn
shopcarpetny.com
Peach.ltd
xw.gs
jj.he.cn
g-y.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
单人风淋室
Suchmaschinen Ranking
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。