You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/** * 缓存工具函数 * 提供缓存降级策略:先从缓存获取,缓存不存在则调用接口重新获取 */import { FetchOpenId, FetchFindAllReaderBindByOpenId } from '@/api/user';
// 缓存键名常量
export const STORAGE_KEYS = { CURRENT_READER_CARD: 'currentReaderCard', READER_CARD_LIST: 'readList', WX_LOGIN_CODE: 'wx_login_code',};
/** * 获取微信 openId(带缓存降级) * 参考 home.vue 中的 initUserAndCheckBind 方法 * @returns {Promise<string|null>} 微信 openId */export async function getOpenId() { try { // 1. 先看缓存有没有 openId
let openId = uni.getStorageSync(STORAGE_KEYS.WX_LOGIN_CODE); // 2. 有缓存,直接返回
if (openId) { return openId; } // 3. 没有 → 走微信登录流程
const loginRes = await new Promise((resolve, reject) => { uni.login({ success: resolve, fail: reject }); });
if (!loginRes.code) { console.warn('[Storage] WeChat login failed'); return null; }
// 4. 获取 openId
const openRes = await FetchOpenId({ libcode: '1201', code: loginRes.code });
if (openRes.code !== 200 || !openRes.data) { console.warn('[Storage] Failed to fetch openId'); return null; }
openId = openRes.data; uni.setStorageSync(STORAGE_KEYS.WX_LOGIN_CODE, openId); return openId; } catch (err) { console.error('[Storage] Error in getOpenId:', err); return null; }}
/** * 获取当前读者证信息(带缓存降级) * @returns {Promise<Object|null>} 当前读者证信息 */export async function getCurrentReaderCard() { // 1. 先从缓存获取
const cachedCard = uni.getStorageSync(STORAGE_KEYS.CURRENT_READER_CARD); // 2. 如果缓存存在且有效,直接返回
if (cachedCard && Object.keys(cachedCard).length > 0) { return cachedCard; } // 3. 缓存不存在,尝试从接口获取
try { // 使用带缓存降级的函数获取 openId
const openId = await getOpenId(); if (!openId) { console.warn('[Storage] No openId found, cannot fetch reader card'); return null; } const res = await FetchFindAllReaderBindByOpenId({ libcode: '1201', openId: openId }); if (res.code === 200 && res.data.length > 0) { // 默认证排第一位
const defaultCard = res.data.find(item => item.bindDefault === true); const otherCards = res.data.filter(item => !item.bindDefault); // 合并:默认在前,其他在后
const readerCardList = defaultCard ? [defaultCard, ...otherCards] : res.data; const resultCard = defaultCard || res.data[0]; // 更新缓存
uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, resultCard); uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, readerCardList); return resultCard; } } catch (err) { console.error('[Storage] Failed to fetch reader card:', err); } return null;}
/** * 获取读者证列表(带缓存降级) * @param {boolean} forceRefresh - 是否强制刷新,默认 false * @returns {Promise<Array>} 读者证列表 */export async function getReaderCardList(forceRefresh = false) { // 1. 如果不是强制刷新,先从缓存获取
if (!forceRefresh) { const cachedList = uni.getStorageSync(STORAGE_KEYS.READER_CARD_LIST); // 如果缓存存在且有效,直接返回
if (cachedList && Array.isArray(cachedList) && cachedList.length > 0) { return cachedList; } } // 2. 缓存不存在或强制刷新时,尝试从接口获取
try { // 使用带缓存降级的函数获取 openId
const openId = await getOpenId(); if (!openId) { console.warn('[Storage] No openId found, cannot fetch reader card list'); return []; } const res = await FetchFindAllReaderBindByOpenId({ libcode: '1201', openId: openId }); if (res.code === 200 && res.data.length > 0) { // 默认证排第一位
const defaultCard = res.data.find(item => item.bindDefault === true); const otherCards = res.data.filter(item => !item.bindDefault); // 合并:默认在前,其他在后
const readerCardList = defaultCard ? [defaultCard, ...otherCards] : res.data; // 更新缓存
uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, readerCardList); // 同时更新当前读者证
if (defaultCard) { uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, defaultCard); } return readerCardList; } } catch (err) { console.error('[Storage] Failed to fetch reader card list:', err); } return [];}
/** * 设置当前读者证 * @param {Object} card - 读者证信息 */export function setCurrentReaderCard(card) { uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, card);}
/** * 清除读者证相关缓存 */export function clearReaderCardCache() { uni.removeStorageSync(STORAGE_KEYS.CURRENT_READER_CARD); uni.removeStorageSync(STORAGE_KEYS.READER_CARD_LIST);}
|