persistent.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import type { LockInfo, UserInfo } from '/@/store/types';
  2. import { ProjectConfig } from '/#/config';
  3. import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
  4. import { Memory } from './memory';
  5. import {
  6. TOKEN_KEY,
  7. USER_INFO_KEY,
  8. ROLES_KEY,
  9. LOCK_INFO_KEY,
  10. PROJ_CFG_KEY,
  11. APP_LOCAL_CACHE_KEY,
  12. APP_SESSION_CACHE_KEY,
  13. } from '/@/enums/cacheEnum';
  14. import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
  15. import { toRaw } from 'vue';
  16. interface BasicStore {
  17. [TOKEN_KEY]: string | number | null | undefined;
  18. [USER_INFO_KEY]: UserInfo;
  19. [ROLES_KEY]: string[];
  20. [LOCK_INFO_KEY]: LockInfo;
  21. [PROJ_CFG_KEY]: ProjectConfig;
  22. }
  23. type LocalStore = BasicStore;
  24. type SessionStore = BasicStore;
  25. export type BasicKeys = keyof BasicStore;
  26. type LocalKeys = keyof LocalStore;
  27. type SessionKeys = keyof SessionStore;
  28. const ls = createLocalStorage();
  29. const ss = createSessionStorage();
  30. const localMemory = new Memory(DEFAULT_CACHE_TIME);
  31. const sessionMemory = new Memory(DEFAULT_CACHE_TIME);
  32. function initPersistentMemory() {
  33. const localCache = ls.get(APP_LOCAL_CACHE_KEY);
  34. const sessionCache = ss.get(APP_SESSION_CACHE_KEY);
  35. localCache && localMemory.resetCache(localCache);
  36. sessionCache && sessionMemory.resetCache(sessionCache);
  37. }
  38. export class Persistent {
  39. static getLocal<T>(key: LocalKeys) {
  40. return localMemory.get(key)?.value as Nullable<T>;
  41. }
  42. static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void {
  43. localMemory.set(key, toRaw(value));
  44. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  45. }
  46. static removeLocal(key: LocalKeys): void {
  47. localMemory.remove(key);
  48. }
  49. static clearLocal(): void {
  50. localMemory.clear();
  51. }
  52. static getSession<T>(key: SessionKeys) {
  53. return sessionMemory.get(key)?.value as Nullable<T>;
  54. }
  55. static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {
  56. sessionMemory.set(key, toRaw(value));
  57. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory);
  58. }
  59. static removeSession(key: SessionKeys): void {
  60. sessionMemory.remove(key);
  61. }
  62. static clearSession(): void {
  63. sessionMemory.clear();
  64. }
  65. static clearAll() {
  66. sessionMemory.clear();
  67. localMemory.clear();
  68. }
  69. }
  70. window.addEventListener('beforeunload', function () {
  71. ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  72. ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);
  73. });
  74. function storageChange(e: any) {
  75. const { key, newValue, oldValue } = e;
  76. if (!key) {
  77. Persistent.clearAll();
  78. return;
  79. }
  80. if (!!newValue && !!oldValue) {
  81. if (APP_LOCAL_CACHE_KEY === key) {
  82. Persistent.clearLocal();
  83. }
  84. if (APP_SESSION_CACHE_KEY === key) {
  85. Persistent.clearSession();
  86. }
  87. }
  88. }
  89. window.addEventListener('storage', storageChange);
  90. initPersistentMemory();