成就系统分级设计
1. 文档目标
本文档定义 UniSpeaking 第一版动态成就系统。设计只使用当前数据库已经持久化、能够按用户可靠归属的数据,不把前端静态进度视为真实业务数据,也不在第一版引入成就解锁表。
第一版保留当前可实现的 8 个成就,并将相同指标组织为可持续晋升的成就系列;当前缺少数据依据的成就和依赖其他成就的派生成就从范围中移除。
2. 统一计算口径
业务时区统一使用 Asia/Shanghai。
有效对话必须来自 practice_session,状态为 COMPLETED,且单次持续时间不少于 30 秒。
打卡日期由已经持久化的 session_evaluation.created_at 转换为业务日期,同一天存在多份报告时只计算一次。
连续学习使用“历史最长连续打卡天数”,不能因为当前连续记录中断而撤销已经获得的成就。
月度打卡使用“历史任意自然月的最高打卡天数”,已经完成的月度成就不得因月份切换而失效。
分数类成就使用历史最佳值或历史达标次数,不使用最近一次成绩覆盖历史最好成绩。
资产类成就统计用户历史上曾经拥有的学习资产。场景软删除后不撤销已经获得的成就。
所有成就进度只能保持或增长,不能因为删除资产、连续记录中断或进入新月份而倒退。
第一版动态计算成就状态,不记录独立的解锁时间;如果后续需要首次解锁弹窗、奖励发放或精确解锁时间,再单独设计成就记录表。
3. 第一版成就总表
第一版包含 10 个成就系列、48 个晋升节点。前端建议展示 10 张系列卡片,每张卡片展示当前称号、当前进度、下一等级目标和该系列全部里程碑,不直接平铺 48 张独立卡片。
| 系列 ID |
分类 |
成就系列 |
等级 |
称号 |
解锁条件 |
核心数据来源 |
备注 |
| conversation |
开口 |
对话历程 |
1 |
初次开口 |
累计完成 1 次有效对话 |
practice_session |
保留原有成就 |
| conversation |
开口 |
对话历程 |
2 |
渐入佳境 |
累计完成 5 次有效对话 |
practice_session |
计入所有场景类型 |
| conversation |
开口 |
对话历程 |
3 |
对话常客 |
累计完成 20 次有效对话 |
practice_session |
保留原有成就 |
| conversation |
开口 |
对话历程 |
4 |
对话达人 |
累计完成 50 次有效对话 |
practice_session |
长期晋升节点 |
| conversation |
开口 |
对话历程 |
5 |
百炼成章 |
累计完成 100 次有效对话 |
practice_session |
长期晋升节点 |
| streak |
连续 |
连续学习 |
1 |
三日启程 |
历史最长连续打卡达到 3 天 |
session_evaluation |
使用历史最长记录 |
| streak |
连续 |
连续学习 |
2 |
七日同行 |
历史最长连续打卡达到 7 天 |
session_evaluation |
保留原有成就 |
| streak |
连续 |
连续学习 |
3 |
两周不辍 |
历史最长连续打卡达到 14 天 |
session_evaluation |
使用自然日连续性 |
| streak |
连续 |
连续学习 |
4 |
月度坚守 |
历史最长连续打卡达到 30 天 |
session_evaluation |
不限定自然月 |
| streak |
连续 |
连续学习 |
5 |
百日如一 |
历史最长连续打卡达到 100 天 |
session_evaluation |
长期晋升节点 |
| scene-exploration |
场景 |
场景探索 |
1 |
场景初探 |
完成过 1 个不同场景 |
practice_session.scene_id |
只统计有效对话中的非空场景 ID |
| scene-exploration |
场景 |
场景探索 |
2 |
场景探索者 |
完成过 5 个不同场景 |
practice_session.scene_id |
保留原有成就 |
| scene-exploration |
场景 |
场景探索 |
3 |
场景行者 |
完成过 10 个不同场景 |
practice_session.scene_id |
按不同 scene_id 去重 |
| scene-exploration |
场景 |
场景探索 |
4 |
场景达人 |
完成过 20 个不同场景 |
practice_session.scene_id |
按不同 scene_id 去重 |
| scene-exploration |
场景 |
场景探索 |
5 |
世界漫游者 |
完成过 50 个不同场景 |
practice_session.scene_id |
长期晋升节点 |
| expression-score |
成长 |
表达质量 |
1 |
表达进阶 |
单轮表达历史最高分达到 80 |
turn_evaluation.overall_score |
使用历史最高分 |
| expression-score |
成长 |
表达质量 |
2 |
表达新星 |
单轮表达历史最高分达到 90 |
turn_evaluation.overall_score |
保留原有成就 |
| expression-score |
成长 |
表达质量 |
3 |
高光表达 |
单轮表达历史最高分达到 95 |
turn_evaluation.overall_score |
分数允许包含小数 |
| expression-score |
成长 |
表达质量 |
4 |
满分时刻 |
单轮表达历史最高分达到 100 |
turn_evaluation.overall_score |
最高等级 |
| pronunciation-attempt |
成长 |
跟读训练 |
1 |
发音初试 |
累计完成 1 次句子跟读评分 |
sentence_evaluation |
每条评分记录计算一次 |
| pronunciation-attempt |
成长 |
跟读训练 |
2 |
找准节奏 |
累计完成 10 次句子跟读评分 |
sentence_evaluation |
允许重复练习同一句子 |
| pronunciation-attempt |
成长 |
跟读训练 |
3 |
发音校准师 |
累计完成 30 次句子跟读评分 |
sentence_evaluation |
保留原有成就 |
| pronunciation-attempt |
成长 |
跟读训练 |
4 |
百次精练 |
累计完成 100 次句子跟读评分 |
sentence_evaluation |
长期晋升节点 |
| pronunciation-attempt |
成长 |
跟读训练 |
5 |
千锤百炼 |
累计完成 300 次句子跟读评分 |
sentence_evaluation |
长期晋升节点 |
| asset-collection |
场景 |
资产积累 |
1 |
初藏一景 |
历史累计拥有 1 项学习资产 |
scene |
包含已经软删除的历史场景 |
| asset-collection |
场景 |
资产积累 |
2 |
素材积累者 |
历史累计拥有 5 项学习资产 |
scene |
一项场景视为一项学习资产 |
| asset-collection |
场景 |
资产积累 |
3 |
资产收藏家 |
历史累计拥有 20 项学习资产 |
scene |
保留原有成就 |
| asset-collection |
场景 |
资产积累 |
4 |
学习馆主 |
历史累计拥有 50 项学习资产 |
scene |
删除资产不撤销成就 |
| asset-collection |
场景 |
资产积累 |
5 |
知识典藏家 |
历史累计拥有 100 项学习资产 |
scene |
长期晋升节点 |
| monthly-checkin |
连续 |
月度打卡 |
1 |
月初蓄力 |
任意自然月累计打卡 5 天 |
session_evaluation |
使用历史最佳月份 |
| monthly-checkin |
连续 |
月度打卡 |
2 |
稳步前行 |
任意自然月累计打卡 10 天 |
session_evaluation |
同一天去重 |
| monthly-checkin |
连续 |
月度打卡 |
3 |
月度全勤 |
任意自然月累计打卡 20 天 |
session_evaluation |
保留原有成就 |
| monthly-checkin |
连续 |
月度打卡 |
4 |
超级全勤 |
任意自然月累计打卡 25 天 |
session_evaluation |
最高等级 |
| practice-duration |
开口 |
累计学习时长 |
1 |
初心投入 |
有效学习时长累计达到 1 小时 |
practice_session |
只累计有效对话时长 |
| practice-duration |
开口 |
累计学习时长 |
2 |
渐深之境 |
有效学习时长累计达到 10 小时 |
practice_session |
跨场景类型累计 |
| practice-duration |
开口 |
累计学习时长 |
3 |
熟能生巧 |
有效学习时长累计达到 50 小时 |
practice_session |
跨场景类型累计 |
| practice-duration |
开口 |
累计学习时长 |
4 |
长期主义 |
有效学习时长累计达到 100 小时 |
practice_session |
长期晋升节点 |
| practice-duration |
开口 |
累计学习时长 |
5 |
长路耕耘 |
有效学习时长累计达到 500 小时 |
practice_session |
长期晋升节点 |
| active-days |
连续 |
累计学习天数 |
1 |
留下足迹 |
累计打卡达到 1 天 |
session_evaluation |
不要求日期连续 |
| active-days |
连续 |
累计学习天数 |
2 |
习惯养成 |
累计打卡达到 10 天 |
session_evaluation |
按业务日期去重 |
| active-days |
连续 |
累计学习天数 |
3 |
日积月累 |
累计打卡达到 30 天 |
session_evaluation |
中断后仍继续累计 |
| active-days |
连续 |
累计学习天数 |
4 |
百日积累者 |
累计打卡达到 100 天 |
session_evaluation |
长期晋升节点 |
| active-days |
连续 |
累计学习天数 |
5 |
年度学习者 |
累计打卡达到 365 天 |
session_evaluation |
不要求在同一自然年完成 |
| quality-sessions |
成长 |
稳定高质量输出 |
1 |
初见锋芒 |
累计 1 场最终评分达到 80 |
session_evaluation.final_score |
使用整场最终评分 |
| quality-sessions |
成长 |
稳定高质量输出 |
2 |
稳定发挥 |
累计 5 场最终评分达到 80 |
session_evaluation.final_score |
每场最多计算一次 |
| quality-sessions |
成长 |
稳定高质量输出 |
3 |
优质输出 |
累计 20 场最终评分达到 80 |
session_evaluation.final_score |
降级或零分报告不计入 |
| quality-sessions |
成长 |
稳定高质量输出 |
4 |
表达强者 |
累计 50 场最终评分达到 80 |
session_evaluation.final_score |
长期晋升节点 |
| quality-sessions |
成长 |
稳定高质量输出 |
5 |
稳定卓越 |
累计 100 场最终评分达到 80 |
session_evaluation.final_score |
最高等级 |
6. 数据归属与历史边界
6.1 用户归属
practice_session 可以直接使用 user_id 归属用户。
scene 可以直接使用 user_id 归属用户。
turn_evaluation、session_evaluation 优先通过 session_id 关联 practice_session 确认用户归属。
sentence_evaluation 通过 scene_id 关联 scene.user_id 确认用户归属。
不信任客户端传入的 userId,成就查询必须使用 JWT 对应的当前用户。
6.2 历史数据限制
practice_session 是后续增加的全场景会话事实表。若上线迁移时没有对旧会话进行回填,则以下指标只能覆盖该表启用后的行为:
有效对话次数。
累计学习时长。
已完成的不同场景数量。
练习类型覆盖数量。
评分、打卡和跟读类成就可以继续利用已经存在的历史评分记录,但必须确保能够可靠关联到所属用户。
7. 进度与解锁规则
每个成就系列至少需要输出以下信息:
稳定的系列 ID。
系列名称和分类。
当前统计值与展示单位。
当前已经达到的最高等级。
下一等级的阈值、称号和剩余进度。
全部晋升节点及各节点是否已经解锁。
建议的进度规则如下:
未达到第 1 级时,进度条目标为第 1 级阈值。
达到某一级后,进度条自动切换到下一等级阈值。
达到最高等级后显示“已完成”,不再显示下一等级。
系列进度百分比按“当前值 / 下一等级阈值”计算,最大为 100%。
分数类指标最高值限制为 100,次数、天数和时长类指标不设置展示上限。
某一节点一旦满足,在没有独立解锁表的第一版中,也必须通过历史最大值或历史累计值保证其不会重新锁定。
8. 第一版实施边界
第一版实现范围:
后续只有在需要解锁时间、首次弹窗幂等、奖励发放或运营配置时,才评估增加成就定义表、用户成就记录表或事件事实表。
成就系统分级设计
1. 文档目标
本文档定义 UniSpeaking 第一版动态成就系统。设计只使用当前数据库已经持久化、能够按用户可靠归属的数据,不把前端静态进度视为真实业务数据,也不在第一版引入成就解锁表。
第一版保留当前可实现的 8 个成就,并将相同指标组织为可持续晋升的成就系列;当前缺少数据依据的成就和依赖其他成就的派生成就从范围中移除。
2. 统一计算口径
业务时区统一使用
Asia/Shanghai。有效对话必须来自
practice_session,状态为COMPLETED,且单次持续时间不少于 30 秒。打卡日期由已经持久化的
session_evaluation.created_at转换为业务日期,同一天存在多份报告时只计算一次。连续学习使用“历史最长连续打卡天数”,不能因为当前连续记录中断而撤销已经获得的成就。
月度打卡使用“历史任意自然月的最高打卡天数”,已经完成的月度成就不得因月份切换而失效。
分数类成就使用历史最佳值或历史达标次数,不使用最近一次成绩覆盖历史最好成绩。
资产类成就统计用户历史上曾经拥有的学习资产。场景软删除后不撤销已经获得的成就。
所有成就进度只能保持或增长,不能因为删除资产、连续记录中断或进入新月份而倒退。
第一版动态计算成就状态,不记录独立的解锁时间;如果后续需要首次解锁弹窗、奖励发放或精确解锁时间,再单独设计成就记录表。
3. 第一版成就总表
第一版包含 10 个成就系列、48 个晋升节点。前端建议展示 10 张系列卡片,每张卡片展示当前称号、当前进度、下一等级目标和该系列全部里程碑,不直接平铺 48 张独立卡片。
6. 数据归属与历史边界
6.1 用户归属
practice_session可以直接使用user_id归属用户。scene可以直接使用user_id归属用户。turn_evaluation、session_evaluation优先通过session_id关联practice_session确认用户归属。sentence_evaluation通过scene_id关联scene.user_id确认用户归属。不信任客户端传入的
userId,成就查询必须使用 JWT 对应的当前用户。6.2 历史数据限制
practice_session是后续增加的全场景会话事实表。若上线迁移时没有对旧会话进行回填,则以下指标只能覆盖该表启用后的行为:有效对话次数。
累计学习时长。
已完成的不同场景数量。
练习类型覆盖数量。
评分、打卡和跟读类成就可以继续利用已经存在的历史评分记录,但必须确保能够可靠关联到所属用户。
7. 进度与解锁规则
每个成就系列至少需要输出以下信息:
稳定的系列 ID。
系列名称和分类。
当前统计值与展示单位。
当前已经达到的最高等级。
下一等级的阈值、称号和剩余进度。
全部晋升节点及各节点是否已经解锁。
建议的进度规则如下:
未达到第 1 级时,进度条目标为第 1 级阈值。
达到某一级后,进度条自动切换到下一等级阈值。
达到最高等级后显示“已完成”,不再显示下一等级。
系列进度百分比按“当前值 / 下一等级阈值”计算,最大为 100%。
分数类指标最高值限制为 100,次数、天数和时长类指标不设置展示上限。
某一节点一旦满足,在没有独立解锁表的第一版中,也必须通过历史最大值或历史累计值保证其不会重新锁定。
8. 第一版实施边界
第一版实现范围:
返回 10 个成就系列及其 48 个晋升节点。
使用真实数据库数据计算当前用户进度。
保留“开口、连续、场景、成长”四个现有分类。
前端展示系列当前等级、下一等级和完整里程碑。
不新增手动领奖、奖励发放、经验值、积分或排行榜。
不新增补签、管理员修改进度或客户端上报成就进度接口。
不新增用户自定义周目标。
不新增独立成就解锁表。
后续只有在需要解锁时间、首次弹窗幂等、奖励发放或运营配置时,才评估增加成就定义表、用户成就记录表或事件事实表。