全栈考试与权限管理系统-开发报告

项目名称
基于 Spring Boot + Vue 3 的校园考试与权限管理系统
一、项目概述
本系统面向学校/教育机构,提供完整的用户与权限管理、学生信息管理、题库管理、练习/模拟/正式考试流程、成绩统计与导出、教师阅卷、以及利用本地大模型(本地部署的 LLM)进行单选题与填空题自动批阅的能力。系统目标是易用、安全、可扩展,便于日常教学考试管理与成绩分析。
二、主要功能模块(高层)
身份与权限管理(RBAC)
- 角色:学生、教师、管理员、领导/部门
- 权限管理:细粒度权限点管理(增删改查、批量导入、阅卷、发布考试等)
用户与学生管理
- 学生信息增删改查、按班级/年级/学号/姓名查询
- 批量上传(CSV/Excel)并校验(重复/缺失/数据格式)
考试与题库管理
- 题型支持:单选、多选、判断、填空(可扩展:主观题)
- 题库批量导入(CSV/Excel/JSON)并校验
- 题目标签、科目、难度、分数配置
刷题/模拟/考试功能
- 刷题(针对题库练习)与模拟(随机试卷/组卷规则)
- 正式考试(在线计时、题目随机化、试卷发布/下发)
阅卷与批改
- 自动批改:单选/多选/判断题 + 基于本地大模型的填空题(可配置阈值与人工复核)
- 教师手动批阅主观题并留评语
成绩与分析
- 单人成绩查看、班级/年级排名、分数分布、错题统计
- 支持按班级/年级快速导出 Excel/CSV(可自定义字段)
日志/审计与安全
- 操作日志、考试完整性(防作弊基本措施)
管理后台与接口文档(Swagger)
三、技术栈推荐
后端
- Java 17+
- Spring Boot 3.x
- Spring Security(JWT 或 OAuth2 资源服务器)用于认证/授权
- Spring Data JPA(或 MyBatis-Plus)用于 ORM
- 数据库:PostgreSQL(推荐),可选 MySQL
- 文件存储:本地文件系统或对象存储(MinIO)用于保存上传文件/试卷答题日志
- 缓存:Redis(会话、频率限制、考试临时状态)
- 异步任务:Spring Task / RabbitMQ(用于批量导入、成绩批量统计、LLM 批阅队列)
- 文档:Springdoc OpenAPI(自动生成 Swagger)
前端
- Vue 3 + Vite
- TypeScript
- Pinia(状态管理)
- Vue Router
- Element Plus(或 Ant Design Vue)作为 UI 组件库
- Axios(HTTP 客户端)
- xlsx / sheetjs(Excel 导入导出)
本地大模型集成(快速批阅)
- 本地推理服务(例如:Llama.cpp, Ollama 本地服务,或其他兼容的本地推理服务)
- 后端通过 gRPC/HTTP 调用本地模型推理服务
- 使用微调或 prompt-engineering 来控制评分规则与相似度阈值
辅助/DevOps
- Docker / Docker Compose(容器化)
- CI:GitHub Actions / GitLab CI
- 日志:ELK 或 Loki + Grafana(可选)
- 监控:Prometheus & Grafana(可选)
四、数据库设计(核心表,含字段及说明)
以下为主要表的建议字段(已省略常见的 create_time/update_time、deleted_flag 等审计字段,请按需添加)
1. users(系统用户)
- id (bigint, PK)
- username (varchar, 唯一)
- password_hash (varchar)
- real_name (varchar)
- email (varchar)
- mobile (varchar)
- role_id (bigint) — 默认角色或主角色
- status (int) — 状态:正常/禁用
- last_login (timestamp)
2. roles(角色)
- id (bigint, PK)
- name (varchar)
- code (varchar) — 如 ROLE_ADMIN/ROLE_TEACHER
- description (text)
3. permissions(权限点)
- id (bigint, PK)
- name (varchar)
- code (varchar) — 如 student:import, exam:publish
- description (text)
4. role_permission(角色-权限关联)
- id
- role_id
- permission_id
5. user_role(用户-角色多对多,可选)
- id
- user_id
- role_id
6. students(学生信息)
- id
- student_no (varchar, 唯一)
- name
- gender
- birthday (date)
- class_id (FK)
- grade (int)
- address
- contact_parent
- admission_year (int)
7. classes(班级)
- id
- name
- grade (int)
- major (varchar)
8. teachers(教师信息,可合并 users 表并加 role)
- id
- teacher_no
- name
- department_id
9. departments(组织/领导部门)
- id
- name
- parent_id
10. subjects(科目)
- id
- name
- code
11. question_bank(题库主表/题目表)
- id
- title (text)
- type (enum: SINGLE,MULTI,TRUE_FALSE,BLANK,ESSAY)
- options (json) — 对单选/多选保存选项
- answer (text/json) — 标准答案
- score (decimal)
- difficulty (int)
- subject_id
- tags (json)
- created_by (user_id)
12. question_import_job(题库导入任务)
- id
- file_path
- status (PENDING/PROCESSING/FAILED/SUCCESS)
- total_count
- success_count
- fail_count
- error_log (text)
13. exam_paper(试卷模板/考次)
- id
- name
- description
- start_time
- end_time
- duration_minutes
- total_score
- shuffle_questions (bool)
- publish_status (DRAFT/PUBLISHED/ENDED)
- grade_scope (班级/年级/指定学生)
14. exam_paper_question(试卷-题目关联)
- id
- exam_paper_id
- question_id
- seq_no
- score
15. exam_session(学生参加的考试记录/答卷实例)
- id
- exam_paper_id
- user_id (student)
- start_time
- end_time
- status (IN_PROGRESS/SUBMITTED/GRADED)
- total_score
- metadata (json) — 如 IP、设备、试题顺序等
16. student_answer(学生答案)
- id
- exam_session_id
- question_id
- answer (text/json)
- score_awarded (decimal, nullable)
- is_auto_graded (bool)
- grader_id (teacher_id nullable)
- graded_at (timestamp)
- remark (text)
17. grading_job(异步批阅任务)
- id
- exam_session_id
- status (QUEUED/PROCESSING/COMPLETED/FAILED)
- engine (AUTO/LLM/HUMAN)
- result_summary (json)
18. score_snapshot(用于快速统计的成绩快照表,按班/年级)
- id
- exam_session_id
- student_id
- class_id
- grade
- total_score
- rank_in_class
- rank_in_grade
19. upload_jobs(通用批量上传任务表)
- id
- type (STUDENT/QUESTION)
- file_path
- status
- errors (text)
五、API 接口列表(按模块列出主要接口,示例请求/响应要点)
所有接口建议统一前缀
/api/v1,并使用标准的 HTTP 状态码与错误格式。
鉴权与用户
POST
/api/v1/auth/login— 登录(返回 JWT token、refresh token)- body:
{ username, password } - resp:
{ accessToken, refreshToken, user: {id, username, roles}}
- body:
POST
/api/v1/auth/refresh— 刷新 tokenGET
/api/v1/users/me— 获取当前用户信息POST
/api/v1/users— 新建用户(管理员)GET
/api/v1/users— 用户列表(分页+筛选)PUT
/api/v1/users/{id}— 更新用户DELETE
/api/v1/users/{id}— 删除/禁用
角色与权限
- GET
/api/v1/roles— 列表 - POST
/api/v1/roles— 新建角色 - PUT
/api/v1/roles/{id}— 更新(含权限) - GET
/api/v1/permissions— 列出所有权限点
学生与班级管理
POST
/api/v1/students— 新增学生POST
/api/v1/students/import— 批量导入学生(multipart file)- 返回导入任务 id
GET
/api/v1/students— 列表(支持按班级、年级、学号、姓名过滤)GET
/api/v1/students/{id}PUT
/api/v1/students/{id}DELETE
/api/v1/students/{id}GET
/api/v1/classes— 班级列表POST
/api/v1/classes、PUT/api/v1/classes/{id}、DELETE/api/v1/classes/{id}
题库管理
POST
/api/v1/questions— 新建题目POST
/api/v1/questions/import— 批量导入题目(multipart file),返回 job idGET
/api/v1/questions— 题目分页查询(按科目、标签、难度)GET
/api/v1/questions/{id}PUT
/api/v1/questions/{id}DELETE
/api/v1/questions/{id}POST
/api/v1/questions/{id}/preview— 试题预览/渲染(用于前端)
组卷与考试发布
- POST
/api/v1/exams— 创建试卷/考试(含题目列表或组卷规则) - PUT
/api/v1/exams/{id}— 编辑 - POST
/api/v1/exams/{id}/publish— 发布(学生可见) - POST
/api/v1/exams/{id}/unpublish— 下线 - GET
/api/v1/exams— 列表 - GET
/api/v1/exams/{id}— 详情(含题目顺序)
学生考试流程
- POST
/api/v1/exams/{id}/start— 学生开始考试(创建 exam_session) - POST
/api/v1/exams/{id}/submit— 学生交卷(提交 answers) - GET
/api/v1/sessions/{sessionId}— 获取答卷状态/题目/剩余时间
答案与阅卷
- POST
/api/v1/sessions/{sessionId}/answers— 保存临时答案(自动保存) - POST
/api/v1/sessions/{sessionId}/submit— 学生提交(重复说明) - GET
/api/v1/sessions/{sessionId}/answers— 获取学生答案 - POST
/api/v1/grading/{sessionId}/queue— 发起自动/LLM 批阅(异步) - GET
/api/v1/grading/{jobId}— 批阅任务状态与结果 - POST
/api/v1/grading/{sessionId}/manual— 教师提交人工阅卷分数与评语
成绩与统计
- GET
/api/v1/exams/{id}/results— 本次考试成绩列表(分页、可导出) - GET
/api/v1/exams/{id}/results/export?scope=class|grade|all&classId=xxx— 导出 Excel - GET
/api/v1/students/{studentId}/scores— 学生成绩历史 - GET
/api/v1/exams/{id}/analysis— 分数分布、易错题、题目命中率
文件/上传任务
- GET
/api/v1/imports/{jobId}/status— 查询导入任务状态 - GET
/api/v1/files/{fileId}— 下载/查看上传文件
六、关键设计/实现细节与建议
鉴权设计:采用 JWT 做前后端分离鉴权;后端接口统一校验 token 与权限点(注解 + 方法拦截)。管理员可在后台分配权限点到角色。
批量导入实现:
- 前端上传文件 -> 后端保存到临时存储 -> 入库由异步任务消费(RabbitMQ 或 Spring Async)
- 导入过程中记录校验错误并生成错误报告供管理员下载
- 对大文件支持分片上传(若需要)
考试实时性与防作弊:
- 考试期间采用 WebSocket/Server-Sent Events 保持客户端与服务端心跳,用于检测断线、同步倒计时
- 保存客户端答题快照(防止断线丢失)
- 可选:限制 IP、禁止复制粘贴、截图检测(浏览器插件限制)、监考端记录异常行为
自动批阅(本地大模型):
仅用于客观题与较短的填空题。流程示例:
- 后端将待批问题与标准答案、评分规则拼装为 prompt。
- 将 student answer 发送给本地 LLM 推理服务,模型返回打分与置信度说明。
- 若置信度 >= 阈值(可配置),自动采用模型分数;否则标记为人工复核。
对填空题,先做 tokenizer/简单归一化(大小写/全半角/数字格式),再送模型判断相似度。可使用向量相似度(Faiss)提高判断准确性。
结果应该保存为
grading_job与student_answer的 score_awarded 字段,并保留模型返回的result_summary。
并发与扩展性:
- 使用 Redis 做分布式锁和缓存考试临时状态
- 批阅任务与数据统计做异步队列,避免写堵塞主请求线程
导出表格:
- 后端生成 Excel(使用 Apache POI 或 easyexcel),支持导出字段模板选择、按班级/年级聚合
- 若数据量大,可先生成异步导出任务并返回下载链接
数据权限:
- 角色细化:例如教师只能查看自己任课班级的学生成绩;领导可查看所在部门/年级范围
- SQL 层/服务层加入数据权限过滤
日志审计:记录关键操作:试卷发布、分数变更、导入任务、登录异常等
七、开发里程碑(建议的迭代顺序)
- 项目初始化:代码仓库、基本框架、用户鉴权、数据库连接、基本 CRUD 框架
- 用户/角色/权限模块 + 管理后台基础页面
- 学生/班级管理 + 批量学生导入
- 题库基本 CRUD + 题目导入/校验
- 组卷、考试流程(发布/考试/提交/保存答题快照)
- 基本自动评分(客观题)与成绩保存
- 教师阅卷界面(主观题人工评阅)
- LLM 批阅集成(本地推理服务) + 异常复核流程
- 成绩统计/导出/排名/分析功能
- 日志/监控/性能优化/安全审计
八、测试策略
- 单元测试:Service 层、工具类、校验逻辑
- 集成测试:Controller -> Service -> DB 流程(可用 Testcontainers)
- E2E 测试:使用 Playwright 或 Cypress 测试关键用户流程(学生考试、教师阅卷)
- 压力测试:模拟并发考试场景(大量学生同时提交)
九、可选增强项(未来迭代)
- 题目智能解析:OCR 识别试题导入纸质题
- 更复杂的防作弊(视频监考、行为分析)
- AI 生成试题/组卷(基于 LLM 自动出题)
- 移动端原生 App 或 PWA 支持
十、交付物(建议)
- 源代码仓库(后端、前端、部署脚本)
- 数据库建表 SQL 脚本与 ER 图
- API 文档(OpenAPI/Swagger)
- 部署文档(Docker Compose / Kubernetes YAML)
- 测试报告与导出示例数据
