using FlexJobApi.Core; using Furion; using Furion.DatabaseAccessor; using Mapster; using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// /// 获取当前登录用户菜单 /// public class GetCurrentLogierMenusQueryHandler( IRepository repMenu, IRepository repRoleMenu, IRepository repUserInfoRole ) : IRequestHandler> { private readonly IRepository repMenu = repMenu; private readonly IRepository repRoleMenu = repRoleMenu; private readonly IRepository repUserInfoRole = repUserInfoRole; /// public async Task> Handle(GetCurrentLogierMenusQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = repMenu.AsQueryable().AsNoTracking() .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime) .Where(it => it.UserType == logier.Type && it.ClientType == logier.ClientType) .Where(it => it.Type == EnumMenuType.Menu || it.Type == EnumMenuType.Page || it.Type == EnumMenuType.Modal); if (logier.Level != 999) { var menuIds = await repRoleMenu.AsQueryable().AsNoTracking() .Where(it => it.Role.UserRoles.Any(ur => ur.UserId == logier.Id)) .Select(it => it.MenuId) .ToListAsync(cancellationToken); q = q.Where(it => menuIds.Contains(it.Id)); } var all = await q.ProjectToType().ToListAsync(); var models = all.Where(it => it.ParentId == null).ToList(); LoopChildrens(models, all, []); return models; } /// /// 递归赋值下级菜单 /// /// /// /// private void LoopChildrens(List models, List all, List roleMenuIds) { foreach (var item in models) { item.IsChecked = roleMenuIds.Contains(item.Id); item.Children = all.Where(it => it.ParentId == item.Id).ToList(); if (item.Children.IsNotNull()) { LoopChildrens(item.Children, all, roleMenuIds); } } } } }