interface CacheItem { value: T expiry?: number // 过期时间戳(毫秒),可选 } /** * 通用缓存管理类(支持过期时间,不设 TTL 即为永久缓存) */ class CacheManager { /** * 设置缓存 * @param key 缓存键 * @param value 缓存值 * @param ttl 过期时间(秒)。若为 undefined、null 或 <=0,则视为永久缓存(永不过期) */ static set(key: string, value: T, ttl?: number | null): void { try { const cacheItem: CacheItem = { value } // 仅当 ttl 为正数时才设置过期时间 if (ttl != null && ttl > 0) { cacheItem.expiry = Date.now() + ttl * 1000 } // 否则 cacheItem.expiry 保持 undefined,表示永久缓存 uni.setStorageSync(key, cacheItem) } catch (e) { console.error('CacheManager.set error:', e) } } /** * 获取缓存(自动清除过期项) * @param key 缓存键 * @param defaultValue 默认值(缓存不存在、过期或出错时返回) * @returns 缓存值或默认值 */ static get(key: string, defaultValue: T = null as unknown as T): T { try { const raw = uni.getStorageSync(key) if (!raw) return defaultValue const cacheItem = raw as CacheItem // 若有 expiry 且已过期,则清除并返回默认值 if (cacheItem.expiry !== undefined && Date.now() > cacheItem.expiry) { uni.removeStorageSync(key) return defaultValue } return cacheItem.value } catch (e) { console.error('CacheManager.get error:', e) return defaultValue } } /** * 删除指定缓存 */ static remove(key: string): void { try { uni.removeStorageSync(key) } catch (e) { console.error('CacheManager.remove error:', e) } } /** * 清空所有缓存 */ static clear(): void { try { uni.clearStorageSync() } catch (e) { console.error('CacheManager.clear error:', e) } } /** * 检查是否存在有效(未过期)缓存 */ static has(key: string): boolean { try { const raw = uni.getStorageSync(key) if (!raw) return false const cacheItem = raw as CacheItem if (cacheItem.expiry !== undefined && Date.now() > cacheItem.expiry) { uni.removeStorageSync(key) return false } return true } catch (e) { console.error('CacheManager.has error:', e) return false } } } export default CacheManager