using Microsoft.AspNetCore.DataProtection.KeyManagement;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_DTO.System;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.BaseRepository;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.HttpContextUser;
|
using WIDESEAWCS_ISystemServices;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_Model.Models.System;
|
|
namespace WIDESEAWCS_SystemServices.System
|
{
|
public class Sys_RoleService : ServiceBase<Sys_Role, IRepository<Sys_Role>>, ISys_RoleService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly ISys_MenuService _MenuService;
|
private readonly IRepository<Sys_RoleAuth> _RoleAuthRepository;
|
public Sys_RoleService(IRepository<Sys_Role> BaseDal, ISys_MenuService MenuService, IRepository<Sys_RoleAuth> roleAuthRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_MenuService = MenuService;
|
_RoleAuthRepository = roleAuthRepository;
|
}
|
|
public List<RoleNodes> GetAllChildren(int roleId)
|
{
|
if (roleId <= 0) return new List<RoleNodes>() { };
|
var roles = GetAllRoleId();
|
if (App.User.IsRoleIdSuperAdmin(roleId)) return roles;
|
|
var list = GetChildren(roles, roleId);
|
return list;
|
}
|
|
public List<RoleNodes> GetAllRoleId()
|
{
|
List<RoleNodes> roles = BaseDal.QueryData().Select(s => new RoleNodes() { Id = s.RoleId, ParentId = s.ParentId, RoleName = s.RoleName }).ToList();
|
|
return roles;
|
}
|
|
/// <summary>
|
/// 获取所有子节点
|
/// </summary>
|
/// <param name="roleId"></param>
|
private List<RoleNodes> GetChildren(List<RoleNodes> roles, int roleId)
|
{
|
List<RoleNodes> rolesChildren = roles.Where(x => x.Id == roleId).Distinct().ToList();
|
|
for (int i = 0; i < rolesChildren.Count; i++)
|
{
|
RoleNodes node = rolesChildren[i];
|
var children = roles.Where(x => x.ParentId == node.Id && !rolesChildren.Any(c => c.Id == x.Id)).Distinct().ToList();
|
rolesChildren.AddRange(children);
|
}
|
return rolesChildren;
|
}
|
|
/// <summary>
|
/// 编辑权限时获取当前用户下的所有角色与当前用户的菜单权限
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent GetCurrentTreePermission()
|
{
|
WebResponseContent content = GetCurrentUserTreePermission();
|
int roleId = App.User.RoleId;
|
return WebResponseContent.Instance.OK(null, new
|
{
|
tree = content.Data,
|
roles = GetAllChildren(roleId)
|
});
|
}
|
|
/// <summary>
|
/// 编辑权限时,获取当前用户的所有菜单权限
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent GetCurrentUserTreePermission()
|
{
|
return GetUserTreePermission(App.User.RoleId);
|
}
|
|
/// <summary>
|
/// 编辑权限时,获取指定角色的所有菜单权限
|
/// </summary>
|
/// <param name="roleId"></param>
|
/// <returns></returns>
|
public WebResponseContent GetUserTreePermission(int roleId)
|
{
|
if (!App.User.IsRoleIdSuperAdmin(roleId) && App.User.RoleId != roleId)
|
{
|
if (!(GetAllChildren(App.User.RoleId)).Exists(x => x.Id == roleId))
|
{
|
return WebResponseContent.Instance.Error("没有权限获取此角色的权限信息");
|
}
|
}
|
//获取用户权限
|
List<Permissions> permissions = _MenuService.GetPermissions(roleId);
|
//权限用户权限查询所有的菜单信息
|
List<MenuDTO> menus = _MenuService.GetUserMenuList(roleId);
|
//获取当前用户权限如:(Add,Search)对应的显示文本信息如:Add:添加,Search:查询
|
var data = menus.Select(x => new
|
{
|
Id = x.MenuId,
|
Pid = x.ParentId,
|
Text = x.MenuName,
|
IsApp = x.MenuType == 1,
|
Actions = _MenuService.GetActions(x.MenuId, x.Actions, permissions, roleId)
|
});
|
return WebResponseContent.Instance.OK(null, data);
|
}
|
|
|
/// <summary>
|
/// 获取角色是否可进入操作页面
|
/// </summary>
|
/// <param name="roleId"></param>
|
/// <returns></returns>
|
public WebResponseContent GetUserTreeUserRole(string url)
|
{
|
List<MenuDTO> menus = _MenuService.GetUserMenuList(App.User.RoleId);
|
|
if (menus.Where(x => x.Url == url).Count() == 0)
|
{
|
return WebResponseContent.Instance.Error("该账号没有访问当前功能权限");
|
}
|
return WebResponseContent.Instance.OK();
|
}
|
|
|
/// <summary>
|
/// 保存角色权限
|
/// </summary>
|
/// <param name="userPermissions"></param>
|
/// <param name="roleId"></param>
|
/// <returns></returns>
|
public WebResponseContent SavePermission(List<UserPermissionDTO> userPermissions, int roleId)
|
{
|
WebResponseContent content = new WebResponseContent();
|
string message = "";
|
try
|
{
|
if (!GetAllChildren(App.User.RoleId).Exists(x => x.Id == roleId))
|
return WebResponseContent.Instance.Error("没有权限修改此角色的权限信息");
|
//当前用户的权限
|
List<Permissions> permissions = _MenuService.GetPermissions(App.User.RoleId);
|
|
List<int> originalMeunIds = new List<int>();
|
//被分配角色的权限
|
List<Sys_RoleAuth> roleAuths = _RoleAuthRepository.QueryData(x => x.RoleId == roleId);
|
List<Sys_RoleAuth> updateAuths = new List<Sys_RoleAuth>();
|
foreach (UserPermissionDTO x in userPermissions)
|
{
|
Permissions per = permissions.FirstOrDefault(p => p.MenuId == x.Id);
|
//不能分配超过当前用户的权限
|
if (per == null) continue;
|
//per.UserAuthArr.Contains(a.Value)校验权限范围
|
string[] arr = x.Actions == null || x.Actions.Count == 0
|
? new string[0]
|
: x.Actions.Where(a => per.UserAuthArr.Contains(a.Value))
|
.Select(s => s.Value).ToArray();
|
|
//如果当前权限没有分配过,设置Auth_Id默认为0,表示新增的权限
|
var auth = roleAuths.Where(r => r.MenuId == x.Id).Select(s => new { s.AuthId, s.AuthValue, s.MenuId }).FirstOrDefault();
|
string newAuthValue = string.Join(",", arr);
|
//权限没有发生变化则不处理
|
if (auth == null || auth.AuthValue != newAuthValue)
|
{
|
updateAuths.Add(new Sys_RoleAuth()
|
{
|
RoleId = roleId,
|
MenuId = x.Id,
|
AuthValue = string.Join(",", arr),
|
AuthId = auth == null ? 0 : auth.AuthId,
|
ModifyDate = DateTime.Now,
|
Modifier = App.User.UserName,
|
CreateDate = DateTime.Now,
|
Creater = App.User.UserName
|
});
|
}
|
else
|
{
|
originalMeunIds.Add(auth.MenuId);
|
}
|
|
}
|
//更新权限
|
_RoleAuthRepository.UpdateData(updateAuths);
|
//新增的权限
|
_RoleAuthRepository.AddData(updateAuths);
|
|
//获取权限取消的权限
|
int[] authIds = roleAuths.Where(x => userPermissions.Select(u => u.Id)
|
.ToList().Contains(x.MenuId) || originalMeunIds.Contains(x.MenuId))
|
.Select(s => s.AuthId)
|
.ToArray();
|
List<Sys_RoleAuth> delAuths = roleAuths.Where(x => x.AuthValue != "" && !authIds.Contains(x.AuthId)).ToList();
|
delAuths.ForEach(x =>
|
{
|
x.AuthValue = "";
|
});
|
//将取消的权限设置为""
|
_RoleAuthRepository.DeleteData(delAuths);
|
|
int addCount = updateAuths.Where(x => x.AuthId <= 0).Count();
|
int updateCount = updateAuths.Where(x => x.AuthId > 0).Count();
|
|
string _version = DateTime.Now.ToString("yyyyMMddHHMMssfff");
|
|
|
content.OK($"保存成功:新增加配菜单权限{addCount}条,更新菜单{updateCount}条,删除权限{delAuths.Count}条");
|
}
|
catch (Exception ex)
|
{
|
message = "异常信息:" + ex.Message + ex.StackTrace + ",";
|
}
|
|
return content;
|
}
|
}
|
}
|