You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Tiobon.Web/Tiobon.Core.Api/Controllers/PermissionController.cs

798 lines
32 KiB

using Tiobon.Core.AuthHelper;
using Tiobon.Core.AuthHelper.OverWrite;
using Tiobon.Core.Common;
using Tiobon.Core.Common.Helper;
using Tiobon.Core.Common.HttpContextUser;
using Tiobon.Core.IServices;
using Tiobon.Core.Model;
using Tiobon.Core.Model.Models;
using Tiobon.Core.Repository.UnitOfWorks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Security.Claims;
namespace Tiobon.Core.Controllers
{
/// <summary>
/// 菜单管理
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class PermissionController : BaseApiController
{
readonly IUnitOfWorkManage _unitOfWorkManage;
readonly IPermissionServices _permissionServices;
readonly IModuleServices _moduleServices;
readonly IRoleModulePermissionServices _roleModulePermissionServices;
readonly IUserRoleServices _userRoleServices;
private readonly IHttpClientFactory _httpClientFactory;
readonly IHttpContextAccessor _httpContext;
readonly IUser _user;
private readonly PermissionRequirement _requirement;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="permissionServices"></param>
/// <param name="moduleServices"></param>
/// <param name="roleModulePermissionServices"></param>
/// <param name="userRoleServices"></param>
/// <param name="unitOfWorkManage"></param>
/// <param name="httpClientFactory"></param>
/// <param name="httpContext"></param>
/// <param name="user"></param>
/// <param name="requirement"></param>
public PermissionController(IPermissionServices permissionServices, IModuleServices moduleServices,
IRoleModulePermissionServices roleModulePermissionServices, IUserRoleServices userRoleServices,
IUnitOfWorkManage unitOfWorkManage,
IHttpClientFactory httpClientFactory,
IHttpContextAccessor httpContext, IUser user, PermissionRequirement requirement)
{
_permissionServices = permissionServices;
_unitOfWorkManage = unitOfWorkManage;
_moduleServices = moduleServices;
_roleModulePermissionServices = roleModulePermissionServices;
_userRoleServices = userRoleServices;
this._httpClientFactory = httpClientFactory;
_httpContext = httpContext;
_user = user;
_requirement = requirement;
}
/// <summary>
/// 获取菜单
/// </summary>
/// <param name="page"></param>
/// <param name="key"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
// GET: api/User
[HttpGet]
public async Task<MessageModel<PageModel<Permission>>> Get(int page = 1, string key = "", int pageSize = 50)
{
PageModel<Permission> permissions = new PageModel<Permission>();
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
permissions = await _permissionServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, pageSize, " Id desc ");
#region 单独处理
var apis = await _moduleServices.Query(d => d.IsDeleted == false);
var permissionsView = permissions.data;
var permissionAll = await _permissionServices.Query(d => d.IsDeleted != true);
foreach (var item in permissionsView)
{
List<long> pidarr = new()
{
item.Pid
};
if (item.Pid > 0)
{
pidarr.Add(0);
}
var parent = permissionAll.FirstOrDefault(d => d.Id == item.Pid);
while (parent != null)
{
pidarr.Add(parent.Id);
parent = permissionAll.FirstOrDefault(d => d.Id == parent.Pid);
}
item.PidArr = pidarr.OrderBy(d => d).Distinct().ToList();
foreach (var pid in item.PidArr)
{
var per = permissionAll.FirstOrDefault(d => d.Id == pid);
item.PnameArr.Add((per != null ? per.Name : "根节点") + "/");
//var par = Permissions.Where(d => d.Pid == item.Id ).ToList();
//item.PCodeArr.Add((per != null ? $"/{per.Code}/{item.Code}" : ""));
//if (par.Count == 0 && item.Pid == 0)
//{
// item.PCodeArr.Add($"/{item.Code}");
//}
}
item.MName = apis.FirstOrDefault(d => d.Id == item.Mid)?.LinkUrl;
}
permissions.data = permissionsView;
#endregion
//return new MessageModel<PageModel<Permission>>()
//{
// msg = "获取成功",
// success = permissions.dataCount >= 0,
// response = permissions
//};
return permissions.dataCount >= 0 ? Success(permissions, "获取成功") : Failed<PageModel<Permission>>("获取失败");
}
/// <summary>
/// 查询树形 Table
/// </summary>
/// <param name="f">父节点</param>
/// <param name="key">关键字</param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<MessageModel<List<Permission>>> GetTreeTable(long f = 0, string key = "")
{
List<Permission> permissions = new List<Permission>();
var apiList = await _moduleServices.Query(d => d.IsDeleted == false);
var permissionsList = await _permissionServices.Query(d => d.IsDeleted == false);
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
if (key != "")
{
permissions = permissionsList.Where(a => a.Name.Contains(key)).OrderBy(a => a.OrderSort).ToList();
}
else
{
permissions = permissionsList.Where(a => a.Pid == f).OrderBy(a => a.OrderSort).ToList();
}
foreach (var item in permissions)
{
List<long> pidarr = new() { };
var parent = permissionsList.FirstOrDefault(d => d.Id == item.Pid);
while (parent != null)
{
pidarr.Add(parent.Id);
parent = permissionsList.FirstOrDefault(d => d.Id == parent.Pid);
}
//item.PidArr = pidarr.OrderBy(d => d).Distinct().ToList();
pidarr.Reverse();
pidarr.Insert(0, 0);
item.PidArr = pidarr;
item.MName = apiList.FirstOrDefault(d => d.Id == item.Mid)?.LinkUrl;
item.hasChildren = permissionsList.Where(d => d.Pid == item.Id).Any();
}
//return new MessageModel<List<Permission>>()
//{
// msg = "获取成功",
// success = true,
// response = permissions
//};
return Success(permissions, "获取成功");
}
/// <summary>
/// 添加一个菜单
/// </summary>
/// <param name="permission"></param>
/// <returns></returns>
// POST: api/User
[HttpPost]
public async Task<MessageModel<string>> Post([FromBody] Permission permission)
{
//var data = new MessageModel<string>();
permission.CreateId = _user.ID;
permission.CreateBy = _user.Name;
var id = (await _permissionServices.Add(permission));
//data.success = id > 0;
//if (data.success)
//{
// data.response = id.ObjToString();
// data.msg = "添加成功";
//}
return id > 0 ? Success(id.ObjToString(), "添加成功") : Failed("添加失败");
}
/// <summary>
/// 保存菜单权限分配
/// </summary>
/// <param name="assignView"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<string>> Assign([FromBody] AssignView assignView)
{
if (assignView.rid > 0)
{
//开启事务
try
{
var old_rmps = await _roleModulePermissionServices.Query(d => d.RoleId == assignView.rid);
_unitOfWorkManage.BeginTran();
await _permissionServices.Db.Deleteable<RoleModulePermission>(t => t.RoleId == assignView.rid).ExecuteCommandAsync();
var permissions = await _permissionServices.Query(d => d.IsDeleted == false);
List<RoleModulePermission> new_rmps = new List<RoleModulePermission>();
var nowTime = _permissionServices.Db.GetDate();
foreach (var item in assignView.pids)
{
var moduleid = permissions.Find(p => p.Id == item)?.Mid;
var find_old_rmps = old_rmps.Find(p => p.PermissionId == item);
RoleModulePermission roleModulePermission = new RoleModulePermission()
{
IsDeleted = false,
RoleId = assignView.rid,
ModuleId = moduleid.ObjToLong(),
PermissionId = item,
CreateId = find_old_rmps == null ? _user.ID : find_old_rmps.CreateId,
CreateBy = find_old_rmps == null ? _user.Name : find_old_rmps.CreateBy,
CreateTime = find_old_rmps == null ? nowTime : find_old_rmps.CreateTime,
ModifyId = _user.ID,
ModifyBy = _user.Name,
ModifyTime = nowTime
};
new_rmps.Add(roleModulePermission);
}
if (new_rmps.Count > 0) await _roleModulePermissionServices.Add(new_rmps);
_unitOfWorkManage.CommitTran();
}
catch (Exception)
{
_unitOfWorkManage.RollbackTran();
throw;
}
_requirement.Permissions.Clear();
return Success<string>("保存成功");
}
else
{
return Failed<string>("请选择要操作的角色");
}
}
/// <summary>
/// 获取菜单树
/// </summary>
/// <param name="pid"></param>
/// <param name="needbtn"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<PermissionTree>> GetPermissionTree(long pid = 0, bool needbtn = false)
{
//var data = new MessageModel<PermissionTree>();
var permissions = await _permissionServices.Query(d => d.IsDeleted == false);
var permissionTrees = (from child in permissions
where child.IsDeleted == false
orderby child.Id
select new PermissionTree
{
value = child.Id,
label = child.Name,
Pid = child.Pid,
isbtn = child.IsButton,
order = child.OrderSort,
}).ToList();
PermissionTree rootRoot = new PermissionTree
{
value = 0,
Pid = 0,
label = "根节点"
};
permissionTrees = permissionTrees.OrderBy(d => d.order).ToList();
RecursionHelper.LoopToAppendChildren(permissionTrees, rootRoot, pid, needbtn);
//data.success = true;
//if (data.success)
//{
// data.response = rootRoot;
// data.msg = "获取成功";
//}
return Success(rootRoot, "获取成功");
//return data;
}
/// <summary>
/// 获取路由树
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<NavigationBar>> GetNavigationBar(long uid)
{
var data = new MessageModel<NavigationBar>();
long uidInHttpcontext1 = 0;
var roleIds = new List<long>();
// ids4和jwt切换
if (Permissions.IsUseIds4)
{
// ids4
uidInHttpcontext1 = (from item in _httpContext.HttpContext.User.Claims
where item.Type == ClaimTypes.NameIdentifier
select item.Value).FirstOrDefault().ObjToLong();
if (!(uidInHttpcontext1 > 0))
{
uidInHttpcontext1 = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "sub"
select item.Value).FirstOrDefault().ObjToLong();
}
roleIds = (from item in _httpContext.HttpContext.User.Claims
where item.Type == ClaimTypes.Role
select item.Value.ObjToLong()).ToList();
if (!roleIds.Any())
{
roleIds = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "role"
select item.Value.ObjToLong()).ToList();
}
}
else
{
// jwt
uidInHttpcontext1 = ((JwtHelper.SerializeJwt(_httpContext.HttpContext.Request.Headers["Authorization"].ObjToString().Replace("Bearer ", "")))?.Uid).ObjToLong();
roleIds = (await _userRoleServices.Query(d => d.IsDeleted == false && d.UserId == uid)).Select(d => d.RoleId.ObjToLong()).Distinct().ToList();
}
if (uid > 0 && uid == uidInHttpcontext1)
{
if (roleIds.Any())
{
var pids = (await _roleModulePermissionServices.Query(d => d.IsDeleted == false && roleIds.Contains(d.RoleId))).Select(d => d.PermissionId.ObjToLong()).Distinct();
if (pids.Any())
{
var rolePermissionMoudles = (await _permissionServices.Query(d => pids.Contains(d.Id))).OrderBy(c => c.OrderSort);
var temp = rolePermissionMoudles.ToList().Find(t => t.Id == 87);
var permissionTrees = (from child in rolePermissionMoudles
where child.IsDeleted == false
orderby child.Id
select new NavigationBar
{
id = child.Id,
name = child.Name,
pid = child.Pid,
order = child.OrderSort,
path = child.Code,
iconCls = child.Icon,
Func = child.Func,
IsHide = child.IsHide.ObjToBool(),
IsButton = child.IsButton.ObjToBool(),
meta = new NavigationBarMeta
{
requireAuth = true,
title = child.Name,
NoTabPage = child.IsHide.ObjToBool(),
keepAlive = child.IskeepAlive.ObjToBool()
}
}).ToList();
NavigationBar rootRoot = new NavigationBar()
{
id = 0,
pid = 0,
order = 0,
name = "根节点",
path = "",
iconCls = "",
meta = new NavigationBarMeta(),
};
permissionTrees = permissionTrees.OrderBy(d => d.order).ToList();
RecursionHelper.LoopNaviBarAppendChildren(permissionTrees, rootRoot);
data.success = true;
if (data.success)
{
data.response = rootRoot;
data.msg = "获取成功";
}
}
}
}
return data;
}
/// <summary>
/// 获取路由树
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<NavigationBarPro>>> GetNavigationBarPro(long uid)
{
var data = new MessageModel<List<NavigationBarPro>>();
long uidInHttpcontext1 = 0;
var roleIds = new List<long>();
// ids4和jwt切换
if (Permissions.IsUseIds4)
{
// ids4
uidInHttpcontext1 = (from item in _httpContext.HttpContext.User.Claims
where item.Type == ClaimTypes.NameIdentifier
select item.Value).FirstOrDefault().ObjToLong();
if (!(uidInHttpcontext1 > 0))
{
uidInHttpcontext1 = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "sub"
select item.Value).FirstOrDefault().ObjToLong();
}
roleIds = (from item in _httpContext.HttpContext.User.Claims
where item.Type == ClaimTypes.Role
select item.Value.ObjToLong()).ToList();
if (!roleIds.Any())
{
roleIds = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "role"
select item.Value.ObjToLong()).ToList();
}
}
else
{
// jwt
uidInHttpcontext1 = ((JwtHelper.SerializeJwt(_httpContext.HttpContext.Request.Headers["Authorization"].ObjToString().Replace("Bearer ", "")))?.Uid).ObjToLong();
roleIds = (await _userRoleServices.Query(d => d.IsDeleted == false && d.UserId == uid)).Select(d => d.RoleId.ObjToLong()).Distinct().ToList();
}
if (uid > 0 && uid == uidInHttpcontext1)
{
if (roleIds.Any())
{
var pids = (await _roleModulePermissionServices.Query(d => d.IsDeleted == false && roleIds.Contains(d.RoleId)))
.Select(d => d.PermissionId.ObjToLong()).Distinct();
if (pids.Any())
{
var rolePermissionMoudles = (await _permissionServices.Query(d => pids.Contains(d.Id) && d.IsButton == false)).OrderBy(c => c.OrderSort);
var permissionTrees = (from item in rolePermissionMoudles
where item.IsDeleted == false
orderby item.Id
select new NavigationBarPro
{
id = item.Id,
name = item.Name,
parentId = item.Pid,
order = item.OrderSort,
path = item.Code == "-" ? item.Name.GetTotalPingYin().FirstOrDefault() : (item.Code == "/" ? "/dashboard/workplace" : item.Code),
component = item.Pid == 0 ? (item.Code == "/" ? "dashboard/Workplace" : "RouteView") : item.Code?.TrimStart('/'),
iconCls = item.Icon,
Func = item.Func,
IsHide = item.IsHide.ObjToBool(),
IsButton = item.IsButton.ObjToBool(),
meta = new NavigationBarMetaPro
{
show = true,
title = item.Name,
icon = "user"//item.Icon
}
}).ToList();
permissionTrees = permissionTrees.OrderBy(d => d.order).ToList();
data.success = true;
if (data.success)
{
data.response = permissionTrees;
data.msg = "获取成功";
}
}
}
}
return data;
}
/// <summary>
/// 通过角色获取菜单
/// </summary>
/// <param name="rid"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<MessageModel<AssignShow>> GetPermissionIdByRoleId(long rid = 0)
{
//var data = new MessageModel<AssignShow>();
var rmps = await _roleModulePermissionServices.Query(d => d.IsDeleted == false && d.RoleId == rid);
var permissionTrees = (from child in rmps
orderby child.Id
select child.PermissionId.ObjToLong()).ToList();
var permissions = await _permissionServices.Query(d => d.IsDeleted == false);
List<string> assignbtns = new List<string>();
foreach (var item in permissionTrees)
{
var pername = permissions.FirstOrDefault(d => d.IsButton && d.Id == item)?.Name;
if (!string.IsNullOrEmpty(pername))
{
//assignbtns.Add(pername + "_" + item);
assignbtns.Add(item.ObjToString());
}
}
//data.success = true;
//if (data.success)
//{
// data.response = new AssignShow()
// {
// permissionids = permissionTrees,
// assignbtns = assignbtns,
// };
// data.msg = "获取成功";
//}
return Success(new AssignShow()
{
permissionids = permissionTrees,
assignbtns = assignbtns,
}, "获取成功");
//return data;
}
/// <summary>
/// 更新菜单
/// </summary>
/// <param name="permission"></param>
/// <returns></returns>
// PUT: api/User/5
[HttpPut]
public async Task<MessageModel<string>> Put([FromBody] Permission permission)
{
var data = new MessageModel<string>();
if (permission != null && permission.Id > 0)
{
data.success = await _permissionServices.Update(permission);
await _roleModulePermissionServices.UpdateModuleId(permission.Id, permission.Mid);
if (data.success)
{
data.msg = "更新成功";
data.response = permission?.Id.ObjToString();
}
}
return data;
}
/// <summary>
/// 删除菜单
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
// DELETE: api/ApiWithActions/5
[HttpDelete]
public async Task<MessageModel<string>> Delete(long id)
{
var data = new MessageModel<string>();
if (id > 0)
{
var userDetail = await _permissionServices.QueryById(id);
userDetail.IsDeleted = true;
data.success = await _permissionServices.Update(userDetail);
if (data.success)
{
data.msg = "删除成功";
data.response = userDetail?.Id.ObjToString();
}
}
return data;
}
/// <summary>
/// 导入多条菜单信息
/// </summary>
/// <param name="permissions"></param>
/// <returns></returns>
// POST: api/User
[HttpPost]
public async Task<MessageModel<string>> BatchPost([FromBody] List<Permission> permissions)
{
var data = new MessageModel<string>();
string ids = string.Empty;
int sucCount = 0;
for (int i = 0; i < permissions.Count; i++)
{
var permission = permissions[i];
if (permission != null)
{
permission.CreateId = _user.ID;
permission.CreateBy = _user.Name;
ids += (await _permissionServices.Add(permission));
sucCount++;
}
}
data.success = ids.IsNotEmptyOrNull();
if (data.success)
{
data.response = ids;
data.msg = $"{sucCount}条数据添加成功";
}
return data;
}
/// <summary>
/// 系统接口菜单同步接口
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<Permission>>> MigratePermission(string action = "", string token = "", string gatewayPrefix = "", string swaggerDomain = "", string controllerName = "", long pid = 0, bool isAction = false)
{
var data = new MessageModel<List<Permission>>();
if (controllerName.IsNullOrEmpty())
{
data.msg = "必须填写要迁移的所属接口的控制器名称";
return data;
}
controllerName = controllerName.TrimEnd('/').ToLower();
gatewayPrefix = gatewayPrefix.Trim();
swaggerDomain = swaggerDomain.Trim();
controllerName = controllerName.Trim();
using var client = _httpClientFactory.CreateClient();
var Configuration = swaggerDomain.IsNotEmptyOrNull() ? swaggerDomain : AppSettings.GetValue("SystemCfg:Domain");
var url = $"{Configuration}/swagger/V2/swagger.json";
if (Configuration.IsNullOrEmpty())
{
data.msg = "Swagger.json在线文件域名不能为空";
return data;
}
if (token.IsNullOrEmpty()) token = Request.Headers.Authorization;
token = token.Trim();
client.DefaultRequestHeaders.Add("Authorization", $"{token}");
var response = await client.GetAsync(url);
var body = await response.Content.ReadAsStringAsync();
var resultJObj = (JObject)JsonConvert.DeserializeObject(body);
var paths = resultJObj["paths"].ObjToString();
var pathsJObj = (JObject)JsonConvert.DeserializeObject(paths);
List<Permission> permissions = new List<Permission>();
foreach (JProperty jProperty in pathsJObj.Properties())
{
var apiPath = gatewayPrefix + jProperty.Name.ToLower();
if (action.IsNotEmptyOrNull())
{
action = action.Trim();
if (!apiPath.Contains(action.ToLower()))
{
continue;
}
}
string httpmethod = "";
if (jProperty.Value.ToString().ToLower().Contains("get"))
{
httpmethod = "get";
}
else if (jProperty.Value.ToString().ToLower().Contains("post"))
{
httpmethod = "post";
}
else if (jProperty.Value.ToString().ToLower().Contains("put"))
{
httpmethod = "put";
}
else if (jProperty.Value.ToString().ToLower().Contains("delete"))
{
httpmethod = "delete";
}
var summary = jProperty.Value?.SelectToken($"{httpmethod}.summary")?.ObjToString() ?? "";
var subIx = summary.IndexOf("(Auth");
if (subIx >= 0)
{
summary = summary.Substring(0, subIx);
}
permissions.Add(new Permission()
{
Code = " ",
Name = summary,
IsButton = true,
IsHide = false,
Enabled = true,
CreateTime = DateTime.Now,
IsDeleted = false,
Pid = pid,
Module = new Modules()
{
LinkUrl = apiPath ?? "",
Name = summary,
Enabled = true,
CreateTime = DateTime.Now,
ModifyTime = DateTime.Now,
IsDeleted = false,
}
});
}
var modulesList = (await _moduleServices.Query(d => d.IsDeleted == false && d.LinkUrl != null)).Select(d => d.LinkUrl.ToLower()).ToList();
permissions = permissions.Where(d => !modulesList.Contains(d.Module.LinkUrl.ToLower()) && d.Module.LinkUrl.Contains($"/{controllerName}/")).ToList();
if (isAction)
{
foreach (var item in permissions)
{
List<Modules> modules = await _moduleServices.Query(d => d.LinkUrl != null && d.LinkUrl.ToLower() == item.Module.LinkUrl);
if (!modules.Any())
{
var mid = await _moduleServices.Add(item.Module);
if (mid > 0)
{
item.Mid = mid;
var permissionid = await _permissionServices.Add(item);
}
}
}
data.msg = "同步完成";
}
data.response = permissions;
data.status = 200;
data.success = isAction;
return data;
}
}
public class AssignView
{
public List<long> pids { get; set; }
public long rid { get; set; }
}
public class AssignShow
{
public List<long> permissionids { get; set; }
public List<string> assignbtns { get; set; }
}
}