• one
    帖子管理助手
    ID topic_manage版本 1.3.5插件制作者 one售价 10 积分3133 行 / 184.9 KBHook / 路由 / 后台页
    帖子快捷管理:首页/详情页行内即可置顶、高亮、加粗、删除、移动主题及删除回帖,支持禁言/禁访与解禁,贴主可置顶一条回帖到主贴之下(不可更换,管理员可取消),所有操作留痕审计,附前台公开管理日志。
    收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。
    app/plugins/topic_manage/plugin.php
    开发日志已有 5 条

    个人独立维护项目。

    • one
      one
      版本 1.3.5 89854a228503 更新:### Changed - **「启用前台管理操作」由开关改为范围选择框**:四档 `front_enabled`——`1`=开启(列表+详情,默认)/`2`=仅主页列表页/`3`=仅贴子详情页/`0`=关闭。未覆盖页面不渲染三点管理菜单与理由弹窗(列表页弹窗、详情页弹窗/回帖菜单分别由新增的 `topic_manage_front_on_list()` / `topic_manage_frontrelease
    • one
      one
      版本 1.3.2 a4cb788c2cba 更新:### Changed - **三点管理菜单(kebab)替代全部行内操作条**:列表页主题行标题徽章前、详情页主贴与每个回帖的编辑按钮右侧(`topic.after_render` / `reply.after_render` 注入)各注入一个竖三点图标菜单(原生 `<details>` 开合,零 JS 也可用)。主贴菜单含移动/置顶/高亮/加粗/删除 + 禁言作者/禁访作者;回帖菜单含禁言用户
    • one
      one
      版本 1.3.1 c5122f6dca0c 更新:### Added - **置顶回帖**:主题作者(贴主)或管理员可将主题下任意一条回帖置顶到主贴之下、所有回帖之前(卡片展示操作者信息/作者/楼层/纯文本摘要,并附核心原生 `?floor=N` 楼层跳转链接)。一主题仅一条(`plugin_topic_manage_pinned` 表 `topic_id` 主键从库层保证唯一),设置后贴主不可更换、不可取消。 - **取消置顶回帖**(`rep
    • one
      one
      版本 未识别 f8f3cd9017c1 更新:### Added - 移动主题后触发 `topic.after_save` 事件(与核心编辑路径对齐),监听该钩子的通知/统计类插件可感知版块变更。 ### Fixed - **到期自动解禁并发重复日志**:自动解禁改用「UPDATE ... WHERE is_muted=1 + rowCount 认领」模式,仅真正翻转状态的请求写审计日志,并发请求天然互斥。 - **后台批量禁言非法时长静默回
    • one
      one
      版本 未识别 56ed44fd3054 更新:- **快捷版务入口**:把高频版务操作(置顶/高亮/加粗/删除/移动/删回帖/禁言禁访)从"后台搜索 → 逐项操作"压缩为列表页与详情页的行内一键操作,管理者的操作路径缩短到两次点击。 - **理由强制 + 全量审计**:任何操作必须填写理由(预设快选 + 自定义输入,按"内容处理/版务管理"两组注入),全部写入 `plugin_topic_manage_logs` 审计表,后台可按操作类型/操
    主楼
  • 质量报告

    插件质量报告

    插件:topic_manage

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    app.boot全站请求启动回调内5-app_settings, app_users 修正❗️app_settings, app_users 修正❗️写 plugin_topic_manage_mutes, plugin_topic_manage_logs 修正❗️
    reply.after_render主题查看页/回帖列表逐条渲染是5--app_users 修正❗️-
    sidebar.feature_links首页/侧栏快捷功能否5----
    topic.after_render首页/版块列表/主题查看逐条渲染是(列表跳过)5--app_users-
    topic.replies_data.loaded主题查看页回帖查询后否4--app_replies写 plugin_topic_manage_pinned
    topic.toolbar_actions首页/版块列表工具栏否4----
    content.before_delete内容删除操作否2---写 plugin_topic_manage_pinned
    topic.content_after非系统hook否1--app_replies, app_users-

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

    数据字典

    plugin_topic_manage_logs

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_topic_manage_mutes

    字段类型可空默认值约束
    -动态定义--无法静态解析

    plugin_topic_manage_pinned

    字段类型可空默认值约束
    -动态定义--无法静态解析
    #1
  • one
    • 快捷版务入口:把高频版务操作(置顶/高亮/加粗/删除/移动/删回帖/禁言禁访)从"后台搜索 → 逐项操作"压缩为列表页与详情页的行内一键操作,管理者的操作路径缩短到两次点击。
    • 理由强制 + 全量审计:任何操作必须填写理由(预设快选 + 自定义输入,按"内容处理/版务管理"两组注入),全部写入 plugin_topic_manage_logs 审计表,后台可按操作类型/操作者筛选、CSV 导出、按保留期自动清理;前台对所有登录用户提供自然语言事件句的公开管理日志(可关闭),保证版务透明。
    • 复用核心,不造轮子:删除走核心 del()(事务 + FTS + 统计一致),置顶走 set_pinned_topic(),高亮/加粗读写核心复合样式助手 topic_title_color() / topic_title_is_bold() / topic_title_style(),管理权限直接复用核心 can_manage()——权限模型随核心演进零漂移。
    • 红区零查询:渲染循环 Hook(topic.after_render、reply.after_render)内只读请求级缓存与纯函数(can_manage()→me() 缓存、pinned_topic_ids()→setting 缓存、topic_title_*() 纯正则),绝不发起数据库查询;回帖作者的管理员身份由 topic.replies_data.loaded(每页一次)批量预热到 $GLOBALS。
    • 服务端兜底,前端仅视觉层:JS 只负责操作条显隐与理由弹窗交互;topic_manage 路由入口统一 need_login + require_post + can_manage + CSRF token + action 白名单,被绕过不构成安全漏洞。
    #2
  • one

    这是一个消耗了我2000积分的插件。然后今天又更新迭代适配到8.7.5
    可以和我的只读插件(topic_readonly)联动,直接设置为只读

    #3
  • one

    大家在使用过程有问题或建议可以在本贴交流。
    01.png

    #4
  • one

    Added

    • 移动主题后触发 topic.after_save 事件(与核心编辑路径对齐),监听该钩子的通知/统计类插件可感知版块变更。

    Fixed

    • 到期自动解禁并发重复日志:自动解禁改用「UPDATE ... WHERE is_muted=1 + rowCount 认领」模式,仅真正翻转状态的请求写审计日志,并发请求天然互斥。
    • 后台批量禁言非法时长静默回退永久:篡改 POST 传入非法 mute_seconds 现在直接报错(与前台行为一致),不再无声升级为永久禁言。
    • 侧栏「管理日志」入口在公开日志关闭时不再渲染(原来点击进入「已关闭」提示页)。

    Removed

    • 移动主题的单语句冗余事务包裹。

    规范修正(无行为变化)

    • JS 全局变量 window.__toastTimer → window.topic_manage_toast_timer(插件 ID 前缀,避免跨插件覆盖)。
    • data-tm-picker-bound → data-topic-manage-picker-bound(data-* 属性使用完整插件 ID 连字符形式)。
    • 用户名联想下拉 box-shadow 硬编码 rgba(0,0,0,.16) → var(--shadow-medium)(CSS 变量规范;色板"+"覆盖层的白色混合模式效果常量与 border-radius:999px 胶囊圆角为核心既有惯例,维持不变)。
    #5
  • one

    因为禁言和解除禁言都是需要系统原生表的支持,所以有读写动作是正常的:

    动作条件
    读 app_usersSELECT m.user_id FROM plugin_topic_manage_mutes m INNER JOIN app_users u ...(JOIN 过滤“确已禁言且到期”),60 秒节流,至多每分钟一次
    写 app_usersUPDATE app_users SET is_muted=0 WHERE id=? AND is_muted=1,仅当存在到期禁言用户时才执行(rowCount 认领,并发安全)

    所以扫描结果是准确的,但注意它不是每请求执行:节流窗口内直接 return;无到期禁言的站点只跑每分钟一次的 SELECT,永不 UPDATE。

    #6
  • dcve

    顶

    #7
  • one

    欢迎交流😀

    #8
  • one

    版本 1.3.1 更新:

    Added

    • 置顶回帖:主题作者(贴主)或管理员可将主题下任意一条回帖置顶到主贴之下、所有回帖之前(卡片展示操作者信息/作者/楼层/纯文本摘要,并附核心原生 ?floor=N 楼层跳转链接)。一主题仅一条(plugin_topic_manage_pinned 表 topic_id 主键从库层保证唯一),设置后贴主不可更换、不可取消。
    • 取消置顶回帖(reply_unpin):管理员纠错能力,贴主不可取消;前台置顶回帖操作条附取消按钮,后台审计与 CSV 导出记录该操作。
    • 管理员代置顶开关:后台设置页新增「允许管理员代置顶回帖」(仅创始人可修改,默认开启);关闭后代置顶/代取消仅限创始人(uid=1,不受开关限制,与 allow_mute_admins 逻辑同构),普通管理员与开关同进退,贴主置顶能力不受影响。
    • 管理置顶标注:管理员(含创始人)代置顶的回帖,卡片头部以图钉图标(插件自带 SVG,尺寸/stroke 走 CSS)标注,并显示「由 {操作者名·超 12 字符截断} 于 {Y-m-d H:i} 置顶回帖」:操作者名为用户主页链接,悬停/聚焦时以面板配色气泡(--panel/--text/--line/--shadow-medium,结构对齐 post_edit_time_plus 的 tooltip,随日夜主题自动切换)显示全名;此模式下不再显示回帖时间。贴主置顶的保持原样式。
    • 操作按钮复用原生 data-confirm 二次确认("置顶后不可更换,仅管理员可取消"),不进入理由弹窗;topic_manage_page() 对 reply_pin 放开统一的 can_manage() 前置与理由必填校验(服务端按操作者身份写死审计文案:主题作者置顶回帖 / 管理员置顶回帖 / 管理员取消置顶回帖)。
    • 新增 content.before_delete 监听:主题物理删除时清理其置顶记录。
    #9
  • one

    01.png
    增加了回贴置顶功能。

    同时进行全量检查:
    整体质量高:红区零 DB 复核通过、鉴权/CSRF/注入/重定向/CSV 全防线到位、批量预取与缓存模式符合平台规范、SQLite 兼容无嵌套事务。无高危问题

    #10
  • one

    版本 1.3.2 更新:

    Changed

    • 三点管理菜单(kebab)替代全部行内操作条:列表页主题行标题徽章前、详情页主贴与每个回帖的编辑按钮右侧(topic.after_render / reply.after_render 注入)各注入一个竖三点图标菜单(原生 <details> 开合,零 JS 也可用)。主贴菜单含移动/置顶/高亮/加粗/删除 + 禁言作者/禁访作者;回帖菜单含禁言用户/禁访用户/删除回帖;主题菜单(列表行/主贴)在 topic_readonly 启用时含只读切换——协同后 topic_readonly 详情页原生锁按钮自动隐藏(其 v1.2.2),避免双入口。点击外部/Escape/打开弹窗时自动收起。交互桌面/移动端统一,消除 hover 误触与移动端不可用问题。仅 can_manage() 用户可见。
    • 移除全部行内操作条:列表 hover 操作条、详情页主贴处罚条、回帖操作条(topic-manage-actions 体系)整体删除,弹窗改由详情页 topic.content_after 每页渲染一次;连带清理对应的 CSS 显隐机制与 JS hover/绑定逻辑。
    • 置顶回帖卡片媒体掩码:摘要构建前把 Markdown 嵌入媒体语法(![alt](url))按扩展名转为纯占位符——图片 [图片]、音视频 [多媒体]、其他附件 [附件],连续同类占位符合并为一个,普通链接保留原文;避免长 URL 污染摘要窗口挤掉正文。
    • 性能:置顶回帖查询收敛(详情页 5~6 次 → 2 次):topic_manage_pin_row() 改为单条 LEFT JOIN 一次区分「无记录」与「孤儿记录」(仅后者才产生惰性 DELETE,无置顶主题固定 1 次查询);topic_manage_pinned_card() 改单条 JOIN 一次取回回帖正文/作者名/操作者名/原始楼层(相关子查询计层),替代原 row(replies)+row(users)×2+楼层 COUNT 共 4 次逐行查询。
    • 事务一致性:主题置顶/取消置顶、高亮、加粗、前台禁访/解禁言/解禁访、回帖取消置顶及后台解禁言/解禁访共 9 处「写入 + 审计」两步操作统一包入 tx(),消除「已执行但无审计」中间态(与禁言路径对齐)。
    • 索引命名规范:6 个索引由 idx_topic_manage_* 统一更名为 plugin_topic_manage_*(install/uninstall 同步;新插件无数据,直接改名无迁移成本)。
    • 用户联想接口:need_login/require_post 前置于 JSON 头声明(避免鉴权失败输出 HTML 响应体);catch (Throwable) 增加 error_log,故障与真实空结果可区分。
    • 死代码清理:移除无调用方的 topic_manage_toast() JS 函数(早期 err 路径遗留,提示已由服务端 err() 接管)与只读切换表单上无 JS 消费者的 data-topic-manage-readonly 属性。

    Fixed

    • 置顶回帖并发竞态:MySQL/PG 下极端并发双击时,第二个请求的 INSERT 唯一键冲突由裸 PDO 异常转为友好提示「该主题已置顶过回帖,置顶后不可更换」。
    • 卡片摘要 HTML 注释剥除的回退失效:移除 preg_replace 结果上错误前置的 (string) 强转(原写法在正则失败时会得到空串而非原文回退)。

    Removed

    • 死代码清理:只读按钮恒定分支 $variant、topic_manage_page() switch 后不可达的 err('操作无效')(15 个 action 全覆盖)、无对应 DOM 的 CSS .topic-manage-reason-group[hidden]、无消费者的 JS data-topic-manage-toggle 引用与 .topic-manage-no-hover 类、卡片内 operator_id 重复赋值。
    #11
  • one

    @bbs1org 再来测试下

    #12
  • bbs1org

    很棒。列表页面加个控制开关,可以不显示

    #13
  • one

    啥开关,没理解到。(后台加开始是否前台显示操作?)

    #14
  • bbs1org

    😇 插件后台增加一个开关:列表页面是否启用快捷管理菜单

    #15
  • one

    这。。失去了插件的初衷了,这个插件就是为了管理而做的啊。
    主要是为了方便其他无后台管理权限的管理员方便操作。

    AI说不建议此项设置,如你所愿:
    01.png

    #16
  • bbs1org

    列表页面不展示,看帖页面展示啊

    #17
  • one

    理解错了。。

    #18
  • one

    来了
    01.png

    #19
  • one

    版本 1.3.5 更新:

    Changed

    • 「启用前台管理操作」由开关改为范围选择框:四档 front_enabled——1=开启(列表+详情,默认)/2=仅主页列表页/3=仅贴子详情页/0=关闭。未覆盖页面不渲染三点管理菜单与理由弹窗(列表页弹窗、详情页弹窗/回帖菜单分别由新增的 topic_manage_front_on_list() / topic_manage_front_on_detail() 按档位分闸;列表行与详情主贴共用 topic.after_render,按 ctx['list'] 区分判定)。服务端兜底仅在完全关闭(0)时拒绝管理类操作——分页档位下操作本身与来源页面无关,不做来源校验。置顶回帖图钉与卡片为贴主内容组织功能,不受档位影响。配置归一化与保存均做四值白名单校验,非法值回退默认开启;旧数据(1/0)无需迁移天然兼容。
    #20

发表回复

登录后回复