一、为什么学习平台需要成长体系

最近开源了一个 Agent 学习平台,前两篇主要介绍了项目整体和 AI 智能刷题。这篇单独聊另一个功能:成长体系。

在线体验:

https://ai-studyhub.cn

GitHub:

https://github.com/Earth-OL-Player/ai_learn_project

很多学习类产品都会做经验、等级、徽章,但如果只是为了好看,很容易变成装饰。

我在这个项目里做成长体系,主要是为了解决三个问题:

  1. 用户刷完题后,需要知道自己有没有进步。
  2. 用户重复刷同一道题时,需要有一个合理的经验结算规则。
  3. 用户长期学习时,需要看到累计成果,例如学习天数、答题次数、薄弱题和徽章。

所以这个成长体系不是单纯的游戏化,而是服务于“刷题反馈”和“学习复盘”。

二、成长体系包含哪些能力

当前项目里的成长体系主要包括:

  • 当前总经验
  • 等级
  • 段位
  • 当前等级进度
  • 距离下一级经验
  • 累计答题
  • 平均得分
  • 学习天数
  • 徽章墙
  • 本次新获得徽章
  • 智能刷题记录
  • 薄弱题统计
  • 题型维度统计

前端主要展示在两个地方:

AI 智能刷题页
个人中心

AI 智能刷题页更关注“本次反馈”,例如本次得分、经验变化、新徽章。

个人中心更关注“长期复盘”,例如总经验、等级、徽章墙、刷题记录、薄弱题分析。

三、核心代码路径

成长体系涉及前后端多个模块。

前端:

ai-learn-web/src/pages/profile/ProfilePage.vue
ai-learn-web/src/pages/profile/components/GrowthOverviewPanel.vue
ai-learn-web/src/components/growth/RealmCharacterCard.vue
ai-learn-web/src/types/growth.ts
ai-learn-web/src/api/practice.ts

后端:

ai-learn-backend/src/main/java/com/earth/online/player/ailearn/growth/interfaces/GrowthController.java
ai-learn-backend/src/main/java/com/earth/online/player/ailearn/growth/application/GrowthService.java
ai-learn-backend/src/main/java/com/earth/online/player/ailearn/growth/application/GrowthAwardService.java
ai-learn-backend/src/main/java/com/earth/online/player/ailearn/growth/application/GrowthRuleService.java
ai-learn-backend/src/main/java/com/earth/online/player/ailearn/practice/application/PracticeGrowthSettlementService.java
ai-learn-backend/src/main/java/com/earth/online/player/ailearn/user/application/UserQuestionStatsService.java

这个拆分大致对应三条线:

  1. PracticeGrowthSettlementService 负责答题后的经验结算。
  2. GrowthService 负责查询成长概览。
  3. UserQuestionStatsService 负责查询刷题记录和统计。

四、经验规则:只奖励真正突破

成长体系最关键的规则是经验怎么算。

项目里没有采用“每次答题都加固定经验”的方式,而是采用了一个更适合刷题场景的规则:

本次新增经验 = max(0, 本次得分 - 历史最高分)

举几个例子:

场景历史最高分本次得分新增经验
首次答题06060
第二次变好608020
第三次退步80500
第四次追平80800
第五次突破809515

这个规则的好处是:

  • 鼓励用户重答并优化答案。
  • 避免重复刷同一道题刷经验。
  • 经验值能够代表“真实进步”。
  • 用户看到经验变化时能理解为什么加分或不加分。

在后端中,这个规则位于 PracticeGrowthSettlementService

评分完成后,服务会读取当前用户和当前题的历史汇总,拿到历史最高分和最近一次得分,再计算本次新增经验。

五、成长快照:减少重复计算

项目里用户的总经验、等级编码和段位编码会写入用户表,作为成长快照。

答题后,如果经验发生变化,后端会重新计算:

  • 当前总经验
  • 当前等级
  • 当前段位

如果本次答题没有获得新经验,并且用户表中的成长快照已经一致,就不会重复写用户表。

这样做有两个好处:

  1. 查询成长概览时不用每次扫描所有刷题汇总。
  2. 重复答题但没有突破时,不会产生无意义写入。

这类设计在个人项目中也很实用,因为它可以在不引入复杂缓存的情况下,降低成长查询和写入压力。

六、等级和段位如何展示

成长概览由 GrowthService 组装。

返回给前端的核心字段包括:

  • currentExperience:当前累计经验。
  • levelCode:等级编码。
  • levelName:等级名称。
  • rank:段位名称。
  • currentLevelExperience:当前等级起始经验。
  • nextLevelExperience:下一级所需经验。
  • levelProgressText:等级进度文案。
  • answeredCount:累计答题数。
  • averageScore:平均分。
  • experienceToNextLevel:距离下一级经验。
  • streakDays:学习天数。
  • badges:徽章墙。
  • newBadges:本次新获得徽章。

前端 GrowthOverviewPanel.vue 会把这些数据展示为:

  • 角色卡
  • 总经验
  • 累计答题
  • 平均得分
  • 学习天数
  • 当前等级进度条
  • 当前段位标签
  • 徽章墙

这里有一个细节:进度条不是按总经验直接算比例,而是按当前等级区间计算。

也就是:

当前等级内已获得经验 / 当前等级所需总经验

这样用户看到的是“当前等级进度”,而不是一个越来越难理解的总经验比例。

七、徽章墙设计

徽章发放逻辑主要在 GrowthAwardService

当前徽章大致分为几类:

  1. 入门类

    例如首次完成答题、累计完成 10 题、100 题、300 题。

  2. 坚持类

    例如累计学习 3 天、30 天、100 天。

  3. 稀有类

    例如深夜刷题、早起刷题、周末刷题、同一题连续追问达到一定次数。

发放逻辑不是前端判断,而是在后端统一处理:

  • 答题后调用 awardAfterAnswer
  • 追问后调用 awardAfterDiscussion
  • 后端根据最新答题统计、学习天数和当前时间判断候选规则。
  • 如果徽章未获得,则插入用户徽章记录。
  • 只有本次真正新增的徽章才返回给前端弹框提示。

这个设计可以保证徽章发放幂等。

也就是说,用户满足某个规则后,重复触发不会重复获得同一枚徽章。

八、隐藏徽章为什么要隐藏

成长体系里有一些稀有徽章,例如深夜刷题、早起刷题、周末练习、连续追问。

这些徽章如果全部提前展示,用户可能会为了“刷徽章”而刻意操作,反而影响学习目标。

所以项目里对隐藏徽章做了处理:

  • 未获得时不展示。
  • 获得后展示在徽章墙。

前端徽章墙也按分类分组,并过滤未获得的隐藏徽章。

这样既保留了惊喜感,也减少了用户为了徽章而偏离学习本身。

九、智能刷题记录

成长体系不能只展示经验和徽章,还要能复盘具体题目。

项目中的智能刷题记录由 UserQuestionStatsService 查询。

它提供两类数据:

  1. 概览数据

    包括:

    • 已练题目数
    • 累计答题次数
    • 平均最高分
    • 平均最近分
    • 薄弱题数量
    • 最近答题时间
    • 已练题型
    • 题型维度统计
  2. 列表数据

    包括:

    • 题目编码
    • 题干
    • 题型
    • 答题次数
    • 最高分
    • 最近分
    • 首次答题时间
    • 最近答题时间

列表支持:

  • 关键词搜索
  • 题型筛选
  • 分页查询

这部分数据用于个人中心的“智能刷题记录”页面。

十、薄弱题分析

薄弱题的核心价值是告诉用户:哪些题虽然练过,但掌握得不稳定。

在当前设计里,薄弱题可以通过最近分、最高分、答题次数等维度分析。

比如:

  • 历史最高分很高,但最近分很低,说明记忆或表达退化。
  • 答题次数很多,但最高分仍低,说明知识点理解不扎实。
  • 某个题型平均分低,说明这一类题需要集中复习。

这些数据不需要额外新建复杂流水,只要把用户题目汇总表设计好,就能从聚合查询中得到。

十一、前端个人中心如何展示

个人中心里主要有两个区域:

  1. 成长概览

    展示总经验、答题数、平均分、学习天数、等级进度和徽章墙。

  2. 智能刷题记录

    展示概览卡片、记录列表、薄弱点分析和多维视图。

前端在进入个人中心时加载数据,刷题记录查询条件只影响列表,不会改变业务状态。

这个细节也很重要:个人中心是只读复盘页面,不应该影响刷题会话。

十二、这个成长体系可以复用到哪些项目

这套设计不只适用于 AI 学习平台,也适合这些场景:

  • 面试刷题平台
  • 编程题训练平台
  • 在线课程练习系统
  • 内部培训系统
  • 知识问答系统
  • 题库型学习工具

核心思路是:

答题行为
  -> 评分
  -> 更新题目汇总
  -> 结算经验
  -> 判断徽章
  -> 更新成长概览
  -> 个人中心复盘

只要把“用户行为”和“可衡量结果”定义清楚,就可以套用类似模型。

十三、设计经验总结

这次实现成长体系后,我觉得有几个点比较值得注意:

  1. 经验规则要能解释清楚,用户才会认可。
  2. 重复刷题不能无限加经验,否则数据会失真。
  3. 等级和段位最好用快照保存,避免每次查询全量计算。
  4. 徽章发放必须幂等,不能重复发。
  5. 隐藏徽章适合做惊喜,不适合全部提前公开。
  6. 成长体系不能只看总经验,还要有刷题记录和薄弱点。
  7. 个人中心尽量做成只读复盘页面,避免影响主业务状态。

十四、项目地址

在线体验:

https://ai-studyhub.cn

GitHub:

https://github.com/Earth-OL-Player/ai_learn_project

如果你正在做刷题系统、学习平台、AI 面试练习工具,或者想参考成长体系设计,可以看看这个项目。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐