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; } } }