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