sunpengfei
2025-08-04 9e8333656f689291c9aea9052d2ee50cb784d5ed
feat:菜单适配
6个文件已添加
2个文件已修改
378 ■■■■■ 已修改文件
FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Commands/SaveMenuButtonCommandHandler.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Commands/SaveMenuFieldCommandHandler.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Commands/SetMenuSwitchCommandHandler.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/MenuAppService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuButtonCommand.cs
New file
@@ -0,0 +1,65 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 保存菜单按钮
    /// </summary>
    public class SaveMenuButtonCommand : IRequest<Guid>
    {
        /// <summary>
        /// Id
        /// </summary>
        public Guid? Id { get; set; }
        /// <summary>
        /// 菜单Id
        /// </summary>
        public Guid ParentId { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 分组名称(用于按钮/字段)
        /// </summary>
        public string Group { get; set; }
        /// <summary>
        /// 位置(用于按钮)
        /// </summary>
        public string Location { get; set; }
        /// <summary>
        /// 图标
        /// </summary>
        public string Icon { get; set; }
        /// <summary>
        /// 宽度(用于按钮/列/元素)
        /// </summary>
        public string Width { get; set; }
        /// <summary>
        /// 排序
        /// </summary>
        public int Sort { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
    }
}
FlexJobApi.Core/Models/User/Menus/Commands/SaveMenuFieldCommand.cs
New file
@@ -0,0 +1,65 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 保存菜单字段
    /// </summary>
    public class SaveMenuFieldCommand : IRequest<Guid>
    {
        /// <summary>
        /// Id
        /// </summary>
        public Guid? Id { get; set; }
        /// <summary>
        /// 菜单Id
        /// </summary>
        public Guid ParentId { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 分组名称(用于按钮/字段)
        /// </summary>
        public string Group { get; set; }
        /// <summary>
        /// 位置(用于按钮)
        /// </summary>
        public string Location { get; set; }
        /// <summary>
        /// 图标
        /// </summary>
        public string Icon { get; set; }
        /// <summary>
        /// 宽度(用于按钮/列/元素)
        /// </summary>
        public string Width { get; set; }
        /// <summary>
        /// 排序
        /// </summary>
        public int Sort { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
    }
}
FlexJobApi.Core/Models/User/Menus/Commands/SetMenuSwitchCommand.cs
New file
@@ -0,0 +1,40 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 设置菜单切换信息
    /// </summary>
    public class SetMenuSwitchCommand : IRequest<int>
    {
        public SetMenuSwitchCommand()
        {
            Ids = [];
        }
        /// <summary>
        /// Id
        /// </summary>
        public List<Guid> Ids { get; set; }
        /// <summary>
        /// 类型(null时不更新)
        /// </summary>
        public EnumMenuType? Type { get; set; }
        /// <summary>
        /// 是否禁用(null时不更新)
        /// </summary>
        public bool? IsDisabled { get; set; }
        /// <summary>
        /// 是否缓存(null时不更新)
        /// </summary>
        public bool? IsCache { get; set; }
    }
}
FlexJobApi.User.Application/Menus/Commands/SaveMenuButtonCommandHandler.cs
New file
@@ -0,0 +1,62 @@
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.User.Application
{
    /// <summary>
    /// 保存菜单按钮
    /// </summary>
    public class SaveMenuButtonCommandHandler(
            IRepository<Menu> rep
        ) : IRequestHandler<SaveMenuButtonCommand, Guid>
    {
        private readonly IRepository<Menu> rep = rep;
        /// <inheritdoc/>
        public async Task<Guid> Handle(SaveMenuButtonCommand request, CancellationToken cancellationToken)
        {
            if (request.Id.HasValue)
            {
                var entity = await rep.FirstOrDefaultAsync(it => it.Id == it.Id);
                if (entity.ParentId != request.ParentId) throw Oops.Oh(EnumErrorCodeType.s410, "上级Id");
                request.Adapt(entity);
                if (await CheckExist(entity)) throw Oops.Oh(EnumErrorCodeType.s405, "菜单编号");
                await rep.UpdateAsync(entity);
                return entity.Id;
            }
            else
            {
                var entity = new Menu();
                request.Adapt(entity);
                if (await CheckExist(entity)) throw Oops.Oh(EnumErrorCodeType.s405, "菜单编号");
                await rep.InsertAsync(entity);
                return entity.Id;
            }
        }
        /// <summary>
        /// 校验菜单是否重复
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        private async Task<bool> CheckExist(Menu entity)
        {
            return await rep.AsQueryable().AsNoTracking()
                .AnyAsync(it =>
                    it.ParentId == entity.ParentId
                    && it.Group == entity.Group
                    && it.Location == entity.Location
                    && it.Code == entity.Code
                    && it.Id != entity.Id);
        }
    }
}
FlexJobApi.User.Application/Menus/Commands/SaveMenuFieldCommandHandler.cs
New file
@@ -0,0 +1,62 @@
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.User.Application
{
    /// <summary>
    ///
    /// </summary>
    public class SaveMenuFieldCommandHandler(
            IRepository<Menu> rep
        ) : IRequestHandler<SaveMenuFieldCommand, Guid>
    {
        private readonly IRepository<Menu> rep = rep;
        /// <inheritdoc/>
        public async Task<Guid> Handle(SaveMenuFieldCommand request, CancellationToken cancellationToken)
        {
            if (request.Id.HasValue)
            {
                var entity = await rep.FirstOrDefaultAsync(it => it.Id == it.Id);
                if (entity.ParentId != request.ParentId) throw Oops.Oh(EnumErrorCodeType.s410, "上级Id");
                request.Adapt(entity);
                if (await CheckExist(entity)) throw Oops.Oh(EnumErrorCodeType.s405, "菜单编号");
                await rep.UpdateAsync(entity);
                return entity.Id;
            }
            else
            {
                var entity = new Menu();
                request.Adapt(entity);
                if (await CheckExist(entity)) throw Oops.Oh(EnumErrorCodeType.s405, "菜单编号");
                await rep.InsertAsync(entity);
                return entity.Id;
            }
        }
        /// <summary>
        /// 校验菜单是否重复
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        private async Task<bool> CheckExist(Menu entity)
        {
            return await rep.AsQueryable().AsNoTracking()
                .AnyAsync(it =>
                    it.ParentId == entity.ParentId
                    && it.Group == entity.Group
                    && it.Code == entity.Code
                    && it.Id != entity.Id);
        }
    }
}
FlexJobApi.User.Application/Menus/Commands/SetMenuSwitchCommandHandler.cs
New file
@@ -0,0 +1,53 @@
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.User.Application
{
    /// <summary>
    /// 设置菜单切换信息
    /// </summary>
    public class SetMenuSwitchCommandHandler(
            IRepository<Menu> rep
        ) : IRequestHandler<SetMenuSwitchCommand, int>
    {
        private readonly IRepository<Menu> rep = rep;
        /// <inheritdoc/>
        public async Task<int> Handle(SetMenuSwitchCommand request, CancellationToken cancellationToken)
        {
            var entities = await rep.AsQueryable()
                .Where(it => request.Ids.Contains(it.Id))
                .ToListAsync(cancellationToken);
            foreach (var entity in entities)
            {
                if (request.Type.HasValue)
                {
                    entity.Type = request.Type.Value;
                }
                if (request.IsDisabled.HasValue)
                {
                    entity.IsDisabled = request.IsDisabled.Value;
                }
                if (request.IsCache.HasValue)
                {
                    entity.IsCache = request.IsCache.Value;
                }
            }
            if (entities.Any())
            {
                await rep.UpdateAsync(entities);
                return entities.Count;
            }
            return 0;
        }
    }
}
FlexJobApi.User.Application/Menus/MenuAppService.cs
@@ -56,6 +56,36 @@
        }
        /// <summary>
        /// 保存菜单按钮
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public Task<Guid> SaveMenuButton(SaveMenuButtonCommand command)
        {
            return mediator.Send(command);
        }
        /// <summary>
        /// 保存菜单字段
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public Task<Guid> SaveMenuField(SaveMenuFieldCommand command)
        {
            return mediator.Send(command);
        }
        /// <summary>
        /// 设置菜单切换信息
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public Task<int> SetMenuSwitch(SetMenuSwitchCommand command)
        {
            return mediator.Send(command);
        }
        /// <summary>
        /// 删除菜单
        /// </summary>
        /// <param name="command"></param>
FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs
@@ -25,6 +25,7 @@
        public async Task<List<GetMenusQueryResultItem>> Handle(GetMenusQuery request, CancellationToken cancellationToken)
        {
            var q = rep.AsQueryable().AsNoTracking()
                .OrderBy(it => it.Sort)
                .Where(it => it.UserType == request.UserType && it.ClientType == request.ClientType)
                .Where(it => it.Type == EnumMenuType.Menu || it.Type == EnumMenuType.Page || it.Type == EnumMenuType.Modal);
            var all = await q.ProjectToType<GetMenusQueryResultItem>().ToListAsync();