using FreeSql.DataAnnotations; using F9WebAiTest.Domain.Enums.SYS.RBAC; using F9WebAiTest.Domain.Events.SYS.RBAC; namespace F9WebAiTest.Domain.Entities.SYS.RBAC; /// 资源:权限作用的对象,如菜单项、按钮、报表等。 [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}"; /// 设置 Web 路由信息(路径/组件/权限码) public void SetWebInfo(string path, string component, string permission) { Path = path ?? ""; Component = component ?? ""; Permission = permission ?? ""; } public IReadOnlySet SupportedPermissionType => new HashSet { 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)); } }