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

  1. /**
  2. * 缓存工具函数
  3. * 提供缓存降级策略先从缓存获取缓存不存在则调用接口重新获取
  4. */
  5. import { FetchOpenId, FetchFindAllReaderBindByOpenId } from '@/api/user';
  6. import config from '@/utils/config';
  7. // 缓存键名常量
  8. export const STORAGE_KEYS = {
  9. CURRENT_READER_CARD: 'currentReaderCard',
  10. READER_CARD_LIST: 'readList',
  11. WX_LOGIN_CODE: 'wx_login_code',
  12. };
  13. /**
  14. * 获取微信 openId带缓存降级
  15. * 参考 home.vue 中的 initUserAndCheckBind 方法
  16. * @returns {Promise<string|null>} 微信 openId
  17. */
  18. export async function getOpenId() {
  19. try {
  20. // 1. 先看缓存有没有 openId
  21. let openId = uni.getStorageSync(STORAGE_KEYS.WX_LOGIN_CODE);
  22. // 2. 有缓存,直接返回
  23. if (openId) {
  24. return openId;
  25. }
  26. // 3. 没有 → 走微信登录流程
  27. const loginRes = await new Promise((resolve, reject) => {
  28. uni.login({
  29. success: resolve,
  30. fail: reject
  31. });
  32. });
  33. if (!loginRes.code) {
  34. console.warn('[Storage] 获取code失败');
  35. return null;
  36. }
  37. // 4. 获取 openId
  38. const openRes = await FetchOpenId({
  39. libcode: config.LIB_CODE,
  40. code: loginRes.code
  41. });
  42. if (openRes.code !== 200 || !openRes.data) {
  43. console.warn('[Storage] 获取openId失败');
  44. return null;
  45. }
  46. openId = openRes.data;
  47. uni.setStorageSync(STORAGE_KEYS.WX_LOGIN_CODE, openId);
  48. return openId;
  49. } catch (err) {
  50. console.error('[Storage] 获取openId失败:', err);
  51. return null;
  52. }
  53. }
  54. /**
  55. * 获取当前读者证信息带缓存降级
  56. * @returns {Promise<Object|null>} 当前读者证信息
  57. */
  58. export async function getCurrentReaderCard() {
  59. // 1. 先从缓存获取
  60. const cachedCard = uni.getStorageSync(STORAGE_KEYS.CURRENT_READER_CARD);
  61. // 2. 如果缓存存在且有效,直接返回
  62. if (cachedCard && Object.keys(cachedCard).length > 0) {
  63. return cachedCard;
  64. }
  65. // 3. 缓存不存在,尝试从接口获取
  66. try {
  67. // 使用带缓存降级的函数获取 openId
  68. const openId = await getOpenId();
  69. if (!openId) {
  70. console.warn('[Storage] 获取openId失败');
  71. return null;
  72. }
  73. const res = await FetchFindAllReaderBindByOpenId({
  74. libcode: config.LIB_CODE,
  75. openId: openId
  76. });
  77. if (res.code === 200 && res.data.length > 0) {
  78. // 默认证排第一位
  79. const defaultCard = res.data.find(item => item.bindDefault === true);
  80. const otherCards = res.data.filter(item => !item.bindDefault);
  81. // 合并:默认在前,其他在后
  82. const readerCardList = defaultCard ? [defaultCard, ...otherCards] : res.data;
  83. const resultCard = defaultCard || res.data[0];
  84. // 更新缓存
  85. uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, resultCard);
  86. uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, readerCardList);
  87. return resultCard;
  88. }
  89. } catch (err) {
  90. console.error('[Storage] 获取读者证失败:', err);
  91. }
  92. return null;
  93. }
  94. /**
  95. * 获取读者证列表带缓存降级
  96. * @param {boolean} forceRefresh - 是否强制刷新默认 false
  97. * @returns {Promise<Array>} 读者证列表
  98. */
  99. export async function getReaderCardList(forceRefresh = false) {
  100. // 1. 如果不是强制刷新,先从缓存获取
  101. if (!forceRefresh) {
  102. const cachedList = uni.getStorageSync(STORAGE_KEYS.READER_CARD_LIST);
  103. // 如果缓存存在且有效,直接返回
  104. if (cachedList && Array.isArray(cachedList) && cachedList.length > 0) {
  105. return cachedList;
  106. }
  107. }
  108. // 2. 缓存不存在或强制刷新时,尝试从接口获取
  109. try {
  110. // 使用带缓存降级的函数获取 openId
  111. const openId = await getOpenId();
  112. if (!openId) {
  113. console.warn('[Storage] 获取openId失败');
  114. return [];
  115. }
  116. const res = await FetchFindAllReaderBindByOpenId({
  117. libcode: config.LIB_CODE,
  118. openId: openId
  119. });
  120. if (res.code === 200 && res.data.length > 0) {
  121. // 默认证排第一位
  122. const defaultCard = res.data.find(item => item.bindDefault === true);
  123. const otherCards = res.data.filter(item => !item.bindDefault);
  124. // 合并:默认在前,其他在后
  125. const readerCardList = defaultCard ? [defaultCard, ...otherCards] : res.data;
  126. // 更新缓存
  127. uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, readerCardList);
  128. // 同时更新当前读者证
  129. if (defaultCard) {
  130. uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, defaultCard);
  131. }
  132. return readerCardList;
  133. }
  134. } catch (err) {
  135. console.error('[Storage] 获取读者证列表失败:', err);
  136. }
  137. return [];
  138. }
  139. /**
  140. * 设置当前读者证
  141. * @param {Object} card - 读者证信息
  142. */
  143. export function setCurrentReaderCard(card) {
  144. uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, card);
  145. }
  146. /**
  147. * 清除读者证相关缓存
  148. */
  149. export function clearReaderCardCache() {
  150. uni.removeStorageSync(STORAGE_KEYS.CURRENT_READER_CARD);
  151. uni.removeStorageSync(STORAGE_KEYS.READER_CARD_LIST);
  152. }