@tencent-rtc/trtc-agent-skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +172 -0
- package/README.zh.md +173 -0
- package/bin/cli.js +434 -0
- package/knowledge-base/index.yaml +454 -0
- package/knowledge-base/platform-slice-template.md +233 -0
- package/knowledge-base/scenario-spec.md +350 -0
- package/knowledge-base/scenarios/conference/base/general-conference.md +365 -0
- package/knowledge-base/scenarios/conference/base/webinar-conference.md +130 -0
- package/knowledge-base/scenarios/conference/medical/1v1-video-consultation.md +145 -0
- package/knowledge-base/scenarios/conference/medical/medical-multidoctor-consultation.md +113 -0
- package/knowledge-base/scenarios/live/entertainment-live-room.md +118 -0
- package/knowledge-base/slice-spec.md +546 -0
- package/knowledge-base/slices/conference/web/ai-tools.md +225 -0
- package/knowledge-base/slices/conference/web/beauty-effects.md +188 -0
- package/knowledge-base/slices/conference/web/device-control.md +338 -0
- package/knowledge-base/slices/conference/web/login-auth.md +261 -0
- package/knowledge-base/slices/conference/web/network-quality.md +190 -0
- package/knowledge-base/slices/conference/web/official-roomkit-api.md +298 -0
- package/knowledge-base/slices/conference/web/official-roomkit-login-ui.md +246 -0
- package/knowledge-base/slices/conference/web/participant-list.md +238 -0
- package/knowledge-base/slices/conference/web/participant-management.md +718 -0
- package/knowledge-base/slices/conference/web/prejoin-check.md +293 -0
- package/knowledge-base/slices/conference/web/room-call.md +213 -0
- package/knowledge-base/slices/conference/web/room-chat.md +426 -0
- package/knowledge-base/slices/conference/web/room-lifecycle.md +534 -0
- package/knowledge-base/slices/conference/web/room-schedule.md +281 -0
- package/knowledge-base/slices/conference/web/screen-share.md +211 -0
- package/knowledge-base/slices/conference/web/video-layout.md +675 -0
- package/knowledge-base/slices/conference/web/virtual-background.md +197 -0
- package/knowledge-base/slices/conference/web/webinar-interaction.md +206 -0
- package/knowledge-base/slices/live/anchor-lifecycle.md +122 -0
- package/knowledge-base/slices/live/anchor-preview.md +90 -0
- package/knowledge-base/slices/live/anchor-room-config.md +104 -0
- package/knowledge-base/slices/live/audience-list.md +86 -0
- package/knowledge-base/slices/live/audience-manage.md +92 -0
- package/knowledge-base/slices/live/audience-watch.md +85 -0
- package/knowledge-base/slices/live/audio.md +116 -0
- package/knowledge-base/slices/live/barrage.md +88 -0
- package/knowledge-base/slices/live/beauty.md +99 -0
- package/knowledge-base/slices/live/coguest-apply.md +105 -0
- package/knowledge-base/slices/live/device-control.md +91 -0
- package/knowledge-base/slices/live/error-codes.md +167 -0
- package/knowledge-base/slices/live/gift.md +84 -0
- package/knowledge-base/slices/live/ios/.gitkeep +0 -0
- package/knowledge-base/slices/live/ios/anchor-lifecycle.md +313 -0
- package/knowledge-base/slices/live/ios/anchor-preview.md +228 -0
- package/knowledge-base/slices/live/ios/anchor-room-config.md +257 -0
- package/knowledge-base/slices/live/ios/audience-list.md +353 -0
- package/knowledge-base/slices/live/ios/audience-manage.md +381 -0
- package/knowledge-base/slices/live/ios/audience-watch.md +286 -0
- package/knowledge-base/slices/live/ios/audio.md +373 -0
- package/knowledge-base/slices/live/ios/barrage.md +285 -0
- package/knowledge-base/slices/live/ios/beauty.md +323 -0
- package/knowledge-base/slices/live/ios/coguest-apply.md +506 -0
- package/knowledge-base/slices/live/ios/device-control.md +286 -0
- package/knowledge-base/slices/live/ios/error-codes.md +270 -0
- package/knowledge-base/slices/live/ios/gift.md +315 -0
- package/knowledge-base/slices/live/ios/live-list.md +269 -0
- package/knowledge-base/slices/live/ios/login-auth.md +247 -0
- package/knowledge-base/slices/live/live-list.md +82 -0
- package/knowledge-base/slices/live/login-auth.md +78 -0
- package/package.json +34 -0
- package/skills/trtc/SKILL.md +326 -0
- package/skills/trtc/room-builder/SKILL.md +138 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/README.md +108 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/backend-contract.zh-CN.md +162 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/integration.zh-CN.md +154 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/docs/theme.zh-CN.md +78 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/index.html +12 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/package.json +28 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/postcss.config.js +5 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/App.vue +25 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/ConsultationManagePanel.vue +838 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/LanguageSwitch.vue +102 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/LoadingSpinner.vue +6 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalAlert.vue +34 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalBusinessPanel.vue +148 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalButton.vue +49 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalConfirmDialog.vue +68 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalDataPanel.vue +196 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/MedicalRecordPanel.vue +270 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/components/PrescriptionPanel.vue +363 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/basic-info-config.ts +29 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/lib-generate-test-usersig-es.min.d.ts +4 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/lib-generate-test-usersig-es.min.js +2 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/config/runtime-config.ts +12 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/env.d.ts +32 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationChatPanel.vue +123 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationMembersPanel.vue +230 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationTranscriptionPanel.vue +135 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/ConsultationVideoStage.vue +113 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/InviteDoctorDialog.vue +132 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/components/KickMemberConfirmDialog.vue +50 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/types.ts +77 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationChat.ts +97 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationDevices.ts +48 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationParticipants.ts +121 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/useConsultationPermissions.ts +25 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/features/consultation/utils.ts +70 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/en-US/index.ts +553 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/index.ts +25 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/medicalTranslate.ts +85 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/state.ts +49 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/i18n/zh-CN/index.ts +463 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/main.ts +12 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/mock/appointments.ts +96 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/mock/users.ts +79 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/router/index.ts +63 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/index.ts +25 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/appointmentService.ts +77 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/authService.ts +38 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/launchContext.ts +31 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/integration/userService.ts +35 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/appointmentService.ts +43 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/authService.ts +33 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/mock/userService.ts +43 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/services/adapters/types.ts +135 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/shared/icons.ts +53 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/index.css +106 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/tailwind.css +3 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/styles/theme.css +209 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/auth.ts +50 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/format.ts +24 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/navigation.ts +12 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/utils/session.ts +28 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/DoctorConsultationView.vue +777 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/DoctorDashboardView.vue +678 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/LoginView.vue +441 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientConsultationFinishedView.vue +185 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientConsultationView.vue +1003 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientSelectDoctorView.vue +317 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/src/views/PatientWaitingView.vue +454 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/tsconfig.json +21 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/tsconfig.node.json +8 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation/vite.config.ts +17 -0
- package/skills/trtc/room-builder/templates/scenarios/medical-consultation//346/216/245/345/205/245/350/257/264/346/230/216.md +6 -0
- package/skills/trtc/room-builder/tools/render_ai_instructions.py +226 -0
- package/skills/trtc-apply/SKILL.md +97 -0
- package/skills/trtc-apply/guardrails/apply_lib/__init__.py +0 -0
- package/skills/trtc-apply/guardrails/apply_lib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/skills/trtc-apply/guardrails/apply_lib/__pycache__/rule_parser.cpython-313.pyc +0 -0
- package/skills/trtc-apply/guardrails/apply_lib/rule_parser.py +268 -0
- package/skills/trtc-docs/SKILL.md +207 -0
- package/skills/trtc-onboarding/SKILL.md +839 -0
- package/skills/trtc-onboarding/reference/path-a1-demo.md +103 -0
- package/skills/trtc-onboarding/reference/path-a2-integrate.md +693 -0
- package/skills/trtc-onboarding/reference/path-b-troubleshoot.md +115 -0
- package/skills/trtc-onboarding/reference/path-c-expand.md +43 -0
- package/skills/trtc-onboarding/reference/reporting-protocol.md +174 -0
- package/skills/trtc-onboarding/reference/supported-matrix.md +100 -0
- package/skills/trtc-onboarding/reference/usersig-handling.md +140 -0
- package/skills/trtc-search/SKILL.md +221 -0
- package/skills/trtc-topic/SKILL.md +638 -0
- package/skills/trtc-topic/guardrails/__pycache__/gate_slice_read.cpython-313.pyc +0 -0
- package/skills/trtc-topic/guardrails/__pycache__/gate_slice_write.cpython-313.pyc +0 -0
- package/skills/trtc-topic/guardrails/__pycache__/stop_require_apply_evidence.cpython-313.pyc +0 -0
- package/skills/trtc-topic/guardrails/gate_slice_read.py +133 -0
- package/skills/trtc-topic/guardrails/gate_slice_write.py +169 -0
- package/skills/trtc-topic/guardrails/stop_require_apply_evidence.py +97 -0
- package/skills/trtc-topic/references/execution-units.yaml +58 -0
- package/skills/trtc-topic/runtime/README.md +50 -0
- package/skills/trtc-topic/runtime/RUNTIME.md +128 -0
- package/skills/trtc-topic/runtime/lib/__init__.py +0 -0
- package/skills/trtc-topic/runtime/lib/platforms.py +194 -0
- package/skills/trtc-topic/runtime/package-lock.json +1211 -0
- package/skills/trtc-topic/runtime/package.json +13 -0
- package/skills/trtc-topic/runtime/telemetry-bridge.mjs +339 -0
- package/skills/trtc-topic/runtime/telemetry_collector.py +293 -0
- package/skills/trtc-topic/scripts/STATE-MACHINE-GUIDE.md +186 -0
- package/skills/trtc-topic/scripts/__pycache__/apply.cpython-313.pyc +0 -0
- package/skills/trtc-topic/scripts/apply.py +581 -0
- package/skills/trtc-topic/scripts/finalize_session.py +113 -0
- package/skills/trtc-topic/scripts/init_slice_queue.py +96 -0
- package/skills/trtc-topic/scripts/lib/__pycache__/state_machine.cpython-313.pyc +0 -0
- package/skills/trtc-topic/scripts/lib/state_machine.py +328 -0
- package/skills/trtc-topic/scripts/next_slice.py +137 -0
- package/skills/trtc-topic/tests/README.md +70 -0
- package/skills/trtc-topic/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_apply_cli.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_apply_cli.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_end_to_end.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_end_to_end.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_finalize_session.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_finalize_session.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_gates.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_gates.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_session_resolver.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_session_resolver.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_state_machine.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_state_machine.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_stop_require_apply.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_stop_require_apply.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_topic_skill_invariants.cpython-313-pytest-9.0.2.pyc +0 -0
- package/skills/trtc-topic/tests/__pycache__/test_topic_skill_invariants.cpython-313-pytest-9.0.3.pyc +0 -0
- package/skills/trtc-topic/tests/conftest.py +72 -0
- package/skills/trtc-topic/tests/test_apply_cli.py +480 -0
- package/skills/trtc-topic/tests/test_end_to_end.py +305 -0
- package/skills/trtc-topic/tests/test_finalize_session.py +51 -0
- package/skills/trtc-topic/tests/test_gates.py +316 -0
- package/skills/trtc-topic/tests/test_session_resolver.py +260 -0
- package/skills/trtc-topic/tests/test_state_machine.py +414 -0
- package/skills/trtc-topic/tests/test_stop_require_apply.py +99 -0
- package/skills/trtc-topic/tests/test_topic_skill_invariants.py +130 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: conference/room-schedule
|
|
3
|
+
name: 预约会议
|
|
4
|
+
product: conference
|
|
5
|
+
platform: web
|
|
6
|
+
tags: [schedule, calendar, future-room, scheduledRoomList]
|
|
7
|
+
platforms: [web]
|
|
8
|
+
related: [conference/room-lifecycle, conference/room-call]
|
|
9
|
+
api_docs:
|
|
10
|
+
- title: 预定房间
|
|
11
|
+
url: https://cloud.tencent.com/document/product/647/126931
|
|
12
|
+
business_decisions:
|
|
13
|
+
- key: schedule_features
|
|
14
|
+
tier: blocking
|
|
15
|
+
multi_select: true
|
|
16
|
+
baseline: ["list"] # 始终生成的基础能力,不作为多选项展示(预约会议列表默认提供)
|
|
17
|
+
question: "预约会议需要支持哪些能力?(预约会议列表默认展示,以下为额外能力,可多选)"
|
|
18
|
+
options:
|
|
19
|
+
- { label: "修改或取消已预约的会议", value: "modify" }
|
|
20
|
+
- { label: "为会议设置访问密码", value: "password" }
|
|
21
|
+
- { label: "会议状态变更时发送通知(开始提醒、邀请、取消等)", value: "events" }
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# 预约会议
|
|
25
|
+
|
|
26
|
+
## 功能说明
|
|
27
|
+
|
|
28
|
+
预约会议负责未来时间维度上的会议排期,覆盖预定会议、修改和取消预定、展示预定列表,以及会议临近开始时的提醒和入会入口。它关注的是“未来会议怎么被安排与兑现”,而不是会议真正开始后的房间主链路。
|
|
29
|
+
|
|
30
|
+
## 核心概念
|
|
31
|
+
|
|
32
|
+
### 角色与操作
|
|
33
|
+
|
|
34
|
+
| 角色 | 关键操作 | 说明 |
|
|
35
|
+
|------|----------|------|
|
|
36
|
+
| 会议组织者 | 创建、修改、取消预约会议 | 负责定义未来会议的时间和基础信息 |
|
|
37
|
+
| 被邀请或关注会议的用户 | 查看和进入预约会议 | 在会议临近时感知提醒,并在合适时间进入真实会议 |
|
|
38
|
+
| 日历 / 列表模块 | 承载排期展示 | 提供预约会议列表、筛选、更新和取消入口 |
|
|
39
|
+
| 房间生命周期模块 | 承接真实入会 | 预约会议到点后,真正进入会议仍需回到 `room-lifecycle` |
|
|
40
|
+
|
|
41
|
+
### 事件流
|
|
42
|
+
|
|
43
|
+
| 阶段 | 参与方 | 关键动作 |
|
|
44
|
+
|------|--------|----------|
|
|
45
|
+
| 创建预约 | 组织者 | 设置开始时间、结束时间、会议基础配置和预约参会人 |
|
|
46
|
+
| 列表展示 | 客户端 | 拉取并展示未来会议列表,并把预约结果同步给相关参会人入口 |
|
|
47
|
+
| 预约变更 | 组织者 / 系统 | 修改、取消或重排预约会议信息 |
|
|
48
|
+
| 即将开始 | 客户端 / 系统 | 触发“会议即将开始”的提醒与进入入口 |
|
|
49
|
+
| 真实入会 | 用户 | 到点后从预约会议入口进入真实房间主流程 |
|
|
50
|
+
|
|
51
|
+
### 状态与数据
|
|
52
|
+
|
|
53
|
+
| 数据 / 状态 | 说明 |
|
|
54
|
+
|-------------|------|
|
|
55
|
+
| 预约会议 ID / 房间 ID | 用于唯一标识一条未来会议记录以及其对应房间 |
|
|
56
|
+
| 开始 / 结束时间 | 定义会议的时间边界 |
|
|
57
|
+
| `scheduleAttendees` / 参会人集合 | 表示本次预约会议计划覆盖的目标参会人 |
|
|
58
|
+
| 预约状态 | 已预约、已修改、已取消、即将开始、已过期等状态 |
|
|
59
|
+
| 预约会议列表与游标 | 用于分页展示和拉取未来会议数据 |
|
|
60
|
+
| 提醒与入会入口状态 | 用于触发“即将开始”提示与进入会议动作 |
|
|
61
|
+
|
|
62
|
+
### 状态机
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
draft
|
|
66
|
+
→ scheduled
|
|
67
|
+
→ updated
|
|
68
|
+
→ starting-soon
|
|
69
|
+
→ joining-room
|
|
70
|
+
→ completed
|
|
71
|
+
|
|
72
|
+
scheduled
|
|
73
|
+
→ cancelled
|
|
74
|
+
→ expired
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 前置条件
|
|
78
|
+
**通用依赖**:见 [login-auth 平台 slice](login-auth.md)。
|
|
79
|
+
|
|
80
|
+
**额外依赖**:
|
|
81
|
+
- 已安装 `tuikit-atomicx-vue3@latest`
|
|
82
|
+
|
|
83
|
+
**前置状态**:
|
|
84
|
+
- 已阅读 `conference/room-schedule`,明确当前能力的产品边界。
|
|
85
|
+
- 已完成 `conference/login-auth`,确保当前页面具备稳定登录态。
|
|
86
|
+
- 已根据业务流程接入会议上下文;需要房间状态时,优先通过 `conference/room-lifecycle` 统一承接。
|
|
87
|
+
|
|
88
|
+
## 最佳实践
|
|
89
|
+
|
|
90
|
+
### ✅ ALWAYS
|
|
91
|
+
|
|
92
|
+
1. **把预约信息与真实房间生命周期分开处理** —— 预约会议是未来计划,真正入会要在到点后回到房间主链路。
|
|
93
|
+
2. **让即时会议和预约会议复用同一套房间配置模型** —— 会议名称、密码和默认规则最好保持一致语义。
|
|
94
|
+
3. **显式处理修改、取消和即将开始提醒** —— 预约会议不是只有“创建成功”一个状态。
|
|
95
|
+
4. **在列表与提醒中统一使用同一时间语义** —— 开始时间、结束时间、即将开始阈值要避免前后不一致。
|
|
96
|
+
|
|
97
|
+
### ❌ NEVER
|
|
98
|
+
|
|
99
|
+
1. **不要把创建预约会议当成已经创建了正在运行的房间** —— 预约成功不等于用户已经在会议里。
|
|
100
|
+
2. **不要忽略取消和过期状态** —— 预约类能力天然带有时间失效和状态变更特征。
|
|
101
|
+
3. **不要让预约列表、提醒入口和真实入会入口各自维护不同的会议身份** —— 否则很容易出现跳错会或进错房间。
|
|
102
|
+
|
|
103
|
+
## 代码示例
|
|
104
|
+
### 预约与取消:创建未来会议并分页读取列表
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import { useRoomState } from 'tuikit-atomicx-vue3/room';
|
|
108
|
+
|
|
109
|
+
const { scheduleRoom, getScheduledRoomList, cancelScheduledRoom } = useRoomState();
|
|
110
|
+
const startTime = Math.floor(Date.now() / 1000) + 3600;
|
|
111
|
+
|
|
112
|
+
await scheduleRoom({
|
|
113
|
+
roomId: 'schedule_room',
|
|
114
|
+
options: {
|
|
115
|
+
roomName: '周会',
|
|
116
|
+
scheduleStartTime: startTime,
|
|
117
|
+
scheduleEndTime: startTime + 1800,
|
|
118
|
+
scheduleAttendees: ['user_a', 'user_b'],
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
await getScheduledRoomList({ cursor: '' });
|
|
123
|
+
await cancelScheduledRoom({ roomId: 'schedule_room' });
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 读取预约列表:响应字段与「请求 / 响应」字段名不一致(高频踩坑)
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import { useRoomState } from 'tuikit-atomicx-vue3/room';
|
|
130
|
+
|
|
131
|
+
const { getScheduledRoomList } = useRoomState();
|
|
132
|
+
|
|
133
|
+
// 返回 { scheduledRoomList: RoomInfo[]; cursor: string }
|
|
134
|
+
const res = await getScheduledRoomList({ cursor: '' });
|
|
135
|
+
|
|
136
|
+
const rooms = res.scheduledRoomList.map((room) => ({
|
|
137
|
+
roomId: room.roomId,
|
|
138
|
+
roomName: room.roomName,
|
|
139
|
+
// ⚠️ 响应字段是 scheduledStartTime / scheduledEndTime(带 "d"),
|
|
140
|
+
// 与「创建」请求里的 scheduleStartTime / scheduleEndTime(不带 "d")拼写不同!
|
|
141
|
+
// 用错名字会取到 undefined → 时间为 0 → 列表显示空 / 状态恒为「已结束」。
|
|
142
|
+
startTimeMs: (room.scheduledStartTime ?? 0) * 1000, // 服务端秒级,展示前 *1000 转毫秒
|
|
143
|
+
endTimeMs: (room.scheduledEndTime ?? 0) * 1000,
|
|
144
|
+
// ⚠️ 响应里 scheduleAttendees 是 RoomUser[](对象数组),不是创建请求里的 string[]
|
|
145
|
+
attendees: (room.scheduleAttendees ?? []).map((u) => u.userId),
|
|
146
|
+
}));
|
|
147
|
+
|
|
148
|
+
const nextCursor = res.cursor; // 续拉下一页
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
## 调用时序
|
|
153
|
+
```
|
|
154
|
+
完成 login-auth
|
|
155
|
+
│
|
|
156
|
+
▼
|
|
157
|
+
准备预约时间与房间信息
|
|
158
|
+
│
|
|
159
|
+
▼
|
|
160
|
+
scheduleRoom({ roomId, options })
|
|
161
|
+
│
|
|
162
|
+
├─ 成功 → 写入预约列表
|
|
163
|
+
├─ 需要查看更多 → getScheduledRoomList({ cursor })
|
|
164
|
+
└─ 用户取消预约 → cancelScheduledRoom({ roomId })
|
|
165
|
+
│
|
|
166
|
+
▼
|
|
167
|
+
会议临近时结合提醒事件与 room-lifecycle 引导入会
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 平台特有注意事项
|
|
171
|
+
### 1. 时间参数为「秒级」时间戳(注意:SDK 的 .d.ts 注释会误导)
|
|
172
|
+
预约接口(创建与列表响应)的时间单位是**秒级** UNIX 时间戳。
|
|
173
|
+
⚠️ `tuikit-atomicx-vue3` 的 TypeScript 声明(`.d.ts`)把这些字段注释成「毫秒时间戳」、
|
|
174
|
+
示例也写成 `Date.now() + 3600000`,但服务端实际收 / 发的是**秒**。**以秒为准**:
|
|
175
|
+
- 创建:`scheduleStartTime: Math.floor(Date.now() / 1000) + 3600`
|
|
176
|
+
- 读取:响应里的 `scheduledStartTime / scheduledEndTime` 也是秒;前端要和 `Date.now()`(毫秒)
|
|
177
|
+
比较或交给 `new Date()` 展示时,需先 `* 1000`。
|
|
178
|
+
|
|
179
|
+
建议应用内部统一用毫秒,只在「调用 / 解析 SDK」这一层做秒↔毫秒转换,避免单位散落各处。
|
|
180
|
+
|
|
181
|
+
### 2. 「创建请求」与「列表响应」的字段名不一致
|
|
182
|
+
这是最容易静默出错的点:
|
|
183
|
+
| 含义 | 创建请求 `ScheduleRoomOptions` | 列表响应 `RoomInfo` |
|
|
184
|
+
|------|------|------|
|
|
185
|
+
| 开始时间 | `scheduleStartTime` | `scheduledStartTime`(多一个 "d") |
|
|
186
|
+
| 结束时间 | `scheduleEndTime` | `scheduledEndTime`(多一个 "d") |
|
|
187
|
+
| 参会人 | `scheduleAttendees: string[]` | `scheduleAttendees: RoomUser[]`(对象数组) |
|
|
188
|
+
|
|
189
|
+
读取列表时若沿用创建请求的字段名,会取到 `undefined` → 时间为 0 → 列表为空或状态恒为「已结束」。
|
|
190
|
+
|
|
191
|
+
### 3. `roomId` 更适合由业务后台生成并保证唯一性
|
|
192
|
+
预约会议的 `roomId` 最好由业务后台统一生成或分配,避免未来会议与即时会议在不同入口下发生标识冲突。
|
|
193
|
+
|
|
194
|
+
### 4. 预约时可同步写入 `scheduleAttendees`
|
|
195
|
+
如果业务希望把会议信息同步到参会人的会议列表或提醒入口,应在预约阶段明确传入受邀参会人集合,而不是依赖后续临时补录。
|
|
196
|
+
|
|
197
|
+
### 5. 预约列表通常需要分页拉取
|
|
198
|
+
不要默认一次返回所有预约记录;应根据返回的 `cursor` 持续拉取后续列表数据。
|
|
199
|
+
|
|
200
|
+
### 6. 预约会议最终仍要回到房间生命周期
|
|
201
|
+
无论预约由前端创建还是后端排期系统预生成,临近开会时都应回到 `conference/room-lifecycle` 的真实入会链路。
|
|
202
|
+
|
|
203
|
+
## 代码生成约束
|
|
204
|
+
|
|
205
|
+
### 业务决策与代码生成的对应关系
|
|
206
|
+
|
|
207
|
+
`business_decisions.schedule_features` 的多选结果决定生成代码的范围。`list` 是 **baseline(基础项)**:始终生成、不作为多选项让用户勾选;`modify` / `password` / `events` 是用户多选的额外能力。
|
|
208
|
+
|
|
209
|
+
| 档位 | 生成的 API 与 UI |
|
|
210
|
+
|---|---|
|
|
211
|
+
| `list`(baseline,始终生成) | `getScheduledRoomList`(含 cursor 分页)+ 预约列表展示 |
|
|
212
|
+
| `modify` | 修改预约时间 / 取消预约的 API + 列表项操作入口 |
|
|
213
|
+
| `password` | 预约创建表单的密码字段 + 入会密码校验 |
|
|
214
|
+
| `events` | 会议开始提醒 / 被邀请 / 被取消等事件订阅与通知 UI |
|
|
215
|
+
|
|
216
|
+
`list` 因为是 baseline,始终生成;其余三档中未勾选的,对应 API 不导出、不导入、对应 UI 入口不渲染(按 topic G8 规则)。
|
|
217
|
+
|
|
218
|
+
### 编译必要条件
|
|
219
|
+
- **通用条件**:见 [login-auth 平台 slice](login-auth.md)。
|
|
220
|
+
- **额外导入**:至少需要导入 `useRoomState`。
|
|
221
|
+
- **运行前提**:当前用户具备预约会议权限,且时间参数经过单位校验。
|
|
222
|
+
|
|
223
|
+
### 生成规则
|
|
224
|
+
#### MUST(生成时必须包含)
|
|
225
|
+
|
|
226
|
+
1. **在预约创建时显式传入秒级时间戳** — 时间单位错误会直接导致会议时间错位。
|
|
227
|
+
**Verify**: 检查是否存在 `Math.floor(Date.now() / 1000)` 或等价转换。
|
|
228
|
+
2. **在预约场景中明确会议标识与参会人集合** — 未来会议记录应能稳定映射到唯一房间和对应参会人入口。
|
|
229
|
+
**Verify**: 检查是否提供稳定 `roomId`,并在需要时传入 `scheduleAttendees`。
|
|
230
|
+
3. **支持预约列表分页读取** — 长列表场景不能只写死第一页。
|
|
231
|
+
**Verify**: 检查是否存在 `getScheduledRoomList({ cursor })` 调用。
|
|
232
|
+
4. **读取列表必须用响应字段名 `scheduledStartTime` / `scheduledEndTime`(带 "d")** — 与创建请求的 `scheduleStartTime` / `scheduleEndTime` 拼写不同,用错会取到 0。
|
|
233
|
+
**Verify**: 检查列表映射代码读取的是 `scheduledStartTime` / `scheduledEndTime`,且 `scheduleAttendees` 按 `RoomUser[]` 取 `.userId`。
|
|
234
|
+
|
|
235
|
+
#### MUST NOT(生成时绝不能出现)
|
|
236
|
+
|
|
237
|
+
1. **不要把毫秒时间戳直接传给预约接口** — 服务端为秒级,传毫秒会让会议时间漂移到错误年份。
|
|
238
|
+
**Verify**: 检查创建时是否 `Math.floor(ms / 1000)` 转秒;不要轻信 `.d.ts` 的「毫秒」注释。
|
|
239
|
+
2. **不要把预约成功等价为已经进入会议** — 预约与真实入会是两条不同链路。
|
|
240
|
+
**Verify**: 检查是否仍通过 `room-lifecycle` 承接正式开会。
|
|
241
|
+
3. **不要在读取列表时复用创建请求的字段名 / 类型** — `scheduleStartTime`(无 d)、`scheduleAttendees: string[]` 是创建侧的写法,套到响应上会取空。
|
|
242
|
+
**Verify**: 检查读取侧未出现 `room.scheduleStartTime` / 把 `scheduleAttendees` 当字符串数组直接用。
|
|
243
|
+
|
|
244
|
+
### 集成检查点
|
|
245
|
+
- 当前 slice 常与 `conference/room-lifecycle`、业务提醒系统联动。
|
|
246
|
+
- 集成方式通常是新增日程表单、预约列表和提醒入口。
|
|
247
|
+
- 如果业务已有企业日历或排期系统,需要提前约定字段映射与同步策略。
|
|
248
|
+
|
|
249
|
+
## 验证矩阵
|
|
250
|
+
| 层级 | 检查项 | 验证手段 | 预期结果 |
|
|
251
|
+
|------|--------|----------|---------|
|
|
252
|
+
| 1. 编译级 | 已导入 `useRoomState` | 检查 `import` 语句 | 预约相关 API 可解析 |
|
|
253
|
+
| 2. 静态规则级 | 时间参数、`roomId` 与参会人集合处理正确 | 搜索 `Date.now()`、`roomId`、`scheduleAttendees` | 传参为秒级时间戳,会议标识稳定 |
|
|
254
|
+
| 2.1 字段名级 | 创建用 `scheduleStartTime`、读取用 `scheduledStartTime`(带 "d");时间按秒↔毫秒正确转换 | 搜索 `scheduledStartTime` / `scheduledEndTime` 与 `* 1000` / `/ 1000` | 列表能读出真实时间,状态不再恒为「已结束」 |
|
|
255
|
+
| 3. 运行时级 | 可创建、读取和取消预约会议 | 在预约页面走完整流程 | 预约列表与取消结果正确 |
|
|
256
|
+
| 4. 业务行为级 | 临近会议时可顺畅跳转入会 | 从预约记录点击进入会议 | 进入正式入会链路而非停留在预约状态 |
|
|
257
|
+
|
|
258
|
+
## 排障指南
|
|
259
|
+
|
|
260
|
+
### 常见问题
|
|
261
|
+
|
|
262
|
+
| 问题 | 表现 | 处理建议 |
|
|
263
|
+
|------|------|----------|
|
|
264
|
+
| 预约列表不完整或更新不及时 | 新建、修改、取消后列表没有同步变化 | 检查预约列表拉取、分页和本地状态刷新逻辑 |
|
|
265
|
+
| 提醒出现了但无法入会 | 会议即将开始通知已到,但点击后不能进入会议 | 检查提醒入口是否正确衔接到 `room-lifecycle` 的真实入会流程 |
|
|
266
|
+
| 取消后仍能看到旧预约 | 会议已取消,但列表和入口仍保留 | 检查取消后的本地状态清理与列表刷新是否统一收口 |
|
|
267
|
+
|
|
268
|
+
### 排障流程
|
|
269
|
+
|
|
270
|
+
```text
|
|
271
|
+
发现 预约会议 相关问题
|
|
272
|
+
├── 第 1 步:确认问题属于未来会议排期,而不是会议已经开始后的房间主链路
|
|
273
|
+
├── 第 2 步:检查预约会议的创建、修改、取消和列表刷新是否共用同一会议身份
|
|
274
|
+
├── 第 3 步:确认 starting-soon 提醒是否正确连接到 join-room 的真实入会动作
|
|
275
|
+
└── 第 4 步:若仍异常,再回查 room-lifecycle / room-call 的衔接是否正确
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 关联知识
|
|
279
|
+
|
|
280
|
+
- **[conference/room-lifecycle](room-lifecycle.md)** —— 预约会议到点后,真正的入会和退场仍由房间生命周期负责;会议配置(名称、密码、默认规则)也已整合到此 slice。
|
|
281
|
+
- **[conference/room-call](room-call.md)** —— 预约会议场景下的提醒或召回,可能与会中呼叫形成协同。
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: conference/screen-share
|
|
3
|
+
name: 屏幕分享
|
|
4
|
+
product: conference
|
|
5
|
+
platform: web
|
|
6
|
+
tags: [screen-share, share, screenAudio, participantWithScreen]
|
|
7
|
+
platforms: [web]
|
|
8
|
+
related: [conference/video-layout, conference/device-control, conference/participant-management]
|
|
9
|
+
api_docs:
|
|
10
|
+
- title: 屏幕分享
|
|
11
|
+
url: https://cloud.tencent.com/document/product/647/126925
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# 屏幕分享
|
|
15
|
+
|
|
16
|
+
## 功能说明
|
|
17
|
+
|
|
18
|
+
屏幕分享负责会议中的共享链路,覆盖开始共享、停止共享、是否携带系统音频、谁正在共享,以及共享状态如何驱动画面编排和权限限制。它关注的是共享媒体能力本身,也要处理“当前为什么不能共享、共享被谁中断、共享受限后如何恢复”这些问题,而不是共享后画面如何排布或谁具备角色治理权限。
|
|
19
|
+
|
|
20
|
+
## 核心概念
|
|
21
|
+
|
|
22
|
+
### 角色与操作
|
|
23
|
+
|
|
24
|
+
| 角色 | 关键操作 | 说明 |
|
|
25
|
+
|------|----------|------|
|
|
26
|
+
| 共享发起人 | 开始 / 停止屏幕共享 | 选择共享窗口、标签页或整个屏幕,并在支持时携带系统音频 |
|
|
27
|
+
| 观看方 | 感知共享状态 | 根据共享者变化切换主画面或观看内容 |
|
|
28
|
+
| 会控模块 | 约束或恢复共享能力 | 可限制成员发起共享,也可通过设备协作帮助成员恢复共享能力 |
|
|
29
|
+
| 浏览器 | 提供原生共享能力 | 控制共享弹窗、系统音频可用性和原生停止事件 |
|
|
30
|
+
| 布局模块 | 消费共享结果 | 根据共享开始、结束或中断结果切换主画面和展示模式 |
|
|
31
|
+
|
|
32
|
+
### 事件流
|
|
33
|
+
|
|
34
|
+
| 阶段 | 参与方 | 关键动作 |
|
|
35
|
+
|------|--------|----------|
|
|
36
|
+
| 发起共享 | 共享发起人 / 浏览器 | 用户触发共享,浏览器弹出原生选择窗口 |
|
|
37
|
+
| 共享建立 | 客户端 | 共享成功后记录当前共享状态和共享者信息 |
|
|
38
|
+
| 权限受限或协作恢复 | 会控模块 / 成员 | 当共享被限制时,限制入口、展示原因,并在需要时进入申请或邀请链路 |
|
|
39
|
+
| 共享结束 | 浏览器 / 管理者 / 发起人 | 原生停止、管理员关闭共享或用户主动停止后,客户端同步收口 |
|
|
40
|
+
| 布局回退 | 布局模块 | 根据共享结束结果回退主画面和展示模式 |
|
|
41
|
+
|
|
42
|
+
### 状态与数据
|
|
43
|
+
|
|
44
|
+
| 数据 / 状态 | 说明 |
|
|
45
|
+
|-------------|------|
|
|
46
|
+
| 共享状态 | 表示当前是否处于共享中、停止中或空闲态 |
|
|
47
|
+
| `participantWithScreen` | 当前正在共享屏幕的成员信息 |
|
|
48
|
+
| 系统音频选项 | 表示当前共享是否尝试携带系统音频 |
|
|
49
|
+
| 浏览器支持能力 | 决定共享范围和系统音频能力是否可用 |
|
|
50
|
+
| 共享权限状态 | 表示当前成员是否被允许发起共享 |
|
|
51
|
+
| 共享协作状态 | 表示共享是否因会控受限、是否需要申请开启或等待邀请响应 |
|
|
52
|
+
|
|
53
|
+
### 状态机
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
idle
|
|
57
|
+
→ requesting-share
|
|
58
|
+
→ sharing
|
|
59
|
+
→ externally-stopped
|
|
60
|
+
→ idle
|
|
61
|
+
|
|
62
|
+
requesting-share
|
|
63
|
+
→ restricted
|
|
64
|
+
→ denied
|
|
65
|
+
→ failed
|
|
66
|
+
→ idle
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 前置条件
|
|
70
|
+
**通用依赖**:见 [login-auth 平台 slice](login-auth.md)。
|
|
71
|
+
|
|
72
|
+
**额外依赖**:
|
|
73
|
+
- 已安装 `tuikit-atomicx-vue3@latest`
|
|
74
|
+
|
|
75
|
+
**前置状态**:
|
|
76
|
+
- 已阅读 `conference/screen-share`,明确当前能力的产品边界。
|
|
77
|
+
- 已完成 `conference/login-auth`,确保当前页面具备稳定登录态。
|
|
78
|
+
- 已根据业务流程接入会议上下文;需要房间状态时,优先通过 `conference/room-lifecycle` 统一承接。
|
|
79
|
+
- 当前能力涉及媒体采集、渲染或浏览器权限时,请在 `HTTPS` 或 `localhost` 安全上下文下调试。
|
|
80
|
+
|
|
81
|
+
## 最佳实践
|
|
82
|
+
|
|
83
|
+
### ✅ ALWAYS
|
|
84
|
+
|
|
85
|
+
1. **把浏览器原生停止和管理员关闭共享都当作主流程事件处理** —— 用户不一定通过你的按钮结束共享。
|
|
86
|
+
2. **让共享状态与布局编排显式联动** —— 谁在共享、共享何时开始和结束,应该直接驱动画面焦点切换。
|
|
87
|
+
3. **把共享受限原因讲清楚** —— 当共享被会控限制、被管理员关闭或需要申请开启时,应给出明确原因和后续动作入口。
|
|
88
|
+
4. **把共享权限与房间会控统一设计** —— 当共享能力受限时,不仅要限制入口,还要限制真实共享流程,并在需要时进入申请 / 邀请链路。
|
|
89
|
+
5. **针对浏览器差异给出清晰提示** —— 系统音频、共享范围和权限提示在不同环境下会有差异。
|
|
90
|
+
|
|
91
|
+
### ❌ NEVER
|
|
92
|
+
|
|
93
|
+
1. **不要把屏幕共享当成普通按钮开关** —— 它受到浏览器原生交互、权限弹窗、会控限制和外部中断事件影响。
|
|
94
|
+
2. **不要忽略共享结束后的布局回退** —— 否则主画面会停留在已经不存在的共享状态。
|
|
95
|
+
3. **不要把共享失败一律归因到浏览器支持性问题** —— 还要排查是否被当前会控限制、被管理员关闭,或是否需要先申请开启共享。
|
|
96
|
+
4. **不要默认系统音频在所有环境都可用** —— 需要根据当前环境能力做提示和降级。
|
|
97
|
+
|
|
98
|
+
## 代码示例
|
|
99
|
+
### 基础接入:开始共享、监听共享者并在结束时收口
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { watch } from 'vue';
|
|
103
|
+
import { useDeviceState, useRoomParticipantState } from 'tuikit-atomicx-vue3/room';
|
|
104
|
+
|
|
105
|
+
const { startScreenShare, stopScreenShare, screenStatus } = useDeviceState();
|
|
106
|
+
const { participantWithScreen } = useRoomParticipantState();
|
|
107
|
+
|
|
108
|
+
await startScreenShare({ screenAudio: true });
|
|
109
|
+
watch(participantWithScreen, (participant) => {
|
|
110
|
+
console.log('当前共享者:', participant?.userId);
|
|
111
|
+
});
|
|
112
|
+
await stopScreenShare();
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 调用时序
|
|
116
|
+
```
|
|
117
|
+
完成 login-auth 并进入会议
|
|
118
|
+
│
|
|
119
|
+
▼
|
|
120
|
+
调用 startScreenShare({ screenAudio })
|
|
121
|
+
│
|
|
122
|
+
├─ 浏览器弹出原生共享选择器
|
|
123
|
+
├─ 用户确认 → 本地开始共享,participantWithScreen 更新
|
|
124
|
+
├─ 用户取消 → 保持未共享状态
|
|
125
|
+
└─ 浏览器原生停止 → screenStatus / participantWithScreen 变化收口 UI
|
|
126
|
+
│
|
|
127
|
+
▼
|
|
128
|
+
需要结束共享时调用 stopScreenShare()
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 平台特有注意事项
|
|
132
|
+
### 1. 系统音频共享受浏览器差异影响明显
|
|
133
|
+
`screenAudio` 在 Chrome / Edge 上通常体验更完整,Firefox / Safari 的能力与限制差异更大,联调时要分浏览器验证。
|
|
134
|
+
|
|
135
|
+
### 2. 必须处理浏览器原生“停止分享”
|
|
136
|
+
用户点击浏览器原生停止按钮后,前端不能只依赖业务按钮状态,必须通过共享状态变化主动收口 UI。
|
|
137
|
+
|
|
138
|
+
### 3. 屏幕分享主要面向桌面浏览器
|
|
139
|
+
移动端 Web 对屏幕共享的支持极其有限,产品设计和文档说明都应以桌面场景为主。
|
|
140
|
+
|
|
141
|
+
### 4. 本地共享 tile 不展示真实预览时,不要让它停留在纯黑屏
|
|
142
|
+
部分 Web 环境或产品方案里,本地共享流不会展示真实预览,或者业务上本来就不希望在本地重复渲染共享内容。此时推荐改成“您正在共享屏幕”一类的示意态,并按需提供“结束共享”操作。
|
|
143
|
+
|
|
144
|
+
这里的图标、文案、按钮布局都只是**示例**,不应被理解为固定 UI 规范;真正需要固定的是:用户一眼能知道自己正在共享,且不会看到无语义的黑底。
|
|
145
|
+
|
|
146
|
+
如需具体承载方式,优先交给 `conference/web/video-layout` 中的 `participantViewUI` 或页面级 overlay 处理。
|
|
147
|
+
|
|
148
|
+
## 代码生成约束
|
|
149
|
+
### 编译必要条件
|
|
150
|
+
- **通用条件**:见 [login-auth 平台 slice](login-auth.md)。
|
|
151
|
+
- **额外导入**:至少需要导入 `useDeviceState` 与 `useRoomParticipantState`。
|
|
152
|
+
- **运行前提**:浏览器支持屏幕采集,并处于安全上下文。
|
|
153
|
+
|
|
154
|
+
### 生成规则
|
|
155
|
+
#### MUST(生成时必须包含)
|
|
156
|
+
|
|
157
|
+
1. **通过 `startScreenShare()` / `stopScreenShare()` 控制共享主链路** — 可保证共享状态与房间状态一致。
|
|
158
|
+
**Verify**: 检查是否存在 `startScreenShare(` 与 `stopScreenShare(`。
|
|
159
|
+
2. **根据 `participantWithScreen` 或 `screenStatus` 驱动 UI** — 共享者变化必须能被页面感知。
|
|
160
|
+
**Verify**: 检查是否读取 `participantWithScreen` 或 `screenStatus`。
|
|
161
|
+
3. **如果本地共享流不展示真实预览或表现为黑底,必须补共享中的提示态** —— 可以是状态文案、图标、结束共享入口或它们的组合,但不能只有无语义黑屏。
|
|
162
|
+
**Verify**: 检查本地共享中的 UI 是否至少向用户表达“正在共享”这一状态。
|
|
163
|
+
|
|
164
|
+
#### MUST NOT(生成时绝不能出现)
|
|
165
|
+
|
|
166
|
+
1. **不要假设所有浏览器都等价支持系统音频共享** — 会造成错误的产品承诺。
|
|
167
|
+
**Verify**: 检查是否有浏览器差异说明或降级策略。
|
|
168
|
+
2. **不要忽略浏览器原生停止共享后的状态变化** — UI 会残留“仍在共享”的假状态。
|
|
169
|
+
**Verify**: 检查是否有基于状态变化的收口逻辑。
|
|
170
|
+
3. **不要把共享中的示意态写死成唯一视觉规范** —— 示例可以参考设计稿,但实现必须允许按业务风格调整。
|
|
171
|
+
**Verify**: 检查说明文字是否把示例样式当作唯一合法 UI。
|
|
172
|
+
|
|
173
|
+
### 集成检查点
|
|
174
|
+
- 当前 slice 常与 `conference/video-layout`、`conference/participant-management` 联动。
|
|
175
|
+
- 集成方式通常是新增共享按钮、共享状态提示和主画面切换逻辑。
|
|
176
|
+
- 如果业务需要限制谁能共享,应在上层与角色治理或会控规则联合判断。
|
|
177
|
+
|
|
178
|
+
## 验证矩阵
|
|
179
|
+
| 层级 | 检查项 | 验证手段 | 预期结果 |
|
|
180
|
+
|------|--------|----------|---------|
|
|
181
|
+
| 1. 编译级 | 已导入共享相关 Hook | 检查 `import` 语句 | 屏幕共享 API 可解析 |
|
|
182
|
+
| 2. 静态规则级 | 共享开始、停止和状态监听都存在 | 搜索 `startScreenShare` / `stopScreenShare` / `participantWithScreen` | 形成完整共享链路 |
|
|
183
|
+
| 3. 运行时级 | 浏览器确认后可开始共享 | 在桌面浏览器执行共享 | 页面出现共享状态 |
|
|
184
|
+
| 4. 业务行为级 | 原生停止共享后 UI 正确收口 | 点击浏览器原生停止按钮 | 共享按钮与主画面状态恢复正常 |
|
|
185
|
+
|
|
186
|
+
## 排障指南
|
|
187
|
+
|
|
188
|
+
### 常见问题
|
|
189
|
+
|
|
190
|
+
| 问题 | 表现 | 处理建议 |
|
|
191
|
+
|------|------|----------|
|
|
192
|
+
| 点击共享没有成功开始 | 浏览器无弹窗,或弹窗后没有进入共享状态 | 检查浏览器共享权限、当前环境支持能力,以及共享入口是否被会控限制 |
|
|
193
|
+
| 浏览器已停止共享但 UI 仍显示共享中 | 用户通过浏览器原生面板停止后,页面状态未收口 | 检查是否监听并处理了原生停止共享事件 |
|
|
194
|
+
| 共享被中断但原因不清楚 | 共享突然结束,用户不知道是自己停了还是被管理者关闭 | 检查是否对管理员关闭共享和浏览器原生停止做了区分提示 |
|
|
195
|
+
| 共享开始了但主画面没切换 | 共享画面存在,但布局仍停留在普通成员视图 | 检查共享状态是否真正驱动了 `video-layout` 的焦点切换逻辑 |
|
|
196
|
+
|
|
197
|
+
### 排障流程
|
|
198
|
+
|
|
199
|
+
```text
|
|
200
|
+
发现 屏幕分享 相关问题
|
|
201
|
+
├── 第 1 步:确认问题属于共享媒体能力,而不是布局编排或角色治理本身
|
|
202
|
+
├── 第 2 步:检查浏览器共享弹窗、权限和系统音频支持是否符合当前环境
|
|
203
|
+
├── 第 3 步:确认当前是否存在禁共享、共享被关闭或申请 / 邀请中的会中限制
|
|
204
|
+
└── 第 4 步:若仍异常,再回查 video-layout / device-control / participant-management 的衔接是否正确
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 关联知识
|
|
208
|
+
|
|
209
|
+
- **[conference/video-layout](video-layout.md)** —— 屏幕共享会直接驱动主画面切换与布局重编排。
|
|
210
|
+
- **[conference/device-control](device-control.md)** —— 本地媒体控制与共享状态共同构成会中媒体体验。
|
|
211
|
+
- **[conference/participant-management](participant-management.md)** —— 禁共享、共享关闭和申请 / 邀请链路会直接约束当前能力;同时谁能发起共享相关协作也由成员角色边界决定。
|