阶段性提交

This commit is contained in:
2025-09-21 14:43:59 +08:00
parent af2058f752
commit 690a530031
20 changed files with 1577 additions and 781 deletions

View File

@@ -2,13 +2,14 @@ import { Generation, Edit } from '../types';
// 数据库配置
const DB_NAME = 'NanoBananaDB';
const DB_VERSION = 1;
const DB_VERSION = 2; // 更新版本号
const GENERATIONS_STORE = 'generations';
const EDITS_STORE = 'edits';
const REFERENCE_IMAGES_STORE = 'referenceImages'; // 新增参考图像存储
// 重试配置
const MAX_RETRIES = 3;
const RETRY_DELAY = 1000;
// const MAX_RETRIES = 3;
// const RETRY_DELAY = 1000;
// IndexedDB实例
let db: IDBDatabase | null = null;
@@ -45,6 +46,12 @@ export const initDB = (): Promise<void> => {
editStore.createIndex('timestamp', 'timestamp', { unique: false });
editStore.createIndex('parentGenerationId', 'parentGenerationId', { unique: false });
}
// 创建参考图像存储
if (!db.objectStoreNames.contains(REFERENCE_IMAGES_STORE)) {
const refImageStore = db.createObjectStore(REFERENCE_IMAGES_STORE, { keyPath: 'id' });
refImageStore.createIndex('timestamp', 'timestamp', { unique: false });
}
};
});
};
@@ -318,7 +325,7 @@ export const cleanupBase64Data = async (): Promise<void> => {
let needsUpdate = false;
// 清理源资产中的base64数据
const cleanedSourceAssets = generation.sourceAssets.map((asset: any) => {
const cleanedSourceAssets = generation.sourceAssets.map((asset) => {
if (asset.url && asset.url.startsWith('data:')) {
needsUpdate = true;
return {
@@ -330,7 +337,7 @@ export const cleanupBase64Data = async (): Promise<void> => {
});
// 清理输出资产中的base64数据
const cleanedOutputAssets = generation.outputAssets.map((asset: any) => {
const cleanedOutputAssets = generation.outputAssets.map((asset) => {
if (asset.url && asset.url.startsWith('data:')) {
needsUpdate = true;
return {
@@ -375,7 +382,7 @@ export const cleanupBase64Data = async (): Promise<void> => {
}
// 清理输出资产中的base64数据
const cleanedOutputAssets = edit.outputAssets.map((asset: any) => {
const cleanedOutputAssets = edit.outputAssets.map((asset) => {
if (asset.url && asset.url.startsWith('data:')) {
needsUpdate = true;
return {
@@ -478,6 +485,86 @@ export const deleteEdits = async (ids: string[]): Promise<void> => {
return Promise.all(promises).then(() => undefined);
};
/**
* 添加参考图像
*/
export const addReferenceImage = async (image: { id: string; data: string; timestamp: number }): Promise<void> => {
const db = getDB();
const transaction = db.transaction([REFERENCE_IMAGES_STORE], 'readwrite');
const store = transaction.objectStore(REFERENCE_IMAGES_STORE);
return new Promise((resolve, reject) => {
const request = store.add(image);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
};
/**
* 获取所有参考图像
*/
export const getAllReferenceImages = async (): Promise<Array<{ id: string; data: string; timestamp: number }>> => {
const db = getDB();
const transaction = db.transaction([REFERENCE_IMAGES_STORE], 'readonly');
const store = transaction.objectStore(REFERENCE_IMAGES_STORE);
const index = store.index('timestamp');
return new Promise((resolve, reject) => {
const request = index.getAll();
request.onsuccess = () => {
// 按时间倒序排列
const images = request.result.sort((a, b) => b.timestamp - a.timestamp);
resolve(images);
};
request.onerror = () => reject(request.error);
});
};
/**
* 根据ID获取参考图像
*/
export const getReferenceImageById = async (id: string): Promise<{ id: string; data: string; timestamp: number } | undefined> => {
const db = getDB();
const transaction = db.transaction([REFERENCE_IMAGES_STORE], 'readonly');
const store = transaction.objectStore(REFERENCE_IMAGES_STORE);
return new Promise((resolve, reject) => {
const request = store.get(id);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
};
/**
* 删除参考图像
*/
export const deleteReferenceImage = async (id: string): Promise<void> => {
const db = getDB();
const transaction = db.transaction([REFERENCE_IMAGES_STORE], 'readwrite');
const store = transaction.objectStore(REFERENCE_IMAGES_STORE);
return new Promise((resolve, reject) => {
const request = store.delete(id);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
};
/**
* 清空所有参考图像
*/
export const clearAllReferenceImages = async (): Promise<void> => {
const db = getDB();
const transaction = db.transaction([REFERENCE_IMAGES_STORE], 'readwrite');
const store = transaction.objectStore(REFERENCE_IMAGES_STORE);
return new Promise((resolve, reject) => {
const request = store.clear();
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
};
/**
* 清空所有记录
*/
@@ -490,6 +577,9 @@ export const clearAllRecords = async (): Promise<void> => {
const editTransaction = db.transaction([EDITS_STORE], 'readwrite');
const editStore = editTransaction.objectStore(EDITS_STORE);
const refImageTransaction = db.transaction([REFERENCE_IMAGES_STORE], 'readwrite');
const refImageStore = refImageTransaction.objectStore(REFERENCE_IMAGES_STORE);
return Promise.all([
new Promise<void>((resolve, reject) => {
const request = genStore.clear();
@@ -500,13 +590,14 @@ export const clearAllRecords = async (): Promise<void> => {
const request = editStore.clear();
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
}),
new Promise<void>((resolve, reject) => {
const request = refImageStore.clear();
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
})
]).then(() => undefined);
};
/**
* 关闭数据库连接
*/
export const closeDB = (): void => {
if (db) {
db.close();