diff --git a/.eslintrc b/.eslintrc index 168f5b1..f4e4eaf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -129,7 +129,10 @@ "prefer-const": "error", // ts provides better types with const "prefer-rest-params": "error", // ts provides better types with rest args over arguments "prefer-spread": "error", // ts transpiles spread to apply, so no need for manual apply - "valid-typeof": "off" // ts(2367) + "valid-typeof": "off", // ts(2367) + "consistent-return": "off", + "no-promise-executor-return": "off", + "prefer-promise-reject-errors": "off" } } ] diff --git a/src/hooks/IndexDBHook.ts b/src/hooks/IndexDBHook.ts new file mode 100644 index 0000000..f19f607 --- /dev/null +++ b/src/hooks/IndexDBHook.ts @@ -0,0 +1,183 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { ref } from 'vue'; + +// 创建一个使用 IndexedDB 的组合函数 +const useIndexedDB = () => { + const db = ref(null); // 数据库引用 + + // 打开数据库并创建表 + const initDB = (dbName: string, version: number, stores: { name: string; keyPath?: string }[]) => { + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, version); // 打开数据库请求 + + request.onupgradeneeded = (event: any) => { + const db = event.target.result; // 获取数据库实例 + stores.forEach((store) => { + if (!db.objectStoreNames.contains(store.name)) { + // 确保对象存储(表)创建 + db.createObjectStore(store.name, { + keyPath: store.keyPath || 'id', + autoIncrement: true, + }); + } + }); + }; + + request.onsuccess = (event: any) => { + db.value = event.target.result; // 保存数据库实例 + resolve(); // 成功时解析 Promise + }; + + request.onerror = (event: any) => { + reject(event.target.error); // 失败时拒绝 Promise + }; + }); + }; + + // 通用新增数据 + const addData = (storeName: string, value: any) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); // 检查数据库是否已初始化 + const tx = db.value.transaction(storeName, 'readwrite'); // 创建事务 + const store = tx.objectStore(storeName); // 获取对象存储 + + const request = store.add(value); // 添加数据请求 + + request.onsuccess = () => { + console.log('成功'); // 成功时输出 + resolve(); // 解析 Promise + }; + + request.onerror = (event) => { + console.error('新增失败:', (event.target as IDBRequest).error); // 输出错误 + reject((event.target as IDBRequest).error); // 拒绝 Promise + }; + }); + }; + + // 通用保存数据(新增或更新) + const saveData = (storeName: string, value: any) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); + const tx = db.value.transaction(storeName, 'readwrite'); + const store = tx.objectStore(storeName); + const request = store.put(value); + + request.onsuccess = () => { + console.log('成功'); + resolve(); + }; + + request.onerror = (event) => { + reject((event.target as IDBRequest).error); + }; + }); + }; + + // 通用获取数据 + const getData = (storeName: string, key: string | number) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); + const tx = db.value.transaction(storeName, 'readonly'); + const store = tx.objectStore(storeName); + const request = store.get(key); + + request.onsuccess = (event) => { + if (event.target) { + resolve((event.target as IDBRequest).result); + } else { + reject('事件目标为空'); + } + }; + + request.onerror = (event) => { + reject((event.target as IDBRequest).error); + }; + }); + }; + + // 删除数据 + const deleteData = (storeName: string, key: string | number) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); + const tx = db.value.transaction(storeName, 'readwrite'); + const store = tx.objectStore(storeName); + const request = store.delete(key); + + request.onsuccess = () => { + console.log('删除成功'); + resolve(); + }; + + request.onerror = (event) => { + reject((event.target as IDBRequest).error); + }; + }); + }; + + // 查询所有数据 + const getAllData = (storeName: string) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); + const tx = db.value.transaction(storeName, 'readonly'); + const store = tx.objectStore(storeName); + const request = store.getAll(); + + request.onsuccess = (event) => { + if (event.target) { + resolve((event.target as IDBRequest).result); + } else { + reject('事件目标为空'); + } + }; + + request.onerror = (event) => { + reject((event.target as IDBRequest).error); + }; + }); + }; + + // 分页查询数据 + const getDataWithPagination = (storeName: string, page: number, pageSize: number) => { + return new Promise((resolve, reject) => { + if (!db.value) return reject('数据库未初始化'); + const tx = db.value.transaction(storeName, 'readonly'); + const store = tx.objectStore(storeName); + const request = store.openCursor(); // 打开游标请求 + const results: any[] = []; // 存储结果的数组 + let index = 0; // 当前索引 + const skip = (page - 1) * pageSize; // 计算跳过的数量 + + request.onsuccess = (event: any) => { + const cursor = event.target.result; // 获取游标 + if (!cursor) { + resolve(results); // 如果没有更多数据,解析结果 + return; + } + + if (index >= skip && results.length < pageSize) { + results.push(cursor.value); // 添加当前游标值到结果 + } + + index++; // 增加索引 + cursor.continue(); // 继续游标 + }; + + request.onerror = (event: any) => { + reject(event.target.error); + }; + }); + }; + + return { + initDB, + addData, + saveData, + getData, + deleteData, + getAllData, + getDataWithPagination, + }; +}; + +export default useIndexedDB; diff --git a/src/utils/index.ts b/src/utils/index.ts index 1bbff71..fdb76b9 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -8,6 +8,9 @@ export const setBackgroundImg = (url: String) => { }; // 设置动画类型 export const setAnimationClass = (type: String) => { + if (store.state.setData && store.state.setData.noAnimate) { + return ''; + } return `animate__animated ${type}`; }; // 设置动画延时 @@ -51,7 +54,8 @@ export const getIsMc = () => { if (windowData.electron.ipcRenderer.getStoreValue('set').isProxy) { return true; } - if(window.location.origin.includes('localhost')){} + if (window.location.origin.includes('localhost')) { + } return false; }; const ProxyUrl = import.meta.env.VITE_API_PROXY || 'http://110.42.251.190:9856'; diff --git a/src/views/set/index.vue b/src/views/set/index.vue index 88f1423..ce12e2e 100644 --- a/src/views/set/index.vue +++ b/src/views/set/index.vue @@ -7,12 +7,18 @@ +
+
+
减轻动画效果
+
+ +
版本
当前已是最新版本
-
{{ setData.version }}
+
{{ config.version }}
@@ -32,6 +38,7 @@