• one
    帖子编辑时限 · 增强
    ID post_edit_time_plus版本 1.2.1插件制作者 one免费583 行 / 37.9 KBHook / 后台页
    限制用户修改已发布内容的时间;支持按板块与按用户组设置不同的可编辑时长,板块和用户组可单独设为永久不限制;后台可开关是否显示"最后编辑"标记及其位置,并可设置过期后是否仍显示编辑按钮。
    app/plugins/post_edit_time_plus/plugin.php
    开发日志已有 4 条

    个人独立维护项目。

    • one
      one
      版本 1.2.1 fa8e2f1c3647 更新:### Changed - app.boot 预热精简为仅预热插件配置(plugin_config → plugins() 运行时缓存 → settings_cache,零额外 DB 读);当前用户组 ID 与 route_url 设置层预热收敛到 topic.replies 预加载钩子(仅主题页付出且与页面固有读取重合),登录页、后台等与帖子渲染无关的页面不再为本插件承担固定 DB 读开销。 -release
    • one
      one
      版本 1.2.0 e25c6966edd4 更新:### Fixed - 修复发帖时间悬停 tooltip 与 meta 模式"最后编辑"标记静默失效:原实现匹配 `<div class="post-meta"><span>纯文本</span></div>` 结构,而核心详情页 post-meta 内实际渲染用户组/UID 标签(嵌套 HTML),发帖时间位于 post-info 内的 `<span class="post-time">`。现改为
    • one
      one
      版本 1.1.3 f315fd889a0f 更新:修复:把用户组保存循环改为遍历 groups_cache()(与板块一致)。 根因已确认:用户组保存循环遍历的是 $_POST['group_rules'],而勾选"永久不限制"时分钟输入框会被前端禁用(disabled 的 input 不随表单提交),导致该组数据根本不进入循环、-1 从未被保存,刷新后开关复位。 板块保存循环遍历的是 forums_cache()(所有板块),所以板块正常;两组
    • one
      one
      版本 1.1.1 a6b6ddc6ad91 更新:# 帖子编辑时限 · 增强(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/ass
    主楼
  • 质量报告

    插件质量报告

    插件:post_edit_time_plus

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    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
  • one

    版本 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_render tooltip 解耦发帖时间 tooltip 已无条件注入,独立于 show_meta/show_at 配置,功能闭合。
    🟢版本号1.1.1 已随行为变化(tooltip 解耦、正则加固)提升,合规。
    🟢topic.can_manage对已授权帖子始终返回 true,过期拦截由前端点击 + before_save 兜底,主楼/回复按钮显隐一致,属设计取舍。
    🟢按钮移除正则已加固为否定前瞻限定到首个 </a>,无跨行过度匹配。
    🟢命名/钩子/IIFE/选择器/CSS 变量钩子全为核心原生名、IIFE 具名、CSS/data-* 连字符前缀、选择器收敛于插件根容器、字号/圆角/动效全用核心变量,均合规。
    🟢主楼 preloadtopic.replies 中同时预加载主楼($ctx['topic'])与回复编辑人,红区无遗漏。

    未发现 P0/P1 阻断项。


    四、总体评估

    • 安全:良好,无高危问题;err() 终止语义、全量 h() 转义均正确。
    • 性能:红区调用链(主楼 + 回复)完全零 DB 读,达标。
    • 功能:优先级(板块>用户组>全局)、用户组永久不限、发帖时间 tooltip(无条件可用)、编辑标记、过期按钮拦截等主链路全部正确闭合。
    • 规范:版本号、命名、钩子、IIFE、选择器作用域、CSS 变量化全部达标,无 P0/P1 缺陷。

    结论:插件整体健康、安全达标、红区合规、规范达标,可发布。

    根据原始作者 秦始黄 https://bbs1.org/topic/330 改编而来。

    #2
  • one

    后台及效果图片:
    01.png


    02.png


    03.png

    #3
  • one

    版本 1.1.3 更新:
    修复:把用户组保存循环改为遍历 groups_cache()(与板块一致)。

    根因已确认:用户组保存循环遍历的是 $_POST['group_rules'],而勾选"永久不限制"时分钟输入框会被前端禁用(disabled 的 input 不随表单提交),导致该组数据根本不进入循环、-1 从未被保存,刷新后开关复位。

    板块保存循环遍历的是 forums_cache()(所有板块),所以板块正常;两组逻辑不对称就是 Bug 根源。

    修复:把用户组保存循环改为遍历 groups_cache()(与板块一致)。

    #4
  • 399

    🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)

    插件:帖子编辑时限 · 增强(post_edit_time_plus)v1.1.3

    结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。

    #5
  • one

    版本 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-edit class 的依赖。
    • app.boot 回调补齐 fire 规范要求的 (value, ctx) 双参签名(原零参声明运行时被忽略不崩溃,但不符合回调签名规范)。
    #6
  • one

    版本 1.2.1 更新:

    Changed

    • app.boot 预热精简为仅预热插件配置(plugin_config → plugins() 运行时缓存 → settings_cache,零额外 DB 读);当前用户组 ID 与 route_url 设置层预热收敛到 topic.replies 预加载钩子(仅主题页付出且与页面固有读取重合),登录页、后台等与帖子渲染无关的页面不再为本插件承担固定 DB 读开销。
    • after_render 兜底标记剥离增加 str_contains 短路:绝大多数帖子无编辑标记(保存路径已清洗),纯字符串搜索未命中即跳过正则执行,降低渲染循环固定开销。
    #7

发表回复

登录后回复