考试应用 - 智能题库练习系统
核心理念: 基于 uni-app 的跨平台考试应用,支持题库练习、随机练习、错题练习三种模式,邀请码系统控制访问权限,JWT 认证保障数据安全,MySQL 存储考试记录和个人统计,一套代码多端运行。
效果展示
登录界面
首页界面
答题界面
我的页面
功能模块概览
考试应用是一款集成多种练习模式的跨平台应用,涵盖题库管理、考试记录、错题收藏、个人统计等核心功能。
| 功能模块 | 核心能力 | 应用场景 |
|---|---|---|
| 📚 题库练习 | 完整题库、顺序练习、收藏标记 | 系统学习、全面掌握知识点 |
| 🎲 随机练习 | 随机抽题、20题模式、收藏标记 | 快速测试、碎片化学习 |
| ❌ 错题练习 | 错题收藏、专项练习、查漏补缺 | 针对性复习、提升薄弱环节 |
| 📝 考试记录 | 历史记录、详情查看、成绩统计 | 学习轨迹、进度追踪 |
| 📊 个人统计 | 11项指标、学习天数、正确率 | 学习分析、成就展示 |
| 🔐 邀请码系统 | HMAC-SHA256、手机号绑定、权限控制 | 访问控制、用户管理 |
系统架构
graph TD
A[uni-app 前端] --> B[题库练习模块]
A --> C[随机练习模块]
A --> D[错题练习模块]
A --> E[考试记录模块]
A --> F[个人统计模块]
A --> G[用户认证模块]
B --> H[Node.js 后端服务]
C --> H
D --> H
E --> H
F --> H
G --> H
H --> I[认证层]
H --> J[业务逻辑层]
H --> K[数据存储层]
I --> I1[邀请码生成
HMAC-SHA256] I --> I2[JWT Token
24小时有效期] I --> I3[Token验证
权限控制] J --> J1[题目生成
收藏标记] J --> J2[考试记录
状态管理] J --> J3[统计计算
11项指标] K --> K1[MySQL 数据库] K --> K2[考试记录表] K --> K3[错题收藏表] style A fill:#e1f5fe style H fill:#f3e5f5 style I fill:#fff3e0 style J fill:#ffe0b2 style K fill:#e8f5e9 style I1 fill:#ffccbc style I2 fill:#ffccbc style J1 fill:#ffccbc style J3 fill:#ffccbc
HMAC-SHA256] I --> I2[JWT Token
24小时有效期] I --> I3[Token验证
权限控制] J --> J1[题目生成
收藏标记] J --> J2[考试记录
状态管理] J --> J3[统计计算
11项指标] K --> K1[MySQL 数据库] K --> K2[考试记录表] K --> K3[错题收藏表] style A fill:#e1f5fe style H fill:#f3e5f5 style I fill:#fff3e0 style J fill:#ffe0b2 style K fill:#e8f5e9 style I1 fill:#ffccbc style I2 fill:#ffccbc style J1 fill:#ffccbc style J3 fill:#ffccbc
技术架构
| 技术层次 | 技术选型 | 实现细节 |
|---|---|---|
| 前端框架 | uni-app | 跨平台开发,支持 H5、微信小程序、App |
| 加密库 | crypto-js | 前端加密处理,数据安全传输 |
| 后端框架 | Node.js + Express | RESTful API,中间件架构 |
| 认证方案 | JWT + HMAC-SHA256 | Token 认证 + 邀请码加密 |
| 数据库 | MySQL2 | 关系型数据库,支持复杂查询和统计 |
| 环境配置 | dotenv | 环境变量管理,敏感信息保护 |
核心功能
🔐 邀请码系统
生成机制:
- HMAC-SHA256 加密:手机号 + 系统密钥生成唯一邀请码
- 16位十六进制:取加密结果前16位,大写字母数字组合
- 一对一绑定:每个手机号对应唯一邀请码,无法伪造
- 管理员权限:需要管理员代码才能生成邀请码
// 邀请码生成核心代码
const crypto = require('crypto');
function generateInviteCode(phone, secret) {
// 使用 HMAC-SHA256 加密
const hmac = crypto.createHmac('sha256', secret);
hmac.update(phone);
const hash = hmac.digest('hex');
// 取前16位作为邀请码
return hash.substring(0, 16).toUpperCase();
}
// 验证邀请码
function verifyInviteCode(phone, inviteCode, secret) {
const expectedCode = generateInviteCode(phone, secret);
return expectedCode === inviteCode.toUpperCase();
}
🔑 JWT 认证
Token 机制:
- 24小时有效期:Token 默认有效期 24 小时,过期需重新登录
- 用户信息载荷:包含手机号、用户ID、角色、登录时间
- Bearer 格式:标准 Authorization 头部格式
- 中间件验证:所有业务接口自动验证 Token 有效性
// JWT Token 生成
const jwt = require('jsonwebtoken');
function generateToken(phone, inviteCode) {
const payload = {
phone: phone,
userId: `user_${phone}_${Date.now()}`,
role: 'user',
loginTime: new Date().toISOString(),
inviteCode: inviteCode
};
return jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN || '24h'
});
}
// Token 验证中间件
function verifyToken(req, res, next) {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({
success: false,
message: '未授权访问'
});
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({
success: false,
message: 'Token无效或已过期'
});
}
}
📚 题库练习模式
- 完整题库:返回整个题库的所有题目,支持顺序练习
- 收藏标记:每道题目自动标记 isFavorite 字段,显示收藏状态
- 题目格式:包含题目内容、选项、答案、解析等完整信息
- 实时同步:收藏状态实时同步,前端可即时更新
🎲 随机练习模式
- 随机抽题:从题库中随机选择 20 道题目
- 收藏标记:每道题目标记收藏状态,便于快速收藏
- 快速测试:适合碎片化学习,快速检验知识掌握
- 不重复抽取:同一次练习中不会出现重复题目
❌ 错题练习模式
- 专属题库:返回用户收藏的所有题目
- 全部已收藏:所有题目 isFavorite 都为 true
- 针对性练习:专门针对薄弱环节进行强化训练
- 查漏补缺:帮助用户快速提升正确率
📝 考试记录管理
记录功能:
- 历史记录列表:支持分页、筛选(考试类型、状态、日期范围)
- 记录详情:查看单次考试的完整信息和统计数据
- 提交试卷:交卷后自动计算正确率、完成率、错误率
- 状态管理:考试中(1)、已交卷(2)两种状态
// 提交试卷核心逻辑
async function commitExam(examId, answeredCount, correctCount) {
// 1. 验证试卷状态(必须是考试中)
const exam = await getExamById(examId);
if (exam.examStatus !== 1) {
throw new Error('试卷已经提交,无法重复提交');
}
// 2. 计算统计数据
const totalQuestions = exam.totalQuestions;
const correctRate = (correctCount / totalQuestions * 100).toFixed(2);
const completionRate = (answeredCount / totalQuestions * 100).toFixed(2);
const errorRate = ((totalQuestions - correctCount) / totalQuestions * 100).toFixed(2);
// 3. 更新考试记录
await updateExam(examId, {
answeredCount,
correctCount,
correctRate,
completionRate,
errorRate,
examStatus: 2, // 已交卷
endTime: new Date(),
modifyTime: new Date()
});
return { correctRate, completionRate, errorRate };
}
📊 个人统计
11项核心指标:
| 统计指标 | 说明 |
|---|---|
| 参加考试场次 | 已交卷的考试总数 |
| 题库练习次数 | examMode=1 的考试总数 |
| 随机练习次数 | examMode=2 的考试总数 |
| 错题练习次数 | examMode=3 的考试总数 |
| 累计答题数 | 所有考试的 answeredCount 总和 |
| 答对题数 | 所有考试的 correctCount 总和 |
| 答错题数 | 累计答题数 - 答对题数 |
| 最高正确率 | 所有考试中的最高正确率 |
| 学习天数 | 基于 createTime 统计不同日期数 |
| 最长考试时长 | HH:MM:SS 格式 |
| 个人错题总数 | 错题库中的不重复题目总数 |
⭐ 题目收藏
- 收藏/取消收藏:支持一键收藏和取消收藏题目
- 去重机制:通过题目 content 字段去重,避免重复收藏
- 题库分类:按 questionTemplate 分类管理收藏题目
- 统一存储:与错题记录共用 exam_error_questions 表
API 接口设计
| 接口 | 方法 | 功能 |
|---|---|---|
| /api/auth/generate-invite | POST | 生成邀请码(需管理员代码) |
| /api/auth/login | POST | 登录获取 Token |
| /api/auth/verify-token | POST | 验证 Token 有效性 |
| /api/exam/history/list | GET | 获取考试历史记录列表 |
| /api/exam/history/info | GET | 获取考试记录详情 |
| /api/exam/history/add | POST | 添加考试记录 |
| /api/exam/history/commit | POST | 提交试卷(交卷) |
| /api/exam/stats/personal | POST | 获取个人统计数据 |
| /api/exam/question/fav | POST | 收藏/取消收藏题目 |
项目特点
- 跨平台支持:uni-app 一套代码,支持 H5、微信小程序、App 多端运行
- 邀请码系统:HMAC-SHA256 加密,手机号一对一绑定,安全可靠
- JWT 认证:标准 Token 认证方案,24小时有效期,自动过期保护
- 三种练习模式:题库练习、随机练习、错题练习,满足不同学习需求
- 智能收藏标记:题目自动标记收藏状态,前端无需额外查询
- 完整统计系统:11项核心指标,全面展示学习情况和成就
- 高效 SQL 查询:使用聚合查询一次性返回所有统计数据
- 数据隔离:每个用户只能访问自己的数据,安全可靠
- 状态管理:考试状态清晰,防止重复提交
- 环境变量配置:敏感信息通过 .env 文件管理,安全性高
数据库设计
核心数据表
1. exam_history(考试历史记录表)
- 存储用户的每次考试记录
- 包含考试时间、题目数量、正确率等信息
- 支持按用户、日期、类型筛选
- examStatus 字段:1=考试中,2=已交卷
2. exam_error_questions(错题收藏表)
- 存储用户收藏的题目
- 按题库(questionTemplate)分类存储
- 题目以 JSON 数组形式存储
- 通过 content 字段去重
开发心得
这个项目的核心亮点是 邀请码系统和智能收藏标记。邀请码基于 HMAC-SHA256 加密算法,每个手机号对应唯一的邀请码,无法伪造,配合 JWT Token 认证,形成了完整的安全体系。
智能收藏标记是一个很实用的设计,在生成题目时自动标记每道题的收藏状态,前端无需额外查询,大大提升了用户体验。三种练习模式(题库、随机、错题)满足了不同的学习场景,用户可以根据自己的需求灵活选择。
个人统计系统使用高效的 SQL 聚合查询,一次性返回 11 项核心指标,包括学习天数、最高正确率、各模式练习次数等,全面展示用户的学习情况。数据库设计上,考试记录和错题收藏分表存储,便于管理和查询。
uni-app 的跨平台能力让项目可以同时支持 H5、微信小程序、App,一套代码多端运行,大大降低了开发和维护成本。配合 Node.js + Express 后端,形成了完整的前后端分离架构。
下一步计划
近期规划
- 题目解析:增加题目解析的富文本展示,支持图片、公式
- 学习报告:生成周报、月报,可视化展示学习进度
- 错题本导出:支持导出错题本为 PDF 或图片
- 题库管理:后台管理系统,支持题库的增删改查
- 社交功能:学习排行榜、好友 PK、学习打卡
长期愿景
- AI 智能推荐:根据答题情况智能推荐薄弱知识点
- 自适应练习:根据正确率动态调整题目难度
- 多题库支持:支持多个题库切换,满足不同考试需求
- 离线模式:支持题库离线下载,无网络也能练习
- 语音答题:支持语音输入答案,提升答题效率