Blog.Core icon indicating copy to clipboard operation
Blog.Core copied to clipboard

【权限分配】给角色分配菜单保存时,特别耗时

Open harryckl opened this issue 2 years ago • 3 comments

【PermissionController】中【Assign】我改了代码如下:

  /// <summary>
        /// 保存菜单权限分配
        /// </summary>
        /// <param name="assignView"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<MessageModel<string>> Assign([FromBody] AssignView assignView)
        {
            var data = new MessageModel<string>();
            if (assignView.rid > 0)
            {
                //重新赋予的菜单按钮集合
                var currentownpermissionIdlist = assignView.pids;

                //该角色拥有的菜单按钮
                var oldownpermissionlist = await _roleModulePermissionServices.Query(d => d.RoleId == assignView.rid);
                var oldownpermissionIdlist = oldownpermissionlist.Select(p => p.PermissionId).ToList();

                // 求交集 不用管交集里面的
                var commonpermissionIds = currentownpermissionIdlist.Intersect(oldownpermissionIdlist).ToList();

                #region 差集1 (现在传入的菜单按钮集合在原来拥有的集合内不存在,需要新增的)
                var cha1 = currentownpermissionIdlist.Except(oldownpermissionIdlist).ToList();
                var permissions = await _permissionServices.Query(p => cha1.Contains(p.Id));
                var entitylist = new List<RoleModulePermission>();
                foreach (var item in permissions)
                {
                    RoleModulePermission roleModulePermission = new RoleModulePermission()
                    {
                        IsDeleted = false,
                        RoleId = assignView.rid,
                        ModuleId = item.Mid,
                        PermissionId = item.Id,
                    };
                    roleModulePermission.CreateId = _user.ID;
                    roleModulePermission.CreateBy = _user.Name;
                    entitylist.Add(roleModulePermission);
                }
                if (entitylist.Count > 0)
                {
                    data.success = (await _roleModulePermissionServices.Add(entitylist)) > 0;
                }
                else
                {
                    data.success = true;
                }
                #endregion

                #region 差集2(原来拥有的菜单按钮集合,现在被取消授权的,需要删除)
                var cha2 = oldownpermissionIdlist.Except(currentownpermissionIdlist).ToList();
                var dellist = await _roleModulePermissionServices.Query(p => p.RoleId == assignView.rid && cha2.Contains(p.PermissionId));
                if (dellist.Any())
                {
                    data.success = await _roleModulePermissionServices.Delete(dellist);
                }
                else
                {
                    data.success = true;
                }
                #endregion          

                if (data.success)
                {
                    _requirement.Permissions.Clear();
                    data.response = "";
                    data.msg = "保存成功";
                }

            }


            return data;
        }

harryckl avatar Apr 21 '22 14:04 harryckl

嗯,很棒, 你可以帮忙提交个PR,也算是你自己的贡献了

anjoy8 avatar Apr 23 '22 04:04 anjoy8

好的,张哥,回头我把自己改过的pr一下

| | ckl | | @.*** |

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2022年04月23日 12:19 | | 收件人 | @.> | | 抄送至 | @.@.> | | 主题 | Re: [anjoy8/Blog.Core] 【权限分配】给角色分配菜单保存时,特别耗时 (Issue #273) |

嗯,很棒, 你可以帮忙提交个PR,也算是你自己的贡献了

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

harryckl avatar Apr 23 '22 05:04 harryckl

上面的代码是不是可以这样写呢?

/// <summary>
/// 保存菜单权限分配
/// </summary>
/// <param name="assignView"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Assign([FromBody] AssignView assignView)
{
    // var data = new MessageModel<string>(); 变量在需要时再声明

    // 在一些验证不通过时及时返回错误
    if (assignView.rid <= 0) 
        return new MessageModel<string>(); 

    // 将主逻辑代码放在主作用域

    //重新赋予的菜单按钮集合
    var currentownpermissionIdlist = assignView.pids;

    //该角色拥有的菜单按钮
    var oldownpermissionlist = await _roleModulePermissionServices.Query(d => d.RoleId == assignView.rid);
    var oldownpermissionIdlist = oldownpermissionlist.Select(p => p.PermissionId).ToList();

    // 求交集 不用管交集里面的
    var commonpermissionIds = currentownpermissionIdlist.Intersect(oldownpermissionIdlist).ToList();

    #region 差集1 (现在传入的菜单按钮集合在原来拥有的集合内不存在,需要新增的)
    var cha1 = currentownpermissionIdlist.Except(oldownpermissionIdlist).ToList();
    var permissions = await _permissionServices.Query(p => cha1.Contains(p.Id));
    var entitylist = new List<RoleModulePermission>();
    foreach (var item in permissions)
    {
        RoleModulePermission roleModulePermission = new RoleModulePermission()
        {
            IsDeleted = false,
            RoleId = assignView.rid,
            ModuleId = item.Mid,
            PermissionId = item.Id,
        };
        roleModulePermission.CreateId = _user.ID;
        roleModulePermission.CreateBy = _user.Name;
        entitylist.Add(roleModulePermission);
    }

    // 修改理由如上
    // 此处修改未必正确,需要结合原本逻辑自行调整
    if (entitylist.Count > 0 && (await _roleModulePermissionServices.Add(entitylist)) <= 0)
        return new MessageModel<string>();

    #endregion

    #region 差集2(原来拥有的菜单按钮集合,现在被取消授权的,需要删除)
    var cha2 = oldownpermissionIdlist.Except(currentownpermissionIdlist).ToList();
    var dellist = await _roleModulePermissionServices.Query(p => p.RoleId == assignView.rid && cha2.Contains(p.PermissionId));

    // 修改理由如上
    if (dellist.Any() && !await _roleModulePermissionServices.Delete(dellist))
        return new MessageModel<string>();

    #endregion

    _requirement.Permissions.Clear();

    // 将真正的happy path放在主作用域中返回
    return new MessageModel<string>()
    {
        success = true,
        response = "",
        msg = "保存成功",
    };
}

Silence-Qiu avatar May 23 '22 03:05 Silence-Qiu