refactor: 将 Permission 和 MenuDefinition 改为系统级实体

- Permission 和 MenuDefinition 改为继承 AuditableEntityBase(移除 TenantId)
- 添加 PortalType 枚举区分平台端/租户端
- Repository 使用 IgnoreQueryFilters() 查询系统级数据
- 更新所有相关 Handler 和 DTO,移除 TenantId 引用
- 与 AdminApi 保持一致的设计

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
MSuMshk
2026-02-03 14:49:27 +08:00
parent e88c41c11e
commit 5a26f82628
22 changed files with 108 additions and 110 deletions

View File

@@ -1,12 +1,17 @@
using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Identity.Entities;
/// <summary>
/// 管理端菜单定义。
/// 管理端菜单定义(系统级数据,不按租户隔离)
/// </summary>
public sealed class MenuDefinition : MultiTenantEntityBase
public sealed class MenuDefinition : AuditableEntityBase
{
/// <summary>
/// 门户类型Admin=平台端Tenant=租户端)。
/// </summary>
public PortalType Portal { get; set; }
/// <summary>
/// 父级菜单 ID根节点为 0。
/// </summary>

View File

@@ -1,11 +1,12 @@
using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;
namespace TakeoutSaaS.Domain.Identity.Entities;
/// <summary>
/// 权限定义。
/// 权限定义(系统级数据,不按租户隔离)
/// </summary>
public sealed class Permission : MultiTenantEntityBase
public sealed class Permission : AuditableEntityBase
{
/// <summary>
/// 父级权限 ID根节点为 0。
@@ -36,4 +37,9 @@ public sealed class Permission : MultiTenantEntityBase
/// 描述。
/// </summary>
public string? Description { get; set; }
/// <summary>
/// 门户类型Admin=平台端Tenant=租户端)。
/// </summary>
public PortalType Portal { get; set; }
}

View File

@@ -0,0 +1,17 @@
namespace TakeoutSaaS.Domain.Identity.Enums;
/// <summary>
/// 后台端类型(用于区分平台管理端与租户管理端)。
/// </summary>
public enum PortalType
{
/// <summary>
/// 平台管理端Admin
/// </summary>
Admin = 0,
/// <summary>
/// 租户管理端Tenant
/// </summary>
Tenant = 1
}

View File

@@ -1,4 +1,5 @@
using TakeoutSaaS.Domain.Identity.Entities;
using TakeoutSaaS.Domain.Identity.Enums;
namespace TakeoutSaaS.Domain.Identity.Repositories;
@@ -8,14 +9,14 @@ namespace TakeoutSaaS.Domain.Identity.Repositories;
public interface IMenuRepository
{
/// <summary>
/// 按租户获取菜单列表。
/// 按门户类型获取菜单列表。
/// </summary>
Task<IReadOnlyList<MenuDefinition>> GetByTenantAsync(long tenantId, CancellationToken cancellationToken = default);
Task<IReadOnlyList<MenuDefinition>> GetByPortalAsync(PortalType portal, CancellationToken cancellationToken = default);
/// <summary>
/// 根据 ID 查询菜单。
/// </summary>
Task<MenuDefinition?> FindByIdAsync(long id, long tenantId, CancellationToken cancellationToken = default);
Task<MenuDefinition?> FindByIdAsync(long id, CancellationToken cancellationToken = default);
/// <summary>
/// 新增菜单。
@@ -30,7 +31,7 @@ public interface IMenuRepository
/// <summary>
/// 删除菜单。
/// </summary>
Task DeleteAsync(long id, long tenantId, CancellationToken cancellationToken = default);
Task DeleteAsync(long id, CancellationToken cancellationToken = default);
/// <summary>
/// 持久化变更。