persistent.ts 3.9 KB

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