You've already forked Nano-Banana-AI-Image-Editor
阶段性提交
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user