sunpengfei
2025-08-04 4950d547503c7c1d5d0ff6487e6768937170ddf7
feat:角色授权
12个文件已修改
173 ■■■■ 已修改文件
FlexJobApi.Application/Dictionaries/DictionaryAppService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/FlexJobApi.Application.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/FlexJobApi.User.Application.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/Dictionaries/DictionaryAppService.cs
@@ -6,7 +6,7 @@
namespace FlexJobApi.Application
{
    /// <summary>
    /// 资源
    /// 数据字典
    /// </summary>
    [Route("api/main/[controller]")]
    public class DictionaryAppService(IMediator mediator) : IDynamicApiController
FlexJobApi.Application/FlexJobApi.Application.xml
@@ -6,12 +6,12 @@
    <members>
        <member name="T:FlexJobApi.Application.DictionaryAppService">
            <summary>
            资源
            数据字典
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.DictionaryAppService.#ctor(MediatR.IMediator)">
            <summary>
            资源
            数据字典
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.DictionaryAppService.GetDictionaryDatas(FlexJobApi.Core.GetDictionaryDatasQuery)">
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -2184,6 +2184,11 @@
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQuery.RoleId">
            <summary>
            角色Id
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.Models.GetMenuQueryResult">
            <summary>
            查询菜单详情-结果
@@ -2192,6 +2197,11 @@
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.IsChecked">
            <summary>
            是否选择(用户角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResult.UserType">
@@ -2314,6 +2324,11 @@
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.IsChecked">
            <summary>
            是否选择(用户角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultButton.Code">
            <summary>
            编号
@@ -2354,6 +2369,11 @@
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.IsChecked">
            <summary>
            是否选择(用户角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultField.Code">
            <summary>
            编号
@@ -2387,6 +2407,11 @@
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.IsChecked">
            <summary>
            是否选择(用户角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.GetMenuQueryResultItem.Code">
@@ -2449,6 +2474,11 @@
            客户端类型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetMenusQuery.RoleId">
            <summary>
            角色Id
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetMenusQueryResultItem">
            <summary>
            查询所有菜单-结果-项
@@ -2457,6 +2487,11 @@
        <member name="P:FlexJobApi.Core.GetMenusQueryResultItem.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetMenusQueryResultItem.IsChecked">
            <summary>
            是否选择(用户角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetMenusQueryResultItem.ParentId">
@@ -2569,6 +2604,11 @@
            关键字
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetResourcesQuery.RoleId">
            <summary>
            角色Id
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetResourcesQueryResultItem">
            <summary>
            获取资源列表-结果-项
@@ -2579,6 +2619,11 @@
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetResourcesQueryResultItem.IsChecked">
            <summary>
            是否选中(用于角色授权)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetResourcesQueryResultItem.Service">
            <summary>
            微服务
FlexJobApi.Core/Models/User/Menus/Queries/GetMenuQuery.cs
@@ -17,6 +17,11 @@
        /// Id
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 角色Id
        /// </summary>
        public Guid? RoleId { get; set; }
    }
    /// <summary>
@@ -33,6 +38,11 @@
        /// Id
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选择(用户角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 用户类型
@@ -169,6 +179,11 @@
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选择(用户角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
@@ -210,6 +225,11 @@
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选择(用户角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
@@ -246,6 +266,11 @@
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选择(用户角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
FlexJobApi.Core/Models/User/Menus/Queries/GetMenusQuery.cs
@@ -28,6 +28,11 @@
        /// 客户端类型
        /// </summary>
        public EnumClientType ClientType { get; set; }
        /// <summary>
        /// 角色Id
        /// </summary>
        public Guid? RoleId { get; set; }
    }
    /// <summary>
@@ -43,7 +48,12 @@
        /// <summary>
        /// Id
        /// </summary>
        public Guid? Id { get; set; }
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选择(用户角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 上级Id
FlexJobApi.Core/Models/User/Resources/Queries/GetResourcesQuery.cs
@@ -27,6 +27,11 @@
        /// 关键字
        /// </summary>
        public string Keywords { get; set; }
        /// <summary>
        /// 角色Id
        /// </summary>
        public Guid? RoleId { get; set; }
    }
    /// <summary>
@@ -40,6 +45,11 @@
        public Guid Id { get; set; }
        /// <summary>
        /// 是否选中(用于角色授权)
        /// </summary>
        public bool IsChecked { get; set; }
        /// <summary>
        /// 微服务
        /// </summary>
        public string Service { get; set; }
FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs
@@ -51,12 +51,13 @@
            var entityType = typeof(T);
            int index = 0;
            var props = entityType.GetProperties();
            foreach (var order in orders)
            {
                if (string.IsNullOrEmpty(order.Property)) continue;
                // 获取排序字段的属性信息
                var propertyInfo = entityType.GetProperty(order.Property);
                var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase));
                if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"该排序字段{order.Property}");
                // 创建表达式树
@@ -68,15 +69,15 @@
                if (index == 0)
                {
                    // 首次排序
                    methodName = order.Order == EnumPagedListOrder.Ascending
                        ? "OrderBy"
                    methodName = order.Order == EnumPagedListOrder.Ascending
                        ? "OrderBy"
                        : "OrderByDescending";
                }
                else
                {
                    // 二次及以后排序
                    methodName = order.Order == EnumPagedListOrder.Ascending
                        ? "ThenBy"
                    methodName = order.Order == EnumPagedListOrder.Ascending
                        ? "ThenBy"
                        : "ThenByDescending";
                }
FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs
@@ -23,7 +23,7 @@
            var actionName = actionDescriptor.ActionName;
            // 设置最终的 OperationId
            operation.OperationId = $"{controllerName}-{actionName}";
            operation.OperationId = $"{actionName}";
            var returnType = context.MethodInfo.ReturnType;
FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -194,12 +194,13 @@
        <member name="M:FlexJobApi.User.Application.GetMenusQueryHandler.Handle(FlexJobApi.Core.GetMenusQuery,System.Threading.CancellationToken)">
            <inheritdoc/>
        </member>
        <member name="M:FlexJobApi.User.Application.GetMenusQueryHandler.LoopChildrens(System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem},System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem})">
        <member name="M:FlexJobApi.User.Application.GetMenusQueryHandler.LoopChildrens(System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem},System.Collections.Generic.List{FlexJobApi.Core.GetMenusQueryResultItem},System.Collections.Generic.List{System.Guid})">
            <summary>
            递归赋值下级菜单
            </summary>
            <param name="models"></param>
            <param name="all"></param>
            <param name="roleMenuIds"></param>
        </member>
        <member name="T:FlexJobApi.User.Application.GetResourceFieldsQueryHandler">
            <summary>
FlexJobApi.User.Application/Menus/Queries/GetMenuQueryHandler.cs
@@ -30,6 +30,11 @@
                .ProjectToType<GetMenuQueryResult>()
                .FirstOrDefaultAsync(cancellationToken);
            if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "该菜单");
            var roleMenuIds =
                request.RoleId.HasValue
                ? rep.Change<RoleMenu>().Where(it => it.RoleId == request.RoleId).DistinctSelect(it => it.MenuId)
                : [];
            model.IsChecked = roleMenuIds.Contains(model.Id);
            var items = await rep.AsQueryable().AsNoTracking()
                .Where(it => it.ParentId == model.Id)
                .Where(it => it.Type == EnumMenuType.Button || it.Type == EnumMenuType.Field)
@@ -40,16 +45,28 @@
                {
                    Group = it.Key,
                    ButtonLocations = it
                        .Where(it => it.Type == EnumMenuType.Button)
                        .GroupBy(it => it.Location ?? "default")
                        .Select(it => new GetMenuQueryResultButtonLocation
                        {
                            Location = it.Key,
                            Buttons = it.ToList().Adapt<List<GetMenuQueryResultButton>>()
                        .Where(l => l.Type == EnumMenuType.Button)
                        .GroupBy(l => l.Location ?? "default")
                        .Select(l => new GetMenuQueryResultButtonLocation
                        {
                            Location = l.Key,
                            Buttons = l
                                .Select(b =>
                                {
                                    b.IsChecked = roleMenuIds.Contains(b.Id);
                                    return b;
                                })
                                .ToList()
                                .Adapt<List<GetMenuQueryResultButton>>()
                        })
                        .ToList(),
                    Fields = it
                        .Where(it => it.Type == EnumMenuType.Field)
                        .Where(f => f.Type == EnumMenuType.Field)
                        .Select(f =>
                        {
                            f.IsChecked = roleMenuIds.Contains(f.Id);
                            return f;
                        })
                        .ToList()
                        .Adapt<List<GetMenuQueryResultField>>()
                })
FlexJobApi.User.Application/Menus/Queries/GetMenusQueryHandler.cs
@@ -16,20 +16,24 @@
    /// 查询菜单列表
    /// </summary>
    public class GetMenusQueryHandler(
        IRepository<Menu> menuRep)
        IRepository<Menu> rep)
        : IRequestHandler<GetMenusQuery, List<GetMenusQueryResultItem>>
    {
        private readonly IRepository<Menu> menuRep = menuRep;
        private readonly IRepository<Menu> rep = rep;
        /// <inheritdoc/>
        public async Task<List<GetMenusQueryResultItem>> Handle(GetMenusQuery request, CancellationToken cancellationToken)
        {
            var q = menuRep.AsQueryable().AsNoTracking()
            var q = rep.AsQueryable().AsNoTracking()
                .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();
            var models = all.Where(it => it.ParentId == null).ToList();
            LoopChildrens(models, all);
            var roleMenuIds =
                request.RoleId.HasValue
                ? rep.Change<RoleMenu>().Where(it => it.RoleId == request.RoleId).DistinctSelect(it => it.MenuId)
                : [];
            LoopChildrens(models, all, roleMenuIds);
            return models;
        }
@@ -38,14 +42,16 @@
        /// </summary>
        /// <param name="models"></param>
        /// <param name="all"></param>
        private void LoopChildrens(List<GetMenusQueryResultItem> models, List<GetMenusQueryResultItem> all)
        /// <param name="roleMenuIds"></param>
        private void LoopChildrens(List<GetMenusQueryResultItem> models, List<GetMenusQueryResultItem> all, List<Guid> roleMenuIds)
        {
            foreach (var item in models)
            {
                item.IsChecked = roleMenuIds.Contains(item.Id);
                item.Childrens = all.Where(it => it.ParentId == item.Id).ToList();
                if (item.Childrens.IsNotNull())
                {
                    LoopChildrens(item.Childrens, all);
                    LoopChildrens(item.Childrens, all, roleMenuIds);
                }
            }
        }
FlexJobApi.User.Application/Resources/Queries/GetResourcesQueryHandler.cs
@@ -39,6 +39,16 @@
                    || it.RequestTypeName.Contains(request.Keywords)
                    || it.ResponseTypeName.Contains(request.Keywords));
            var items = await q.ProjectToType<GetResourcesQueryResultItem>().ToListAsync();
            if (request.RoleId.HasValue)
            {
                var roleResourceIds = rep.Change<RoleResource>().Where(it => it.RoleId == request.RoleId).DistinctSelect(it => it.ResourceId);
                foreach (var item in items)
                {
                    item.IsChecked = roleResourceIds.Contains(item.Id);
                }
            }
            return items;
        }
    }