using System.Web; using NUglify.Helpers; using SqlSugar; using Volo.Abp; using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; using Yi.Framework.Core.Data; using Yi.Framework.Core.Helper; using Yi.Framework.Rbac.Domain.Shared.Dtos; using Yi.Framework.Rbac.Domain.Shared.Enums; namespace Yi.Framework.Rbac.Domain.Entities { /// /// 菜单表 /// [SugarTable("Menu")] public partial class MenuAggregateRoot : AggregateRoot, ISoftDelete, IAuditedObject, IOrderNum, IState { public MenuAggregateRoot() { } public MenuAggregateRoot(Guid id) { Id = id; ParentId = Guid.Empty; } public MenuAggregateRoot(Guid id, Guid parentId) { Id = id; ParentId = parentId; } /// /// 主键 /// [SugarColumn(IsPrimaryKey = true)] public override Guid Id { get; protected set; } /// /// 逻辑删除 /// public bool IsDeleted { get; set; } /// /// 创建时间 /// public DateTime CreationTime { get; set; } = DateTime.Now; /// /// 创建者 /// public Guid? CreatorId { get; set; } /// /// 最后修改者 /// public Guid? LastModifierId { get; set; } /// /// 最后修改时间 /// public DateTime? LastModificationTime { get; set; } /// /// 排序 /// public int OrderNum { get; set; } = 0; /// /// 状态 /// public bool State { get; set; } /// /// 菜单名 /// public string MenuName { get; set; } /// /// 路由名称 /// public string? RouterName { get; set; } /// /// /// [SugarColumn(ColumnName = "MenuType")] public MenuTypeEnum MenuType { get; set; } = MenuTypeEnum.Menu; /// /// /// [SugarColumn(ColumnName = "PermissionCode")] public string? PermissionCode { get; set; } /// /// /// [SugarColumn(ColumnName = "ParentId")] public Guid ParentId { get; set; } /// /// 菜单图标 /// [SugarColumn(ColumnName = "MenuIcon")] public string? MenuIcon { get; set; } /// /// 菜单组件路由 /// [SugarColumn(ColumnName = "Router")] public string? Router { get; set; } /// /// 是否为外部链接 /// [SugarColumn(ColumnName = "IsLink")] public bool IsLink { get; set; } /// /// 是否缓存 /// [SugarColumn(ColumnName = "IsCache")] public bool IsCache { get; set; } /// /// 是否显示 /// [SugarColumn(ColumnName = "IsShow")] public bool IsShow { get; set; } = true; /// /// 描述 /// [SugarColumn(ColumnName = "Remark")] public string? Remark { get; set; } /// /// 组件路径 /// [SugarColumn(ColumnName = "Component")] public string? Component { get; set; } /// /// 菜单来源 /// public MenuSourceEnum MenuSource { get; set; } = MenuSourceEnum.Ruoyi; /// /// 路由参数 /// [SugarColumn(ColumnName = "Query")] public string? Query { get; set; } [SugarColumn(IsIgnore = true)] public List? Children { get; set; } } /// /// 实体扩展 /// public static class MenuEntityExtensions { /// /// 构建vue3路由 /// /// /// public static List Vue3RuoYiRouterBuild(this List menus,MenuSourceEnum menuSource) { menus = menus .Where(m => m.State == true) .Where(m => m.MenuType != MenuTypeEnum.Component) .Where(m => m.MenuSource == menuSource) .ToList(); List routers = new(); foreach (var m in menus) { var r = new Vue3RouterDto(); r.OrderNum = m.OrderNum; var routerName = m.Router?.Split("/").LastOrDefault(); r.Id = m.Id; r.ParentId = m.ParentId; //开头大写 r.Name = routerName?.First().ToString().ToUpper() + routerName?.Substring(1); r.Path = m.Router!; r.Hidden = !m.IsShow; if (m.MenuType == MenuTypeEnum.Catalogue) { r.Redirect = "noRedirect"; r.AlwaysShow = true; //判断是否为最顶层的路由 if (Guid.Empty == m.ParentId) { r.Component = "Layout"; } else { r.Component = "ParentView"; } } if (m.MenuType == MenuTypeEnum.Menu) { r.Redirect = "noRedirect"; r.AlwaysShow = true; r.Component = m.Component!; r.AlwaysShow = false; } r.Meta = new Meta { Title = m.MenuName!, Icon = m.MenuIcon!, NoCache = !m.IsCache }; if (m.IsLink) { r.Meta.link = m.Router!; r.AlwaysShow = false; } routers.Add(r); } return TreeHelper.SetTree(routers); } /// /// 构建vue3 pure路由 /// /// /// public static List Vue3PureRouterBuild(this List menus) { //pure的菜单为树形 var allRouters = menus .Where(m => m.State == true) .Where(m => m.MenuType != MenuTypeEnum.Component) .Where(m => m.MenuSource == MenuSourceEnum.Pure) .Select(m => new Vue3PureRouterDto { Path =m.Router.StartsWith("/")?m.Router:"/"+m.Router, Name =m.IsLink==true?"Link": m.RouterName, component = m.Component, Meta = new MetaPureRouterDto() { showLink = m.IsShow, FrameSrc = m.IsLink == true ? m.Router : null, Auths = new List() { m.PermissionCode }, Icon = m.MenuIcon, Title = m.MenuName, }, Children =null, Id = m.Id, ParentId = m.ParentId }) .ToList(); var routerDic = allRouters.GroupBy(x => x.ParentId).ToDictionary(x => x.Key,y=>y.ToList()); //根路由 if (!routerDic.TryGetValue(Guid.Empty, out var rootRouters)) { return new List(); } Stack stack = new Stack(rootRouters); while (stack.Count > 0) { var currentRouter = stack.Pop(); if (routerDic.TryGetValue(currentRouter.Id, out var items)) { currentRouter.Children = items; items?.ForEach(x => stack.Push(x)); } } return rootRouters; } } }