From 5c8020d5fb45fc9e4d86f964fcfeadbb161562ae Mon Sep 17 00:00:00 2001 From: Flik Date: Thu, 22 Jan 2026 23:55:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(client):=20=E6=B7=BB=E5=8A=A0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E7=89=88=E6=9C=AC=E6=A3=80=E6=9F=A5=E5=92=8C?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 getVersionInfo API 和服务端版本获取功能 - 实现版本比较算法用于判断更新需求 - 添加服务端版本加载和目标版本计算逻辑 - 更新客户端版本显示为可更新目标版本 - 优化样式表移除不透明背景设置 - 调整进度条外观样式增强视觉效果 --- web/src/components/InlineLogPanel.vue | 41 ++-- web/src/views/ClientView.vue | 70 ++++++- web/src/views/HomeView.vue | 261 ++++++++++++-------------- web/src/views/SettingsView.vue | 2 +- 4 files changed, 202 insertions(+), 172 deletions(-) diff --git a/web/src/components/InlineLogPanel.vue b/web/src/components/InlineLogPanel.vue index 50383fc..9905f31 100644 --- a/web/src/components/InlineLogPanel.vue +++ b/web/src/components/InlineLogPanel.vue @@ -134,9 +134,9 @@ onUnmounted(() => { diff --git a/web/src/views/ClientView.vue b/web/src/views/ClientView.vue index 34ebddf..f8fe6cc 100644 --- a/web/src/views/ClientView.vue +++ b/web/src/views/ClientView.vue @@ -15,7 +15,8 @@ import { getClient, updateClient, deleteClient, pushConfigToClient, disconnectClient, restartClient, getClientPluginConfig, updateClientPluginConfig, getStorePlugins, installStorePlugin, getRuleSchemas, startClientPlugin, restartClientPlugin, stopClientPlugin, deleteClientPlugin, - checkClientUpdate, applyClientUpdate, getClientSystemStats, type UpdateInfo, type SystemStats + checkClientUpdate, applyClientUpdate, getClientSystemStats, getVersionInfo, + type UpdateInfo, type SystemStats } from '../api' import type { ProxyRule, ClientPlugin, ConfigField, StorePluginInfo, RuleSchemasMap } from '../types' import LogViewer from '../components/LogViewer.vue' @@ -42,6 +43,7 @@ const clientVersion = ref('') // 客户端更新相关 const clientUpdate = ref(null) const updatingClient = ref(false) +const serverVersion = ref('') // 系统状态相关 const systemStats = ref(null) @@ -94,6 +96,61 @@ const getExtraFields = (type: string): ConfigField[] => { return schema?.extra_fields || [] } +// 加载服务端版本 +const loadServerVersion = async () => { + try { + const { data } = await getVersionInfo() + serverVersion.value = data.version || '' + } catch (e) { + console.error('Failed to load server version', e) + } +} + +// 版本比较函数:返回 -1 (v1 < v2), 0 (v1 == v2), 1 (v1 > v2) +const compareVersions = (v1: string, v2: string): number => { + const normalize = (v: string) => v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0) + const parts1 = normalize(v1) + const parts2 = normalize(v2) + const len = Math.max(parts1.length, parts2.length) + for (let i = 0; i < len; i++) { + const p1 = parts1[i] || 0 + const p2 = parts2[i] || 0 + if (p1 < p2) return -1 + if (p1 > p2) return 1 + } + return 0 +} + +// 判断客户端是否需要更新 +// 逻辑:如果客户端最新版>=服务端版本,则目标版本为服务端版本;否则为客户端最新版 +const needsUpdate = (): boolean => { + if (!clientUpdate.value?.latest || !clientVersion.value) return false + const latestClientVer = clientUpdate.value.latest + const currentClientVer = clientVersion.value + const serverVer = serverVersion.value + + // 确定目标版本 + let targetVersion = latestClientVer + if (serverVer && compareVersions(latestClientVer, serverVer) >= 0) { + targetVersion = serverVer + } + + // 比较当前客户端版本和目标版本 + return compareVersions(currentClientVer, targetVersion) < 0 +} + +// 获取目标更新版本 +const getTargetVersion = (): string => { + if (!clientUpdate.value?.latest) return '' + const latestClientVer = clientUpdate.value.latest + const serverVer = serverVersion.value + + if (serverVer && compareVersions(latestClientVer, serverVer) >= 0) { + return serverVer + } + return latestClientVer +} + // Actions const loadClient = async () => { loading.value = true @@ -441,6 +498,7 @@ const pollTimer = ref(null) onMounted(() => { loadRuleSchemas() + loadServerVersion() loadClient() // 启动自动轮询,每 5 秒刷新一次 pollTimer.value = window.setInterval(() => { @@ -557,10 +615,10 @@ const handleDeletePlugin = (plugin: ClientPlugin) => { 客户端版本 {{ clientVersion || '-' }} - - 可更新 + + 可更新 → {{ getTargetVersion() }} - + 最新版本 @@ -853,7 +911,7 @@ const handleDeletePlugin = (plugin: ClientPlugin) => {