소스 검색

feat(ui): 密码弹窗支持清除已保存密码

允许用户在输入密码时清除旧缓存,解决因密码变更导致的自动填充校验失败问题。
yangkaixiang 1 개월 전
부모
커밋
20797bcaaa

+ 0 - 0
docs/NetTool客户端使用说明文档.docx → docs/NetTool客户端使用说明文档v1.1.docx


+ 17 - 13
windows/NetTool.Client/MainWindow.xaml.cs

@@ -315,19 +315,17 @@ public partial class MainWindow : Window
     {
         var deviceKey = GetDevicePasswordKey(device);
         var savedPassword = _passwordStoreService.LoadPassword(deviceKey);
-        var password = string.Empty;
-        if (!string.IsNullOrWhiteSpace(savedPassword))
+        var passwordConfirmed = TryPromptForPassword(device, savedPassword, out var password, out var clearSavedPasswordRequested);
+
+        if (clearSavedPasswordRequested)
         {
-            password = savedPassword;
+            _passwordStoreService.ClearPassword(deviceKey);
         }
-        else if (!TryPromptForPassword(device, out savedPassword))
+
+        if (!passwordConfirmed)
         {
             return;
         }
-        else
-        {
-            password = savedPassword;
-        }
 
         if (string.IsNullOrWhiteSpace(password))
         {
@@ -348,7 +346,11 @@ public partial class MainWindow : Window
                 var result = await _serverApiService.CheckHealthAsync(baseAddress, password, selectedAdapter?.IPv4Address ?? string.Empty);
                 if (result.Success)
                 {
-                    SavePasswordForDevice(device, password);
+                    if (!clearSavedPasswordRequested)
+                    {
+                        SavePasswordForDevice(device, password);
+                    }
+
                     SetStatus("连接成功。", StatusMessageType.Success, true);
                     OpenDeviceDetailsWindow(baseAddress, selectedAdapter?.IPv4Address ?? string.Empty, password);
                     return;
@@ -360,7 +362,7 @@ public partial class MainWindow : Window
                     SetStatus("管理密码错误,请重新输入。", StatusMessageType.Error, true);
                     SetBusyState(false);
                     MessageBox.Show(this, "管理密码校验失败,请重新输入管理密码。", "密码错误", MessageBoxButton.OK, MessageBoxImage.Warning);
-                    if (!TryPromptForPassword(device, out password))
+                    if (!TryPromptForPassword(device, string.Empty, out password, out _))
                     {
                         return;
                     }
@@ -393,15 +395,17 @@ public partial class MainWindow : Window
         window.ShowDialog();
     }
 
-    private bool TryPromptForPassword(DiscoveredDevice device, out string password)
+    private bool TryPromptForPassword(DiscoveredDevice device, string savedPassword, out string password, out bool clearSavedPasswordRequested)
     {
         var label = string.IsNullOrWhiteSpace(device.Mac) ? device.Lan2Ip : device.Mac;
-        var window = new PasswordPromptWindow(label)
+        var window = new PasswordPromptWindow(label, savedPassword)
         {
             Owner = this,
         };
 
-        if (window.ShowDialog() == true)
+        var dialogResult = window.ShowDialog();
+        clearSavedPasswordRequested = window.ClearSavedPasswordRequested;
+        if (dialogResult == true)
         {
             password = window.Password;
             return true;

+ 1 - 1
windows/NetTool.Client/NetTool.Client.csproj

@@ -8,7 +8,7 @@
     <UseWPF>true</UseWPF>
     <AssemblyName>NetTool.Client</AssemblyName>
     <RootNamespace>NetTool.Client</RootNamespace>
-    <InformationalVersion>2026.05.15.1732</InformationalVersion>
+    <InformationalVersion>2026.05.15.1809</InformationalVersion>
   </PropertyGroup>
 
 </Project>

+ 21 - 7
windows/NetTool.Client/PasswordPromptWindow.xaml

@@ -18,15 +18,29 @@
                    TextWrapping="Wrap" />
 
         <PasswordBox x:Name="PasswordBox"
-                     Grid.Row="1"
-                     Margin="0,16,0,0"
-                     MinHeight="36"
-                     VerticalContentAlignment="Center" />
+                      Grid.Row="1"
+                      Margin="0,16,0,0"
+                      MinHeight="36"
+                      VerticalContentAlignment="Center" />
+
+        <Button x:Name="ClearPasswordButton"
+                Grid.Row="2"
+                Margin="0,20,0,0"
+                Padding="0"
+                HorizontalAlignment="Left"
+                VerticalAlignment="Center"
+                Background="Transparent"
+                BorderThickness="0"
+                Click="ClearPasswordButton_OnClick"
+                Content="清除已保存密码"
+                Cursor="Hand"
+                FontSize="12"
+                Foreground="#6B7280" />
 
         <StackPanel Grid.Row="2"
-                    Margin="0,20,0,0"
-                    HorizontalAlignment="Right"
-                    Orientation="Horizontal">
+                     Margin="0,20,0,0"
+                     HorizontalAlignment="Right"
+                     Orientation="Horizontal">
             <Button MinWidth="78"
                     Height="36"
                     Click="CancelButton_OnClick"

+ 13 - 1
windows/NetTool.Client/PasswordPromptWindow.xaml.cs

@@ -4,15 +4,19 @@ namespace NetTool.Client;
 
 public partial class PasswordPromptWindow : Window
 {
-    public PasswordPromptWindow(string deviceLabel)
+    public PasswordPromptWindow(string deviceLabel, string savedPassword)
     {
         InitializeComponent();
         PromptTextBlock.Text = $"请输入设备 {deviceLabel} 的管理密码。";
+        PasswordBox.Password = savedPassword;
+        ClearPasswordButton.Visibility = string.IsNullOrWhiteSpace(savedPassword) ? Visibility.Collapsed : Visibility.Visible;
         Loaded += (_, _) => PasswordBox.Focus();
     }
 
     public string Password => PasswordBox.Password;
 
+    public bool ClearSavedPasswordRequested { get; private set; }
+
     private void OkButton_OnClick(object sender, RoutedEventArgs e)
     {
         if (string.IsNullOrWhiteSpace(PasswordBox.Password))
@@ -29,4 +33,12 @@ public partial class PasswordPromptWindow : Window
     {
         DialogResult = false;
     }
+
+    private void ClearPasswordButton_OnClick(object sender, RoutedEventArgs e)
+    {
+        ClearSavedPasswordRequested = true;
+        PasswordBox.Clear();
+        ClearPasswordButton.Visibility = Visibility.Collapsed;
+        PasswordBox.Focus();
+    }
 }