Files
DPM/backend/README.md
T
Pine 00cb76c73f feat: 管理后台迁移至 FastAPI + Jinja2 服务端渲染
- GET /admin:Jinja 模板渲染(登录页 / 管理台),媒体库、播放列表、设置由服务端渲染
- POST /admin/login:表单登录 + HMAC 签名 Cookie(DPM_ADMIN_SECRET),GET /admin/logout 退出
- /static/admin.css + admin.js:动态操作(上传进度/播放控制/设置/SSE 状态/预览弹窗)调 REST 后整页刷新
- 前端移除 React Admin 页面与 /admin 路由(Admin.jsx 删除);媒体/播放列表接口保持不变
- 依赖改用 uv 管理(pyproject.toml + uv.lock,含 jinja2),README 更新启动方式
2026-08-17 21:30:44 +08:00

87 lines
4.4 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.
# OPC 智能园区后端(FastAPI + MQTT
独立后端服务:**所有数据通过 REST API 提供**,**页面/媒体控制通过 MQTT 下发**,媒体资源由后端统一存储与返回。
## 架构
```
┌──────────────┐ REST(全部数据/媒体/设置) ┌────────────────┐
│ Tauri 大屏 │ ◄────────────────────────── │ FastAPI :10085 │
│ (React 前端) │ └───────┬────────┘
│ │ MQTT 订阅 opc/display/command │ MQTT 发布
│ 账号: dpm │ ◄────────────────────────────────────│ 账号: dpmserver
└──────┬───────┘ MQTT Broker (EMQX) │
│ 192.168.1.3:1883 │
└───────────────────────────────────────────────┘
```
- **数据**`GET /api/dashboard/snapshot`(每 2.2s 刷新,模拟引擎在后端运行)等
- **控制**`POST /api/display/command` → MQTT `opc/display/command` → 所有大屏订阅同步响应
- **媒体**:上传/列表/播放列表/`/file` 静态返回(图片/视频统一由后端托管)
- **AI**:通义千问(DashScope)+ 工具调用(切页/控制/卡片/通知,经 MQTT 广播);语音识别用阿里云 paraformer
## 启动
```bash
cd backend
uv sync # 安装依赖(fastapi/uvicorn/paho-mqtt/dashscope/jinja2 等)
cp .env.example .env # 按需修改(含 DashScope Key、MQTT 账号)
uv run python main.py # 或 .venv/bin/python main.py
```
启动后:API 与前端页面均在 `http://0.0.0.0:10085`(浏览器直接打开即大屏)。
## 环境变量(backend/.env
| 变量 | 说明 |
|---|---|
| `DPM_HOST` / `DPM_PORT`(或 `FASTAPI_HOST`/`FASTAPI_PORT` | 监听地址,默认 `0.0.0.0:10085` |
| `DPM_MQTT_HOST` / `DPM_MQTT_PORT` | MQTT broker 地址,默认读 `MQTT_BROKER_HOST/PORT` |
| `MQTT_USERNAME` / `MQTT_PASSWORD` | **服务端发布账号:dpmserver / 123456** |
| `DASHSCOPE_API_KEY` | 阿里云 DashScopeLLM + 语音识别) |
| `DPM_LLM_MODEL` | 默认 `qwen-plus` |
| `DPM_ASR_MODEL` | 默认 `paraformer-realtime-v2` |
> 前端连接配置在项目根 `.env.local`(已 gitignore):`VITE_API_BASE`、`VITE_MQTT_URL`、`VITE_MQTT_USERNAME=dpm`、`VITE_MQTT_PASSWORD=123456`。
## MQTT 主题
| 主题 | 方向 | 说明 |
|---|---|---|
| `opc/display/command` | 后端→前端 | `{cmd_id, ts, action, params}`action: `navigate` / `navigate_rel` / `play` / `pause` / `next` / `prev` / `alert` / `show_card` / `set_mode` |
| `opc/dashboard/tick` | 后端→前端 | 数据快照(`{ts, snapshot}` |
| `opc/display/ack` | 前端→后端 | 指令回执(预留) |
## 控制示例
```bash
# 切换页面(数据大屏 / 数字孪生 / AI 助手 / 媒体轮播)
curl -X POST http://localhost:10085/api/display/command \
-H "Content-Type: application/json" \
-d '{"action":"navigate","params":{"page":"/twin"}}'
# 媒体控制
curl -X POST http://localhost:10085/api/display/command \
-d '{"action":"next","params":{}}'
# 大屏通知
curl -X POST http://localhost:10085/api/display/command \
-d '{"action":"alert","params":{"title":"园区通知","content":"..."}}'
```
## 关键接口
- `GET /api/dashboard/snapshot` — 大屏全量数据快照
- `GET /api/park/companies` · `GET /api/park/zones` — 企业分布
- `POST /api/ai/chat` — AI 对话(`{messages:[{role,content}]}``{reply, tools, mqtt_published}`
- `POST /api/ai/asr` — 语音识别(multipart 上传录音 + `format` 参数)
- `GET/POST /api/playlist` · `POST /upload` · `GET /media` — 媒体与播放列表
- `POST /api/display/command` — 管理端控制指令(转 MQTT 广播)
- `GET /api/events` — SSE 兼容通道(MQTT 不可用时的前端回退)
## 说明
- 大屏数据由后端模拟引擎产生(`sim_engine.py`,与原前端 `parkData.js` 逻辑一致);前端离线时也有本地兜底
- 媒体文件存放于 `backend/media/``/file/...` 直接返回
- 安全:`backend/.env` 与根 `.env.local` 已加入 `.gitignore`,含阿里云密钥与 MQTT 凭据,勿提交