Files
park-desktop/README.md
T

114 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 园区大屏(park-desktop / DPM)
> 核对:2026-10-19 · 依据 park-desktop `main@a2fbad8` · 以实现为准
**DPM**(Digital Playback Media)—— 基于 **Tauri 2 + React 19** 的园区大屏客户端,为昆明市大学生创业园 OPC 运营中心提供数据大屏、数字孪生、AI 助手、媒体轮播、任务大屏与企业墙。
> 园区后端已并入 **server-core `/park`**(不再有独立 `:10085` 后端);管理后台为后端 **FastAPI + Jinja** 页面(`GET /admin`),**不由 React 路由接管**。实时控制走 **MQTT(EMQX `:8083`)**,不再使用内置 Axum HTTP 服务 / SSE / nps。
## 技术栈
| 层级 | 技术 |
|------|------|
| 前端框架 | React 19 + React Router 7 |
| 构建工具 | Vite 7 + Tailwind 4.3(`@tailwindcss/vite`) |
| 桌面框架 | Tauri 2(Rust,`src-tauri/`,本地 `wry` 补丁) |
| 三维 / 可视化 | three 0.185(`@react-three/fiber` / `drei`)、`@appica/ui-react` |
| 实时通信 | MQTT 5.15(`mqtt.js`,EMQX) |
| 二维码 | `qrcode.react` |
## 页面(`src/App.jsx`)
| 路由 | 页面 | 说明 |
|------|------|------|
| `/` | `DataScreen` | 园区数据大屏(概览/数据快照) |
| `/twin` | `DigitalTwin` | 数字孪生(3D 园区) |
| `/ai` | `AiAssistant` | 园区 AI 助手(含语音 s2s) |
| `/screen` | `MediaScreen` | 全屏媒体轮播(视频/图片,MQTT 受控) |
| `/tasks` | `TaskDisplay` | 任务大屏(轮播卡 + 二维码扫码接单) |
| `/wall` | `CompanyWall` | 入驻企业展示墙 |
- 统一页眉布局 `components/ScreenLayout`;`/voice` 有 `VoiceAssistant` 组件但**当前未挂路由**。
- 首启可走 **屏幕绑定**(`components/BindScreen` + `utils/tenant`,绑定后按租户拉数据);支持双屏(`set_dual_screen`)、全屏、开机自启(`tauri-plugin-autostart`)、应用内自动更新(`components/UpdateNotify` + `utils/updateCheck`)。
## 功能概览
- **媒体轮播**(`pages/MediaScreen.jsx`):视频/图片全屏轮播、沉浸式空间背景、自动播放、点击暂停/恢复、音量与顺序/随机播放、播放状态上报(`opc/display/*` MQTT 主题)。
- **任务大屏**(`pages/TaskDisplay.jsx`):任务轮播卡 + 二维码扫码接单。
- **园区数据 / 数字孪生 / 企业墙**:数据快照(`opc/dashboard/tick`)、3D 园区、入驻企业展示。
- **AI 助手**:对话面板 + 语音 s2s(`src/voice/`)。
- **设备与运维**:屏幕绑定/租户隔离、心跳上报(`opc/display/heartbeat`,后端统计在线)、双屏、全屏、开机自启、自动更新。
- **管理后台**:媒体上传、播放列表编排与播放控制等由 **server-core `/park`** 的后端 `/admin` 页面提供(前端不再内置管理页)。
## 快速开始
### 环境要求
- **Rust**(edition 2021)、**Node.js** >= 18、**Yarn**(或 npm)、Tauri 2 CLI(`yarn tauri` 走本地依赖)
### 安装与运行
```bash
yarn install
yarn dev # 仅启动 Vite(http://localhost:1420,浏览器预览大屏)
yarn tauri dev # Tauri 桌面端(前端 + Rust 壳)
yarn build # 前端产物 dist/
yarn tauri build # 桌面安装包,产物在 src-tauri/target/release/
```
> ⚠️ 按团队铁律:**AI 不启动/重启任何服务(含 vite / Tauri)**,需要时通知用户亲自操作。
### 配置(`src/config.js`)
地址解析优先级:**exe 旁 `config.json`(Tauri `read_runtime_config`)> 后端 `/park/api/config` 下发 > 构建期 `VITE_*` > 内置默认**。
| 项 | 默认 | 覆盖方式 |
|----|------|---------|
| 园区 API | `http://<当前主机>:8090/park`(打包生产回退 `opc.pinesound.cn`) | `window.__DPM_API__`、`VITE_API_BASE` |
| MQTT | `ws(s)://<当前主机>:8083/mqtt`(生产 `wss`) | `window.__DPM_MQTT__`、`VITE_MQTT_URL` |
| 视频识别 | 空 = 禁用 | `window.__DPM_VISION__`、`VITE_VISION_API_BASE` |
| 大屏引导令牌 | 空 | `window.__DPM_BOOTSTRAP__`、`VITE_PARK_BOOTSTRAP_TOKEN` |
旧 `:10085` 地址一律判为失效并回退 server-core 统一入口。
## 项目结构
```
index.html
package.json # 包名 dpm
vite.config.js # 端口 1420;无 dev 代理(API 由 src/config.js 直连 server-core)
public/ # logo、语音 worklets 等静态资源
src/
main.jsx # React 入口 + 运行时配置引导 + 致命错误兜底
App.jsx # 6 个大屏路由
config.js # API / MQTT / Vision / bootstrap 令牌解析
pages/ # DataScreen / DigitalTwin / AiAssistant / MediaScreen / TaskDisplay / CompanyWall
components/ # ScreenLayout / BindScreen / PageHeader / 各类面板、弹窗
utils/ # api.js、mqtt.js、tenant.js、taskData.js、updateCheck.js、pageNav.js、sounds.js
voice/ # s2s 语音客户端、orb 可视化、worklets
styles/ # tokens/global/datascreen/mediascreen/task-display 等
src-tauri/
Cargo.toml # tauri 2 + opener/autostart + 本地 wry 补丁
tauri.conf.json # productName「云超服昆创园OPC运营中心」,1200x800 全屏
capabilities/default.json # 窗口/自启/opener 权限
src/{main.rs,lib.rs} # 入口;命令:set_dual_screen / install_update / read_runtime_config
```
## 端口一览
| 端口 | 用途 |
|------|------|
| 1420 | Vite 前端开发服务器(`strictPort`) |
| 8090 | server-core(园区 API 前缀 `/park`) |
| 8083 | MQTT Broker(EMQX,`/mqtt`) |
| 10085 | **已废弃**的旧园区后端(源码已回退到统一入口,勿再使用) |
## 许可
本项目为昆明市大学生创业园公益定制开发。
---
*云南派音人工智能科技提供技术支持*