diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index d4134d7..e4a69ec 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -1,35 +1,35 @@ import type { - ApiResponse, - VideoSourcesResponse, - VideosRequest, - VideosResponse, - VideoResponse, - ResetVideoResponse, - ClearAndResetVideoResponse, - ResetFilteredVideosResponse, - UpdateVideoStatusRequest, - UpdateVideoStatusResponse, ApiError, - FavoritesResponse, + ApiResponse, + ClearAndResetVideoResponse, CollectionsResponse, - UppersResponse, - InsertFavoriteRequest, - InsertCollectionRequest, - InsertSubmissionRequest, - VideoSourcesDetailsResponse, - UpdateVideoSourceRequest, Config, DashBoardResponse, + FavoritesResponse, + QrcodeGenerateResponse as GenerateQrcodeResponse, + InsertCollectionRequest, + InsertFavoriteRequest, + InsertSubmissionRequest, + Notifier, + QrcodePollResponse as PollQrcodeResponse, + ResetFilteredVideosResponse, + ResetFilteredVideoStatusRequest, + ResetVideoResponse, + ResetVideoStatusRequest, SysInfo, TaskStatus, - ResetVideoStatusRequest, - UpdateVideoSourceResponse, - Notifier, UpdateFilteredVideoStatusRequest, UpdateFilteredVideoStatusResponse, - ResetFilteredVideoStatusRequest, - QrcodeGenerateResponse as GenerateQrcodeResponse, - QrcodePollResponse as PollQrcodeResponse + UpdateVideoSourceRequest, + UpdateVideoSourceResponse, + UpdateVideoStatusRequest, + UpdateVideoStatusResponse, + UppersResponse, + VideoResponse, + VideoSourcesDetailsResponse, + VideoSourcesResponse, + VideosRequest, + VideosResponse } from './types'; import { wsManager } from './ws'; @@ -63,6 +63,10 @@ class ApiClient { } } + getAuthToken(): string | null { + return this.defaultHeaders['Authorization'] || localStorage.getItem('authToken'); + } + // 清除认证 token clearAuthToken() { delete this.defaultHeaders['Authorization']; @@ -340,6 +344,7 @@ const api = { apiClient.subscribeToTasks(onMessage), setAuthToken: (token: string) => apiClient.setAuthToken(token), + getAuthToken: () => apiClient.getAuthToken(), clearAuthToken: () => apiClient.clearAuthToken() }; diff --git a/web/src/lib/ws.ts b/web/src/lib/ws.ts index ac853db..6adf284 100644 --- a/web/src/lib/ws.ts +++ b/web/src/lib/ws.ts @@ -1,4 +1,5 @@ import { toast } from 'svelte-sonner'; +import api from './api'; import type { SysInfo, TaskStatus } from './types'; // 支持的事件类型 @@ -61,7 +62,7 @@ export class WebSocketManager { this.connectionPromise = new Promise((resolve, reject) => { this.connecting = true; - const token = localStorage.getItem('authToken') || ''; + const token = api.getAuthToken() || ''; try { const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://'; diff --git a/web/src/routes/settings/+page.svelte b/web/src/routes/settings/+page.svelte index 437959c..e395c40 100644 --- a/web/src/routes/settings/+page.svelte +++ b/web/src/routes/settings/+page.svelte @@ -110,6 +110,7 @@ toast.error('加载配置失败', { description: (error as ApiError).message }); + throw error; } finally { loading = false; } @@ -123,12 +124,13 @@ try { api.setAuthToken(frontendToken.trim()); - localStorage.setItem('authToken', frontendToken.trim()); - loadConfig(); + await loadConfig(); toast.success('前端认证成功'); } catch (error) { console.error('前端认证失败:', error); - toast.error('认证失败,请检查Token是否正确'); + toast.error('认证失败,请检查Token是否正确', { + description: (error as ApiError).message + }); } } @@ -191,13 +193,7 @@ onMount(() => { setBreadcrumb([{ label: '设置' }]); - - const savedToken = localStorage.getItem('authToken'); - if (savedToken) { - frontendToken = savedToken; - api.setAuthToken(savedToken); - } - + frontendToken = api.getAuthToken() || ''; loadConfig(); }); @@ -233,7 +229,6 @@ onclick={() => { formData = null; config = null; - localStorage.removeItem('authToken'); api.clearAuthToken(); frontendToken = ''; }}