Files
2026-10-08 10:43:59 +08:00

96 lines
3.0 KiB
C#

using FreeSql.DataAnnotations;
using F9WebAiTest.Domain.Enums.SYS.RBAC;
using F9WebAiTest.Domain.Events.SYS.RBAC;
namespace F9WebAiTest.Domain.Entities.SYS.RBAC;
/// <summary>资源:权限作用的对象,如菜单项、按钮、报表等。</summary>
[Table(Name = "sys_rbac_menus")]
public class Menu : AggregateRoot
{
[Column(Name = "icon_svg")]
public string IconSvg { get; private set; } // 图标
[Column(Name = "code")]
public string Code { get; private set; } // 唯一标识
[Column(Name = "name")]
public string Name { get; private set; } // 显示名称
[Column(Name = "menu_type")]
public MenuType_Enum MenuType { get; private set; } // 菜单类型:分组/页面
[Column(Name = "assembly_name")]
public string? AssemblyName { get; private set; }
[Column(Name = "type_full_name")]
public string? TypeFullName { get; private set; }
[Column(Name = "parent_id")]
public long ParentId { get; private set; } // 支持菜单层级
[Column(Name = "level")]
public int Level { get; private set; } // 层级
[Column(Name = "is_active")]
public bool IsActive { get; private set; }
[Column(Name = "sort_order")]
public int SortOrder { get; private set; }
[Column(Name = "path")]
public string Path { get; private set; } = ""; // Web 路由路径
[Column(Name = "component")]
public string Component { get; private set; } = ""; // 前端组件路径
[Column(Name = "permission")]
public string Permission { get; private set; } = ""; // 权限标识,如 sys:user:list
public Menu() { }
public Menu(long id, string name, string iconSvg, MenuType_Enum menuType = MenuType_Enum.默认,
string? assemblyName = null, string? typeFullName = null, long parentId = 0, int sortOrder = 0, int parentLevel = 0)
{
Id = id;
Name = name;
IconSvg = iconSvg;
MenuType = menuType;
AssemblyName = assemblyName;
TypeFullName = typeFullName;
ParentId = parentId;
Level = parentId == 0 ? 1 : parentLevel + 1;
IsActive = true;
CreatedAt = DateTime.Now;
SortOrder = sortOrder;
AddDomainEvent(new Menu_ChangedDomainEvent(Id));
}
public void GenerateNewCode() => Code = $"menu.{DateTime.Now.Ticks}";
/// <summary>设置 Web 路由信息(路径/组件/权限码)</summary>
public void SetWebInfo(string path, string component, string permission)
{
Path = path ?? "";
Component = component ?? "";
Permission = permission ?? "";
}
public IReadOnlySet<Permission_Type_Enum> SupportedPermissionType =>
new HashSet<Permission_Type_Enum> { Permission_Type_Enum.Visble };
public void SoftDelete() => AddDomainEvent(new Menu_ChangedDomainEvent(Id));
public void Activate()
{
IsActive = true;
AddDomainEvent(new Menu_ChangedDomainEvent(Id));
}
public void Deactivate()
{
IsActive = false;
AddDomainEvent(new Menu_ChangedDomainEvent(Id));
}
}