|
|
@@ -1,82 +1,244 @@
|
|
|
/**
|
|
|
- * 认证相关工具
|
|
|
- * 仿照 JeecgBoot 前端的 token 存储逻辑
|
|
|
+ * Token认证工具类
|
|
|
+ * 完全兼容 JeecgBoot 的 Persistent 缓存机制
|
|
|
+ * 使用内存缓存优先机制,提高性能
|
|
|
*/
|
|
|
|
|
|
-// Token 存储的 key,与 JeecgBoot 前端保持一致
|
|
|
-const TOKEN_KEY = "ACCESS_TOKEN";
|
|
|
-const USER_INFO_KEY = "USER_INFO";
|
|
|
-const TENANT_ID_KEY = "TENANT_ID";
|
|
|
+import { generatePersistentKey } from '../config/project';
|
|
|
+
|
|
|
+// JeecgBoot Persistent 缓存的主 key
|
|
|
+// 格式:{项目名}__{环境}__{版本}__COMMON__LOCAL__KEY__
|
|
|
+// 动态生成,根据环境自动切换
|
|
|
+const PERSISTENT_KEY = generatePersistentKey();
|
|
|
+
|
|
|
+// 缓存子key常量(在 Persistent 对象内部)
|
|
|
+export const TOKEN_KEY = 'TOKEN__';
|
|
|
+export const USER_INFO_KEY = 'USER__INFO__';
|
|
|
+export const TENANT_ID_KEY = 'TENANT_ID';
|
|
|
+export const ROLES_KEY = 'ROLES__KEY__';
|
|
|
+export const LOGIN_INFO_KEY = 'LOGIN_INFO';
|
|
|
+
|
|
|
+// 缓存类型:local 或 session
|
|
|
+type StorageType = 'local' | 'session';
|
|
|
+
|
|
|
+// 配置:选择使用localStorage还是sessionStorage
|
|
|
+const STORAGE_TYPE: StorageType = 'local';
|
|
|
+
|
|
|
+// 内存缓存对象(优先从内存读取,减少 localStorage 访问)
|
|
|
+const memoryCache: Map<string, any> = new Map();
|
|
|
+
|
|
|
+// Persistent 数据结构(JeecgBoot 的两层嵌套结构)
|
|
|
+interface PersistentItem {
|
|
|
+ value: any;
|
|
|
+ alive?: number;
|
|
|
+ time?: number;
|
|
|
+ timeoutId?: number;
|
|
|
+}
|
|
|
+
|
|
|
+interface PersistentData {
|
|
|
+ value: {
|
|
|
+ [key: string]: PersistentItem;
|
|
|
+ };
|
|
|
+ time?: number;
|
|
|
+ expire?: number;
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
- * 获取 token
|
|
|
+ * 获取storage实例
|
|
|
*/
|
|
|
-export function getToken(): string {
|
|
|
- return localStorage.getItem(TOKEN_KEY) || "";
|
|
|
+function getStorage(): Storage {
|
|
|
+ return STORAGE_TYPE === 'local' ? localStorage : sessionStorage;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置 token
|
|
|
+ * 获取 Persistent 数据对象
|
|
|
*/
|
|
|
-export function setToken(token: string): void {
|
|
|
- localStorage.setItem(TOKEN_KEY, token);
|
|
|
+function getPersistentData(): PersistentData {
|
|
|
+ // 先从内存缓存读取
|
|
|
+ if (memoryCache.has(PERSISTENT_KEY)) {
|
|
|
+ return memoryCache.get(PERSISTENT_KEY);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 localStorage 读取
|
|
|
+ const data = getStorage().getItem(PERSISTENT_KEY);
|
|
|
+ if (data) {
|
|
|
+ try {
|
|
|
+ const parsed = JSON.parse(data);
|
|
|
+ // 缓存到内存
|
|
|
+ memoryCache.set(PERSISTENT_KEY, parsed);
|
|
|
+ return parsed;
|
|
|
+ } catch (e) {
|
|
|
+ console.error('Failed to parse persistent data:', e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回默认结构
|
|
|
+ return {
|
|
|
+ value: {},
|
|
|
+ time: Date.now(),
|
|
|
+ expire: Date.now() + 604800000, // 7天后过期
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 移除 token
|
|
|
+ * 保存 Persistent 数据对象
|
|
|
*/
|
|
|
-export function removeToken(): void {
|
|
|
- localStorage.removeItem(TOKEN_KEY);
|
|
|
+function savePersistentData(data: PersistentData): void {
|
|
|
+ // 更新内存缓存
|
|
|
+ memoryCache.set(PERSISTENT_KEY, data);
|
|
|
+
|
|
|
+ // 保存到 localStorage
|
|
|
+ getStorage().setItem(PERSISTENT_KEY, JSON.stringify(data));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 获取用户信息
|
|
|
+ * 从缓存获取数据(兼容 JeecgBoot 两层嵌套结构)
|
|
|
*/
|
|
|
-export function getUserInfo(): any {
|
|
|
- const userInfo = localStorage.getItem(USER_INFO_KEY);
|
|
|
- if (userInfo) {
|
|
|
- try {
|
|
|
- return JSON.parse(userInfo);
|
|
|
- } catch (e) {
|
|
|
- return null;
|
|
|
+function getCache<T>(key: string): T | null {
|
|
|
+ const persistentData = getPersistentData();
|
|
|
+
|
|
|
+ // JeecgBoot 的两层嵌套:外层 value -> 子 key -> 内层 value
|
|
|
+ if (persistentData.value && persistentData.value[key]) {
|
|
|
+ const item = persistentData.value[key];
|
|
|
+ if (item && item.value !== undefined) {
|
|
|
+ return item.value;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 设置缓存(兼容 JeecgBoot 两层嵌套结构)
|
|
|
+ */
|
|
|
+function setCache(key: string, value: any): void {
|
|
|
+ const persistentData = getPersistentData();
|
|
|
+
|
|
|
+ // 确保 value 对象存在
|
|
|
+ if (!persistentData.value) {
|
|
|
+ persistentData.value = {};
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置数据,包含 JeecgBoot 的元数据
|
|
|
+ persistentData.value[key] = {
|
|
|
+ value,
|
|
|
+ alive: 604800000, // 7天过期时间(毫秒)
|
|
|
+ time: Date.now(),
|
|
|
+ timeoutId: undefined,
|
|
|
+ };
|
|
|
+
|
|
|
+ // 更新外层的时间戳
|
|
|
+ persistentData.time = Date.now();
|
|
|
+ persistentData.expire = Date.now() + 604800000;
|
|
|
+
|
|
|
+ savePersistentData(persistentData);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 移除缓存(兼容 JeecgBoot 两层嵌套结构)
|
|
|
+ */
|
|
|
+function removeCache(key: string): void {
|
|
|
+ const persistentData = getPersistentData();
|
|
|
+
|
|
|
+ if (persistentData.value) {
|
|
|
+ delete persistentData.value[key];
|
|
|
+ savePersistentData(persistentData);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 清空所有缓存
|
|
|
+ */
|
|
|
+function clearAllCache(): void {
|
|
|
+ // 清空内存缓存
|
|
|
+ memoryCache.clear();
|
|
|
+
|
|
|
+ // 清空 localStorage
|
|
|
+ getStorage().removeItem(PERSISTENT_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取token
|
|
|
+ */
|
|
|
+export function getToken(): string | null {
|
|
|
+ return getCache<string>(TOKEN_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 设置token
|
|
|
+ */
|
|
|
+export function setToken(token: string): void {
|
|
|
+ setCache(TOKEN_KEY, token);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 移除token
|
|
|
+ */
|
|
|
+export function removeToken(): void {
|
|
|
+ removeCache(TOKEN_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取用户信息
|
|
|
+ */
|
|
|
+export function getUserInfo<T = any>(): T | null {
|
|
|
+ return getCache<T>(USER_INFO_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
* 设置用户信息
|
|
|
*/
|
|
|
export function setUserInfo(userInfo: any): void {
|
|
|
- localStorage.setItem(USER_INFO_KEY, JSON.stringify(userInfo));
|
|
|
+ setCache(USER_INFO_KEY, userInfo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 移除用户信息
|
|
|
*/
|
|
|
export function removeUserInfo(): void {
|
|
|
- localStorage.removeItem(USER_INFO_KEY);
|
|
|
+ removeCache(USER_INFO_KEY);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 获取租户 ID
|
|
|
+ * 获取租户ID
|
|
|
*/
|
|
|
-export function getTenantId(): string {
|
|
|
- return localStorage.getItem(TENANT_ID_KEY) || "";
|
|
|
+export function getTenantId(): string | null {
|
|
|
+ return getCache<string>(TENANT_ID_KEY);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置租户 ID
|
|
|
+ * 设置租户ID
|
|
|
*/
|
|
|
export function setTenantId(tenantId: string): void {
|
|
|
- localStorage.setItem(TENANT_ID_KEY, tenantId);
|
|
|
+ setCache(TENANT_ID_KEY, tenantId);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 移除租户 ID
|
|
|
+ * 移除租户ID
|
|
|
*/
|
|
|
export function removeTenantId(): void {
|
|
|
- localStorage.removeItem(TENANT_ID_KEY);
|
|
|
+ removeCache(TENANT_ID_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取登录信息
|
|
|
+ */
|
|
|
+export function getLoginInfo<T = any>(): T | null {
|
|
|
+ return getCache<T>(LOGIN_INFO_KEY);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 设置登录信息
|
|
|
+ */
|
|
|
+export function setLoginInfo(loginInfo: any): void {
|
|
|
+ setCache(LOGIN_INFO_KEY, loginInfo);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 移除登录信息
|
|
|
+ */
|
|
|
+export function removeLoginInfo(): void {
|
|
|
+ removeCache(LOGIN_INFO_KEY);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -86,6 +248,7 @@ export function clearAuth(): void {
|
|
|
removeToken();
|
|
|
removeUserInfo();
|
|
|
removeTenantId();
|
|
|
+ removeLoginInfo();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -94,3 +257,31 @@ export function clearAuth(): void {
|
|
|
export function isAuthenticated(): boolean {
|
|
|
return !!getToken();
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 设置动态key缓存(兼容 JeecgBoot)
|
|
|
+ */
|
|
|
+export function setCacheByDynKey(key: string, value: any): void {
|
|
|
+ setCache(key, value);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取动态key缓存(兼容 JeecgBoot)
|
|
|
+ */
|
|
|
+export function getCacheByDynKey<T>(key: string): T | null {
|
|
|
+ return getCache<T>(key);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 移除动态key缓存(兼容 JeecgBoot)
|
|
|
+ */
|
|
|
+export function removeCacheByDynKey(key: string): void {
|
|
|
+ removeCache(key);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 清空所有缓存(包括内存和浏览器)
|
|
|
+ */
|
|
|
+export function clearAllAuthCache(): void {
|
|
|
+ clearAllCache();
|
|
|
+}
|