豌豆Ai站群搜索引擎系统 V.25.10.25 网址:www.wd.chat

🗣 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`!

Ai作答

📣 商家广告


广告招商

香港vps

月饼

域名抢注

广告招商


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》搭建本站。

上一篇 15002 15003 15004 下一篇