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

3.2 KiB
Raw Blame History

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 冒烟