考试应用 - 智能题库练习系统

2025-10-20 MiniProgram
核心理念: 基于 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

技术架构

技术层次 技术选型 实现细节
前端框架 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 智能推荐:根据答题情况智能推荐薄弱知识点
  • 自适应练习:根据正确率动态调整题目难度
  • 多题库支持:支持多个题库切换,满足不同考试需求
  • 离线模式:支持题库离线下载,无网络也能练习
  • 语音答题:支持语音输入答案,提升答题效率

标签