using JNPF.Common.Const;
using JNPF.Common.Core.Handlers;
using JNPF.Common.Core.Manager;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Manager;
using JNPF.Common.Models.User;
using JNPF.Common.Security;
using JNPF.DatabaseAccessor;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Dto.Authorize;
using JNPF.Systems.Entitys.Model.Authorize;
using JNPF.Systems.Entitys.Model.Menu;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.Permission;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace JNPF.Systems;
///
/// 业务实现:操作权限.
///
[ApiDescriptionSettings(Tag = "Permission", Name = "Authority", Order = 170)]
[Route("api/permission/[controller]")]
public class AuthorizeService : IAuthorizeService, IDynamicApiController, ITransient
{
///
/// 权限操作表仓储.
///
private readonly ISqlSugarRepository _authorizeRepository;
///
/// 用户管理.
///
private readonly IUserManager _userManager;
///
/// 缓存管理器.
///
private readonly ICacheManager _cacheManager;
///
/// IM中心处理程序.
///
private IMHandler _imHandler;
///
/// 初始化一个类型的新实例.
///
public AuthorizeService(
ISqlSugarRepository authorizeRepository,
ICacheManager cacheManager,
IUserManager userManager,
IMHandler imHandler)
{
_authorizeRepository = authorizeRepository;
_cacheManager = cacheManager;
_userManager = userManager;
_imHandler = imHandler;
}
#region Get
///
/// 获取功能权限数据.
///
/// 模块ID.
/// 对象类型.
///
[HttpGet("Model/{itemId}/{objectType}")]
public async Task GetModelList(string itemId, string objectType)
{
IEnumerable ids = await _authorizeRepository.AsQueryable().Where(a => a.ItemId == itemId && a.ObjectType == objectType).Select(s => s.ObjectId).ToListAsync();
return new { ids };
}
///
/// 获取模块列表展示字段权限.
///
/// 模块主键.
///
[HttpGet("GetColumnsByModuleId/{moduleId}")]
public async Task GetColumnsByModuleId(string moduleId)
{
string? data = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ModuleId == moduleId).Select(x => x.FieldList).FirstAsync();
if (!string.IsNullOrEmpty(data)) return data.ToObject>();
else return new List();
}
#endregion
#region Post
///
/// 权限数据.
///
/// 对象主键.
/// 参数.
///
[HttpPost("Data/{objectId}/Values")]
public async Task GetDataValues(string objectId, [FromBody] AuthorizeDataQuery input)
{
AuthorizeDataOutput? output = new AuthorizeDataOutput();
AuthorizeModel? authorizeData = new AuthorizeModel();
string? userId = _userManager.UserId;
bool isAdmin = _userManager.IsAdministrator;
UserInfoModel? user = await _userManager.GetUserInfo();
List? menuList = await GetCurrentUserModuleAuthorize(userId, isAdmin, user.roleIds, input.moduleIds.Split(",").ToArray());
var systemIds = input.moduleIds.Split(",").ToList();
var systemList = await _authorizeRepository.AsSugarClient().Queryable()
.Where(x => x.DeleteMark == null && x.EnabledMark.Equals(1) && systemIds.Contains(x.Id))
.Select(x => new ModuleEntity()
{
Id = x.Id,
ParentId = "-1",
FullName = x.FullName,
Icon = x.Icon,
SystemId = "-1",
SortCode = x.SortCode,
}).ToListAsync();
systemList.ForEach(item =>
{
if (menuList.Any(it => it.Category.Equals("App") && it.SystemId.Equals(item.Id)))
{
var rId = Yitter.IdGenerator.YitIdHelper.NextId().ToString();
menuList.Where(it => it.Category.Equals("App") && it.ParentId.Equals("-1") && it.SystemId.Equals(item.Id)).ToList().ForEach(it =>
{
it.ParentId = rId;
});
menuList.Add(new ModuleEntity()
{
Id = rId,
FullName = "app菜单",
Icon = "ym-custom ym-custom-cellphone",
ParentId = item.Id,
Category = "App",
EnCode = "app菜单",
Type = 1,
SystemId = item.Id,
SortCode = 99999
});
}
menuList.Where(it => it.Category.Equals("Web") && it.SystemId.Equals(item.Id) && it.ParentId.Equals("-1")).ToList().ForEach(it =>
{
it.ParentId = item.Id;
});
});
menuList.AddRange(systemList);
List? moduleButtonList = await GetCurrentUserButtonAuthorize(userId, isAdmin, user.roleIds);
List? moduleColumnList = await GetCurrentUserColumnAuthorize(userId, isAdmin, user.roleIds);
List? moduleFormList = await GetCurrentUserFormAuthorize(userId, isAdmin, user.roleIds);
List? moduleDataSchemeList = await GetCurrentUserResourceAuthorize(userId, isAdmin, user.roleIds);
authorizeData.FunctionList = menuList.Adapt>();
authorizeData.ButtonList = moduleButtonList.Adapt>();
authorizeData.ColumnList = moduleColumnList.Adapt>();
authorizeData.FormList = moduleFormList.Adapt>();
authorizeData.ResourceList = moduleDataSchemeList.Adapt>();
#region 已勾选的权限id
List? authorizeList = await this.GetAuthorizeListByObjectId(objectId);
List? checkSystemList = authorizeList.Where(o => o.ItemType.Equals("system")).Select(m => m.ItemId).ToList();
List? checkModuleList = authorizeList.Where(o => o.ItemType.Equals("module")).Select(m => m.ItemId).ToList();
List? checkButtonList = authorizeList.Where(o => o.ItemType.Equals("button")).Select(m => m.ItemId).ToList();
List? checkColumnList = authorizeList.Where(o => o.ItemType.Equals("column")).Select(m => m.ItemId).ToList();
List? checkFormList = authorizeList.Where(o => o.ItemType.Equals("form")).Select(m => m.ItemId).ToList();
List? checkResourceList = authorizeList.Where(o => o.ItemType.Equals("resource")).Select(m => m.ItemId).ToList();
#endregion
List? moduleList = new List();
List? childNodesIds = new List();
switch (input.type)
{
case "system":
systemIds = await _authorizeRepository.AsQueryable().Where(o => o.ItemType.Equals("system") && user.roleIds.Contains(o.ObjectId)).Select(o => o.ItemId).ToListAsync();
output.list = await _authorizeRepository.AsSugarClient().Queryable()
.Where(x => x.DeleteMark == null && x.EnabledMark.Equals(1))
.WhereIF(!user.isAdministrator, x => systemIds.Contains(x.Id))
.Select(x => new AuthorizeDataModelOutput()
{
id = x.Id,
fullName = x.FullName,
icon = x.Icon,
sortCode = x.SortCode
}).ToListAsync();
output.all = output.list.Select(x => x.id).ToList();
output.ids = checkSystemList;
return output;
case "module":
List? authorizeDataModuleList = authorizeData.FunctionList.Adapt>();
GetOutPutResult(ref output, authorizeDataModuleList, checkModuleList);
return GetResult(output);
case "button":
if (string.IsNullOrEmpty(input.moduleIds))
{
return output;
}
else
{
List? moduleIdList = new List(input.moduleIds.Split(","));
moduleIdList.ForEach(ids =>
{
ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids);
if (moduleEntity != null) moduleList.Add(moduleEntity);
});
// 勾选的菜单末级节点菜单id集合
childNodesIds = GetChildNodesId(moduleList);
}
moduleList = await GetModuleAndSystemScheme(moduleList, menuList);
output = GetButton(moduleList, moduleButtonList, childNodesIds, checkButtonList);
return GetResult(output);
case "column":
if (string.IsNullOrEmpty(input.moduleIds))
{
return output;
}
else
{
List? moduleIdList = new List(input.moduleIds.Split(","));
moduleIdList.ForEach(ids =>
{
ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids);
if (moduleEntity != null) moduleList.Add(moduleEntity);
});
// 子节点菜单id集合
childNodesIds = GetChildNodesId(moduleList);
}
moduleList = await GetModuleAndSystemScheme(moduleList, menuList);
output = GetColumn(moduleList, moduleColumnList, childNodesIds, checkColumnList);
return GetResult(output);
case "form":
if (string.IsNullOrEmpty(input.moduleIds))
{
return output;
}
else
{
List? moduleIdList = new List(input.moduleIds.Split(","));
moduleIdList.ForEach(ids =>
{
ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids);
if (moduleEntity != null) moduleList.Add(moduleEntity);
});
// 子节点菜单id集合
childNodesIds = GetChildNodesId(moduleList);
}
moduleList = await GetModuleAndSystemScheme(moduleList, menuList);
output = GetForm(moduleList, moduleFormList, childNodesIds, checkFormList);
return GetResult(output);
case "resource":
if (string.IsNullOrEmpty(input.moduleIds))
{
return output;
}
else
{
List? moduleIdList = new List(input.moduleIds.Split(","));
moduleIdList.ForEach(ids =>
{
ModuleEntity? moduleEntity = menuList.Find(m => m.Id == ids);
if (moduleEntity != null) moduleList.Add(moduleEntity);
});
// 子节点菜单id集合
childNodesIds = GetChildNodesId(moduleList);
}
moduleList = await GetModuleAndSystemScheme(moduleList, menuList);
output = GetResource(moduleList, moduleDataSchemeList, childNodesIds, checkResourceList);
return GetResult(output);
default:
return output;
}
}
///
/// 设置或更新岗位/角色/用户权限.
///
/// 参数.
/// 参数.
///
[HttpPut("Data/{objectId}")]
public async Task UpdateData(string objectId, [FromBody] AuthorizeDataUpInput input)
{
#region 分级权限验证
if (input.objectType.Equals("Role") && !_userManager.IsAdministrator)
{
RoleEntity? oldRole = await _authorizeRepository.AsSugarClient().Queryable().FirstAsync(x => x.Id.Equals(objectId));
if (oldRole.GlobalMark == 1) throw Oops.Oh(ErrorCode.D1612); // 全局角色 只能超管才能变更
}
if (input.objectType.Equals("Position") || input.objectType.Equals("Role"))
{
var orgIds = new List();
if (input.objectType.Equals("Position")) orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.Id.Equals(objectId)).Select(x => x.OrganizeId).ToListAsync();
if (input.objectType.Equals("Role")) orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ObjectId.Equals(objectId) && x.ObjectType == input.objectType).Select(x => x.OrganizeId).ToListAsync();
if (!_userManager.DataScope.Any(it => orgIds.Contains(it.organizeId) && it.Edit) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013); // 分级管控
}
#endregion
input.button = input.button.Except(input.module).ToList();
input.column = input.column.Except(input.module).ToList();
input.form = input.form.Except(input.module).ToList();
input.resource = input.resource.Except(input.module).ToList();
List? authorizeList = new List();
AddAuthorizeEntity(ref authorizeList, input.systemIds, objectId, input.objectType, "system");
AddAuthorizeEntity(ref authorizeList, input.module, objectId, input.objectType, "module");
AddAuthorizeEntity(ref authorizeList, input.button, objectId, input.objectType, "button");
AddAuthorizeEntity(ref authorizeList, input.column, objectId, input.objectType, "column");
AddAuthorizeEntity(ref authorizeList, input.form, objectId, input.objectType, "form");
AddAuthorizeEntity(ref authorizeList, input.resource, objectId, input.objectType, "resource");
// 删除除了门户外的相关权限
await _authorizeRepository.DeleteAsync(a => a.ObjectId == objectId && !a.ItemType.Equals("portal"));
if (authorizeList.Count > 0)
{
// 新增权限
await _authorizeRepository.AsSugarClient().Insertable(authorizeList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
// 编辑角色权限退出角色的登录用户
if (input.objectType.Equals("Role")) await ForcedOffline(new List() { objectId });
}
///
/// 批量设置权限.
///
/// 参数.
///
[HttpPost("Data/Batch")]
public async Task BatchData([FromBody] AuthorizeDataBatchInput input)
{
#region 分级权限验证
// 获取所有角色
var allRole = await _authorizeRepository.AsSugarClient().Queryable().Where(x => input.roleIds.Contains(x.Id)).ToListAsync();
if (allRole.Any(x => x.GlobalMark.Equals(1)) && !_userManager.IsAdministrator) throw Oops.Oh(ErrorCode.D1612); // 全局角色 只能超管才能变更
// 获取组织角色 所属组织
var orgIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => allRole.Select(x => x.Id).Contains(x.ObjectId) && x.ObjectType.Equals("Role")).Select(x => x.OrganizeId).ToListAsync();
if (!_userManager.DataScope.Any(it => orgIds.Contains(it.organizeId) && it.Edit) && !_userManager.IsAdministrator)
throw Oops.Oh(ErrorCode.D1013); // 分级管控
#endregion
// 计算按钮、列表、资源三个集合内不包含菜单ID的差
input.button = input.button.Except(input.module).ToList();
input.column = input.column.Except(input.module).ToList();
input.form = input.form.Except(input.module).ToList();
input.resource = input.resource.Except(input.module).ToList();
// 拼装权限集合
List? authorizeItemList = new List();
List? authorizeObejctList = new List();
BatchAddAuthorizeEntity(ref authorizeItemList, input.systemIds, "system", true);
BatchAddAuthorizeEntity(ref authorizeItemList, input.module, "module", true);
BatchAddAuthorizeEntity(ref authorizeItemList, input.button, "button", true);
BatchAddAuthorizeEntity(ref authorizeItemList, input.column, "column", true);
BatchAddAuthorizeEntity(ref authorizeItemList, input.form, "form", true);
BatchAddAuthorizeEntity(ref authorizeItemList, input.resource, "resource", true);
BatchAddAuthorizeEntity(ref authorizeObejctList, input.positionIds, "Position", false);
BatchAddAuthorizeEntity(ref authorizeObejctList, input.roleIds, "Role", false);
BatchAddAuthorizeEntity(ref authorizeObejctList, input.userIds, "User", false);
List? data = new List();
SeveBatch(ref data, authorizeObejctList, authorizeItemList);
// 获取已有权限集合
List? existingRoleData = await _authorizeRepository.AsQueryable().Where(x => input.roleIds.Contains(x.ObjectId) && x.ObjectType.Equals("Role")).ToListAsync();
// 计算新增菜单集合与已有权限集合差
data = data.Except(existingRoleData).ToList();
// 数据不为空添加
if (data.Count > 0)
{
// 新增权限
int num = await _authorizeRepository.AsSugarClient().Insertable(data).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
// 编辑角色权限退出角色的登录用户
await ForcedOffline(input.roleIds);
}
///
/// 设置/更新功能权限.
///
///
///
///
[HttpPut("Model/{itemId}")]
public async Task UpdateModel(string itemId, [FromBody] AuthorizeModelInput input)
{
List? authorizeList = new List();
try
{
_authorizeRepository.AsSugarClient().Ado.BeginTran();
// 角色ID不为空
if (input.objectId.Count > 0)
{
input.objectId.ForEach(item =>
{
AuthorizeEntity? entity = new AuthorizeEntity();
entity.Id = SnowflakeIdHelper.NextId();
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
entity.ItemId = itemId;
entity.ItemType = input.itemType;
entity.ObjectId = item;
entity.ObjectType = input.objectType;
entity.SortCode = input.objectId.IndexOf(item);
authorizeList.Add(entity);
});
// 删除除了门户外的相关权限
await _authorizeRepository.DeleteAsync(a => a.ItemId == itemId);
// 新增权限
await _authorizeRepository.AsSugarClient().Insertable(authorizeList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
else
{
// 删除除了门户外的相关权限
await _authorizeRepository.DeleteAsync(a => a.ItemId == itemId);
}
_authorizeRepository.AsSugarClient().Ado.CommitTran();
}
catch
{
_authorizeRepository.AsSugarClient().Ado.RollbackTran();
}
if(input.objectId.Any()) await ForcedOffline(input.objectId); // 编辑角色权限退出角色的登录用户
}
///
/// 设置模块列表展示字段权限.
///
/// 参数.
///
[HttpPut("SetColumnsByModuleId")]
public async Task SetColumnsByModuleId([FromBody] ColumnsPurviewDataUpInput input)
{
ColumnsPurviewEntity? entity = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ModuleId == input.moduleId).FirstAsync();
if (entity == null) entity = new ColumnsPurviewEntity();
entity.FieldList = input.fieldList;
entity.ModuleId = input.moduleId;
if (entity.Id.IsNotEmptyOrNull())
{
// 更新
int newEntity = await _authorizeRepository.AsSugarClient().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
}
else
{
entity.Id = SnowflakeIdHelper.NextId();
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
await _authorizeRepository.AsSugarClient().Insertable(entity).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
}
#endregion
#region PrivateMethod
///
/// 添加权限接口参数组装.
///
/// 返回参数.
/// 权限数据id.
/// 对象ID.
/// 分类.
/// 权限分类.
private void AddAuthorizeEntity(ref List list, List itemIds, string objectId, string objectType, string itemType)
{
foreach (string? item in itemIds)
{
AuthorizeEntity? entity = new AuthorizeEntity();
entity.Id = SnowflakeIdHelper.NextId();
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
entity.ItemId = item;
entity.ObjectId = objectId;
entity.ItemType = itemType;
entity.ObjectType = objectType;
entity.SortCode = itemIds.IndexOf(item);
list.Add(entity);
}
}
///
/// 批量添加权限接口参数组装.
///
/// 返回参数.
/// 来源数据.
/// 来源类型.
/// 是否是权限数据.
private void BatchAddAuthorizeEntity(ref List list, List ids, string type, bool isData)
{
if (ids != null && ids.Count != 0)
{
if (isData)
{
foreach (string? item in ids)
{
AuthorizeEntity? entity = new AuthorizeEntity();
entity.ItemId = item;
entity.ItemType = type;
list.Add(entity);
}
}
else
{
foreach (string? item in ids)
{
AuthorizeEntity? entity = new AuthorizeEntity();
entity.ObjectId = item;
entity.ObjectType = type;
list.Add(entity);
}
}
}
}
///
/// 保存批量权限.
///
/// 返回list.
/// 对象数据.
/// 权限数据.
private void SeveBatch(ref List list, List objectList, List authorizeList)
{
foreach (AuthorizeEntity? objectItem in objectList)
{
foreach (AuthorizeEntity entityItem in authorizeList)
{
AuthorizeEntity? entity = new AuthorizeEntity();
entity.Id = SnowflakeIdHelper.NextId();
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
entity.ItemId = entityItem.ItemId;
entity.ItemType = entityItem.ItemType;
entity.ObjectId = objectItem.ObjectId;
entity.ObjectType = objectItem.ObjectType;
entity.SortCode = authorizeList.IndexOf(entityItem);
list.Add(entity);
}
}
}
///
/// 返回参数处理.
///
/// 返回参数.
/// 返回参数数据.
/// 已勾选的id.
///
private void GetOutPutResult(ref AuthorizeDataOutput output, List list, List checkList, string parentId = "-1")
{
output.all = list.Select(l => l.id).ToList();
output.ids = checkList.Intersect(output.all).ToList();
output.list = list.OrderBy(x => x.sortCode).ToList().ToTree(parentId);
}
///
/// 获取子节点菜单id.
///
///
///
private List GetChildNodesId(List moduleEntitiesList)
{
List? ids = moduleEntitiesList.Select(m => m.Id).ToList();
List? pids = moduleEntitiesList.Select(m => m.ParentId).ToList();
List? childNodesIds = ids.Where(x => !pids.Contains(x) && moduleEntitiesList.Find(m => m.Id == x).ParentId != "-1").ToList();
return childNodesIds.Union(ids).ToList();
}
///
/// 过滤菜单权限数据.
///
/// 其他权限数据菜单id集合.
/// 勾选菜单权限数据.
/// 返回值.
private void GetParentsModuleList(List childNodesIds, List moduleList, ref List output)
{
// 获取有其他权限的菜单末级节点id
List? authorizeModuleData = moduleList.Adapt>();
foreach (string? item in childNodesIds)
{
GteModuleListById(item, authorizeModuleData, output);
}
output = output.Distinct().ToList();
}
///
/// 根据菜单id递归获取authorizeDataOutputModel的父级菜单.
///
/// 菜单id.
/// 选中菜单集合.
/// 返回数据.
private void GteModuleListById(string id, List authorizeDataOutputModel, List output)
{
AuthorizeDataModelOutput? data = authorizeDataOutputModel.Find(l => l.id == id);
if (data != null)
{
if (data.parentId != "-1")
{
if (!output.Contains(data)) output.Add(data);
GteModuleListById(data.parentId, authorizeDataOutputModel, output);
}
else
{
if (!output.Contains(data)) output.Add(data);
}
}
}
///
/// 按钮权限.
///
/// 选中的菜单.
/// 所有的按钮.
///
///
///
private AuthorizeDataOutput GetButton(List moduleList, List moduleButtonList, List childNodesIds, List checkList)
{
AuthorizeDataOutput? output = new AuthorizeDataOutput();
List? buttonList = new List();
childNodesIds.ForEach(ids =>
{
List? buttonEntity = moduleButtonList.FindAll(m => m.ModuleId == ids);
if (buttonEntity.Count != 0)
{
buttonEntity.ForEach(bt =>
{
bt.Icon = string.Empty;
if (bt.ParentId.Equals("-1"))
{
bt.ParentId = ids;
}
});
buttonList = buttonList.Union(buttonEntity).ToList();
}
});
List? authorizeDataButtonList = buttonList.Adapt>();
List? authorizeDataModuleList = new List();
// 末级菜单id集合
List? moduleIds = buttonList.Select(b => b.ModuleId).ToList().Distinct().ToList();
GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList);
List? list = authorizeDataModuleList.Union(authorizeDataButtonList).ToList();
GetOutPutResult(ref output, list, checkList);
return output;
}
///
/// 列表权限.
///
/// 选中的菜单.
/// 所有的列表.
///
///
///
private AuthorizeDataOutput GetColumn(List moduleList, List moduleColumnEntity, List childNodesIds, List checkList)
{
AuthorizeDataOutput? output = new AuthorizeDataOutput();
List? columnList = new List();
childNodesIds.ForEach(ids =>
{
List? columnEntity = moduleColumnEntity.FindAll(m => m.ModuleId == ids);
if (columnEntity.Count != 0)
{
columnEntity.ForEach(bt =>
{
bt.ParentId = ids;
});
columnList = columnList.Union(columnEntity).ToList();
}
});
List? authorizeDataColumnList = columnList.Adapt>();
List? authorizeDataModuleList = new List();
List? moduleIds = columnList.Select(b => b.ModuleId).ToList().Distinct().ToList();
GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList);
List? list = authorizeDataModuleList.Union(authorizeDataColumnList).ToList();
GetOutPutResult(ref output, list, checkList);
return output;
}
///
/// 表单权限.
///
///
private AuthorizeDataOutput GetForm(List moduleList, List moduleFormEntity, List childNodesIds, List checkList)
{
AuthorizeDataOutput? output = new AuthorizeDataOutput();
List? formList = new List();
childNodesIds.ForEach(ids =>
{
List? formEntity = moduleFormEntity.FindAll(m => m.ModuleId == ids);
if (formEntity.Count != 0)
{
formEntity.ForEach(bt =>
{
bt.ParentId = ids;
});
formList = formList.Union(formEntity).ToList();
}
});
List? authorizeDataFormList = formList.Adapt>();
List? authorizeDataModuleList = new List();
List? moduleIds = formList.Select(b => b.ModuleId).ToList().Distinct().ToList();
GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList);
List? list = authorizeDataModuleList.Union(authorizeDataFormList).ToList();
GetOutPutResult(ref output, list, checkList);
return output;
}
///
/// 数据权限.
///
///
///
///
///
///
private AuthorizeDataOutput GetResource(List moduleList, List moduleResourceEntity, List childNodesIds, List checkList)
{
List? moduleIds = new List();
AuthorizeDataOutput? output = new AuthorizeDataOutput();
List? authorizeDataResourceList = new List();
childNodesIds.ForEach(ids =>
{
List? resourceEntity = moduleResourceEntity.FindAll(m => m.ModuleId == ids);
if (resourceEntity.Count != 0)
{
moduleIds.Add(ids);
List? entity = resourceEntity.Adapt>();
entity.ForEach(e => e.parentId = ids);
authorizeDataResourceList = authorizeDataResourceList.Union(entity).ToList();
}
});
List? authorizeDataModuleList = new List();
GetParentsModuleList(moduleIds, moduleList, ref authorizeDataModuleList);
List? list = authorizeDataModuleList.Union(authorizeDataResourceList).ToList();
GetOutPutResult(ref output, list, checkList);
return output;
}
///
/// 强制角色下的所有用户下线.
///
/// 角色Id.
///
private async Task ForcedOffline(List roleId)
{
// 查找该角色下的所有成员id
var roleUserIds = await _authorizeRepository.AsSugarClient().Queryable().Where(x => x.ObjectType == "Role" && roleId.Contains(x.ObjectId)).Select(x => x.UserId).ToListAsync();
roleUserIds.ForEach(async id =>
{
var tenantId = _userManager.TenantId;
var list = await GetOnlineUserList(tenantId);
var user = list.Find(it => it.tenantId == tenantId && it.userId == id);
if (user != null)
{
await _imHandler.SendMessageAsync(user.connectionId, new { method = "logout", msg = "此账号已在其他地方登陆" }.ToJsonString());
await DelOnlineUser(tenantId, user.userId);
await DelUserInfo(tenantId, user.userId);
}
});
}
#endregion
#region PublicMethod
///
/// 当前用户模块权限.
///
/// 用户ID.
/// 是否超管.
/// 用户角色Ids.
/// 当前系统Ids .
///
[NonAction]
public async Task> GetCurrentUserModuleAuthorize(string userId, bool isAdmin, string[] roleIds, string[] systemIds)
{
List? output = new List();
if (!isAdmin)
{
var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "module" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
if (items.Count == 0) return output;
output = await _authorizeRepository.AsSugarClient().Queryable()
.Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null)
.Where(a => systemIds.Contains(a.SystemId)).OrderBy(o => o.SortCode).ToListAsync();
}
else
{
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null)
.Where(a => systemIds.Contains(a.SystemId)).OrderBy(o => o.SortCode).ToListAsync();
}
return output;
}
///
/// 当前用户模块按钮权限.
///
/// 用户ID.
/// 是否超管.
/// 用户角色Ids.
///
[NonAction]
public async Task> GetCurrentUserButtonAuthorize(string userId, bool isAdmin, string[] roleIds)
{
List? output = new List();
if (!isAdmin)
{
var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "button" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
if (items.Count == 0) return output;
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ParentId.Equals("-1") ? a.ModuleId : a.ParentId;
}).ToListAsync();
}
else
{
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ParentId.Equals("-1") ? a.ModuleId : a.ParentId;
}).ToListAsync();
}
return output;
}
///
/// 当前用户模块列权限.
///
/// 用户ID.
/// 是否超管.
/// 用户角色Ids.
///
[NonAction]
public async Task> GetCurrentUserColumnAuthorize(string userId, bool isAdmin, string[] roleIds)
{
List? output = new List();
if (!isAdmin)
{
var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "column" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
if (items.Count == 0) return output;
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ModuleId;
}).ToListAsync();
}
else
{
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ModuleId;
}).ToListAsync();
}
return output;
}
///
/// 当前用户模块表单权限.
///
/// 用户ID.
/// 是否超管.
/// 用户角色Ids.
///
[NonAction]
public async Task> GetCurrentUserFormAuthorize(string userId, bool isAdmin, string[] roleIds)
{
List? output = new List();
if (!isAdmin)
{
var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "form" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
if (items.Count == 0) return output;
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ModuleId;
}).ToListAsync();
}
else
{
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode)
.Mapper(a =>
{
a.ParentId = a.ModuleId;
}).ToListAsync();
}
return output;
}
///
/// 当前用户模块权限资源.
///
/// 用户ID.
/// 是否超管.
/// 用户角色Ids.
///
[NonAction]
public async Task> GetCurrentUserResourceAuthorize(string userId, bool isAdmin, string[] roleIds)
{
List? output = new List();
if (!isAdmin)
{
var items = await _authorizeRepository.AsQueryable().Where(a => a.ItemType == "resource" && roleIds.Contains(a.ObjectId)).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
if (items.Count == 0) return output;
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => items.Select(it => it.ItemId).ToArray().Contains(a.Id) && a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync();
}
else
{
output = await _authorizeRepository.AsSugarClient().Queryable().Where(a => a.EnabledMark == 1 && a.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync();
}
return output;
}
///
/// 获取权限项ids.
///
/// 角色id.
/// 项类型.
///
[NonAction]
public async Task> GetAuthorizeItemIds(string roleId, string itemType)
{
var data = await _authorizeRepository.AsQueryable().Where(a => a.ObjectId == roleId && a.ItemType == itemType).GroupBy(it => new { it.ItemId }).Select(it => new { it.ItemId }).ToListAsync();
return data.Select(it => it.ItemId).ToList();
}
///
/// 是否存在权限资源.
///
///
///
[NonAction]
public async Task GetIsExistModuleDataAuthorizeScheme(string[] ids)
{
return await _authorizeRepository.AsSugarClient().Queryable().AnyAsync(m => ids.Contains(m.Id) && m.DeleteMark == null);
}
///
/// 获取权限列表.
///
/// 对象主键.
///
[NonAction]
public async Task> GetAuthorizeListByObjectId(string objectId)
{
return await _authorizeRepository.AsQueryable().Where(a => a.ObjectId == objectId).ToListAsync();
}
///
/// 处理菜单+系统.
///
///
///
///
public async Task> GetModuleAndSystemScheme(List moduleList, List systemList)
{
var moduleSystemList = systemList.Where(x => x.SystemId != null && x.SystemId.Equals("-1")).ToList();
moduleSystemList.ForEach(item =>
{
if (moduleList.Any(it => it.Category != null && it.Category.Equals("App") && it.SystemId.Equals(item.Id)))
{
var appMenu = systemList.FirstOrDefault(it => it.ParentId.Equals(item.Id) && it.Category.Equals("App"));
moduleList.Where(it => it.Category != null && it.Category.Equals("App") && it.ParentId.Equals("-1") && it.SystemId.Equals(item.Id)).ToList().ForEach(it =>
{
it.ParentId = appMenu.Id;
});
moduleList.Add(appMenu);
}
moduleList.Where(it => it.Category != null && it.Category.Equals("Web") && it.SystemId.Equals(item.Id) && it.ParentId.Equals("-1")).ToList().ForEach(it =>
{
it.ParentId = item.Id;
});
});
moduleList.Where(x => x.ParentId.Equals("-1")).ToList().ForEach(item => item.ParentId = item.SystemId);
moduleList.AddRange(moduleSystemList);
return moduleList;
}
///
/// 处理app菜单 勾选问题,返回最终结果.
///
///
///
public AuthorizeDataOutput GetResult(AuthorizeDataOutput output)
{
if (output.list.Any())
{
output.list.ForEach(item =>
{
var appItem = item.children?.Adapt>().FirstOrDefault(x => !output.ids.Contains(x.id) && x.fullName.Equals("app菜单"));
if (appItem != null)
{
foreach (var it in output.ids)
{
if (appItem.ToJsonString().Contains(it))
{
output.ids.Add(appItem.id);
break;
}
}
}
});
}
return output;
}
///
/// 获取在线用户列表.
///
/// 租户ID.
///
public async Task> GetOnlineUserList(string tenantId)
{
var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
return await _cacheManager.GetAsync>(cacheKey);
}
///
/// 删除在线用户ID.
///
/// 租户ID.
/// 用户ID.
///
private async Task DelOnlineUser(string tenantId, string userId)
{
var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId);
var list = await _cacheManager.GetAsync>(cacheKey);
var online = list.Find(it => it.userId == userId);
list.RemoveAll((x) => x.connectionId == online.connectionId);
return await _cacheManager.SetAsync(cacheKey, list);
}
///
/// 删除用户登录信息缓存.
///
/// 租户ID.
/// 用户ID.
///
private async Task DelUserInfo(string tenantId, string userId)
{
var cacheKey = string.Format("{0}{1}_{2}", CommonConst.CACHEKEYUSER, tenantId, userId);
return await _cacheManager.DelAsync(cacheKey);
}
#endregion
}