精华 XIUNO BBS X版 更新记录贴 20260619

# 2026-06-19 更新日志

## Bug 修复

### 1. 悬浮发帖按钮 URL 错误
- **问题**:版块页面右侧悬浮按钮菜单的发帖链接为 `/thread-create.htm-12`,应为 `/thread-create-12.htm`
- **修复**:`floating_action.inc.htm` 中发帖/回复按钮 URL 拼接改为在 `.htm` 后缀前插入 `-fid`/`-tid`
- **文件**:`view/htm/floating_action.inc.htm`

### 2. 用户回帖页增加帖子标题链接 + 引用样式优化
- **问题**:`user-post` 页面回帖不显示所属帖子标题;引用回复(blockquote)字体过大
- **修复**:
  - `user-post` 路由为每条回帖附加 `thread_subject`,模板显示帖子标题链接
  - blockquote 字体改为 `0.85em`,降低不透明度
- **文件**:`route/user.php`、`view/htm/post_list.inc.htm`、`view/css/bootstrap-bbs.css`

### 3. 帖子列表分页最后一页无数据
- **问题**:帖子列表显示 4 页,点击最后一页无任何帖子
- **根因**:`$totalnum` 使用 `$forum['threads']`/`$_user['posts']`,包含待审帖子,但列表被 `access_filter` 过滤后实际条数更少
- **修复**:
  - `forum.php`、`user.php` 中非管理员计数排除 `audit_status=0` 的待审内容
  - `forum.php` 补充 `thread_list_access_filter` 调用
- **文件**:`route/forum.php`、`route/user.php`

### 4. 积分页面拆分 + 手机端表格宽度修复
- **问题**:积分规则和积分记录在同一页面 Tab 切换;积分规则表格在手机端宽度被压缩
- **修复**:
  - 积分规则独立为 `my-credits_rules` 页面,原 `credits.htm` 改为链接跳转
  - 新增 `credits_rules.htm` 和 `credits_rules_table.inc.htm`(htmx 版块切换)
  - 表格使用 `table-layout: fixed` + 列宽分配解决手机端压缩
  - 侧边栏和移动端导航增加积分规则入口
- **文件**:`route/my.php`、`view/htm/credits.htm`、`view/htm/credits_rules.htm`、`view/htm/credits_rules_table.inc.htm`、`view/htm/my.layout.inc.htm`

### 5. 头像上传页显示限制信息
- **问题**:`my-avatar` 页面未显示后台配置的上传大小/次数限制及剩余次数
- **修复**:
  - 上传区顶部显示:最大尺寸、上传次数、剩余次数(来自后台 `security-other` 设置)
  - 剩余次数为 0 时红色高亮;限制为 0 时显示「不限」
  - 前端文件大小校验改为使用后台配置的 `security_avatar_max_size`(原硬编码 5MB)
- **文件**:`route/my.php`、`view/htm/my_avatar_page.htm`、`lang/zh-cn/bbs_common.php`

### 6. 置顶帖显示逻辑修复
- **问题**:帖子列表模板第99行 `if($_thread['top'] > 0 && !empty($toplist)) continue;` 跳过了所有置顶帖,导致:
  - 首页普通列表不显示版块置顶帖(top=1)
  - 版块页普通列表不显示全局置顶帖(top=3)
- **修复**:收集置顶区已显示的 tid 到 `$_toplist_tids`,普通列表只跳过这些 tid,不再粗暴跳过所有 top>0 的帖子
- **文件**:`view/htm/thread_list.inc.htm`

### 7. 用户信息区块增加 UID 显示 + 统一用户组样式
- **问题**:各处用户信息区块未显示 UID;用户组 badge 样式不统一(`bg-primary` vs `bg-primary bg-opacity-10 text-primary`,font-size 不一致)
- **修复**:
  - 在所有用户名后添加 `#UID` 灰色小字显示
  - 统一用户组 badge 样式为 `bg-primary bg-opacity-10 text-primary`,`font-size:0.6em`
  - 在缺失用户组显示的位置(timeline、masonry、粉丝/关注列表、快速回复区)补充用户组 badge
- **文件**:`view/htm/thread_list.inc.htm`、`view/htm/thread.htm`、`view/htm/post_list.inc.htm`、`view/htm/user_info_card.inc.htm`、`view/htm/my.layout.inc.htm`、`view/htm/thread_list_timeline.inc.htm`、`view/htm/thread_list_masonry.inc.htm`、`view/htm/user_followers.htm`、`view/htm/user_following.htm`、`view/htm/sidebar_right.inc.htm`

## 功能优化

### 帖子详情页评论排序
- **功能**:帖子详情页评论支持三种排序方式切换
  - 正序(时间早→晚,默认)
  - 倒序(时间晚→早,最新评论在前)
  - 热度(按点赞数降序,同点赞数按时间正序)
- **交互**:排序按钮组显示在评论标题右侧;使用 localStorage 记忆用户选择,下次访问自动应用
- **架构调整**:首帖改为单独获取(`post_read`),不参与排序和分页;回帖查询排除首帖(`isfirst=0`),分页计数从 `$thread['posts'] + 1` 改为 `$thread['posts']`
- **文件**:`model/post.func.php`、`route/thread.php`、`view/htm/thread.htm`、`lang/zh-cn/bbs_common.php`

### 帖子详情页右侧目录优化
- **问题**:右侧目录卡片无吸顶,目录项过多时会超过一屏,滚动后无法继续查看目录
- **优化**:目录卡片改为吸顶展示,并限制最大高度,目录内容超出时在卡片内部滚动
- **交互**:页面滚动高亮当前目录项时,自动将高亮项滚动到目录可视区域内

### 8. 移动端 AIEditor 键盘收起后布局/滚动位置无法恢复
- **问题**:移动端使用 AIEditor 时,键盘收起后页面滚动位置错乱、底部残留空白、fixed 的底部 tabbar 不复位
- **根因**:
  - 编辑器内容区强制 `height:calc(100vh - 400px) !important`,iOS 键盘弹起时 `100vh` 不变,内容溢出到键盘下方
  - 底部 tabbar `position:fixed` 在键盘弹起时被推到视觉视口顶部遮挡编辑器,收起后 iOS Safari 不自动复位
  - `body` 的 `padding-bottom:70px` 在键盘弹起时仍存在,加剧错位
  - 缺少视觉视口(visualViewport)监听,无法动态调整布局
- **修复**:
  - 移除编辑器内容区强制固定高度,移动端改用 `min-height` 自适应,桌面端通过媒体查询保留较大高度
  - 新增 `visualViewport.resize` 监听:键盘弹起时给 body 加 `.keyboard-active` 类,隐藏 fixed 的 tabbar 和悬浮按钮并移除 padding-bottom
  - 编辑器 `focusin` 时记录原始滚动位置,键盘收起后多次校准恢复滚动位置(兼容 iOS fixed 元素复位延迟)
  - iOS 键盘弹起期间监听 `visualViewport.scroll`,阻止页面被整体顶离屏幕
- **文件**:`lib/EditorService.php`、`view/css/bootstrap-bbs.css`

### 9. 发帖/回复按钮缺少防抖,快速连点发布重复内容
- **问题**:发帖和快速回复按钮没有防抖,用户快速连点会触发多次 htmx 请求,发布重复的帖子/回复
- **根因**:
  - 发帖页防抖在 `htmx:before:request` 才禁用按钮,此时第一次请求已准备发出,连点第二次仍会触发
  - 快速回复表单完全没有按钮禁用逻辑
  - `htmx:confirm` 是异步的(积分确认弹窗),连点会触发多次 confirm,每次都 issueRequest
- **修复**:
  - 在表单原生 `submit` 事件 capture 阶段立即禁用按钮 + 设置提交标志,第二次 submit 被 preventDefault + stopImmediatePropagation 拦截
  - `htmx:after:request` / `htmx:afterRequest` 恢复按钮和标志
  - 积分确认取消时(onCancel)恢复按钮和标志
- **文件**:`view/htm/post.htm`、`view/htm/thread.htm`
最新回复

请先登录后再回复 登录

uid:1 管理
关注
随遇而安,随缘而行
发帖 40
评论 236
粉丝 9
关注 1
发新帖
目录

扫码手机打开本帖