ACMDOG 端云协同判题平台 · C/S 一体化架构,本地判题、云端同步、双后端存储
ACMDOJ / ACMDOG 是一套 C/S 一体化 的算法竞赛判题平台,覆盖「命题 → 发布 → 判题 → 竞赛 → 榜单」全流程。核心判题与出题引擎由 C++ 动态库 承载,上层为 WPF 桌面客户端,存储采用 MySQL(权威)+ 远端 LSM(RESP KV 缓存) 双后端。
与 Web 型 OJ 不同,本项目判题在 本地完成(本地编译 + 运行 + 比对),云端专注题目分发、提交同步、比赛报名与榜单聚合,从而把评测算力从服务器下沉到每一台客户端。
WPF 三层架构,登录注册、题目列表、做题、深色代码编辑、提交看结果。
题目工作台、比赛管理、生成器管理、数据比对;支持并发编译。
HandyControl 控件库源码 + OjEditorCore 编辑器核心(语法补全)。
自包含 exe,下载 + 安装 + 卸载三合一,免 UAC。
g++ 编译 → 限时运行 → 逐测试点比对 → 判定 AC/WA/TLE/RE/CE/SE。
authorcore.dll(编译/生成/发布)+ raftcore.dll(Raft 共识引擎)。
生产者(鉴权+限流)→ topic 交换机 → 消费者(唯一连库),Python + C++ 双实现。
在客户端与后端数据库之间增加一层 RabbitMQ 消息队列,承担缓冲、转发、鉴权、限流,保证客户端永不直连数据库。
| 版本 | 目录 | 依赖 | 说明 |
|---|---|---|---|
| Python | mq/ | pika | producer.py / http_producer.py / consumer.py |
| C++ | mq_cpp/ | AMQP-CPP | producer.cpp / consumer.cpp,poll() 手写事件循环 |
| 机制 | 说明 |
|---|---|
| 🔐 隔离 | 客户端不直连数据库,只走队列 / HTTP 代理 |
| 🔑 token 鉴权 | 非法 token 返回 401 |
| 🚦 限流 | 滑动窗口,每 client 每分钟上限,超限 429 |
| 表 | 用途 | 关键设计 |
|---|---|---|
| users | 账号 | SHA-256(salt+password),角色 admin/author/user |
| sessions | 登录会话 | token,7 天过期 |
| submissions | 提交记录 | 唯一键原地覆盖最新一版 |
| contest_registrations | 比赛报名 | 幂等,虚拟参赛标记 |
| problems | 题目 | 标程 AES-256 密文,is_public 发布开关 |
| generators | 生成器 | 全局库,源码密文 |
| problem_generators | 题目↔生成器 | 多对多关联 |
| contests | 比赛配置 | contest.json 原文 |
提交记录与比赛报名走 Redis 协议 KV 存储,作为高速共享缓存:
| 机制 | 说明 |
|---|---|
| 🔐 鉴权 | 写接口需 Bearer token,7 天过期 |
| 🚦 限流 | 滑动窗口,按 IP 限速 |
| 🛡️ 防注入 | prepared statement + 转义 |
| 🔒 加密 | 标程 / 生成器 AES-256-CBC 密文存储 |
| 🧂 密码安全 | SHA-256(salt + password),每用户随机盐 |
| ⚡ 并发 | DB 写操作 mutex 串行;编译同题串行 / 跨题并行 |
| ✅ Special Judge | spj.cpp 自动启用,退出码 0 判通过 |
一个 架构完整、工程化规范的「中等体量」C/S 判题平台。核心闭环(命题 → 判题 → 竞赛 → 榜单)已落地,多端、双存储、安全机制、一键安装器齐全,并引入 Raft 共识引擎 为多节点出题端的一致性预留能力,工程成熟度较高。