diff --git a/adminSystem/src/api/system-manage.ts b/adminSystem/src/api/system-manage.ts index 09949f0..2a26a59 100644 --- a/adminSystem/src/api/system-manage.ts +++ b/adminSystem/src/api/system-manage.ts @@ -58,6 +58,65 @@ export function fetchGetRoleList(params: Api.SystemManage.RoleSearchParams) { }) } +// 获取所有角色(下拉选择用) +export function fetchGetAllRoles() { + return request.get<{ roleId: number; roleName: string; roleCode: string }[]>({ + url: '/api/role/all' + }) +} + +// 创建角色 +export function fetchCreateRole(data: { + roleName: string + roleCode: string + description?: string + enabled?: boolean +}) { + return request.post({ + url: '/api/role', + params: data, + showSuccessMessage: true + }) +} + +// 更新角色 +export function fetchUpdateRole(id: number, data: { + roleName?: string + roleCode?: string + description?: string + enabled?: boolean +}) { + return request.put({ + url: `/api/role/${id}`, + params: data, + showSuccessMessage: true + }) +} + +// 删除角色 +export function fetchDeleteRole(id: number) { + return request.del({ + url: `/api/role/${id}`, + showSuccessMessage: true + }) +} + +// 获取角色的菜单权限 +export function fetchGetRoleMenus(roleId: number) { + return request.get({ + url: `/api/role/${roleId}/menus` + }) +} + +// 设置角色的菜单权限 +export function fetchSetRoleMenus(roleId: number, menuIds: number[]) { + return request.put({ + url: `/api/role/${roleId}/menus`, + params: { menuIds }, + showSuccessMessage: true + }) +} + // 获取菜单列表 export function fetchGetMenuList() { return request.get({ diff --git a/adminSystem/src/views/system/role/index.vue b/adminSystem/src/views/system/role/index.vue index aca447e..43ae3b6 100644 --- a/adminSystem/src/views/system/role/index.vue +++ b/adminSystem/src/views/system/role/index.vue @@ -58,12 +58,12 @@ diff --git a/adminSystem/src/views/system/role/modules/role-edit-dialog.vue b/adminSystem/src/views/system/role/modules/role-edit-dialog.vue index 46ff9b1..6a1dd60 100644 --- a/adminSystem/src/views/system/role/modules/role-edit-dialog.vue +++ b/adminSystem/src/views/system/role/modules/role-edit-dialog.vue @@ -27,13 +27,14 @@ diff --git a/adminSystem/src/views/system/role/modules/role-permission-dialog.vue b/adminSystem/src/views/system/role/modules/role-permission-dialog.vue index 3691ac8..efd47a8 100644 --- a/adminSystem/src/views/system/role/modules/role-permission-dialog.vue +++ b/adminSystem/src/views/system/role/modules/role-permission-dialog.vue @@ -12,9 +12,9 @@ ref="treeRef" :data="processedMenuList" show-checkbox - node-key="name" + node-key="id" :default-expand-all="isExpandAll" - :default-checked-keys="[1, 2, 3]" + :default-checked-keys="checkedMenuIds" :props="defaultProps" @check="handleTreeCheck" > @@ -29,13 +29,11 @@ @@ -43,6 +41,7 @@ diff --git a/backend-csharp/AmtScanner.Api/Controllers/RoleController.cs b/backend-csharp/AmtScanner.Api/Controllers/RoleController.cs index 185c40f..8ca8112 100644 --- a/backend-csharp/AmtScanner.Api/Controllers/RoleController.cs +++ b/backend-csharp/AmtScanner.Api/Controllers/RoleController.cs @@ -67,6 +67,231 @@ public class RoleController : ControllerBase Total = total })); } + + /// + /// 获取所有角色(下拉选择用) + /// + [HttpGet("all")] + public async Task>>> GetAllRoles() + { + var roles = await _context.Roles + .Where(r => r.Enabled) + .OrderBy(r => r.Id) + .Select(r => new RoleSimpleDto + { + RoleId = r.Id, + RoleName = r.RoleName, + RoleCode = r.RoleCode + }) + .ToListAsync(); + + return Ok(ApiResponse>.Success(roles)); + } + + /// + /// 获取角色详情 + /// + [HttpGet("{id}")] + public async Task>> GetRole(int id) + { + var role = await _context.Roles.FindAsync(id); + if (role == null) + { + return NotFound(ApiResponse.Fail(404, "角色不存在")); + } + + return Ok(ApiResponse.Success(new RoleListItemDto + { + RoleId = role.Id, + RoleName = role.RoleName, + RoleCode = role.RoleCode, + Description = role.Description, + Enabled = role.Enabled, + CreateTime = role.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss") + })); + } + + /// + /// 创建角色 + /// + [HttpPost] + public async Task>> CreateRole([FromBody] CreateRoleDto dto) + { + // 检查角色编码是否已存在 + if (await _context.Roles.AnyAsync(r => r.RoleCode == dto.RoleCode)) + { + return BadRequest(ApiResponse.Fail(400, "角色编码已存在")); + } + + // 检查角色名称是否已存在 + if (await _context.Roles.AnyAsync(r => r.RoleName == dto.RoleName)) + { + return BadRequest(ApiResponse.Fail(400, "角色名称已存在")); + } + + var role = new Role + { + RoleName = dto.RoleName, + RoleCode = dto.RoleCode, + Description = dto.Description, + Enabled = dto.Enabled, + CreatedAt = DateTime.UtcNow + }; + + _context.Roles.Add(role); + await _context.SaveChangesAsync(); + + return Ok(ApiResponse.Success(new RoleListItemDto + { + RoleId = role.Id, + RoleName = role.RoleName, + RoleCode = role.RoleCode, + Description = role.Description, + Enabled = role.Enabled, + CreateTime = role.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss") + }, "创建成功")); + } + + /// + /// 更新角色 + /// + [HttpPut("{id}")] + public async Task>> UpdateRole(int id, [FromBody] UpdateRoleDto dto) + { + var role = await _context.Roles.FindAsync(id); + if (role == null) + { + return NotFound(ApiResponse.Fail(404, "角色不存在")); + } + + // 检查角色编码是否与其他角色重复 + if (!string.IsNullOrEmpty(dto.RoleCode) && dto.RoleCode != role.RoleCode) + { + if (await _context.Roles.AnyAsync(r => r.RoleCode == dto.RoleCode && r.Id != id)) + { + return BadRequest(ApiResponse.Fail(400, "角色编码已存在")); + } + role.RoleCode = dto.RoleCode; + } + + // 检查角色名称是否与其他角色重复 + if (!string.IsNullOrEmpty(dto.RoleName) && dto.RoleName != role.RoleName) + { + if (await _context.Roles.AnyAsync(r => r.RoleName == dto.RoleName && r.Id != id)) + { + return BadRequest(ApiResponse.Fail(400, "角色名称已存在")); + } + role.RoleName = dto.RoleName; + } + + if (dto.Description != null) + { + role.Description = dto.Description; + } + + if (dto.Enabled.HasValue) + { + role.Enabled = dto.Enabled.Value; + } + + await _context.SaveChangesAsync(); + + return Ok(ApiResponse.Success(new RoleListItemDto + { + RoleId = role.Id, + RoleName = role.RoleName, + RoleCode = role.RoleCode, + Description = role.Description, + Enabled = role.Enabled, + CreateTime = role.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss") + }, "更新成功")); + } + + /// + /// 删除角色 + /// + [HttpDelete("{id}")] + public async Task>> DeleteRole(int id) + { + var role = await _context.Roles + .Include(r => r.UserRoles) + .Include(r => r.RoleMenus) + .FirstOrDefaultAsync(r => r.Id == id); + + if (role == null) + { + return NotFound(ApiResponse.Fail(404, "角色不存在")); + } + + // 检查是否有用户使用该角色 + if (role.UserRoles.Any()) + { + return BadRequest(ApiResponse.Fail(400, "该角色下存在用户,无法删除")); + } + + // 删除角色菜单关联 + _context.RoleMenus.RemoveRange(role.RoleMenus); + + // 删除角色 + _context.Roles.Remove(role); + await _context.SaveChangesAsync(); + + return Ok(ApiResponse.Success(null, "删除成功")); + } + + /// + /// 获取角色的菜单权限 + /// + [HttpGet("{id}/menus")] + public async Task>>> GetRoleMenus(int id) + { + var role = await _context.Roles.FindAsync(id); + if (role == null) + { + return NotFound(ApiResponse>.Fail(404, "角色不存在")); + } + + var menuIds = await _context.RoleMenus + .Where(rm => rm.RoleId == id) + .Select(rm => rm.MenuId) + .ToListAsync(); + + return Ok(ApiResponse>.Success(menuIds)); + } + + /// + /// 设置角色的菜单权限 + /// + [HttpPut("{id}/menus")] + public async Task>> SetRoleMenus(int id, [FromBody] SetRoleMenusDto dto) + { + var role = await _context.Roles.FindAsync(id); + if (role == null) + { + return NotFound(ApiResponse.Fail(404, "角色不存在")); + } + + // 删除原有的菜单权限 + var existingMenus = await _context.RoleMenus + .Where(rm => rm.RoleId == id) + .ToListAsync(); + _context.RoleMenus.RemoveRange(existingMenus); + + // 添加新的菜单权限 + if (dto.MenuIds != null && dto.MenuIds.Any()) + { + var newMenus = dto.MenuIds.Select(menuId => new RoleMenu + { + RoleId = id, + MenuId = menuId + }); + _context.RoleMenus.AddRange(newMenus); + } + + await _context.SaveChangesAsync(); + + return Ok(ApiResponse.Success(null, "菜单权限设置成功")); + } } /// @@ -81,3 +306,43 @@ public class RoleListItemDto public bool Enabled { get; set; } public string CreateTime { get; set; } = string.Empty; } + +/// +/// 角色简单 DTO(下拉选择用) +/// +public class RoleSimpleDto +{ + public int RoleId { get; set; } + public string RoleName { get; set; } = string.Empty; + public string RoleCode { get; set; } = string.Empty; +} + +/// +/// 创建角色 DTO +/// +public class CreateRoleDto +{ + public string RoleName { get; set; } = string.Empty; + public string RoleCode { get; set; } = string.Empty; + public string? Description { get; set; } + public bool Enabled { get; set; } = true; +} + +/// +/// 更新角色 DTO +/// +public class UpdateRoleDto +{ + public string? RoleName { get; set; } + public string? RoleCode { get; set; } + public string? Description { get; set; } + public bool? Enabled { get; set; } +} + +/// +/// 设置角色菜单 DTO +/// +public class SetRoleMenusDto +{ + public List? MenuIds { get; set; } +}