8 changed files with 346 additions and 152 deletions
-
27pages/home/home.vue
-
16pages/lendCar/lendCar.vue
-
6pages/login/login.vue
-
166pages/user/user.vue
-
6subpkg/pages/collect-list/collect-list.vue
-
11subpkg/pages/myLending/myLending.vue
-
77subpkg/pages/reader-card/reader-card.vue
-
181utils/storage.js
@ -0,0 +1,181 @@ |
|||
/** |
|||
* 缓存工具函数 |
|||
* 提供缓存降级策略:先从缓存获取,缓存不存在则调用接口重新获取 |
|||
*/ |
|||
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); |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue