单词标记与优先级策略
熟悉度分级系统
熟悉度值(0-100)
| 范围 | 等级 | 描述 | 触发条件 | 优先级 |
|---|---|---|---|---|
| 0 | 完全陌生 | 用户明确标记"不认识" | 点击"✗ 不认识" | 🔴 最高 |
| 1-39 | 需要加强 | 练习中频繁出错 | 多次答错 | 🟠 高 |
| 40 | 待学习 | 未开始学习的新单词 | 默认初始值 | 🟡 中 |
| 41-79 | 正在学习 | 已开始学习但未完全掌握 | 练习中 | 🟢 中低 |
| 80 | 基本掌握 | 用户明确标记"认识" | 点击"✓ 认识" | 🔵 低 |
| 81-100 | 完全掌握 | 多次练习全部正确 | 连续答对多次 | ⚪ 最低 |
标记行为
用户标记
标记"不认识"
familiarity = 0
status = 0
- 视觉反馈:橙色边框,淡橙色背景
- 效果:下次练习优先出现
- 保留在列表:✅ 标记后卡片保留
标记"认识"
familiarity = 80
status = 3
- 视觉反馈:绿色边框,淡绿色背景
- 效果:下次练习降低优先级
- 保留在列表:✅ 标记后卡片保留
初始状态
新单词(未学习)
familiarity = 40 // 默认中等优先级
status = 0
- 视觉反馈:白色卡片,灰色边框
- 效果:正常优先级
换一批逻辑
排序规则(按优先级)
第一优先级:未标记的单词
- 本次会话中尚未点击"认识"或"不认识"的单词
- 优先显示,让用户先标记
第二优先级:熟悉度从低到高
- 熟悉度为 0 的单词(标记不认识)→ 最优先
- 熟悉度为 40 的单词(未学习)→ 中等
- 熟悉度为 80 的单词(标记认识)→ 最后
第三优先级:原始顺序
- 熟悉度相同时,保持课程原有顺序
实现代码
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;
结果:
- 优先练习标记"不认识"的单词(familiarity = 0)
- 然后是新单词(familiarity = 40)
- 最后是标记"认识"的单词(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:建议进阶内容