From ea0efd4468a71ab47e097a73ce34e269527db008 Mon Sep 17 00:00:00 2001 From: Jz0ojiang Date: Fri, 14 Aug 2026 14:06:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A4=E7=89=8C=E8=BE=93=E9=94=99=E6=97=B6?= =?UTF-8?q?=E7=BB=99=E5=87=BA=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 登录页在提交前后都是同一个组件,不重建、输入框也不清空,401 静默处理的话 点了「进入」界面一个字都不变,看着像没反应。 只在提交令牌时提示:存着的令牌失效而弹回登录页时,页面本身就是说明。 --- web/App.vue | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/web/App.vue b/web/App.vue index 81b6a40..3b0c1fc 100644 --- a/web/App.vue +++ b/web/App.vue @@ -53,7 +53,7 @@ function openInbound(id: string) { * 选中的那一路入站丢失,改完一个设置还要重新找回原来的位置。所以只有首次加载显示占位, * 之后都是原地更新。 */ -async function load() { +async function load(): Promise<'ok' | 'unauthorized' | 'error'> { refreshing.value = true loadError.value = '' try { @@ -64,22 +64,32 @@ async function load() { needsToken.value = false // 撤回/重做按钮的可用性跟着每次重读走 void refreshHistory() + return 'ok' } catch (error) { if (error instanceof ApiError && error.unauthorized) { clearToken() needsToken.value = true - } else { - loadError.value = error instanceof Error ? error.message : String(error) + return 'unauthorized' } + loadError.value = error instanceof Error ? error.message : String(error) + return 'error' } finally { refreshing.value = false booted.value = true } } -function submitToken(value: string) { +/** + * 提交登录页填的令牌。 + * + * 401 必须当场说一声:登录页在提交前后都是它自己,组件不重建、输入框也不清空, + * 不提示的话点了「进入」界面一个字都不变,看着像没反应。 + * 只在这里提示,不在 load() 里——存着的令牌失效时弹回登录页,页面本身就是说明。 + */ +async function submitToken(value: string) { setToken(value) - void load() + // 令牌在哪儿取,登录页上就写着,不必在提示里再说一遍 + if ((await load()) === 'unauthorized') toast('令牌不正确', { kind: 'error' }) } function logout() {