using LiveChartsCore; using LiveChartsCore.Drawing; using LiveChartsCore.Kernel; using System.Collections.ObjectModel; using System.Windows.Input; using YY.Admin.Core; using YY.Admin.Services.Service.User; namespace YY.Admin.ViewModels { public class StatisticCard { public string Title { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; public string Icon { get; set; } = string.Empty; public string Color { get; set; } = string.Empty; public string Trend { get; set; } = string.Empty; } public class RecentActivity { public string Title { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public DateTime Time { get; set; } public string Icon { get; set; } = string.Empty; } public class DashboardViewModel : BaseViewModel { private readonly ISysUserService _userService; public float[] Values1 { get; set; } = FetchVales(0); public float[] Values2 { get; set; } = FetchVales(-0.15f); public ICommand PointMeasuredCommand { get; } public DashboardViewModel( ISysUserService userService, IContainerExtension _container, IRegionManager regionManager ) : base(_container, regionManager) { // _eventAggregator.GetEvent().Subscribe(ApplyTheme); _userService = userService; PointMeasuredCommand = new DelegateCommand(OnPointMeasured); _ = LoadDashboardDataAsync(); } public ObservableCollection StatisticCards { get; } = new(); public ObservableCollection RecentActivities { get; } = new(); private async Task LoadDashboardDataAsync() { IsLoading = true; try { // 加载统计数据 var users = await _userService.GetUsersAsync(); StatisticCards.Clear(); StatisticCards.Add(new StatisticCard { Title = "总用户数", Value = users.Count.ToString(), Icon = "UserOutlined", Color = "#1890ff", Trend = "+12%" }); StatisticCards.Add(new StatisticCard { Title = "活跃用户", Value = users.Count(u => u.Status== StatusEnum.Enable).ToString(), Icon = "UserCheckOutlined", Color = "#52c41a", Trend = "+8%" }); StatisticCards.Add(new StatisticCard { Title = "今日访问", Value = "1,234", Icon = "EyeOutlined", Color = "#faad14", Trend = "+5%" }); StatisticCards.Add(new StatisticCard { Title = "系统消息", Value = "56", Icon = "MessageOutlined", Color = "#f5222d", Trend = "+2" }); // 加载最近活动 RecentActivities.Clear(); RecentActivities.Add(new RecentActivity { Title = "用户登录", Description = "管理员 admin 登录系统", Time = DateTime.Now.AddMinutes(-5), Icon = "LoginOutlined" }); RecentActivities.Add(new RecentActivity { Title = "数据更新", Description = "用户数据已同步更新", Time = DateTime.Now.AddMinutes(-15), Icon = "SyncOutlined" }); RecentActivities.Add(new RecentActivity { Title = "系统备份", Description = "数据库备份已完成", Time = DateTime.Now.AddHours(-2), Icon = "DatabaseOutlined" }); } finally { IsLoading = false; } } private static float[] FetchVales(float offset) { var values = new List(); // the EasingFunctions.BounceInOut, is just // a function that looks nice! var fx = EasingFunctions.BounceInOut; var x = 0f; while (x <= 1) { values.Add(fx(x + offset)); x += 0.025f; } return [.. values]; } private void OnPointMeasured(ChartPoint point) { // each point will have a different delay depending on its index var index = point.Context.Entity.MetaData!.EntityIndex; // the index of the point in the data source var delay = index / (float)Values1.Length; // the animation takes a function, that represents the normalized progress of the animation // the parameter is the normalized time of the animation, it goes from 0 to 1 // the function must return a value from 0 to 1, where 0 is the initial state // and 1 is the final state var duration = TimeSpan.FromSeconds(3); var animation = new Animation(t => DelayedEase(t, delay), duration); point.Context.Visual?.SetTransition(animation); } private static float DelayedEase(float t, float delay) { if (t <= delay) return 0f; var remappedT = (t - delay) / (1f - delay); var baseEasing = EasingFunctions.BuildCustomElasticOut(1.5f, 0.60f); return baseEasing(Math.Clamp(remappedT, 0f, 1f)); } } }