persistent.ts 3.7 KB

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