[achievements]成就徽章与等级成长热
- 成就徽章与等级成长ID achievements版本 2.1.0插件制作者 cxk123售价 30 积分2809 行 / 163.4 KBHook / 路由 / 后台页把用户的日常动作变成看得见的成长:发布主题、回帖、被采纳、积分变动、提交问卷、发起活动、连续活跃都会实时点亮对应徽章,收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/achievements/plugin.php插件预览6 张开发日志已有 5 条
此项目接受所有登录用户协助维护和提交更新。
主楼 版本 1.0.0 更新:
【首次发布】成就徽章与等级成长 1.0.0一、成就徽章墙
· 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。
· 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。
· 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得 / 未获得」和「还差多少」。
· 「最近达成」展示全站刚刚点亮了哪些徽章,并显示获得率。二、我的成长
· 等级卡:等级、成长值、距下一级还差多少,成长值由七项指标加权而成。
· 每项指标一条进度条,另有「最近可达成 N 枚」逐条进度。
· 达成时间线:什么时候点亮了什么,未读的有小红点,打开本页即已读。
· 等级仅用于展示成长曲线,不会改变用户组与权限。三、个人主页
· 新增「成就」页签,进去就能看到对方的等级与整面徽章墙。
· 主题与回帖的作者旁边直接挂出他最有代表性的一枚徽章。四、管理后台
· 图形化规则编辑器:条件 = 指标 + 运算符 + 阈值,「全部满足」与「任一满足」可以叠加;可设稀有度、系列、阶梯、奖励积分与排序。
· 内置 15 枚默认成就(4 个系列),可逐条修改或删除,也能一键补齐。
· 校准面板:显示校准游标、上一轮处理人数、修正行数与语句数,可手动跑一轮;校准只修正与站内真实计数不符的行,不会误伤其它数据。
· 站点开关、实时稀有度开关、每页徽章数、最近达成条数、成长榜条数、时区偏移等都可调。五、性能
· 采用事件驱动的增量统计:用户动作发生时只记录一条事件并就地结算,任何页面打开都不会全表重算。
· 帖子里的徽章用「整页一次批量回填」,徽章数量与楼层数量增长都不会增加数据库查询次数。
· 个人主页页签、成就墙、我的成长都有固定的查询条数;站点没有任何启用中的成就时,前台页面零额外查询。插件质量报告
插件:
achievementsHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 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字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 - bbs1org4天前
点赞👏
关键现在几个在乎这个,大家都快性子!抖音快手小红书习惯了!
我觉得还是侧重一些吸引人的功能插件留住人!
虽然不错,很多积分都挥霍完了,大多数来自你的作品🤣
版本 1.0.1 更新:
【首次发布】成就徽章与等级成长 1.0.1一、成就徽章墙
· 发布主题、发表回帖、积分变动、回答被采纳、提交问卷、发起活动、连续活跃 —— 七类动作都会实时点亮对应徽章,达到条件即刻生效,不用等定时任务。
· 徽章按全站获得率自动分成普通 / 稀有 / 史诗 / 传说四档,同一系列还有铜 / 银 / 金阶梯。
· 可以按「全部 / 已获得 / 未获得 / 系列进度」筛选,卡片上直接写清「已获得 / 未获得」和「还差多少」。
· 「最近达成」展示全站刚刚点亮了哪些徽章,并显示获得率。二、我的成长
· 等级卡:等级、成长值、距下一级还差多少,成长值由七项指标加权而成。
· 每项指标一条进度条,另有「最近可达成 N 枚」逐条进度。
· 达成时间线:什么时候点亮了什么,未读的有小红点,打开本页即已读。
· 等级仅用于展示成长曲线,不会改变用户组与权限。三、个人主页
· 新增「成就」页签,进去就能看到对方的等级与整面徽章墙。
· 主题与回帖的作者旁边直接挂出他最有代表性的一枚徽章。四、管理后台
· 图形化规则编辑器:条件 = 指标 + 运算符 + 阈值,「全部满足」与「任一满足」可以叠加;可设稀有度、系列、阶梯、奖励积分与排序。
· 内置 15 枚默认成就(4 个系列),可逐条修改或删除,也能一键补齐。
· 校准面板:显示校准游标、上一轮处理人数、修正行数与语句数,可手动跑一轮;校准只修正与站内真实计数不符的行,不会误伤其它数据。
· 站点开关、实时稀有度开关、每页徽章数、最近达成条数、成长榜条数、时区偏移等都可调。五、性能
· 采用事件驱动的增量统计:用户动作发生时只记录一条事件并就地结算,任何页面打开都不会全表重算。
· 帖子里的徽章用「整页一次批量回填」,徽章数量与楼层数量增长都不会增加数据库查询次数。
· 个人主页页签、成就墙、我的成长都有固定的查询条数;站点没有任何启用中的成就时,前台页面零额外查询。版本 1.0.2 更新:
【1.0.2】显式校准入口 —— 「计数器是增量口径」这条边界项收口- 后台「校准面板」变成显式校准入口:三块写死的口径说明(入口是什么 / 校准不会顺手解锁 / 范围与奖励默认值)
+ 校准按钮(带固定锚点)+ 校准回执(回执里给出解锁数前后对照)。
- 口径原文落到界面上:校准只把「计数器 ↔ 真实内容」对齐(主题数 / 回帖数 / 最长连续活跃三个可推导指标),
只写漂移行,一条解锁行都不写、一分奖励都不发;徽章只由用户的下一次动作(发主题 / 回帖 / 积分变动 /
被采纳 / 提交问卷 / 发布活动)点亮 —— 所以校准完看到「计数已经够了、徽章还没亮」是正常的。- 后台同屏写明:积分净增 / 被采纳 / 问卷 / 活动是增量口径、不参与重算;奖励积分默认全为 0(要发奖逐枚配置)。
- 套件 §11 新增 19 条断言,其中一条是端到端行为断言:把某用户计数压到 0 → 校准(解锁仍为 0)
→ 下一次动作(才点亮);另有一条静态断言守着「内置成就奖励积分全为 0」。
6
版本 2.0.0 更新:
2.0.0(大版本)· 三项新能力 + 五处缺陷修复【新能力一 · 成长称号展示位】
· 解锁记录新增 worn 标记:用户可以在「我的成长」里把任意一枚自己已经获得的成就佩戴成「成长称号」,
佩戴 / 取消都是标准 POST + CSRF 写路径,未拥有的成就一律拒绝(校验拥有权)。
· 称号同时显示在三处:帖内作者信息位(与徽章同一批读回,帖内查询数仍然是 1)、
个人主页「成就」页签、成就墙的「我的成长称号」行。
· 后台可整体开关展示位(关掉后帖内只去掉称号 chip,徽章照常显示)。
· 老站点升级自动补列(幂等,只加列、不改列、不重建表)。【新能力二 · 系列合集进度】
· 每条系列给出完成度百分比、已获得 / 总数,以及「下一个阶梯」是哪一枚、本系列还差几枚;
全获得时显示「系列已完成 ✓」,排序按完成度降序。
· 成就墙默认视图直接可见(不必再切页签),「我的成长」与个人主页页签同样展示;
原来的系列页签保留并额外给出铜 / 银 / 金阶梯明细。后台可关。
· 全部是内存计算,不产生任何额外数据库查询。【新能力三 · 全量重算(分批 / 断点续跑 / 幂等 / 僵尸清理)】
· 后台新增「全量重算一批」:一次处理一批用户(默认 200 人,可调 50-2000),
与校准任务共用同一段窗口核心与同一份口径(只对齐主题数 / 回帖数 / 最长连续活跃,只写漂移行,
不写解锁行、不发奖励)。
· 断点落在设置里:中途刷新后台、关掉浏览器都不会丢进度,走完一圈自动标记完成并把断点归零。
· 面板给出断点游标 / 本圈已覆盖人数 / 本圈漂移行 / 已完成圈数 / 上一圈成绩 / 清理僵尸行数。
· 幂等:走完一圈再走一圈必然是 0 漂移、0 行被改写;每批顺带清掉「用户已被删除」的
僵尸计数行与僵尸连续活跃行。【修复】
- 成就卡片「还差多少」:全部满足条件成立、但「任一满足」还不成立时,此前会谎报「已满足条件」
(同一张卡片上写着「未获得」),现在给出「任一满足项还差 N · 指标」。
- 「最近可达成」对只配了「任一满足」的成就取错了指标(回落成发布主题)、目标恒为 0、进度恒 0,
现在改为取该组里最接近达成的那一条。
- 「达成度」此前取最乐观值(例如「主题≥10 且 回帖≥50」在实际 9 / 1 时写 90%),
现在改为最短板口径(同例为 2%),「最近可达成」的排序不再被虚高值带偏。
- 成就墙「已获得 / 未获得」筛选此前是「先按全量切片、再在切片里过滤」,徽章多于一页时,
第 2 页之后才出现的已获得徽章会永久消失、翻页还可能翻出空页;现在先过滤再分页,
分页条与筛选后的条数一致;系列页签也不再渲染点了没反应的分页条。- 奖励可能被重复发放:同一次动作被重复投递(双击 / 重试 / 并发)时,即使解锁行被唯一键忽略,
仍会按旧快照再发一次奖励。现在发放前先「抢凭证」(解锁行上的一次性 token),
只有抢到的请求才发奖;发放异常会把凭证还回去,由用户的下一次动作自愈补发,不会静默丢奖励。【兼容】
· 5 张表结构不变,仅新增两个列(worn / reward_token),升级自动补列。
· 内置 15 枚成就、7 个指标源、只读等级、稀有度实时分档、匿名遮蔽契约等既有口径全部不变。
· 奖励积分默认仍为 0:插件不会在站长没配置的情况下静默变动任何人的积分。版本 2.1.0 更新:
2.1.0(大更新)· 原地升级自愈 + 奖励发放的端到端幂等 + 系列完成奖励【修复 · 原地升级不再「换文件就炸」】
· 背景(实测):核心在插件文件被替换时只更新版本号,不会重跑建表/补列的安装流程,
于是「文件已经是新版、库里还是旧结构」。2.0.0 就这么踩过一次:老库缺 unlocks.worn,
升级后的第一个请求直接抛 PDOException,核心把整个插件自动停用,前台成就页全没了。
· 现在插件自带「结构版本戳」,并在每个请求启动时做一次幂等自愈:
覆盖新文件后发一个请求(甚至只是打开首页)即自动补列、补表、重建定义缓存与站点标记。
· 自愈可以重复执行:不会重复解锁、不会重复发奖(实测:升级前后解锁行数与全站积分总和完全一致)。
· 版本戳匹配时只是一次内存比较,0 条数据库查询,前台查询预算不受影响。
· 后台概览新增「结构版本 v3(原地升级自愈戳)」,站长可以直接看到当前结构版本。【修复 · 奖励发放的异常语义细分】
· 确认了积分发放的真实边界:只有「加分」那一步在事务里,「加分之后」的回调在事务外,
所以异常必须分两种处理,否则会出现「已加分又补发一次」的重复入账。
· 现在:积分没落账(事务回滚)→ 把发放凭证还回去,用户的下一次动作自动补发;
积分已经落账(提交之后才抛异常)→ 凭证保持已发放,绝不重复加分。
判据是发放前后的积分对照,失败路径才会多读两次,成功路径零额外查询。【新能力 · 系列完成奖励】
· 集齐一个系列的全部成就后,可以在「我的成长」里一键领取该系列的完成奖励
(后台「系列完成奖励(积分)」配置,默认 0 = 不发奖,保持插件不动用户积分的一贯口径)。
· 同一系列每人只发一次:台账表带 (用户, 系列) 唯一约束,配合一次性随机凭证回读认领 ——
即使两个请求同时点「领取」,也只会有一行台账、只加一次分(并发实测)。
· 系列卡上会给出状态:未集齐(还差几枚)/ 可领取(带按钮)/ 已领取(金额与时间)。
· 领取入口只出现在「我的成长」本人视图,成就墙与个人主页页签保持只读。【修复 · 实际统计口径的小问题】
· 「已入账奖励」与「已领系列奖励」在后台概览分别计数,便于对账。【兼容】
· 5 张表结构不变,新增 1 张领取台账表(升级时自动创建);2.0.0 的两列由自愈流程幂等补齐。
· 内置 15 枚成就、7 个指标源、只读等级、稀有度实时分档、称号佩戴、系列进度、全量重算等既有口径全部不变。
· 奖励积分默认仍为 0(含系列完成奖励):插件不会在站长没配置的情况下静默变动任何人的积分。