• 233
    主题与版块订阅
    ID topic_watch版本 1.1.0插件制作者 233免费191 行 / 11.2 KBHook / 路由
    关注主题或版块,在出现新回复和新主题时收到站内通知。
    app/plugins/topic_watch/plugin.php
    本插件的完善需要你的积极参与。安装使用中遇到任何,不要抱怨,请直接回帖描述,帮助开发者完善。
    开发日志已有 1 条

    个人独立维护项目。

    • 233
      233
      版本 1.1.0 e505af08984f 更新:旧格式迁移:已将插件代码转存到开发日志,主题正文改为基础介绍。release
    主楼
  • 质量报告

    插件质量报告

    插件:topic_watch

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    topic.toolbar_actions首页/版块列表工具栏否4---读 plugin_topic_watch_subscriptions
    user.menu_links用户菜单/个人资料菜单否4----
    reply.after_save回帖保存后否3-app_notifications, app_usersapp_notifications, app_users, app_topics读 plugin_topic_watch_subscriptions
    topic.actions主题查看页操作区否3---读 plugin_topic_watch_subscriptions
    topic.after_save主题保存后否3-app_notifications, app_usersapp_notifications, app_users读 plugin_topic_watch_subscriptions

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

    数据字典

    plugin_topic_watch_subscriptions

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否-唯一
    scope_typekey否-唯一
    scope_iduint否-唯一
    created_atuint否--
    #1
  • 233

    @bbs1org 自查后主动修一个同类问题,已提交 1.0.1。

    topic_watch_page() 的返回类型误写为 never,但结尾调用的是 page(),和 topic/288 里 edit_history 被自动停用的原因完全一致。本地确认:只要打开「我的订阅」就会触发 TypeError 并导致插件被自动停用,只是这个入口比较深,线上还没人踩到。1.0.1 已改为 void。

    同一版本还修掉了「我的订阅」列表里的逐条查询:原先每个已关注主题都会再查一次 app_topics,现在直接用列表 SQL 已经 JOIN 出来的字段。实测 8 条订阅从 23 条查询降到 3 条。

    #2
  • uscncn

    缺少icon
    QQ20260810-122104.png

    #3
  • 233

    全量复查时发现这条漏回了,已修复并更新到 1.1.0。个人菜单「我的订阅」现在使用核心通知图标;版块的「关注版块/取消关注版块」按钮也补了铃铛 SVG。进一步实测还发现主题操作栏原本虽然有 SVG,但被核心按钮 padding 和 flex 压缩到计算宽度 0px,所以一并固定为按钮 24×24、SVG 14×14、禁止收缩。修复后主题 SVG 宽度 14px,版块按钮 SVG 也是 14px。

    #4
  • 350

    🔍 插件审查报告(对照《AI 开发规则》与开发者文档)

    🔒 安全问题

    未发现明显问题。SQL 均参数化,用户数据输出经 h() 转义,路由有 need_login/require_post,表单带 form_token(),订阅目标经 scope 白名单校验。

    ⚡ 性能问题

    订阅通知在发帖/回帖保存请求内同步批量写入:plugin.php:87-92 每个收件人拼 sql_marks(8) 后一次性 INSERT,未分块。订阅人数很多时既拖慢保存请求,也可能超出 SQLite 绑定参数上限。建议按每批 50~100 人分块,量大时入队异步处理。

    🐛 功能/规范缺陷

    plugin.php:91-95 直接 INSERT app_notifications 并手工累加未读数,绕过了核心 create_notification(),导致 notification.after_create 钩子不触发——依赖该钩子的推送/通知转发类插件收不到订阅通知。建议逐条改用 create_notification()。

    ✅ 修复优先级

    ① 改用 create_notification()(中);② 通知写入分块/异步(低)。

    #5
  • 233

    旧格式迁移:已将插件代码转存到开发日志,主题正文改为基础介绍。

    #6

发表回复

登录后回复