UNPKG

@pisell/pisellos

Version:

一个可扩展的前端模块化SDK框架,支持插件系统

179 lines (178 loc) 5.33 kB
import App from "../app"; /** * IndexDB 管理器模块 * * 这个模块提供了对浏览器 IndexedDB 的简单封装,并在不支持 IndexedDB 的环境中 * 自动降级使用 localStorage 作为备选存储方案。 */ /** * 数据库配置选项接口 * @interface DBOptions * @property {string} dbName - 数据库名称 * @property {number} version - 数据库版本号 * @property {Array} stores - 存储对象配置数组 * @property {string} stores[].name - 存储对象名称 * @property {string} stores[].keyPath - 主键路径 * @property {Array} [stores[].indexes] - 索引配置数组(可选) * @property {string} stores[].indexes[].name - 索引名称 * @property {string} stores[].indexes[].keyPath - 索引键路径 * @property {IDBIndexParameters} [stores[].indexes[].options] - 索引选项(可选) */ export interface DBOptions { dbName: string; version: number; stores: { name: string; keyPath: string; indexes?: { name: string; keyPath: string; options?: IDBIndexParameters; }[]; }[]; } /** * IndexDB 管理器类 * 提供对 IndexedDB 的简单封装,支持自动降级到 localStorage * @class IndexDBManager */ declare class IndexDBManager { /** * 检查环境是否支持 IndexedDB * @returns {boolean} 是否支持 IndexedDB * @private */ private static isSupported; private db; private dbName; private version; private stores; private useIndexDB; private app; /** * 创建 IndexDBManager 实例 * @param {DBOptions} options - 数据库配置选项 */ constructor(app: App, options: DBOptions); /** * 初始化数据库连接 * 如果环境不支持 IndexedDB,将自动使用 localStorage * @returns {Promise<boolean>} 连接是否成功 */ connect(): Promise<boolean>; /** * 生成用于 localStorage 的存储键 * @param {string} storeName - 存储对象名称 * @param {string|number} [key] - 可选的键值 * @returns {string} 格式化的存储键 * @private */ private getStorageKey; /** * 添加数据到指定的存储对象 * @param {string} storeName - 存储对象名称 * @param {T} data - 要添加的数据 * @returns {Promise<T>} 添加的数据 * @template T */ add<T>(storeName: string, data: T): Promise<T>; /** * 获取指定存储对象中的数据 * @param {string} storeName - 存储对象名称 * @param {string|number} key - 数据主键 * @returns {Promise<T|null>} 获取的数据,不存在则返回 null * @template T */ get<T>(storeName: string, key: string | number): Promise<T | null>; /** * 更新指定存储对象中的数据 * @param {string} storeName - 存储对象名称 * @param {T} data - 要更新的数据 * @returns {Promise<T>} 更新后的数据 * @template T */ update<T>(storeName: string, data: T): Promise<T>; /** * 删除指定存储对象中的数据 * @param {string} storeName - 存储对象名称 * @param {string|number} key - 数据主键 * @returns {Promise<boolean>} 删除是否成功 */ delete(storeName: string, key: string | number): Promise<boolean>; /** * 获取指定存储对象中的所有数据 * @param {string} storeName - 存储对象名称 * @returns {Promise<T[]>} 数据数组 * @template T */ getAll<T>(storeName: string): Promise<T[]>; /** * 清空指定存储对象中的所有数据 * @param {string} storeName - 存储对象名称 * @returns {Promise<boolean>} 清空是否成功 */ clear(storeName: string): Promise<boolean>; /** * 关闭数据库连接 * 在不再需要使用数据库时调用,释放资源 */ close(): void; /** * 获取当前使用的存储方式 * @returns {'indexDB'|'localStorage'} 当前使用的存储方式 */ getCurrentStorage(): 'indexDB' | 'localStorage'; } /** * 使用示例: * * // 1. 创建数据库配置 * const dbOptions: DBOptions = { * dbName: 'myApp', * version: 1, * stores: [ * { * name: 'users', * keyPath: 'id', * indexes: [ * { name: 'email', keyPath: 'email', options: { unique: true } } * ] * }, * { * name: 'products', * keyPath: 'id' * } * ] * }; * * // 2. 创建并连接数据库 * const db = new IndexDBManager(dbOptions); * await db.connect(); * * // 3. 添加数据 * const user = { id: '1', name: '张三', email: 'zhangsan@example.com' }; * await db.add('users', user); * * // 4. 获取数据 * const retrievedUser = await db.get('users', '1'); * * // 5. 更新数据 * user.name = '张三 (已更新)'; * await db.update('users', user); * * // 6. 获取所有数据 * const allUsers = await db.getAll('users'); * * // 7. 删除数据 * await db.delete('users', '1'); * * // 8. 清空存储对象 * await db.clear('users'); * * // 9. 关闭数据库连接 * db.close(); * * // 10. 检查当前使用的存储方式 * const storageType = db.getCurrentStorage(); // 'indexDB''localStorage' */ export default IndexDBManager;