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