128 lines
3.8 KiB
JavaScript
128 lines
3.8 KiB
JavaScript
/**
|
||
* 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 已就绪'); |