feat(canvas): 实现画布项目导出为ZIP压缩包功能

- 新增 canvas-export 工具模块,支持将画布项目打包为 ZIP 文件
- 修改导出功能,将原来的 JSON 格式改为 ZIP 压缩包,包含 projects.json 和相关媒体文件
- 添加对 fflate 库的依赖用于 ZIP 文件处理
- 更新画布库页面,支持多选项目批量导出
- 修改导入功能以支持读取新版 ZIP 格式的画布项目
- 新增 zip 处理工具库,封装压缩和解压操作
- 扩展文件存储服务,添加获取和设置 Blob 对象的方法
- 更新 AGENTS.md 文档,添加标准库使用原则
This commit is contained in:
HouYunFei
2026-05-26 13:00:16 +08:00
parent 567ead89b1
commit 1fb782819b
11 changed files with 160 additions and 28 deletions
+11
View File
@@ -29,6 +29,17 @@ export async function resolveMediaUrl(storageKey?: string, fallback = "") {
return url;
}
export async function getMediaBlob(storageKey: string) {
return store.getItem<Blob>(storageKey);
}
export async function setMediaBlob(storageKey: string, blob: Blob) {
await store.setItem(storageKey, blob);
const url = URL.createObjectURL(blob);
objectUrls.set(storageKey, url);
return url;
}
export async function cleanupUnusedMedia(usedData: unknown) {
const usedKeys = collectMediaStorageKeys(usedData);
const unused: string[] = [];
+11
View File
@@ -38,6 +38,17 @@ export async function resolveImageUrl(storageKey?: string, fallback = "") {
return url;
}
export async function getImageBlob(storageKey: string) {
return store.getItem<Blob>(storageKey);
}
export async function setImageBlob(storageKey: string, blob: Blob) {
await store.setItem(storageKey, blob);
const url = URL.createObjectURL(blob);
objectUrls.set(storageKey, url);
return url;
}
export async function imageToDataUrl(image: { url?: string; dataUrl?: string; storageKey?: string }) {
const url = image.dataUrl || (await resolveImageUrl(image.storageKey, image.url || ""));
if (!url || url.startsWith("data:")) return url;