feat(api): migrate HTTP layer to ofetch with token interceptor

This commit is contained in:
2026-06-08 15:49:48 +08:00
parent d7943f5f06
commit f4e1c30051
18 changed files with 1446 additions and 159 deletions
+118
View File
@@ -0,0 +1,118 @@
/**
* Auth 存储 - localStorage 包装
*
* 存储登录 token、刷新 token、游客 token、设备 ID。
* 原始 Dart: lib/data/services/storage/auth_storage.dart
*
* 注:localStorage 仅在浏览器环境可用;
* 在 Server Components 中调用会抛错,应仅在 Client Components 或拦截器中使用。
*/
const STORAGE_KEYS = {
loginToken: "cozsweet.loginToken",
refreshToken: "cozsweet.refreshToken",
guestToken: "cozsweet.guestToken",
deviceId: "cozsweet.deviceId",
} as const;
function getStorage(): Storage | null {
if (typeof window === "undefined") return null;
try {
return window.localStorage;
} catch {
return null;
}
}
export class AuthStorage {
// ============ 登录 Token ============
getLoginToken(): string | null {
return getStorage()?.getItem(STORAGE_KEYS.loginToken) ?? null;
}
setLoginToken(token: string): void {
getStorage()?.setItem(STORAGE_KEYS.loginToken, token);
}
removeLoginToken(): void {
getStorage()?.removeItem(STORAGE_KEYS.loginToken);
}
// ============ 刷新 Token ============
getRefreshToken(): string | null {
return getStorage()?.getItem(STORAGE_KEYS.refreshToken) ?? null;
}
setRefreshToken(token: string): void {
getStorage()?.setItem(STORAGE_KEYS.refreshToken, token);
}
removeRefreshToken(): void {
getStorage()?.removeItem(STORAGE_KEYS.refreshToken);
}
// ============ 游客 Token ============
getGuestToken(): string | null {
return getStorage()?.getItem(STORAGE_KEYS.guestToken) ?? null;
}
setGuestToken(token: string): void {
getStorage()?.setItem(STORAGE_KEYS.guestToken, token);
}
removeGuestToken(): void {
getStorage()?.removeItem(STORAGE_KEYS.guestToken);
}
// ============ 设备 ID ============
getDeviceId(): string | null {
return getStorage()?.getItem(STORAGE_KEYS.deviceId) ?? null;
}
setDeviceId(deviceId: string): void {
getStorage()?.setItem(STORAGE_KEYS.deviceId, deviceId);
}
removeDeviceId(): void {
getStorage()?.removeItem(STORAGE_KEYS.deviceId);
}
// ============ 复合操作 ============
/**
* 是否有登录 token
*/
hasLoginToken(): boolean {
const token = this.getLoginToken();
return token !== null && token.length > 0;
}
/**
* 获取认证 token(优先登录 token,其次游客 token
*/
getAuthToken(): string | null {
const loginToken = this.getLoginToken();
if (loginToken !== null && loginToken.length > 0) return loginToken;
const guestToken = this.getGuestToken();
if (guestToken !== null && guestToken.length > 0) return guestToken;
return null;
}
/**
* 清除所有 auth 数据(登录/刷新/游客 token)
*/
clearAuthData(): void {
this.removeLoginToken();
this.removeRefreshToken();
this.removeGuestToken();
}
}
/**
* 全局单例
*/
export const authStorage = new AuthStorage();