From d41fd9347b2ec9a40286a7921f4909ac0b0f4ecc Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期三, 16 九月 2026 15:48:02 +0800
Subject: [PATCH] fix: 修复版本检测逻辑,重构激活页面并更新版本至1.1.6

---
 components/admin/AdminConfigPanel.vue |   23 +++++++
 pages/device-init/index.vue           |  110 ++++++++++++++++++++++--------------
 manifest.json                         |    2 
 pages/home/index.vue                  |   23 +++++++
 4 files changed, 112 insertions(+), 46 deletions(-)

diff --git a/components/admin/AdminConfigPanel.vue b/components/admin/AdminConfigPanel.vue
index 0c71037..db37050 100644
--- a/components/admin/AdminConfigPanel.vue
+++ b/components/admin/AdminConfigPanel.vue
@@ -269,6 +269,27 @@
   return String(version || '').trim().replace(/^[vV]/, '');
 };
 
+const compareVersionNumber = (currentVersion = '', targetVersion = '') => {
+  const currentParts = normalizeVersionNumber(currentVersion).split('.');
+  const targetParts = normalizeVersionNumber(targetVersion).split('.');
+  const maxLength = Math.max(currentParts.length, targetParts.length);
+
+  for (let index = 0; index < maxLength; index += 1) {
+    const currentValue = Number(currentParts[index] || 0);
+    const targetValue = Number(targetParts[index] || 0);
+
+    if (targetValue > currentValue) {
+      return -1;
+    }
+
+    if (targetValue < currentValue) {
+      return 1;
+    }
+  }
+
+  return 0;
+};
+
 const normalizeIpValue = (value = '') => {
   return String(value).trim().replace(/^https?:\/\//, '');
 };
@@ -721,7 +742,7 @@
 
       latestVersionInfo.value = versionData;
       latestVersion.value = versionStr;
-      hasNewVersion.value = Boolean(versionStr && versionStr !== normalizeVersionNumber(currentVersion.value));
+      hasNewVersion.value = Boolean(versionStr && compareVersionNumber(currentVersion.value, versionStr) < 0);
     }
   } catch (error) {
     console.error('获取最新版本失败:', error);
diff --git a/manifest.json b/manifest.json
index a6a7a1e..8232ee7 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2,7 +2,7 @@
     "name" : "访客机终端",
     "appid" : "__UNI__81507A6",
     "description" : "访客机终端静态页面示例",
-    "versionName" : "1.0.0",
+    "versionName" : "1.1.6",
     "versionCode" : "100",
     "transformPx" : false,
     "app-plus" : {
diff --git a/pages/device-init/index.vue b/pages/device-init/index.vue
index ebddf32..eec45d4 100644
--- a/pages/device-init/index.vue
+++ b/pages/device-init/index.vue
@@ -62,6 +62,23 @@
 	formRows[2].value = '';
 };
 
+const restorePreviousServerConfig = (previousServerConfig) => {
+	if (previousServerConfig.ip && previousServerConfig.port) {
+		setRequestServerConfig(previousServerConfig);
+		return;
+	}
+
+	clearRequestServerConfig();
+};
+
+const getErrorMessage = (error, fallbackMessage) => {
+	if (typeof error === 'string' && error) {
+		return error;
+	}
+
+	return error?.msg || error?.message || fallbackMessage;
+};
+
 const goHome = async () => {
 	if (isSubmitting.value) {
 		return;
@@ -104,57 +121,64 @@
 	    return;
 	}
 
-	try {
-		isSubmitting.value = true;
+	isSubmitting.value = true;
 
-		uni.showLoading({
-			title: '激活中...',
-			mask: true,
-		});
+	uni.setStorageSync('device_id', machineId);
+	uni.setStorageSync('device_fingerprint', deviceFingerprint.value);
 
-		// 先写入公共服务地址,后续所有接口统一复用
-		setRequestServerConfig({
-			ip,
-			port,
-		});
+	uni.showLoading({
+		title: '激活中...',
+		mask: true,
+	});
 
-		// 激活接口只关心业务参数,地址由公共请求层统一处理
-		await activateVisitMachine({
-		    machineId,
-		    fingerprint: deviceFingerprint.value,
-		});
+	// 先写入服务地址,后续请求统一走公共请求层。
+	setRequestServerConfig({
+		ip,
+		port,
+	});
 
-		await HardwareAPI.offlineActivateDevice({
-		    code: deviceFingerprint.value,
-		});
+	// 先调平台激活接口,失败时直接提示并回滚地址配置。
+	const activateError = await activateVisitMachine({
+		machineId,
+		fingerprint: deviceFingerprint.value,
+	}).then(() => null).catch((error) => error);
 
-		uni.setStorageSync('device_id', machineId);
-		uni.setStorageSync('device_fingerprint', deviceFingerprint.value);
-		uni.hideLoading();
-
-		setTimeout(() => {
-			uni.redirectTo({
-				url: '/pages/home/index',
-			});
-		}, 300);
-	} catch (error) {
-		console.error('设备激活失败:', error);
-		uni.hideLoading();
-
-		if (previousServerConfig.ip && previousServerConfig.port) {
-			setRequestServerConfig(previousServerConfig);
-		} else {
-			clearRequestServerConfig();
-		}
-
-		uni.showToast({
-			title: error?.msg || '激活失败,请检查网络或服务地址',
-			icon: 'none',
-		});
-	} finally {
+	if (activateError) {
+		console.error('设备联网激活失败:', activateError);
+		restorePreviousServerConfig(previousServerConfig);
 		uni.hideLoading();
 		isSubmitting.value = false;
+		uni.showToast({
+			title: getErrorMessage(activateError, '激活失败,请检查网络或服务地址'),
+			icon: 'none',
+		});
+		return;
 	}
+
+	// 联网激活成功后,再写入本地离线激活信息。
+	const offlineActivateError = await HardwareAPI.offlineActivateDevice({
+		code: deviceFingerprint.value,
+	}).then(() => null).catch((error) => error);
+
+	if (offlineActivateError) {
+		console.error('设备离线激活失败:', offlineActivateError);
+		restorePreviousServerConfig(previousServerConfig);
+		uni.hideLoading();
+		isSubmitting.value = false;
+		uni.showToast({
+			title: getErrorMessage(offlineActivateError, '本地激活失败,请联系工作人员'),
+			icon: 'none',
+		});
+		return;
+	}
+	uni.hideLoading();
+	isSubmitting.value = false;
+
+	setTimeout(() => {
+		uni.redirectTo({
+			url: '/pages/home/index',
+		});
+	}, 300);
 };
 </script>
 
diff --git a/pages/home/index.vue b/pages/home/index.vue
index ca6f45d..79120da 100644
--- a/pages/home/index.vue
+++ b/pages/home/index.vue
@@ -114,6 +114,27 @@
   return String(version || '').trim().replace(/^[vV]/, '');
 };
 
+const compareVersionNumber = (currentVersion = '', targetVersion = '') => {
+  const currentParts = normalizeVersionNumber(currentVersion).split('.');
+  const targetParts = normalizeVersionNumber(targetVersion).split('.');
+  const maxLength = Math.max(currentParts.length, targetParts.length);
+
+  for (let index = 0; index < maxLength; index += 1) {
+    const currentValue = Number(currentParts[index] || 0);
+    const targetValue = Number(targetParts[index] || 0);
+
+    if (targetValue > currentValue) {
+      return -1;
+    }
+
+    if (targetValue < currentValue) {
+      return 1;
+    }
+  }
+
+  return 0;
+};
+
 const getDismissedUpdateVersion = () => {
   return normalizeVersionNumber(uni.getStorageSync(HOME_UPDATE_DIALOG_DISMISSED_VERSION_KEY) || '');
 };
@@ -755,7 +776,7 @@
 
     const versionData = typeof res.data === 'object' ? res.data : {};
     const latestVersion = normalizeVersionNumber(versionData.versionNo || '');
-    const isNewVersion = Boolean(latestVersion && latestVersion !== currentVersion);
+    const isNewVersion = Boolean(latestVersion && compareVersionNumber(currentVersion, latestVersion) < 0);
     if (!isNewVersion) {
       return;
     }

--
Gitblit v1.7.1