优化角色授权菜单逻辑

This commit is contained in:
不做码农 2023-05-12 08:03:26 +08:00
parent ec92b3fa3a
commit 4227f68900
8 changed files with 66 additions and 21 deletions

View File

@ -9,6 +9,8 @@ using ZR.Model;
using ZR.Model.System; using ZR.Model.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Extensions;
using ZR.Model.System.Dto;
using Mapster;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {
@ -78,7 +80,7 @@ namespace ZR.Admin.WebApi.Controllers.System
} }
/// <summary> /// <summary>
/// 修改角色 /// 修改角色
/// </summary> /// </summary>
/// <param name="sysRoleDto"></param> /// <param name="sysRoleDto"></param>
/// <returns></returns> /// <returns></returns>
@ -118,12 +120,12 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpPut("dataScope")] [HttpPut("dataScope")]
[ActionPermissionFilter(Permission = "system:role:authorize")] [ActionPermissionFilter(Permission = "system:role:authorize")]
[Log(Title = "角色管理", BusinessType = BusinessType.UPDATE)] [Log(Title = "角色管理", BusinessType = BusinessType.UPDATE)]
public IActionResult DataScope([FromBody] SysRole sysRoleDto) public IActionResult DataScope([FromBody] SysRoleDto sysRoleDto)
{ {
if (sysRoleDto == null || sysRoleDto.RoleId <= 0) return ToResponse(ApiResult.Error(101, "请求参数错误")); if (sysRoleDto == null || sysRoleDto.RoleId <= 0) return ToResponse(ApiResult.Error(101, "请求参数错误"));
SysRole sysRole = sysRoleDto.Adapt<SysRole>();
sysRoleDto.Create_by = HttpContext.GetName(); sysRoleDto.Create_by = HttpContext.GetName();
sysRoleService.CheckRoleAllowed(sysRoleDto); sysRoleService.CheckRoleAllowed(sysRole);
bool result = sysRoleService.AuthDataScope(sysRoleDto); bool result = sysRoleService.AuthDataScope(sysRoleDto);

View File

@ -6,12 +6,16 @@ namespace ZR.Model.System.Dto
{ {
public long RoleId { get; set; } public long RoleId { get; set; }
/// <summary> /// <summary>
/// 角色分配菜单 /// 要添加的菜单集合
/// </summary> /// </summary>
public List<long> MenuIds { get; set; } = new List<long>(); public List<long> MenuIds { get; set; } = new List<long>();
public string RoleName { get; set; } public string RoleName { get; set; }
public string RoleKey { get; set; } public string RoleKey { get; set; }
public int RoleSort { get; set; } public int RoleSort { get; set; }
public string Status { get; set; } public string Status { get; set; }
/// <summary>
/// 减少菜单集合
/// </summary>
public List<long> DelMenuIds { get; set; } = new List<long>();
} }
} }

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
namespace ZR.Model.System.Dto
{
public class SysRoleMenuDto
{
public long RoleId { get; set; }
/// <summary>
/// 角色分配菜单
/// </summary>
public List<long> MenuIds { get; set; } = new List<long>();
public string RoleName { get; set; }
public string RoleKey { get; set; }
public string Create_by { get; set; }
public DateTime Create_time{ get; set; }
}
}

View File

@ -72,5 +72,13 @@ namespace ZR.Service.System.IService
/// <param name="roleId"></param> /// <param name="roleId"></param>
/// <returns></returns> /// <returns></returns>
int DeleteRoleMenuByRoleId(long roleId); int DeleteRoleMenuByRoleId(long roleId);
/// <summary>
/// 删除角色指定菜单
/// </summary>
/// <param name="roleId"></param>
/// <param name="menuIds"></param>
/// <returns></returns>
bool DeleteRoleMenuByRoleIdMenuIds(long roleId, long[] menuIds);
} }
} }

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using ZR.Model; using ZR.Model;
using ZR.Model.System; using ZR.Model.System;
using ZR.Model.System.Dto;
namespace ZR.Service.System.IService namespace ZR.Service.System.IService
{ {
@ -81,7 +82,7 @@ namespace ZR.Service.System.IService
/// </summary> /// </summary>
/// <param name="role"></param> /// <param name="role"></param>
/// <returns></returns> /// <returns></returns>
bool AuthDataScope(SysRole role); bool AuthDataScope(SysRoleDto role);
#region Service #region Service
@ -90,7 +91,7 @@ namespace ZR.Service.System.IService
/// </summary> /// </summary>
/// <param name="sysRoleDto"></param> /// <param name="sysRoleDto"></param>
/// <returns></returns> /// <returns></returns>
public int InsertRoleMenu(SysRole sysRoleDto); public int InsertRoleMenu(SysRoleDto sysRoleDto);
/// <summary> /// <summary>
/// 判断是否是管理员 /// 判断是否是管理员

View File

@ -26,7 +26,10 @@ namespace ZR.Service.System
{ {
return Delete(roleId); return Delete(roleId);
} }
public bool DeleteRoleMenuByRoleIdMenuIds(long roleId, long[] menuIds)
{
return Delete(f => f.Role_id == roleId && menuIds.Contains(f.Menu_id));
}
/// <summary> /// <summary>
/// 根据角色获取菜单id /// 根据角色获取菜单id
/// </summary> /// </summary>

View File

@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using ZR.Model; using ZR.Model;
using ZR.Model.System; using ZR.Model.System;
using ZR.Model.System.Dto;
using ZR.Repository; using ZR.Repository;
using ZR.Service.System.IService; using ZR.Service.System.IService;
@ -179,15 +180,31 @@ namespace ZR.Service
/// </summary> /// </summary>
/// <param name="sysRoleDto"></param> /// <param name="sysRoleDto"></param>
/// <returns></returns> /// <returns></returns>
public bool AuthDataScope(SysRole sysRoleDto) public bool AuthDataScope(SysRoleDto sysRoleDto)
{ {
return UseTran2(() => return UseTran2(() =>
{ {
//删除角色菜单 //删除角色菜单
DeleteRoleMenuByRoleId(sysRoleDto.RoleId); //DeleteRoleMenuByRoleId(sysRoleDto.RoleId);
//InsertRoleMenu(sysRoleDto);
var oldMenus = SelectUserRoleMenus(sysRoleDto.RoleId);
var newMenus = sysRoleDto.MenuIds;
//并集菜单
var arr_c = oldMenus.Intersect(newMenus).ToArray();
//获取减量菜单
var delMenuIds = oldMenus.Where(c => !arr_c.Contains(c)).ToArray();
//获取增量
var addMenuIds = newMenus.Where(c => !arr_c.Contains(c)).ToArray();
RoleMenuService.DeleteRoleMenuByRoleIdMenuIds(sysRoleDto.RoleId, delMenuIds);
sysRoleDto.MenuIds = addMenuIds.ToList();
sysRoleDto.DelMenuIds= delMenuIds.ToList();
InsertRoleMenu(sysRoleDto); InsertRoleMenu(sysRoleDto);
Console.WriteLine($"减少了{delMenuIds.Length},增加了{addMenuIds.Length}菜单");
}); });
} }
#region Service #region Service
@ -196,14 +213,14 @@ namespace ZR.Service
/// </summary> /// </summary>
/// <param name="sysRoleDto"></param> /// <param name="sysRoleDto"></param>
/// <returns></returns> /// <returns></returns>
public int InsertRoleMenu(SysRole sysRoleDto) public int InsertRoleMenu(SysRoleDto sysRoleDto)
{ {
int rows = 1; int rows = 1;
// 新增用户与角色管理 // 新增用户与角色管理
List<SysRoleMenu> sysRoleMenus = new List<SysRoleMenu>(); List<SysRoleMenu> sysRoleMenus = new();
foreach (var item in sysRoleDto.MenuIds) foreach (var item in sysRoleDto.MenuIds)
{ {
SysRoleMenu rm = new SysRoleMenu SysRoleMenu rm = new()
{ {
Menu_id = item, Menu_id = item,
Role_id = sysRoleDto.RoleId, Role_id = sysRoleDto.RoleId,

View File

@ -16,13 +16,6 @@ namespace ZR.Service.System
[AppService(ServiceType = typeof(ISysUserRoleService), ServiceLifetime = LifeTime.Transient)] [AppService(ServiceType = typeof(ISysUserRoleService), ServiceLifetime = LifeTime.Transient)]
public class SysUserRoleService : BaseService<SysUserRole>, ISysUserRoleService public class SysUserRoleService : BaseService<SysUserRole>, ISysUserRoleService
{ {
//public SysUserRoleRepository SysUserRoleRepository;
//public SysUserRoleService(SysUserRoleRepository sysUserRoleRepository)
//{
// SysUserRoleRepository = sysUserRoleRepository;
//}
/// <summary> /// <summary>
/// 通过角色ID查询角色使用数量 /// 通过角色ID查询角色使用数量
/// </summary> /// </summary>
@ -85,7 +78,6 @@ namespace ZR.Service.System
/// <returns></returns> /// <returns></returns>
public PagedInfo<SysUser> GetSysUsersByRoleId(RoleUserQueryDto roleUserQueryDto) public PagedInfo<SysUser> GetSysUsersByRoleId(RoleUserQueryDto roleUserQueryDto)
{ {
//return SysUserRoleRepository.GetSysUsersByRoleId(roleUserQueryDto);
var query = Context.Queryable<SysUserRole, SysUser>((t1, u) => new JoinQueryInfos( var query = Context.Queryable<SysUserRole, SysUser>((t1, u) => new JoinQueryInfos(
JoinType.Left, t1.UserId == u.UserId)) JoinType.Left, t1.UserId == u.UserId))
.Where((t1, u) => t1.RoleId == roleUserQueryDto.RoleId && u.DelFlag == "0"); .Where((t1, u) => t1.RoleId == roleUserQueryDto.RoleId && u.DelFlag == "0");