persistent.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import type { LockInfo, UserInfo, LoginInfo } 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. DB_DICT_DATA_KEY,
  16. TENANT_ID,
  17. LOGIN_INFO_KEY,
  18. OAUTH2_THIRD_LOGIN_TENANT_ID,
  19. PWD_KEY,
  20. } from '/@/enums/cacheEnum';
  21. import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
  22. import { toRaw } from 'vue';
  23. import { pick, omit } from 'lodash-es';
  24. interface BasicStore {
  25. [PWD_KEY]: string | undefined;
  26. [TOKEN_KEY]: string | number | null | undefined;
  27. [USER_INFO_KEY]: UserInfo;
  28. [ROLES_KEY]: string[];
  29. [LOCK_INFO_KEY]: LockInfo;
  30. [PROJ_CFG_KEY]: ProjectConfig;
  31. [MULTIPLE_TABS_KEY]: RouteLocationNormalized[];
  32. [DB_DICT_DATA_KEY]: string;
  33. [TENANT_ID]: string;
  34. [LOGIN_INFO_KEY]: LoginInfo;
  35. [OAUTH2_THIRD_LOGIN_TENANT_ID]: string;
  36. }
  37. type LocalStore = BasicStore;
  38. type SessionStore = BasicStore;
  39. export type BasicKeys = keyof BasicStore;
  40. type LocalKeys = keyof LocalStore;
  41. type SessionKeys = keyof SessionStore;
  42. const ls = createLocalStorage();
  43. const ss = createSessionStorage();
  44. const localMemory = new Memory(DEFAULT_CACHE_TIME);
  45. const sessionMemory = new Memory(DEFAULT_CACHE_TIME);
  46. function initPersistentMemory() {
  47. const localCache = ls.get(APP_LOCAL_CACHE_KEY);
  48. const sessionCache = ss.get(APP_SESSION_CACHE_KEY);
  49. localCache && localMemory.resetCache(localCache);
  50. sessionCache && sessionMemory.resetCache(sessionCache);
  51. }
  52. export class Persistent {
  53. static getLocal<T>(key: LocalKeys) {
  54. //update-begin---author:scott ---date:2022-10-27 for:token过期退出重新登录,online菜单还是提示token过期----------
  55. const globalCache = ls.get(APP_LOCAL_CACHE_KEY);
  56. if (globalCache) {
  57. localMemory.setCache(globalCache);
  58. }
  59. //update-end---author:scott ---date::2022-10-27 for:token过期退出重新登录,online菜单还是提示token过期----------
  60. return localMemory.get(key)?.value as Nullable<T>;
  61. }
  62. static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void {
  63. localMemory.set(key, toRaw(value));
  64. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  65. }
  66. static removeLocal(key: LocalKeys, immediate = false): void {
  67. localMemory.remove(key);
  68. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);
  69. }
  70. static clearLocal(immediate = false): void {
  71. localMemory.clear();
  72. immediate && ls.clear();
  73. }
  74. static getSession<T>(key: SessionKeys) {
  75. return sessionMemory.get(key)?.value as Nullable<T>;
  76. }
  77. static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {
  78. sessionMemory.set(key, toRaw(value));
  79. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);
  80. }
  81. static removeSession(key: SessionKeys, immediate = false): void {
  82. sessionMemory.remove(key);
  83. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);
  84. }
  85. static clearSession(immediate = false): void {
  86. sessionMemory.clear();
  87. immediate && ss.clear();
  88. }
  89. static clearAll(immediate = false) {
  90. sessionMemory.clear();
  91. localMemory.clear();
  92. if (immediate) {
  93. ls.clear();
  94. ss.clear();
  95. }
  96. }
  97. }
  98. window.addEventListener('beforeunload', function () {
  99. // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题
  100. // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改
  101. ls.set(APP_LOCAL_CACHE_KEY, {
  102. ...omit(localMemory.getCache, LOCK_INFO_KEY),
  103. ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
  104. });
  105. ss.set(APP_SESSION_CACHE_KEY, {
  106. ...omit(sessionMemory.getCache, LOCK_INFO_KEY),
  107. ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),
  108. });
  109. });
  110. function storageChange(e: any) {
  111. const { key, newValue, oldValue } = e;
  112. if (!key) {
  113. Persistent.clearAll();
  114. return;
  115. }
  116. if (!!newValue && !!oldValue) {
  117. if (APP_LOCAL_CACHE_KEY === key) {
  118. Persistent.clearLocal();
  119. }
  120. if (APP_SESSION_CACHE_KEY === key) {
  121. Persistent.clearSession();
  122. }
  123. }
  124. }
  125. window.addEventListener('storage', storageChange);
  126. initPersistentMemory();