This commit is contained in:
gpu 2026-01-04 12:19:46 +08:00
parent c0d139651c
commit e4505e0370
13 changed files with 167 additions and 26 deletions

View File

@ -84,6 +84,18 @@ public class AdminUserController : ControllerBase
return ApiResponse.Success("删除成功");
}
/// <summary>
/// 获取管理员已分配的角色ID列表
/// </summary>
/// <param name="id">管理员ID</param>
/// <returns>角色ID列表</returns>
[HttpGet("{id:long}/roles")]
public async Task<ApiResponse<List<long>>> GetRoles(long id)
{
var result = await _adminUserService.GetRoleIdsAsync(id);
return ApiResponse<List<long>>.Success(result);
}
/// <summary>
/// 分配角色给管理员
/// </summary>
@ -96,6 +108,18 @@ public class AdminUserController : ControllerBase
return ApiResponse.Success("分配成功");
}
/// <summary>
/// 获取管理员已分配的专属菜单ID列表
/// </summary>
/// <param name="id">管理员ID</param>
/// <returns>菜单ID列表</returns>
[HttpGet("{id:long}/menus")]
public async Task<ApiResponse<List<long>>> GetMenus(long id)
{
var result = await _adminUserService.GetMenuIdsAsync(id);
return ApiResponse<List<long>>.Success(result);
}
/// <summary>
/// 分配用户专属菜单
/// </summary>

View File

@ -93,6 +93,18 @@ public class RoleController : ControllerBase
return ApiResponse.Success("删除成功");
}
/// <summary>
/// 获取角色已分配的菜单ID列表
/// </summary>
/// <param name="id">角色ID</param>
/// <returns>菜单ID列表</returns>
[HttpGet("{id:long}/menus")]
public async Task<ApiResponse<List<long>>> GetMenus(long id)
{
var result = await _roleService.GetMenuIdsAsync(id);
return ApiResponse<List<long>>.Success(result);
}
/// <summary>
/// 分配菜单给角色
/// </summary>
@ -105,6 +117,18 @@ public class RoleController : ControllerBase
return ApiResponse.Success("分配成功");
}
/// <summary>
/// 获取角色已分配的权限编码列表
/// </summary>
/// <param name="id">角色ID</param>
/// <returns>权限编码列表</returns>
[HttpGet("{id:long}/permissions")]
public async Task<ApiResponse<List<string>>> GetPermissions(long id)
{
var result = await _roleService.GetPermissionCodesAsync(id);
return ApiResponse<List<string>>.Success(result);
}
/// <summary>
/// 分配权限给角色
/// </summary>
@ -113,7 +137,7 @@ public class RoleController : ControllerBase
[HttpPut("{id:long}/permissions")]
public async Task<ApiResponse> AssignPermissions(long id, [FromBody] AssignPermissionsRequest request)
{
await _roleService.AssignPermissionsAsync(id, request.PermissionIds);
await _roleService.AssignPermissionsAsync(id, request.PermissionCodes);
return ApiResponse.Success("分配成功");
}
}

View File

@ -8,7 +8,7 @@ namespace HoneyBox.Admin.Models.Role;
public class AssignPermissionsRequest
{
/// <summary>
/// 权限ID列表
/// 权限编码列表
/// </summary>
public List<long> PermissionIds { get; set; } = new();
public List<string> PermissionCodes { get; set; } = new();
}

View File

@ -266,6 +266,21 @@ public class AdminUserService : IAdminUserService
_logger.LogInformation("删除管理员成功: {UserId} - {Username}", id, user.Username);
}
/// <inheritdoc />
public async Task<List<long>> 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();
}
/// <inheritdoc />
public async Task AssignRolesAsync(long userId, List<long> roleIds)
{
@ -294,6 +309,21 @@ public class AdminUserService : IAdminUserService
_logger.LogInformation("管理员 {UserId} 分配角色成功,角色数量: {Count}", userId, roleIds.Count);
}
/// <inheritdoc />
public async Task<List<long>> 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();
}
/// <inheritdoc />
public async Task AssignMenusAsync(long userId, List<long> menuIds)
{

View File

@ -43,6 +43,13 @@ public interface IAdminUserService
/// <param name="id">管理员ID</param>
Task DeleteAsync(long id);
/// <summary>
/// 获取管理员已分配的角色ID列表
/// </summary>
/// <param name="userId">管理员ID</param>
/// <returns>角色ID列表</returns>
Task<List<long>> GetRoleIdsAsync(long userId);
/// <summary>
/// 分配角色给管理员
/// </summary>
@ -50,6 +57,13 @@ public interface IAdminUserService
/// <param name="roleIds">角色ID列表</param>
Task AssignRolesAsync(long userId, List<long> roleIds);
/// <summary>
/// 获取管理员已分配的专属菜单ID列表
/// </summary>
/// <param name="userId">管理员ID</param>
/// <returns>菜单ID列表</returns>
Task<List<long>> GetMenuIdsAsync(long userId);
/// <summary>
/// 分配用户专属菜单
/// </summary>

View File

@ -42,6 +42,13 @@ public interface IRoleService
/// <param name="id">角色ID</param>
Task DeleteAsync(long id);
/// <summary>
/// 获取角色已分配的菜单ID列表
/// </summary>
/// <param name="roleId">角色ID</param>
/// <returns>菜单ID列表</returns>
Task<List<long>> GetMenuIdsAsync(long roleId);
/// <summary>
/// 分配菜单给角色
/// </summary>
@ -49,12 +56,19 @@ public interface IRoleService
/// <param name="menuIds">菜单ID列表</param>
Task AssignMenusAsync(long roleId, List<long> menuIds);
/// <summary>
/// 获取角色已分配的权限编码列表
/// </summary>
/// <param name="roleId">角色ID</param>
/// <returns>权限编码列表</returns>
Task<List<string>> GetPermissionCodesAsync(long roleId);
/// <summary>
/// 分配权限给角色
/// </summary>
/// <param name="roleId">角色ID</param>
/// <param name="permissionIds">权限ID列表</param>
Task AssignPermissionsAsync(long roleId, List<long> permissionIds);
/// <param name="permissionCodes">权限编码列表</param>
Task AssignPermissionsAsync(long roleId, List<string> permissionCodes);
/// <summary>
/// 获取所有角色(下拉选择用)

View File

@ -190,6 +190,21 @@ public class RoleService : IRoleService
_logger.LogInformation("删除角色成功: {RoleId} - {RoleName}", id, role.Name);
}
/// <inheritdoc />
public async Task<List<long>> 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();
}
/// <inheritdoc />
public async Task AssignMenusAsync(long roleId, List<long> menuIds)
{
@ -219,7 +234,22 @@ public class RoleService : IRoleService
}
/// <inheritdoc />
public async Task AssignPermissionsAsync(long roleId, List<long> permissionIds)
public async Task<List<string>> 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();
}
/// <inheritdoc />
public async Task AssignPermissionsAsync(long roleId, List<string> 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);
}
/// <inheritdoc />

View File

@ -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<ApiRespo
// 重置密码
export function resetPassword(data: ResetPasswordRequest): Promise<ApiResponse<null>> {
return request({
url: `/admin/users/${data.userId}/password`,
url: `/admin/users/${data.userId}/reset-password`,
method: 'put',
data: { newPassword: data.newPassword }
})

View File

@ -22,7 +22,7 @@ export interface OperationLogQuery {
module?: string
startDate?: string
endDate?: string
pageIndex: number
page: number
pageSize: number
}

View File

@ -13,7 +13,7 @@ export interface Role {
export interface RoleQuery {
keyword?: string
status?: number
pageIndex: number
page: number
pageSize: number
}

View File

@ -12,9 +12,9 @@ export interface ApiResponse<T = any> {
// 分页结果
export interface PagedResult<T> {
items: T[]
list: T[]
total: number
pageIndex: number
page: number
pageSize: number
totalPages: number
}

View File

@ -53,7 +53,7 @@
<!-- 分页 -->
<el-pagination
v-model:current-page="queryParams.pageIndex"
v-model:current-page="queryParams.page"
v-model:page-size="queryParams.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="total"
@ -156,7 +156,7 @@ const total = ref(0)
const queryParams = reactive<RoleQuery>({
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()
}

View File

@ -79,7 +79,7 @@
<!-- 分页 -->
<el-pagination
v-model:current-page="queryParams.pageIndex"
v-model:current-page="queryParams.page"
v-model:page-size="queryParams.pageSize"
:page-sizes="[10, 20, 50, 100]"
:total="total"
@ -219,7 +219,7 @@ const queryParams = reactive<AdminUserQuery>({
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()
}