XIUNOX 更新记录贴 202600709

管理
# 2026-07-09 更新日志

- [逻辑错误] 修复 DuelService::calcFee 从 private static 改为 public static,路由层可调用
  - 必测: /duel-create(发起挑战不再 fatal error)
- [CSRF防护缺失] duel_detail.htm 应战按钮 AJAX 补充全局 CSRF token(CsrfService::input())
  - 必测: /duel-detail-{id} 点击 A/B 应战按钮
- [边界未校验] 新增预置题库管理(后台「题库管理」tab,xnx_duel_question 表)+ 每日参与次数限制(daily_join_limit,默认 5)
  - 必测: admin/?plugin-setting-xnx_duel.htm 题库 CRUD
  - 回归: /duel-detail-{id} 达到每日上限时禁止应战
- [语言包不同步] 三语语言包(zh-cn/zh-tw/en-us)补充 28+ 新 key(题库/每日次数/排行榜/对决结果等)
  - 必测: 切换语言验证无 lang key 裸露
- [组件混用] xnx_duel 全部 6 个前端页面重构为全局三栏布局(参照 xnx_checkin / xnx_invite)
  - 布局: row g-4 + d-none d-xl-block col-xl-2(左栏导航)+ col-xl-7(中栏)+ d-none d-xl-block col-xl-3(右栏)
  - 右栏复用全局 sidebar_user_card.inc.htm 共用组件 + 赢家榜 Top5 + 最近对决历史
  - 样式统一: x-card card / bg-opacity-10 / text-body-secondary / rounded-pill(替换旧 bg-primary-subtle/text-muted/nav-pills)
  - 新增 partial: _duel_sidebar_left.htm / _duel_sidebar_right.htm
  - 必测: /duel(主页)/duel-my/duel-rank/duel-history/duel-create/duel-detail-{id}
  - 回归: duel_create 双模式出题 JS / duel_detail 应战 AJAX 逻辑保留
- [语言包不同步] 补充 xnx_duel_more key(右栏「更多」链接)至三语语言包
  - 必测: /duel 右栏最近历史底部「更多」链接文案正常
- [组件混用] 前端三栏页面 3 处 text-muted 改为 text-body-secondary(duel_index/duel_detail/duel_rank 发起人图标)
  - 必测: /duel 发起人姓名图标颜色与全局一致
- [缓存失效] 清理 plugin_xnx_duel_* 编译缓存 + model.min.php(_include 不比较源文件 mtime)
  - 必测: 访问各 duel 页面无白屏/旧布局残留
- [边界未校验] xnx_duel 内置 36 道二选一题库(常识/科学/地理/历史/互联网/文化/自然,A/B 答案分布约 1:1)
  - 新增: plugin/xnx_duel/preset_questions.php 题库数据文件
  - install.php 末尾插入种子(新装自动填充)
  - upgrade.php 末尾 COUNT==0 才插入(升级用户表空才填充,已有自建题目不覆盖)
  - conf.json 版本 1.2 → 1.3(触发「需升级」提示)
  - 必测: 后台插件列表点升级 → admin/?plugin-setting-xnx_duel.htm 题库管理 tab 可见 36 题
  - 回归: /duel-create 题库选题模式可加载内置题目
- [边界未校验] 修复 uninstall.php 漏 DROP xnx_duel_question 表(卸载残留题库表)
  - 必测: 后台卸载 xnx_duel 后数据库无 xnx_duel_question 残留表

## xnx_status 状态插件修复

- [逻辑错误] 修复状态插件首页右侧"感谢贡献用户"昵称显示"未知"、头像变默认
  - 根因:StatusService::getContributors() 手写 SQL 查询了 user 表不存在的 `avatar_url` 字段(user 表只有 `avatar` int 字段,`avatar_url` 由 user_format() 根据 avatar 动态计算),导致整条 SQL 失败、$userMap 为空,所有贡献者 fallback 到 '未知'+默认头像
  - 修复:改用 user_read_cache() 获取用户信息,复用其静态缓存 + cache_get 缓存层,正确计算 avatar_url,贡献者 ≤20 性能可控
  - 必测: 首页右侧"感谢贡献用户"区块(需开启后台 xnx_status 设置的 show_contributor_widget)
  - 回归: /statusrank 贡献排行页(共用 getContributors 方法)
- [逻辑错误] 修复状态插件后台变更日志筛选显示历史而非当前状态帖子,并新增"状态帖子"tab
  - 根因:logs tab 用 getStatusLog 返回变更历史,filter_status=9 时包含曾经标为状态9但后来又改了的帖子
  - 修复:新增"状态帖子"tab,用 getThreadsByStatus 显示当前状态=该值 的帖子列表,logs tab 保留为变更历史
  - 必测: admin/?xnx_status.htm&tab=thread_status&filter_status=9
  - 回归: admin/?xnx_status.htm&tab=logs (变更历史保持原样)
- [伪静态路径] 修复状态插件后台帖子/用户链接在 admin 下多 admin 前缀
  - 根因:logs/contributors/overview tab 用 thread_url() / url("user-..."),misc.func.php 在 admin 上下文返回 ./ 前缀,浏览器解析为 /admin/thread-xx.htm
  - 修复:改用 frontend_thread_url() / frontend_user_url()(与核心 admin 模板 thread_list.inc.htm、log_audit.htm 等惯例一致)
  - 必测: admin/?xnx_status.htm&tab=logs (帖子链接跳前台)
  - 回归: admin/?xnx_status.htm&tab=contributors、tab=overview (用户链接跳前台)
最新回复

请先登录后再回复 登录

uid:1 管理
关注
随遇而安,随缘而行
发帖 84
评论 346
粉丝 11
关注 1
发新帖
目录
XIUNOX 更新记录贴 202600709