User's LAN test feedback after 10: 1. Tab B 一直 connecting(socket.io CORS / sync 问题) 2. Player 0/1 下拉框和 p0/p1 后缀到底是什么?UI 重复入口 3. 自创房间还能再点"加入 P0"——应隐藏或显示"已在房间" 4. 翻牌后收牌/再翻牌无反应——socket.io 没真连?lastWinner tie? 5. 没删除房间按钮 待修:删老 input、强化 LobbyRoomList、加 DELETE 端点、显示连接状态。
85 lines
4.1 KiB
Markdown
85 lines
4.1 KiB
Markdown
# 11 · 用户测试反馈(LAN 部署第一轮)→ 多个 UX bug
|
||
|
||
## 用户测试反馈(按问题编号)
|
||
|
||
> 这是 10 那轮 commit `1956c23` 之后用户实测发现的问题汇总。
|
||
|
||
### 问题 1:第二个人加入后依然显示 connecting
|
||
|
||
**症状**:Tab A 创建房间 + 加入 P0,Tab B 刷新列表 → 点 "加入 P1" → 房间写入 + UI 切换。但 boardgame.io 的 Client 一直停在 "connecting"(socket.io 握手没完成)。
|
||
|
||
**可能根因**:
|
||
- socket.io 的 CORS 配置可能和 fetch 的 CORS 不一致
|
||
- server 上 `origins` 的 RegExp 列表,socket.io 的 cors 中间件读取方式可能不同
|
||
- 或者 Tab B 的 `credentials` / `matchID` 没正确传递,导致 server `master.onSync` 失败 → 一直 reconnecting
|
||
|
||
**待查**:socket.io 的 `handshake.headers.origin` 和 fetch 的 Origin 头处理方式差异。
|
||
|
||
### 问题 2:UI 困惑 —— `Player0/1` 选择和 `p0/p1` 后缀到底是什么?
|
||
|
||
**现状**:
|
||
- `OnlineConfigBar` 顶部有一个 `Player:` 下拉框(值 `0` / `1`)—— 这是**老版**手动配置入口
|
||
- `LobbyRoomList` 房间列表里显示 `(你: 0)`、`加入 P0`、`加入 P1` 按钮 —— 这是**新版**按钮
|
||
- `LobbyClient.joinMatch` body 里传 `playerName: "${playerName}-${playerID}-xxxx"` —— 这里 playerName 里有 `p0/p1` 后缀
|
||
|
||
**用户困惑点**:老下拉框和新按钮同时存在,自己都不知道该用哪个。
|
||
|
||
**应该做的**:
|
||
- 删掉 `OnlineConfigBar` 的 Player / Secret 输入框(旧的 workaround)
|
||
- 全部走 "加入 P0 / 加入 P1" 按钮
|
||
- 显示当前在哪个房间、哪个 playerID
|
||
|
||
### 问题 3:自己创建的房间还能再次加入?
|
||
|
||
**症状**:用户创建房间(自动 join P0),UI 上 "加入 P0" 按钮**仍然可见**。点击 → server 返回 409。
|
||
|
||
**根因**:用户已经在那个房间了,应该不能再点 "加入 P0"。要么隐藏按钮,要么显示"你已在房间(点此返回)"。
|
||
|
||
**现在行为**:
|
||
- `canJoin0 = !m.players.find((p) => p.id === '0')?.name` —— 自己的房间 P0 已经被自己占了,应该 false
|
||
- 但用户报告按钮还显示 —— 可能 `refresh()` 时机不对,或者 React state 没更新
|
||
|
||
**应该做的**:
|
||
- refresh 时机:onSelect 之后立即 refresh
|
||
- 显示"已在房间"的视觉指示,而不是消失按钮(消失让人困惑)
|
||
|
||
### 问题 4:点击翻牌后系统无法进行下一步
|
||
|
||
**症状**:点击"翻牌"后,pile 显示 1 张。但接下来点"收牌"或者再点"翻牌"**没反应**。
|
||
|
||
**可能根因**:
|
||
- boardgame.io Client 没真正 connected(connecting 状态)→ move 走 socket.io → 失败
|
||
- 或者 move 走了但 server 端 lastWinner 是 tie → collect 不收牌(这个已经在 dev-log 09 修了)
|
||
- 或者 activePlayers 配置不对,导致 player 不能调 move
|
||
|
||
**应该做的**:
|
||
- 显式显示 socket.io 连接状态(connected/connecting/disconnected)
|
||
- disconnected 时按钮 disabled + 提示
|
||
- 翻牌后 lastWinner 是 tie 时,UI 上显示"平局!再翻一张",让用户知道为什么 collect 没反应
|
||
|
||
### 问题 5:没有删除房间按钮
|
||
|
||
**症状**:测试中创建了奇怪的房间(多人创建的、不同账号的)堆积在列表里,没法清理。
|
||
|
||
**应该做的**:
|
||
- 给"自己的房间"加"删除房间"按钮(调 `POST /games/:name/:id/leave` 或者直接 wipe)
|
||
- 或者提供一个"清理所有非活跃房间"按钮(dev 用)
|
||
- 注意:boardgame.io 0.50.2 没有 delete endpoint,要自己加
|
||
|
||
## 后续修复(dev-log 11+)
|
||
|
||
按以下顺序:
|
||
1. **写文档(本文)**
|
||
2. 删 `OnlineConfigBar` 的 Player/Secret 输入框
|
||
3. `LobbyRoomList` 强化:
|
||
- "你已在房间 X (P0)" 视觉指示
|
||
- 自己的房间显示"返回房间"而不是消失按钮
|
||
- 显示 socket.io 连接状态(绿色=connected、黄色=connecting、红色=disconnected)
|
||
4. 加 `POST /games/:name/:id` DELETE 端点(只允许创建者删)
|
||
5. `MillBoard` 也要支持联机模式(目前 MillOnlineView 是简化的,缺连接状态)
|
||
6. 修 activePlayers 配置问题(如有)
|
||
|
||
## 待用户验收
|
||
|
||
- 部署环境:本机 + 局域网其它机器
|
||
- 验收路径:见 10 的验证步骤 + 本文档的问题修复清单 |