一套完整的前后端在线答题系统:专项刷题 + 模拟考试 + 后台管理,PC / 移动端自适应。
- 后端:Node.js + Express + better-sqlite3
- 数据库:SQLite(单文件
data/quiz.db,零配置、无需安装数据库服务) - 前端:原生 HTML / CSS / JS,响应式布局(无构建工具,开箱即用)
# 1. 安装依赖
npm install
# 2. 初始化数据库(建表 + 默认账号 + 从 questions.csv 导入题库)
默认admin admin123,user user123
npm run init
# 3. 启动服务
npm start
# 浏览器访问 http://localhost:3000端口默认 3000,可通过
PORT环境变量修改。 改完前端页面可执行npm run check做静态自检(语法 / DOM id 是否存在 / 是否有未定义就调用的函数)。
| 变量 | 默认值 | 说明 |
|---|---|---|
| DB_PATH | data/quiz.db | SQLite 数据库文件路径 |
| PORT | 3000 | 服务端口 |
| TOKEN_SECRET | (内置值) | 登录令牌签名密钥,生产环境务必修改 |
| 账号 | 密码 | 角色 |
|---|---|---|
| admin | admin123 | 管理员(后台维护题库、查看全部成绩) |
| user | user123 | 普通用户(刷题、考试) |
SQLite 是单文件数据库,备份 = 直接复制 data/quiz.db(建议先停服务或在低峰期复制)。
- 专项刷题:按题型抽题(默认 100 题,可选 10/20/30/50/100 或自定义 1~200),逐题作答即时判分,展示正确答案与解析,结束自动生成成绩
- 模拟考试:按题型分别设置题量(默认 单选 40 · 多选 30 · 判断 30,可自定义,另有预设快捷方案),随机组卷、每题限时 1 分半、答题卡按需点击展开、到时自动交卷、统一判分
- 我的成绩:历次成绩列表 + 逐题答题明细回看
各题型数量超过题库实际存量时,系统按实际数量组卷并给出提示(例如判断题暂无题目时该部分自动跳过)。
- 数据统计:用户数 / 题量 / 答卷数 / 平均分、题型分布、模式概况、最近答题动态
- 题库管理:新增 / 编辑 / 删除题目(单选、多选、判断),按关键词 / 题型筛选
- 批量导入:粘贴或上传 txt/csv 批量导入,逐行校验并反馈失败原因
- 成绩管理:查看全部用户成绩与逐题答题明细,可按用户名 / 模式筛选
题库以项目根目录的 questions.csv 为准,npm run init 会自动导入(题库非空时跳过)。
CSV 格式:题号,题干,A,B,C,D,E,答案,难度,题型,首行为表头。内置 1000 道:单选 400 · 多选 330 · 判断 270。
关于第 8 列「难度」:本文件的这一列实际取值只有
无和判断两个值,它并不是难度,而是题型标记—— 标为判断的 270 道题只有「正确 / 错误」两个选项,第 9 列题型却误写成了「单选题」。scripts/init.js因此按第 8 列优先判定题型:值为判断即按判断题导入(答案 A→正确、B→错误), 否则取第 9 列的单选题 / 多选题。若你换成自己的 CSV,请按实际情况调整这段逻辑。
想重新导入:删掉
data/quiz.db(含-wal/-shm)后重跑npm run init。
分类即题型:单选 / 多选 / 判断三个分类由题目类型自动生成,不再手填。
每行一题,字段用 | 分隔(选项 2~6 个均可,系统自动定位答案列):
题型|题干|选项A|选项B|…|答案|解析
单选|查询数据用什么语句?|INSERT|UPDATE|SELECT|DELETE|C|SELECT 用于查询
多选|下列属于前端框架的有?|Vue|React|MySQL|Angular|ABD|MySQL 是数据库
判断|HTTP 默认端口是 80。|||||正确|常识题
解析可省略;以 # 开头的行会被忽略;判断题答案填 正确/错误(或 对/错、T/F、A/B 均可)。
├── server.js # 入口
├── questions.csv # 题库源文件(1000 题,init 时导入)
├── schema.sql # 数据库结构(SQLite 方言)
├── data/quiz.db # SQLite 数据库文件(init 后生成)
├── lib/
│ ├── api.js # 全部 API 路由
│ ├── db.js # SQLite 访问封装(含事务)
│ └── auth.js # 密码哈希与令牌
├── scripts/init.js # 数据库初始化(建表+账号+导入 questions.csv)
├── scripts/check-frontend.js # 前端自检(语法 / DOM id / 未定义调用)
└── public/ # 前端页面(响应式)
├── login.html # 登录 / 注册
├── index.html # 首页
├── practice.html # 专项刷题
├── exam.html # 模拟考试
├── records.html # 我的成绩
├── admin.html # 管理后台
├── common.js # 公共工具
└── style.css # 全站样式
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/register · /api/login · GET /api/me | 认证 |
| GET | /api/categories | 题型分类列表(含各题型题量) |
| GET | /api/practice/questions?type=&limit= | 刷题抽题(不含答案,limit 上限 200) |
| POST | /api/practice/check | 单题即时判分 |
| POST | /api/practice/finish | 刷题结束保存成绩(服务端判分) |
| POST | /api/exam/start · /api/exam/submit | 开考(传 single/multiple/judge 题量) / 交卷 |
| GET | /api/records/my(/:id) | 我的成绩 / 明细 |
| GET/POST/PUT/DELETE | /api/admin/questions… | 题库 CRUD |
| POST | /api/admin/questions/import | 批量导入 |
| GET | /api/admin/records(/:id) | 全部成绩 / 明细 |
| GET | /api/admin/stats | 统计数据 |