mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-28 02:47:22 +08:00
✨ feat: 添加减轻动画效果选项 添加indexdb方法
This commit is contained in:
@@ -129,7 +129,10 @@
|
|||||||
"prefer-const": "error", // ts provides better types with const
|
"prefer-const": "error", // ts provides better types with const
|
||||||
"prefer-rest-params": "error", // ts provides better types with rest args over arguments
|
"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
|
"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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,183 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
// 创建一个使用 IndexedDB 的组合函数
|
||||||
|
const useIndexedDB = () => {
|
||||||
|
const db = ref<IDBDatabase | null>(null); // 数据库引用
|
||||||
|
|
||||||
|
// 打开数据库并创建表
|
||||||
|
const initDB = (dbName: string, version: number, stores: { name: string; keyPath?: string }[]) => {
|
||||||
|
return new Promise<void>((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<void>((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<void>((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<any>((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<void>((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<any[]>((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<any[]>((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;
|
||||||
+5
-1
@@ -8,6 +8,9 @@ export const setBackgroundImg = (url: String) => {
|
|||||||
};
|
};
|
||||||
// 设置动画类型
|
// 设置动画类型
|
||||||
export const setAnimationClass = (type: String) => {
|
export const setAnimationClass = (type: String) => {
|
||||||
|
if (store.state.setData && store.state.setData.noAnimate) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
return `animate__animated ${type}`;
|
return `animate__animated ${type}`;
|
||||||
};
|
};
|
||||||
// 设置动画延时
|
// 设置动画延时
|
||||||
@@ -51,7 +54,8 @@ export const getIsMc = () => {
|
|||||||
if (windowData.electron.ipcRenderer.getStoreValue('set').isProxy) {
|
if (windowData.electron.ipcRenderer.getStoreValue('set').isProxy) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(window.location.origin.includes('localhost')){}
|
if (window.location.origin.includes('localhost')) {
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
const ProxyUrl = import.meta.env.VITE_API_PROXY || 'http://110.42.251.190:9856';
|
const ProxyUrl = import.meta.env.VITE_API_PROXY || 'http://110.42.251.190:9856';
|
||||||
|
|||||||
@@ -7,12 +7,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<n-switch v-model:value="setData.isProxy" />
|
<n-switch v-model:value="setData.isProxy" />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="set-item">
|
||||||
|
<div>
|
||||||
|
<div class="set-item-title">减轻动画效果</div>
|
||||||
|
</div>
|
||||||
|
<n-switch v-model:value="setData.noAnimate" />
|
||||||
|
</div>
|
||||||
<div class="set-item">
|
<div class="set-item">
|
||||||
<div>
|
<div>
|
||||||
<div class="set-item-title">版本</div>
|
<div class="set-item-title">版本</div>
|
||||||
<div class="set-item-content">当前已是最新版本</div>
|
<div class="set-item-content">当前已是最新版本</div>
|
||||||
</div>
|
</div>
|
||||||
<div>{{ setData.version }}</div>
|
<div>{{ config.version }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="set-item">
|
<div class="set-item">
|
||||||
<div>
|
<div>
|
||||||
@@ -32,6 +38,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
|
|
||||||
|
import config from '@/../package.json';
|
||||||
import store from '@/store';
|
import store from '@/store';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
|
|||||||
Reference in New Issue
Block a user