面向培训题库统一管理与快速扩充需求的一体化系统:
- 题目录入管理: 单选/多选/判断/简答四类题目的手工录入与统一检索;
- 按知识点自动出题: 对接百度智能云千帆(文心)大模型, 按知识点批量生成题目(含答案与解析), 未配置 API Key 时自动降级为本地模拟生成, 保证流程可演示;
- 生成—审核—上架 流程管控: 题目经历
草稿/AI生成 → 待审核 → 已上架/已驳回 → (可下架/重新提交)全生命周期, 审核过程留痕(审核记录表); - 格式校验: AI 出题结果、手工录入、批量导入统一经过格式校验(题干/选项/答案范围/题型规则), 不合法题目逐条给出原因;
- 批量导入: 支持任意更换题库数据 —— 上传
.xlsx/.json(或粘贴 JSON), 可先解析 PDF 题库再导入; - 检索使用: 已上架题目可对外提供随机抽题/检索接口, 供培训考试、组卷等下游场景调用。
技术栈: Spring Boot 3.5 (Java 17) + Spring Data JPA + MySQL 8 + JWT, Vue 3 + Vite + Element Plus + Pinia, 中间件统一 Docker Compose 管理。
| 组件 | 版本建议 | 备注 |
|---|---|---|
| JDK | 17+ | 已配置 JDK25 亦可, 本项目按 17 编译 |
| Maven | 3.8+ | |
| Node.js | 18+ | |
| MySQL | 8.x | 本地 3306 或 Docker 3307(见下) |
- 方式 A: 使用已有本地 MySQL, 执行建库(默认后端连接
localhost:3306):
CREATE DATABASE IF NOT EXISTS question_bank CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- 方式 B: Docker 启动(推荐, 中间件统一 docker 管理)。若本机 3306 未被占用, 可直接让容器映射宿主 3306(与后端默认一致):
set MYSQL_PORT=3306后执行docker compose up -d mysql; 若 3306 被占用则保持默认映射宿主 3307, 启动后端时额外设置DB_PORT=3307即可。
# 若无法访问 Docker Hub, 可先执行: set MYSQL_IMAGE=docker.m.daocloud.io/library/mysql:8.0
docker compose up -d mysqlcd backend
mvn -DskipTests package
java -jar target/training-question-bank-1.0.0.jar连接参数可用环境变量覆盖(默认值见 backend/src/main/resources/application.yml):
| 环境变量 | 默认 | 说明 |
|---|---|---|
| DB_HOST / DB_PORT / DB_NAME | localhost / 3306 / question_bank | MySQL 连接(本地或 Docker 3306; 用 Docker 3307 时设 DB_PORT=3307) |
| DB_USER / DB_PASSWORD | tqb / tqb123456 | 账号 |
| QIANFAN_API_KEY | (空) | 千帆 API Key, 配置后自动使用大模型出题 |
| QIANFAN_MODEL | deepseek-v4-flash | 模型名(千帆 v2 模型串, 如 deepseek-v4-flash / deepseek-v4-pro / deepseek-v3.1-250821 / ernie-4.5-turbo-128k) |
| AI_PROVIDER | auto | auto / qianfan / mock |
| JWT_SECRET | 开发默认值 | 生产请替换(>=32字符) |
首次启动(空库)会自动: ①创建默认账号; ②导入内置题库 《党建知识竞赛题库》150 道单选题(数据来自仓库内 PDF 的解析结果
data/seed/dangshi_150.json), 导入即为已上架。
cd frontend
npm install
npm run dev # http://localhost:5173 (已代理 /api -> localhost:8080)| 账号 | 密码 | 角色 | 能力 |
|---|---|---|---|
| admin | admin123 | 系统管理员 | 全部功能 |
| generator | gen123456 | 出题/录入员 | 录入、智能出题、提交审核、批量导入 |
| reviewer | rev123456 | 审核员 | 待审核队列通过/驳回、下架 |
登录 generator → 菜单「智能出题」→ 选择知识点(如 党史党建)→ 选题型与数量 → 「开始生成」。
未配置千帆 Key 时为本地模拟生成并明确提示; 生成结果逐题展示格式校验结论, 一键保存 → 到「题库管理」勾选提交审核 → 换 reviewer 账号在「审核中心」通过/驳回 → 「已上架」题目即可在「抽题·检索使用」中被随机抽到。
- 登录 千帆 ModelBuilder 控制台(需百度智能云账号并实名认证);
- 菜单 应用接入 / API Key管理 创建应用并获取 API Key(形如
bce-v3/ALTAK-…); - 配置环境变量后重启后端:
set QIANFAN_API_KEY=你的APIKey
set QIANFAN_MODEL=deepseek-v4-flash # 千帆第三方: deepseek-v4-flash / deepseek-v4-pro / deepseek-v3.1-250821; 文心: ernie-4.5-turbo-128k / ernie-speed-128k- 「智能出题」页顶部会显示当前出题源; 系统调用千帆 v2 OpenAI 兼容接口(
https://qianfan.baidubce.com/v2/chat/completions, Bearer 鉴权), 参考文档:
说明: 模型返回内容由系统做宽容解析 + 严格格式校验, 单题不合法会给出具体原因且不会入库; 未解析出任何 JSON 时会返回模型原文片段便于排查。
入口: 登录后「批量导入」(角色: 录入员/管理员)。
- Excel 模板: 页面「下载导入模板」, 字段 =
知识点 | 题型 | 题干 | 选项A~F | 答案 | 解析 | 难度; 题型支持 单选/多选/判断/简答; - JSON 文件或粘贴: 数组结构见
data/templates/样例导入.json、data/seed/dangshi_150.json:
[{"knowledgePoint":"综合示例","type":"SINGLE","stem":"题干","options":["A","B","C","D"],
"answer":"C","analysis":"解析","difficulty":2}]- 导入目标状态可选: 直接上架 / 待审核 / 草稿(走审核流程则选“待审核”);
- 每行结果(成功/失败原因)即时反馈, 自动查重;
- 直接上传 PDF 题库(无需预先转换): 「批量导入 → 文件导入」选择
.pdf即可, 系统内置 PDF 文本提取与题目解析, 支持两种版式(可混合):- 结构化选项题:
1. 题干…() [单选题]+A、选项(正确答案)等(题型标记 [单选题]/[多选题]/[判断题], 支持A、A.A.前缀); - 问答式:
1、问题是什么?后跟答案文本, 自动转为简答题(题干=问题, 答案=其后的内容)。 未填“覆盖知识点”时自动以 PDF 文件名作为知识点; 首次解析后逐题回显成功/失败原因。
- 结构化选项题:
- 保留的转换脚本(可选): 对无法被内置解析的 PDF, 可先用脚本转 JSON 再上传:
python tools/parse_pdf.py "你的题库.pdf" out.json --kp "知识点名称"(依赖pip install pypdf)。
cp .env.example .env # 按需修改
docker compose up -d --build
# 访问 http://localhost:8088 (前端, nginx 代理 /api -> backend:8080)
# MySQL 映射宿主 3307; 后端直连 8080组件: mysql:8.0(数据卷 tqb_mysql_data) + backend(Spring Boot) + web(Nginx 托管前端)。
后台/私有环境拉不到镜像时: 用 MYSQL_IMAGE=docker.m.daocloud.io/library/mysql:8.0 覆盖镜像源, 或参考 backend/Dockerfile、frontend/Dockerfile 自行替换基础镜像。
| 表 | 说明 | 关键字段 |
|---|---|---|
| knowledge_point | 知识点 | name(唯一)、category、description |
| question | 题目 | type、stem、options_json、answer、analysis、difficulty、source、status、knowledge_point_id、reviewer/comment、generate_batch |
| review_record | 审核记录 | question_id、stem_snapshot、reviewer、action(PASS/REJECT/IMPORT_PASS)、comment |
| sys_user | 用户 | username、password(BCrypt)、role |
录入 DRAFT ─┐
AI生成 GENERATED ─┤ submit ─> PENDING ─approve─> PUBLISHED(上架/可检索/可抽题)
导入 IMPORT ─┘ └─reject─> REJECTED(可编辑后重新 submit)
PUBLISHED ─offline─> OFFLINE(可编辑后重新 submit)
├── backend/ # Spring Boot 后端
│ └── src/main/java/com/questionbank/
│ ├── ai/ # 出题源: 千帆 OpenAI兼容客户端 / 本地模拟器 / 宽容JSON解析
│ ├── auth/ # JWT 认证 + 角色拦截
│ ├── common/ # 统一响应/异常/枚举
│ ├── config/ # Web/CORS/初始化(默认账号+内置题库)
│ ├── controller/ service/ repository/ entity/ dto/
├── frontend/ # Vue3 + Element Plus
│ └── src/views/ # 登录/看板/题库管理/题目录入/智能出题/审核中心/审核记录/知识点/批量导入/抽题
├── docker-compose.yml # MySQL + backend + web 统一编排
├── data/
│ ├── seed/dangshi_150.json # 党建150题(内置种子, 可整体替换)
│ └── templates/ # 导入模板.xlsx / 样例导入.json
├── tools/ # PDF题库解析脚本、E2E 测试脚本
├── docs/API.md # 接口契约(前后端/下游集成)
└── .env.example
tools/e2e_test.ps1 提供 30 项端到端断言, 覆盖: 三角色登录、数据看板、知识点、公开抽题/检索、AI 按知识点出题(混合题型/格式校验/查重)、AI题保存、提交审核→通过→上架、驳回留痕、下架→重新上架、手工录入非法拦截、批量导入与重复拦截、详情检索, 当前 全部通过。
接口细节见 docs/API.md。「抽题·检索使用」对外接口(/api/quiz/**)无需登录, 便于考试/组卷系统直接集成(默认仅返回已上架题目)。
本仓库: https://github.com/142857LittleKing/Training_Question_Bank_System.git