@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 - 仪表盘
仪表盘
快速操作
导入账号
创建频道
批量邀请
同步频道/群组数据
系统状态
在线账号: @_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);
}