Skip to content
ahlsonPublic

About

一套完整的前后端在线答题系统:专项刷题 + 模拟考试 + 后台管理,PC / 移动端自适应。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

在线答题系统(响应式 Web + SQLite)

一套完整的前后端在线答题系统:专项刷题 + 模拟考试 + 后台管理,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        # 全站样式

API 概览

方法 路径 说明
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 统计数据

About

一套完整的前后端在线答题系统:专项刷题 + 模拟考试 + 后台管理,PC / 移动端自适应。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages