From fb119f9a67c3b6d45453e49f330c5cbb0136dcab Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 24 Dec 2025 17:21:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(version):=20=E4=BC=98=E5=8C=96=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E9=87=8D=E5=90=AF=E5=90=8E=E9=A1=B5=E9=9D=A2=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=97=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将重启后等待时间从 3 秒增加到 8 秒 - 添加倒计时显示,提升用户体验 - 倒计时结束后先检测服务健康状态再刷新页面 - 避免刷新过早导致 502 错误 --- .../src/components/common/VersionBadge.vue | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/common/VersionBadge.vue b/frontend/src/components/common/VersionBadge.vue index c19afd12..057581b9 100644 --- a/frontend/src/components/common/VersionBadge.vue +++ b/frontend/src/components/common/VersionBadge.vue @@ -109,7 +109,7 @@ - + @@ -266,6 +270,7 @@ const restarting = ref(false); const needRestart = ref(false); const updateError = ref(''); const updateSuccess = ref(false); +const restartCountdown = ref(0); // Only show update check for release builds (binary/docker deployment) const isReleaseBuild = computed(() => buildType.value === 'release'); @@ -314,6 +319,7 @@ async function handleRestart() { if (restarting.value) return; restarting.value = true; + restartCountdown.value = 8; try { await restartService(); @@ -323,10 +329,43 @@ async function handleRestart() { console.log('Service restarting...'); } - // Show restarting state for a while, then reload - setTimeout(() => { - window.location.reload(); - }, 3000); + // Start countdown + const countdownInterval = setInterval(() => { + restartCountdown.value--; + if (restartCountdown.value <= 0) { + clearInterval(countdownInterval); + // Try to check if service is back before reload + checkServiceAndReload(); + } + }, 1000); +} + +async function checkServiceAndReload() { + const maxRetries = 5; + const retryDelay = 1000; + + for (let i = 0; i < maxRetries; i++) { + try { + const response = await fetch('/api/health', { + method: 'GET', + cache: 'no-cache' + }); + if (response.ok) { + // Service is back, reload page + window.location.reload(); + return; + } + } catch { + // Service not ready yet + } + + if (i < maxRetries - 1) { + await new Promise(resolve => setTimeout(resolve, retryDelay)); + } + } + + // After retries, reload anyway + window.location.reload(); } function handleClickOutside(event: MouseEvent) {