调整图片画布路由和画布数据模型

将图片画布入口改为 /editor/canvas

新增 editor_canvas 表并关联 editor_project 默认画布

更新 project API 响应中的 canvas 快照兼容层

统一图片画布侧栏列表项和图标按钮组件

同步前端测试、SpacetimeDB bindings、技术文档和 TRACKING 记录
This commit is contained in:
2026-06-13 22:09:45 +08:00
parent a1b9ac8544
commit 242860e2d3
21 changed files with 1649 additions and 295 deletions

View File

@@ -12,6 +12,7 @@ pub struct EditorProjectRecord {
pub project_id: String,
pub owner_user_id: String,
pub title: String,
pub canvas: EditorCanvasRecord,
pub viewport: EditorCanvasViewportRecord,
pub layers: serde_json::Value,
pub resources: Vec<EditorProjectResourceRecord>,
@@ -19,6 +20,17 @@ pub struct EditorProjectRecord {
pub updated_at: String,
}
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct EditorCanvasRecord {
pub canvas_id: String,
pub project_id: String,
pub title: String,
pub viewport: EditorCanvasViewportRecord,
pub layers: serde_json::Value,
pub created_at: String,
pub updated_at: String,
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct EditorProjectResourceRecord {
pub resource_id: String,
@@ -178,19 +190,31 @@ pub(crate) fn map_editor_project_resource_procedure_result(
fn map_editor_project_snapshot(
snapshot: EditorProjectSnapshot,
) -> Result<EditorProjectRecord, SpacetimeClientError> {
let layers = serde_json::from_str(&snapshot.layers_json).map_err(|error| {
let layers: serde_json::Value =
serde_json::from_str(&snapshot.canvas.layers_json).map_err(|error| {
SpacetimeClientError::validation_failed(format!("图片画布图层布局 JSON 无法解析:{error}"))
})?;
let viewport = EditorCanvasViewportRecord {
x: snapshot.canvas.viewport.x,
y: snapshot.canvas.viewport.y,
scale: snapshot.canvas.viewport.scale,
};
let canvas = EditorCanvasRecord {
canvas_id: snapshot.canvas.canvas_id,
project_id: snapshot.canvas.project_id,
title: snapshot.canvas.title,
viewport: viewport.clone(),
layers: layers.clone(),
created_at: format_timestamp_micros(snapshot.canvas.created_at_micros),
updated_at: format_timestamp_micros(snapshot.canvas.updated_at_micros),
};
Ok(EditorProjectRecord {
project_id: snapshot.project_id,
owner_user_id: snapshot.owner_user_id,
title: snapshot.title,
viewport: EditorCanvasViewportRecord {
x: snapshot.viewport.x,
y: snapshot.viewport.y,
scale: snapshot.viewport.scale,
},
canvas,
viewport,
layers,
resources: snapshot
.resources