Files
SecMPS/api_sqlsugar/VolPro.WebApi/Controllers/Sys/Partial/Sys_RoleController.cs
2026-05-15 23:22:48 +08:00

316 lines
12 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
using StackExchange.Redis;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VolPro.Core;
using VolPro.Core.Configuration;
using VolPro.Core.Controllers.Basic;
using VolPro.Core.DbSqlSugar;
using VolPro.Core.Enums;
using VolPro.Core.Extensions;
using VolPro.Core.Filters;
using VolPro.Core.ManageUser;
using VolPro.Core.UserManager;
using VolPro.Core.Utilities;
using VolPro.Entity.AttributeManager;
using VolPro.Entity.DomainModels;
using VolPro.Sys.IRepositories;
using VolPro.Sys.IServices;
using VolPro.Sys.Repositories;
using VolPro.Sys.Services;
namespace VolPro.Sys.Controllers
{
[Route("api/role")]
public partial class Sys_RoleController
{
private readonly ISys_RoleService _service;//访问业务代码
private readonly ISys_RoleRepository _repository;
private readonly IHttpContextAccessor _httpContextAccessor;
[ActivatorUtilitiesConstructor]
public Sys_RoleController(
ISys_RoleService service,
ISys_RoleRepository repository,
IHttpContextAccessor httpContextAccessor
)
: base(service)
{
_service = service;
_repository = repository;
_httpContextAccessor = httpContextAccessor;
}
[HttpPost, Route("getCurrentTreePermission")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public async Task<IActionResult> GetCurrentTreePermission()
{
return Json(await Service.GetCurrentTreePermission());
}
[HttpPost, Route("getUserTreePermission")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public async Task<IActionResult> GetUserTreePermission(int roleId)
{
return Json(await Service.GetUserTreePermission(new int[] { roleId }));
}
[HttpPost, Route("savePermission")]
[ApiActionPermission(ActionPermissionOptions.Update)]
public async Task<IActionResult> SavePermission([FromBody] List<UserPermissions> userPermissions, int roleId)
{
return Json(await Service.SavePermission(userPermissions, roleId));
}
/// <summary>
/// 获取当前角色下的所有角色
/// </summary>
/// <returns></returns>
[HttpPost, Route("getUserChildRoles")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public IActionResult GetUserChildRoles()
{
var roleIds = UserContext.Current.RoleIds;
var data = RoleContext.GetAllChildren(UserContext.Current.RoleIds);
if (UserContext.Current.IsSuperAdmin)
{
return Json(WebResponseContent.Instance.OK(null, data));
}
//不是超级管理,将自己的角色查出来,在树形菜单上作为根节点
var self = Sys_RoleRepository.Instance.FindAsIQueryable(x => roleIds.Contains(x.Role_Id))
.Select(s => new RoleNodes()
{
Id = s.Role_Id,
ParentId = 0,//将自己的角色作为root节点
RoleName = s.RoleName
}).ToList();
data.AddRange(self);
return Json(WebResponseContent.Instance.OK(null, data));
}
/// <summary>
/// treetable 获取子节点数据(2021.05.02)
/// </summary>
/// <param name="loadData"></param>
/// <returns></returns>
[ApiActionPermission(ActionPermissionOptions.Search)]
[HttpPost, Route("GetPageData")]
public override ActionResult GetPageData([FromBody] PageDataOptions loadData)
{
//获取根节点数据(对应Sys_Role1.js中searchBefore方法)
//if (loadData.Value.GetInt() == 1)
//{
// return GetTreeTableRootData(loadData).Result;
//}
return base.GetPageData(loadData);
}
/// <summary>
/// treetable 获取子节点数据(2021.05.02)
/// </summary>
/// <returns></returns>
[HttpPost, Route("getTreeTableRootData")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public async Task<ActionResult> GetTreeTableRootData([FromBody] PageDataOptions options)
{
//页面加载根节点数据条件x => x.ParentId == 0,自己根据需要设置
//页面加载根节点数据条件x => x.ParentId == 0,自己根据需要设置
var dbServiceId = UserContext.CurrentServiceId;
var query = _repository.FindAsIQueryable(x => true);
if (UserContext.Current.IsSuperAdmin)
{
query = query.Where(x => x.ParentId == 0 || x.Role_Id == 1);
}
else
{
var roleIds = UserContext.Current.RoleIds;
var roleList = RoleContext.GetRoles(x => roleIds.Contains(x.Id)).ToList();
roleIds = roleList.Where(x => !roleList.Any(c => x.ParentId == c.Id)).Select(c => c.Id).ToArray();
query = query.Where(x => roleIds.Contains(x.Role_Id));
//显示租户下的数据
//if (AppSetting.UseDynamicShareDB)
//{
// query = query.Where(x => x.DbServiceId == dbServiceId);
//}
}
int count = 0;
var rows = await query.Select(s => new
{
s.Role_Id,
s.ParentId,
s.RoleName,
s.DeptName,
s.Dept_Id,
s.Enable,
s.DbServiceId,
s.CreateDate,
s.Creator,
s.Modifier,
s.ModifyDate,
s.OrderNo,
s.DatAuth,
hasChildren = SqlFunc.Subqueryable<Sys_Role>().Where(x => x.ParentId == s.Role_Id).Any()
})
.ToPageListAsync(options.Page, options.Rows, count);
return JsonNormal(new { total = count, rows });
}
/// <summary>
///treetable 获取子节点数据(2021.05.02)
/// </summary>
/// <returns></returns>
[HttpPost, Route("getTreeTableChildrenData")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public async Task<ActionResult> GetTreeTableChildrenData(int roleId)
{
if (!UserContext.Current.IsSuperAdmin && !UserContext.Current.RoleIds.Contains(roleId) && !RoleContext.GetAllChildrenIds(UserContext.Current.RoleIds).Any(x => x == roleId))
{
return JsonNormal(new { rows = new object[] { } });
}
//点击节点时,加载子节点数据
var roleRepository = Sys_RoleRepository.Instance.FindAsIQueryable(x => true);
var query = roleRepository.Where(x => x.ParentId == roleId);
//if (AppSetting.UseDynamicShareDB)
//{
// query = query.Where(x => x.DbServiceId == UserContext.CurrentServiceId);
//}
var rows = await query
.Select(s => new
{
s.Role_Id,
s.ParentId,
s.RoleName,
s.DeptName,
s.Dept_Id,
s.Enable,
s.DbServiceId,
s.CreateDate,
s.Creator,
s.Modifier,
s.ModifyDate,
s.OrderNo,
s.DatAuth,
hasChildren = SqlFunc.Subqueryable<Sys_Role>().Where(x => x.ParentId == s.Role_Id).Any()
}).ToListAsync();
return JsonNormal(new { rows });
}
[HttpGet, Route("getAuthFields")]
[ApiActionPermission(ActionPermissionOptions.Search)]
public async Task<ActionResult> GetAuthFields(int menuId, int roleId)
{
string table = Sys_MenuService.Instance.GetCurrentMenuList().Where(x => x.Menu_Id == menuId)
.Select(s => s.TableName).FirstOrDefault();
var fields = await _repository.DbContext.Set<Sys_TableColumn>()
.Where(x => x.TableName == table && x.IsDisplay == 1)
.Select(s => new { field = s.ColumnName, name = s.ColumnCnName })
.ToListAsync();
if (!UserContext.Current.IsSuperAdmin)
{
//获取用户当前拥有的字典
var roleIds = UserContext.Current.RoleIds;
var userFields = ((await _repository.DbContext.Set<Sys_RoleFields>()
.Where(x => roleIds.Contains(x.RoleId) && x.TableName == table)
.Select(s => s.AuthFields).FirstOrDefaultAsync()))?.Split(",") ?? new string[] { };
if (userFields.Count() > 0)
{
fields = fields.Where(x => userFields.Contains(x.field)).ToList();
}
}
var roleFields = ((await _repository.DbContext.Set<Sys_RoleFields>()
.Where(x => x.RoleId == roleId && x.TableName == table)
.Select(s => s.AuthFields).FirstOrDefaultAsync()) ?? "")
.Split(",");
return JsonNormal(new
{
fields,
roleFields
});
}
[HttpPost, Route("saveAuthFields")]
[ApiActionPermission(ActionPermissionOptions.Update)]
public async Task<ActionResult> SaveAuthFields([FromBody] string[] fields, int menuId, int roleId)
{
string table = Sys_MenuService.Instance.GetCurrentMenuList().Where(x => x.Menu_Id == menuId)
.Select(s => s.TableName).FirstOrDefault();
if (string.IsNullOrEmpty(table) || table == "." || table == "/")
{
return Json("保存成功".Translator());
}
string authFields = fields == null ? "" : string.Join(",", fields);
var roleFields = await _repository.DbContext.Set<Sys_RoleFields>()
.Where(x => x.RoleId == roleId && x.TableName == table)
.FirstOrDefaultAsync();
if (roleFields == null)
{
roleFields = new Sys_RoleFields()
{
RoleId = roleId,
TableName = table,
Enable = 1,
AuthFields = authFields
};
_repository.DbContext.Add(roleFields.SetCreateDefaultVal());
}
else
{
roleFields.AuthFields = authFields;
_repository.Update<Sys_RoleFields>(roleFields.SetModifyDefaultVal(), x => new { x.AuthFields });
}
_repository.SaveChanges();
RoleContext.UpdateRoleFields(roleFields);
return Json("保存成功".Translator());
}
/// <summary>
/// 获取自定义数据权限字段
/// </summary>
/// <param name="menuId"></param>
/// <param name="roleId"></param>
/// <returns></returns>
[HttpPost, Route("getFields")]
public async Task<IActionResult> GetFields(int menuId, int roleId)
{
string table = Sys_MenuService.Instance.GetCurrentMenuList().Where(x => x.Menu_Id == menuId)
.Select(s => s.TableName).FirstOrDefault();
var data = await _repository.DbContext.Set<Sys_TableColumn>().Where(x => x.TableName == table)
.OrderByDescending(x => x.OrderNo)
.Select(s => new { field = s.ColumnName, title = s.ColumnCnName, key = s.DropNo, type = s.EditType ?? s.ColumnType })
.ToListAsync();
var authField = typeof(UserInfo).GetProperties()
.Where(s => s.GetTypeCustomValue<UserAuthFieldAttribute>(x => x.Name) != null)
.Select(s => new
{
field = s.Name,
name = s.GetTypeCustomValue<UserAuthFieldAttribute>(x => x.Name)
}).ToList();
return Json(new { data, authField });
}
}
}