1.9 KiB
1.9 KiB
设计
技术合约不在本文重复定义。权威定义见父任务 .trellis/tasks/08-26-direct-manipulation-road-editor/design.md 的以下小节:
- 「Handle manifest」— 客户端读取的字段与
reserves禁入区语义。 - 「坐标与单位分层」— 客户端渲染用 EPSG:3857,指针位移换米必须先回 4326 再用球面距离。
- 「预览时序与延迟预算」— 80ms 防抖、
pointerup最终请求、previewSeq乱序丢弃、degraded处理。 - 「交互与预览」「编辑所有权」— 只读基线图层、三个独立 source、道路区间与 junction reserve 的边界。
- 「客户端边界」— 遗留
app.js不在范围、vitest覆盖范围。 - 「上线与回滚形态」—
directEdit开关默认关闭时的行为。
输入 adapter 的候选、探针退出条件与回退优先级见父任务 research/canvas-integration.md。
本子任务的局部决定
- 三个 source 严格分离:
editHandles(手柄)、editGhost(客户端即时轮廓与辅助线)、editPreview(服务端权威几何)。基线图层始终只读,绝不写入。 - 手柄 feature 的 properties 只带
handleId,语义一律回 manifest 查。这样客户端没有第二份约束模型。 - ghost 只画手柄、辅助线与半透明预估轮廓,不承担权威几何。服务端预览到达后替换
editPreview,ghost 随即淡出。 EditSession是纯逻辑对象,不持有 OpenLayers 引用:命令栈、undo/redo、previewSeq仲裁都可在 node 环境下单测。OL 只作为它的输入输出适配层。previewSeq仲裁放在EditSession而非请求层:请求层只负责发与取消,丢弃决策要可测。- 探针独立成可删除目录,不进
MapCanvas。探针结论只影响"手柄命中与拖拽由谁实现",不影响上面任何一条。 - 开关关闭时不注册 interaction、不请求 manifest、不创建三个 source,确保零残留开销。