using AmtScanner.Api.Data;
using AmtScanner.Api.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace AmtScanner.Api.Controllers;
///
/// 角色控制器
///
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class RoleController : ControllerBase
{
private readonly AppDbContext _context;
public RoleController(AppDbContext context)
{
_context = context;
}
///
/// 获取角色列表(分页)
///
[HttpGet("list")]
public async Task>>> GetRoleList(
[FromQuery] int current = 1,
[FromQuery] int size = 10,
[FromQuery] string? roleName = null,
[FromQuery] string? roleCode = null)
{
var query = _context.Roles.AsQueryable();
if (!string.IsNullOrEmpty(roleName))
{
query = query.Where(r => r.RoleName.Contains(roleName));
}
if (!string.IsNullOrEmpty(roleCode))
{
query = query.Where(r => r.RoleCode.Contains(roleCode));
}
var total = await query.CountAsync();
var roles = await query
.OrderBy(r => r.Id)
.Skip((current - 1) * size)
.Take(size)
.Select(r => new RoleListItemDto
{
RoleId = r.Id,
RoleName = r.RoleName,
RoleCode = r.RoleCode,
Description = r.Description,
Enabled = r.Enabled,
CreateTime = r.CreatedAt.ToString("yyyy-MM-dd HH:mm:ss")
})
.ToListAsync();
return Ok(ApiResponse>.Success(new PaginatedResponse
{
Records = roles,
Current = current,
Size = size,
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