• cxk123
    成就徽章与等级成长
    ID achievements版本 2.1.0插件制作者 cxk123售价 30 积分2809 行 / 163.4 KBHook / 路由 / 后台页
    把用户的日常动作变成看得见的成长:发布主题、回帖、被采纳、积分变动、提交问卷、发起活动、连续活跃都会实时点亮对应徽章,
    收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。
    app/plugins/achievements/plugin.php
    开发日志已有 5 条

    此项目接受所有登录用户协助维护和提交更新。

    • cxk123
      cxk123
      版本 2.1.0 4961951ea435 更新:2.1.0(大更新)· 原地升级自愈 + 奖励发放的端到端幂等 + 系列完成奖励 【修复 · 原地升级不再「换文件就炸」】 · 背景(实测):核心在插件文件被替换时只更新版本号,**不会**重跑建表/补列的安装流程, 于是「文件已经是新版、库里还是旧结构」。2.0.0 就这么踩过一次:老库缺 unlocks.worn, 升级后的第一个请求直接抛 PDOException,核心把**整个插件自动停用release
    • cxk123
      cxk123
      版本 2.0.0 bf8217e32610 更新:2.0.0(大版本)· 三项新能力 + 五处缺陷修复 【新能力一 · 成长称号展示位】 · 解锁记录新增 worn 标记:用户可以在「我的成长」里把任意一枚**自己已经获得的**成就佩戴成「成长称号」, 佩戴 / 取消都是标准 POST + CSRF 写路径,未拥有的成就一律拒绝(校验拥有权)。 · 称号同时显示在三处:帖内作者信息位(与徽章同一批读回,帖内查询数**仍然是 1**)、 个人主页「
    • cxk123
      cxk123
      版本 1.0.2 4387ad6ee494 更新:【1.0.2】显式校准入口 —— 「计数器是增量口径」这条边界项收口 - 后台「校准面板」变成**显式校准入口**:三块写死的口径说明(入口是什么 / **校准不会顺手解锁** / 范围与奖励默认值) + 校准按钮(带固定锚点)+ 校准回执(回执里给出**解锁数前后对照**)。 - 口径原文落到界面上:校准只把「计数器 ↔ 真实内容」对齐(主题数 / 回帖数 / 最长连续活跃三个可推导指标), *
    • cxk123
      cxk123
      版本 1.0.1 59d15808d5c0 更新:【首次发布】成就徽章与等级成长 1.0.1 一、成就徽章墙 · 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。 · 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。 · 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得
    • cxk123
      cxk123
      版本 1.0.0 83d3135e045c 更新:【首次发布】成就徽章与等级成长 1.0.0 一、成就徽章墙 · 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。 · 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。 · 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得
    主楼
  • cxk123

    版本 1.0.0 更新:
    【首次发布】成就徽章与等级成长 1.0.0

    一、成就徽章墙
    · 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。
    · 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。
    · 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得 / 未获得」和「还差多少」。
    · 「最近达成」展示全站刚刚点亮了哪些徽章,并显示获得率。

    二、我的成长
    · 等级卡:等级、成长值、距下一级还差多少,成长值由七项指标加权而成。
    · 每项指标一条进度条,另有「最近可达成 N 枚」逐条进度。
    · 达成时间线:什么时候点亮了什么,未读的有小红点,打开本页即已读。
    · 等级仅用于展示成长曲线,不会改变用户组与权限。

    三、个人主页
    · 新增「成就」页签,进去就能看到对方的等级与整面徽章墙。
    · 主题与回帖的作者旁边直接挂出他最有代表性的一枚徽章。

    四、管理后台
    · 图形化规则编辑器:条件 = 指标 + 运算符 + 阈值,「全部满足」与「任一满足」可以叠加;可设稀有度、系列、阶梯、奖励积分与排序。
    · 内置 15 枚默认成就(4 个系列),可逐条修改或删除,也能一键补齐。
    · 校准面板:显示校准游标、上一轮处理人数、修正行数与语句数,可手动跑一轮;校准只修正与站内真实计数不符的行,不会误伤其它数据。
    · 站点开关、实时稀有度开关、每页徽章数、最近达成条数、成长榜条数、时区偏移等都可调。

    五、性能
    · 采用事件驱动的增量统计:用户动作发生时只记录一条事件并就地结算,任何页面打开都不会全表重算。
    · 帖子里的徽章用「整页一次批量回填」,徽章数量与楼层数量增长都不会增加数据库查询次数。
    · 个人主页页签、成就墙、我的成长都有固定的查询条数;站点没有任何启用中的成就时,前台页面零额外查询。

    #1
  • 质量报告

    插件质量报告

    插件:achievements

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    app.boot全站请求启动否5---写 plugin_achievements_defs, plugin_achievements_unlocks, plugin_achievements_counters, plugin_achievements_events, plugin_achievements_streaks, plugin_achievements_series_claims
    page.before_render全站页面输出前否5---读 plugin_achievements_unlocks, plugin_achievements_defs
    sidebar.feature_links首页/侧栏快捷功能否5----
    top.bar.actions顶部栏插件入口,同一请求只执行一次(展示位置:版块导航与搜索框前后)否5----
    reply.after_save回帖保存后否3--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    topic.after_save主题保存后否3--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    user.points_changed用户积分变动后否3--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    user.profile_tab_data用户资料页标签数据否3----
    user.profile_tabs用户资料页标签栏(展示位置:个人主页Tab)否3---读 plugin_achievements_defs
    content.before_delete内容删除操作否2---写 plugin_achievements_events;读 plugin_achievements_defs
    diy_layout.components非系统hook否1----
    event_rsvp.after_publish非系统hook否1--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    post.ops_actions非系统hook否1---读 plugin_achievements_defs
    qa_bounty.after_accept非系统hook否1--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    survey_poll.after_submit非系统hook否1--app_users写 plugin_achievements_streaks, plugin_achievements_events, plugin_achievements_unlocks;读 plugin_achievements_defs, plugin_achievements_counters
    topic.index_template非系统hook否1---读 plugin_achievements_defs, plugin_achievements_unlocks, plugin_achievements_counters

    颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。

    数据字典

    plugin_achievements_defs

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_achievements_counters

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_achievements_unlocks

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_achievements_events

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_achievements_streaks

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_achievements_series_claims

    字段类型可空默认值约束
    -动态定义--无法静态解析
    #2
  • bbs1org

    点赞👏

    #3
  • dasheyang

    关键现在几个在乎这个,大家都快性子!抖音快手小红书习惯了!

    #4
  • dasheyang

    我觉得还是侧重一些吸引人的功能插件留住人!

    #5
  • 8

    虽然不错,很多积分都挥霍完了,大多数来自你的作品🤣

    #6
  • cxk123

    版本 1.0.1 更新:
    【首次发布】成就徽章与等级成长 1.0.1

    一、成就徽章墙
    · 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。
    · 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。
    · 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得 / 未获得」和「还差多少」。
    · 「最近达成」展示全站刚刚点亮了哪些徽章,并显示获得率。

    二、我的成长
    · 等级卡:等级、成长值、距下一级还差多少,成长值由七项指标加权而成。
    · 每项指标一条进度条,另有「最近可达成 N 枚」逐条进度。
    · 达成时间线:什么时候点亮了什么,未读的有小红点,打开本页即已读。
    · 等级仅用于展示成长曲线,不会改变用户组与权限。

    三、个人主页
    · 新增「成就」页签,进去就能看到对方的等级与整面徽章墙。
    · 主题与回帖的作者旁边直接挂出他最有代表性的一枚徽章。

    四、管理后台
    · 图形化规则编辑器:条件 = 指标 + 运算符 + 阈值,「全部满足」与「任一满足」可以叠加;可设稀有度、系列、阶梯、奖励积分与排序。
    · 内置 15 枚默认成就(4 个系列),可逐条修改或删除,也能一键补齐。
    · 校准面板:显示校准游标、上一轮处理人数、修正行数与语句数,可手动跑一轮;校准只修正与站内真实计数不符的行,不会误伤其它数据。
    · 站点开关、实时稀有度开关、每页徽章数、最近达成条数、成长榜条数、时区偏移等都可调。

    五、性能
    · 采用事件驱动的增量统计:用户动作发生时只记录一条事件并就地结算,任何页面打开都不会全表重算。
    · 帖子里的徽章用「整页一次批量回填」,徽章数量与楼层数量增长都不会增加数据库查询次数。
    · 个人主页页签、成就墙、我的成长都有固定的查询条数;站点没有任何启用中的成就时,前台页面零额外查询。

    #7
  • cxk123

    版本 1.0.2 更新:
    【1.0.2】显式校准入口 —— 「计数器是增量口径」这条边界项收口

    • 后台「校准面板」变成显式校准入口:三块写死的口径说明(入口是什么 / 校准不会顺手解锁 / 范围与奖励默认值)

    + 校准按钮(带固定锚点)+ 校准回执(回执里给出解锁数前后对照)。

    • 口径原文落到界面上:校准只把「计数器 ↔ 真实内容」对齐(主题数 / 回帖数 / 最长连续活跃三个可推导指标),

    只写漂移行,一条解锁行都不写、一分奖励都不发;徽章只由用户的下一次动作(发主题 / 回帖 / 积分变动 /
    被采纳 / 提交问卷 / 发布活动)点亮 —— 所以校准完看到「计数已经够了、徽章还没亮」是正常的。

    • 后台同屏写明:积分净增 / 被采纳 / 问卷 / 活动是增量口径、不参与重算;奖励积分默认全为 0(要发奖逐枚配置)。
    • 套件 §11 新增 19 条断言,其中一条是端到端行为断言:把某用户计数压到 0 → 校准(解锁仍为 0)

    → 下一次动作(才点亮);另有一条静态断言守着「内置成就奖励积分全为 0」。

    #8
  • karnoo

    6

    #9
  • cxk123

    版本 2.0.0 更新:
    2.0.0(大版本)· 三项新能力 + 五处缺陷修复

    【新能力一 · 成长称号展示位】
    · 解锁记录新增 worn 标记:用户可以在「我的成长」里把任意一枚自己已经获得的成就佩戴成「成长称号」,
    佩戴 / 取消都是标准 POST + CSRF 写路径,未拥有的成就一律拒绝(校验拥有权)。
    · 称号同时显示在三处:帖内作者信息位(与徽章同一批读回,帖内查询数仍然是 1)、
    个人主页「成就」页签、成就墙的「我的成长称号」行。
    · 后台可整体开关展示位(关掉后帖内只去掉称号 chip,徽章照常显示)。
    · 老站点升级自动补列(幂等,只加列、不改列、不重建表)。

    【新能力二 · 系列合集进度】
    · 每条系列给出完成度百分比、已获得 / 总数,以及「下一个阶梯」是哪一枚、本系列还差几枚;
    全获得时显示「系列已完成 ✓」,排序按完成度降序。
    · 成就墙默认视图直接可见(不必再切页签),「我的成长」与个人主页页签同样展示;
    原来的系列页签保留并额外给出铜 / 银 / 金阶梯明细。后台可关。
    · 全部是内存计算,不产生任何额外数据库查询。

    【新能力三 · 全量重算(分批 / 断点续跑 / 幂等 / 僵尸清理)】
    · 后台新增「全量重算一批」:一次处理一批用户(默认 200 人,可调 50-2000),
    与校准任务共用同一段窗口核心与同一份口径(只对齐主题数 / 回帖数 / 最长连续活跃,只写漂移行,
    不写解锁行、不发奖励)。
    · 断点落在设置里:中途刷新后台、关掉浏览器都不会丢进度,走完一圈自动标记完成并把断点归零。
    · 面板给出断点游标 / 本圈已覆盖人数 / 本圈漂移行 / 已完成圈数 / 上一圈成绩 / 清理僵尸行数。
    · 幂等:走完一圈再走一圈必然是 0 漂移、0 行被改写;每批顺带清掉「用户已被删除」的
    僵尸计数行与僵尸连续活跃行。

    【修复】

    1. 成就卡片「还差多少」:全部满足条件成立、但「任一满足」还不成立时,此前会谎报「已满足条件」

    (同一张卡片上写着「未获得」),现在给出「任一满足项还差 N · 指标」。

    1. 「最近可达成」对只配了「任一满足」的成就取错了指标(回落成发布主题)、目标恒为 0、进度恒 0,

    现在改为取该组里最接近达成的那一条。

    1. 「达成度」此前取最乐观值(例如「主题≥10 且 回帖≥50」在实际 9 / 1 时写 90%),

    现在改为最短板口径(同例为 2%),「最近可达成」的排序不再被虚高值带偏。

    1. 成就墙「已获得 / 未获得」筛选此前是「先按全量切片、再在切片里过滤」,徽章多于一页时,

    第 2 页之后才出现的已获得徽章会永久消失、翻页还可能翻出空页;现在先过滤再分页,
    分页条与筛选后的条数一致;系列页签也不再渲染点了没反应的分页条。

    1. 奖励可能被重复发放:同一次动作被重复投递(双击 / 重试 / 并发)时,即使解锁行被唯一键忽略,

    仍会按旧快照再发一次奖励。现在发放前先「抢凭证」(解锁行上的一次性 token),
    只有抢到的请求才发奖;发放异常会把凭证还回去,由用户的下一次动作自愈补发,不会静默丢奖励。

    【兼容】
    · 5 张表结构不变,仅新增两个列(worn / reward_token),升级自动补列。
    · 内置 15 枚成就、7 个指标源、只读等级、稀有度实时分档、匿名遮蔽契约等既有口径全部不变。
    · 奖励积分默认仍为 0:插件不会在站长没配置的情况下静默变动任何人的积分。

    #10
  • cxk123

    版本 2.1.0 更新:
    2.1.0(大更新)· 原地升级自愈 + 奖励发放的端到端幂等 + 系列完成奖励

    【修复 · 原地升级不再「换文件就炸」】
    · 背景(实测):核心在插件文件被替换时只更新版本号,不会重跑建表/补列的安装流程,
    于是「文件已经是新版、库里还是旧结构」。2.0.0 就这么踩过一次:老库缺 unlocks.worn,
    升级后的第一个请求直接抛 PDOException,核心把整个插件自动停用,前台成就页全没了。
    · 现在插件自带「结构版本戳」,并在每个请求启动时做一次幂等自愈:
    覆盖新文件后发一个请求(甚至只是打开首页)即自动补列、补表、重建定义缓存与站点标记。
    · 自愈可以重复执行:不会重复解锁、不会重复发奖(实测:升级前后解锁行数与全站积分总和完全一致)。
    · 版本戳匹配时只是一次内存比较,0 条数据库查询,前台查询预算不受影响。
    · 后台概览新增「结构版本 v3(原地升级自愈戳)」,站长可以直接看到当前结构版本。

    【修复 · 奖励发放的异常语义细分】
    · 确认了积分发放的真实边界:只有「加分」那一步在事务里,「加分之后」的回调在事务外,
    所以异常必须分两种处理,否则会出现「已加分又补发一次」的重复入账。
    · 现在:积分没落账(事务回滚)→ 把发放凭证还回去,用户的下一次动作自动补发;
    积分已经落账(提交之后才抛异常)→ 凭证保持已发放,绝不重复加分。
    判据是发放前后的积分对照,失败路径才会多读两次,成功路径零额外查询。

    【新能力 · 系列完成奖励】
    · 集齐一个系列的全部成就后,可以在「我的成长」里一键领取该系列的完成奖励
    (后台「系列完成奖励(积分)」配置,默认 0 = 不发奖,保持插件不动用户积分的一贯口径)。
    · 同一系列每人只发一次:台账表带 (用户, 系列) 唯一约束,配合一次性随机凭证回读认领 ——
    即使两个请求同时点「领取」,也只会有一行台账、只加一次分(并发实测)。
    · 系列卡上会给出状态:未集齐(还差几枚)/ 可领取(带按钮)/ 已领取(金额与时间)。
    · 领取入口只出现在「我的成长」本人视图,成就墙与个人主页页签保持只读。

    【修复 · 实际统计口径的小问题】
    · 「已入账奖励」与「已领系列奖励」在后台概览分别计数,便于对账。

    【兼容】
    · 5 张表结构不变,新增 1 张领取台账表(升级时自动创建);2.0.0 的两列由自愈流程幂等补齐。
    · 内置 15 枚成就、7 个指标源、只读等级、稀有度实时分档、称号佩戴、系列进度、全量重算等既有口径全部不变。
    · 奖励积分默认仍为 0(含系列完成奖励):插件不会在站长没配置的情况下静默变动任何人的积分。

    #11

发表回复

登录后回复