You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
8.1 KiB

using AuroraDesk.Core.Interfaces;
using AuroraDesk.Core.Entities;
using HeroIconsAvalonia.Enums;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ReactiveUI;
using System;
using System.Collections.ObjectModel;
namespace AuroraDesk.Infrastructure.Services;
/// <summary>
/// 导航服务实现
/// </summary>
public class NavigationService : INavigationService
{
private readonly IPageViewModelFactory _pageViewModelFactory;
private readonly IResourceService? _resourceService;
private readonly ILogger<NavigationService>? _logger;
public NavigationService(
IPageViewModelFactory pageViewModelFactory,
IResourceService? resourceService = null,
ILogger<NavigationService>? logger = null)
{
_pageViewModelFactory = pageViewModelFactory;
_resourceService = resourceService;
_logger = logger;
}
public ObservableCollection<NavigationItem> GetNavigationItems(IScreen screen)
{
var navigationItems = new ObservableCollection<NavigationItem>
{
new NavigationItem
{
Id = "dashboard",
Title = _resourceService?.GetString("NavDashboard") ?? "仪表板",
IconType = IconType.Home,
ViewModel = _pageViewModelFactory.CreatePageViewModel("dashboard", screen)
},
new NavigationItem
{
Id = "users",
Title = _resourceService?.GetString("NavUsers") ?? "用户管理",
IconType = IconType.Users,
Children = new ObservableCollection<NavigationItem>
{
new NavigationItem
{
Id = "users-list",
Title = "用户列表",
IconType = IconType.UserGroup,
ViewModel = _pageViewModelFactory.CreatePageViewModel("users-list", screen)
},
new NavigationItem
{
Id = "users-roles",
Title = "角色管理",
IconType = IconType.ShieldCheck,
ViewModel = _pageViewModelFactory.CreatePageViewModel("users-roles", screen)
},
new NavigationItem
{
Id = "users-permissions",
Title = "权限设置",
IconType = IconType.Key,
ViewModel = _pageViewModelFactory.CreatePageViewModel("users-permissions", screen)
}
}
},
new NavigationItem
{
Id = "settings",
Title = _resourceService?.GetString("NavSettings") ?? "系统设置",
IconType = IconType.Cog6Tooth,
Children = new ObservableCollection<NavigationItem>
{
new NavigationItem
{
Id = "settings-general",
Title = "常规设置",
IconType = IconType.Cog,
ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-general", screen)
},
new NavigationItem
{
Id = "settings-security",
Title = "安全设置",
IconType = IconType.LockClosed,
ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-security", screen)
},
new NavigationItem
{
Id = "settings-backup",
Title = "备份恢复",
IconType = IconType.CloudArrowUp,
ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-backup", screen)
}
}
},
new NavigationItem
{
Id = "reports",
Title = _resourceService?.GetString("NavReports") ?? "报表统计",
IconType = IconType.ChartBar,
ViewModel = _pageViewModelFactory.CreatePageViewModel("reports", screen)
},
new NavigationItem
{
Id = "help",
Title = _resourceService?.GetString("NavHelp") ?? "帮助中心",
IconType = IconType.QuestionMarkCircle,
ViewModel = _pageViewModelFactory.CreatePageViewModel("help", screen)
},
new NavigationItem
{
Id = "dialog-host",
Title = "对话框示例",
IconType = IconType.ChatBubbleLeftRight,
ViewModel = _pageViewModelFactory.CreatePageViewModel("dialog-host", screen)
},
new NavigationItem
{
Id = "icons",
Title = _resourceService?.GetString("NavIcons") ?? "图标库",
IconType = IconType.Sparkles,
ViewModel = _pageViewModelFactory.CreatePageViewModel("icons", screen)
},
new NavigationItem
{
Id = "editor",
Title = "代码编辑器",
IconType = IconType.CodeBracket,
ViewModel = _pageViewModelFactory.CreatePageViewModel("editor", screen)
},
new NavigationItem
{
Id = "image-gallery",
Title = "图片浏览",
IconType = IconType.Photo,
ViewModel = _pageViewModelFactory.CreatePageViewModel("image-gallery", screen)
},
new NavigationItem
{
Id = "udp-tools",
Title = "UDP 工具",
IconType = IconType.Signal,
Children = new ObservableCollection<NavigationItem>
{
new NavigationItem
{
Id = "udp-client",
Title = "UDP 客户端",
IconType = IconType.ArrowRight,
ViewModel = _pageViewModelFactory.CreatePageViewModel("udp-client", screen)
},
new NavigationItem
{
Id = "udp-server",
Title = "UDP 服务端",
IconType = IconType.Server,
ViewModel = _pageViewModelFactory.CreatePageViewModel("udp-server", screen)
}
}
},
new NavigationItem
{
Id = "node-canvas",
Title = "节点编辑器",
IconType = IconType.SquaresPlus,
ViewModel = _pageViewModelFactory.CreatePageViewModel("node-canvas", screen)
}
};
_logger?.LogInformation("导航项已初始化,共 {Count} 项", navigationItems.Count);
return navigationItems;
}
public void NavigateToPage(NavigationItem item)
{
if (item?.ViewModel == null)
{
_logger?.LogWarning("导航项或 ViewModel 为空,无法导航");
return;
}
try
{
// 优化:如果当前 Router 已经显示的是这个 ViewModel,跳过导航避免重复渲染
if (item.ViewModel.HostScreen.Router.CurrentViewModel == item.ViewModel)
{
_logger?.LogDebug("页面已在当前视图,跳过导航: {Title} ({Id})", item.Title, item.Id);
return;
}
// 从 ViewModel 获取 HostScreen 进行导航
item.ViewModel.HostScreen.Router.Navigate.Execute(item.ViewModel);
_logger?.LogInformation("导航到页面: {Title} ({Id})", item.Title, item.Id);
}
catch (Exception ex)
{
_logger?.LogError(ex, "导航到页面失败: {Title}", item.Title);
}
}
}