diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs
index 4bc572b..223e8d7 100644
--- a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs
+++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs
@@ -2,15 +2,17 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using TakeoutSaaS.Application.Identity.Abstractions;
using TakeoutSaaS.Application.Identity.Contracts;
+using TakeoutSaaS.Shared.Abstractions.Constants;
using TakeoutSaaS.Shared.Abstractions.Results;
using TakeoutSaaS.Shared.Web.Api;
+using TakeoutSaaS.Shared.Web.Security;
namespace TakeoutSaaS.TenantApi.Controllers;
///
/// 租户管理端登录认证。
///
-/// 仅允许租户管理员登录获取 Token。
+/// 提供登录、刷新 Token、获取用户信息及菜单等能力。
[ApiVersion("1.0")]
[Authorize]
[Route("api/tenant/v{version:apiVersion}/auth")]
@@ -51,4 +53,87 @@ public sealed class AuthController(IAdminAuthService authService) : BaseApiContr
// 2. 返回新的令牌
return ApiResponse.Ok(response);
}
+
+ ///
+ /// 获取当前用户信息。
+ ///
+ ///
+ /// 示例响应:
+ ///
+ /// {
+ /// "success": true,
+ /// "code": 200,
+ /// "data": {
+ /// "userId": "900123456789012345",
+ /// "account": "admin",
+ /// "displayName": "租户管理员",
+ /// "tenantId": "100000000000000001",
+ /// "roles": ["tenant-admin"],
+ /// "permissions": ["identity:profile:read", "merchant:read"]
+ /// }
+ /// }
+ ///
+ ///
+ /// 取消标记。
+ /// 当前用户档案信息。
+ [HttpGet("profile")]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
+ public async Task> GetProfile(CancellationToken cancellationToken)
+ {
+ // 1. 从 JWT 中获取当前用户标识
+ var userId = User.GetUserId();
+ if (userId == 0)
+ {
+ return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识");
+ }
+
+ // 2. 读取用户档案并返回
+ var profile = await authService.GetProfileAsync(userId, cancellationToken);
+ return ApiResponse.Ok(profile);
+ }
+
+ ///
+ /// 获取当前用户的权限码列表。
+ ///
+ /// 取消标记。
+ /// 权限码数组。
+ [HttpGet("permissions")]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
+ public async Task> GetPermissions(CancellationToken cancellationToken)
+ {
+ // 1. 从 JWT 中获取当前用户标识
+ var userId = User.GetUserId();
+ if (userId == 0)
+ {
+ return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识");
+ }
+
+ // 2. 读取用户档案获取权限
+ var profile = await authService.GetProfileAsync(userId, cancellationToken);
+ return ApiResponse.Ok(profile.Permissions);
+ }
+
+ ///
+ /// 获取当前用户的菜单树(按权限过滤)。
+ ///
+ /// 取消标记。
+ /// 当前用户可见的菜单树。
+ [HttpGet("menu")]
+ [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status401Unauthorized)]
+ public async Task>> GetMenuTree(CancellationToken cancellationToken)
+ {
+ // 1. 获取当前用户标识
+ var userId = User.GetUserId();
+ if (userId == 0)
+ {
+ return ApiResponse>.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识");
+ }
+
+ // 2. 生成菜单树
+ var menu = await authService.GetMenuTreeAsync(userId, cancellationToken);
+ return ApiResponse>.Ok(menu);
+ }
}
diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs
deleted file mode 100644
index dc06827..0000000
--- a/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.Identity.Abstractions;
-using TakeoutSaaS.Application.Identity.Contracts;
-using TakeoutSaaS.Shared.Abstractions.Constants;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-using TakeoutSaaS.Shared.Web.Security;
-
-namespace TakeoutSaaS.TenantApi.Controllers;
-
-///
-/// 当前租户管理员信息。
-///
-[ApiVersion("1.0")]
-[Authorize(Roles = "tenant-admin")]
-[Route("api/tenant/v{version:apiVersion}/me")]
-public sealed class MeController(IAdminAuthService authService) : BaseApiController
-{
- ///
- /// 获取当前用户档案。
- ///
- /// 取消标记。
- /// 当前用户档案信息。
- [HttpGet]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
- public async Task> Get(CancellationToken cancellationToken)
- {
- // 1. 从 JWT 中解析用户标识
- var userId = User.GetUserId();
- if (userId == 0)
- {
- return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识");
- }
-
- // 2. 查询用户档案并返回
- var profile = await authService.GetProfileAsync(userId, cancellationToken);
- return ApiResponse.Ok(profile);
- }
-}