[user_follow]关注与动态热
- 关注与动态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插件预览5 张开发日志最新 10 条
此项目接受所有登录用户协助维护和提交更新。
主楼点赞与点评18投币1个表示赞同6天前
插件质量报告
插件:
user_followHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 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字段 类型 可空 默认值 约束 id id 否 - 主键、自增 follower_id uint 否 - 唯一 followee_id uint 否 - 唯一 is_star INTEGER 否 0 - created_at uint 否 - - plugin_user_follow_groups字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 name key 否 - 唯一 sort uint 否 0 - created_at uint 否 - - plugin_user_follow_settings字段 类型 可空 默认值 约束 user_id uint 否 - 主键 notify_topic INTEGER 否 1 - notify_reply INTEGER 否 0 - hide_following INTEGER 否 0 - hide_followers INTEGER 否 0 - feed_seen_at uint 否 0 - updated_at uint 否 0 - plugin_user_follow_queue字段 类型 可空 默认值 约束 id id 否 - 主键、自增 queue_key key 否 - 唯一 kind key 否 - - sender_id uint 否 - - topic_id uint 否 0 - reply_id uint 否 0 - failure_count INTEGER 否 0 - created_at uint 否 - - plugin_user_follow_likes字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 target key 否 - 唯一 author_id uint 否 0 - created_at uint 否 - - plugin_user_follow_comments字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - target key 否 - - body text 否 - - created_at uint 否 - - plugin_user_follow_forums字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 forum_id uint 否 - 唯一 created_at uint 否 - - plugin_user_follow_blocks字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 blocked_id uint 否 - 唯一 created_at uint 否 - - plugin_user_follow_messages字段 类型 可空 默认值 约束 id id 否 - 主键、自增 pair_key key 否 - - pair_low uint 否 - - pair_high uint 否 - - sender_id uint 否 - - recipient_id uint 否 - - body text 否 - - is_read INTEGER 否 0 - created_at uint 否 - - plugin_user_follow_keywords字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 keyword key 否 - 唯一 created_at uint 否 - - plugin_user_follow_bookmarks字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 target key 否 - 唯一 created_at uint 否 - - plugin_user_follow_conv_state字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 peer_id uint 否 - 唯一 is_archived INTEGER 否 0 - updated_at uint 否 - - plugin_user_follow_chat_groups字段 类型 可空 默认值 约束 id id 否 - 主键、自增 owner_id uint 否 - - name key 否 - - created_at uint 否 - - updated_at uint 否 - - plugin_user_follow_chat_members字段 类型 可空 默认值 约束 id id 否 - 主键、自增 group_id uint 否 - 唯一 user_id uint 否 - 唯一 is_owner INTEGER 否 0 - last_read_id uint 否 0 - joined_at uint 否 - - plugin_user_follow_chat_messages字段 类型 可空 默认值 约束 id id 否 - 主键、自增 group_id uint 否 - - sender_id uint 否 - - body text 否 - - created_at uint 否 - - plugin_user_follow_network_ignores字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 target_id uint 否 - 唯一 created_at uint 否 - - plugin_user_follow_watches字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 topic_id uint 否 - 唯一 last_seen_reply_id uint 否 0 - notify INTEGER 否 1 - created_at uint 否 - - plugin_user_follow_filters字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - 唯一 word key 否 - 唯一 created_at uint 否 - - 版本 1.1.0 更新:
1.1.0- 新增未读动态提示:动态流顶部显示未读条数,新条目带「新」标记,打开后自动记为已读。
- 新增推荐关注:还没有关注任何人时,展示站内最近活跃的成员,可一键关注。
- 互相关注判定更准确:按「被查看的用户与该用户是否互相关注」显示,不再随访问者变化。
- 性能优化:关注数与粉丝数合并为一次查询;本人的关注名册与推荐结果不再重复查库;关注名册每次打开少 2 条查询,粉丝名册与动态流各少 1 条。
- 细节优化:动态流内不再逐行重复显示「已关注」,只标记新动态;关注按钮补全无障碍标签。
版本 1.1.1 更新:
1.1.1- 关注提醒改为后台队列发送:发帖、回帖时不再同步写通知,发帖响应更快,提醒最迟 1 分钟内送达。
- 后台新增「每次处理事件数」与「队列处理间隔」两项设置,可控制提醒节奏并查看队列积压。
- 精简个人主页标签栏,不再重复显示关注数与粉丝数,页面查询更少、加载更快。
- 修复同一批次内多条回帖对同一主题重复提醒的问题。
版本 1.1.2 更新:
1.1.2- 依赖关注的批查全部改为单条直查,不再分块循环查询,列表与主题页在高楼层、大关注量下更稳定。
- 关注/粉丝标签页改为只替换列表区域,页面框架、侧栏与标签栏交回内核渲染,页面更统一、查询更少(他人主页标签页再少 2 条查询)。
- 计划任务发送关注通知的整批读查询由 5 条降到 4 条。
版本 1.1.3 更新:
1.1.3- 未读动态标记改用浏览器本地记录,与站内「浏览过的主题」同一套做法:日常浏览不再读写数据库,未读提示更快。
- 修复首次访问动态页后未读标记不生效的问题,现在第一次打开就会开始记录阅读位置。
- 动态流一次取回主题、回帖与作者资料,并顺带返回总数,正常浏览不再额外查询关注数。
- 关注与粉丝名册按查看视角合并关系查询:查看自己的名册时查询减半,页面打开更快。
- elm2026-09-29
不错,实用的插件!
版本 1.2.0 更新:
1.2.0- 新增「特别关注」:在关注名册里给任意关注对象加星,星标用户排在名册最前,其发布的新主题一律发送提醒(不受站点默认与个人开关限制,适合不想错过的作者)。
- 动态流新增「只看特别关注」筛选,可与主题/回帖筛选叠加;星标作者的条目带星标角标,一眼看出重点动态。
- 新增两处发现入口:顶部栏「动态」按钮与首页侧栏「我的关注」快捷入口,两处均不产生额外查询。
- 星标状态随名册与动态流一起取回,页面查询次数与上一版完全一致。
版本 1.2.0 更新:
补充插件预览图:动态流与未读提示、只看特别关注、关注名册、个人主页标签页、首页入口、用户设置、后台管理。版本 1.3.0 更新:
1.3.0- 新增「关注分组」:可自建分组把关注对象分类整理,关注名册支持按分组筛选,卡片上直接切换分组。
- 动态流新增分组筛选,可与主题/回帖、只看特别关注自由叠加;分组只对自己可见。
- 删除分组只把成员退回未分组,不会取消关注;每个用户的分组数量可在后台配置。
- 没建过分组的用户不会为分组功能多付任何数据库查询(有无分组复用原有的一次往返判断)。
- 预览图同步更新为 1.3.0 界面。
版本 1.4.0 更新:
1.4.0- 与「活动报名」插件联动:你关注的人发布新活动时,同样会收到站内提醒,不再需要自己盯着活动列表。
- 联动通过插件私有 Hook 实现,未安装「活动报名」时自动静默跳过,不产生任何依赖或报错。
- 提醒依旧走关注通知队列,由计划任务统一发送,页面请求的查询次数不变。
- 1234567892026-09-29
性能怎么样😀
版本 2.0.0 更新:
2.0.0 更新
· 动态互动:动态流每条都能点赞与评论,点赞即时生效;评论集中在「动态详情页」,原文、评论列表和输入框在一页里
· 互动提醒:你被点赞、被评论时会收到站内提醒,可以在「关注设置」里逐项关掉
· 发现同好:新增「发现同好」页签,优先推荐与你关注对象也互相关注的人,卡片上直接标出共同关注人数,支持换一批
· 每周关注摘要:按站点周期(默认 7 天)汇总「你关注的人最近发了什么」,没有新内容时不打扰
· 后台新增:点赞/评论总数与 24 小时增量、点赞与评论开关、摘要周期与单轮人数、评论字数上限- zaiwai2026-09-29
这个不错,目前还空白的一个插件。
版本 4.0.0 更新:
关注与动态 4.0.0 更新:修掉一批实际问题,再补五项常用能力【修复】
- 动态流按「关注分组」筛选时,总数统计会算错:分页条、空状态提示与实际看到的条目对不上,现在按分组筛选的结果和翻页数字完全一致。
- 屏蔽名单现在真正全场景生效:被屏蔽的人的主题、回帖、评论,无论从「关注的人」还是「订阅版块」进入,都不会再出现在你的动态流里;他也无法再通过 @你 来打扰你,你对他的点赞/评论提醒同样不会再发。
- 同一条动态下连续发两条带 @ 的评论,不会再漏掉第二条的提醒(以前同一秒内只有第一条能通知到人)。
- 主题或回帖被删除后,它上面的点赞与评论会一起清理干净;历史遗留的无效点赞/评论也会被每天的清理任务回收,后台统计不再虚高。
- 用户设置里「订阅版块有新主题时通知我」以前是个开关但不起作用,现在打开它就能收到订阅版块的更新提醒(关注的人发帖仍走原来的关注提醒,不会重复打扰)。
- 每周关注摘要更稳:即使计划任务中途被打断,也不会在同一个周期里给你发两条摘要。
- 评论 @ 提及更准:中文、带点或连字符的用户名都能 @ 到;被 @ 的人不再受「一条评论最多 5 人」的旧限制(站长可在后台调整,默认 10 人)。
【新增】
- 关注名册批量管理:在「我的关注」里勾选多个人,一次把他们移动到某个分组,或者批量取消关注;只对你自己的关注关系生效。
- 评论 @ 提及可点击:评论里被 @ 的用户名会变成链接,点一下直接进入他的个人主页。
- 评论可以回复评论:支持一层回复(回复的回复会归到同一条评论下,不会越套越深),被回复的人会收到提醒。
- 动态流「加载更多」:不想翻页的话,点一下直接在当前页面追加下一页动态,每页的加载开销和第一页一样。
- 屏蔽范围可视化体现在各处:被屏蔽者不出现在你的名册推荐、动态总数、未读提示与评论列表里,解除屏蔽后一切恢复如常。
【升级说明】
- 老版本直接覆盖升级即可,评论表会自动补一个新字段,数据不丢。
- 新增站点配置:评论 @ 提及人数上限(后台 → 关注与动态 → 评论 @ 提及上限)。
- 本次更新不改变已有开关的默认值:点赞、评论、观察摘要、版块订阅的默认状态与 3.0.0 一致。
版本 4.0.0 更新:
关注与动态 4.0.0 更新:修掉一批实际问题,再补五项常用能力【修复】
- 动态流按「关注分组」筛选时,总数统计会算错:分页条、空状态提示与实际看到的条目对不上,现在按分组筛选的结果和翻页数字完全一致。
- 屏蔽名单现在真正全场景生效:被屏蔽的人的主题、回帖、评论,无论从「关注的人」还是「订阅版块」进入,都不会再出现在你的动态流里;他也无法再通过 @你 来打扰你,你对他的点赞/评论提醒同样不会再发。
- 同一条动态下连续发两条带 @ 的评论,不会再漏掉第二条的提醒(以前同一秒内只有第一条能通知到人)。
- 主题或回帖被删除后,它上面的点赞与评论会一起清理干净;历史遗留的无效点赞/评论也会被每天的清理任务回收,后台统计不再虚高。
- 用户设置里「订阅版块有新主题时通知我」以前是个开关但不起作用,现在打开它就能收到订阅版块的更新提醒(关注的人发帖仍走原来的关注提醒,不会重复打扰)。
- 每周关注摘要更稳:即使计划任务中途被打断,也不会在同一个周期里给你发两条摘要。
- 评论 @ 提及更准:中文、带点或连字符的用户名都能 @ 到;被 @ 的人不再受「一条评论最多 5 人」的旧限制(站长可在后台调整,默认 10 人)。
【新增】
- 关注名册批量管理:在「我的关注」里勾选多个人,一次把他们移动到某个分组,或者批量取消关注;只对你自己的关注关系生效。
- 评论 @ 提及可点击:评论里被 @ 的用户名会变成链接,点一下直接进入他的个人主页。
- 评论可以回复评论:支持一层回复(回复的回复会归到同一条评论下,不会越套越深),被回复的人会收到提醒。
- 动态流「加载更多」:不想翻页的话,点一下直接在当前页面追加下一页动态,每页的加载开销和第一页一样。
- 屏蔽范围可视化体现在各处:被屏蔽者不出现在你的名册推荐、动态总数、未读提示与评论列表里,解除屏蔽后一切恢复如常。
【升级说明】
- 老版本直接覆盖升级即可,评论表会自动补一个新字段,数据不丢。
- 新增站点配置:评论 @ 提及人数上限(后台 → 关注与动态 → 评论 @ 提及上限)。
- 本次更新不改变已有开关的默认值:点赞、评论、观察摘要、版块订阅的默认状态与 3.0.0 一致。
版本 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 列,老库启用即自动补齐,可重复执行。
· 已购买用户更新免费;不删任何旧数据,关注关系、分组、特别关注、点赞、评论、屏蔽名单原样保留。版本 6.0.0 更新:
【6.0.0】一个入口看全部消息:消息中心 + 私信引用/归档/免打扰 + 收藏(稍后读)+ 关注数据导出一、新增
- 消息中心(新页面,顶栏「消息」入口 + 徽标)
- 一个页面汇总四类未读:私信、@我的、关注与版块提醒、关键词新主题,可一键「全部标为已读」。
- 四类计数由一条聚合查询算出,打开本页不会有逐条查询;顶栏徽标仍是一次 AJAX 落值,列表页零查询。
- 归档会话里的未读不会隐瞒:徽标照数,卡片写明「其中 N 条在已归档会话里」并直达「已归档」。
- 私信增强
- 引用回复:会话页每条消息可「引用」,回复里显示引用摘要;跨会话引用会被忽略(不会串到别的会话)。
- 会话归档:默认列表不含已归档,可切「已归档」查看、随时取消归档;归档只影响自己,不影响对方。
- 免打扰时段:后台配置起止时间(HH:MM,留空或起止相同即关闭,支持 22:00–07:00 这种跨零点),
时段内不发即时通知,但消息照常落库、事件留在队列里不丢;关闭时零开销(连用户开关都不读)。
- 收藏(稍后读)
- 动态条目右侧「收藏」按钮(AJAX,即时变文案),名册页签栏新增「收藏」页,整页列表可分页、可取消。
- 支持收藏主题与回帖(
topic:123/reply:456同一套目标键);内容被删除的收藏会自动从列表消失,
因此「总数」永远等于列表里真正能打开的条目数。
- 后台可整体关闭该功能(关闭后按钮与页签一并隐藏)。
- 关注数据导出(设置页)
- 三个按钮导出「我关注的人 / 关注我的人 / 好友」CSV:UTF-8 BOM,Excel 直接打开不乱码。
- 接口只接受 POST、类型白名单、导出对象恒为当前登录用户——不存在「换个 uid 导别人名册」的入口。
- 整份名册一次取回后逐行写出,不随导出行数增加查询。
二、修复
- 关键词订阅的通配符注入:订阅
a_b会命中axb,订阅100%几乎命中全站主题(_/%在 LIKE 里是通配符)。
现在关键词里的
!%_一律按字面匹配(用三驱动通用的ESCAPE '!',反斜杠在 MySQL/SQLite 上不可移植)。- @我的漏掉真正的提及:用户名含
_时,候选前筛的 LIKE 把_当任意单字符,把候选窗口挤满无关评论,
真正的提及被挤出去。现在前筛同样走字面转义。
- 关键词筛选页总数错位:出现「总数 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 处。
四、已知行为(请先读这三条)
- 私信上限是滚动 24 小时,不是按自然日重置;后台标签本次也统一写成「私信 24 小时上限」。超长内容按 5.0.0 起的既有语义截断而不是报错。
- 收藏页为保证「总数 = 能打开的条目数」,会把整张个人收藏表一次取回后在内存里剔除失效项再分页;
单用户几百条量级最省往返,超大个人列表会多占一次查询的内存。
- 免打扰时段内不发的只是即时通知:消息照常落库、事件留在队列里,时段结束后计划任务照常补发;归档只影响自己视角。
五、升级说明
- 原地升级,无需卸载重装;老库第一次读写时自动建表/补列/补索引,重复安装幂等(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 完全一致。
版本 7.0.0 更新:
【7.0.0】群聊来了:多人会话 + 动态「推荐」排序 + 关系网络(二度人脉)+ 通知聚合与静音 + 作者洞察一、新增
- 群聊(多人会话)
- 可建群、拉人;群主可改名、移出成员、解散;成员可自行退群。
- 群列表显示每个群的未读数,打开群即整段已读(用「未读水位」实现,不产生逐条已读的写放大)。
- 群未读并入「消息中心」卡片与顶栏徽标,口径与私信一致。
- 被屏蔽者拉不进群,也不会与你同群;同群成员若之后互相屏蔽,双方视角里该成员的消息与头像互相隐藏,
但历史消息不删除(对方视角仍可见)——屏蔽不销毁已经发生的对话。
- 发言受与私信相同的一套节流约束(最小间隔 / 24 小时上限),后台可配人数上限、群数上限、每页条数。
- 动态流「推荐」排序
- 筛选条多出「最新 / 推荐」切换:推荐序把互动多、关系近、命中订阅关键词的动态排在前面。
- 打分口径(可在后台调窗口):热度 = 赞×2 + 评论×3;亲密度 = 好友 +4 / 特别关注 +3;
标题命中订阅词 +5(单条上限 +10)。热度来自一条
GROUP BY聚合,切序只多固定 1 条查询。- 总数与「最新」同源,不会出现「推荐序有 0 条但总数不为 0」这类分页错位。
- 关系网络(二度人脉)
- 列出「我关注的人所关注、而我还没关注」的人,并给出「你和 TA 都关注了 X」与共同关注人数。
- 可一键关注,也可忽略(忽略只写本人视角,不动任何关注关系、不通知对方,之后不再出现)。
- 整页 2 条批查,渲染零查询;人数上限可在后台调。
- 通知聚合与按类型静音
- 新页「通知聚合」把通知按类型 / 主题 / 用户三个维度折叠成可展开分组。
- 四类通知(关注的新主题 / 关注的人回帖 / @提及 / 互动与评论提及)可一键静音;
静音在发送侧生效(不再产生该类新通知),消息中心徽标同步排除该类型。
- 静音不等于删除:已有通知保留在通知列表里,随便取消静音即可恢复。
- 作者洞察(只读面板)
- 近 N 天(默认 30 天,7–90 可调)最热主题 Top N:赞 / 评论 / 收藏 / 热度四项并排。
- 互动最多的用户 Top N,以及窗口内被收藏总数。
- 窗口起点按站点时区的当天零点回溯(不是 UTC),因此「今天」的统计与站点日历一致。
- 只有本人进自己的主页能看到这个面板,他人主页的页签白名单里没有它。
二、修复(本轮实测复现的真实缺陷)
- 在别人的关注名册上加 ?group=N 会被静默过滤(列表条数变少、总数与列表对不上,极端时整页空白)。
根因:分组是「本人视角」的数据,但页面只校验了访问者是否拥有该分组,随后把它当成主人的分组条件传进去。
修法:分组过滤只在本人视角生效,他人名册一律按「全部分组」处理。- 切到「订阅版块」筛选时,顶部「你关注的用户有 N 条新动态」数错了来源(列表可以是空的,横幅照样报 N 条);
「全部」口径又漏掉了版块来源。修法:为版块筛选单独计数,谓词与列表取数逐字同源;「全部」改为四段之和。
- 名册里点「★」设为特别关注后再也取消不掉(第二次点击星标仍是实心、文案停在「已特别关注」)。
根因:切换状态读的是只读请求内缓存,而这条 AJAX 请求从未预载该缓存,于是「当前状态」恒为否、永远写入 1。
修法:缓存里确实没有该 id 时补一次点查取真实值(AJAX 端点单次小查询,不在任何渲染循环里)。- 删除的主题,其队列事件仍会被计划任务消费,收件人收到「发布了新主题」点进去是 404。
根因:队列作废只写在删除钩子里,历史遗留 / 直接删库的数据没有兜底。
修法:每日清理任务把指向已不存在主题、回帖的队列事件一并作废(话题位为 0 的外部事件与提及事件不参与判定),
并顺手清理群聊孤儿与新增表的孤儿行。三、性能
- 既有页面(首页 / 动态流 / 关注 / 粉丝 / 好友 / 动态详情)查询量与 6.0.0 逐条不变,套件上限断言原样保留。
- 新增页面都是固定条数、与数据量无关:群列表 ≤12、群会话 ≤16、关系网络 ≤12、通知聚合 ≤14、作者洞察 ≤12。
- 建群时拉人、加群成员、静音判定等所有「先查再写」的路径都改成了整批取回 + 内存判定,页面请求路径上没有循环体内查库
(静态门禁
hook_loop_audit/indirect_n1_audit均 0 处)。四、已知行为(请先读这三条)
- 推荐序是有界打分:只在最近
hot_window(默认 120 条,后台可调)候选里排序再分页。这样切序只多固定 1 条聚合;
代价是更早的动态不会因为互动高被顶上来。要更长的记忆把窗口调大即可。
- 群未读用「水位」而不是逐条已读:未读 = id 大于水位且不是自己发的;打开群或一键已读只推水位(1 条 UPDATE)。
代价是「只读了中间某几条」这种状态无法表达(产品上不需要)。
- 通知聚合页的分组明细有上限(默认 200 条,后台可调),但分组计数走的是全量 SQL,所以数字不会因截断而失真;
更早的通知仍可在核心「我的通知」页翻到。
五、升级说明
- 原地升级,无需卸载重装;老库第一次读写时自动补表 / 建列 / 建索引,重复安装幂等。
- 新增四张表:群组、群成员、群消息、关系网络忽略表,各带一枚索引(共 16 表 / 16 索引)。
- 新增四个用户级静音开关列(关注的新主题 / 关注的人回帖 / @提及 / 互动与评论提及),默认全不静音。
- 未建群、未用推荐序、未静音时,行为与 6.0.0 完全一致。
- 1234567892026-09-30
6🥳
- 82026-09-30
怎么获取授权码🤔
版本 8.0.0 更新:
【8.0.0】把匿名写进动态流:跨插件匿名联动 + 私信撤回 + 群公告(先修 3 处会泄露匿名身份的缺陷)一、新增
- 跨插件匿名联动(与「匿名区 · 树洞」插件配合)
- 动态流、动态详情、收藏页都会把整页内容交给匿名区插件做身份遮蔽:匿名主题与匿名回复在这三处
也显示成「匿名 #N」,不再露出真实昵称、真实头像与个人主页链接。
- 未安装匿名区插件时完全是恒等操作(Hook 无人注册、原样返回),零查询零开销。
- 「最后回复人」同样是保守遮蔽:只要 TA 在这篇主题里以匿名身份出现过,就不会显示真名。
- 私信撤回
- 自己发出的私信可在 2 分钟内撤回(后台可调 30–3600 秒);撤回后双方看到「这条私信已撤回」占位,原文不再显示。
- 撤回会一并抹掉通知里的正文摘录(原先通知带着 60 字预览,撤回后还能在通知列表里读到 = 撤回没生效)。
- 引用过这条私信的消息显示「(原消息已撤回)」;撤回的私信不再计入未读(会话页、会话列表、消息中心徽标三处同源)。
- 只能撤回自己的、且未超时的私信;重复撤回、撤回他人、超时都有明确提示。
- 群公告
- 群主可在群会话页顶部发布一条公告(最多 200 字),成员进群即可看到,可随时清除或改写。
- 只有群主能设置;非群主提交会被拒绝,且不会覆盖已有公告。
二、修复(本轮实测复现的 3 处真实缺陷,均为「匿名身份泄露」)
- 动态流泄露匿名作者:关注的人以匿名身份发帖时,动态流里仍然显示其真实昵称、真实头像与主页链接
(实测行内出现
a=user&id=3与真人头像种子)——匿名区插件只覆盖了核心渲染管线,而动态流是本插件自己取数、自己拼行 HTML。
修法:渲染前调用匿名区插件的anon_board.mask_rows批量遮蔽接口(整页一次调用)。- 动态详情页泄露:
?a=user_follow_item&target=topic:…的头部作者卡直接读用户表,匿名主题在这里同样显示真人。
修法:把作者拼成一行交给同一接口遮蔽,并在命中匿名时断开主页链接。
- 收藏页泄露:收藏了匿名主题后,收藏列表里显示的是真实作者。
修法:收藏页的主题行与回帖作者同样走批量遮蔽。
三、附带修掉的两处自测缺陷(写在这里供复盘)
- 撤回状态列没有取回:会话消息查询没 SELECT
recalled_at,数据库里已写入撤回时间、页面却读不到 ——
「撤回」看起来完全没生效(占位不出现、原文照旧)。已补列,并给会话列表预览、未读口径同步加上撤回判断。
- 撤回通知清洗的 LIKE 没有 ESCAPE:正文里含
%_时可能匹配不到或误伤,已改用统一的
LIKE ? ESCAPE '!'片段(与插件其它 LIKE 同源)。四、性能
- 动态流 / 收藏页 / 动态详情在装了匿名区插件且站内存在匿名内容时,各多 1~2 条整页批查
(主题匿名标记 + 匿名身份映射;本页没有匿名内容时只多 1 条,命中时才多第 2 条);
未装该插件或站内没有匿名内容时零额外查询。- 逐行渲染路径仍然零查询:遮蔽在整页数据钩子里一次完成,行循环里只读内存映射。
五、升级说明
- 原地升级:自动补两列(私信
recalled_at、群notice/notice_at),不加表、不改索引,重复安装幂等。 - 撤回时限、群公告都不影响既有数据;不装匿名区插件时本插件行为与 7.0.0 完全一致。
- webmaster2026-09-30
有趣
版本 9.0.0 更新:
9.0.0 大版本更新:关注备注 + 暂停关注 + 关注体检
本次照旧「先修 BUG,再补能力」:修掉 4 处真实缺陷(3 处是隐私 / 打扰口径问题),再补 3 项能力。
一、修掉的 4 处缺陷(都可复现、都留了回归断言)
- 私密群聊的群名对群外泄露
现象:非成员带上
?gid=N打开群聊页,拒绝文案里带着群名;而 gid 是可枚举的连续整数,任何人遍历一遍就能把全站私密群的名字收走。
修法:不再回显群名;「群不存在 / 已解散」与「你不是成员」也统一成同一句文案,光凭文案差异也判断不出某个群是否存在过。- 免打扰时段挡得住私信、挡不住互动提醒
现象:夜里免打扰时段,私信通知安静了,但点赞 / 评论 / 回复你的评论这三类即时提醒照响——同一句「即时通知」两套口径。
修法:时段内不再即时打扰,但也不丢——写进一条退避事件,时段结束后由既有的通知计划任务补发;补发前会重新校验屏蔽 / 静音 / 暂停关注(时段里改过设置就不发)。- 忽略过的推荐找不回来
现象:在关系网络里点过「忽略」的人从推荐列表消失后再无入口——取消忽略的接口虽然存在,但页面没有任何地方能触发它,被忽略的人在你自己这里等于永久消失。
修法:关系网络页新增「已忽略 N 人(点开可恢复)」面板,一键恢复即重新参与推荐;面板是原生 POST + CSRF 表单,不用 JS 也能用。- 所有互动提醒都写成「回复了你的回帖」
现象:哪怕是主题被点赞 / 评论,通知里也写「你在《…》里的回帖」。
根因:把字符串 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。现在每个动作各读一次令牌,并在同步后核对启用状态。
版本 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_event46/0、lab_verify_event_v257/0 复跑确认。 - 六道静态门禁全绿;
lab_verify_v900.sh93/0;全量回归 36 套件 3771 项通过 / 0 失败。
- 新增一行 Hook 映射
版本 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 路径字节不变)。
- ①「关注数据导出」三个按钮响应是 CSV 附件(
版本 9.0.3 更新:
9.0.3 小更新· 为「举报与处置中心」(新插件)开放外部事件通道:举报处置完成后投递的
report_center.after_dispose事件,
由本插件转成一条关注者动态通知 —— 只加一行 Hook 映射、复用既有回调,不新增函数。
· 投递方自带措辞与主题归属,因此通知文案与「发布了新动态」不会串味;不投递时(例如活动报名)行为与上一版逐字节一致。
· 本版不含其它功能或行为变更;动态流、通知、搜索、权限与查询预算口径全部不变。版本 10.0.0 更新:
10.0.0- 新能力:主题追更。主题页主楼的操作区多了「追更」按钮——追更某一个主题之后,它每有新回复都会给你发一条站内提醒(同一主题 24 小时内只提醒一次);新增「追更」页签,列出你追更的主题与「还没看过的回复有几条」,可以单个或一键标为已读,翻到最新一页也会自动标记已读。追更上限后台可调。
- 新能力:动态流过滤词(我的静音词)。在「关键词」页签里设几个不想看到的词,标题或正文命中的主题与回帖就不会再进你自己的动态流,也不会被算进「你关注的人有 N 条新动态」;只影响你自己,不动关注关系,别人看到的动态照旧。词里的 % 与 _ 按字面匹配,不是通配符。
- 新能力:私信收件规则(防骚扰)。「关注设置」里可以选择谁能给你发私信:所有人都可以 / 只有我关注的人 / 只有互相关注的人;站点还可以设一个默认值。被规则挡住的人仍然能查看你们的历史会话,屏蔽关系依旧优先。
- 修复:动态详情页与点赞 / 评论 / 收藏绕过了版块的可见性设置——把版块设成「仅某用户组可见」后,核心主题页会拒绝访问,但动态详情页仍能按主题编号枚举出标题与正文摘要。现在两处判定完全一致。
- 修复:动态流(主题 / 回帖 / 订阅版块 / 关键词四个来源)与「新动态」条数同样会混入无权查看的版块内容,现已与核心同源过滤,且不改变 SQL 结构、不增加查询次数。
- 修复:查看他人名册时用 ?q= 搜索,会匹配到对方「只自己可见」的关注备注——等于能把别人的私有备注一个字一个字试出来。现在备注只对本人参与搜索,他人视角只搜昵称。
- 修复:免打扰时段内收到的私信不再被「吞掉提醒」。原先时段内直接不产生通知(时段结束后也没有),现在改为排队,时段结束后自动补发一条,与互动提醒的处理方式一致。
- 其它:补上这个插件此前缺失的 README 与统一验收入口(tools/lab_verify_user_follow.sh,按版本顺序跑全部历史套件)。
版本 10.1.0 更新:
10.1.0- 修复:动态详情页的评论以前只能看到前 50 条,第 51 条起会静默消失。现在评论分页显示(每页条数后台可配,默认 20),页面上给出「共 N 条 · 第 x/y 页」与分页条;发表评论后回到第 1 页,删除后回到原来的那一页。
- 修复:同一条事件被两个并发的计划任务同时取到时,收件人会收到两条一模一样的通知。现在队列改为「先领取再处理」,抢不到的事件直接跳过;并且整批消费放在一个事务里——通知写入与出队要么一起成功、要么一起回滚,中断重跑也不会重复投递。
- 修复:并发打开同一个主题时,已读水位可能被「读到旧时间的那个请求」推回去,已经看过的回复会重新变成「新」。现在水位只允许向前推进(自动已读、单个标已读、全部标已读三处都做了单调写)。
- 修复:订阅版块的提醒在 10.1.0 开发过程中曾一度完全不发(消费循环改成闭包时漏传了两个变量),已修复并留了回归断言。
- 新能力:过滤词支持批量导入 / 导出 / 清空。一次粘贴多行(也支持逗号、顿号、空格分隔)即可批量加入,重复的、超过 20 字的、超出上限的会自动跳过并告诉你有几个;导出的是一行一个词的纯文本,可以直接再粘回导入框;一键清空带确认。
- 新能力:关注分组支持排序。设置页里每个分组带 ↑ / ↓ 按钮,名册页签、动态流的分组筛选与设置页列表三处顺序会一起变化。
- 性能核对:追更只给主题页增加 1 条查询;个人主页与动态流在「过滤词 / 追更 / 私信收件规则」全开与全关时查询数完全相同;动态详情页因评论总数多 1 条计数查询(总数与列表同源)。
版本 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 的三处修复都在写路径与计数口径上,界面未新增区块(「已忽略」面板新增的是翻页入口)。
版本 10.3.0 更新:
10.3.0 · 覆盖文件升级自愈 + 通知写路径的版块可见性- 修复(越权 · ACL 缺陷类第 9 款):动态流(读路径)早有版块可见性过滤,但通知消费(写路径)一处都没有 —— 受限版块里的主题标题会随「关注者新主题 / 回帖 / 追更 / 版块订阅 / 跨插件事件(悬赏采纳、活动发布)」五条路径发给无权查看的人;关注摘要更成批带回标题,且摘要里的条数计数本身也是一条旁路信道。现在收口在消费侧一处判定(口径 = 跳过不发,与读路径「整行隐藏」一致),并覆盖摘要在内的标题与计数两条 SQL。
- 修复(升级路径):覆盖插件文件(不经 install)时,缺表缺列会让读写路径抛异常并导致整插件被自动停用。现在八个入口在三道门(内存副本 → 设置标记 → 才真正 DDL)之后幂等补齐,稳态零查询;读钩子刻意不挂,首页预算口径不变。
- 口径:站内没有受限版块时 SQL 文本逐字节不变、通知文案逐字节不变;通知与摘要的语句数增量 0(判定全部吃已取回的行与核心内存版块表)。
- 内部(不影响功能):卸载清理里的结构版本标记删除语句改为占位符参数化写法(行为逐字节等价,只为满足仓库「自写 SQL 一律带占位符」的静态契约)。