Files
2026-10-01 11:43:07 +08:00

130 lines
4.1 KiB
JavaScript

/**
* 极简全局状态。
*
* 替代旧版本在各页面直接读写 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;