scene/docs/work-log-2026-07-19.md
2026-08-29 12:44:22 +08:00

47 lines
3.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.

# scene 模块开发工作日志
日期:2026-07-19
模块:scene(W-02 场景管理)
任务:new_dev(新开发),迭代「元景项目-初始迭代」
## 范围 / 背景
按 design 交付 modules/scene.md 与 design/scene.md 实现 W-02 场景管理:
- scene.scene / scene_import 表 CRUD、列表查询(分页 {list,total})
- 场景导入(api/scene_import.dspy 文件导入)
- scene.world_id → world.id 逻辑关联(codes 段,不加外键)
- 导入事务批量 + 失败回滚无脏数据
- REST 统一前缀 /api/*,错误结构 {code,message,field,detail}
- 非法输入 100% 拦截不落库
## 交付清单
| 文件 | 说明 |
|---|---|
| models/scene.json | scene 表定义(id PK、idx_scene_code 唯一、idx_scene_world;codes 段 world/appcodes) |
| models/scene_import.json | scene_import 表定义(只读导入记录) |
| json/scene.json | scene CRUD 定义(editable 顶部 new/update/delete_data_url → 自定义 api/*.dspy) |
| json/scene_import.json | scene_import 只读列表定义 |
| init/data.json | appcodes 种子:scene_type / scene_status / import_status |
| scene/init.py | 全部业务函数:list/get/create/update/delete/import_scenes/parse_scene_file/下拉 |
| scene/__init__.py | 包导出(与 init.py、load_scene 三处同步注册) |
| wwwroot/api/*.dspy | 9 个 REST 接口(/scene/api/*.dspy) |
| wwwroot/index.ui | 场景管理入口(列表/导入/导入记录三卡片) |
| wwwroot/import_page.ui | 导入页(Form:world_id + file) |
| scripts/load_path.py | RBAC 显式路径注册(无通配符) |
| pyproject.toml / README.md / .gitignore / skill/SKILL.md | 工程化配套 |
## 关键技术决策
1. **world_id 逻辑关联**:models codes 段声明 world_id→world(id/name) 渲染下拉,不加物理外键;create/update/import 在 Python 层显式校验 world 存在(`_world_exists`),非法 world_id 100% 拦截。
2. **导入事务回滚**:import_scenes 先对全部行做字段校验(name/code/world_id 必填、长度上限、文件内 code 去重),再在一个 `async with sqlorContext` 内逐条 sor.C;任一条异常 → 整个 context 回滚,仅写一条 status=2 的 scene_import 失败记录。无脏数据。
3. **分页 {list,total}**:用 `sor.sqlPaging(sql, {page, rows, ...})`,支持白名单 sort/order(防注入),rows 上限 200。
4. **错误结构统一**:`{code, message, field, detail}`;code 枚举见 SKILL.md。
5. **REST 统一前缀**:所有接口放 wwwroot/api/*.dspy,宿主挂载后路径为 `/scene/api/*.dspy`;返回 `{status:'ok'|'error', data}`。
6. **三处同步注册**:scene/__init__.py 导出 ← scene/init.py 实现 ← load_scene() env.xxx=xxx;.dspy 无 import 直接调用全局函数。
## 验证情况(环境受限)
- 本工作空间无运行时环境(无 MySQL/ahserver/宿主应用),无法启动服务 curl 实测。
- 已做静态自检:模型 JSON 四段式(summary/fields/indexes/codes);CRUD JSON 有 tblname + params.editable + 顶部 new/update/delete_data_url;dspy 无 import/print/uuid,均显式 return;init.py 用 sor.C/U/R/D/sqlPaging 标准 API(无编造 save/list/insert);未硬编码 DBNAME(全部 get_module_dbname)。
- 待部署环境验证项:`pip install .`、json2ddl 建表、xls2ui 生成 CRUD UI、RBAC 注册、curl 各 /scene/api/*.dspy。
## 当前状态
- 模块仓库 modules/scene/,未提交(交付后由 PM 审核通过统一 git 提交)。