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

181 lines
5.0 KiB

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