import { useStorage } from '@vueuse/core' /** * 登录态缓存 * * 单独抽成模块(而不是放 store 里)的原因:request.ts 需要读取 token, * 而 store 又依赖 request.ts,直接互相 import 会形成循环依赖。 * useStorage 自带 localStorage 持久化与响应式,刷新页面不掉登录态。 */ export const accessToken = useStorage('ACCESS_TOKEN', '') export const refreshToken = useStorage('REFRESH_TOKEN', '') export const expireTime = useStorage('ACCESS_TOKEN_EXPIRE_TIME', 0) export function getAccessToken(): string { return accessToken.value } export function setToken(token: string, refresh: string, expires: number) { accessToken.value = token || '' refreshToken.value = refresh || '' expireTime.value = expires || 0 } export function clearToken() { accessToken.value = '' refreshToken.value = '' expireTime.value = 0 } /** token 是否已过期(提前 30 秒视为过期,避免边界请求被打回) */ export function isTokenExpired(): boolean { if (!accessToken.value) return true if (!expireTime.value) return false return Date.now() >= expireTime.value - 30 * 1000 }