单词标记与优先级策略

熟悉度分级系统

熟悉度值(0-100)

范围 等级 描述 触发条件 优先级
0 完全陌生 用户明确标记"不认识" 点击"✗ 不认识" 🔴 最高
1-39 需要加强 练习中频繁出错 多次答错 🟠 高
40 待学习 未开始学习的新单词 默认初始值 🟡 中
41-79 正在学习 已开始学习但未完全掌握 练习中 🟢 中低
80 基本掌握 用户明确标记"认识" 点击"✓ 认识" 🔵 低
81-100 完全掌握 多次练习全部正确 连续答对多次 ⚪ 最低

标记行为

用户标记

标记"不认识"

familiarity = 0
status = 0
  • 视觉反馈:橙色边框,淡橙色背景
  • 效果:下次练习优先出现
  • 保留在列表:✅ 标记后卡片保留

标记"认识"

familiarity = 80
status = 3
  • 视觉反馈:绿色边框,淡绿色背景
  • 效果:下次练习降低优先级
  • 保留在列表:✅ 标记后卡片保留

初始状态

新单词(未学习)

familiarity = 40  // 默认中等优先级
status = 0
  • 视觉反馈:白色卡片,灰色边框
  • 效果:正常优先级

换一批逻辑

排序规则(按优先级)

  1. 第一优先级:未标记的单词

    • 本次会话中尚未点击"认识"或"不认识"的单词
    • 优先显示,让用户先标记
  2. 第二优先级:熟悉度从低到高

    • 熟悉度为 0 的单词(标记不认识)→ 最优先
    • 熟悉度为 40 的单词(未学习)→ 中等
    • 熟悉度为 80 的单词(标记认识)→ 最后
  3. 第三优先级:原始顺序

    • 熟悉度相同时,保持课程原有顺序

实现代码

words.sort((a, b) => {
  const markA = marks.get(a.courseItemId);
  const markB = marks.get(b.courseItemId);

  // 未标记的优先
  if (markA === undefined && markB !== undefined) return -1;
  if (markA !== undefined && markB === undefined) return 1;

  // 按熟悉度排序
  return a.familiarity - b.familiarity;
});

开始练习逻辑

拉取顺序

练习时按 familiarity 从低到高排序:

SELECT * FROM study_item
WHERE user_id = ? AND course_id = ?
ORDER BY familiarity ASC, created_at ASC
LIMIT 20;

结果

  1. 优先练习标记"不认识"的单词(familiarity = 0)
  2. 然后是新单词(familiarity = 40)
  3. 最后是标记"认识"的单词(familiarity = 80)

视觉设计

卡片状态

状态 边框 背景 描述
未标记 border-border bg-card 默认灰色边框,白色背景
刚标记"认识" border-primary/50 bg-primary/10 明显的绿色,表示刚标记
刚标记"不认识" border-orange-500/50 bg-orange-50 明显的橙色,表示刚标记
之前已认识 border-primary/30 bg-primary/5 淡绿色,历史已认识

操作按钮

  • 默认:隐藏(opacity: 0)
  • hover:显示(opacity: 100)
  • 点击后:按钮高亮显示当前状态

数据流

标记流程

用户点击 → 更新本地状态 → API 请求 → 数据库更新
    ↓            ↓               ↓           ↓
  立即反馈    卡片变色       异步保存    持久化存储

换一批流程

点击换一批 → 重新排序 → 显示下一批 50 个单词
                ↓
         优先显示未标记的

开始练习流程

点击开始练习 → 从数据库拉取 → 按 familiarity 排序 → 生成练习题目
                               ↓
                    不认识的(0) > 新单词(40) > 认识的(80)

优点

1. 更灵活的优先级

  • 0-100 的范围支持更精细的控制
  • 可以根据用户行为动态调整

2. 更好的用户体验

  • 标记后立即反馈,卡片变色
  • 不会突然消失,用户有掌控感
  • 未标记的优先显示,提高效率

3. 更智能的学习策略

  • 不认识的单词优先练习(familiarity = 0)
  • 认识的单词降低频率(familiarity = 80)
  • 平衡新旧单词的学习

4. 简单直观

  • 只有三个主要值:0(不认识)、40(新)、80(认识)
  • 用户行为清晰:不认识 → 最高优先级

未来扩展

1. 动态调整

// 答对后提升熟悉度
familiarity += 5

// 答错后降低熟悉度
familiarity -= 10

// 长时间未复习降低熟悉度
if (daysSinceLastReview > 7) {
  familiarity -= 5 * (daysSinceLastReview / 7)
}

2. 个性化学习曲线

根据用户的学习速度调整熟悉度变化率:

  • 快速学习者:熟悉度提升更快
  • 慢速学习者:熟悉度提升更慢,复习更频繁

3. 智能推荐

根据熟悉度分布推荐学习计划:

  • 大量 0-20:建议基础训练
  • 大量 40-60:建议强化练习
  • 大量 80-100:建议进阶内容