This commit is contained in:
SunWuyuan
2025-03-09 14:59:35 +08:00
parent 08e95a3efc
commit 96c4ab81d9
7 changed files with 271 additions and 74 deletions
+107
View File
@@ -1,4 +1,21 @@
import axios from 'axios';
import { openDB } from 'idb';
const DB_NAME = 'HomeworkDB';
const DB_VERSION = 1;
const initDB = async () => {
return openDB(DB_NAME, DB_VERSION, {
upgrade(db) {
if (!db.objectStoreNames.contains('homework')) {
db.createObjectStore('homework');
}
if (!db.objectStoreNames.contains('config')) {
db.createObjectStore('config');
}
},
});
};
const formatResponse = (data, message = null) => ({
success: true,
@@ -157,6 +174,96 @@ const providers = {
);
}
}
},
indexedDB: {
async loadData(key, date) {
try {
const classNumber = key.split('/').pop();
if (!classNumber) {
return formatError('请先设置班号', 'CONFIG_ERROR');
}
const db = await initDB();
const storageKey = `homework_${classNumber}_${date}`;
const data = await db.get('homework', storageKey);
if (!data) {
const today = new Date().toISOString().split('T')[0];
if (date === today) {
return formatResponse({
homework: {},
attendance: { absent: [], late: [] }
});
}
return formatError('数据不存在', 'NOT_FOUND');
}
// 从字符串解析数据
return formatResponse(JSON.parse(data));
} catch (error) {
return formatError('读取IndexedDB数据失败:' + error);
}
},
async saveData(key, data, date) {
try {
const classNumber = key.split('/').pop();
if (!classNumber) {
return formatError('请先设置班号', 'CONFIG_ERROR');
}
const db = await initDB();
const storageKey = `homework_${classNumber}_${date}`;
// 将数据序列化为字符串存储
await db.put('homework', JSON.stringify(data), storageKey);
return formatResponse(null, '保存成功');
} catch (error) {
return formatError('保存IndexedDB数据失败:' + error);
}
},
async loadConfig(key) {
try {
const classNumber = key.split('/').pop();
if (!classNumber) {
return formatError('请先设置班号', 'CONFIG_ERROR');
}
const db = await initDB();
const storageKey = `config_${classNumber}`;
const config = await db.get('config', storageKey);
if (!config) {
return formatResponse({
studentList: [],
displayOptions: {}
});
}
// 从字符串解析配置
return formatResponse(JSON.parse(config));
} catch (error) {
return formatError('读取IndexedDB配置失败:' + error);
}
},
async saveConfig(key, config) {
try {
const classNumber = key.split('/').pop();
if (!classNumber) {
return formatError('请先设置班号', 'CONFIG_ERROR');
}
const db = await initDB();
const storageKey = `config_${classNumber}`;
// 将配置序列化为字符串存储
await db.put('config', JSON.stringify(config), storageKey);
return formatResponse(null, '保存成功');
} catch (error) {
return formatError('保存IndexedDB配置失败:' + error);
}
}
}
};
+6 -1
View File
@@ -29,6 +29,11 @@ const settingsDefinitions = {
default: true,
description: '是否启用动态排序以优化显示效果'
},
'display.showRandomButton': {
type: 'boolean',
default: false,
description: '是否显示随机按钮'
},
// 服务器设置(合并了数据提供者设置)
'server.domain': {
@@ -46,7 +51,7 @@ const settingsDefinitions = {
'server.provider': { // 新增项
type: 'string',
default: 'localStorage',
validate: value => ['server', 'localStorage'].includes(value),
validate: value => ['server', 'localStorage', 'indexedDB'].includes(value),
description: '数据提供者,用于决定数据存储方式'
},