using AmtScanner.Api.Data; using AmtScanner.Api.Models; using AmtScanner.Api.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace AmtScanner.Api.Controllers; /// /// 菜单控制器 /// [ApiController] public class MenuController : ControllerBase { private readonly IMenuService _menuService; private readonly AppDbContext _context; public MenuController(IMenuService menuService, AppDbContext context) { _menuService = menuService; _context = context; } /// /// 获取用户菜单(adminSystem 前端使用的路由) /// [Authorize] [HttpGet("api/v3/system/menus/simple")] public async Task>>> GetUserMenus() { var userIdClaim = User.FindFirst("userId")?.Value; if (string.IsNullOrEmpty(userIdClaim) || !int.TryParse(userIdClaim, out var userId)) { return Ok(ApiResponse>.Fail(401, "无效的用户")); } var menus = await _menuService.GetUserMenusAsync(userId); return Ok(ApiResponse>.Success(menus)); } /// /// 获取所有菜单列表 /// [Authorize] [HttpGet("api/menu/list")] public async Task>>> GetAllMenus() { var menus = await _menuService.GetAllMenusAsync(); return Ok(ApiResponse>.Success(menus)); } /// /// 创建菜单 /// [Authorize] [HttpPost("api/menu")] public async Task>> CreateMenu([FromBody] CreateMenuRequest request) { var menu = new Menu { ParentId = request.ParentId, Name = request.Name, Path = request.Path, Component = request.Component, Title = request.Title, Icon = request.Icon, Sort = request.Sort, IsHide = request.IsHide, KeepAlive = request.KeepAlive, Link = request.Link, IsIframe = request.IsIframe, Roles = request.Roles != null ? string.Join(",", request.Roles) : null }; _context.Menus.Add(menu); await _context.SaveChangesAsync(); return Ok(ApiResponse.Success(menu, "菜单创建成功")); } /// /// 更新菜单 /// [Authorize] [HttpPut("api/menu/{id}")] public async Task>> UpdateMenu(int id, [FromBody] UpdateMenuRequest request) { var menu = await _context.Menus.FindAsync(id); if (menu == null) { return Ok(ApiResponse.Fail(404, "菜单不存在")); } if (request.ParentId.HasValue) menu.ParentId = request.ParentId; if (!string.IsNullOrEmpty(request.Name)) menu.Name = request.Name; if (!string.IsNullOrEmpty(request.Path)) menu.Path = request.Path; if (request.Component != null) menu.Component = request.Component; if (!string.IsNullOrEmpty(request.Title)) menu.Title = request.Title; if (request.Icon != null) menu.Icon = request.Icon; if (request.Sort.HasValue) menu.Sort = request.Sort.Value; if (request.IsHide.HasValue) menu.IsHide = request.IsHide.Value; if (request.KeepAlive.HasValue) menu.KeepAlive = request.KeepAlive.Value; if (request.Link != null) menu.Link = request.Link; if (request.IsIframe.HasValue) menu.IsIframe = request.IsIframe.Value; if (request.Roles != null) menu.Roles = string.Join(",", request.Roles); await _context.SaveChangesAsync(); return Ok(ApiResponse.Success(menu, "菜单更新成功")); } /// /// 删除菜单 /// [Authorize] [HttpDelete("api/menu/{id}")] public async Task>> DeleteMenu(int id) { var menu = await _context.Menus.FindAsync(id); if (menu == null) { return Ok(ApiResponse.Fail(404, "菜单不存在")); } // 检查是否为系统内置菜单 if (menu.IsSystem) { return Ok(ApiResponse.Fail(400, "系统内置菜单不能删除")); } // 检查是否有子菜单 var hasChildren = await _context.Menus.AnyAsync(m => m.ParentId == id); if (hasChildren) { return Ok(ApiResponse.Fail(400, "请先删除子菜单")); } // 删除角色菜单关联 var roleMenus = await _context.RoleMenus.Where(rm => rm.MenuId == id).ToListAsync(); _context.RoleMenus.RemoveRange(roleMenus); _context.Menus.Remove(menu); await _context.SaveChangesAsync(); return Ok(ApiResponse.Success(null, "菜单删除成功")); } /// /// 重置菜单为默认配置 /// [Authorize] [HttpPost("api/menu/reset")] public async Task>> ResetMenus() { // 清空现有菜单和角色菜单关联 _context.RoleMenus.RemoveRange(_context.RoleMenus); _context.Menus.RemoveRange(_context.Menus); await _context.SaveChangesAsync(); // 重新创建默认菜单 var menus = new List { // 仪表盘菜单(系统内置) new() { Id = 1, Name = "Dashboard", Path = "/dashboard", Component = "/index/index", Title = "menus.dashboard.title", Icon = "ri:pie-chart-line", Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, new() { Id = 2, ParentId = 1, Name = "Console", Path = "console", Component = "/dashboard/console", Title = "menus.dashboard.console", KeepAlive = false, Sort = 1, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, // 系统管理菜单(系统内置) new() { Id = 10, Name = "System", Path = "/system", Component = "/index/index", Title = "menus.system.title", Icon = "ri:user-3-line", Sort = 99, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, new() { Id = 11, ParentId = 10, Name = "User", Path = "user", Component = "/system/user", Title = "menus.system.user", KeepAlive = true, Sort = 1, Roles = "R_SUPER,R_ADMIN", IsSystem = true }, new() { Id = 12, ParentId = 10, Name = "Role", Path = "role", Component = "/system/role", Title = "menus.system.role", KeepAlive = true, Sort = 2, Roles = "R_SUPER", IsSystem = true }, new() { Id = 13, ParentId = 10, Name = "UserCenter", Path = "user-center", Component = "/system/user-center", Title = "menus.system.userCenter", IsHide = true, KeepAlive = true, Sort = 3, Roles = "R_SUPER,R_ADMIN,R_USER", IsSystem = true }, new() { Id = 14, ParentId = 10, Name = "Menus", Path = "menu", Component = "/system/menu", Title = "menus.system.menu", KeepAlive = true, Sort = 4, Roles = "R_SUPER", IsSystem = true } }; _context.Menus.AddRange(menus); await _context.SaveChangesAsync(); // 重新分配角色菜单 var superRole = await _context.Roles.FirstAsync(r => r.RoleCode == "R_SUPER"); var adminRole = await _context.Roles.FirstAsync(r => r.RoleCode == "R_ADMIN"); var userRole = await _context.Roles.FirstAsync(r => r.RoleCode == "R_USER"); var allMenuIds = await _context.Menus.Select(m => m.Id).ToListAsync(); var adminMenuIds = await _context.Menus .Where(m => m.Roles != null && (m.Roles.Contains("R_ADMIN") || m.Roles.Contains("R_USER"))) .Select(m => m.Id).ToListAsync(); var userMenuIds = await _context.Menus .Where(m => m.Roles != null && m.Roles.Contains("R_USER")) .Select(m => m.Id).ToListAsync(); var roleMenus = new List(); foreach (var menuId in allMenuIds) roleMenus.Add(new RoleMenu { RoleId = superRole.Id, MenuId = menuId }); foreach (var menuId in adminMenuIds) roleMenus.Add(new RoleMenu { RoleId = adminRole.Id, MenuId = menuId }); foreach (var menuId in userMenuIds) roleMenus.Add(new RoleMenu { RoleId = userRole.Id, MenuId = menuId }); _context.RoleMenus.AddRange(roleMenus); await _context.SaveChangesAsync(); return Ok(ApiResponse.Success(null, "菜单已重置为默认配置")); } } /// /// 创建菜单请求 /// public class CreateMenuRequest { public int? ParentId { get; set; } public string Name { get; set; } = string.Empty; public string Path { get; set; } = string.Empty; public string? Component { get; set; } public string Title { get; set; } = string.Empty; public string? Icon { get; set; } public int Sort { get; set; } public bool IsHide { get; set; } public bool KeepAlive { get; set; } public string? Link { get; set; } public bool IsIframe { get; set; } public List? Roles { get; set; } } /// /// 更新菜单请求 /// public class UpdateMenuRequest { public int? ParentId { get; set; } public string? Name { get; set; } public string? Path { get; set; } public string? Component { get; set; } public string? Title { get; set; } public string? Icon { get; set; } public int? Sort { get; set; } public bool? IsHide { get; set; } public bool? KeepAlive { get; set; } public string? Link { get; set; } public bool? IsIframe { get; set; } public List? Roles { get; set; } }