[体验优化] xnx_reward 发帖页悬赏 Tab 实时提示扣除的积分类型名称和积分值
必测: thread/create/0 勾选悬赏 Tab → 修改金额/切换积分类型,提示文本同步更新(如「发布后将扣除 50 金币」)
[Bug修复] xnx_poll 发帖页无法添加/删除投票选项
必测: thread/create/0 点击「投票」Tab 展开 → 点击 + 添加选项按钮 → 新增选项行;点击 - 删除按钮 → 选项行减少(至少保留 2 行)
必测: 填写标题与至少 2 个选项后提交 → 帖子详情页显示投票卡
[缓存失效] 修复启用插件后必须手动到系统工具清缓存否则报 500根因: plugin_clear_tmp_dir() 只清 data 数据缓存,漏清 OPcache。PHP 8 + OPcache(validate_timestamps=1 + revalidate_freq 较大或多 worker)下旧字节码不会自动重载 → 新启用的插件 hook/Service 类不生效 → 调用未定义符号 → 500修复: plugin_clear_tmp_dir() 追加 OPcache 清理(CacheService::clearByType([data, opcache])),与系统工具语义完全对齐必测: 后台插件列表 → 启用任一未启用的插件 → 不访问系统工具清缓存 → 直接前台访问插件功能 → 无 500 错误且插件功能生效
[Bug修复] xnx_hidden 频繁崩溃被自动禁用(违反 hook 禁止 return 规则)根因: thread_js.htm:4 和 header_link_after.htm:3 违规使用 return; 导致宿主模板 header.inc.htm/thread_js.inc.htm 整页中断,触发 1h 内 3 次崩溃自动禁用修复: 改为 if (class_exists + !empty(enabled)) 包裹,并加 class_exists 守卫避免 tmp 缓存陈旧时 Class not found fatal必测: 启用 xnx_hidden 后前台访问首页/版块页/帖子详情页 → 不再崩溃 → 后台插件列表查看插件未被自动禁用
[Bug修复] AdSelfbuyService 类未找到导致首页 500根因: tmp/model.min.php 缓存陈旧时 AdSelfbuyService 未加载,4 个 hook 直接调用导致 Fatal error: Class not found修复: 4 个 hook (index_site_brief_after/forum_mod_after/forum_threadlist_after/thread_user_after) 加 class_exists 守卫必测: 清 tmp/ 缓存后访问首页 → 侧栏广告位正常显示或静默跳过,无 500 错误
[Bug修复] mb_substr null 弃用警告(PHP 8.1+ 兼容)根因: xn_substr 函数无 null 兜底,历史脏数据 post.message 字段为 NULL 时触发 PHP 8.1+ 弃用警告修复: xn_substr 加 null → 空字符串兜底,同步 misc.func.php 和 xiunophp.min.php必测: 访问含 NULL message 字段的帖子详情页 → 无 mb_substr 弃用警告
[日志优化] 删除 ReportService 调试日志(14 处)根因: lib/security/ReportService.php 使用 xn_log(…, report_error) 记录入参/check_duplicate/成功/审核结果等正常流程,文件名含 error 在 DEBUG=0 仍写入,每次举报产生 5 条日志噪音修复: 删除所有调试 xn_log 调用,保留业务逻辑和通知机制必测: 用户举报帖子 → 仅收到举报成功 toast,log/YYYYMM/report_error.php 不再增长
[日志优化] 删除 post_delete 调试日志(10 处)根因: route/post.php 使用 xn_log(…, post_delete_error) 记录 request/post_read result/soft_delete config/执行结果/db state 等调试信息,每次删帖产生 6 条日志噪音修复: 删除所有调试 xn_log 调用及配套的 post__read 探测查询必测: 用户删除回复/帖子 → 仅显示删除成功,log/YYYYMM/post_delete_error.php 不再增长
[日志优化] 删除 xnx_ai_reply 触发日志(8 处)根因: plugin/xnx_ai_reply/hook/thread_info_end.php 每次访问帖子详情页都写 reason=replied/check_fail/triggered 等到 ai_trigger_error,访问量大时日志噪音严重修复: 删除所有 xn_log 调用及配套日志变量,保留触发逻辑必测: 访问帖子详情页 → AI 触发逻辑正常工作,log/YYYYMM/ai_trigger_error.php 不再增长
[日志优化] 修复 xn_copy 失败日志格式 bug根因: model/attach.func.php:330 日志字符串 $file[path] 缺 $ 符号且括号不匹配,输出 xn_copy(Array), …) failed修复: 改用 {$file[\x27path\x27]} 格式,正确输出源文件路径必测: 模拟附件临时文件不存在场景发帖 → 日志输出完整源/目标路径
[缓存失效] 修复 xnx_fields 后台添加分类显示成功但列表不显示根因: FieldsService.php 通过 _include() 加载,_include() 不比较源文件 mtime,tmp/plugin_xnx_fields_model_FieldsService.php 编译缓存陈旧,运行旧代码导致写入数据库后未清缓存修复: 删除 tmp 编译缓存强制重新编译源文件必测: admin/?xnx_fields-category.htm 添加分类 → toast 成功 → 列表立即显示新分类
[稳定性] 修复 bbs_cache.k 字段长度与 CACHE_KEY_MD5_THRESHOLD 不一致导致长键 cache_set 静默失败根因: CACHE_KEY_MD5_THRESHOLD=200 允许长键,但 bbs_cache.k 是 char(32),MySQL STRICT_TRANS_TABLES 模式下超 32 字符的 cache_set 报错失败(如 thread_pl_replies__v = 56 字符),导致帖子回复列表缓存形同虚设,每次访问都重查 DB修复: bbs_cache.k 从 char(32) 扩容为 varchar(255);UpgradeService::upgradeCacheSystem() 追加自动迁移步骤;install.sql 同步更新必测: 访问帖子详情页 → 检查 bbs_cache 表出现 thread_pl_replies* 长键记录
[搜索失效] 修复后台积分日志按用户名搜索无效:原 db_find_one 精确匹配 username 字段,用户输入昵称(如"欧琳")永远搜不到,且单个 uid 模式不支持多用户匹配
必测: admin/?log-credits.htm 输入昵称搜索,应返回该昵称用户的所有积分记录
[路由丢失] 修复邀请插件邀请码/邀请记录搜索 404:setting.htm 表单 action=“” GET 提交会丢弃当前 URL 中的 ?plugin-setting-xnx_invite.htm 路由前缀,导致 URL 变成 /admin/?tab=codes&… 路由解析得到 action=index
必测: admin/?plugin-setting-xnx_invite.htm 切到邀请码/邀请记录 tab,输入搜索条件提交,URL 应保留 plugin-setting-xnx_invite.htm 前缀
