Blog.Core
Blog.Core copied to clipboard
【权限分配】给角色分配菜单保存时,特别耗时
【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;
}
嗯,很棒, 你可以帮忙提交个PR,也算是你自己的贡献了
好的,张哥,回头我把自己改过的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: @.***>
上面的代码是不是可以这样写呢?
/// <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 = "保存成功",
};
}