1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2026-06-16 21:05:09 +00:00
Classworks/src/utils/providers/kvLocalProvider.js
2025-11-16 15:14:17 +08:00

116 lines
3.1 KiB
JavaScript

import {openDB} from "idb";
import {formatResponse, formatError} from "../dataProvider";
// Database initialization for local storage
const DB_NAME = "ClassworksDB";
const DB_VERSION = 2;
const initDB = async () => {
return openDB(DB_NAME, DB_VERSION, {
upgrade(db) {
// Create or update stores as needed
if (!db.objectStoreNames.contains("kv")) {
db.createObjectStore("kv");
}
// Add a system store for machine ID and other system settings
if (!db.objectStoreNames.contains("system")) {
db.createObjectStore("system");
}
},
});
};
export const kvLocalProvider = {
async loadData(key) {
try {
const db = await initDB();
const data = await db.get("kv", key);
if (!data) {
return formatError("数据不存在", "NOT_FOUND");
}
return formatResponse(JSON.parse(data));
} catch (error) {
return formatError("读取本地数据失败:" + error);
}
},
async saveData(key, data) {
try {
const db = await initDB();
await db.put("kv", JSON.stringify(data), key);
return formatResponse(true);
} catch (error) {
return formatError("保存本地数据失败:" + error);
}
},
/**
* 获取本地存储的键名列表
* @param {Object} options - 查询选项
* @param {string} options.sortBy - 排序字段,默认为 "key"
* @param {string} options.sortDir - 排序方向,"asc" 或 "desc",默认为 "asc"
* @param {number} options.limit - 每页返回的记录数,默认为 100
* @param {number} options.skip - 跳过的记录数,默认为 0
* @returns {Promise<Object>} 包含键名列表和分页信息的响应对象
*
* 返回值示例:
* {
* keys: ["key1", "key2", "key3"],
* total_rows: 150,
* current_page: {
* limit: 10,
* skip: 0,
* count: 10
* },
* load_more: null // 本地存储不需要分页URL
* }
*/
async loadKeys(options = {}) {
try {
const db = await initDB();
const transaction = db.transaction(["kv"], "readonly");
const store = transaction.objectStore("kv");
// 获取所有键名
const allKeys = await store.getAllKeys();
// 设置默认参数
const {
sortDir = "asc",
limit = 100,
skip = 0
} = options;
// 排序键名(本地存储只支持按键名排序)
const sortedKeys = allKeys.sort((a, b) => {
if (sortDir === "desc") {
return b.localeCompare(a);
}
return a.localeCompare(b);
});
// 应用分页
const totalRows = sortedKeys.length;
const paginatedKeys = sortedKeys.slice(skip, skip + limit);
// 构建响应数据
const responseData = {
keys: paginatedKeys,
total_rows: totalRows,
current_page: {
limit,
skip,
count: paginatedKeys.length
},
load_more: null // 本地存储不需要分页URL
};
return formatResponse(responseData);
} catch (error) {
return formatError("获取本地键名列表失败:" + error.message);
}
},
};