From a0e0848af7559702d984cc0ad186495a91c2ed70 Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Fri, 6 Feb 2026 13:03:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20profile=20=E8=BF=94=E5=9B=9E=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=A5=97=E9=A4=90=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在认证档案中增加 packageName 字段,并基于租户当前有效订阅从套餐表读取名称返回给前端,便于头像下拉直接展示真实套餐信息。 --- .../Controllers/AuthController.cs | 1 + .../Identity/Contracts/CurrentUserProfile.cs | 5 +++ .../Identity/Services/AdminAuthService.cs | 38 +++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs index 223e8d7..7560b56 100644 --- a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs +++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs @@ -68,6 +68,7 @@ public sealed class AuthController(IAdminAuthService authService) : BaseApiContr /// "account": "admin", /// "displayName": "租户管理员", /// "tenantId": "100000000000000001", + /// "packageName": "标准版", /// "roles": ["tenant-admin"], /// "permissions": ["identity:profile:read", "merchant:read"] /// } diff --git a/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs b/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs index 995efe2..c3d141f 100644 --- a/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs +++ b/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs @@ -44,4 +44,9 @@ public sealed class CurrentUserProfile /// 头像地址(可选)。 /// public string? Avatar { get; init; } + + /// + /// 当前订阅套餐名称(可选)。 + /// + public string? PackageName { get; init; } } diff --git a/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs b/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs index b803c4f..3ed508a 100644 --- a/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs +++ b/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs @@ -4,6 +4,7 @@ using TakeoutSaaS.Application.Identity.Contracts; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Enums; using TakeoutSaaS.Domain.Identity.Repositories; +using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; using TakeoutSaaS.Shared.Abstractions.Results; @@ -21,6 +22,8 @@ public sealed class AdminAuthService( IPermissionRepository permissionRepository, IRolePermissionRepository rolePermissionRepository, IMenuRepository menuRepository, + ITenantRepository tenantRepository, + ITenantPackageRepository tenantPackageRepository, IPasswordHasher passwordHasher, IJwtTokenService jwtTokenService, IRefreshTokenStore refreshTokenStore, @@ -229,12 +232,20 @@ public sealed class AdminAuthService( private async Task BuildProfileAsync(IdentityUser user, CancellationToken cancellationToken) { + // 1. 读取用户角色 var tenantId = user.TenantId; var roles = await ResolveUserRolesAsync(tenantId, user.Id, cancellationToken); - // 1. 强制仅允许租户管理员登录(不支持超级管理员) + + // 2. 强制仅允许租户管理员登录(不支持超级管理员) EnsureTenantAdmin(tenantId, roles); - // 2. 加载权限并返回档案 + + // 3. 加载权限 var permissions = await ResolveUserPermissionsAsync(tenantId, user.Id, cancellationToken); + + // 4. 读取当前套餐名称(严格以数据库为准) + var packageName = await ResolveTenantPackageNameAsync(tenantId, cancellationToken); + + // 5. 返回用户档案 return new CurrentUserProfile { UserId = user.Id, @@ -244,10 +255,31 @@ public sealed class AdminAuthService( MerchantId = user.MerchantId, Roles = roles, Permissions = permissions, - Avatar = user.Avatar + Avatar = user.Avatar, + PackageName = packageName }; } + private async Task ResolveTenantPackageNameAsync(long tenantId, CancellationToken cancellationToken) + { + // 1. 查询当前有效订阅 + var subscription = await tenantRepository.GetActiveSubscriptionAsync(tenantId, cancellationToken); + if (subscription == null) + { + return null; + } + + // 2. 查询订阅关联套餐 + var package = await tenantPackageRepository.FindByIdAsync(subscription.TenantPackageId, cancellationToken); + if (package == null) + { + return null; + } + + // 3. 返回套餐名称 + return package.Name; + } + private void EnsureTenantMatched(long userTenantId) { // 1. 读取当前租户