• cxk123
    关注与动态
    ID user_follow版本 10.3.0插件制作者 cxk123售价 30 积分8598 行 / 548.7 KBHook / 路由 / 后台页
    10.3.0:补「运行期结构自愈」—— 覆盖文件升级(把新 plugin.php 拷进站点、不跑 install)时,各入口先按「内存副本 → settings 标记 → 才 DDL」三道门幂等补齐缺表缺列,老库不会再因为 PDOException 被核心整插件停用(结构标记(初始值 1)此前本插件一个都没有)。关注感兴趣的用户、版块与关键词,把新主题、回帖与活动收进动态流:7.0.0 升级为社区关系网——群聊(多人会话,群主可改名/踢人/解散,成员可退群,屏蔽者不可入群,未读并入消息中心)、动态流「推荐」排序(热度+亲密度+关键词,一条聚合取热度、内存打分)、关系网络页(二度人脉与「你和 TA 都关注了 X」推荐理由,可一键关注/忽略)、通知聚合与按类型静音(折叠分组,徽标口径一致)、作者洞察(近 30 天最热主题/互动 Top N/被收藏数,一条聚合查询);另含消息中心、私信引用与归档、免打扰时段、收藏、一对一私信、点赞评论、分组、特别关注与每周摘要。9.0.0 新增关注备注(只自己可见,名册搜索同时匹配昵称与备注)、暂停关注(1/3/7/30 天,期间不进动态流不发通知,到期自动恢复)、关注体检(互关 / 已备注 / 沉默关注六格 + 沉默关注清单可批量取关),并修掉私密群名泄露、免打扰挡不住互动提醒、忽略过的推荐无法恢复三处缺陷。
    收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。
    app/plugins/user_follow/plugin.php
    开发日志最新 10 条

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

    • cxk123
      cxk123
      版本 10.3.0 adba193f49aa 更新:**10.3.0 · 覆盖文件升级自愈 + 通知写路径的版块可见性** - **修复(越权 · ACL 缺陷类第 9 款)**:动态流(读路径)早有版块可见性过滤,但**通知消费(写路径)一处都没有** —— 受限版块里的主题标题会随「关注者新主题 / 回帖 / 追更 / 版块订阅 / 跨插件事件(悬赏采纳、活动发布)」五条路径发给无权查看的人;**关注摘要**更成批带回标题,且**摘要里的条数计release
    • cxk123
      cxk123
      版本 10.2.0 ecbc0cf58bb5 更新:10.2.0 - 修复(并发安全 · 真缺陷):私信最小间隔、私信 24 小时上限、追更主题数上限、关注人数上限这四个限制,原先都是「先查再写」(先 SELECT COUNT / MAX,再 INSERT)。两个并发请求会同时读到同一份旧值、双双通过判定 —— 于是「两次发送至少间隔 N 秒」在并发下等于不存在,上限也会被冲过去(实验室里用外部写锁把两个请求对齐在写入之前复现:间隔设 300 秒仍
    • cxk123
      cxk123
      版本 10.1.0 715d77937764 更新:10.1.0 - 修复:动态详情页的评论以前只能看到前 50 条,第 51 条起会静默消失。现在评论分页显示(每页条数后台可配,默认 20),页面上给出「共 N 条 · 第 x/y 页」与分页条;发表评论后回到第 1 页,删除后回到原来的那一页。 - 修复:同一条事件被两个并发的计划任务同时取到时,收件人会收到两条一模一样的通知。现在队列改为「先领取再处理」,抢不到的事件直接跳过;并且整批消费放在
    • cxk123
      cxk123
      版本 10.0.0 7efcad95206c 更新:10.0.0 - 新能力:主题追更。主题页主楼的操作区多了「追更」按钮——追更某一个主题之后,它每有新回复都会给你发一条站内提醒(同一主题 24 小时内只提醒一次);新增「追更」页签,列出你追更的主题与「还没看过的回复有几条」,可以单个或一键标为已读,翻到最新一页也会自动标记已读。追更上限后台可调。 - 新能力:动态流过滤词(我的静音词)。在「关键词」页签里设几个不想看到的词,标题或正文命中的主题
    • cxk123
      cxk123
      版本 9.0.3 1a704a2536c7 更新:**9.0.3 小更新** · 为「举报与处置中心」(新插件)开放外部事件通道:举报处置完成后投递的 `report_center.after_dispose` 事件, 由本插件转成一条关注者动态通知 —— **只加一行 Hook 映射、复用既有回调,不新增函数**。 · 投递方自带措辞与主题归属,因此通知文案与「发布了新动态」不会串味;不投递时(例如活动报名)行为与上一版**逐字节一致**。 ·
    • cxk123
      cxk123
      版本 9.0.2 0943a3dcd226 更新:**9.0.2 修复:关注数据导出的 CSV 在真实浏览器里下不下来 + 后台设置的错误提示** * ①「关注数据导出」三个按钮响应是 CSV 附件(`Content-Disposition: attachment`),而核心前端把它们拦成 `fetch` + `JSON.parse` → 只弹「操作失败」、文件根本不下载。修法:给导出表单补 `data-no-ajax="1"`(原生提交),服务
    • cxk123
      cxk123
      版本 9.0.1 b0cad375e22f 更新:## 9.0.1 小版本:为「悬赏问答」转发采纳事件(跨插件联动) - 新增一行 Hook 映射 `qa_bounty.after_accept => user_follow_external_publish`:提问者采纳答案后,关注你的人会在站内通知里看到这条动态(与「发布了新活动」同一条队列消费链路,页面请求依旧零额外查询)。 - 外部事件 payload 增加三个**可选**字段 `text
    • cxk123
      cxk123
      版本 9.0.0 3a2f37ad6923 更新:## 9.0.0 大版本更新:关注备注 + 暂停关注 + 关注体检 本次照旧「先修 BUG,再补能力」:**修掉 4 处真实缺陷**(3 处是隐私 / 打扰口径问题),再补 3 项能力。 ### 一、修掉的 4 处缺陷(都可复现、都留了回归断言) 1. **私密群聊的群名对群外泄露** 现象:非成员带上 `?gid=N` 打开群聊页,拒绝文案里带着**群名**;而 gid 是可枚举的连续整数,任何
    • cxk123
      cxk123
      版本 8.0.0 1477da27b6c3 更新:【8.0.0】把匿名写进动态流:跨插件匿名联动 + 私信撤回 + 群公告(先修 3 处会泄露匿名身份的缺陷) 一、新增 1. 跨插件匿名联动(与「匿名区 · 树洞」插件配合) - 动态流、动态详情、收藏页都会把整页内容交给匿名区插件做身份遮蔽:匿名主题与匿名回复在这三处 也显示成「匿名 #N」,不再露出真实昵称、真实头像与个人主页链接。 - 未安装匿名区插件时完全是恒等操作(Hook 无人注册、原
    • cxk123
      cxk123
      版本 7.0.0 fc3a51131e87 更新:【7.0.0】群聊来了:多人会话 + 动态「推荐」排序 + 关系网络(二度人脉)+ 通知聚合与静音 + 作者洞察 一、新增 1. 群聊(多人会话) - 可建群、拉人;群主可改名、移出成员、解散;成员可自行退群。 - 群列表显示每个群的未读数,打开群即整段已读(用「未读水位」实现,不产生逐条已读的写放大)。 - 群未读并入「消息中心」卡片与顶栏徽标,口径与私信一致。 - 被屏蔽者拉不进群,也不会与你
    主楼
  • cxk123

    版本 1.0.0 更新:
    首个版本。

    • 关注与取消关注:帖子楼层操作条与个人主页均可一键关注,按钮状态与粉丝数即时更新。
    • 关注动态:把关注的人发布的新主题与回帖合并成一条时间线,可按主题、回帖筛选。
    • 关注与粉丝名册:独立页面与个人主页标签页两种入口,含互相关注标记与移除粉丝。
    • 站内提醒:有人关注你、你关注的人发新主题或回帖时收到通知,同一主题 24 小时内只提醒一次。
    • 用户设置:可关闭提醒,并可隐藏自己的关注与粉丝列表。
    • 后台管理:数据概览、被关注榜、7 项站点配置、一键清理失效关系,计划任务每天自动清理。
    #1
  • 质量报告

    插件质量报告

    插件:user_follow

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    page.footer全站页面页脚否5----
    sidebar.feature_links首页/侧栏快捷功能否5----
    top.bar.actions顶部栏插件入口,同一请求只执行一次(展示位置:版块导航与搜索框前后)否5----
    topic.index_data.loaded首页/版块/用户主题列表查询后否5---写 plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_queue, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    topic.title_suffix首页/版块主题列表逐条标题是5----
    topic.replies主题查看页回帖集合否4--app_replies写 plugin_user_follow_relations, plugin_user_follow_watches, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_queue, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_filters
    user.menu_links个人卡片/移动端我的菜单(展示位置:个人卡片)否4----
    reply.after_save回帖保存后否3---写 plugin_user_follow_queue, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    topic.after_save主题保存后否3---写 plugin_user_follow_queue, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    user.profile_tab_data用户资料页标签数据否3----
    user.profile_tab_header用户资料页标签内容顶部否3--app_users写 plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_queue, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    user.profile_tabs用户资料页标签栏(展示位置:个人主页Tab)否3----
    content.before_delete内容删除操作否2---写 plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_bookmarks, plugin_user_follow_queue, plugin_user_follow_watches, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_filters
    event_rsvp.after_publish非系统hook否1---写 plugin_user_follow_queue, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    post.ops_actions非系统hook否1---写 plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_queue, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    qa_bounty.after_accept非系统hook否1---写 plugin_user_follow_queue, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    report_center.after_dispose非系统hook否1---写 plugin_user_follow_queue, plugin_user_follow_relations, plugin_user_follow_groups, plugin_user_follow_settings, plugin_user_follow_likes, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_blocks, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters
    topic.index_template非系统hook回调内1--app_users写 plugin_user_follow_groups, plugin_user_follow_relations, plugin_user_follow_likes, plugin_user_follow_settings, plugin_user_follow_blocks, plugin_user_follow_queue, plugin_user_follow_comments, plugin_user_follow_forums, plugin_user_follow_messages, plugin_user_follow_keywords, plugin_user_follow_bookmarks, plugin_user_follow_conv_state, plugin_user_follow_chat_groups, plugin_user_follow_chat_members, plugin_user_follow_chat_messages, plugin_user_follow_network_ignores, plugin_user_follow_watches, plugin_user_follow_filters 修正❗️

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

    数据字典

    plugin_user_follow_relations

    字段类型可空默认值约束
    idid否-主键、自增
    follower_iduint否-唯一
    followee_iduint否-唯一
    is_starINTEGER否0-
    created_atuint否--

    plugin_user_follow_groups

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    namekey否-唯一
    sortuint否0-
    created_atuint否--

    plugin_user_follow_settings

    字段类型可空默认值约束
    user_iduint否-主键
    notify_topicINTEGER否1-
    notify_replyINTEGER否0-
    hide_followingINTEGER否0-
    hide_followersINTEGER否0-
    feed_seen_atuint否0-
    updated_atuint否0-

    plugin_user_follow_queue

    字段类型可空默认值约束
    idid否-主键、自增
    queue_keykey否-唯一
    kindkey否--
    sender_iduint否--
    topic_iduint否0-
    reply_iduint否0-
    failure_countINTEGER否0-
    created_atuint否--

    plugin_user_follow_likes

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    targetkey否-唯一
    author_iduint否0-
    created_atuint否--

    plugin_user_follow_comments

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    targetkey否--
    bodytext否--
    created_atuint否--

    plugin_user_follow_forums

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    forum_iduint否-唯一
    created_atuint否--

    plugin_user_follow_blocks

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    blocked_iduint否-唯一
    created_atuint否--

    plugin_user_follow_messages

    字段类型可空默认值约束
    idid否-主键、自增
    pair_keykey否--
    pair_lowuint否--
    pair_highuint否--
    sender_iduint否--
    recipient_iduint否--
    bodytext否--
    is_readINTEGER否0-
    created_atuint否--

    plugin_user_follow_keywords

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    keywordkey否-唯一
    created_atuint否--

    plugin_user_follow_bookmarks

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    targetkey否-唯一
    created_atuint否--

    plugin_user_follow_conv_state

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    peer_iduint否-唯一
    is_archivedINTEGER否0-
    updated_atuint否--

    plugin_user_follow_chat_groups

    字段类型可空默认值约束
    idid否-主键、自增
    owner_iduint否--
    namekey否--
    created_atuint否--
    updated_atuint否--

    plugin_user_follow_chat_members

    字段类型可空默认值约束
    idid否-主键、自增
    group_iduint否-唯一
    user_iduint否-唯一
    is_ownerINTEGER否0-
    last_read_iduint否0-
    joined_atuint否--

    plugin_user_follow_chat_messages

    字段类型可空默认值约束
    idid否-主键、自增
    group_iduint否--
    sender_iduint否--
    bodytext否--
    created_atuint否--

    plugin_user_follow_network_ignores

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    target_iduint否-唯一
    created_atuint否--

    plugin_user_follow_watches

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    topic_iduint否-唯一
    last_seen_reply_iduint否0-
    notifyINTEGER否1-
    created_atuint否--

    plugin_user_follow_filters

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    wordkey否-唯一
    created_atuint否--
    #2
  • cxk123

    版本 1.1.0 更新:
    1.1.0

    • 新增未读动态提示:动态流顶部显示未读条数,新条目带「新」标记,打开后自动记为已读。
    • 新增推荐关注:还没有关注任何人时,展示站内最近活跃的成员,可一键关注。
    • 互相关注判定更准确:按「被查看的用户与该用户是否互相关注」显示,不再随访问者变化。
    • 性能优化:关注数与粉丝数合并为一次查询;本人的关注名册与推荐结果不再重复查库;关注名册每次打开少 2 条查询,粉丝名册与动态流各少 1 条。
    • 细节优化:动态流内不再逐行重复显示「已关注」,只标记新动态;关注按钮补全无障碍标签。
    #3
  • cxk123

    版本 1.1.1 更新:
    1.1.1

    • 关注提醒改为后台队列发送:发帖、回帖时不再同步写通知,发帖响应更快,提醒最迟 1 分钟内送达。
    • 后台新增「每次处理事件数」与「队列处理间隔」两项设置,可控制提醒节奏并查看队列积压。
    • 精简个人主页标签栏,不再重复显示关注数与粉丝数,页面查询更少、加载更快。
    • 修复同一批次内多条回帖对同一主题重复提醒的问题。
    #4
  • cxk123

    版本 1.1.2 更新:
    1.1.2

    • 依赖关注的批查全部改为单条直查,不再分块循环查询,列表与主题页在高楼层、大关注量下更稳定。
    • 关注/粉丝标签页改为只替换列表区域,页面框架、侧栏与标签栏交回内核渲染,页面更统一、查询更少(他人主页标签页再少 2 条查询)。
    • 计划任务发送关注通知的整批读查询由 5 条降到 4 条。
    #5
  • cxk123

    版本 1.1.3 更新:
    1.1.3

    • 未读动态标记改用浏览器本地记录,与站内「浏览过的主题」同一套做法:日常浏览不再读写数据库,未读提示更快。
    • 修复首次访问动态页后未读标记不生效的问题,现在第一次打开就会开始记录阅读位置。
    • 动态流一次取回主题、回帖与作者资料,并顺带返回总数,正常浏览不再额外查询关注数。
    • 关注与粉丝名册按查看视角合并关系查询:查看自己的名册时查询减半,页面打开更快。
    #6
  • elm

    不错,实用的插件!

    #7
  • cxk123

    版本 1.2.0 更新:
    1.2.0

    • 新增「特别关注」:在关注名册里给任意关注对象加星,星标用户排在名册最前,其发布的新主题一律发送提醒(不受站点默认与个人开关限制,适合不想错过的作者)。
    • 动态流新增「只看特别关注」筛选,可与主题/回帖筛选叠加;星标作者的条目带星标角标,一眼看出重点动态。
    • 新增两处发现入口:顶部栏「动态」按钮与首页侧栏「我的关注」快捷入口,两处均不产生额外查询。
    • 星标状态随名册与动态流一起取回,页面查询次数与上一版完全一致。
    #8
  • cxk123

    版本 1.2.0 更新:
    补充插件预览图:动态流与未读提示、只看特别关注、关注名册、个人主页标签页、首页入口、用户设置、后台管理。

    #9
  • cxk123

    版本 1.3.0 更新:
    1.3.0

    • 新增「关注分组」:可自建分组把关注对象分类整理,关注名册支持按分组筛选,卡片上直接切换分组。
    • 动态流新增分组筛选,可与主题/回帖、只看特别关注自由叠加;分组只对自己可见。
    • 删除分组只把成员退回未分组,不会取消关注;每个用户的分组数量可在后台配置。
    • 没建过分组的用户不会为分组功能多付任何数据库查询(有无分组复用原有的一次往返判断)。
    • 预览图同步更新为 1.3.0 界面。
    #10
  • cxk123

    版本 1.4.0 更新:
    1.4.0

    • 与「活动报名」插件联动:你关注的人发布新活动时,同样会收到站内提醒,不再需要自己盯着活动列表。
    • 联动通过插件私有 Hook 实现,未安装「活动报名」时自动静默跳过,不产生任何依赖或报错。
    • 提醒依旧走关注通知队列,由计划任务统一发送,页面请求的查询次数不变。
    #11
  • 123456789

    性能怎么样😀

    #12
  • cxk123

    版本 2.0.0 更新:
    2.0.0 更新
    · 动态互动:动态流每条都能点赞与评论,点赞即时生效;评论集中在「动态详情页」,原文、评论列表和输入框在一页里
    · 互动提醒:你被点赞、被评论时会收到站内提醒,可以在「关注设置」里逐项关掉
    · 发现同好:新增「发现同好」页签,优先推荐与你关注对象也互相关注的人,卡片上直接标出共同关注人数,支持换一批
    · 每周关注摘要:按站点周期(默认 7 天)汇总「你关注的人最近发了什么」,没有新内容时不打扰
    · 后台新增:点赞/评论总数与 24 小时增量、点赞与评论开关、摘要周期与单轮人数、评论字数上限

    #13
  • cxk123

    版本 3.0.0 更新:
    3.0.0 更新
    · 版块订阅:可以订阅版块,版块里的新主题会自动进入你的动态流(已经关注的人发的不会重复出现),动态流新增「订阅版块」页签与来源标记
    · 评论 @ 提及:评论里写 @某人 会通知对方(对方可在设置里关掉),被提到的名字在评论里高亮显示
    · 屏蔽名单:名册里可以一键屏蔽骚扰你的用户,屏蔽后双方自动解除关注、对方无法再关注你,其内容也不会进入你的动态流;设置页可随时解除
    · 设置更细:新增「被 @ 时提醒我」「订阅版块有新主题时提醒我」两个开关

    #14
  • zaiwai

    这个不错,目前还空白的一个插件。

    #15
  • cxk123

    版本 4.0.0 更新:
    关注与动态 4.0.0 更新:修掉一批实际问题,再补五项常用能力

    【修复】

    1. 动态流按「关注分组」筛选时,总数统计会算错:分页条、空状态提示与实际看到的条目对不上,现在按分组筛选的结果和翻页数字完全一致。
    2. 屏蔽名单现在真正全场景生效:被屏蔽的人的主题、回帖、评论,无论从「关注的人」还是「订阅版块」进入,都不会再出现在你的动态流里;他也无法再通过 @你 来打扰你,你对他的点赞/评论提醒同样不会再发。
    3. 同一条动态下连续发两条带 @ 的评论,不会再漏掉第二条的提醒(以前同一秒内只有第一条能通知到人)。
    4. 主题或回帖被删除后,它上面的点赞与评论会一起清理干净;历史遗留的无效点赞/评论也会被每天的清理任务回收,后台统计不再虚高。
    5. 用户设置里「订阅版块有新主题时通知我」以前是个开关但不起作用,现在打开它就能收到订阅版块的更新提醒(关注的人发帖仍走原来的关注提醒,不会重复打扰)。
    6. 每周关注摘要更稳:即使计划任务中途被打断,也不会在同一个周期里给你发两条摘要。
    7. 评论 @ 提及更准:中文、带点或连字符的用户名都能 @ 到;被 @ 的人不再受「一条评论最多 5 人」的旧限制(站长可在后台调整,默认 10 人)。

    【新增】

    1. 关注名册批量管理:在「我的关注」里勾选多个人,一次把他们移动到某个分组,或者批量取消关注;只对你自己的关注关系生效。
    2. 评论 @ 提及可点击:评论里被 @ 的用户名会变成链接,点一下直接进入他的个人主页。
    3. 评论可以回复评论:支持一层回复(回复的回复会归到同一条评论下,不会越套越深),被回复的人会收到提醒。
    4. 动态流「加载更多」:不想翻页的话,点一下直接在当前页面追加下一页动态,每页的加载开销和第一页一样。
    5. 屏蔽范围可视化体现在各处:被屏蔽者不出现在你的名册推荐、动态总数、未读提示与评论列表里,解除屏蔽后一切恢复如常。

    【升级说明】

    • 老版本直接覆盖升级即可,评论表会自动补一个新字段,数据不丢。
    • 新增站点配置:评论 @ 提及人数上限(后台 → 关注与动态 → 评论 @ 提及上限)。
    • 本次更新不改变已有开关的默认值:点赞、评论、观察摘要、版块订阅的默认状态与 3.0.0 一致。
    #16
  • cxk123

    版本 4.0.0 更新:
    关注与动态 4.0.0 更新:修掉一批实际问题,再补五项常用能力

    【修复】

    1. 动态流按「关注分组」筛选时,总数统计会算错:分页条、空状态提示与实际看到的条目对不上,现在按分组筛选的结果和翻页数字完全一致。
    2. 屏蔽名单现在真正全场景生效:被屏蔽的人的主题、回帖、评论,无论从「关注的人」还是「订阅版块」进入,都不会再出现在你的动态流里;他也无法再通过 @你 来打扰你,你对他的点赞/评论提醒同样不会再发。
    3. 同一条动态下连续发两条带 @ 的评论,不会再漏掉第二条的提醒(以前同一秒内只有第一条能通知到人)。
    4. 主题或回帖被删除后,它上面的点赞与评论会一起清理干净;历史遗留的无效点赞/评论也会被每天的清理任务回收,后台统计不再虚高。
    5. 用户设置里「订阅版块有新主题时通知我」以前是个开关但不起作用,现在打开它就能收到订阅版块的更新提醒(关注的人发帖仍走原来的关注提醒,不会重复打扰)。
    6. 每周关注摘要更稳:即使计划任务中途被打断,也不会在同一个周期里给你发两条摘要。
    7. 评论 @ 提及更准:中文、带点或连字符的用户名都能 @ 到;被 @ 的人不再受「一条评论最多 5 人」的旧限制(站长可在后台调整,默认 10 人)。

    【新增】

    1. 关注名册批量管理:在「我的关注」里勾选多个人,一次把他们移动到某个分组,或者批量取消关注;只对你自己的关注关系生效。
    2. 评论 @ 提及可点击:评论里被 @ 的用户名会变成链接,点一下直接进入他的个人主页。
    3. 评论可以回复评论:支持一层回复(回复的回复会归到同一条评论下,不会越套越深),被回复的人会收到提醒。
    4. 动态流「加载更多」:不想翻页的话,点一下直接在当前页面追加下一页动态,每页的加载开销和第一页一样。
    5. 屏蔽范围可视化体现在各处:被屏蔽者不出现在你的名册推荐、动态总数、未读提示与评论列表里,解除屏蔽后一切恢复如常。

    【升级说明】

    • 老版本直接覆盖升级即可,评论表会自动补一个新字段,数据不丢。
    • 新增站点配置:评论 @ 提及人数上限(后台 → 关注与动态 → 评论 @ 提及上限)。
    • 本次更新不改变已有开关的默认值:点赞、评论、观察摘要、版块订阅的默认状态与 3.0.0 一致。
    #17
  • cxk123

    版本 5.0.0 更新:
    【5.0.0 大更新】从「看动态」到「能聊」:私信、好友、关键词订阅、@我的

    一、新增:一对一私信
    · 会话列表页:谁跟你聊过、最后一句是什么、几条未读,一眼看完;顶部栏与侧栏给出「私信」入口与未读徽标。
    · 会话页:像聊天一样一问一答,消息按时间排开、自己的消息靠右显示;打开会话即自动标记已读。
    · 站内通知:有人给你发私信会收到提醒(可在设置里关闭),同一个人 5 分钟内只提醒一次,不会刷屏。
    · 屏蔽双向禁止:你或对方任一方在屏蔽名单里,双方都发不出私信,会话页会直接说明原因,也不出现在会话列表里。
    · 内容与频率限制(后台可调):单条字数上限(默认 500 字)、两次发送最小间隔(默认 5 秒)、24 小时发送上限(默认 200 条)。

    二、新增:好友(互关)
    · 互相关注即好友:名册新增「好友」页签,个人主页同样有「好友」页签,只看真正互相关注的人。
    · 「全部」动态里好友内容优先:同一条查询里排序,好友发的排在最前,条目上带「好友」角标——不多查一次库。
    · 名册卡片新增「私信」入口,从名册直接开聊。

    三、新增:关键词订阅
    · 订阅你关心的词(最多 10 个,后台可调):标题或正文里出现该词的新主题会自动进入你的动态流,条目带「关键词订阅」角标。
    · 动态流新增「关键词订阅」筛选,可以只看这些内容。
    · 与关注、订阅版块两个来源自动去重:同一条内容只出现一次,不会重复刷屏。
    · 被屏蔽的人命中关键词也不会进入你的动态流。

    四、新增:「@我的」页签
    · 评论里有人 @ 你,都会汇总到这里:谁、在哪篇、说了什么、什么时间,一键跳去查看动态或原帖。
    · 只认真实提及:@admin2、@admin_小号 这类「名字更长的别人」不会被算成 @ 你(总数与实际条目完全一致)。
    · 被屏蔽者的提及不再出现。

    五、修掉的 BUG 与边界
    · 修:@我的页签总数虚高——用 LIKE 粗筛会把 @名字+后缀 一起算进来,出现「有第 2 页但点进去是空的」;改为一条 SQL 取回候选后按同一套 @ 规则精确过滤,总数就是实际能看到的条数。
    · 修:会话列表与「会话总数」谓词不一致的风险——两处屏蔽条件统一写在 SQL 里(pair_low/pair_high 整数列),分页与实际条目永远一致。
    · 修:后台新增配置项后,旧版表单保存不再报错(没提交的数值项沿用当前值),老站点升级不会因表单字段缺失而保存失败。
    · 加固:私信的发送、会话页、会话列表三条路径都过同一套双向屏蔽判定;关键词订阅与 @ 提及同样过屏蔽与去重。

    六、性能与兼容
    · 新增功能不增加页面请求的数据库往返:版块订阅与关键词订阅的「来源」合并成一次查询;会话列表、会话页、@我的都是整页批查,渲染循环内零查询(hook_loop_audit 页面路径 0 处、indirect_n1_audit 0 处)。
    · 数据库自动升级:新表 plugin_user_follow_messages(含 (pair_key,id)、(recipient_id,is_read) 索引)与 plugin_user_follow_keywords,设置表补 notify_message 列,老库启用即自动补齐,可重复执行。
    · 已购买用户更新免费;不删任何旧数据,关注关系、分组、特别关注、点赞、评论、屏蔽名单原样保留。

    #18
  • cxk123

    版本 6.0.0 更新:
    【6.0.0】一个入口看全部消息:消息中心 + 私信引用/归档/免打扰 + 收藏(稍后读)+ 关注数据导出

    一、新增

    1. 消息中心(新页面,顶栏「消息」入口 + 徽标)
    • 一个页面汇总四类未读:私信、@我的、关注与版块提醒、关键词新主题,可一键「全部标为已读」。
    • 四类计数由一条聚合查询算出,打开本页不会有逐条查询;顶栏徽标仍是一次 AJAX 落值,列表页零查询。
    • 归档会话里的未读不会隐瞒:徽标照数,卡片写明「其中 N 条在已归档会话里」并直达「已归档」。
    1. 私信增强
    • 引用回复:会话页每条消息可「引用」,回复里显示引用摘要;跨会话引用会被忽略(不会串到别的会话)。
    • 会话归档:默认列表不含已归档,可切「已归档」查看、随时取消归档;归档只影响自己,不影响对方。
    • 免打扰时段:后台配置起止时间(HH:MM,留空或起止相同即关闭,支持 22:00–07:00 这种跨零点),

    时段内不发即时通知,但消息照常落库、事件留在队列里不丢;关闭时零开销(连用户开关都不读)。

    1. 收藏(稍后读)
    • 动态条目右侧「收藏」按钮(AJAX,即时变文案),名册页签栏新增「收藏」页,整页列表可分页、可取消。
    • 支持收藏主题与回帖(topic:123 / reply:456 同一套目标键);内容被删除的收藏会自动从列表消失,

    因此「总数」永远等于列表里真正能打开的条目数。

    • 后台可整体关闭该功能(关闭后按钮与页签一并隐藏)。
    1. 关注数据导出(设置页)
    • 三个按钮导出「我关注的人 / 关注我的人 / 好友」CSV:UTF-8 BOM,Excel 直接打开不乱码。
    • 接口只接受 POST、类型白名单、导出对象恒为当前登录用户——不存在「换个 uid 导别人名册」的入口。
    • 整份名册一次取回后逐行写出,不随导出行数增加查询。

    二、修复

    • 关键词订阅的通配符注入:订阅 a_b 会命中 axb,订阅 100% 几乎命中全站主题(_ / % 在 LIKE 里是通配符)。

    现在关键词里的 ! % _ 一律按字面匹配(用三驱动通用的 ESCAPE '!',反斜杠在 MySQL/SQLite 上不可移植)。

    真正的提及被挤出去。现在前筛同样走字面转义。

    • 关键词筛选页总数错位:出现「总数 0 但有条目」「加载更多/分页消失」。根因是总数 SQL 里分组计数排最后、

    参数却拼在最前(占位符整体错位一格),全部分组时参数恰好都等于本人 id 而被掩盖;现已按 SQL 文本顺序对齐。

    • 名册人数比实际行数大:被删号用户留下的关系行仍被计数,最后一页点进去是空的。总数与计数现在都

    与名册行同源(JOIN app_users)。

    • 内容删除后队列里的待发通知照发,点进去 404。删除钩子现在按主题/回帖作废队列事件,并顺手清掉该目标的收藏。
    • 导出 CSV 的公式注入(CWE-1236):别人写在简介里的 =HYPERLINK("http://…","点我") 会被 Excel/Sheets

    当公式执行(执行发生在打开文件的其他人电脑上)。现在以 = + - @ 制表符 回车 开头的字段统一加单引号中和,
    再做标准 CSV 转义。

    • 归档会话的未读对不上(本轮自查发现):归档一段有未读的会话后,徽标还数它、默认列表却看不到。

    现在未读按归档拆分,徽标与列表口径一致,并给出直达「已归档」的入口。

    三、性能

    • 动态流 12~13 条、关注/粉丝名册 7~8 条:与 5.0.0 完全一致(收藏状态与点赞状态合并进同一条 UNION ALL)。
    • 消息中心:1 条聚合 + 2 条请求内缓存支撑,满未读与全已读两种数据量下查询量相同。
    • 收藏页 6 条且与行数无关(2 行与 50 行实测查询量相同);导出 1~2 条。
    • 会话列表 4 → 5、会话页 5~7 → 6~8(多的是「未读按归档拆分」与归档点查),套件对该两页仍有上限断言。
    • 页面请求路径上没有任何循环体内的数据库调用(静态审计:0 处);间接 N+1 审计:0 处。

    四、已知行为(请先读这三条)

    1. 私信上限是滚动 24 小时,不是按自然日重置;后台标签本次也统一写成「私信 24 小时上限」。超长内容按 5.0.0 起的既有语义截断而不是报错。
    2. 收藏页为保证「总数 = 能打开的条目数」,会把整张个人收藏表一次取回后在内存里剔除失效项再分页;

    单用户几百条量级最省往返,超大个人列表会多占一次查询的内存。

    1. 免打扰时段内不发的只是即时通知:消息照常落库、事件留在队列里,时段结束后计划任务照常补发;归档只影响自己视角。

    五、升级说明

    • 原地升级,无需卸载重装;老库第一次读写时自动建表/补列/补索引,重复安装幂等(12 张表 / 12 个索引)。
    • 新增两张表:plugin_user_follow_bookmarks(收藏,(user_id,target) 唯一)、plugin_user_follow_conv_state(会话归档状态)。
    • 新增四列:messages.reply_to_id(引用)、settings.notify_dnd(免打扰开关)、settings.hub_keyword_at(消息中心关键词水印)等。
    • 新增两项后台配置 dnd_start / dnd_end(HH:MM)与一个开关 bookmark_enabled。
    • 未开收藏、未配免打扰时,行为与 5.0.0 完全一致。
    #19
  • cxk123

    版本 7.0.0 更新:
    【7.0.0】群聊来了:多人会话 + 动态「推荐」排序 + 关系网络(二度人脉)+ 通知聚合与静音 + 作者洞察

    一、新增

    1. 群聊(多人会话)
    • 可建群、拉人;群主可改名、移出成员、解散;成员可自行退群。
    • 群列表显示每个群的未读数,打开群即整段已读(用「未读水位」实现,不产生逐条已读的写放大)。
    • 群未读并入「消息中心」卡片与顶栏徽标,口径与私信一致。
    • 被屏蔽者拉不进群,也不会与你同群;同群成员若之后互相屏蔽,双方视角里该成员的消息与头像互相隐藏,

    但历史消息不删除(对方视角仍可见)——屏蔽不销毁已经发生的对话。

    • 发言受与私信相同的一套节流约束(最小间隔 / 24 小时上限),后台可配人数上限、群数上限、每页条数。
    1. 动态流「推荐」排序
    • 筛选条多出「最新 / 推荐」切换:推荐序把互动多、关系近、命中订阅关键词的动态排在前面。
    • 打分口径(可在后台调窗口):热度 = 赞×2 + 评论×3;亲密度 = 好友 +4 / 特别关注 +3;

    标题命中订阅词 +5(单条上限 +10)。热度来自一条 GROUP BY 聚合,切序只多固定 1 条查询。

    • 总数与「最新」同源,不会出现「推荐序有 0 条但总数不为 0」这类分页错位。
    1. 关系网络(二度人脉)
    • 列出「我关注的人所关注、而我还没关注」的人,并给出「你和 TA 都关注了 X」与共同关注人数。
    • 可一键关注,也可忽略(忽略只写本人视角,不动任何关注关系、不通知对方,之后不再出现)。
    • 整页 2 条批查,渲染零查询;人数上限可在后台调。
    1. 通知聚合与按类型静音
    • 新页「通知聚合」把通知按类型 / 主题 / 用户三个维度折叠成可展开分组。
    • 四类通知(关注的新主题 / 关注的人回帖 / @提及 / 互动与评论提及)可一键静音;

    静音在发送侧生效(不再产生该类新通知),消息中心徽标同步排除该类型。

    • 静音不等于删除:已有通知保留在通知列表里,随便取消静音即可恢复。
    1. 作者洞察(只读面板)
    • 近 N 天(默认 30 天,7–90 可调)最热主题 Top N:赞 / 评论 / 收藏 / 热度四项并排。
    • 互动最多的用户 Top N,以及窗口内被收藏总数。
    • 窗口起点按站点时区的当天零点回溯(不是 UTC),因此「今天」的统计与站点日历一致。
    • 只有本人进自己的主页能看到这个面板,他人主页的页签白名单里没有它。

    二、修复(本轮实测复现的真实缺陷)

    1. 在别人的关注名册上加 ?group=N 会被静默过滤(列表条数变少、总数与列表对不上,极端时整页空白)。

    根因:分组是「本人视角」的数据,但页面只校验了访问者是否拥有该分组,随后把它当成主人的分组条件传进去。
    修法:分组过滤只在本人视角生效,他人名册一律按「全部分组」处理。

    1. 切到「订阅版块」筛选时,顶部「你关注的用户有 N 条新动态」数错了来源(列表可以是空的,横幅照样报 N 条);

    「全部」口径又漏掉了版块来源。修法:为版块筛选单独计数,谓词与列表取数逐字同源;「全部」改为四段之和。

    1. 名册里点「★」设为特别关注后再也取消不掉(第二次点击星标仍是实心、文案停在「已特别关注」)。

    根因:切换状态读的是只读请求内缓存,而这条 AJAX 请求从未预载该缓存,于是「当前状态」恒为否、永远写入 1。
    修法:缓存里确实没有该 id 时补一次点查取真实值(AJAX 端点单次小查询,不在任何渲染循环里)。

    1. 删除的主题,其队列事件仍会被计划任务消费,收件人收到「发布了新主题」点进去是 404。

    根因:队列作废只写在删除钩子里,历史遗留 / 直接删库的数据没有兜底。
    修法:每日清理任务把指向已不存在主题、回帖的队列事件一并作废(话题位为 0 的外部事件与提及事件不参与判定),
    并顺手清理群聊孤儿与新增表的孤儿行。

    三、性能

    • 既有页面(首页 / 动态流 / 关注 / 粉丝 / 好友 / 动态详情)查询量与 6.0.0 逐条不变,套件上限断言原样保留。
    • 新增页面都是固定条数、与数据量无关:群列表 ≤12、群会话 ≤16、关系网络 ≤12、通知聚合 ≤14、作者洞察 ≤12。
    • 建群时拉人、加群成员、静音判定等所有「先查再写」的路径都改成了整批取回 + 内存判定,页面请求路径上没有循环体内查库

    (静态门禁 hook_loop_audit / indirect_n1_audit 均 0 处)。

    四、已知行为(请先读这三条)

    1. 推荐序是有界打分:只在最近 hot_window(默认 120 条,后台可调)候选里排序再分页。这样切序只多固定 1 条聚合;

    代价是更早的动态不会因为互动高被顶上来。要更长的记忆把窗口调大即可。

    1. 群未读用「水位」而不是逐条已读:未读 = id 大于水位且不是自己发的;打开群或一键已读只推水位(1 条 UPDATE)。

    代价是「只读了中间某几条」这种状态无法表达(产品上不需要)。

    1. 通知聚合页的分组明细有上限(默认 200 条,后台可调),但分组计数走的是全量 SQL,所以数字不会因截断而失真;

    更早的通知仍可在核心「我的通知」页翻到。

    五、升级说明

    • 原地升级,无需卸载重装;老库第一次读写时自动补表 / 建列 / 建索引,重复安装幂等。
    • 新增四张表:群组、群成员、群消息、关系网络忽略表,各带一枚索引(共 16 表 / 16 索引)。
    • 新增四个用户级静音开关列(关注的新主题 / 关注的人回帖 / @提及 / 互动与评论提及),默认全不静音。
    • 未建群、未用推荐序、未静音时,行为与 6.0.0 完全一致。
    #20
  • 123456789

    6🥳

    #21
  • 8

    怎么获取授权码🤔

    #22
  • cxk123

    版本 8.0.0 更新:
    【8.0.0】把匿名写进动态流:跨插件匿名联动 + 私信撤回 + 群公告(先修 3 处会泄露匿名身份的缺陷)

    一、新增

    1. 跨插件匿名联动(与「匿名区 · 树洞」插件配合)
    • 动态流、动态详情、收藏页都会把整页内容交给匿名区插件做身份遮蔽:匿名主题与匿名回复在这三处

    也显示成「匿名 #N」,不再露出真实昵称、真实头像与个人主页链接。

    • 未安装匿名区插件时完全是恒等操作(Hook 无人注册、原样返回),零查询零开销。
    • 「最后回复人」同样是保守遮蔽:只要 TA 在这篇主题里以匿名身份出现过,就不会显示真名。
    1. 私信撤回
    • 自己发出的私信可在 2 分钟内撤回(后台可调 30–3600 秒);撤回后双方看到「这条私信已撤回」占位,原文不再显示。
    • 撤回会一并抹掉通知里的正文摘录(原先通知带着 60 字预览,撤回后还能在通知列表里读到 = 撤回没生效)。
    • 引用过这条私信的消息显示「(原消息已撤回)」;撤回的私信不再计入未读(会话页、会话列表、消息中心徽标三处同源)。
    • 只能撤回自己的、且未超时的私信;重复撤回、撤回他人、超时都有明确提示。
    1. 群公告
    • 群主可在群会话页顶部发布一条公告(最多 200 字),成员进群即可看到,可随时清除或改写。
    • 只有群主能设置;非群主提交会被拒绝,且不会覆盖已有公告。

    二、修复(本轮实测复现的 3 处真实缺陷,均为「匿名身份泄露」)

    1. 动态流泄露匿名作者:关注的人以匿名身份发帖时,动态流里仍然显示其真实昵称、真实头像与主页链接

    (实测行内出现 a=user&id=3 与真人头像种子)——匿名区插件只覆盖了核心渲染管线,而动态流是本插件自己取数、自己拼行 HTML。
    修法:渲染前调用匿名区插件的 anon_board.mask_rows 批量遮蔽接口(整页一次调用)。

    1. 动态详情页泄露:?a=user_follow_item&target=topic:… 的头部作者卡直接读用户表,匿名主题在这里同样显示真人。

    修法:把作者拼成一行交给同一接口遮蔽,并在命中匿名时断开主页链接。

    1. 收藏页泄露:收藏了匿名主题后,收藏列表里显示的是真实作者。

    修法:收藏页的主题行与回帖作者同样走批量遮蔽。

    三、附带修掉的两处自测缺陷(写在这里供复盘)

    • 撤回状态列没有取回:会话消息查询没 SELECT recalled_at,数据库里已写入撤回时间、页面却读不到 ——

    「撤回」看起来完全没生效(占位不出现、原文照旧)。已补列,并给会话列表预览、未读口径同步加上撤回判断。

    • 撤回通知清洗的 LIKE 没有 ESCAPE:正文里含 % _ 时可能匹配不到或误伤,已改用统一的

    LIKE ? ESCAPE '!' 片段(与插件其它 LIKE 同源)。

    四、性能

    • 动态流 / 收藏页 / 动态详情在装了匿名区插件且站内存在匿名内容时,各多 1~2 条整页批查

    (主题匿名标记 + 匿名身份映射;本页没有匿名内容时只多 1 条,命中时才多第 2 条);
    未装该插件或站内没有匿名内容时零额外查询。

    • 逐行渲染路径仍然零查询:遮蔽在整页数据钩子里一次完成,行循环里只读内存映射。

    五、升级说明

    • 原地升级:自动补两列(私信 recalled_at、群 notice / notice_at),不加表、不改索引,重复安装幂等。
    • 撤回时限、群公告都不影响既有数据;不装匿名区插件时本插件行为与 7.0.0 完全一致。
    #23
  • webmaster

    有趣

    #24
  • cxk123

    版本 9.0.0 更新:

    9.0.0 大版本更新:关注备注 + 暂停关注 + 关注体检

    本次照旧「先修 BUG,再补能力」:修掉 4 处真实缺陷(3 处是隐私 / 打扰口径问题),再补 3 项能力。

    一、修掉的 4 处缺陷(都可复现、都留了回归断言)

    1. 私密群聊的群名对群外泄露

    现象:非成员带上 ?gid=N 打开群聊页,拒绝文案里带着群名;而 gid 是可枚举的连续整数,任何人遍历一遍就能把全站私密群的名字收走。
    修法:不再回显群名;「群不存在 / 已解散」与「你不是成员」也统一成同一句文案,光凭文案差异也判断不出某个群是否存在过。

    1. 免打扰时段挡得住私信、挡不住互动提醒

    现象:夜里免打扰时段,私信通知安静了,但点赞 / 评论 / 回复你的评论这三类即时提醒照响——同一句「即时通知」两套口径。
    修法:时段内不再即时打扰,但也不丢——写进一条退避事件,时段结束后由既有的通知计划任务补发;补发前会重新校验屏蔽 / 静音 / 暂停关注(时段里改过设置就不发)。

    1. 忽略过的推荐找不回来

    现象:在关系网络里点过「忽略」的人从推荐列表消失后再无入口——取消忽略的接口虽然存在,但页面没有任何地方能触发它,被忽略的人在你自己这里等于永久消失。
    修法:关系网络页新增「已忽略 N 人(点开可恢复)」面板,一键恢复即重新参与推荐;面板是原生 POST + CSRF 表单,不用 JS 也能用。

    1. 所有互动提醒都写成「回复了你的回帖」

    现象:哪怕是主题被点赞 / 评论,通知里也写「你在《…》里的回帖」。
    根因:把字符串 kind 转成整数再比 —— (int)'topic' === 'topic' 恒为假('topic' 与 'reply' 转 int 都是 0),三元表达式永远走「回帖」分支。
    修法:按字符串比较;主题写「主题」,回帖写「回帖」,两条断言双向锁住。

    二、三项新能力

    • 关注备注:给任意关注对象写一句只自己可见的备注(≤40 字,例如「线下活动认识的摄影师」),名册与关注卡片上直接显示备注徽标,随时可改可清;名册顶部新增搜索框,一条 LIKE(带 ESCAPE,通配符按字面处理)同时匹配昵称与备注——关注上百人之后,终于能靠「我为什么关注 TA」把人找回来。备注落在关系表新列上,不新建表。
    • 暂停关注:对某个人「暂停 7 天」——暂停期间 TA 的内容不进动态流、不产生任何关注类通知、周报也不再提;名册上标记「暂停中(剩 N 天)」,一键恢复。到期自动恢复,不需要任何计划任务(判定在 SQL 里和时间列比较)。与取关、屏蔽的区别:取关会断关系、屏蔽会互相看不见,暂停只是「这段时间先不看」。
    • 关注体检:本人关注名册顶部一排六格——关注 / 互关 / 特别关注 / 暂停中 / 已备注 / 沉默关注(关注后从未互动、且 30 天没发帖),配合名册既有的批量取关,一眼就能清理掉「当年顺手关注、后来再没交集」的人。只在本人首页出现,搜索态与第 2 页都不渲染。

    三、验证

    • 六道静态门禁全绿(php -l / 循环内查库审计 / 间接 N+1 审计 / 插件规范审计 / 缺陷类别审计 / 未定义调用审计)。
    • 新增 tools/lab_verify_v900.sh:93 项断言全部通过,修复类断言都写成「9.0.0 之前是错的、之后是对的」;覆盖隐私(群名不外泄、不区分群存在性)、打扰口径(时段内不打扰但补发、补发前重校验)、可逆性(忽略可恢复、暂停可恢复、备注可改可清)、查询预算(暂停判定挂在既有查询里,动态流查询数不变)与一个新增守卫:插件未被核心因运行时错误自动停用(本轮真踩到:新增函数声明 : bool 却返回了 null,核心随即停用整个插件,页面全 404)。
    • 既有 10 套 user_follow 验收套件(v1.1–v8.0)全部复跑通过(版本号 / 查询预算断言随之更新)。
    • 顺手修掉实验室工具链一处真缺陷:tools/lab_sync.sh 的停用 / 启用两个动作共用同一个 CSRF,核心每次写操作都会轮换令牌 → 第二个请求必然失败,于是「同步一次就把插件停用」,后续所有页面断言都变成 404。现在每个动作各读一次令牌,并在同步后核对启用状态。
    #25
  • cxk123

    版本 9.0.1 更新:

    9.0.1 小版本:为「悬赏问答」转发采纳事件(跨插件联动)

    • 新增一行 Hook 映射 qa_bounty.after_accept => user_follow_external_publish:提问者采纳答案后,关注你的人会在站内通知里看到这条动态(与「发布了新活动」同一条队列消费链路,页面请求依旧零额外查询)。
    • 外部事件 payload 增加三个可选字段 text / topic_id / reply_id:投递方自带措辞与归属,通知文案与「点进去看什么」由投递方决定。
    • 兼容性:三个字段都不带时(例如活动报名插件的投递),措辞、归属与查询量与 9.0.0 逐字节一致——lab_verify_event 46/0、lab_verify_event_v2 57/0 复跑确认。
    • 六道静态门禁全绿;lab_verify_v900.sh 93/0;全量回归 36 套件 3771 项通过 / 0 失败。
    #26
  • cxk123

    版本 9.0.2 更新:
    9.0.2 修复:关注数据导出的 CSV 在真实浏览器里下不下来 + 后台设置的错误提示

    • ①「关注数据导出」三个按钮响应是 CSV 附件(Content-Disposition: attachment),而核心前端把它们拦成 fetch + JSON.parse → 只弹「操作失败」、文件根本不下载。修法:给导出表单补 data-no-ajax="1"(原生提交),服务端零改动。
    • ②后台「保存设置」校验失败时 fall through 成整页 HTML → 用户只看到「操作失败」;改为 AJAX 请求回 {"ok":0,"message":…} 信封(无 JS 路径字节不变)。
    #27
  • cxk123

    版本 9.0.3 更新:
    9.0.3 小更新

    · 为「举报与处置中心」(新插件)开放外部事件通道:举报处置完成后投递的 report_center.after_dispose 事件,
    由本插件转成一条关注者动态通知 —— 只加一行 Hook 映射、复用既有回调,不新增函数。
    · 投递方自带措辞与主题归属,因此通知文案与「发布了新动态」不会串味;不投递时(例如活动报名)行为与上一版逐字节一致。
    · 本版不含其它功能或行为变更;动态流、通知、搜索、权限与查询预算口径全部不变。

    #28
  • cxk123

    版本 10.0.0 更新:
    10.0.0

    • 新能力:主题追更。主题页主楼的操作区多了「追更」按钮——追更某一个主题之后,它每有新回复都会给你发一条站内提醒(同一主题 24 小时内只提醒一次);新增「追更」页签,列出你追更的主题与「还没看过的回复有几条」,可以单个或一键标为已读,翻到最新一页也会自动标记已读。追更上限后台可调。
    • 新能力:动态流过滤词(我的静音词)。在「关键词」页签里设几个不想看到的词,标题或正文命中的主题与回帖就不会再进你自己的动态流,也不会被算进「你关注的人有 N 条新动态」;只影响你自己,不动关注关系,别人看到的动态照旧。词里的 % 与 _ 按字面匹配,不是通配符。
    • 新能力:私信收件规则(防骚扰)。「关注设置」里可以选择谁能给你发私信:所有人都可以 / 只有我关注的人 / 只有互相关注的人;站点还可以设一个默认值。被规则挡住的人仍然能查看你们的历史会话,屏蔽关系依旧优先。
    • 修复:动态详情页与点赞 / 评论 / 收藏绕过了版块的可见性设置——把版块设成「仅某用户组可见」后,核心主题页会拒绝访问,但动态详情页仍能按主题编号枚举出标题与正文摘要。现在两处判定完全一致。
    • 修复:动态流(主题 / 回帖 / 订阅版块 / 关键词四个来源)与「新动态」条数同样会混入无权查看的版块内容,现已与核心同源过滤,且不改变 SQL 结构、不增加查询次数。
    • 修复:查看他人名册时用 ?q= 搜索,会匹配到对方「只自己可见」的关注备注——等于能把别人的私有备注一个字一个字试出来。现在备注只对本人参与搜索,他人视角只搜昵称。
    • 修复:免打扰时段内收到的私信不再被「吞掉提醒」。原先时段内直接不产生通知(时段结束后也没有),现在改为排队,时段结束后自动补发一条,与互动提醒的处理方式一致。
    • 其它:补上这个插件此前缺失的 README 与统一验收入口(tools/lab_verify_user_follow.sh,按版本顺序跑全部历史套件)。
    #29
  • cxk123

    版本 10.1.0 更新:
    10.1.0

    • 修复:动态详情页的评论以前只能看到前 50 条,第 51 条起会静默消失。现在评论分页显示(每页条数后台可配,默认 20),页面上给出「共 N 条 · 第 x/y 页」与分页条;发表评论后回到第 1 页,删除后回到原来的那一页。
    • 修复:同一条事件被两个并发的计划任务同时取到时,收件人会收到两条一模一样的通知。现在队列改为「先领取再处理」,抢不到的事件直接跳过;并且整批消费放在一个事务里——通知写入与出队要么一起成功、要么一起回滚,中断重跑也不会重复投递。
    • 修复:并发打开同一个主题时,已读水位可能被「读到旧时间的那个请求」推回去,已经看过的回复会重新变成「新」。现在水位只允许向前推进(自动已读、单个标已读、全部标已读三处都做了单调写)。
    • 修复:订阅版块的提醒在 10.1.0 开发过程中曾一度完全不发(消费循环改成闭包时漏传了两个变量),已修复并留了回归断言。
    • 新能力:过滤词支持批量导入 / 导出 / 清空。一次粘贴多行(也支持逗号、顿号、空格分隔)即可批量加入,重复的、超过 20 字的、超出上限的会自动跳过并告诉你有几个;导出的是一行一个词的纯文本,可以直接再粘回导入框;一键清空带确认。
    • 新能力:关注分组支持排序。设置页里每个分组带 ↑ / ↓ 按钮,名册页签、动态流的分组筛选与设置页列表三处顺序会一起变化。
    • 性能核对:追更只给主题页增加 1 条查询;个人主页与动态流在「过滤词 / 追更 / 私信收件规则」全开与全关时查询数完全相同;动态详情页因评论总数多 1 条计数查询(总数与列表同源)。
    #30
  • cxk123

    版本 10.2.0 更新:
    10.2.0

    • 修复(并发安全 · 真缺陷):私信最小间隔、私信 24 小时上限、追更主题数上限、关注人数上限这四个限制,原先都是「先查再写」(先 SELECT COUNT / MAX,再 INSERT)。两个并发请求会同时读到同一份旧值、双双通过判定 —— 于是「两次发送至少间隔 N 秒」在并发下等于不存在,上限也会被冲过去(实验室里用外部写锁把两个请求对齐在写入之前复现:间隔设 300 秒仍落下 2 条私信;关注上限设 3 人、连打 6 个不同目标,最终落到 7 人)。现在判定与写入合进同一个写事务,并发下四个限制都真实生效,失败路径才多一次诊断读用于给准确提示语;页面正常路径的往返数一条不增。
    • 修复(计数口径 · 真缺陷):关注分组的页签人数与点进去的名册条数会漂移。对方被删号后,关注关系会先留成孤儿行(等每日清理任务才消失),而分组计数把孤儿算了进去,名册明细却没有 —— 页签写「技术圈 3」点进去只有 2 行,「未分组 0」而 ?group=0 却有 1 行。现在分组计数与名册明细共用同一套「两端用户都存在」的判定,两处口径逐字一致。
    • 修复(静默截断 · 真缺陷):关系网络的「已忽略」名单硬编码 LIMIT 50,而标题里的数字取的是本页行数 —— 忽略超过 50 人时标题把 60 说成 50,且第 51 位之后在界面上再也无法恢复。现在总数用同一条语句里的标量子查询取真值,面板自带翻页(ignored_p,不与推荐列表的 p 冲突),全部条目都可达;往返数不变。
    • 质量:验收套件(聚合入口)1627 项通过 / 0 失败;七道静态门禁 0 违规 / 0 条待人工确认;页面查询预算与 10.1.0 在首页 / 动态流 / 关注名册 / 动态详情 / 后台 tab / 关系网络六个页面上逐条相同(A/B 差 0)。
    • 说明:预览图沿用同一功能族的既有 5 张真实截图(评论分页 / 过滤词批量导入导出 / 分组排序 / 排序后的名册顺序 / 我的追更页签),本轮未重新上传,避免占用站点的附件配额;10.2.0 的三处修复都在写路径与计数口径上,界面未新增区块(「已忽略」面板新增的是翻页入口)。
    #31
  • cxk123

    版本 10.3.0 更新:
    10.3.0 · 覆盖文件升级自愈 + 通知写路径的版块可见性

    • 修复(越权 · ACL 缺陷类第 9 款):动态流(读路径)早有版块可见性过滤,但通知消费(写路径)一处都没有 —— 受限版块里的主题标题会随「关注者新主题 / 回帖 / 追更 / 版块订阅 / 跨插件事件(悬赏采纳、活动发布)」五条路径发给无权查看的人;关注摘要更成批带回标题,且摘要里的条数计数本身也是一条旁路信道。现在收口在消费侧一处判定(口径 = 跳过不发,与读路径「整行隐藏」一致),并覆盖摘要在内的标题与计数两条 SQL。
    • 修复(升级路径):覆盖插件文件(不经 install)时,缺表缺列会让读写路径抛异常并导致整插件被自动停用。现在八个入口在三道门(内存副本 → 设置标记 → 才真正 DDL)之后幂等补齐,稳态零查询;读钩子刻意不挂,首页预算口径不变。
    • 口径:站内没有受限版块时 SQL 文本逐字节不变、通知文案逐字节不变;通知与摘要的语句数增量 0(判定全部吃已取回的行与核心内存版块表)。
    • 内部(不影响功能):卸载清理里的结构版本标记删除语句改为占位符参数化写法(行为逐字节等价,只为满足仓库「自写 SQL 一律带占位符」的静态契约)。
    #32

发表回复

登录后回复