2026-05-10 13:12:44 +08:00

128 lines
3.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* HoloLake Bulletin 数据持久化模块
* storage.js - localStorage 封装 + 用户状态管理
* 模块 ID: BC-M22-002-AW
*/
window.HoloLake = window.HoloLake || {};
// ========== Storage 工具对象(带前缀) ==========
HoloLake.Storage = {
prefix: 'hololake_bulletin_',
// 保存数据
save: function(key, value) {
try {
const serialized = JSON.stringify(value);
localStorage.setItem(this.prefix + key, serialized);
console.log(`[Storage] 已保存: ${key} =`, value);
} catch (e) {
console.error('[Storage] 保存失败:', e);
}
},
// 读取数据
load: function(key, defaultValue = null) {
try {
const serialized = localStorage.getItem(this.prefix + key);
if (serialized === null) {
console.log(`[Storage] 无数据: ${key},返回默认值`);
return defaultValue;
}
const value = JSON.parse(serialized);
console.log(`[Storage] 已加载: ${key} =`, value);
return value;
} catch (e) {
console.error('[Storage] 读取失败:', e);
return defaultValue;
}
},
// 删除指定键
remove: function(key) {
try {
localStorage.removeItem(this.prefix + key);
console.log(`[Storage] 已删除: ${key}`);
} catch (e) {
console.error('[Storage] 删除失败:', e);
}
},
// 清空所有带前缀的数据
clear: function() {
try {
const keysToRemove = [];
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key.startsWith(this.prefix)) {
keysToRemove.push(key);
}
}
keysToRemove.forEach(key => localStorage.removeItem(key));
console.log('[Storage] 已清空所有公告栏数据');
} catch (e) {
console.error('[Storage] 清空失败:', e);
}
}
};
// ========== 用户状态管理 ==========
HoloLake.UserState = {
// 已读公告列表
getReadBulletins: function() {
return HoloLake.Storage.load('read_bulletins', []);
},
markAsRead: function(bulletinId) {
const readList = this.getReadBulletins();
if (!readList.includes(bulletinId)) {
readList.push(bulletinId);
HoloLake.Storage.save('read_bulletins', readList);
}
return readList;
},
// 订阅状态
isSubscribed: function() {
return HoloLake.Storage.load('is_subscribed', false);
},
toggleSubscribe: function() {
const current = this.isSubscribed();
const newState = !current;
HoloLake.Storage.save('is_subscribed', newState);
return newState;
},
// 当前频道
getActiveChannel: function() {
return HoloLake.Storage.load('active_channel', 'all');
},
setActiveChannel: function(channelId) {
HoloLake.Storage.save('active_channel', channelId);
},
// 上次访问时间
getLastVisit: function() {
return HoloLake.Storage.load('last_visit', null);
},
updateLastVisit: function() {
const now = new Date().toISOString();
HoloLake.Storage.save('last_visit', now);
return now;
},
// 重置所有状态(测试用)
resetAll: function() {
HoloLake.Storage.remove('read_bulletins');
HoloLake.Storage.remove('is_subscribed');
HoloLake.Storage.remove('active_channel');
HoloLake.Storage.remove('last_visit');
console.log('[UserState] 已重置所有状态');
}
};
// 初始化时记录访问时间(可选,页面加载时由 script.js 调用)
console.log('✅ storage.js 已加载HoloLake.Storage 和 HoloLake.UserState 已就绪');