CodeNexus 在线判题系统是一个面向教育机构的多租户、多角色竞赛编程平台,支持 C/C++/Java/Python/Go/JavaScript 六种编程语言的沙箱安全评测,为学生、教师和管理员提供完整的在线编程教学与竞赛体验。
┌──────────────────┐ ┌─────────────────────────────────────────┐ ┌─────────────────┐
│ │ │ Backend (Rust) │ │ │
│ Frontend │ │ ┌─────────────────────────────────┐ │ │ Judge Worker │
│ React + Vite │────>│ │ API (Axum) │ │ │ Redis Streams │
│ TypeScript │ │ │ 9 个领域 crate + api-infra │ │<────│ cgroups/seccomp│
│ Port 5173 / 80 │ │ │ PostgreSQL + Redis + WebSocket │ │ │ 编译 / 执行 │
│ │ │ └─────────────────────────────────┘ │ │ Sandbox │
└──────────────────┘ │ Port 3000 │ └─────────────────┘
└─────────────────────────────────────────┘
▲ ▲
│ │
PostgreSQL 16 Redis 7
核心数据流: 用户通过前端提交代码,API 服务器将评测任务发布到 Redis Streams,判题工作器消费任务后在 Linux 沙箱中编译并执行代码,将评测结果回调至 API,API 再通过 WebSocket 实时推送结果给前端。
- 6 种编程语言支持 — C、C++、Java、Python、Go、JavaScript,覆盖主流教学与竞赛场景
- 沙箱安全执行 — 基于 cgroups(内存/CPU 限制)、chroot(文件系统隔离)和 seccomp(系统调用过滤)三层沙箱机制,确保评测隔离与安全
- 多租户多角色 — 支持多学校/多校区独立运作,内置 student、teacher、admin、root 四级 RBAC 权限体系,数据严格按租户隔离
- 实时评测反馈 — WebSocket 推送评测进度、排行榜更新、竞赛状态和即时通知
- 竞赛系统 — 支持创建竞赛、题目分配、实时排行榜、竞赛聊天室
- 班级与作业 — 教师可创建班级、管理学生、发布作业、查看学生提交报告
- 讨论与博客 — 题目讨论区、技术博客、评论系统,构建学习社区
- 代码查重 — 基于代码相似度检测的抄袭检测模块,支持管理后台配置
- 私信系统 — 用户间实时私信,支持未读消息提醒
- 全文搜索 — 搜索题目、用户、讨论、博客等内容
- 导入导出 — 支持题目的批量导入导出,便于题库管理与迁移
| 层级 | 技术 | 版本 |
|---|---|---|
| 前端框架 | React + TypeScript + Vite | React 19, TypeScript 5.9, Vite 7 |
| UI 组件 | Tailwind CSS v4 + shadcn + Lucide Icons | — |
| 状态管理 | Zustand(客户端状态)+ TanStack React Query(服务端状态) | — |
| 表单校验 | react-hook-form + Zod | — |
| 代码编辑器 | Monaco Editor(提交代码)+ CodeMirror(Markdown 编辑) | — |
| API 服务器 | Rust + Axum + SQLx | Rust Edition 2021, Axum 0.7, SQLx 0.8 |
| 判题工作器 | Rust + Redis Streams + cgroups/seccomp | Rust Edition 2021 |
| 数据库 | PostgreSQL | 16 |
| 缓存 / 消息队列 | Redis | 7 |
| 容器编排 | Docker Compose | — |
Online_Judge/
├── backend/ # Rust 工作空间(14 个 crate)
│ ├── Cargo.toml # 工作空间根配置
│ ├── rust-toolchain.toml # Rust 工具链版本
│ │
│ ├── api/ # API 服务器入口(Axum HTTP + WebSocket)
│ ├── api-infra/ # API 基础设施层(中间件、数据库、Redis、鉴权等共享组件)
│ ├── shared/ # 跨 crate 共享类型(Claims、Role、Permission 等)
│ │
│ ├── domain-users/ # 用户管理领域(注册、登录、个人资料、RBAC)
│ ├── domain-problems/ # 题目管理领域(题目 CRUD、测试用例、标签、可见性)
│ ├── domain-submissions/ # 提交评测领域(提交记录、评测结果、测试用例结果)
│ ├── domain-contests/ # 竞赛管理领域(竞赛创建、参与、排行榜)
│ ├── domain-classes/ # 班级作业领域(班级管理、学生注册、作业发布)
│ ├── domain-community/ # 社区互动领域(讨论、博客、评论)
│ ├── domain-leaderboard/ # 排行榜领域(全局/竞赛/班级排名)
│ ├── domain-search/ # 搜索领域(全文搜索)
│ ├── domain-imex/ # 导入导出领域(题目批量导入导出)
│ │
│ ├── judge-worker/ # 判题工作器(沙箱执行、编译、结果回调)
│ └── migration-tool/ # 数据库迁移工具(MySQL → PostgreSQL)
│
├── frontend/ # React 前端应用
│ ├── package.json # npm 依赖与脚本
│ ├── vite.config.ts # Vite 构建配置
│ ├── src/
│ │ ├── pages/ # 页面组件
│ │ ├── components/ # 通用 UI 组件
│ │ ├── services/ # API 服务层
│ │ ├── hooks/ # 自定义 Hooks
│ │ ├── store/ # Zustand 状态管理
│ │ ├── types/ # TypeScript 类型定义
│ │ ├── layouts/ # 布局组件
│ │ ├── lib/ # 工具函数
│ │ └── utils/ # 辅助工具
│ └── Dockerfile # 前端生产构建(Nginx)
│
├── docker-compose.yml # 全栈容器编排
├── scripts/ # 辅助脚本(演示数据初始化等)
├── docs/ # 额外文档
└── LICENSE # 私有许可证
shared ─────────────────────────────────────────────────────────┐
│ │
└── api-infra ────────────────────────────────────────────┐ │
│ │ │
├── domain-users │ │
├── domain-problems │ │
├── domain-submissions │ │
├── domain-contests │ │
├── domain-classes │ │
├── domain-community │ │
├── domain-leaderboard │ │
├── domain-search │ │
│ │ │
└── domain-imex ── domain-problems + domain-users │ │
│ │
api ─── 所有 domain-* + api-infra + shared ◄────────────────┘ │
│
judge-worker ◄── shared │
migration-tool ◄── shared │
详细的安装与配置指南请参阅 GETTING-STARTED.md。
docker compose up -d --build使用演示数据初始化:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/online_judge \
./scripts/bootstrap_demo.sh访问地址:
| 服务 | 地址 |
|---|---|
| 前端 | http://localhost:5173 |
| API | http://localhost:3000 |
| 健康检查 | http://localhost:3000/health |
1. 启动基础设施:
docker compose up -d postgres redis2. 启动 API 服务器:
cd backend/api
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/online_judge \
REDIS_URL=redis://localhost:6379 \
JWT_SECRET=dev-secret \
cargo run3. 启动前端开发服务器:
cd frontend
npm install
npm run dev4. 启动判题工作器(可选,需要 Linux 环境):
cd backend/judge-worker
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/online_judge \
REDIS_URL=redis://localhost:6379 \
API_URL=http://localhost:3000 \
WORKER_SECRET=dev-secret \
cargo run# API 编译与测试检查
cd backend
cargo check -p api
cargo test -p api --no-run
cargo check -p judge-worker
cargo test -p judge-worker --no-run
# 前端类型检查与构建
cd frontend
npm run typecheck --silent
npm run build --silent
# 前端 E2E 测试
npx playwright test e2e/smoke.spec.ts| 文档 | 说明 |
|---|---|
| GETTING-STARTED.md | 环境准备、安装步骤与首次运行指南 |
| ARCHITECTURE.md | 系统架构、组件关系与数据流详解 |
| DEVELOPMENT.md | 本地开发环境配置与编码规范 |
| TESTING.md | 测试框架、运行方式与覆盖率要求 |
| API.md | REST API 接口文档 |
| CONFIGURATION.md | 环境变量与配置项说明 |
| DEPLOYMENT.md | 生产环境部署指南 |
本项目采用私有许可证,详见 LICENSE。未经授权不得使用、复制、修改或分发。