- 帖子编辑时限 · 增强ID post_edit_time_plus版本 1.2.1插件制作者 one免费583 行 / 37.9 KBHook / 后台页限制用户修改已发布内容的时间;支持按板块与按用户组设置不同的可编辑时长,板块和用户组可单独设为永久不限制;后台可开关是否显示"最后编辑"标记及其位置,并可设置过期后是否仍显示编辑按钮。app/plugins/post_edit_time_plus/plugin.php开发日志已有 4 条
个人独立维护项目。
主楼 插件质量报告
插件:
post_edit_time_plusHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 app.boot 全站请求启动 否 5 - - - - reply.after_render 主题查看页/回帖列表逐条渲染 是 5 - - - - reply.before_render 主题查看页/回帖列表逐条渲染 是 5 - - - - topic.after_render 首页/版块列表/主题查看逐条渲染 是(列表跳过) 5 - - - - topic.before_render 首页/版块列表/主题查看逐条渲染 是(列表跳过) 5 - - - - topic.replies 主题查看页回帖集合 否 4 - - - - reply.before_save 回帖发布/编辑表单提交 否 3 - - - - topic.before_save 主题发布/编辑表单提交 否 3 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
未检测到插件数据表声明。
版本 1.1.1 更新:
帖子编辑时限 · 增强(post_edit_time_plus)(1.1.1)审查报告
检查日期:2026-08-19
依据
.ai-rules.md、开发者文档.md与核心index.php(topic_post_row/topic_list_row/topic.replies/me()/err()/before_save/app/assets/index.css)交叉验证,对当前生效代码(511 行)全量走查。一、安全问题
级别 位置 结论 🟢 全局输出 所有用户/外部数据均经 h()(ENT_QUOTES);$created/$editor_name/$match[1]/route_url均转义或(int)强转,无 XSS。🟢 admin_pageneed_admin()+require_post()+form_token()+go()完整,CSRF/越权防护到位;POST 参数(int)强转并 clamp(0–10080)。🟢 before_topic_save/before_reply_save仅拦本人过期编辑,管理组成员管理他人帖不受限,与核心 can_manage_*一致;err()提示无敏感信息。🟢 err()终止语义核心 err()为: never(第 1510 行)始终终止;cached_row ?: err()在帖子不存在时正确终止,$row不会被错误值污染。🟢 数据存储 body 编辑标记 <!--post_edit_time_plus:ts:uid-->中 UID 经(int)强转;markdown 渲染忽略注释,无注入面。结论:无高危安全漏洞。
二、性能问题
级别 位置 结论 🟢 红区钩子( before_render/after_render)主楼 + 回复编辑人经 topic.replies(每页一次)批量预加载入请求级缓存;after_render读 forum_id/editor 全为纯内存 GLOBALS,红区调用链零 DB 读。🟢 config()static请求级缓存,每请求解析一次,非逐条,符合 §93。🟢 me()(after_render)核心 __me_cache渲染前已缓存,不触发新查询;身份认证单次读取,可接受。🟢 editor_usersrows_by_ids分块 IN 查询 + static 缓存;主路径预加载命中,零冗余;editor_id 为 null 时array_filter过滤,不查 DB。🟢 cached_row仅存于保存钩子(非红区),static 请求级缓存避免同请求重复读取。 结论:红区合规,无逐条 DB 读,性能良好。
三、功能 / 规范缺陷
级别 位置 问题 🟢 after_rendertooltip 解耦发帖时间 tooltip 已无条件注入,独立于 show_meta/show_at配置,功能闭合。🟢 版本号 1.1.1已随行为变化(tooltip 解耦、正则加固)提升,合规。🟢 topic.can_manage对已授权帖子始终返回 true,过期拦截由前端点击 +before_save兜底,主楼/回复按钮显隐一致,属设计取舍。🟢 按钮移除正则 已加固为否定前瞻限定到首个 </a>,无跨行过度匹配。🟢 命名/钩子/IIFE/选择器/CSS 变量 钩子全为核心原生名、IIFE 具名、CSS/ data-*连字符前缀、选择器收敛于插件根容器、字号/圆角/动效全用核心变量,均合规。🟢 主楼 preload topic.replies中同时预加载主楼($ctx['topic'])与回复编辑人,红区无遗漏。未发现 P0/P1 阻断项。
四、总体评估
- 安全:良好,无高危问题;
err()终止语义、全量h()转义均正确。 - 性能:红区调用链(主楼 + 回复)完全零 DB 读,达标。
- 功能:优先级(板块>用户组>全局)、用户组永久不限、发帖时间 tooltip(无条件可用)、编辑标记、过期按钮拦截等主链路全部正确闭合。
- 规范:版本号、命名、钩子、IIFE、选择器作用域、CSS 变量化全部达标,无 P0/P1 缺陷。
结论:插件整体健康、安全达标、红区合规、规范达标,可发布。
根据原始作者 秦始黄 https://bbs1.org/topic/330 改编而来。
- 安全:良好,无高危问题;
版本 1.1.3 更新:
修复:把用户组保存循环改为遍历 groups_cache()(与板块一致)。根因已确认:用户组保存循环遍历的是 $_POST['group_rules'],而勾选"永久不限制"时分钟输入框会被前端禁用(disabled 的 input 不随表单提交),导致该组数据根本不进入循环、-1 从未被保存,刷新后开关复位。
板块保存循环遍历的是 forums_cache()(所有板块),所以板块正常;两组逻辑不对称就是 Bug 根源。
修复:把用户组保存循环改为遍历 groups_cache()(与板块一致)。
🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)
插件:帖子编辑时限 · 增强(post_edit_time_plus)v1.1.3
结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。
版本 1.2.0 更新:
Fixed
- 修复发帖时间悬停 tooltip 与 meta 模式"最后编辑"标记静默失效:原实现匹配
<div class="post-meta"><span>纯文本</span></div>结构,而核心详情页 post-meta 内实际渲染用户组/UID 标签(嵌套 HTML),发帖时间位于 post-info 内的<span class="post-time">。现改为匹配 post-time span 并在其上包裹 tooltip(保留 post-time class 以继承核心样式),meta 模式编辑标记随其后内联展示。 - 删除 after_render 中对
$ctx['notification']的判断(死条件):通知渲染走独立的 notification_row_html,不触发 topic/reply.after_render,该 ctx 键不存在。
Changed
- JS 编辑表单标记清理改用官方 data-slot 插槽定位(
[data-slot~="topic.form_extra"]/[data-slot~="reply.form_extra"]),不再依赖核心 class.topic-form-panel/.reply-edit-panel,对核心表单结构微调更稳健。 - JS 编辑按钮点击拦截改为纯属性选择器
a[data-post-edit-time-plus-edit](该属性仅由本插件注入),去掉对核心icon-action icon-editclass 的依赖。 app.boot回调补齐 fire 规范要求的(value, ctx)双参签名(原零参声明运行时被忽略不崩溃,但不符合回调签名规范)。
- 修复发帖时间悬停 tooltip 与 meta 模式"最后编辑"标记静默失效:原实现匹配
版本 1.2.1 更新:
Changed
- app.boot 预热精简为仅预热插件配置(plugin_config → plugins() 运行时缓存 → settings_cache,零额外 DB 读);当前用户组 ID 与 route_url 设置层预热收敛到 topic.replies 预加载钩子(仅主题页付出且与页面固有读取重合),登录页、后台等与帖子渲染无关的页面不再为本插件承担固定 DB 读开销。
- after_render 兜底标记剥离增加 str_contains 短路:绝大多数帖子无编辑标记(保存路径已清洗),纯字符串搜索未命中即跳过正则执行,降低渲染循环固定开销。


