persistent.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import type { LockInfo, UserInfo } from '/#/store';
  2. import type { ProjectConfig } from '/#/config';
  3. import type { RouteLocationNormalized } from 'vue-router';
  4. import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
  5. import { Memory } from './memory';
  6. import {
  7. TOKEN_KEY,
  8. USER_INFO_KEY,
  9. ROLES_KEY,
  10. LOCK_INFO_KEY,
  11. PROJ_CFG_KEY,
  12. APP_LOCAL_CACHE_KEY,
  13. APP_SESSION_CACHE_KEY,
  14. MULTIPLE_TABS_KEY,
  15. } from '/@/enums/cacheEnum';
  16. import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
  17. import { toRaw } from 'vue';
  18. import { pick, omit } from 'lodash-es';
  19. interface BasicStore {
  20. [TOKEN_KEY]: string | number | null | undefined;
  21. [USER_INFO_KEY]: UserInfo;
  22. [ROLES_KEY]: string[];
  23. [LOCK_INFO_KEY]: LockInfo;
  24. [PROJ_CFG_KEY]: ProjectConfig;
  25. [MULTIPLE_TABS_KEY]: RouteLocationNormalized[];
  26. }
  27. type LocalStore = BasicStore;
  28. type SessionStore = BasicStore;
  29. export type BasicKeys = keyof BasicStore;
  30. type LocalKeys = keyof LocalStore;
  31. type SessionKeys = keyof SessionStore;
  32. const ls = createLocalStorage();
  33. const ss = createSessionStorage();
  34. const localMemory = new Memory(DEFAULT_CACHE_TIME);
  35. const sessionMemory = new Memory(DEFAULT_CACHE_TIME);
  36. function initPersistentMemory() {
  37. const localCache = ls.get(APP_LOCAL_CACHE_KEY);
  38. const sessionCache = ss.get(APP_SESSION_CACHE_KEY);
  39. localCache && localMemory.resetCache(localCache);
  40. sessionCache && sessionMemory.resetCache(sessionCache);
  41. }
  42. export class Persistent {
  43. static getLocal<T>(key: LocalKeys) {
  44. return localMemory.get(key)?.value as Nullable<T>;
  45. }
  46. static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void {
  47. localMemory.set(key, toRaw(value));
  48. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  49. }
  50. static removeLocal(key: LocalKeys, immediate = false): void {
  51. localMemory.remove(key);
  52. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  53. }
  54. static clearLocal(immediate = false): void {
  55. localMemory.clear();
  56. immediate && ls.clear();
  57. }
  58. static getSession<T>(key: SessionKeys) {
  59. return sessionMemory.get(key)?.value as Nullable<T>;
  60. }
  61. static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {
  62. sessionMemory.set(key, toRaw(value));
  63. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);
  64. }
  65. static removeSession(key: SessionKeys, immediate = false): void {
  66. sessionMemory.remove(key);
  67. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);
  68. }
  69. static clearSession(immediate = false): void {
  70. sessionMemory.clear();
  71. immediate && ss.clear();
  72. }
  73. static clearAll(immediate = false) {
  74. sessionMemory.clear();
  75. localMemory.clear();
  76. if (immediate) {
  77. ls.clear();
  78. ss.clear();
  79. }
  80. }
  81. }
  82. window.addEventListener('beforeunload', function () {
  83. // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题
  84. // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改
  85. ls.set(APP_LOCAL_CACHE_KEY, {
  86. ...omit(localMemory.getCache, LOCK_INFO_KEY),
  87. ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
  88. });
  89. ss.set(APP_SESSION_CACHE_KEY, {
  90. ...omit(sessionMemory.getCache, LOCK_INFO_KEY),
  91. ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
  92. });
  93. });
  94. function storageChange(e: any) {
  95. const { key, newValue, oldValue } = e;
  96. if (!key) {
  97. Persistent.clearAll();
  98. return;
  99. }
  100. if (!!newValue && !!oldValue) {
  101. if (APP_LOCAL_CACHE_KEY === key) {
  102. Persistent.clearLocal();
  103. }
  104. if (APP_SESSION_CACHE_KEY === key) {
  105. Persistent.clearSession();
  106. }
  107. }
  108. }
  109. window.addEventListener('storage', storageChange);
  110. initPersistentMemory();