pwa,设置项,自动刷新

This commit is contained in:
SunWuyuan
2025-04-04 21:40:24 +08:00
parent 8e4d29afa3
commit 291c593178
32 changed files with 8794 additions and 965 deletions
+126 -18
View File
@@ -20,10 +20,6 @@ async function requestNotificationPermission() {
* @returns {Promise<boolean>} 是否成功启用持久性存储
*/
async function requestPersistentStorage() {
if (!getSetting("storage.persistentStorage")) {
return false;
}
try {
if (navigator.storage?.persist) {
return await navigator.storage.persist();
@@ -58,6 +54,7 @@ window.addEventListener("load", initializeStorage);
* @property {string} [description] - 配置项描述
* @property {string} [legacyKey] - 旧版本localStorage键名(用于迁移)
* @property {boolean} [requireDeveloper] - 是否需要开发者选项启用
* @property {string} [icon] - 设置项的图标
*/
// 存储所有设置的localStorage键名
@@ -69,15 +66,11 @@ const SETTINGS_STORAGE_KEY = "Classworks_settings";
*/
const settingsDefinitions = {
// 存储设置
"storage.persistentStorage": {
type: "boolean",
default: true,
description: "是否启用持久性存储",
},
"storage.persistOnLoad": {
type: "boolean",
default: true,
description: "是否在页面加载时自动请求持久性存储",
icon: "mdi-database-sync",
},
// 显示设置
@@ -85,37 +78,48 @@ const settingsDefinitions = {
type: "string",
default: "card", // 修改默认值为 'button'
validate: (value) => ["card", "button"].includes(value),
description: "空科目的显示方式:卡片或按钮",
description: "空科目的显示方式",
icon: "mdi-card-outline",
},
"display.dynamicSort": {
type: "boolean",
default: true,
description: "是否启用动态排序以优化显示效果",
description: "是否启用动态排序",
icon: "mdi-sort-variant",
// 启用后会根据内容自动调整卡片顺序,提供更好的视觉体验
},
"display.showRandomButton": {
type: "boolean",
default: false,
description: "是否显示随机按钮",
description: "是否显示随机点人按钮",
icon: "mdi-shuffle-variant",
// 控制是否显示随机排序按钮,可用于随机调整卡片顺序
},
"display.showFullscreenButton": {
type: "boolean",
default: true,
description: "是否显示全屏按钮",
icon: "mdi-fullscreen",
// 控制是否显示进入全屏模式的按钮
},
"display.cardHoverEffect": {
type: "boolean",
default: true,
description: "是否启用卡片悬浮效果",
icon: "mdi-gesture-tap",
// 启用后鼠标悬停在卡片上时会显示视觉反馈效果
},
"display.enhancedTouchMode": {
type: "boolean",
default: true,
description: "是否启用增强触摸模式(更大的触摸目标)",
description: "是否启用增强触摸模式",
icon: "mdi-gesture-tap-button",
},
"display.showAntiScreenBurnCard": {
type: "boolean",
default: false,
description: "是否显示防烧屏提示卡片",
description: "是否显示防烧屏忽悠卡片",
icon: "mdi-monitor-shimmer",
},
// 服务器设置(合并了数据提供者设置)
@@ -135,20 +139,25 @@ const settingsDefinitions = {
}
},
description: "后端服务器域名",
icon: "mdi-web",
// 设置后端服务器的域名,用于从远程服务器获取数据
},
"server.classNumber": {
type: "string",
default: "高三八班",
//validate: (value) => /^[A-Za-z0-9]*$/.test(value),
validate: (value) => /.*/.test(value),
description: "班级编号",
icon: "mdi-account-group",
// 设置班级标识,用于区分不同班级的数据
},
"server.provider": {
type: "string",
default: "indexedDB",
validate: (value) => ["server", "indexedDB"].includes(value),
description: "数据提供者,用于决定数据存储方式",
description: "数据提供者",
icon: "mdi-database",
// 选择数据存储方式:使用本地IndexedDB或远程服务器
},
// 刷新设置
@@ -156,12 +165,16 @@ const settingsDefinitions = {
type: "boolean",
default: false,
description: "是否启用自动刷新",
icon: "mdi-refresh-auto",
// 启用后将按设定的时间间隔自动刷新数据
},
"refresh.interval": {
type: "number",
default: 300,
validate: (value) => value >= 10 && value <= 3600,
description: "自动刷新间隔(秒)",
icon: "mdi-timer-outline",
// 设置自动刷新的时间间隔,范围10-3600秒
},
// 字体设置
@@ -169,7 +182,8 @@ const settingsDefinitions = {
type: "number",
default: 28,
validate: (value) => value >= 16 && value <= 100,
description: "字体大小(像素)",
description: "字体大小",
icon: "mdi-format-size",
},
// 编辑设置
@@ -177,23 +191,30 @@ const settingsDefinitions = {
type: "boolean",
default: true,
description: "是否启用自动保存",
icon: "mdi-content-save-outline",
// 启用后编辑内容时会自动保存更改,无需手动点击保存按钮
},
"edit.blockNonTodayAutoSave": {
// 添加新选项
type: "boolean",
default: true,
description: "禁止自动保存非当天数据",
icon: "mdi-calendar-lock",
// 启用后只有当天的数据会自动保存,防止意外修改历史数据
},
"edit.refreshBeforeEdit": {
type: "boolean",
default: true,
description: "编辑前是否自动刷新",
icon: "mdi-refresh",
// 启用后在开始编辑前会自动刷新数据,确保编辑的是最新内容
},
"edit.confirmNonTodaySave": {
// 添加新选项
type: "boolean",
default: true,
description: "保存非当天数据时显示确认对话框,禁用则允许直接保存",
description: "保存非当天数据需确认",
icon: "mdi-calendar-alert",
},
// 开发者选项
@@ -201,11 +222,15 @@ const settingsDefinitions = {
type: "boolean",
default: false,
description: "是否启用开发者选项",
icon: "mdi-developer-board",
// 启用后可以访问高级开发者功能和设置项
},
"developer.showDebugConfig": {
type: "boolean",
default: false,
description: "是否显示调试配置",
icon: "mdi-bug-outline",
// 启用后在控制台显示详细的配置信息和设置变更日志
},
"developer.disableMessageLog": {
// 添加新的设置项
@@ -213,6 +238,8 @@ const settingsDefinitions = {
default: false,
description: "禁用消息日志记录",
requireDeveloper: true,
icon: "mdi-message-off-outline",
// 启用后将不再记录应用消息到日志,可减少内存占用
},
// 消息设置
@@ -221,6 +248,8 @@ const settingsDefinitions = {
default: true,
description: "是否显示消息记录侧栏",
requireDeveloper: true, // 添加标记
icon: "mdi-message-text-outline",
// 控制是否显示消息历史记录侧栏,需要开发者模式
},
"message.maxActiveMessages": {
type: "number",
@@ -228,6 +257,8 @@ const settingsDefinitions = {
validate: (value) => value >= 1 && value <= 10,
description: "同时显示的最大消息数量",
requireDeveloper: true,
icon: "mdi-message-badge-outline",
// 控制界面上同时显示的最大消息数量,范围1-10条
},
"message.timeout": {
type: "number",
@@ -235,12 +266,16 @@ const settingsDefinitions = {
validate: (value) => value >= 1000 && value <= 30000,
description: "消息自动关闭时间(毫秒)",
requireDeveloper: true,
icon: "mdi-timer-sand",
// 设置消息自动消失的时间,范围1000-30000毫秒
},
"message.saveHistory": {
type: "boolean",
default: true,
description: "是否保存消息历史记录",
requireDeveloper: true,
icon: "mdi-history",
// 启用后将保存消息历史记录,可在侧栏中查看
},
// 主题设置
@@ -249,6 +284,47 @@ const settingsDefinitions = {
default: "dark",
validate: (value) => ["light", "dark"].includes(value),
description: "主题模式",
icon: "mdi-theme-light-dark",
// 设置应用的主题模式,可选亮色或暗色主题
},
// 随机点名设置
"randomPicker.enabled": {
type: "boolean",
default: true,
description: "是否启用随机点名功能",
icon: "mdi-account-question",
},
"randomPicker.animation": {
type: "boolean",
default: true,
description: "是否启用随机点名动画效果",
icon: "mdi-animation-play",
},
"randomPicker.defaultCount": {
type: "number",
default: 1,
validate: (value) => value >= 1 && value <= 10,
description: "默认抽取人数",
icon: "mdi-counter",
},
"randomPicker.excludeAbsent": {
type: "boolean",
default: true,
description: "是否排除请假学生",
icon: "mdi-account-off",
},
"randomPicker.excludeLate": {
type: "boolean",
default: false,
description: "是否排除迟到学生",
icon: "mdi-clock-alert",
},
"randomPicker.excludeExcluded": {
type: "boolean",
default: true,
description: "是否排除不参与学生",
icon: "mdi-account-cancel",
},
};
@@ -488,6 +564,36 @@ function watchSettings(callback) {
// 初始化设置
loadSettings();
/**
* 获取设置项的定义
* @param {string} key - 设置项键名
* @returns {SettingDefinition|null} 设置项的定义或null
*/
function getSettingDefinition(key) {
return settingsDefinitions[key] || null;
}
/**
* 将当前配置导出为简单的键值对对象
* @returns {Object} 包含所有设置的键值对对象
*/
function exportSettingsAsKeyValue() {
if (!settingsCache) {
loadSettings();
}
// 创建一个新对象,避免直接返回引用
const exportedSettings = {};
// 遍历所有设置项
for (const key in settingsDefinitions) {
// 获取当前值(确保使用getSetting以应用所有规则,如开发者选项依赖)
exportedSettings[key] = getSetting(key);
}
return exportedSettings;
}
export {
settingsDefinitions,
getSetting,
@@ -495,4 +601,6 @@ export {
resetSetting,
resetAllSettings,
watchSettings,
getSettingDefinition,
exportSettingsAsKeyValue
};