XIUNOX 更新记录贴 202600713

管理
  • [逻辑重构] xnx_appcenter 插件从「版块帖子模式」重构为「独立模式」,不再依赖 thread/post

    • 必测: admin/?plugin-setting-xnx_appcenter.htm(设置页应无版块选择,积分类型为多选)

    • 必测: appcenter-list.htm(列表页应正常显示)

    • 必测: appcenter-publish.htm(发布页应支持图标/多截图/下载包上传,价格类型切换)

    • 必测: appcenter-my.htm(我的应用页应正常显示状态徽章)

    • 必测: appcenter-{app_id}.htm(详情页三 Tab:介绍/截图/版本,支持新版本上传和审核)

  • [组件混用] 修复 appcenter_detail.js 使用 htmx 2.x 旧事件名(htmx:afterRequest / htmx:responseError),改为 htmx 4 冒号格式(htmx:after:request / htmx:response:error)

    • 必测: appcenter-{app_id}.htm 详情页添加新版本后表单应清空

  • [配置不同步] 后台设置移除 forum_fid/allow_normal_user/default_credits_type 字段,新增 allowed_credits_types 多选字段;语言包同步补充 16 个缺失键、移除 8 个废弃键

    • 必测: admin/?plugin-setting-xnx_appcenter.htm(积分类型多选保存后应持久化)

  • [变量覆盖] 删除 6 个版块/帖子相关 hook(forum_start.htm/post_ref_thread_after.htm/post_js.htm/thread_create_thread_end.php/model_thread_delete_end.php/attach_assoc_post_start.php),同步更新 conf.json 和 model_inc_file.php(移除已删除的 ChangelogService 引用)

    • 必测: 发帖页不应再出现应用字段;forum-{fid} 版块页不应再跳转

  • [伪静态路径] 路由注册从 {tid} 改为 {app_id},新增 publish/edit/my/version/delete 路由;header_nav_user_menu_before.htm 移除 forum_fid 判断,固定显示入口

    • 必测: appcenter-publish.htm、appcenter-edit-{app_id}.htm、appcenter-my.htm 路由可访问

    • 改动: plugin.func.php plugin_compile_srcfile_callback 增加 token_get_all+TOKEN_PARSE 语法预检,坏 hook 跳过+记日志;拼接前加 // plugin-compile: {dir} 注释用于 fatal error 归因

    • 改动: model.inc.php model.min.php 合并逻辑对插件 model 文件做语法预检,核心 model 信任不检查

    • 改动: admin/index.php 兜底加载插件语言包加 try/catch

    • 改动: lib/PluginApiRegistry.php init() 加 try/catch

    • 改动: lib/ErrorHandler.php handleShutdown 新增 autoDisableCrashedPlugin:从 fatal error 文件路径或 tmp 文件 plugin-compile 注释反推插件目录,1h 内崩溃 3 次自动禁用(写 conf.json+db+清 tmp)

    • 必测: 故意在某插件 hook 文件加语法错误,访问页面应跳过该 hook 不白屏,日志 log/yyyymm/plugin_syntax_error.php 有记录

    • 必测: 故意在某插件 hook 加 fatal error(如调用未定义函数),连续刷新 3 次后该插件应被自动禁用,页面恢复可用

    • 必测: 正常访问首页/帖子详情页/后台,确认无回归

  • [组件混用] 修复评论/回复点赞后数量不显示(_render_like_btn 对 reply/post 上下文误用 badge 属性,而 .like-count 无 CSS ::after 规则,htmx swap 后数量消失;主题左侧栏因 .thread-sidebar-badge 有 ::after 规则正常)

    • 必测: 帖子详情页评论点赞数量变化(PC post 上下文)

    • 必测: 楼中楼回复点赞数量变化(reply 上下文)

    • 回归: 主题左侧栏点赞数量显示(thread 上下文 badge 属性保持不变)

  • [状态不同步] 修复评论/回复点赞后图标颜色与刷新后不一致(_render_like_btn 统一用 text-primary,但 post_list.inc.htm 初始渲染用 text-danger 红心;现按上下文区分:thread=text-primary,reply/post=text-danger,与初始渲染基准一致)

    • 必测: 评论点赞后图标颜色为红色(text-danger),刷新后仍为红色

    • 必测: 回复点赞后图标颜色为红色,刷新后一致

    • 回归: 主题左侧栏点赞图标颜色为主色(text-primary)

  • [功能新增] 内容审核新增「忽略」操作(搁置不处理)

    • 新增 STATUS_IGNORED=3 审核状态:从审核队列移除,内容保持不可见,作者无感知,不通知不积分不计统计

    • AuditService 新增 ignore/batch_ignore/ignore_profile/batch_ignore_profiles 四个方法

    • admin/route/audit.php 新增 ignore/batch_ignore/profile_ignore/profile_batch_ignore 四个路由

    • audit.htm 三个 tab(主题/回帖/资料)均增加单条忽略按钮 + 批量忽略按钮 + JS

    • 三套语言包(zh-cn/zh-tw/en-us)新增 admin_action_ignore 和 admin_batch_ignore 词条

    • 必测: admin/?audit.htm 三个 tab 的单条忽略 + 批量忽略

    • 必测: 验证被忽略内容不出现在待审队列、前台不可见、作者无通知

    • 回归: admin/?audit.htm 通过/驳回操作不受影响

    • 修复: A1 豁免 model_inc_file.php(数组元素片段 hook,非完整 PHP 语句,单独 token_get_all 必报错导致所有 Service 注册被跳过)

    • 修复: A2 改为检查原始插件 model 文件,不是 include() 编译后的 tmp 文件(编译后含 hook 注入片段非完整 PHP,tokenget_all 误报)

    • 修复: B 在 handleException 也调用 autoDisableCrashedPlugin(PHP 7+ undefined function/class 以 Error 异常形式走 handleException 而非 handleShutdown)

    • 测试插件 xnx_crash_test 已删除,tmp 缓存已清理

  • [变量未定义] 修复 error_page() 在系统启动早期调用时因 esc_html/esc_attr 未加载而崩溃,导致 ErrorHandler 走纯文字兜底页面而非系统错误页

    • 改动: model/misc.func.php error_page() 开头用 function_exists 检查,缺失时定义降级版本(降级到 htmlspecialchars)

    • 必测: 插件早期 hook(如 index_inc_start.php)崩溃时,500 页面应显示系统错误页(含导航栏页脚)而非纯文字

    • 回归: 正常 404/403/500 错误页显示不受影响

  • [逻辑错误] 回退 A1 的 PHP hook token_get_all 语法预检,导致插件路由 hook(index_route_case_end.php)被误跳过,插件独立页面 404

    • 根因: 项目存在多种“上下文依赖型”hook 片段(model_inc_file.php 数组元素、index_route_case_end.php switch case),单独 token_get_all 必然误报“unexpected token”,逐一枚举豁免太脆弱

    • 修复: 移除 A1 语法预检逻辑,保留 plugin-compile 注释注入和 lang_* 语言 hook 检查;语法错误的 hook 由 B 部分(autoDisableCrashedPlugin 崩溃计数)兜底

    • 必测: https://xiuno.com/xnx_checkin 等插件独立页面应恢复正常访问

    • 必测: 首页、帖子页、后台等核心页面正常

  • [功能新增] xnx_feeds 插件新增「只展示未看过的动态」开关,解决每次刷新页面都重复弹历史动态的问题

    • 改动: FeedsService::getSettings() 新增 realtime_only 字段(默认 0 兼底)

    • 改动: setting.php/setting.htm 新增开关 UI(form-switch + hint 说明)

    • 改动: footer_js_after.htm feeds_js_data 增加 id 字段;JS 用 localStorage 记忆已展示 feed id(上限 200 条 LRU 淘汰),realtime_only 开启时过滤已展示过的,关闭时保持现状

    • 改动: 三语语言包(zh-cn/zh-tw/en-us)新增 xnx_feeds_settings_realtime_only 和 xnx_feeds_settings_realtime_only_hint

    • 必测: admin/?plugin-setting-xnx_feeds.htm 开关可保存

    • 必测: 开启开关后访问前台,动态弹出后刷新页面应不再重复弹同一条

    • 必测: 关闭开关后行为恢复为每次页面加载弹 N 条历史

    • 回归: 移动端不弹 toast 行为不受影响

xnx_appcenter v1.2.0 功能增强

  • [逻辑错误] 修复 promoteAttach 键不匹配导致图标/截图/下载包关联全部失败

    • 根因:attach-create 返回 aid='_0',session 用整数键 0 存储,promoteAttach 用 '_0' 查数组找不到

    • 必测: appcenter-publish.htm(上传图标、截图、下载包后发布,详情页应正常显示)

    • [边界未校验]

  • [逻辑错误] applicable_version 从自由输入改为下拉选择(1.0/1.1 二选一)

    • 必测: appcenter-publish.htm / appcenter-edit-{app_id}.htm(应显示下拉,限定两个选项)

  • [变量覆盖] developer 字段改为自动获取(从当前登录用户 display_name,回退 username)

    • 必测: appcenter-publish.htm(开发者字段应为只读展示,提交后 app.developer 为当前用户昵称)

  • [组件混用] description 接入 aieditor 富文本编辑器(复用核心 aieditor + attach-create 上传)

    • 新增 static/js/appcenter_desc_editor.js(独立初始化,工具栏含标题/粗斜下划线/列表/链接/图片/代码块/引用/源码)

    • 必测: appcenter-publish.htm(应显示富文本编辑器,可插入图片)

    • 必测: appcenter-{app_id}.htm(详情页介绍应渲染为 HTML,不转义标签)

  • [功能增强] 发布应用加标签(后台预设标签库 + 发布时多选 + 列表页按标签筛选)

    • 新建 xnx_appcenter_app_tag 表(app_id + tag_key,UNIQUE 防重)

    • 8 个默认标签:登录/分享/积分/支付/SEO/社交/媒体/安全

    • 必测: admin/?plugin-setting-xnx_appcenter.htm(应有标签库管理区)

    • 必测: appcenter-publish.htm(应有多选标签 checkbox)

    • 必测: appcenter-list.htm?tag=login(应筛选含 login 标签的应用)

    • 必测: appcenter-{app_id}.htm(详情页应显示标签 badge,可点击筛选)

  • [功能增强] 开发者资料页(新建 xnx_appcenter_developer 表)

    • 路由 appcenter-developer?uid={uid}(主页:头像/名称/品牌前缀/统计/介绍/联系方式/应用列表)

    • 路由 appcenter-developer-edit(GET/POST 编辑资料:介绍/联系方式/品牌前缀)

    • 品牌前缀正则校验 ^[a-zA-Z0-9_]{1,20}$

    • 详情页开发者名可点击跳转到开发者主页

    • 我的应用页加入开发者资料编辑/主页入口

    • 必测: appcenter-developer?uid=1(管理员主页应显示统计+应用列表)

    • 必测: appcenter-developer-edit.htm(应可保存资料)

    • 必测: appcenter-{app_id}.htm(开发者名应可点击跳转)

  • [功能增强] 我的购买记录页(路由 appcenter-purchases)

    • PurchaseService::getUserPurchases(JOIN app 表取应用信息)

    • 必测: appcenter-purchases.htm(已购买应用应显示,含下载按钮)

  • [配置不同步] 升级版本号至 1.2.0,需在后台执行 upgrade.php 建表 + 写默认标签库

    • 必测: admin/?plugin-list.htm(xnx_appcenter 应显示「需升级」徽章)

  • [功能优化] xiuno-modern.js 添加浏览器控制台版本标识输出(带渐变样式),版本号从 version.php 单一来源注入

    • 必测: 任意前台页面 F12 控制台查看输出

  • [链接更新] 前台/后台底部版权链接及 LICENSE 由 xiunox.org 改为 github.com/domidesign/xiunox

    • 必测: 前台页脚、后台页脚、LICENSE 文件

  • [配置不同步] 修复健康检查页 EdgeOne 检测逻辑:原读取错误的 setting key(xnx_edgeone_config)和字段名(domain),且读取不存在的 conf.php;改为检测启用状态(enabled+cdn_domain),与 EdgeOneService::isEnabled() 逻辑一致

    • 必测: admin/?health.htm

    • 回归: plugin/xnx_edgeone/setting.htm 保存设置后刷新健康检查页 [语言包不同步] 同步 zh-cn/zh-tw/en-us 三语言包 admin_hc_edgeone_no_domain 文案为「已安装但未启用」

  • [SQL N+1] 修复首页帖子列表 bbs_xnx_hidden 逐条 COUNT 查询(20次→1次)

    • 新增 HiddenService::preloadThreadHasHidden() 批量预加载方法

    • 新增 model_thread_find_preload.php hook 在 thread_find 中批量预加载

    • 必测: 首页(检查隐藏内容图标正常显示)

  • [SQL N+1] 修复帖子详情页楼中楼回复点赞状态逐条查询

    • route/thread.php 在 post_format 前批量预加载 post_like 状态

    • 必测: 帖子详情页楼中楼点赞按钮状态正确

  • [SQL N+1] 修复帖子详情页楼中楼回复隐藏内容逐条查询

    • 新增 HiddenService::preloadHiddenByPostIds() 批量预加载方法

    • 必测: 帖子详情页隐藏内容正常渲染(已授权/未授权)

  • [SQL N+1] 修复 post__read 重复查询同一 pid(如 firstpid 被查3次)

    • post__read 添加请求级全局缓存,post__update/post__delete 自动清除

    • 必测: 帖子详情页回复后帖子数据更新正常

  • [逻辑错误] 调整审核「忽略」功能语义:忽略后仍保留在审核列表中供后续通过/拒绝,仅从不计入未审核数量

    • 改动: AuditService::get_pending_list() 查询条件从 audit_status=0 改为 IN (0,3)(待审+已忽略)

    • 改动: user_profile_audit_find_pending() 同步改为 IN (0,3)

    • 改动: approve_profile/reject_profile 状态检查放宽,允许对已忽略(3)的记录操作

    • 改动: approve_profile avatar 处理,临时文件不存在时跳过 user_update(被忽略时已清理临时文件)

    • 改动: audit.htm 三个 tab 已忽略记录标题后加「已忽略」badge 标记

    • 改动: 三语语言包新增 admin_status_ignored

    • 必测: admin/?audit.htm#threads 忽略后记录仍在列表,badge 数量减少,可继续点通过/拒绝

    • 必测: admin/?audit.htm#comments 同上

    • 必测: admin/?audit.htm#profiles 同上

  • [缓存失效] 修复 xnx_maintenance 插件 install.php 缺少 model.min.php 清理导致 DEBUG=0 环境设置页 500

    • 根因:model.min.php 只在不存在时才重新生成,install.php 执行场景不触发启用流程的缓存清理,旧缓存不含 MaintenanceService 类

    • 修复:install.php 末尾追加 @xn_unlink($conf[\x27tmp_path\x27].\x27model.min.php\x27);

    • 必测: 后台卸载后重新安装 xnx_maintenance,访问 admin/?plugin-setting-xnx_maintenance.htm

    • 回归: admin/?plugin-list.htm

  • [语言包不同步] 修复 xnx_verify 插件多处语言包缺失与硬编码中文:credits_event_xnx_verify_apply 未定义(积分日志显示原始 key)、VerifyService 24 处硬编码消息、5 处通知文案、route/verify.php deduct_tip 传入原始 credits/golds/rmbs 未翻译

    • 改动: zh-cn/zh-tw/en-us 三个 lang hook 新增 credits_event_xnx_verify_apply + 14 个 Service 消息 key + 5 个通知 key(共 20 项/语言)

    • 改动: VerifyService.php 所有 return message 与 notify_create 改为 lang() 调用;可复用已有 xnx_verify_invalid_type/xnx_verify_already_verified/xnx_verify_cooldown_remaining/xnx_verify_reason_required

    • 改动: route/verify.php:46 仿 my_action_before.php 写法,将 deduct_type 翻译为 $conf[xxx_name] 优先、回退 lang()

    • 必测: my-verify.htm 申请页扣除提示应显示「积分 100」而非「credits 100」

    • 必测: 后台 admin/?log-credits.htm 查看认证申请扣积分记录,事件列应显示「认证申请」而非 xnx_verify_apply

    • 必测: 后台 admin/?plugin-setting-xnx_verify.htm 通过/驳回/撤销/手动认证操作,toast 文案与通知中心文案在 zh-cn/zh-tw/en-us 下均正确

  • [变量未定义] 修复 xnx_verify 已认证用户列表使用 username 而非 display_name(违反项目硬约束)

    • 改动: hook/my_action_before.php:89 user_read_cache 后优先取 display_name,回退 username

    • 必测: my-verify.htm?subtab=verified 已认证列表显示昵称(昵称为空时回退 username)

    • 回归: admin/?plugin-setting-xnx_verify.htm 已认证列表(setting.php 已是正确写法,未改)

  • [逻辑错误] 修复搜索功能4个问题:①特殊符号搜索被屏蔽(_d 搜不到 _docs.zip)②搜索最小字符数硬编码 ③英文关键词搜索不准(Phpstorm 误匹配)④搜索结果关键词高亮漏出 标签代码

    • 根因1: LIKE 查询未转义 和 % 通配符,搜 d 时 _ 被当单字符通配符导致匹配范围爆炸

    • 根因2: search.php 硬编码 mb_strlen < 2,改为从 SecurityConfigService 读取 security_search_min_length 配置

    • 根因3: FULLTEXT+ngram 对英文分词不友好(Phpstorm 被切成 Ph/hp/ps/to 等片段误匹配),纯 ASCII 关键词改为跳过 FULLTEXT 直接走 LIKE 精确子串匹配

    • 根因4: thread_format 已对 subject 做 esc_html,search.php 用未转义关键词 str_ireplace 后再被模板 esc_html 二次转义,导致 标签被转义成 <mark> 显示为字面文本

    • 必测: 搜索 d 能找到含 docs.zip 的帖子;搜索 PhpStorm 只返回真正包含该词的帖子;搜索结果关键词高亮正常显示黄色背景无 文本;后台安全设置-操作频率限制可配置搜索最小字符数

    • 回归: 搜索中文关键词仍走 FULLTEXT 正常;搜索建议(suggest)和编辑器引用搜索(ref_suggest)正常

  • [语言包不同步] 新增 security_search_min_length 配置项及 admin_search_min_length_label/tip_search_min_length_desc 三语语言包;keyword_too_short 改为带 {min} 占位符支持动态字符数

  • [组件混用] xnx_checkin install.php 自愈代码迁移到 upgrade.php 幂等迁移(mood/ip 字段 + 5 索引 uid_date/checkin_date/uid/total_days/continuous_days),conf.json version 1.0.0→1.0.1

    • 必测: admin/?plugin-install-xnx_checkin.htm(全新安装建表+配置正常)

    • 必测: admin/?plugin-upgrade-xnx_checkin.htm(老库升级补字段+索引,重复执行不报错)

    • 回归: plugin/xnx_checkin/route/ 签到功能正常

  • [状态不同步] xnx_tag 插件 install.php 自愈代码迁移到 upgrade.php 机制

    • 移除: install.php 中 featured 字段的 SHOW COLUMNS + ALTER TABLE 自愈段

    • 新建: upgrade.php 幂等迁移 featured 字段(SHOW COLUMNS LIKE 检查)

    • 递增: conf.json version 1.0.0 -> 1.0.1

    • 补充: install.php / upgrade.php 末尾均添加 model.min.php 清理代码

  • [配置不同步] 前后台使用说明文档迁移到 xiunobbs-master/docs/userguide/ 并按当前代码同步

    • 迁移: docs/frontend-guide.md 与 docs/backend-guide.md -> xiunobbs-master/docs/userguide/(原文件已删除)

    • 改动: 后台 1.3 AI 设置拆分为4个子模块(providers/features/editor/logs),AI 预设服务商更新为 OpenAI/DeepSeek/智谱/Kimi/通义(移除 Gitee AI/讯飞/百度)

    • 改动: 后台第七节安全拆分为7.1-7.4独立页面(post_limit/account/content/other),原 security-protection.htm 已301重定向

    • 改动: 后台删除第五节友情链接(已插件化为 plugin/xnx_friendlink/),新增第五节内容审核(audit.htm 一级菜单)

    • 改动: 后台新增6.6用户封禁日志、7.7封禁用户列表、3.3帖子回收站、9.4在线升级、9.5系统健康检查、12.1 API设置

    • 改动: 前台个人中心导航补充为10项3组(新增积分规则/我的等级/我的主题/我的关注)

    • 改动: 前台新增6.10我的等级、6.11我的关注、7.7审核操作、8.5封禁提示页

    • 改动: 前台附录 Prism.js -> highlight.js(仅帖子详情页加载)

    • 校正: 后台13.2插件管理路径 plugin-local.htm -> plugin-list.htm

  • [配置不同步] 插件开发文档 01-architecture.md 修订:补全 model.min.php 合并加载机制、_include() 不比较 mtime 警告、min.php 同步规则、unstall 拼写修正、xn_safe_io.php 注入函数清单

    • SubTask 3.1: section 4 新增「model.min.php 合并加载机制」小节(生产环境合并加载/不比较 mtime/插件 model 语法预检/ParseError 跳过记日志/plugin_clear_tmp_dir 关系)

    • SubTask 3.2: section 3 补 _include() 不比较 mtime 警告(编译缓存命名规则/批量清理命令/DEBUG>1 强制重编译)

    • SubTask 3.3: model.min.php 章节补 min.php 同步规则(高频违规已违反 2 次)

    • SubTask 3.4: section 5 unstall 章节标题改 uninstall,补函数名 plugin_unstall() 历史遗留说明 + 新插件禁止用 unstall.php

    • SubTask 3.5: section 5 新增「xn_safe_io.php 注入的安全 IO 函数」小节(5 个 xn_safe_* 函数清单)

    • 文档行数: 217 -> 260

  • [功能完善] xnx_dice 摇骰子插件右侧栏新增「最近中奖」滚动卡片

    • 新增 DiceService::getRecentWins() 查询全站最近 10 条中奖记录(is_win=1),缓存 60 秒,play() 后自动失效

    • dice_index.htm 在盈亏排行榜与玩法说明之间插入新卡片,结构参考首页公告(.dice-wins-scroll > .dice-wins-scroll-inner > .dice-wins-item)

    • dice.js 用 anime.js v4 API(animate/set)实现上下滚动,单条 2.4rem,3 秒间隔,到末尾回到 0

    • 三语言包新增 xnx_dice_recent_wins_title / xnx_dice_recent_wins_empty

    • 必测: /dice 页面右侧栏滚动效果、空数据展示、单条数据不滚动

    • 回归: /dice 投注流程、盈亏排行榜、htmx boost 导航后滚动重新初始化

  • [功能完善] xnx_lottery 侧边栏抽奖卡片下方新增最近中奖记录

    • 新增 LotteryService::getRecentSidebarWinners() 查询 source=sidebar 的最近 5 条中奖记录,附用户信息(display_name)和格式化奖品名(formatPrizeName)

    • hook index_site_brief_after.htm 用 cache_get/cache_set 缓存 60 秒避免每次首页请求查表

    • lottery_sidebar.htm 抽奖卡片与弹窗之间插入中奖记录区域,无卡片框,每条一行:[xs头像] [昵称] 抽中 [奖品名]

    • 三语言包新增 xnx_lottery_recent_winners_title / xnx_lottery_recent_winners_won

    • 必测: 首页侧边栏有中奖记录时显示、无记录时不显示该区域

    • 回归: 侧边栏抽奖流程、抽奖弹窗、后台中奖记录

  • [语言包不同步] 修复 xnx_dice 积分日志显示原始键 lang[credits_event_xnx_dice_bet/win]

    • 原因: DiceService 传入事件类型 xnx_dice_bet/xnx_dice_win,但三语言 hook 未定义 credits_event_* 键

    • 修复: hook/lang_zh_cn_bbs.php、lang_zh_tw_bbs.php、lang_en_us_bbs.php 补齐两个键

    • 必测: 用户中心-积分日志,摇骰子押注/中奖记录应显示翻译文案而非 lang[...]

    • 已清 tmp/lang_zh-cn_bbs.php 编译缓存

  • [功能增强] xnx_lottery 侧边栏抽奖卡片底部新增「中奖榜」垂直滚动区域,展示「恭喜 xxx 抽中 xxx」

    • 新增 LotteryService::getRecentWinners() 方法,取最近 10 条中奖记录(含帖子+侧边栏来源),缓存 5 分钟

    • 复用首页公告 announcement-scroll CSS + anime 动画,垂直上下滚动一项后回环

    • 用户名使用 display_name(遵守显示名规范),奖品名通过 formatPrizeName 格式化

    • 三语语言包同步新增:中奖榜/恭喜/抽中

    • 必测: 首页右侧栏抽奖卡片下方滚动效果

    • 必测: 有中奖记录时正常滚动,无记录时不显示该区域

    • 必测: HTMX boost 导航后滚动重新初始化

    • 修复: user_find_by_uids 接收逗号分隔字符串而非数组(首次实现误传数组导致 trim() 报错) [类型误用]

  • [逻辑错误] 修复 xnx_dice 侧栏第 4 项 label/value 不匹配(label 显示积分类型名如「金币」,value 显示今日剩余次数)

    • 原因: route/dice.php sidebar_stats 第 4 项 label 误用 $credits_type_name

    • 修复: label 改用 lang(xnx_dice_today_remaining),删除未使用的 $credits_type_name 计算块

    • 语言包: 三语言 hook 补齐 xnx_dice_today_remaining 键

    • 必测: /dice.html 右侧第 4 项应显示「今日剩余 N」(不限时为 -1)

    • 已清 tmp/lang_zh-cn_bbs.php 和 tmp/plugin_xnx_dice_route_dice.php 编译缓存

  • [语言包不同步] 修复 xnx_lottery 新增的「中奖榜」3 个语言键未在 hook/lang_*_bbs.php 注册导致 lang() 返回字面量

    • 根因: 插件有两套语言包,lang/.php(数组 return)+ hook/lang__bbs.php(lang[key]赋值,编译期合并到lang/zhcn/bbs.phphook标记处)。首次只改了lang/没改hook/,lang()实际读取hook/编译后的全局lang,未生效

    • 修复: hook/lang_zh_cn_bbs.php / lang_zh_tw_bbs.php / lang_en_us_bbs.php 三文件同步补齐 xnx_lottery_sidebar_winners_title / winner_congrats / winner_won 三个键

    • 清缓存: tmp/lang_zh-cn_bbs.php(编译后的语言包缓存,_include 不比较 mtime)

    • 必测: 首页侧边栏抽奖卡片底部应显示「中奖榜」徽章而非 lang[xnx_lottery_sidebar_winners_title]

  • [状态不同步] 修复 xnx_dice 投注后 sidebar 中「当前余额」和「今日剩余」未实时更新

    • 原因: route/dice.php play 接口未返回 today_remaining 和 new_balance,dice.js 也未更新 sidebar 中 data-key="balance" 和 data-key="today_remaining" 元素

    • 修复: route/dice.php 返回 data-today-remaining 和 data-balance;dice.js htmx:after:swap 回调追加 sidebar 更新逻辑

    • 必测: /dice.html 投注后右侧 sidebar 4 项数字(今日次数/今日盈亏/当前余额/今日剩余)全部实时变化

    • 已清 tmp/plugin_xnx_dice_route_dice.php 编译缓存

  • [语言包不同步] 修复 xnx_dice JS confirm 提示硬编码「金币」与后台 credits_type 配置不一致

    • 原因: lang xnx_dice_js_confirm_msg 字面量写死「金币/credits」,与后台 credits_type 选项脱节

    • 修复: 三语言 confirm_msg 改为含 {type} 占位符;dice_index.htm 通过 data-credits-type-name 下发 credits_type_name;dice.js 替换 {n} 和 {type}

    • 必测: 后台切换 credits_type(金币/积分/人民币)后,/dice.html 点击摇骰子按钮 confirm 文案显示对应积分类型名

    • 已清 tmp/lang_zh-cn_bbs.php、tmp/plugin_xnx_dice_route_dice.php、tmp/plugin_xnx_dice_view_htm_dice_index.htm 编译缓存

  • [功能增强] xnx_lottery 中奖榜支持后台配置显示来源(帖子/侧边栏多选),去掉 announcement-badge 标签区

    • 新增 defaultSettings.winners_show_sources 默认值 array(thread,sidebar)

    • LotteryService::getRecentWinners(limit,sources) 新增 sources 参数过滤来源

      • 单来源用标量条件,多来源用数组生成 IN 查询

      • 空数组直接返回空(不显示中奖榜)

      • 缓存 key 含 sources 后缀,避免不同设置命中同一缓存

    • 后台基本设置 tab 新增「中奖榜显示来源」多选,setting.php 校验至少保留一项

    • hook/index_site_brief_after.htm 读取设置并传入 getRecentWinners

    • lottery_sidebar.htm 去掉 announcement-badge 标签,滚动区直接显示在 border-top 分隔下方

    • 三语两套语言包(hook/lang__bbs.php + lang/.php)同步新增 xnx_lottery_admin_winners_show_sources / _help

    • 必测: 后台只勾帖子 → 侧边栏中奖榜只滚动帖子来源记录

    • 必测: 全部取消勾选 → 自动回退为全选(避免空数据)

    • 必测: 首页抽奖卡片下方不再显示「中奖榜」蓝色徽章

    • 必测: 滚动区高度仍为 1.8rem,垂直滚动正常

  • [缓存失效] 修复 xnx_dice 每日次数限制因 60s 缓存导致用户可超限参与

    • 原因: DiceService::play() 和 canPlay() 使用 getTodayCount()(60s 缓存)检查 daily_limit,缓存窗口内并发请求都读到旧值,后端不拦截

    • 修复: play() 和 canPlay() 中 daily_limit 检查改用 _computeTodayCount() 直接查 DB(实时),getTodayCount() 仍带缓存用于前端显示

    • 前端: 投注后 today_remaining=0 时禁用摇骰子按钮,title 显示「今日投注次数已达上限」

    • 必测: 设置 daily_limit=3,投注 3 次后按钮应自动禁用;刷新页面按钮仍禁用(canPlay 检查)

    • 已清 tmp/plugin_xnx_dice_model_DiceService.php、route_dice.php、view_htm_dice_index.htm 编译缓存

  • [配置不同步] fileinfo 不可用的虚拟主机无法上传:新增后台开关 security_upload_strict_mime(安全-其他设置-上传限制),默认开启严格模式;关闭后 fileinfo 不可用时图片降级到 getimagesize,非图片仅扩展名校验

    • 新增方法: AttachmentService::verifyUploadMime() 统一入口(service/AttachmentService.php)

    • 替换三处校验: route/attach.php(FormData 上传 + base64 上传)、route/my.php(头像上传)

    • 必测: 后台安全-其他设置开启/关闭开关后分别上传图片/视频/压缩包;虚拟主机环境关闭后可上传

    • 回归: 后台 admin/?security-other.htm 表单保存;上传附件 ?attach-create.htm;头像 ?my-avatar.htm

  • [缓存失效] 优化 xnx_dice 排行榜:摇骰子后实时刷新,无用户摇时仍用 5 分钟缓存

    • 后端: play() 末尾 clearCache() 已清 top_players 缓存,新增 hx-swap-oob 返回新排行榜 UL(#dice-rank-list)

    • 前端: dice_index.htm 排行榜 UL 加 id="dice-rank-list",htmx 投注后自动替换

    • UI: 删除前3名奖牌图标(ti-medal),统一显示数字排名,文字色 text-body-secondary

    • 文案: 「每5分钟更新」改为「实时更新」

    • 重构: 提取 xnx_dice_render_rank_list() 函数,dice_index 和 play 接口共用

    • 必测: /dice.html 投注后右侧排行榜立即更新(自己上榜或盈亏变化),无其他用户时 5 分钟缓存仍生效

    • 已清 tmp/plugin_xnx_dice_route_dice.php、view_htm_dice_index.htm 编译缓存

  • [缓存失效] 修复 xnx_duel 应战答案按钮点击无反应(DuelService 类未加载导致 JS 不加载)

    • 根因:远程 model.min.php 编译缓存陈旧,不含 DuelService 类,class_exists 检查失败导致 duel.js 不加载

    • 修复1:footer_js_after.htm 移除 class_exists 检查,仅用 $route 判断

    • 修复2:route/duel.php 和 setting.php 开头添加自愈逻辑,类不存在时自动删除 model.min.php 并重新加载 model.inc.php

    • 必测: /duel-detail-{id}.html 应战按钮可点击并弹确认框

    • 必测: /admin/?plugin-setting-xnx_duel.htm 设置页正常加载

    • 回归: /duel.html 列表页正常 [缓存失效]

  • [配置不同步] fileinfo 不可用降级方案补齐所有上传入口:统一走 AttachmentService::verifyUploadMime()

    • 内部委托: AttachmentService::validateMime() 改为调用 verifyUploadMime(),uploadImage/uploadVideo/uploadFile 自动生效

    • 核心补齐: api/v1/attach.php(API 上传)、admin/route/forum.php 两处(创建+编辑版块图标)

    • 插件补齐: xnx_landing/setting.php、xnx_medal/setting.php、xnx_ad_selfbuy/route/ad.php

    • 安全修复: xnx_ad_selfbuy 原逻辑 finfo 不可用时直接放行,现统一拒绝/降级

    • 跳过: xnx_oauth/OAuthService.php 使用 finfo_buffer(OAuth 下载头像,非用户上传,不在本次范围)

    • 必测: 后台开关 security_upload_strict_mime 关闭后,分别测试附件上传、头像上传、版块图标上传、API 上传、广告位上传、勋章图标上传、落地页素材上传

    • 回归: 后台 admin/?forum-create.htm / admin/?forum-update-*.htm;插件各设置页上传

  • [逻辑错误] 修复 xnx_duel 应战按钮点击无反应(xnx_feeds fatal error 中断后续 hook)

    • 根因:xnx_feeds 的 footer_js_after.htm hook rank=100 先于 xnx_duel rank=10 执行,xnx_feeds 表不存在导致 fatal error,后续 hook(含 duel.js 加载)全部中断

    • 修复1:xnx_duel conf.json 中 footer_js_after.htm 的 rank 从 10 提高到 200,确保在 xnx_feeds 之前执行

    • 修复2:xnx_feeds footer_js_after.htm 加 try-catch + class_exists 检查,表不存在或 Service 未加载时 return 而非 fatal error

    • 必测: /duel-detail-1.html 应战按钮可点击并弹确认框

    • 回归: 首页 xnx_feeds toast 正常(表存在时) [缓存失效]

最新回复

请先登录后再回复 登录

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