From 74bc851adafcd5748fc946d415d08d1a53d13093 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 8 Sep 2025 11:13:00 +0800 Subject: [PATCH] =?UTF-8?q?RolesID=20=E6=9B=B4=E6=96=B0=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=20=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RefreshTokenCommandHandler.cs | 11 ++-- .../GetCurrentUserQueryHandler.cs | 24 +++---- .../GetUserById/GetUserByIdQueryHandler.cs | 32 ++++------ .../Identity/IUserRoleRepository.cs | 4 +- .../Identity/UserRoleRepository.cs | 9 ++- src/modify_20250121_getuserroles_roleid.md | 63 +++++++++++++++++++ 6 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 src/modify_20250121_getuserroles_roleid.md diff --git a/src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs b/src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs index cbfb3a3..9a30c36 100644 --- a/src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs +++ b/src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs @@ -97,14 +97,15 @@ public sealed class RefreshTokenCommandHandler : IRequestHandler.CreateFailure("无效的刷新令牌"); } - // 获取用户角色 - var roles = await _userRoleRepository.GetUserRolesAsync(userId, cancellationToken); + // 获取用户角色信息 + var userRoles = await _userRoleRepository.GetUserRolesAsync(userId, cancellationToken); + var roleIds = userRoles.Select(ur => ur.RoleId).ToList(); // 获取所有角色的权限 var permissionCodes = new HashSet(); - if (roles.Any()) + if (roleIds.Any()) { - var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roles, cancellationToken); + var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken); foreach (var rolePermission in allRolePermissions) { if (rolePermission.Permission != null) @@ -133,7 +134,7 @@ public sealed class RefreshTokenCommandHandler : IRequestHandler c.Type == "RealName")?.Value, claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value ?? string.Empty, claims.FirstOrDefault(c => c.Type == ClaimTypes.MobilePhone)?.Value, - roles.ToList().AsReadOnly(), + roleIds.AsReadOnly(), permissionCodes.ToList().AsReadOnly()); _logger.LogInformation("刷新令牌成功"); diff --git a/src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs b/src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs index fbc8cfb..d64d46f 100644 --- a/src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs +++ b/src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs @@ -74,28 +74,18 @@ public sealed class GetCurrentUserQueryHandler : IRequestHandler.CreateFailure("用户不存在"); } - // 获取用户的角色(使用自定义仓储) - var userRoleIds = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken); + // 获取用户的角色信息(使用自定义仓储) + var userRoles = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken); - // 获取角色ID和名称 - var roleIds = new List(); - var roleNames = new List(); - - foreach (var roleId in userRoleIds) - { - var role = await _roleManager.FindByIdAsync(roleId); - if (role != null && !string.IsNullOrEmpty(role.Name)) - { - roleNames.Add(role.Name); - roleIds.Add(role.Id); - } - } + // 提取角色ID和名称 + var roleIds = userRoles.Select(ur => ur.RoleId).ToList(); + var roleNames = userRoles.Select(ur => ur.RoleName).ToList(); // 获取用户的所有权限 var permissions = new List(); - if (userRoleIds.Any()) + if (roleIds.Any()) { - var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(userRoleIds, cancellationToken); + var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken); foreach (var rolePermission in allRolePermissions) { if (rolePermission.Permission != null && !permissions.Contains(rolePermission.Permission.Code)) diff --git a/src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs b/src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs index f496941..f122775 100644 --- a/src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs +++ b/src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs @@ -68,28 +68,18 @@ public sealed class GetUserByIdQueryHandler : IRequestHandler.CreateFailure("用户不存在"); } - // 获取用户的角色(使用自定义仓储) - var userRoleIds = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken); + // 获取用户的角色信息(使用自定义仓储) + var userRoles = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken); - // 获取角色ID和名称 - var roleIds = new List(); - var roleNames = new List(); - - foreach (var roleId in userRoleIds) - { - var role = await _roleManager.FindByIdAsync(roleId); - if (role != null) - { - roleNames.Add(role.Name); - roleIds.Add(role.Id); - } - } + // 提取角色ID和名称 + var roleIds = userRoles.Select(ur => ur.RoleId).ToList(); + var roleNames = userRoles.Select(ur => ur.RoleName).ToList(); // 获取用户的所有权限 var permissions = new List(); - if (userRoleIds.Any()) + if (roleIds.Any()) { - var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(userRoleIds, cancellationToken); + var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken); foreach (var rolePermission in allRolePermissions) { if (rolePermission.Permission != null && !permissions.Contains(rolePermission.Permission.Code)) @@ -101,10 +91,10 @@ public sealed class GetUserByIdQueryHandler : IRequestHandler Task AddUserRolesAsync(IEnumerable userRoles, CancellationToken cancellationToken = default); /// - /// 获取用户的所有角色 + /// 获取用户的所有角色信息(包含ID和名称) /// - Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default); + Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default); /// /// 获取用户的所有角色ID diff --git a/src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs b/src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs index 2f94d10..1718df5 100644 --- a/src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs +++ b/src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs @@ -42,16 +42,19 @@ public class UserRoleRepository : BaseRepository, IUserRoleRepository } /// - /// 获取用户的所有角色 + /// 获取用户的所有角色信息(包含ID和名称) /// - public async Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default) + public async Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default) { var userRoles = await QueryRepository.FindAsync( ur => ur.UserId == userId, include: q => q.Include(ur => ur.Role), cancellationToken: cancellationToken); - return userRoles.Where(ur => ur.Role != null && !string.IsNullOrEmpty(ur.Role.Name)).Select(ur => ur.Role!.Name!).ToList(); + return userRoles + .Where(ur => ur.Role != null && !string.IsNullOrEmpty(ur.Role.Name)) + .Select(ur => UserRoleInfo.Create(ur.RoleId, ur.Role!.Name!)) + .ToList(); } /// diff --git a/src/modify_20250121_getuserroles_roleid.md b/src/modify_20250121_getuserroles_roleid.md new file mode 100644 index 0000000..f68ea37 --- /dev/null +++ b/src/modify_20250121_getuserroles_roleid.md @@ -0,0 +1,63 @@ +# 2025-01-21 修改 GetUserRolesAsync 方法,添加获取角色ID功能 + +## 概述 +修改 `GetUserRolesAsync` 方法,使其返回包含角色ID和名称的完整信息,而不是仅返回角色名称列表。 + +## 主要变更 + +### 1. 修改接口定义 +- **文件**: `X1.Domain/Repositories/Identity/IUserRoleRepository.cs` +- **变更**: 将 `GetUserRolesAsync` 方法的返回类型从 `Task>` 修改为 `Task>` +- **说明**: 现在返回包含角色ID和名称的完整信息对象 + +### 2. 修改实现类 +- **文件**: `X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs` +- **变更**: 更新 `GetUserRolesAsync` 方法实现,返回 `UserRoleInfo` 对象列表 +- **优化**: 使用 `UserRoleInfo.Create()` 方法创建对象,提高代码可读性 + +### 3. 更新调用代码 +- **文件**: `X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs` +- **变更**: 更新角色信息获取逻辑,从 `UserRoleInfo` 对象中提取角色ID和名称 +- **优化**: 简化代码逻辑,减少数据库查询次数 + +- **文件**: `X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs` +- **变更**: 同样更新角色信息获取逻辑 +- **优化**: 保持与 GetUserById 处理器的一致性 + +- **文件**: `X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs` +- **变更**: 更新刷新令牌时的角色信息获取逻辑 +- **优化**: 确保令牌刷新时能正确获取角色ID + +### 4. 修复编译警告 +- **问题**: 修复可能的null引用警告 +- **解决**: 在创建 `UserDto` 对象时添加null检查,使用空字符串作为默认值 + +## 技术优势 + +### 1. 数据完整性 +- **之前**: 只返回角色名称,需要额外查询获取角色ID +- **现在**: 一次查询同时获取角色ID和名称,提高数据完整性 + +### 2. 性能优化 +- **减少查询**: 避免在调用方进行额外的角色查询 +- **批量处理**: 一次性获取所有需要的角色信息 + +### 3. 代码简化 +- **调用方**: 简化了调用方的代码逻辑 +- **维护性**: 提高了代码的可维护性和一致性 + +### 4. 向后兼容 +- **现有方法**: 保留了 `GetUserRoleIdsAsync` 和 `GetUserRoleInfoAsync` 方法 +- **渐进升级**: 可以逐步迁移到新的方法签名 + +## 影响范围 +- **仓储层**: 接口和实现类的修改 +- **应用层**: 三个查询/命令处理器的更新 +- **数据流**: 角色信息获取流程的优化 + +## 修改的文件列表 +1. `X1.Domain/Repositories/Identity/IUserRoleRepository.cs` +2. `X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs` +3. `X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs` +4. `X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs` +5. `X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs`