diff --git a/server/HoneyBox/src/HoneyBox.Admin/Controllers/AdminUserController.cs b/server/HoneyBox/src/HoneyBox.Admin/Controllers/AdminUserController.cs index 1cf18b9c..38af883f 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Controllers/AdminUserController.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Controllers/AdminUserController.cs @@ -84,6 +84,18 @@ public class AdminUserController : ControllerBase return ApiResponse.Success("删除成功"); } + /// + /// 获取管理员已分配的角色ID列表 + /// + /// 管理员ID + /// 角色ID列表 + [HttpGet("{id:long}/roles")] + public async Task>> GetRoles(long id) + { + var result = await _adminUserService.GetRoleIdsAsync(id); + return ApiResponse>.Success(result); + } + /// /// 分配角色给管理员 /// @@ -96,6 +108,18 @@ public class AdminUserController : ControllerBase return ApiResponse.Success("分配成功"); } + /// + /// 获取管理员已分配的专属菜单ID列表 + /// + /// 管理员ID + /// 菜单ID列表 + [HttpGet("{id:long}/menus")] + public async Task>> GetMenus(long id) + { + var result = await _adminUserService.GetMenuIdsAsync(id); + return ApiResponse>.Success(result); + } + /// /// 分配用户专属菜单 /// diff --git a/server/HoneyBox/src/HoneyBox.Admin/Controllers/RoleController.cs b/server/HoneyBox/src/HoneyBox.Admin/Controllers/RoleController.cs index 91203eb3..e40f4709 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Controllers/RoleController.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Controllers/RoleController.cs @@ -93,6 +93,18 @@ public class RoleController : ControllerBase return ApiResponse.Success("删除成功"); } + /// + /// 获取角色已分配的菜单ID列表 + /// + /// 角色ID + /// 菜单ID列表 + [HttpGet("{id:long}/menus")] + public async Task>> GetMenus(long id) + { + var result = await _roleService.GetMenuIdsAsync(id); + return ApiResponse>.Success(result); + } + /// /// 分配菜单给角色 /// @@ -105,6 +117,18 @@ public class RoleController : ControllerBase return ApiResponse.Success("分配成功"); } + /// + /// 获取角色已分配的权限编码列表 + /// + /// 角色ID + /// 权限编码列表 + [HttpGet("{id:long}/permissions")] + public async Task>> GetPermissions(long id) + { + var result = await _roleService.GetPermissionCodesAsync(id); + return ApiResponse>.Success(result); + } + /// /// 分配权限给角色 /// @@ -113,7 +137,7 @@ public class RoleController : ControllerBase [HttpPut("{id:long}/permissions")] public async Task AssignPermissions(long id, [FromBody] AssignPermissionsRequest request) { - await _roleService.AssignPermissionsAsync(id, request.PermissionIds); + await _roleService.AssignPermissionsAsync(id, request.PermissionCodes); return ApiResponse.Success("分配成功"); } } diff --git a/server/HoneyBox/src/HoneyBox.Admin/Models/Role/AssignPermissionsRequest.cs b/server/HoneyBox/src/HoneyBox.Admin/Models/Role/AssignPermissionsRequest.cs index fd4fb518..100ec61f 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Models/Role/AssignPermissionsRequest.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Models/Role/AssignPermissionsRequest.cs @@ -8,7 +8,7 @@ namespace HoneyBox.Admin.Models.Role; public class AssignPermissionsRequest { /// - /// 权限ID列表 + /// 权限编码列表 /// - public List PermissionIds { get; set; } = new(); + public List PermissionCodes { get; set; } = new(); } diff --git a/server/HoneyBox/src/HoneyBox.Admin/Services/AdminUserService.cs b/server/HoneyBox/src/HoneyBox.Admin/Services/AdminUserService.cs index 01072b1b..4a8d87b1 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Services/AdminUserService.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Services/AdminUserService.cs @@ -266,6 +266,21 @@ public class AdminUserService : IAdminUserService _logger.LogInformation("删除管理员成功: {UserId} - {Username}", id, user.Username); } + /// + public async Task> GetRoleIdsAsync(long userId) + { + var user = await _dbContext.AdminUsers.FindAsync(userId); + if (user == null) + { + throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在"); + } + + return await _dbContext.AdminUserRoles + .Where(ur => ur.AdminUserId == userId) + .Select(ur => ur.RoleId) + .ToListAsync(); + } + /// public async Task AssignRolesAsync(long userId, List roleIds) { @@ -294,6 +309,21 @@ public class AdminUserService : IAdminUserService _logger.LogInformation("管理员 {UserId} 分配角色成功,角色数量: {Count}", userId, roleIds.Count); } + /// + public async Task> GetMenuIdsAsync(long userId) + { + var user = await _dbContext.AdminUsers.FindAsync(userId); + if (user == null) + { + throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在"); + } + + return await _dbContext.AdminUserMenus + .Where(um => um.AdminUserId == userId) + .Select(um => um.MenuId) + .ToListAsync(); + } + /// public async Task AssignMenusAsync(long userId, List menuIds) { diff --git a/server/HoneyBox/src/HoneyBox.Admin/Services/IAdminUserService.cs b/server/HoneyBox/src/HoneyBox.Admin/Services/IAdminUserService.cs index 23203558..35891178 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Services/IAdminUserService.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Services/IAdminUserService.cs @@ -43,6 +43,13 @@ public interface IAdminUserService /// 管理员ID Task DeleteAsync(long id); + /// + /// 获取管理员已分配的角色ID列表 + /// + /// 管理员ID + /// 角色ID列表 + Task> GetRoleIdsAsync(long userId); + /// /// 分配角色给管理员 /// @@ -50,6 +57,13 @@ public interface IAdminUserService /// 角色ID列表 Task AssignRolesAsync(long userId, List roleIds); + /// + /// 获取管理员已分配的专属菜单ID列表 + /// + /// 管理员ID + /// 菜单ID列表 + Task> GetMenuIdsAsync(long userId); + /// /// 分配用户专属菜单 /// diff --git a/server/HoneyBox/src/HoneyBox.Admin/Services/IRoleService.cs b/server/HoneyBox/src/HoneyBox.Admin/Services/IRoleService.cs index 7e443aa4..57bd502f 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Services/IRoleService.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Services/IRoleService.cs @@ -42,6 +42,13 @@ public interface IRoleService /// 角色ID Task DeleteAsync(long id); + /// + /// 获取角色已分配的菜单ID列表 + /// + /// 角色ID + /// 菜单ID列表 + Task> GetMenuIdsAsync(long roleId); + /// /// 分配菜单给角色 /// @@ -49,12 +56,19 @@ public interface IRoleService /// 菜单ID列表 Task AssignMenusAsync(long roleId, List menuIds); + /// + /// 获取角色已分配的权限编码列表 + /// + /// 角色ID + /// 权限编码列表 + Task> GetPermissionCodesAsync(long roleId); + /// /// 分配权限给角色 /// /// 角色ID - /// 权限ID列表 - Task AssignPermissionsAsync(long roleId, List permissionIds); + /// 权限编码列表 + Task AssignPermissionsAsync(long roleId, List permissionCodes); /// /// 获取所有角色(下拉选择用) diff --git a/server/HoneyBox/src/HoneyBox.Admin/Services/RoleService.cs b/server/HoneyBox/src/HoneyBox.Admin/Services/RoleService.cs index 5a92efa7..d7691691 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/Services/RoleService.cs +++ b/server/HoneyBox/src/HoneyBox.Admin/Services/RoleService.cs @@ -190,6 +190,21 @@ public class RoleService : IRoleService _logger.LogInformation("删除角色成功: {RoleId} - {RoleName}", id, role.Name); } + /// + public async Task> GetMenuIdsAsync(long roleId) + { + var role = await _dbContext.Roles.FindAsync(roleId); + if (role == null) + { + throw new AdminException(AdminErrorCodes.RoleNotFound, "角色不存在"); + } + + return await _dbContext.RoleMenus + .Where(rm => rm.RoleId == roleId) + .Select(rm => rm.MenuId) + .ToListAsync(); + } + /// public async Task AssignMenusAsync(long roleId, List menuIds) { @@ -219,7 +234,22 @@ public class RoleService : IRoleService } /// - public async Task AssignPermissionsAsync(long roleId, List permissionIds) + public async Task> GetPermissionCodesAsync(long roleId) + { + var role = await _dbContext.Roles.FindAsync(roleId); + if (role == null) + { + throw new AdminException(AdminErrorCodes.RoleNotFound, "角色不存在"); + } + + return await _dbContext.RolePermissions + .Where(rp => rp.RoleId == roleId) + .Join(_dbContext.Permissions, rp => rp.PermissionId, p => p.Id, (rp, p) => p.Code) + .ToListAsync(); + } + + /// + public async Task AssignPermissionsAsync(long roleId, List permissionCodes) { var role = await _dbContext.Roles.FindAsync(roleId); if (role == null) @@ -232,18 +262,23 @@ public class RoleService : IRoleService _dbContext.RolePermissions.RemoveRange(existingPermissions); // 添加新关联 - if (permissionIds.Any()) + if (permissionCodes.Any()) { - var newPermissions = permissionIds.Distinct().Select(permissionId => new RolePermission + // 根据权限编码获取权限ID + var permissions = await _dbContext.Permissions + .Where(p => permissionCodes.Contains(p.Code)) + .ToListAsync(); + + var newPermissions = permissions.Select(p => new RolePermission { RoleId = roleId, - PermissionId = permissionId + PermissionId = p.Id }); _dbContext.RolePermissions.AddRange(newPermissions); } await _dbContext.SaveChangesAsync(); - _logger.LogInformation("角色 {RoleId} 分配权限成功,权限数量: {Count}", roleId, permissionIds.Count); + _logger.LogInformation("角色 {RoleId} 分配权限成功,权限数量: {Count}", roleId, permissionCodes.Count); } /// diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/adminUser.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/adminUser.ts index 4e6e972f..a066a188 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/adminUser.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/adminUser.ts @@ -19,7 +19,7 @@ export interface AdminUserQuery { keyword?: string departmentId?: number status?: number - pageIndex: number + page: number pageSize: number } @@ -116,7 +116,7 @@ export function setAdminUserStatus(id: number, status: number): Promise> { return request({ - url: `/admin/users/${data.userId}/password`, + url: `/admin/users/${data.userId}/reset-password`, method: 'put', data: { newPassword: data.newPassword } }) diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/operationLog.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/operationLog.ts index 8167e0d0..729b33a2 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/operationLog.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/operationLog.ts @@ -22,7 +22,7 @@ export interface OperationLogQuery { module?: string startDate?: string endDate?: string - pageIndex: number + page: number pageSize: number } diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/role.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/role.ts index 580a161b..d4542702 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/role.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/api/role.ts @@ -13,7 +13,7 @@ export interface Role { export interface RoleQuery { keyword?: string status?: number - pageIndex: number + page: number pageSize: number } diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/utils/request.ts b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/utils/request.ts index 5632b52c..5f52843b 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/utils/request.ts +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/utils/request.ts @@ -12,9 +12,9 @@ export interface ApiResponse { // 分页结果 export interface PagedResult { - items: T[] + list: T[] total: number - pageIndex: number + page: number pageSize: number totalPages: number } diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/role/index.vue b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/role/index.vue index c01aaabf..97c2d7b7 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/role/index.vue +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/role/index.vue @@ -53,7 +53,7 @@ ({ keyword: '', status: undefined, - pageIndex: 1, + page: 1, pageSize: 10 }) @@ -220,7 +220,7 @@ const fetchData = async () => { loading.value = true try { const res = await getRoleList(queryParams) - roleList.value = res.data.items + roleList.value = res.data.list total.value = res.data.total } finally { loading.value = false @@ -228,14 +228,14 @@ const fetchData = async () => { } const handleSearch = () => { - queryParams.pageIndex = 1 + queryParams.page = 1 fetchData() } const handleReset = () => { queryParams.keyword = '' queryParams.status = undefined - queryParams.pageIndex = 1 + queryParams.page = 1 fetchData() } diff --git a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/user/index.vue b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/user/index.vue index b3898aa4..8aa0855b 100644 --- a/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/user/index.vue +++ b/server/HoneyBox/src/HoneyBox.Admin/admin-web/src/views/system/user/index.vue @@ -79,7 +79,7 @@ ({ keyword: '', departmentId: undefined, status: undefined, - pageIndex: 1, + page: 1, pageSize: 10 }) @@ -308,7 +308,7 @@ const fetchData = async () => { loading.value = true try { const res = await getAdminUserList(queryParams) - userList.value = res.data.items + userList.value = res.data.list total.value = res.data.total } finally { loading.value = false @@ -327,7 +327,7 @@ const loadBaseData = async () => { } const handleSearch = () => { - queryParams.pageIndex = 1 + queryParams.page = 1 fetchData() } @@ -335,7 +335,7 @@ const handleReset = () => { queryParams.keyword = '' queryParams.departmentId = undefined queryParams.status = undefined - queryParams.pageIndex = 1 + queryParams.page = 1 fetchData() }