[topic_manage]帖子管理助手热
106320
- 帖子管理助手ID topic_manage版本 1.3.5插件制作者 one售价 10 积分3133 行 / 184.9 KBHook / 路由 / 后台页帖子快捷管理:首页/详情页行内即可置顶、高亮、加粗、删除、移动主题及删除回帖,支持禁言/禁访与解禁,贴主可置顶一条回帖到主贴之下(不可更换,管理员可取消),所有操作留痕审计,附前台公开管理日志。收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/topic_manage/plugin.php开发日志已有 5 条
个人独立维护项目。
淘帖专辑官方安装插件合集主楼 插件质量报告
插件:
topic_manageHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 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字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 - 快捷版务入口:把高频版务操作(置顶/高亮/加粗/删除/移动/删回帖/禁言禁访)从"后台搜索 → 逐项操作"压缩为列表页与详情页的行内一键操作,管理者的操作路径缩短到两次点击。
- 理由强制 + 全量审计:任何操作必须填写理由(预设快选 + 自定义输入,按"内容处理/版务管理"两组注入),全部写入
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 白名单,被绕过不构成安全漏洞。
大家在使用过程有问题或建议可以在本贴交流。

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胶囊圆角为核心既有惯例,维持不变)。
- 移动主题后触发
因为禁言和解除禁言都是需要系统原生表的支持,所以有读写动作是正常的:
动作 条件 读 app_users SELECT m.user_id FROM plugin_topic_manage_mutes m INNER JOIN app_users u ...(JOIN 过滤“确已禁言且到期”),60 秒节流,至多每分钟一次写 app_users UPDATE app_users SET is_muted=0 WHERE id=? AND is_muted=1,仅当存在到期禁言用户时才执行(rowCount 认领,并发安全)所以扫描结果是准确的,但注意它不是每请求执行:节流窗口内直接 return;无到期禁言的站点只跑每分钟一次的 SELECT,永不 UPDATE。
顶
版本 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监听:主题物理删除时清理其置顶记录。
- 置顶回帖:主题作者(贴主)或管理员可将主题下任意一条回帖置顶到主贴之下、所有回帖之前(卡片展示操作者信息/作者/楼层/纯文本摘要,并附核心原生

增加了回贴置顶功能。同时进行全量检查:
整体质量高:红区零 DB 复核通过、鉴权/CSRF/注入/重定向/CSV 全防线到位、批量预取与缓存模式符合平台规范、SQLite 兼容无嵌套事务。无高危问题版本 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 嵌入媒体语法(
)按扩展名转为纯占位符——图片[图片]、音视频[多媒体]、其他附件[附件],连续同类占位符合并为一个,普通链接保留原文;避免长 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]、无消费者的 JSdata-topic-manage-toggle引用与.topic-manage-no-hover类、卡片内operator_id重复赋值。
- 三点管理菜单(kebab)替代全部行内操作条:列表页主题行标题徽章前、详情页主贴与每个回帖的编辑按钮右侧(
版本 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)无需迁移天然兼容。
- 「启用前台管理操作」由开关改为范围选择框:四档

