这是一个基于云原生架构的在线考试系统,采用前后端分离设计,支持考生考试、考官出题与阅卷等功能。系统使用 Docker 容器化部署,具有高可用、易扩展的特点。
| 版本 | 说明 | 功能范围 |
|---|---|---|
| V1 | 最小可用考试系统 | 选择题(单选/多选/判断)考试、自动评分 |
| V2 | 编程题判分系统 | 在 V1 基础上新增编程题自动评测(Java) |
┌─────────────────┐ ┌─────────────────┐ │ Frontend │ │ Backend │ │ (Vue 3 + Vite) │◄────────►│ (Go + Gin) │ │ :3000 │ │ :8080 │ └─────────────────┘ └─────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ MySQL │ │ Redis │ │Prometheus│ │ :3306 │ │ :6379 │ │ :9090 │ └──────────┘ └──────────┘ └──────────┘
./start.sh
启动脚本会自动完成以下操作:
docker compose down
如果需要删除所有数据卷:
docker compose down -v
| 服务 | 地址 | 说明 |
|---|---|---|
| 📱 前端应用 | http://localhost:3000 | Vue 3 用户界面 |
| 🧪 后端API | http://localhost:8080 | Go RESTful API |
| 💚 健康检查 | http://localhost:8080/healthz | 服务健康状态 |
| 📊 指标监控 | http://localhost:8080/metrics | Prometheus 指标 |
| 📈 Prometheus | http://localhost:9090 | 监控面板 |
系统已创建以下测试账号:
| 角色 | 用户名 | 密码 | 密钥 |
|---|---|---|---|
| 考生 | testuser | password123 | kotres-gyxfa3-vywmyQ |
| 考官 | examiner | admin123 | mazmyk-gubbit-pohFo1 |
⚠️ 生产环境请修改默认密码和密钥
| 需求 | 推荐文档 |
|---|---|
| 项目整体说明 | ddocs/V1版本/V1.03_项目文档/11_项目主README.md |
| API 接口文档 | docs/API.md |
| 详细项目文档 | docs/PROJECT_DOCUMENTATION.md |
| 完整文档索引 | ddocs/README.md |
/workspace/ ├── README.md # 本文件 - 项目主入口 ├── ddocs/ # 完整文档库 │ ├── README.md # 文档索引 │ ├── V1版本/ # V1 版本文档 │ │ ├── V1.01_基础修复/ │ │ ├── V1.02_前端优化/ │ │ └── V1.03_项目文档/ │ └── V2版本/ # V2 版本文档 │ ├── V2.01_数据库迁移/ │ ├── V2.02_编程题功能/ │ ├── V2.03_开发工具/ │ ├── V2.04_架构设计与文档/ │ ├── V2.05_代码优化/ │ ├── V2.06_后端开发/ │ ├── V2.07_前端开发/ │ ├── V2.08_数据库与部署/ │ └── V2.09_问题记录与测试/ ├── docs/ # 核心文档 │ ├── API.md # API 接口文档 │ └── PROJECT_DOCUMENTATION.md # 详细项目文档 └── cloud-native-exam-system/ # 主项目代码 ├── backend/ # Go 后端服务 └── frontend/ # Vue 3 前端应用
1. 用户登录/注册 ↓ 2. 查看可用考试列表 ↓ 3. 选择考试开始答题(倒计时开始) ↓ 4. 答题 ├─ 单选题/多选题/判断题 └─ 编程题(V2 新增,支持自测运行) ↓ 5. 提交答卷 ├─ 选择题即时评分 └─ 编程题异步判题(V2 新增) ↓ 6. 查看成绩与详细结果
1. 用户登录/注册 ↓ 2. 创建试卷 ├─ 选择题 └─ 编程题(V2 新增,支持测试用例配置) ↓ 3. 发布考试(设置时间窗口) ↓ 4. 查看考生提交记录 ├─ 选择题成绩 └─ 编程题判题结果(V2 新增) ↓ 5. 查看成绩统计与分析
1. 接收代码提交(POST /api/exams/:id/coding/submit) ↓ 2. 创建 code_submission 记录(status=pending) ↓ 3. 更新为 judging 状态 ↓ 4. 创建临时工作目录 ↓ 5. 生成 Java 源文件(Main.java) ↓ 6. 编译 Java 代码(javac) ├─ 编译成功 → 继续 └─ 编译失败 → 返回 CE (Compile Error) ↓ 7. 依次执行测试用例 └─ 对每个测试用例: ├─ 限制时间(time_limit_ms) ├─ 限制内存(memory_limit_kb) ├─ 执行并捕获输出 └─ 比对标准答案 ↓ 8. 生成判题结果(judge_result) ↓ 9. 更新 code_submission.score ↓ 10. 前端轮询获取结果(每1秒,最多30次)
| 结果码 | 说明 | 英文全称 |
|---|---|---|
| AC | 通过 | Accepted |
| WA | 答案错误 | Wrong Answer |
| TLE | 超时 | Time Limit Exceeded |
| MLE | 内存超限 | Memory Limit Exceeded |
| RE | 运行错误 | Runtime Error |
| CE | 编译错误 | Compilation Error |
| SE | 系统错误 | System Error |
| 表名 | 说明 | 关键字段 |
|---|---|---|
| users | 用户表 | id, username, password_hash, role, status |
| paper | 试卷表 | id, name, total_score |
| question | 题目表 | id, paper_id, type, score, content, answer_key |
| exam | 考试表 | id, title, status, start_at, end_at, paper_id |
| submission | 提交记录表 | id, exam_id, student_id, status, submitted_at |
| answer | 答案表 | id, submission_id, question_id, value |
| result | 成绩表 | id, submission_id, total_score |
| 表名 | 说明 | 关键字段 |
|---|---|---|
| code_submission | 编程题提交表 | id, submission_id, question_id, code, status, score |
| judge_result | 判题结果表 | id, submission_id, verdict, compile_log, execution_log |
如果提示端口被占用:
# 查看占用进程
lsof -i :3000 # 前端端口
lsof -i :8080 # 后端端口
lsof -i :3306 # MySQL 端口
lsof -i :6379 # Redis 端口
# 强制结束进程
sudo kill -9 <PID>
清理后重新构建:
docker compose down --rmi all ./start.sh
检查数据库配置和 SQL 文件:
# 查看 MySQL 日志
docker compose logs mysql
# 重置数据库(会删除所有数据)
docker compose down -v
./start.sh
如果前端显示"后端服务未启动":
curl http://localhost:8080/healthzdocker compose logs backenddocker network ls如果遇到登录问题:
docker compose logs backendfeat: 新功能 fix: 修复 bug docs: 文档更新 style: 代码格式调整 refactor: 重构 test: 测试相关 chore: 构建/工具链相关
gofmt 格式化如有问题或建议,请查看详细文档或提交 Issue。
最后更新: 2026-03-03 | 当前版本: V2.0.0