图书馆小程序
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.
 
 
 
 
 

182 lines
5.0 KiB

/**
* 缓存工具函数
* 提供缓存降级策略:先从缓存获取,缓存不存在则调用接口重新获取
*/
import { FetchOpenId, FetchFindAllReaderBindByOpenId } from '@/api/user';
import config from '@/utils/config';
// 缓存键名常量
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] 获取code失败');
return null;
}
// 4. 获取 openId
const openRes = await FetchOpenId({
libcode: config.LIB_CODE,
code: loginRes.code
});
if (openRes.code !== 200 || !openRes.data) {
console.warn('[Storage] 获取openId失败');
return null;
}
openId = openRes.data;
uni.setStorageSync(STORAGE_KEYS.WX_LOGIN_CODE, openId);
return openId;
} catch (err) {
console.error('[Storage] 获取openId失败:', 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] 获取openId失败');
return null;
}
const res = await FetchFindAllReaderBindByOpenId({
libcode: config.LIB_CODE,
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] 获取读者证失败:', 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] 获取openId失败');
return [];
}
const res = await FetchFindAllReaderBindByOpenId({
libcode: config.LIB_CODE,
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] 获取读者证列表失败:', 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);
}