# Unified Communications Platform **Repository Path**: newpc/unified-communications-platform ## Basic Information - **Project Name**: Unified Communications Platform - **Description**: 基于 Go、Vue 3、TypeScript 与 ZLMediaKit 的融合通信平台,提供视频会议、会议协同、组织与权限管理、设备接入、音视频能力、智能纪要和录像回放。支持WEB端、桌面端、移动端、WEB SDK、移动端SDK等等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-09 - **Last Updated**: 2026-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 融合通信平台(Unified Communications Platform) 融合通信平台(Unified Communications Platform)使用 Go、Vue 3、TypeScript 和 ZLMediaKit 统一承载会议、人员、现场设备与智能协同能力,逐步替代当前 `Smart Meeting Platform + jitsi-meet` 组合,同时保留 `egova-video-go` 作为执法设备和视频资源能力平台。首期产品边界是受控局域网或稳定专网中的约 16 人会议测试版,复杂公网、TURN 和强弱网生产准入后置。 ## 目标能力 部署到共享 Nginx 时,页面和接口支持独立前缀配置:页面默认 `/#/*`,API 默认 `/api/v1/*`;现场可分别配置为 `/egova/ucs/#/*` 和 `/egova/ucs-api/api/v1/*`。配置方式、WebSocket/WHIP/WHEP 路径及单出口媒体要求见 [公共路径与反向代理](docs/guides/PUBLIC_PATHS.md)。 - 用户、认证、RBAC、组织、通讯录和审计; - 会议创建、预约、邀请、呼叫通知、分享、历史和第三方 OpenAPI; - 摄像头、麦克风、设备切换、屏幕共享、成员与主持控制; - 宫格、主画面、举手、聊天、活跃发言人、断线重连和网络质量; - 实时字幕、发言人映射、AI 纪要、录像归档和鉴权回放; - 通过 `egova-video-go` 接入设备点播、WHEP、PTZ、设备录像、转码和半双工对讲。 ## 界面预览 以下截图来自开发环境,用于展示当前已接入的管理、会议和协同工作流;实际可用功能仍受账号权限、运行时 capability 与媒体服务配置约束。 ### 应用与会议管理 应用管理支持查看接入应用、配置会议 scopes 和启用状态,并在侧边抽屉中完成应用详情维护。 ![应用管理](docs/images/readme/application-management.jpg) 会议创建页用于填写会议主题、时间、参会范围和媒体选项,并在创建后进入对应的会议流程。 ![创建会议](docs/images/readme/meeting-create.jpg) ### 会中协作与控制 会议页面提供成员管理、摄像头与麦克风设备切换、屏幕共享、主持控制和会中聊天等操作;主画面可随发言人或共享内容切换。 ![会中控制与设备切换](docs/images/readme/in-meeting-device-control.jpg) ![屏幕共享与参会成员](docs/images/readme/screen-share-and-participants.jpg) ![会议主画面与协同侧栏](docs/images/readme/meeting-workspace.jpg) ### 录制、通知与智能协同 平台支持会议录像任务查看、通知消息管理,以及在会中打开文档等协同内容。录像、回放和智能能力的实际结果以服务端配置与媒体 PoC 验收证据为准。 ![录像任务列表](docs/images/readme/recording-management.jpg) ![会议通知](docs/images/readme/meeting-notification.jpg) ![移动端会议界面](docs/images/readme/mobile-meeting.jpg) ## 目标拓扑 ```text Vue 3 + TypeScript |-- REST / WebSocket ------> Go ucs server |-- WHIP/WHEP -------------> Go ticket/proxy ----> ZLMediaKit | 普通会议 simulcast、设备媒体、单流录像 ^ Go ucs server -------------------------+ media API / WebHook / scoped ticket | +-- authenticated API ------> egova-video-go --> GB28181 devices +-- provider adapters ------> ASR / AI +-- repository -------------> MySQL ``` Go 服务负责控制面和业务面,不转发 RTP/SRTP。浏览器通过受控 WHIP/WHEP 使用 ZLMediaKit:麦克风独立 audio-only 发布,摄像头一次采集并以 VP8 simulcast 发布 `low/medium/high`,屏幕共享独立发布。Go 根据 Room 权威状态、布局、活跃发言人和网络状态生成 `SubscriptionPlan`,并把 play ticket 绑定到计划、source 和 quality;Room WebSocket 继续承载聊天、举手和主持命令。当前目标不是把 ZLM 描述成传统会议 SFU,而是在受控网络中验证多 PeerConnection 选择性订阅方案。 ## 当前阶段 当前处于“性能、录像、纯语音”纵向建设阶段。2 人纯语音短测已取得真实 Chromium + Go + Room + ZLM 的音频 RTP、`audio/mp4`、Range、多轨回放和资源归零证据;历史 2 人视频运行曾生成 camera/screen `video/mp4`,但最新 2 人视频重跑在 screen-share convergence 阶段失败,当前不能把视频录像写成稳定通过。容量 runner 会记录 RTP、丢包、jitter、帧率和 freeze RTCStats;8/16 人长稳、Go/ZLM 重启恢复和视频录像重跑仍未完成。下一轮建设目标统一维护在 [迁移路线图](docs/ROADMAP.md)。 在媒体 PoC 完成前,不承诺任何候选已达到生产多人会议要求,也不以页面可打开或双人短测代替真实媒体验收。 当前工作台、历史记录、集群对讲、音频指挥、资源协同和智能能力页面均使用稳定 URL;工作台与历史记录读取 Go/MySQL 真实数据,智能能力页读取真实会议、最终字幕和版本化纪要接口,其他外部能力页面读取运行时 capability 并在依赖未配置时禁用操作。页面可打开不等于设备、AI 或媒体能力已经可用,不能用于生产会议。开发入口见 [开发说明](docs/DEVELOPMENT.md),目标部署与尚未完成项见 [部署说明](docs/DEPLOYMENT.md),产品使用状态见 [使用说明](USAGE.md)。 ## 应用分享接入 平台管理员可在 `/platform/applications` 创建接入应用,设置应用类型、会议 scopes、分享 Key,以及语音识别和 AI 纪要是否启用、使用系统配置还是应用的非敏感自定义参数。创建和轮换时明文 Key 只返回一次,数据库只保存 hash。 应用可以调用 `POST /api/v1/applications/{appId}/meetings`,请求头携带 `X-Smart-Meeting-Share-Key`,服务端会创建并启动会议,返回会议级短期访客会话。`packages/meeting-plugin` 将该会话交给 `/embed/meeting`,再进入现有 native WebRTC/ZLM 会议页面。 当前推荐使用项目内的两个 Demo: - `examples/meeting-dashboard`:iframe 插件大屏,默认开发端口 `20130`,支持应用凭证和统一用户中心身份,适合快速接入平台原生会议页。 - `examples/meeting-sdk-demo`:非 iframe SDK Demo,默认开发端口 `20134`,适合第三方自行修改会议界面和业务流程。 iframe 大屏示例位于 `examples/meeting-dashboard`: ```powershell cd examples/meeting-dashboard npm install npm run dev ``` 开发时访问 `http://127.0.0.1:20130`,默认通过 Vite 代理连接当前公网平台 `https://nexuspoint.cn:20124`;配置、本地平台切换和 iframe 路径见该目录的 README。 `/smart-meeting-bigscreen-demo` 是旧版独立大屏交付工程,后续不再作为主线 Demo;新开发、测试和第三方说明统一以 `examples/meeting-dashboard` 与 `examples/meeting-sdk-demo` 为准。旧目录先保留用于历史交付兼容,确认没有外部使用者后再由项目负责人归档或删除。 ## 9363 只读部署门禁 9363 的 Windows preflight 分为 `predeploy` 和 `postdeploy` 两阶段,明确报告 `transport`、`sudo`、`artifact`、`database-admin`、`migration`、`service` 和 `smoke`;preflight 只读,不执行 build、upload、migration、stop 或 restart,`productionApproval` 始终为 `NO-GO`。 live preflight 使用固定 `bash -s` SSH wrapper。wrapper 通过 LF stdin 接收本地生成的脚本,远端仅在内存解码 sudo 密码并以 stdin 喂给 `sudo -S`;SSH argv 只携带 base64 后的非敏感 probe、host、provider URL 和 phase。provider URL 可以是 `http://` 或 `https://`,但不得包含 userinfo、credential query 或命令字符。`deploy/` 是被 Git 忽略的本机运维目录,不随仓库分发;仓库内长期部署约束和通用入口见 [部署说明](docs/DEPLOYMENT.md)。 ## 本地入口 | 入口 | 地址 | | --- | --- | | 本地 Vite HTTP(仅开发) | `http://127.0.0.1:20121` | | 本地 Vite HTTPS(仅开发) | `https://127.0.0.1:20122` | | Go HTTP + Vue dist | `http://127.0.0.1:20123` | | Go HTTPS + Vue dist | `https://127.0.0.1:20124` | | MySQL 5.7(本地默认) | `127.0.0.1:3306` | | ZLM HTTP/WHIP/WHEP | `127.0.0.1:20125` | | ZLM HTTPS/WHIP/WHEP | `127.0.0.1:20126` | | ZLM WebRTC 单端口 | `127.0.0.1:20127/udp+tcp` | | Go ZLM Hook | 复用 `127.0.0.1:20123/internal/zlm/hooks/*`,仅接受 loopback 来源 | | 受控预留 | `20128-20130`,不得出现公网未知 listener | 本地开发管理员为 `admin / Admin@123456`,只用于隔离开发库,生产必须重新 bootstrap 强密码。开发 HTTPS 使用忽略提交的自签名证书,浏览器首次访问会提示证书不受信任;生产只允许使用受管证书。 本地可运行入口为 `scripts/build-and-start.ps1`:直接运行会显示构建、激活、重启、状态和停止菜单。后端或完整构建先写入忽略提交的 `bin/.staging/` 候选目录,不中断活动服务;只有显式激活时才替换 `bin/`,执行 GORM Schema Sync、启动和登录 smoke。运行中的 `ucs` 默认读取同目录 `config.yaml` 和受保护 `config.env`,不需要启动参数。发布包入口为 `scripts/package-releases.ps1`,生成 Windows/Linux amd64 的公开目录包;真实 `config.yaml`、config.env、secrets、TLS 私钥、logs 和 legacy 备份不会进入发布包。配置和部署约定见 [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md),在线更新执行顺序见 [docs/operations/ONLINE_UPDATE.md](docs/operations/ONLINE_UPDATE.md)。 9363 使用本地忽略的 `deploy/9363/deploy-ucs-9363.ps1` 更新。服务固定在 `/egova/apps/ai/uc/ucs`;首次固定目录部署会由当前 Go Schema 自动创建/补齐数据库结构,此后平台模式只替换 `ucs`、`dist` 并执行 Schema Sync,不覆盖配置或 systemd unit;平台+ZLMediaKit 模式只替换 `/egova/apps/ai/uc/ms/ZLMediaKit` 的二进制和运行库,保留 ZLM 配置、证书、wrapper 与日志。详见 [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)。 录像回放的 manifest 由 Go 统一鉴权并返回参与者、来源质量和时间锚点;查看、下载、软删除均由 Go 中转并写入审计,浏览器不直连 ZLMediaKit。真实 2 人短测已证明 MP4 文件、Range 和多轨播放链路可工作,但 8/16 人长稳、异常退出以及 Go/ZLM 重启恢复仍需独立现场证据,不能用页面状态或接口存在代替录像验收。 纯语音会议的远端声音若被浏览器 autoplay policy 暂停,会在会中控制区显示“启用会议声音”按钮;点击只重试浏览器音频播放,不代表真实媒体链路已通过,仍以 Chromium/ZLM RTP、音频 samples 和资源归零证据为准。 ## 目录 ```text unified-communications-platform/ ├── backend/ # Go 模块化单体、MySQL migration:顶层横向分层 ├── frontend/ # Vue 3 + TypeScript ├── contracts/ # OpenAPI、WebSocket 和媒体契约 ├── scripts-example/ # 可提交的通用构建、启动和发布包模板 ├── scripts/ # 本机被 Git 忽略的脚本副本 ├── docs/ # 架构、路线图、模块索引和运维文档 ``` 本机可按环境创建 `deploy/` 保存部署、升级、回滚和健康检查脚本,但该目录整体由根 `.gitignore` 忽略,不属于版本化交付物。不得在其中保存后又尝试提交真实密钥或现场配置。 后端当前采用一套受门禁约束的顶层横向分层:`backend/internal/api`、`service`、`model`、`repository`、`router`、`adapter`、`infrastructure`、`app`。房间与媒体能力在各层内以职责明确的文件组织,禁止恢复旧纵向业务域目录。依赖方向由 `backend/architecture_test.go` 自动检查,文件规模由 `node scripts-example/check-file-lines.mjs` 检查。 `backend/cmd/unified-communications-server` 是唯一平台生产入口。9363 在线平台更新包固定只包含 `ucs`、`dist/` 和 checksum;固定目录中的配置与 unit 不随平台包覆盖。9363 本地部署入口另外提供平台+ZLMediaKit 模式,ZLM 模式只原子替换 `/egova/apps/ai/uc/ms/ZLMediaKit` 的二进制和运行库;egova-video-go 与 ASR 不随平台或 ZLM 更新。独立 Vite 端口和历史容器媒体端口不属于正式路径。16 人长稳、重启恢复和公网准入仍需独立验收。 ## SDK 直连模式 如果第三方需要自行控制会议界面,可使用 `packages/meeting-sdk` 和 `examples/meeting-sdk-demo`。SDK 不使用 iframe,调用方可使用平台短期 `MeetingSdkSession`,也可在公司统一套件中直接复用已有 User Center 用户 Token;平台服务端负责验真和本地权限映射,不要求客户端保存第二个会议 Token。默认 `MeetingRoom` 还会按应用已分配的视频中心展示会议设备树,并使用与平台会议一致的 WHEP 设备视频订阅链路。Vue 2.7 项目使用 `packages/meeting-sdk-vue2` 和 `examples/meeting-sdk-vue2-demo`,不需要把宿主升级为 Vue 3。详细示例见 `packages/meeting-sdk/README.md`、`packages/meeting-sdk-vue2/README.md` 和 `docs/guides/SDK_INTEGRATION.md`;移动端与 Vue2 大屏的统一用户中心登录、直接 Token、刷新和邀请联调见 `docs/guides/USER_CENTER_CLIENT_INTEGRATION.md`。 ## npm Registry SDK Consumer Demo `examples/meeting-sdk-registry-demo` 是只安装已发布 npm 包的第三方消费者示例,使用 `@unified-communications/meeting-sdk@0.1.0`,默认开发端口为 `20135`。源码联调仍使用 `examples/meeting-sdk-demo` 的 `file:` 依赖和 `20134` 端口。