yii题库系统核心是试题模型标准化与学习闭环设计:question模型规范题型、内容、答案及难度;practicesession和answerrecord追踪做题全流程;错题本基于answerrecord聚合;推荐与统计依赖标签频次、难度权重和缓存优化。

Yii 框架开发题库刷题系统,核心在于试题模型设计、题目分类管理、难度与标签控制、做题记录追踪、错题本和统计分析等业务模块的合理分层与高效联动。关键不是堆功能,而是让数据结构支撑灵活组卷、精准推荐和真实学习反馈。
试题模型与属性标准化
试题(Question)应作为独立 ActiveRecord 模型,字段需兼顾通用性与扩展性:
- type:枚举值(单选、多选、判断、填空、简答),避免用字符串硬编码,用常量或数据库字典表关联
- content 和 options:富文本存储题干与选项(如 JSON 字段存选项数组,或拆分为 QuestionOption 关联表,后者更利于选项排序、图片嵌入和答案解析绑定)
- answer:按题型约定格式存储(如单选存 "A",多选存 ["A","C"],填空存 ["答案1","答案2"]),便于后端自动判分
- difficulty:整型(1~5),配合前端图标/颜色标识,支持按难度区间筛选或组卷权重配置
- subject_id / chapter_id / tag_ids:通过外键或中间表(question_tag)实现多维分类,避免“一个字段逗号拼接”的反模式
刷题流程与状态闭环
用户做题不是简单提交答案,而是一条可追溯、可干预的学习链路:
- 每次练习生成唯一 PracticeSession 记录,关联用户、起始时间、题型/范围筛选条件,为后续行为分析提供上下文
- 每道题的作答保存为 AnswerRecord,含用户答案、是否正确、耗时、标记状态(如“不确定”“收藏”),不覆盖历史记录,保留学习轨迹
- 自动判分逻辑封装在 Question 模型的
checkAnswer($userInput)方法中,对填空题做模糊匹配(去除空格、忽略大小写)、简答题预留人工复核入口 - 错题本不是单独模块,而是
AnswerRecord::isWrong()的视图聚合,支持按知识点/错误次数/最近错题排序
组卷与智能推荐轻量化实现
不依赖复杂算法,用规则+缓存快速落地:
- 固定试卷:后台预设模板(如“Java基础10题-难度3~4-含3道错题”),运行时按条件查出试题 ID 列表,用
ORDER BY RAND()或 shuffle 随机顺序(大数据量改用预生成+队列) - 自适应推荐:首页“为你推荐”根据用户最近 20 次错题的 tag_ids 统计频次,取 Top3 标签,再查该标签下未答过且难度略低(difficulty ≤ 用户平均错题难度 - 1)的题目
- 所有高频查询(如某章节题目数、某用户各标签正确率)用 Yii 的
cache()+ ActiveRecord 查询缓存,过期时间设为 10 分钟,平衡实时性与性能
统计看板的数据可信度保障
避免“图表好看但数据不准”,重点控制三处:
- 正确率计算基于 AnswerRecord 而非题目维度——同一题答 5 次,错 4 次,该用户此题正确率是 20%,不是 0%
- 章节掌握度 = 该章节下所有题目(含子章节)的加权正确率,权重为题目 difficulty,体现“攻克难题更有价值”
- 活跃度指标(如“本周刷题 30 题”)从 PracticeSession 时间范围聚合,而非登录次数或页面 PV,真实反映学习行为
Yii 的行为(Behavior)、查询缓存、事务控制(如组卷时锁定试题防止重复抽取)和 Gii 代码生成能显著缩短开发周期。真正难点不在技术,而在定义清楚“一道题怎么才算掌握”“错题本什么时候推新题”这些业务规则,并让它们可配置、可审计、可回溯。











