From 59f824ad274b89748cb2b3b92f1b29987ef0eaa7 Mon Sep 17 00:00:00 2001 From: bujinyuan Date: Wed, 22 Apr 2026 14:41:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(phase2e-2):=20=E4=BC=9A=E8=AE=AE=E5=AE=A4?= =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E4=B8=8E=E6=A0=B8=E5=BF=83=20UI=20=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=90=BD=E5=9C=B0=EF=BC=88Task=2011=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增页面: - pages/meeting/room.vue:会议主容器,组装 VideoGrid/Toolbar/MemberPanel/InviteDialog * 顶部条:标题/会议号/复制、连接状态 pill、网络徽标、计时器 * 主区:按成员数自适应网格渲染 VideoTile * 底部:麦/摄/邀请/成员/聊天/挂断工具条 * 离会确认弹窗:主持人可选"结束会议 / 仅自己离开" * onUnload 兜底调用 leave 避免脏状态残留 新增组件(components/meeting/): - VideoTile.vue:原生 video/audio 挂载(H5)+ 名字/静音/主持人/说话者边框 - VideoGrid.vue:1/2/3-4/5-9/10+ 响应式 CSS Grid 布局 - MeetingToolbar.vue:6 按钮工具条,loading 态 + 徽标 - MemberPanel.vue:右侧滑入抽屉,主持人可转让/踢出 - InviteDialog.vue:居中弹窗,一键复制会议号/链接/邀请文案 - NetworkBadge.vue:4 格信号柱,level 0-4 分色 配套改动: - preview.vue:入会成功后跳 /pages/meeting/room?code=xxx(原先指向 debug) - pages.json:注册 room 路由,navigationStyle=custom 隐藏默认导航 - store/meeting.js:remoteConsumers 外层 slot 解除 markRaw,使 slot.audio/slot.video 赋值能驱动 VideoTile 响应式重渲染 验证:Playwright E2E 完成 create → preview → room 全链路 - 视频块、会议号、连接状态、计时器、工具条渲染正确 - 邀请弹窗、成员抽屉、静音切换、离会确认均工作正常 Made-with: Cursor --- .../src/components/meeting/InviteDialog.vue | 319 +++++++++ .../src/components/meeting/MeetingToolbar.vue | 193 ++++++ .../src/components/meeting/MemberPanel.vue | 336 +++++++++ .../src/components/meeting/NetworkBadge.vue | 75 ++ frontend/src/components/meeting/VideoGrid.vue | 100 +++ frontend/src/components/meeting/VideoTile.vue | 273 ++++++++ frontend/src/pages.json | 7 + frontend/src/pages/meeting/preview.vue | 7 +- frontend/src/pages/meeting/room.vue | 647 ++++++++++++++++++ frontend/src/store/meeting.js | 8 +- 10 files changed, 1958 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/meeting/InviteDialog.vue create mode 100644 frontend/src/components/meeting/MeetingToolbar.vue create mode 100644 frontend/src/components/meeting/MemberPanel.vue create mode 100644 frontend/src/components/meeting/NetworkBadge.vue create mode 100644 frontend/src/components/meeting/VideoGrid.vue create mode 100644 frontend/src/components/meeting/VideoTile.vue create mode 100644 frontend/src/pages/meeting/room.vue diff --git a/frontend/src/components/meeting/InviteDialog.vue b/frontend/src/components/meeting/InviteDialog.vue new file mode 100644 index 0000000..63cc514 --- /dev/null +++ b/frontend/src/components/meeting/InviteDialog.vue @@ -0,0 +1,319 @@ + + + + + + diff --git a/frontend/src/components/meeting/MeetingToolbar.vue b/frontend/src/components/meeting/MeetingToolbar.vue new file mode 100644 index 0000000..9337b97 --- /dev/null +++ b/frontend/src/components/meeting/MeetingToolbar.vue @@ -0,0 +1,193 @@ + + + + + + diff --git a/frontend/src/components/meeting/MemberPanel.vue b/frontend/src/components/meeting/MemberPanel.vue new file mode 100644 index 0000000..12e371e --- /dev/null +++ b/frontend/src/components/meeting/MemberPanel.vue @@ -0,0 +1,336 @@ + + + + + + diff --git a/frontend/src/components/meeting/NetworkBadge.vue b/frontend/src/components/meeting/NetworkBadge.vue new file mode 100644 index 0000000..ea1b542 --- /dev/null +++ b/frontend/src/components/meeting/NetworkBadge.vue @@ -0,0 +1,75 @@ + + + + + + diff --git a/frontend/src/components/meeting/VideoGrid.vue b/frontend/src/components/meeting/VideoGrid.vue new file mode 100644 index 0000000..0605f13 --- /dev/null +++ b/frontend/src/components/meeting/VideoGrid.vue @@ -0,0 +1,100 @@ + + + + + + diff --git a/frontend/src/components/meeting/VideoTile.vue b/frontend/src/components/meeting/VideoTile.vue new file mode 100644 index 0000000..8754a93 --- /dev/null +++ b/frontend/src/components/meeting/VideoTile.vue @@ -0,0 +1,273 @@ + + + + + + diff --git a/frontend/src/pages.json b/frontend/src/pages.json index 4c29d41..1464121 100644 --- a/frontend/src/pages.json +++ b/frontend/src/pages.json @@ -166,6 +166,13 @@ "navigationBarTitleText": "设备预览" } }, + { + "path": "pages/meeting/room", + "style": { + "navigationBarTitleText": "会议进行中", + "navigationStyle": "custom" + } + }, { "path": "pages/notify/index", "style": { diff --git a/frontend/src/pages/meeting/preview.vue b/frontend/src/pages/meeting/preview.vue index 6c21dda..a0dfd0d 100644 --- a/frontend/src/pages/meeting/preview.vue +++ b/frontend/src/pages/meeting/preview.vue @@ -12,8 +12,7 @@ - 「入会默认开麦/摄像头」两个开关写入 mediaPrefs - 兜底:权限被拒 / 浏览器不支持 WebRTC 时给明确错误提示 - 入会成功后(Task 11 room 页未就绪期间):uni.redirectTo 到会议调试页 debug.vue 作为会议室占位。 - TODO(Task 11 落地后):改为 uni.redirectTo '/pages/meeting/room?code=xxx' + 入会成功后:uni.redirectTo('/pages/meeting/room?code=xxx') -->