فهرست منبع

feat(ui): 支持连接时密码错误自动重试

引入循环机制,在HTTP 401错误时清除缓存并提示用户重新输入密码,提升连接体验。
yangkaixiang 1 ماه پیش
والد
کامیت
40b2cdfced
1فایلهای تغییر یافته به همراه37 افزوده شده و 25 حذف شده
  1. 37 25
      windows/NetworkTool.Client/MainWindow.xaml.cs

+ 37 - 25
windows/NetworkTool.Client/MainWindow.xaml.cs

@@ -261,40 +261,52 @@ public partial class MainWindow : Window
         }
 
         var selectedAdapter = AdapterComboBox.SelectedItem as AdapterInfo;
-        SetBusyState(true, $"正在连接 {device.Lan2Ip}...");
+        var httpPort = device.HttpPort > 0 ? device.HttpPort : 48888;
+        var baseAddress = $"http://{device.Lan2Ip}:{httpPort}";
 
-        try
+        while (true)
         {
-            var httpPort = device.HttpPort > 0 ? device.HttpPort : 48888;
-            var baseAddress = $"http://{device.Lan2Ip}:{httpPort}";
-            var result = await _serverApiService.CheckHealthAsync(baseAddress, password, selectedAdapter?.IPv4Address ?? string.Empty);
-            if (result.Success)
+            SetBusyState(true, $"正在连接 {device.Lan2Ip}...");
+
+            try
             {
-                SavePasswordForDevice(device, password);
-                SetStatus("连接成功。", StatusMessageType.Success, true);
-                OpenDeviceDetailsWindow(baseAddress, selectedAdapter?.IPv4Address ?? string.Empty, password);
+                var result = await _serverApiService.CheckHealthAsync(baseAddress, password, selectedAdapter?.IPv4Address ?? string.Empty);
+                if (result.Success)
+                {
+                    SavePasswordForDevice(device, password);
+                    SetStatus("连接成功。", StatusMessageType.Success, true);
+                    OpenDeviceDetailsWindow(baseAddress, selectedAdapter?.IPv4Address ?? string.Empty, password);
+                    return;
+                }
+
+                if (result.StatusCode == 401)
+                {
+                    _passwordStoreService.ClearPassword(deviceKey);
+                    SetStatus("管理密码错误,请重新输入。", StatusMessageType.Error, true);
+                    SetBusyState(false);
+                    MessageBox.Show(this, "管理密码校验失败,请重新输入管理密码。", "密码错误", MessageBoxButton.OK, MessageBoxImage.Warning);
+                    if (!TryPromptForPassword(device, out password))
+                    {
+                        return;
+                    }
+
+                    continue;
+                }
+
+                SetStatus($"设备已发现,但 HTTP 验证失败:{result.Message}", StatusMessageType.Error, true);
                 return;
             }
-
-            if (result.StatusCode == 401)
+            catch (Exception ex)
             {
-                SetStatus("管理密码错误,请确认密码是否正确。", StatusMessageType.Error, true);
-                MessageBox.Show(this, "管理密码校验失败,请确认密码是否正确。", "密码错误", MessageBoxButton.OK, MessageBoxImage.Warning);
+                SetStatus($"连接失败:{ex.Message}", StatusMessageType.Error, true);
+                MessageBox.Show(this, ex.Message, "连接失败", MessageBoxButton.OK, MessageBoxImage.Error);
                 return;
             }
-
-            SetStatus($"设备已发现,但 HTTP 验证失败:{result.Message}", StatusMessageType.Error, true);
-        }
-        catch (Exception ex)
-        {
-            SetStatus($"连接失败:{ex.Message}", StatusMessageType.Error, true);
-            MessageBox.Show(this, ex.Message, "连接失败", MessageBoxButton.OK, MessageBoxImage.Error);
-        }
-        finally
-        {
-            SetBusyState(false);
+            finally
+            {
+                SetBusyState(false);
+            }
         }
-
     }
 
     private void OpenDeviceDetailsWindow(string baseAddress, string localIPv4, string password)