89 lines
2.5 KiB
C#
89 lines
2.5 KiB
C#
using AmtScanner.Api.Data;
|
|
using AmtScanner.Api.Models;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace AmtScanner.Api.Services;
|
|
|
|
/// <summary>
|
|
/// 菜单服务实现
|
|
/// </summary>
|
|
public class MenuService : IMenuService
|
|
{
|
|
private readonly AppDbContext _context;
|
|
private readonly IAuthService _authService;
|
|
|
|
public MenuService(AppDbContext context, IAuthService authService)
|
|
{
|
|
_context = context;
|
|
_authService = authService;
|
|
}
|
|
|
|
public async Task<List<MenuDto>> GetUserMenusAsync(int userId)
|
|
{
|
|
// 获取用户角色
|
|
var userRoles = await _authService.GetUserRolesAsync(userId);
|
|
|
|
// 如果是超级管理员,返回所有菜单
|
|
if (userRoles.Contains("R_SUPER"))
|
|
{
|
|
return await GetAllMenusAsync();
|
|
}
|
|
|
|
// 获取用户角色对应的菜单
|
|
var roleIds = await _context.Roles
|
|
.Where(r => userRoles.Contains(r.RoleCode) && r.Enabled)
|
|
.Select(r => r.Id)
|
|
.ToListAsync();
|
|
|
|
var menuIds = await _context.RoleMenus
|
|
.Where(rm => roleIds.Contains(rm.RoleId))
|
|
.Select(rm => rm.MenuId)
|
|
.Distinct()
|
|
.ToListAsync();
|
|
|
|
var menus = await _context.Menus
|
|
.Where(m => menuIds.Contains(m.Id))
|
|
.OrderBy(m => m.Sort)
|
|
.ToListAsync();
|
|
|
|
return BuildMenuTree(menus, null);
|
|
}
|
|
|
|
public async Task<List<MenuDto>> GetAllMenusAsync()
|
|
{
|
|
var menus = await _context.Menus
|
|
.OrderBy(m => m.Sort)
|
|
.ToListAsync();
|
|
|
|
return BuildMenuTree(menus, null);
|
|
}
|
|
|
|
private List<MenuDto> BuildMenuTree(List<Menu> menus, int? parentId)
|
|
{
|
|
return menus
|
|
.Where(m => m.ParentId == parentId)
|
|
.OrderBy(m => m.Sort)
|
|
.Select(m => new MenuDto
|
|
{
|
|
Id = m.Id,
|
|
Name = m.Name,
|
|
Path = m.Path,
|
|
Component = m.Component,
|
|
Meta = new MenuMetaDto
|
|
{
|
|
Title = m.Title,
|
|
Icon = m.Icon,
|
|
IsHide = m.IsHide,
|
|
KeepAlive = m.KeepAlive,
|
|
Link = m.Link,
|
|
IsIframe = m.IsIframe,
|
|
Roles = string.IsNullOrEmpty(m.Roles)
|
|
? new List<string>()
|
|
: m.Roles.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
|
|
},
|
|
Children = BuildMenuTree(menus, m.Id)
|
|
})
|
|
.ToList();
|
|
}
|
|
}
|