storage.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // 过期时间后缀,用于标识存储数据的过期时间键名
  2. const EXPIRES_SUFFIX = "_deadtime";
  3. /**
  4. * 存储管理类
  5. *
  6. * 封装了 uni-app 的存储 API,提供更便捷的存储操作
  7. * 支持数据过期时间管理,自动处理过期数据
  8. */
  9. class Storage {
  10. /**
  11. * 获取存储数据
  12. *
  13. * @param key 存储键名
  14. * @returns 存储的数据,如果不存在则返回 null
  15. *
  16. * @example
  17. * const userData = storage.get('user');
  18. * if (userData != null) {
  19. * console.log(userData);
  20. * }
  21. */
  22. get(key: string): any | null {
  23. return uni.getStorageSync(key);
  24. }
  25. /**
  26. * 获取所有存储数据的信息
  27. *
  28. * 遍历所有存储键,返回包含所有键值对的对象
  29. * 注意:此方法会读取所有存储数据,大量数据时需注意性能
  30. *
  31. * @returns 包含所有存储数据的对象
  32. *
  33. * @example
  34. * const allData = storage.info();
  35. * console.log('所有存储数据:', allData);
  36. */
  37. info() {
  38. // 获取存储信息,包含所有键名
  39. const info = uni.getStorageInfoSync();
  40. // 创建空对象用于存放所有数据
  41. const d = {};
  42. // 遍历所有键名,获取对应的值
  43. info.keys.forEach((e) => {
  44. d[e] = this.get(e);
  45. });
  46. return d;
  47. }
  48. /**
  49. * 设置存储数据
  50. *
  51. * @param key 存储键名
  52. * @param value 要存储的数据,支持任意类型
  53. * @param expires 过期时间(秒),默认为0表示永不过期
  54. *
  55. * @example
  56. * // 存储永久数据
  57. * storage.set('user', { name: '张三', age: 25 }, 0);
  58. *
  59. * // 存储5分钟后过期的数据
  60. * storage.set('token', 'abc123', 300);
  61. */
  62. set(key: string, value: any, expires: number): void {
  63. // 存储主要数据
  64. uni.setStorageSync(key, value);
  65. // 如果设置了过期时间,则存储过期时间戳
  66. if (expires > 0) {
  67. // 计算过期时间戳:当前时间 + 过期时间(秒转毫秒)
  68. const expireTime = new Date().getTime() + expires * 1000;
  69. uni.setStorageSync(`${key}${EXPIRES_SUFFIX}`, expireTime);
  70. }
  71. }
  72. /**
  73. * 检查数据是否已过期
  74. *
  75. * @param key 存储键名
  76. * @returns true表示已过期或无过期时间设置,false表示未过期
  77. *
  78. * @example
  79. * if (storage.isExpired('token')) {
  80. * console.log('token已过期');
  81. * }
  82. */
  83. isExpired(key: string): boolean {
  84. // 获取过期时间戳
  85. const value = uni.getStorageSync(`${key}${EXPIRES_SUFFIX}`) as number | null;
  86. // 如果没有设置过期时间,视为已过期
  87. if (value == null) {
  88. return true;
  89. }
  90. // 比较过期时间戳与当前时间,判断是否过期
  91. return value - new Date().getTime() <= 0;
  92. }
  93. /**
  94. * 删除存储数据
  95. *
  96. * 会同时删除数据本身和对应的过期时间
  97. *
  98. * @param key 存储键名
  99. *
  100. * @example
  101. * storage.remove('user');
  102. * storage.remove('token');
  103. */
  104. remove(key: string) {
  105. // 删除主要数据
  106. uni.removeStorageSync(key);
  107. // 删除对应的过期时间数据
  108. uni.removeStorageSync(`${key}${EXPIRES_SUFFIX}`);
  109. }
  110. /**
  111. * 清空所有存储数据
  112. *
  113. * 警告:此操作会删除所有本地存储数据,请谨慎使用
  114. *
  115. * @example
  116. * storage.clear(); // 清空所有数据
  117. */
  118. clear() {
  119. uni.clearStorageSync();
  120. }
  121. /**
  122. * 获取数据后立即删除(一次性读取)
  123. *
  124. * 适用于临时数据、一次性令牌等场景
  125. * 读取后数据会被自动删除,确保数据的一次性使用
  126. *
  127. * @param key 存储键名
  128. * @returns 存储的数据,如果不存在则返回 null
  129. *
  130. * @example
  131. * const tempToken = storage.once('temp_token');
  132. * // tempToken 使用后,存储中的 temp_token 已被删除
  133. */
  134. once(key: string): any | null {
  135. // 先获取数据
  136. const value = this.get(key);
  137. // 立即删除数据
  138. this.remove(key);
  139. // 返回获取到的数据
  140. return value;
  141. }
  142. }
  143. // 导出存储实例,提供全局访问
  144. export const storage = new Storage();