提交 | 用户 | 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(); |