@page "/" @inject AccountManagementService AccountManagement @inject ChannelManagementService ChannelManagement @inject GroupManagementService GroupManagement @inject BatchTaskManagementService BatchTaskManagement @inject IChannelService ChannelService @inject IGroupService GroupService @inject TelegramPanel.Web.Services.DataSyncService DataSync @inject ISnackbar Snackbar Telegram Panel - 仪表盘 仪表盘
账号总数 @_accountCount
频道总数 @_channelCount
群组总数 @_groupCount
活跃任务 @_activeTaskCount
快速操作 导入账号 创建频道 批量邀请 同步频道/群组数据 系统状态 在线账号: @_onlineAccountCount 受限账号: @_limitedAccountCount 封禁账号: @_bannedAccountCount 最近任务 任务名称 类型 状态 进度 创建时间 @context.Name @context.Type @context.Status @context.CreatedAt.ToString("MM-dd HH:mm") 暂无任务记录 @code { private int _accountCount = 0; private int _channelCount = 0; private int _groupCount = 0; private int _activeTaskCount = 0; private int _onlineAccountCount = 0; private int _limitedAccountCount = 0; private int _bannedAccountCount = 0; private List _recentTasks = new(); private bool _syncing = false; protected override async Task OnInitializedAsync() { await LoadDashboardAsync(); } private async Task LoadDashboardAsync() { var accounts = (await AccountManagement.GetAllAccountsAsync()).ToList(); var activeAccounts = (await AccountManagement.GetActiveAccountsAsync()).ToList(); _accountCount = accounts.Count; _onlineAccountCount = activeAccounts.Count; _limitedAccountCount = 0; _bannedAccountCount = 0; _channelCount = await ChannelManagement.GetTotalChannelCountAsync(); _groupCount = await GroupManagement.GetTotalGroupCountAsync(); var runningTasks = (await BatchTaskManagement.GetRunningTasksAsync()).ToList(); _activeTaskCount = runningTasks.Count; var recent = (await BatchTaskManagement.GetRecentTasksAsync(10)).ToList(); _recentTasks = recent .OrderByDescending(t => t.CreatedAt) .Select(t => new TaskItem( Name: $"{t.TaskType} #{t.Id}", Type: t.TaskType, Status: MapTaskStatus(t.Status), Progress: Math.Min(t.Completed + t.Failed, t.Total), Total: t.Total, CreatedAt: t.CreatedAt )) .ToList(); } private async Task SyncAllAccounts() { if (_syncing) { Snackbar.Add("正在同步中,请稍候...", Severity.Warning); return; } _syncing = true; Snackbar.Add("开始同步频道和群组信息...", Severity.Info); try { var summary = await DataSync.SyncAllActiveAccountsAsync(CancellationToken.None); foreach (var failure in summary.AccountFailures) Snackbar.Add($"账号 {failure.Phone} 同步失败:{failure.Error}", Severity.Warning); Snackbar.Add($"同步完成:{summary.TotalChannelsSynced} 个频道,{summary.TotalGroupsSynced} 个群组", summary.AccountFailures.Count == 0 ? Severity.Success : Severity.Warning); await LoadDashboardAsync(); StateHasChanged(); } catch (Exception ex) { Snackbar.Add($"同步失败:{ex.Message}", Severity.Error); } finally { _syncing = false; } } private Color GetStatusColor(string status) => status switch { "运行中" => Color.Info, "已完成" => Color.Success, "失败" => Color.Error, _ => Color.Default }; private static string MapTaskStatus(string status) => status switch { "running" => "运行中", "completed" => "已完成", "failed" => "失败", "pending" => "等待中", _ => status }; private record TaskItem(string Name, string Type, string Status, int Progress, int Total, DateTime CreatedAt); }