|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|