diff --git a/src/TelegramPanel.Web/Components/Pages/Accounts.razor b/src/TelegramPanel.Web/Components/Pages/Accounts.razor
index b025061..dea5602 100644
--- a/src/TelegramPanel.Web/Components/Pages/Accounts.razor
+++ b/src/TelegramPanel.Web/Components/Pages/Accounts.razor
@@ -28,6 +28,18 @@
+
+ 全选
+
+
+ 反选
+
+
+ 删除已选
+
批量刷新状态
@@ -263,6 +275,62 @@
}
}
+ private Task SelectAllFiltered()
+ {
+ selectedAccounts = filteredAccounts.ToHashSet();
+ return Task.CompletedTask;
+ }
+
+ private Task InvertSelection()
+ {
+ var targets = filteredAccounts.ToList();
+ foreach (var a in targets)
+ {
+ if (selectedAccounts.Contains(a))
+ selectedAccounts.Remove(a);
+ else
+ selectedAccounts.Add(a);
+ }
+ return Task.CompletedTask;
+ }
+
+ private async Task DeleteSelectedAccounts()
+ {
+ var targets = selectedAccounts.ToList();
+ if (targets.Count == 0)
+ {
+ Snackbar.Add("未选择任何账号", Severity.Info);
+ return;
+ }
+
+ bool? result = await DialogService.ShowMessageBox(
+ "确认删除",
+ $"确定要删除已选账号({targets.Count} 个)吗?将同时清理 sessions 文件,且不可恢复。",
+ yesText: "删除", cancelText: "取消");
+
+ if (result != true)
+ return;
+
+ loading = true;
+ try
+ {
+ foreach (var a in targets)
+ await AccountManagement.DeleteAccountAsync(a.Id);
+
+ selectedAccounts.Clear();
+ await LoadAccounts();
+ Snackbar.Add("删除完成", Severity.Success);
+ }
+ catch (Exception ex)
+ {
+ Snackbar.Add($"删除失败:{ex.Message}", Severity.Error);
+ }
+ finally
+ {
+ loading = false;
+ }
+ }
+
private void ExportSelectedAccounts()
{
var ids = selectedAccounts.Select(a => a.Id).Distinct().ToList();