XIUNOX 更新记录贴 202600711

管理
  • [缓存失效] 修复审核通过回复时未调用 post_list_cache_bump_version($tid) 导致帖子详情页回帖列表 60s 缓存不刷新

    • 影响: AuditService::approve() post 分支 + batch_approve('post')

    • 必测: 后台审核通过单条回复 → 前台帖子详情页立即显示该回复;批量审核通过多条回复 → 全部立即显示

    • 回归: 帖子审核通过(thread 类型)→ 首页/版块列表立即显示

  • [逻辑错误] 修复 admin.func.php 中 flash_msg 被 rawurlencode 导致双重编码乱码

    • 根因: admin.func.php:11 对 $msg 做了 rawurlencode,PHP setcookie 内部又自动 urlencode,导致双重编码;前端只 decodeURIComponent 一次,剩一层编码显示为 %E7%AE%A1... 乱码

    • 修复: admin.func.php 去掉 rawurlencode(与 misc.func.php 保持一致,PHP setcookie 自动 urlencode 一次,前端 decodeURIComponent 一次正好抵消)

    • 必测: 后台设备切换(PC↔手机/换浏览器)触发重新登录 → toast 显示「管理登陆令牌失效,请重新登录」中文正常

    • 回归: 前台任何操作触发 flash cookie 提示 → toast 显示中文正常

  • [逻辑错误] ai_reply 规则1 优化:帖子在白名单版块 且 触发者用户组在白名单中才触发(AND 逻辑)

    • 新增 trigger_gids 用户组白名单配置项(空=不通过此条件触发,与版块白名单语义一致)

    • 新增 isWhitelistGroup() 方法,checkTrigger() 规则1 改为版块白名单 AND 用户组白名单

    • 后台设置页新增用户组白名单多选下拉

    • 三套语言包同步更新(zh-cn/zh-tw/en-us)

    • 必测: admin/?ai_reply-base.htm → 触发规则表单 → 选择版块白名单+用户组白名单 → 仅选中用户组的访问者触发 AI 回复

    • 回归: 不选用户组白名单 → 规则1 不触发(仅 @ 关键词可触发);选择用户组白名单 → 对应访问者触发

  • [文档撰写] 新增产品宣传向技术博客《全局变量撑起的世界:Xiuno 4.0.4 工程治理的全面缺失》(articles/09_engineering_governance.md),覆盖7条工程治理缺陷与XIUNOX修复对照(4已修复+3部分修复,如实说明)

  • [XSS风险] showToast 从 xiuno.js 迁移至 xiuno-modern.js(global.showToast → XN.toast)

    • 根因: 旧版 xiuno.js:2007 showToast 用 innerHTML 直接拼接 message,有 XSS 风险 + cookie 双重编码导致中文乱码

    • 修复: xiuno-modern.js 新增 global.showToast(指向 XN.toast,用 escapeHtml 转义),xiuno.js 删除旧版 showToast

    • type 兼容: error → danger 映射(旧版用 error,Bootstrap toast 用 danger)

    • 影响: 后台 100+ 处 showToast() 调用全部自动走新版,无需逐个修改

    • 必测: 后台任何操作触发 toast 提示 → 中文正常显示无乱码(含设备切换登录提示)

    • 回归: 前台 toast 提示正常;xnx_feeds/xnx_icon 等插件内部局部 showToast 不受影响

  • [逻辑错误] 修复 esc_js 函数导致 URL 包含 " 字面量引发 404

    • 根因:esc_js 先 json_encode(加双引号包裹)再 htmlspecialchars(把双引号转义为 "),在 script 标签中 " 不被解析为字面量,导致 fetch URL 包含 " 前后缀

    • 影响:xnx_icon 图标加载 404 + 40+ 处 esc_js 调用的中文文本两端带 " 字面量

    • 修复:改为 json_encode 去外层双引号 + 单引号转义 + script 注入防护(JSON_UNESCAPED_SLASHES 避免 / 被转义)

    • 必测: https://xiuno.com/icon 图标加载、xnx_lottery 确认对话框、xnx_magic toast 消息

  • [功能优化] xnx_duel 猜题对决:题库改为无标准答案的趣味题,发起挑战去掉"自定义/题库"双模式,改为题目右侧"随机出题"按钮自动填入可修改

    • 改: preset_questions.php 替换为趣味题(口味争议/生活选择/偏好对立/预测/脑洞,30道)

    • 改: duel_create.htm 去掉模式切换 tab,题目 label 右侧加"随机出题"按钮,题库 JSON 输出供 JS 随机填入 question/option_a/option_b,correct_answer 留空由发起人自选

    • 改: route/duel.php create 页加载全部启用题目(不分页)供随机

    • 改: setting.htm 后台题库管理去掉"正确答案"字段(表单单选+列表列)

    • 改: DuelService addQuestion/updateQuestion correct_answer 不再校验/存储(签名保留兼容)

    • 改: upgrade.php 新增 1.4 块清空旧常识题重导趣味题(幂等 setting xnx_duel_preset_v=2)

    • 改: conf.json 版本 1.3→1.4,install.php INSERT 去掉 correct_answer

    • 改: 三语言包删除 7 个废弃 key(custom_mode/preset_mode 等),新增 random_question/correct_answer_tip

    • 必测: ?duel-create(随机出题按钮、手填、提交)

    • 必测: 后台 ?plugin-setting-xnx_duel#tab-questions(题库增删改无正确答案字段)

    • 回归: ?duel-detail-{id}(应战流程不受影响)

    • 升级: 后台插件列表点"升级"执行 upgrade.php,旧常识题被替换为趣味题

  • [变量未定义] 修复 xnx_dice 模板访问 $settings[odds_number_3] 触发 Undefined array key(PHP 8+ 严格报错)

    • 在模板顶部提取赔率变量做 isset 兜底,替换 10 处直接访问

    • 必测: /dice

  • [逻辑优化] 优化骰子摇动动画:点击后立即开始滚动,不等网络返回

    • CSS dice-roll 改为 0.6s linear infinite 持续滚动

    • JS 在 htmx:config:request 验证通过后立即 startRolling

    • htmx:after:swap 收到结果后计算剩余时间,保证最小 1.2s 滚动时长

    • 网络错误/错误响应时停止滚动恢复初始态

    • 必测: /dice

  • [功能精简] 去掉押单字玩法,只保留押大小

    • 默认押大、默认第一档金币(10)

    • 必测: /dice

  • [逻辑错误] 修复骰子点数总显示 111 的 bug

    • 根因: CSS animation 移除后 transition 无法从最后一帧过渡,骰子重置到默认态

    • 改用 JS setInterval 控制 transform,停止时直接设置目标面 transform + transition 平滑过渡

    • 必测: /dice 多次摇骰子确认点数随机且与结果一致

  • [交互优化] 摇骰子前弹窗确认扣除金币金额

    • 三种语言包同步加 xnx_dice_js_confirm_msg

    • 必测: /dice 点击摇骰子弹出确认框

  • [异步竞态] 修复骰子总显示 111 + 按钮卡在 loading 状态

    • 根因1: confirm() 在 htmx:config:request 中阻塞,干扰 htmx 内部事件流程

    • 根因2: htmx:after:swap 监听在 form 上,但 #dice-result 在 form 外部,事件从 target 冒泡导致 form 监听器不触发

    • 修复: confirm 移到 rollBtn click 事件;htmx 事件监听改到 document 级别用 evt.detail.elt/target.id 判断

    • 必测: /dice 摇骰子确认点数与结果一致,按钮正常恢复

  • [类型误用] 修复搜索图标报错 icon.tags[i].toLowerCase is not a function

    • 根因:icons.json 中 tags 数组含数字类型,数字无 toLowerCase 方法

    • 修复:String(icon.tags[i]).toLowerCase() 强制转字符串

    • 必测: https://xiuno.com/icon 搜索图标

  • [逻辑错误] 背景形状简化:去掉圆形/方形选择,统一用圆角半径控制(0=方形,100=圆形)

    • 影响:icon.htm/icon_generator.js/IconPresetService.php,旧预设 bg_shape 字段向后兼容

    • 必测: https://xiuno.com/icon 圆角滑块调整

  • [逻辑错误] 角标形状从圆形改为三角形(polygon),内容放在三角形重心位置

  • [功能完善] 后台预设管理增加编辑功能(IconPresetService::updatePreset + setting.php edit_preset action + setting.htm 编辑模态框)

  • [语言包不同步] 同步 zh-cn/zh-tw/en-us 三语言包(hook + lang 目录),新增 xnx_icon_edit_preset/xnx_icon_radius_tip 等 key

  • [交互完善] xnx_duel 发起挑战提交前增加扣费确认弹窗,动态显示具体扣除金额(bet_amount),用户确认后才提交

    • 新增 3 语言包 key: xnx_duel_create_confirm_title/msg/ok({unit} PHP 端替换积分类型,{bet} JS 动态填入)

    • duel.js createForm submit 改为 XN.confirm 确认回调后 form.submit();删除 duel_create.htm 内联 submit 兜底避免冲突

    • 必测: duel-create 页面提交表单 → 弹出确认框显示扣除金额 → 取消不提交/确认后提交

  • [组件混用] xnx_duel 全局统一发起挑战按钮图标为 ti-swords(侧栏 $sidebar_btn + 主页主区域 + 创建页提交按钮一致)

    • 必测: duel 主页、duel-create、各页右侧栏发起挑战按钮图标一致

  • [布局优化] dice 页面改为全局左中右三栏布局(col-xl-2/7/3),右侧栏顶部用 sidebar_user_card 展示用户信息

    • 改动: plugin/xnx_dice/route/dice.php 添加 sidebar_ttype/sidebar_stats/sidebar_btn 变量

    • 改动: plugin/xnx_dice/view/htm/dice_index.htm 两栏(col-lg-8/4)→三栏(col-xl-2/7/3),右侧栏 include sidebar_user_card.inc.htm + 玩法说明卡

    • 必测: /dice 页面布局与签到/邀请页面一致

  • [动画优化] 摇骰子动画从 setInterval 随机跳变改为 CSS animation 连续翻滚 + transition 定格

    • 改动: plugin/xnx_dice/static/css/dice.css 添加 @keyframes dice-roll linear infinite,transition 改为 0.8s cubic-bezier

    • 改动: plugin/xnx_dice/static/js/dice.js startRolling 改为只加 rolling 类(CSS animation 接管),stopRolling 改为设置多圈+目标角度的 inline transform(模360=目标角度,结果面必定朝前)

    • 改动: 动画启动时机从 htmx:config:request 移到 click confirm 通过后(避免 htmx 事件未触发导致动画不启动)

    • 必测: /dice 摇骰子,观察翻滚动画流畅且定格面与结果一致

    • 回归: 错误响应(余额不足等)时骰子摇头动画 + toast 提示

  • [类型误用] 修复 xnx_icon 图标搜索时报错 icon.tags[i].toLowerCase is not a function:icons.json 中 75 个图标的 tags 元素为数字类型,新增 normalizeIconsData() 在数据加载时统一转为字符串,从源头消除类型隐患

最新回复

请先登录后再回复 登录

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