五级信任等级体系(user_level)

版本 2.5.1 · 借鉴 Discourse 信任等级核心思想,适配轻量 PHP 论坛架构

设计原则:等级判定 = 纯函数,永不落库(每次现算);仅行为流水、累计计数器与显示缓存入库。

一、等级总览

等级名称定位达标后规则
TL0新访客限制档注册默认;受多项发帖限制
TL1见习能力档(仅靠阅读达成)达标永久保留
TL2正式成员能力档(互动验证)达标永久保留
TL3社区骨干考核档唯一自动浮动档:不达标回落 TL2
TL4社区领袖手动档仅管理员授予/解除,系统永不自动变更;可锁定

线性阶梯:高档判定包含低档条件,天然满足"高档必须先满足低档"。

二、判定条件(默认阈值,全部后台可配)

TL1 见习

条件默认阈值口径
浏览不同公开话题≥5全生命周期累计;看自己的主题不计

TL2 正式成员(须先满足 TL1)

条件默认阈值口径
账号访问天数≥12 天按天去重,不要求连续
发布新主题≥2发表成功计 1,编辑不计
产生回复的不同话题≥3同一话题多次回复仅计 1 次
浏览不同公开话题≥20同 TL1 口径
收到点赞≥1不同内容去重
送出点赞≥1按点赞者计数

TL3 社区骨干(须先满足 TL2,90 天滚动窗口)

条件默认阈值口径
窗口内访问天数≥45 天窗口长度可配,默认 90 天
窗口内回复不同话题≥8同话题去重
窗口内发布新主题≥4—
窗口内浏览话题≥40不同话题去重
窗口内收到点赞≥15—
窗口内送出点赞≥25按点赞者计数
点赞来源不同用户数≥5防互刷:收赞按点赞人去重
违规处罚无is_banned / is_muted 现值

TL4 社区领袖

纯手动授予,系统永不自动晋升或降级。权限建议通过用户组体系配置。

三、TL3 浮动机制

晋升:全部 100% 条件满足 → 写入晋升时间 tl3_at
保持:晋升后 14 天宽限期内无条件不掉级
     宽限期后,各项 ≥ 阈值的 90% 水位(自动向上取整)即保持
回落:跌破 90% 水位(或被禁言/封禁)→ 回落 TL2,清除晋升时间
再晋升:重新攒满 100% 条件,宽限期重新计时

禁言/封禁视为跌破:处罚期间不晋升、宽限期不保护。

四、TL0 新访客限制

限制默认值说明
发主题禁止(需 TL1)仅限制新建,编辑不受限
发帖间隔300 秒叠加于站内限流之上,0 表示不叠加
单帖链接数最多 2 个0 禁止链接,99 不限
编辑窗口发布后 10 分钟仅限编辑自己的内容

管理员(can_manage / can_access_admin)豁免全部门控。

五、能力解锁矩阵

其他插件通过 hook('user_level.allow', true, ['ability' => '…']) 检查,返回非 true 即拦截:

能力 ability默认所需等级已接入插件
dm_send(发送私信)TL1direct_messages
upload_image(上传附件)TL1attachment_upload(贴图上传同端点,自动覆盖)
invite(兑换邀请码)TL2invite_code

六、行为采集口径

行为采集点去重规则流水 type
来访每次登录请求自动记一天一行visit
浏览话题看主题页自动记一话题一行;看自己的不计read
发主题发表成功记编辑不计topic
回复回帖成功记按话题去重;回复自己话题不计reply
收到赞订阅 like_coin.after_mutate一内容一赞者一行;取消赞不回退like_topic / like_reply
外部上报其他插件主动调用同上任意白名单 type

外部上报接口:

fire('user_level.log', ['uid' => ?, 'type' => ?, 'ref_id' => ?, 'src' => ?可选, 'day' => 'Y-m-d'可选]);

七、防刷规则(强制生效)

  1. 私信内一切行为不计入统计(不采集)
  2. 回复自己发布的话题不计入回复话题数
  3. 同一话题多次回复仅计 1 次
  4. TL3 校验点赞来源多样性(≥5 个不同用户),小号互刷无法达标
  5. 被禁言/封禁的用户暂停晋升并回落
  6. 编辑内容不产生任何计数;取消赞不回退计数(单调,宁低勿高)

八、显示缓存机制

等级判定每次现算(纯函数),但徽章显示走缓存列 map_lv(users 表一列,NULL = 未计算):

场景行为
页面读取热态 1 条 IN 查询直读缓存;缓存为空则纯函数现算并回填
用户访问boot 现算后 diff,等级变化才写缓存
点赞 / 发帖 / 回帖清空当事人缓存,读取时重算
保存阈值 / 禁言不批量清空(影响面不可知),各用户访问时自动纠正
后台手动支持清空单个用户缓存

权限判定(发帖门控、能力检查)不走缓存,始终现算,只有徽章显示可能滞后到当事人下次访问。

九、展示

位置形式
主题详情页徽章置于楼层 post-meta 区域最前面:emoji + 文字胶囊
列表页(首页/版块/个人页)emoji 显示在头像右下角(可开关)

后台可按等级自定义每级的 emoji 图标与文字,并追加自定义 CSS(如 .user_level-badge{border-radius:999px})。

十、后台管理(admin_tabs: user_level)

  1. 信任等级阈值:TL1 / TL2 / TL3 / TL3 保持策略(水位 90%、宽限 14 天)/ TL0 限制 / 能力解锁等级 / 徽章显示
  2. 用户等级管理:设为 TL4、解除 TL4、锁定为当前等级、解除锁定、清空单个用户显示缓存

十一、数据表

表用途生命周期
plugin_user_level_logs行为流水:PK(user_id, type, ref_id, src_uid) + KEY(user_id, day) + KEY(day)cron 每小时修剪,仅保留考察窗口内
plugin_user_level_users一行一人:累计计数器(visit_days / read_topics / reply_topics / topic_count / recv_likes / given_likes)+ tl3_at 水位 + manual_lv / locked_lv + map_lv 显示缓存随用户永久

插件配置(阈值、徽章等)存于内核 app_plugins.config_json。

十二、性能特征

路径查询数
登录用户任意请求(boot)1 空转探测 + 汇总 1 条(TL0/TL1 到此为止);TL2+ 加窗口 2 条
主题详情页 / 列表页徽章热态 1 条(map_lv IN);冷启动惰性回填每人一次
红区渲染钩子(每楼层)0(只读内存)
cron1 条 DELETE(每小时)

全部单表查询、索引命中、无 JOIN;流水表体积有上界(90 天窗口)。

十三、迁移与卸载

  • 升级自动迁移(schema_ver 水位守卫,幂等):v1→v4 重建流水 PK 加点赞者维度、计数器从核心表全量重算
  • 卸载 drop 全部插件表;配置随 app_plugins 行删除

十四、一期裁剪项(后续可选)

帖级已读统计与阅读时长心跳、待审队列、Wiki 编辑、群组私信、TL3 治理类权限(改分类/重命名/归档/查看已删帖/私密板块)。

主楼