这是一个基于云原生架构的在线考试系统,采用前后端分离设计,支持考生考试、考官出题与阅卷等功能。系统使用 Docker 容器化部署,具有高可用、易扩展的特点。
┌─────────────────┐ ┌─────────────────┐ │ Frontend │ │ Backend │ │ (Vue 3 + Vite) │◄────────►│ (Go + Gin) │ │ :3000 │ │ :8080 │ └─────────────────┘ └─────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ MySQL │ │ Redis │ │Prometheus│ │ :3306 │ │ :6379 │ │ :9090 │ └──────────┘ └──────────┘ └──────────┘
./start.sh
启动脚本会自动完成以下操作:
| 服务 | 地址 | 说明 |
|---|---|---|
| 📱 前端应用 | 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 |
⚠️ 生产环境请修改默认密码和密钥
/workspace/ ├── cloud-native-exam-system/ # 主项目目录 │ ├── backend/ # Go 后端服务 │ │ ├── cmd/api/ # API 服务入口 │ │ │ └── main.go # 应用启动 │ │ ├── app/ # 业务逻辑层 │ │ │ ├── repo/ # 数据访问层 (10个文件) │ │ │ ├── service/ # 业务服务层 (9个文件) │ │ │ └── store/ # 状态存储 (Redis Token) │ │ ├── domain/ # 领域模型 │ │ │ ├── model/ # 数据模型 │ │ │ ├── exam.go # 考试模型 │ │ │ ├── paper.go # 试卷模型 │ │ │ └── question.go # 题目模型 │ │ ├── handler/ # HTTP 处理器 │ │ │ ├── dto/ # 数据传输对象 │ │ │ ├── auth.go # 认证处理器 │ │ │ ├── exam.go # 考试处理器 │ │ │ ├── paper.go # 试卷处理器 │ │ │ ├── submit.go # 提交处理器 │ │ │ └── result.go # 结果处理器 │ │ ├── middleware/ # 中间件 │ │ │ ├── auth.go # JWT 认证 │ │ │ ├── logger.go # 日志记录 │ │ │ ├── recover.go # 异常恢复 │ │ │ ├── request_id.go # 请求 ID │ │ │ └── require_role.go # 角色验证 │ │ ├── pkg/ # 公共包 │ │ │ ├── errno/ # 错误码定义 │ │ │ └── resp/ # 统一响应格式 │ │ ├── migrations/ # 数据库迁移 │ │ │ ├── 001_init_schema.sql │ │ │ └── 002_seed_data.sql │ │ ├── configs/ # 配置文件 │ │ ├── deploy/ # 部署配置 │ │ ├── Dockerfile # 后端镜像构建 │ │ ├── go.mod # Go 模块依赖 │ │ ├── Makefile # 构建脚本 │ │ └── .env # 环境变量 │ ├── frontend/ # Vue 3 前端应用 │ │ ├── src/ │ │ │ ├── api/ # API 客户端 │ │ │ │ ├── auth.ts │ │ │ │ ├── exam.ts │ │ │ │ ├── paper.ts │ │ │ │ ├── submission.ts │ │ │ │ └── client.ts │ │ │ ├── components/ # 公共组件 │ │ │ │ ├── Navbar.vue │ │ │ │ ├── Footer.vue │ │ │ │ ├── Toast.vue │ │ │ │ ├── AnswerSelector.vue │ │ │ │ └── QuestionEditorModal.vue │ │ │ ├── router/ # 路由配置 │ │ │ │ └── index.ts │ │ │ ├── store/ # Pinia 状态管理 │ │ │ │ ├── auth.ts │ │ │ │ └── index.ts │ │ │ ├── views/ # 页面视图 │ │ │ │ ├── candidate/ # 考生端 │ │ │ │ │ ├── Dashboard.vue │ │ │ │ │ ├── Taking.vue │ │ │ │ │ └── Submissions.vue │ │ │ │ ├── examiner/ # 考官端 │ │ │ │ │ ├── Dashboard.vue │ │ │ │ │ ├── Exams.vue │ │ │ │ │ ├── Papers.vue │ │ │ │ │ ├── PaperEditor.vue │ │ │ │ │ └── Results.vue │ │ │ │ ├── Login.vue │ │ │ │ ├── Register.vue │ │ │ │ └── NotFound.vue │ │ │ ├── types/ # TypeScript 类型 │ │ │ ├── utils/ # 工具函数 │ │ │ ├── App.vue │ │ │ └── main.ts │ │ ├── public/ # 静态资源 │ │ ├── Dockerfile # 前端镜像构建 │ │ ├── nginx.conf # Nginx 配置 │ │ ├── vite.config.ts # Vite 构建配置 │ │ ├── tailwind.config.ts # Tailwind 配置 │ │ └── package.json # NPM 依赖 │ └── deploy/ # 部署配置 │ └── migrations/ # 完整迁移脚本 ├── images/ # 自定义镜像 │ ├── mysql/ # MySQL 镜像 │ └── redis/ # Redis 镜像 ├── docs/ # 文档目录 │ └── PROJECT_DOCUMENTATION.md # 详细项目文档 ├── docker-compose.yml # CI/CD 配置 ├── start.sh # 启动脚本 ├── Dockerfile # 根 Dockerfile └── README.md # 项目说明
1. 用户登录/注册 ↓ 2. 查看可用考试列表 ↓ 3. 选择考试开始答题(倒计时开始) ↓ 4. 答题(单选/多选/判断题) ↓ 5. 提交答卷 ↓ 6. 查看成绩与详细结果
1. 用户登录/注册 ↓ 2. 创建试卷 ↓ 3. 添加题目(支持多种题型) ↓ 4. 发布考试(设置时间窗口) ↓ 5. 查看考生提交记录 ↓ 6. 查看成绩统计与分析
docker compose down
如果需要删除所有数据卷:
docker compose down -v
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| POST | /auth/login | 用户登录 | 公开 |
| POST | /auth/register | 用户注册 | 公开 |
| GET | /auth/me | 获取当前用户 | 需认证 |
| POST | /auth/logout | 用户登出 | 需认证 |
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| POST | /papers | 创建试卷 | 需认证 |
| GET | /papers | 试卷列表 | 教师角色 |
| GET | /papers/:id | 试卷详情 | 教师角色 |
| POST | /papers/change/:id | 更新试卷 | 教师角色 |
| DELETE | /papers/:id | 删除试卷 | 教师角色 |
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| POST | /exams | 创建考试 | 需认证 |
| GET | /exams | 考试列表 | 教师角色 |
| GET | /exams/:id | 考试详情 | 需认证 |
| GET | /exams/available | 可用考试 | 需认证 |
| POST | /exams/:id/publish | 发布考试 | 需认证 |
| POST | /exams/:id/close | 关闭考试 | 教师角色 |
| DELETE | /exams/:id | 删除考试 | 教师角色 |
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| POST | /exams/:id/submit | 提交答案 | 需认证 |
| 方法 | 路径 | 描述 | 权限 |
|---|---|---|---|
| GET | /results | 成绩列表 | 需认证 |
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /healthz | 健康检查 |
| GET | /readyz | 就绪检查 |
| 表名 | 说明 | 关键字段 |
|---|---|---|
| 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 |
如果提示端口被占用:
# 查看占用进程
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 格式化详细项目文档请查看:docs/PROJECT_DOCUMENTATION.md
包含内容:
最后更新: 2026-02-21