using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using New_College.AuthHelper;
using New_College.AuthHelper.OverWrite;
using New_College.Common.Helper;
using New_College.Common.HttpContextUser;
using New_College.IServices;
using New_College.Model;
using New_College.Model.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace New_College.Controllers
{
///
/// 菜单管理
///
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class PermissionController : ControllerBase
{
readonly IPermissionServices _permissionServices;
readonly IModuleServices _moduleServices;
readonly IRoleModulePermissionServices _roleModulePermissionServices;
readonly IUserRoleServices _userRoleServices;
readonly IHttpContextAccessor _httpContext;
readonly IUser _user;
private readonly PermissionRequirement _requirement;
///
/// 构造函数
///
///
///
///
///
///
///
///
public PermissionController(IPermissionServices permissionServices, IModuleServices moduleServices, IRoleModulePermissionServices roleModulePermissionServices, IUserRoleServices userRoleServices, IHttpContextAccessor httpContext, IUser user, PermissionRequirement requirement)
{
_permissionServices = permissionServices;
_moduleServices = moduleServices;
_roleModulePermissionServices = roleModulePermissionServices;
_userRoleServices = userRoleServices;
_httpContext = httpContext;
_user = user;
_requirement = requirement;
}
///
/// 获取菜单
///
///
///
///
// GET: api/User
[HttpGet]
public async Task>> Get(int page = 1, string key = "")
{
PageModel permissions = new PageModel();
int intPageSize = 50;
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
{
key = "";
}
#region 舍弃
//var permissions = await _permissionServices.Query(a => a.IsDeleted != true);
//if (!string.IsNullOrEmpty(key))
//{
// permissions = permissions.Where(t => (t.Name != null && t.Name.Contains(key))).ToList();
//}
////筛选后的数据总数
//totalCount = permissions.Count;
////筛选后的总页数
//pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intTotalCount.ObjToDecimal())).ObjToInt();
//permissions = permissions.OrderByDescending(d => d.Id).Skip((page - 1) * intTotalCount).Take(intTotalCount).ToList();
#endregion
permissions = await _permissionServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, intPageSize, " 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 pidarr = new List
{
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>()
{
msg = "获取成功",
success = permissions.dataCount >= 0,
response = permissions
};
}
///
/// 查询树形 Table
///
/// 父节点
/// 关键字
///
[HttpGet]
[AllowAnonymous]
public async Task>> GetTreeTable(int f = 0, string key = "")
{
List permissions = new List();
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 pidarr = new List { };
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>()
{
msg = "获取成功",
success = permissions.Count >= 0,
response = permissions
};
}
// GET: api/User/5
[HttpGet("{id}")]
public string Get(string id)
{
return "value";
}
///
/// 添加一个菜单
///
///
///
// POST: api/User
[HttpPost]
public async Task> Post([FromBody] Permission permission)
{
var data = new MessageModel();
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 data;
}
///
/// 保存菜单权限分配
///
///
///
[HttpPost]
public async Task> Assign([FromBody] AssignView assignView)
{
var data = new MessageModel();
try
{
if (assignView.rid > 0)
{
data.success = true;
var roleModulePermissions = await _roleModulePermissionServices.Query(d => d.RoleId == assignView.rid);
var remove = roleModulePermissions.Where(d => !assignView.pids.Contains(d.PermissionId.ObjToInt())).Select(c => (object)c.Id);
data.success &= remove.Any() ? await _roleModulePermissionServices.DeleteByIds(remove.ToArray()) : true;
foreach (var item in assignView.pids)
{
var rmpitem = roleModulePermissions.Where(d => d.PermissionId == item);
if (!rmpitem.Any())
{
var moduleid = (await _permissionServices.Query(p => p.Id == item)).FirstOrDefault()?.Mid;
RoleModulePermission roleModulePermission = new RoleModulePermission()
{
IsDeleted = false,
RoleId = assignView.rid,
ModuleId = moduleid.ObjToInt(),
PermissionId = item,
};
roleModulePermission.CreateId = _user.ID;
roleModulePermission.CreateBy = _user.Name;
data.success &= (await _roleModulePermissionServices.Add(roleModulePermission)) > 0;
}
}
if (data.success)
{
_requirement.Permissions.Clear();
data.response = "";
data.msg = "保存成功";
}
}
}
catch (Exception)
{
data.success = false;
}
return data;
}
///
/// 获取菜单树
///
///
///
///
[HttpGet]
public async Task> GetPermissionTree(int pid = 0, bool needbtn = false)
{
var data = new MessageModel();
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 data;
}
///
/// 获取路由树
///
///
///
[HttpGet]
public async Task> GetNavigationBar(int uid)
{
var data = new MessageModel();
var uidInHttpcontext1 = 0;
var roleIds = new List();
// ids4和jwt切换
if (Permissions.IsUseIds4)
{
// ids4
uidInHttpcontext1 = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "sub"
select item.Value).FirstOrDefault().ObjToInt();
roleIds = (from item in _httpContext.HttpContext.User.Claims
where item.Type == "role"
select item.Value.ObjToInt()).ToList();
}
else
{
// jwt
uidInHttpcontext1 = ((JwtHelper.SerializeJwt(_httpContext.HttpContext.Request.Headers["Authorization"].ObjToString().Replace("Bearer ", "")))?.Uid).ObjToInt();
roleIds = (await _userRoleServices.Query(d => d.IsDeleted == false && d.UserId == uid)).Select(d => d.RoleId.ObjToInt()).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.ObjToInt()).Distinct();
if (pids.Any())
{
var rolePermissionMoudles = (await _permissionServices.Query(d => pids.Contains(d.Id))).OrderBy(c => c.OrderSort);
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;
}
///
/// 通过角色获取菜单【无权限】
///
///
///
[HttpGet]
[AllowAnonymous]
public async Task> GetPermissionIdByRoleId(int rid = 0)
{
var data = new MessageModel();
var rmps = await _roleModulePermissionServices.Query(d => d.IsDeleted == false && d.RoleId == rid);
var permissionTrees = (from child in rmps
orderby child.Id
select child.PermissionId.ObjToInt()).ToList();
var permissions = await _permissionServices.Query(d => d.IsDeleted == false);
List assignbtns = new List();
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 data;
}
///
/// 更新菜单
///
///
///
// PUT: api/User/5
[HttpPut]
public async Task> Put([FromBody] Permission permission)
{
var data = new MessageModel();
if (permission != null && permission.Id > 0)
{
data.success = await _permissionServices.Update(permission);
if (data.success)
{
data.msg = "更新成功";
data.response = permission?.Id.ObjToString();
}
}
return data;
}
///
/// 删除菜单
///
///
///
// DELETE: api/ApiWithActions/5
[HttpDelete]
public async Task> Delete(int id)
{
var data = new MessageModel();
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;
}
}
public class AssignView
{
public List pids { get; set; }
public int rid { get; set; }
}
public class AssignShow
{
public List permissionids { get; set; }
public List assignbtns { get; set; }
}
}