world_snapshot/docs/work-log-2026-07-15.md

49 lines
3.2 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.

# world_snapshot 模块开发(W-04 快照管理)— 工作日志
日期:2026-07-15(按当前系统日期)
模块仓库:`modules/world_snapshot/`(git 已 init)
任务:W-04 快照管理功能点开发(new_dev,迭代「元景项目-初始迭代」)
## 范围与背景
W-03 已有基础版 world_snapshot(简单 CRUD + 恢复),本次按 W-04 需求升级为完整快照管理:
1. **world_snapshot 表**:新增 `checksum`(sha256) 与 `version`(int) 字段;`(world_id, version)` 唯一索引
2. **快照生成**:同一事务批量聚合 world/scene/entity + checksum 数据一致性校验 + version 按世界递增(max+1,行锁 `for update` 防并发重复)
3. **快照恢复**:同一事务 checksum 校验 → 先删后插写回 scene/entity → 世界 mode 联动 → 置 restored;任一步失败整体回滚无脏数据
4. **编码字典**:snapshot_status / snapshot_type 经 `init/data.json` 幂等落库(appcodes 格式,parentid ≤22 字符约束满足)
5. **REST 规范**:统一前缀 `/api/*`(wwwroot/api/snapshot_*.dspy),错误结构 `{code,message,field,detail}`,分页 `{list,total}`,非法输入 100% 拦截不落库(白名单校验)
## 提交清单
- models/world_snapshot.json —— 表定义(checksum/version/唯一索引/codes 引用)
- init/data.json —— 编码字典种子
- world_snapshot/init.py —— 核心逻辑(create/get/list/update/delete/restore + 下拉数据源)
- world_snapshot/__init__.py —— 包导出(三处注册同步)
- json/world_snapshot.json —— CRUD 定义(editable + 顶层 new/update/delete/list_data_url)
- wwwroot/api/*.dspy —— 9 个 REST 薄封装
- wwwroot/index.ui / snapshot_generate.ui / snapshot_restore.ui —— 前端页面
- scripts/load_path.py —— RBAC 显式注册(无通配符)
- pyproject.toml / README.md / skill/SKILL.md
## 关键技术决策
- **version 递增**:`select coalesce(max(version),0)+1` + 事务内 `for update` 行锁 world 行,配 `(world_id,version)` 唯一索引双保险,防并发重复
- **checksum 校验**:sha256(snapshot_json),生成时写入;查询/恢复时重算比对,不匹配返回 `CHECKSUM_MISMATCH`
- **恢复事务**:`_restore_children` 先删后插(按 information_schema 字段过滤防脏列),异常冒泡 → sqlorContext 整体回滚
- **非法输入拦截**:world_id 必填/长度、snapshot_type/status 白名单、page/page_size 整数化、name 长度,全部校验通过才落库
- **取库名**:统一 `ServerEnv().get_module_dbname('world_snapshot')`(.py)与全局 `get_module_dbname()`(.dspy),无硬编码
## 验证
- init/data.json 用 `json.load` 自验(合法 JSON,真实种子数据)
- models/world_snapshot.json 符合四段式(summary/fields/indexes/codes)
- .dspy 无 import(仅调用 load_*() 导出的函数),符合 dspy audit 规范
- .py 均用 sor.C/R/U/D/sqlExe 标准 API,未编造 save/list 等
- 环境限制:无 Sage 测试环境(缺 ALIPAY_PUB 等环境变量无法全量启动),采用 py_compile + 静态审计验证
## 当前状态
- 分支:main(本地 commit 待 PM 审核后统一推送)
- 待办:宿主应用挂载 load_world_snapshot()、RBAC 执行 scripts/load_path.py、部署后 curl 冒烟