/** * 极简全局状态。 * * 替代旧版本在各页面直接读写 wx.getStorageSync 的做法: * 统一从内存读、同步落盘,页面只与这里交互。 */ const config = require('../config/index'); const memory = { user: null, siteConfig: null, entitlements: [], }; const listeners = new Set(); function notify() { listeners.forEach((fn) => { try { fn(); } catch (e) { console.error('[store] 监听器执行失败', e); } }); } function read(key, fallback) { try { const v = wx.getStorageSync(key); return v === '' || v === undefined || v === null ? fallback : v; } catch (e) { return fallback; } } const store = { // ── token ──────────────────────────────────────────────────────────── getToken: () => read(config.STORAGE.TOKEN, ''), getRefreshToken: () => read(config.STORAGE.REFRESH_TOKEN, ''), setTokens(accessToken, refreshToken) { wx.setStorageSync(config.STORAGE.TOKEN, accessToken); if (refreshToken) wx.setStorageSync(config.STORAGE.REFRESH_TOKEN, refreshToken); }, clearTokens() { wx.removeStorageSync(config.STORAGE.TOKEN); wx.removeStorageSync(config.STORAGE.REFRESH_TOKEN); }, /** * 是否「已登录」。 * * 指用户主动使用过登录功能(标记由服务端返回、跟着 user 一起存), * 不是「本地有没有 token」——静默登录每次都会拿到 token,那不算登录。 */ isLoggedIn: () => { const user = store.getUser(); return !!(user && user.isLogin === 1); }, // ── 用户 ───────────────────────────────────────────────────────────── getUser() { if (memory.user) return memory.user; memory.user = read(config.STORAGE.USER, null); return memory.user; }, setUser(user) { memory.user = user; wx.setStorageSync(config.STORAGE.USER, user); notify(); }, // ── 站点配置 ───────────────────────────────────────────────────────── getSiteConfig() { if (memory.siteConfig) return memory.siteConfig; memory.siteConfig = read(config.STORAGE.CONFIG, {}); return memory.siteConfig; }, setSiteConfig(cfg) { memory.siteConfig = cfg || {}; wx.setStorageSync(config.STORAGE.CONFIG, memory.siteConfig); notify(); }, /** 取配置项。数据库里配什么就是什么,没配返回空字符串,由页面自己决定要不要渲染。 */ cfg(key) { const value = store.getSiteConfig()[key]; return value === undefined ? '' : value; }, // ── 已购课程 ───────────────────────────────────────────────────────── getEntitlements() { if (memory.entitlements && memory.entitlements.length) return memory.entitlements; memory.entitlements = read(config.STORAGE.ENTITLEMENTS, []) || []; return memory.entitlements; }, setEntitlements(list) { memory.entitlements = list || []; wx.setStorageSync(config.STORAGE.ENTITLEMENTS, memory.entitlements); notify(); }, hasCourse(code) { return store.getEntitlements().some((item) => item.code === code); }, // ── 订阅与清理 ─────────────────────────────────────────────────────── subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn); }, reset() { memory.user = null; memory.entitlements = []; store.clearTokens(); // 站点配置与登录态无关,保留;否则退出登录后页面文案会退回默认值 wx.removeStorageSync(config.STORAGE.USER); wx.removeStorageSync(config.STORAGE.ENTITLEMENTS); notify(); }, }; module.exports = store;