docs(task13): 补齐 meeting/notify API 文档 + Playwright UI 回归结果
## API 文档(Task 13 前漏补) - docs/api/frontend/meeting.md §9 邀请用户接口:展开 extra 8 字段清单 (room_code / room_title / has_password / invite_token / inviter_id / inviter_name / inviter_avatar / expired_at),并说明前端如何据 expired_at 判过期 - docs/api/frontend/meeting.md 后续任务关联:Task 13 标 ✅ + deep-link 路径 - docs/api/frontend/notify.md 概览: * "支持内联按钮的通知类型" 表(friend_request / meeting_invite) * "meeting_invite 专用 extra 字段" 详细清单 ## Playwright UI 回归结果(2026-04-23 补做) 采用 "A 侧 curl 邀请 + B 侧 Playwright 登录" 策略: - testuser1 邀请 testuser2 → 通知中心渲染 meeting_invite 卡片 - 新邀请卡片 → 双按钮「立即加入 / 稍后」✅ - 过期邀请卡片 → 合并为单 disabled「邀请已过期」按钮 ✅ - 点「立即加入」→ 跳 /pages/meeting/preview?mode=join&code=516-162-828 ✅ - preview 页正确渲染 "即将加入会议 516-162-828" + 设备面板 ✅ - 截图:task13-notify-meeting-invite-cards.png task13-preview-page-after-invite-accept.png - CURRENT_STATUS.md + implementation.plan.md 已同步补录 Made-with: Cursor
This commit is contained in:
@@ -281,7 +281,13 @@
|
||||
**行为**:对每个 invitee:
|
||||
1. 若该用户已在本会议活跃 → 跳过;
|
||||
2. 生成 32 位十六进制 Token 写 Redis key `echo:meeting:invite:{token}`,TTL 600 秒(`MeetingInviteTokenTTL`),value = `{"room_code","inviter_id","invitee_id","has_password"}`;
|
||||
3. 通过 Phase 2e-1 `notify.Pusher.PushBatch` 推送 `type=meeting_invite` 通知,`Extra` 含 `room_code / room_title / has_password / invite_token`;
|
||||
3. 通过 Phase 2e-1 `notify.Pusher.PushBatch` 推送 `type=meeting_invite` 通知,`Extra`(Phase 2e-2 Task 13 完整版)包含以下字段:
|
||||
- `room_code`:9 位会议号 `XXX-XXX-XXX`,前端跳 preview 页使用
|
||||
- `room_title`:房间标题,卡片展示
|
||||
- `has_password`:是否有密码,前端据此决定是否在 preview 页弹密码输入
|
||||
- `invite_token`:32 位 hex token,可用于兑换接口快速拉取 room_code
|
||||
- `inviter_id` / `inviter_name` / `inviter_avatar`:邀请人展示字段,卡片左上角头像 + "XX 邀请你加入..." 文案来源
|
||||
- `expired_at`:Unix 秒,与 Redis TTL 同步;前端用 `expired_at * 1000 < Date.now()` 判断过期并灰显按钮
|
||||
4. 离线被邀请者走通知入库,上线后由 WS 或未读轮询获得。
|
||||
|
||||
**响应 `200 OK`**
|
||||
@@ -683,4 +689,4 @@
|
||||
## 后续任务关联
|
||||
|
||||
- **Task 9**:Vue 前端 mediasoup-client 接入,按本文 WS 契约实现 `mediasoup.Transport` 的 `connect / produce` 回调;补齐 `ResumeConsumer`(Node REST 已就绪)或在 Go 侧改为创建 Consumer 后自动 resume;需处理 `meeting.host.changed` 的 `auto_reason` 字段以在 UI 上标注"自动转让"。
|
||||
- **Task 13**:通知卡片 UI 补齐 `meeting_invite` 内联按钮。
|
||||
- **Task 13 ✅(2026-04-23)**:通知卡片 UI 已完成内联按钮("立即加入 / 稍后"),点击"立即加入"跳 `/pages/meeting/preview?mode=join&code=xxx` 由 preview 页走 `/rooms/:code/join`;过期态由 `extra.expired_at * 1000 < Date.now()` 判定并合并为单个 disabled 的"邀请已过期"按钮,不再发起任何请求。
|
||||
|
||||
@@ -15,10 +15,34 @@
|
||||
| 好友 | `friend_request` / `friend_accepted` / `friend_rejected` | contact |
|
||||
| 群聊 | `group_invite` / `group_join_request` / `group_join_approved` / `group_join_rejected` / `group_kicked` / `group_role_changed` | group |
|
||||
| 系统 | `system_broadcast` | admin 广播 |
|
||||
| 会议 | `meeting_invite` / `meeting_reminder` | meeting(Phase 2e-2/2e-3 接入) |
|
||||
| 会议 | `meeting_invite`(Phase 2e-2 已接入) / `meeting_reminder`(Phase 2e-3 预约会议接入) | meeting |
|
||||
|
||||
> 通知持久化在 `notify_notifications` 表,每条通知对应单个接收者;30 天前的已读通知由后台定时任务自动清理,未读通知永久保留。
|
||||
|
||||
### 支持内联按钮的通知类型
|
||||
|
||||
以下 type 在 `NotifyItem.vue` 会渲染"接受 / 拒绝"双按钮(文案因 type 而异),其余 type 仅展示点击跳转:
|
||||
|
||||
| type | 接受按钮 | 拒绝按钮 | 过期态 |
|
||||
|---|---|---|---|
|
||||
| `friend_request` | 同意 | 拒绝 | 无 |
|
||||
| `meeting_invite` | 立即加入 | 稍后 | ✅ 过期合并为单个 disabled 按钮"邀请已过期",由 `extra.expired_at * 1000 < Date.now()` 判定 |
|
||||
|
||||
前端常量见 `frontend/src/constants/notify.js#NOTIFY_INLINE_ACTION_LABEL`。
|
||||
|
||||
### `meeting_invite` 专用 extra 字段(Phase 2e-2 Task 13)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|---|---|---|
|
||||
| `room_code` | string | 9 位会议号 `XXX-XXX-XXX`,前端跳 preview 页使用 |
|
||||
| `room_title` | string | 房间标题,用于卡片正文 |
|
||||
| `has_password` | boolean | 是否需要密码,前端在 preview 页决定是否弹密码输入框 |
|
||||
| `invite_token` | string | 32 位 hex token,可选使用 `/meeting/invite-tokens/:token/redeem` 兑换 |
|
||||
| `inviter_id` | int64 | 邀请人用户 ID |
|
||||
| `inviter_name` | string | 邀请人昵称,用于卡片头部"XX 邀请你加入..." |
|
||||
| `inviter_avatar` | string | 邀请人头像 URL |
|
||||
| `expired_at` | int64 | Unix 秒,与 Redis `echo:meeting:invite:{token}` TTL(600s)同步,前端据此灰显按钮 |
|
||||
|
||||
---
|
||||
|
||||
## 接口列表
|
||||
|
||||
Reference in New Issue
Block a user