48 lines
2.7 KiB
Markdown
48 lines
2.7 KiB
Markdown
# demo —— W-07 实时演示模块
|
||
|
||
## 用途
|
||
在元景(scense)平台中为世界(world)提供「实时演示」能力:编辑器点击「演示」进入预览态,
|
||
可在演示中实时编辑实体(前端 <1s 反映)、保存脚本即热加载、切换视角/暂停继续/全屏、
|
||
多人同时预览。演示期间的任何改动只落在演示覆盖层,结束演示后**正式数据不变**(状态隔离)。
|
||
|
||
## 功能点(W-07a ~ W-07j)
|
||
| 编号 | 功能 | 接口 |
|
||
|------|------|------|
|
||
| W-07a | 开始演示(进入预览态) | POST /demo/api/start.dspy |
|
||
| W-07b | 结束演示(清理覆盖层) | POST /demo/api/stop.dspy |
|
||
| W-07c | 编辑实体实时反映(<1s) | POST /demo/api/entity_edit.dspy |
|
||
| W-07d | 脚本保存热加载 | POST /demo/api/hotload.dspy |
|
||
| W-07e | 视角切换 | POST /demo/api/camera.dspy |
|
||
| W-07f | 暂停/继续 | POST /demo/api/pause.dspy |
|
||
| W-07g | 全屏 | POST /demo/api/fullscreen.dspy |
|
||
| W-07h | 状态隔离(演示改动不污染正式数据) | 覆盖层表 + stop 清理 |
|
||
| W-07i | 查看实体属性 | POST /demo/api/entity_attrs.dspy |
|
||
| W-07j | 多人预览 | POST /demo/api/presence.dspy |
|
||
| - | 状态轮询(500ms,<1s 反映) | POST /demo/api/state.dspy |
|
||
|
||
## 数据表(models/*.json)
|
||
- `demo_session`:演示会话(status=preview/paused/ended,camera_mode,viewer_count,extra_json)
|
||
- `demo_session_state`:实体状态覆盖层(base_json=基线快照,demo_json=演示中当前值)
|
||
- `demo_hot_script`:演示中热加载脚本
|
||
- `demo_presence`:多人预览在线表
|
||
|
||
## 状态隔离原理
|
||
演示开始把实体当前状态复制为 `base_json`(只读基线);演示中编辑只写 `demo_session_state.demo_json`,
|
||
**从不写正式 entity/scene/world 表**。`stop_demo` 删除会话+覆盖层+脚本+在线表 —— 正式数据零污染。
|
||
|
||
## 前端
|
||
- `wwwroot/demo_viewer.ui` + `demo_viewer.js`:three.js 渲染世界 + 500ms 轮询 state.dspy
|
||
- `wwwroot/index.ui`:模块入口卡片
|
||
|
||
## 安装 / 集成(Sage 宿主)
|
||
1. `pip install .`(模块包)
|
||
2. `app/sage.py`:`from demo.init import load_demo` + `load_demo()` 于 init()
|
||
3. `build.sh`:安装循环加入 demo;`ln -sf <module>/wwwroot <sage>/wwwroot/demo`
|
||
4. `scripts/load_path.py`:注册 RBAC(logined);中央 load_path.py 同步登记
|
||
5. `global_menu.ui`:`{"name":"demo","label":"实时演示","url":"{{entire_url('/demo/index.ui')}}","target":"app.sage_main_content"}`
|
||
6. 部署库名由宿主 `get_module_dbname('demo')` 决定,模块内禁止硬编码 DBNAME
|
||
|
||
## 验收口径
|
||
- 启动/结束演示接口 200;演示中编辑实体前端 <1s 反映(500ms 轮询);退出后正式 entity/world 数据不变
|
||
- 每个功能点正例 + 反例自测(见 skill/SKILL.md 与 docs/)
|