localUtils.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import globalConfig from '@/config';
  2. import { createLocalStorage, StorageOptions, decryptKey } from '@/utils/storage';
  3. /**
  4. * 创建 localStorage 工具实例
  5. * @see 在 src/utils/storage 的基础上,添加了命名空间,如果 encryptKey 为 false,能有效避免多个应用在同一个域名下的数据冲突。
  6. * @param opts {StorageOptions} 本实例使用的全局配置
  7. * @returns
  8. */
  9. function createLocalTools(storageOptions: StorageOptions = {}) {
  10. const ls = createLocalStorage(storageOptions);
  11. /**
  12. * 保存数据
  13. * @param key
  14. * @param value
  15. * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
  16. */
  17. function setLocal<T = any>(key: string, value: T, opts?: StorageOptions) {
  18. ls.set<T>(`${globalConfig.app.storageNameSpace}${key}`, value, opts);
  19. }
  20. /**
  21. * 读取数据
  22. * @param key
  23. * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
  24. * @returns
  25. */
  26. function getLocal<T>(key: string, opts?: StorageOptions) {
  27. return ls.get<T>(`${globalConfig.app.storageNameSpace}${key}`, opts);
  28. }
  29. /**
  30. * 删除数据
  31. * @param key
  32. * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
  33. */
  34. function removeLocal(key: string, opts?: StorageOptions) {
  35. ls.remove(`${globalConfig.app.storageNameSpace}${key}`, opts);
  36. }
  37. /**
  38. * 清除 localStorage 中的所有数据。**慎用**
  39. */
  40. function clearLocal() {
  41. const removedKeys = [];
  42. for (let i = 0; i < window.localStorage.length; i++) {
  43. const key = window.localStorage.key(i);
  44. if (!key) continue;
  45. // 先检查原始 key 是否属于当前命名空间
  46. if (key.startsWith(globalConfig.app.storageNameSpace)) {
  47. removedKeys.push(key);
  48. continue;
  49. }
  50. // 如果不是,尝试解密后检查是否属于当前命名空间
  51. const decryptedKey = decryptKey(key);
  52. if (decryptedKey && decryptedKey.startsWith(globalConfig.app.storageNameSpace)) {
  53. removedKeys.push(key);
  54. }
  55. }
  56. // 删除所有匹配的 key
  57. for (const key of removedKeys) {
  58. ls.remove(key, { encryptKey: false });
  59. }
  60. }
  61. return { setLocal, getLocal, removeLocal, clearLocal };
  62. }
  63. const secureLocalStorage = createLocalTools({ encryptKey: true, encryptData: true });
  64. export { createLocalTools, secureLocalStorage };