persistent.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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(
  45. key: LocalKeys,
  46. value: LocalStore[LocalKeys],
  47. immediate = false,
  48. expire?: number
  49. ): void {
  50. localMemory.set(key, value)
  51. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache, expire)
  52. }
  53. static removeLocal(key: LocalKeys, immediate = false): void {
  54. localMemory.remove(key)
  55. immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache)
  56. }
  57. static clearLocal(immediate = false): void {
  58. localMemory.clear()
  59. immediate && ls.clear()
  60. }
  61. static getSession<T>(key: SessionKeys) {
  62. return sessionMemory.get(key)?.value as Nullable<T>
  63. }
  64. static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {
  65. sessionMemory.set(key, toRaw(value))
  66. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache)
  67. }
  68. static removeSession(key: SessionKeys, immediate = false): void {
  69. sessionMemory.remove(key)
  70. immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache)
  71. }
  72. static clearSession(immediate = false): void {
  73. sessionMemory.clear()
  74. immediate && ss.clear()
  75. }
  76. static clearAll(immediate = false) {
  77. sessionMemory.clear()
  78. localMemory.clear()
  79. if (immediate) {
  80. ls.clear()
  81. ss.clear()
  82. }
  83. }
  84. }
  85. window.addEventListener('beforeunload', function () {
  86. // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题
  87. // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改
  88. ls.set(APP_LOCAL_CACHE_KEY, {
  89. ...omit(localMemory.getCache),
  90. ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY])
  91. })
  92. ss.set(APP_SESSION_CACHE_KEY, {
  93. ...omit(sessionMemory.getCache),
  94. ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY])
  95. })
  96. })
  97. function storageChange(e: any) {
  98. const { key, newValue, oldValue } = e
  99. if (!key) {
  100. Persistent.clearAll()
  101. return
  102. }
  103. if (!!newValue && !!oldValue) {
  104. if (APP_LOCAL_CACHE_KEY === key) {
  105. Persistent.clearLocal()
  106. }
  107. if (APP_SESSION_CACHE_KEY === key) {
  108. Persistent.clearSession()
  109. }
  110. }
  111. }
  112. window.addEventListener('storage', storageChange)
  113. initPersistentMemory()