• bbs1org

    五级信任等级体系(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 治理类权限(改分类/重命名/归档/查看已删帖/私密板块)。

    主楼
  • Maser

    大招来了

    #1
  • bbs1org

    好用。800行代码搞定!

    #2
  • dcve

    是作为插件吗

    #3
  • bbs1org

    当然。一个插件

    #4
  • 9

    看起来不错,我不懂代码

    #5

发表回复

登录后回复