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.

240 lines
9.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using AutoMapper;
using Common.Enum;
using Entity.DbModel.System;
using Entity.Dto.Req;
using Entity.Dto.Resp;
using HybirdFrameworkCore.Autofac.Attribute;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Repository.System;
using Service.Mgr;
namespace Service.System
{
[Scope("SingleInstance")]
public class SysMenuService : BaseServices<SysMenu>
{
//private readonly UserManager _userManager;
private readonly SysMenuRepository _sysMenuRep;
private readonly SysRoleMenuMgr _sysRoleMenuMgr;
private readonly SysUserRoleMgr _sysUserRoleMgr;
public SysMenuService(
SysMenuRepository sysMenuRep,
SysRoleMenuMgr sysRoleMenuService,
SysUserRoleMgr sysUserRoleService)
{
_sysMenuRep = sysMenuRep;
_sysRoleMenuMgr = sysRoleMenuService;
_sysUserRoleMgr = sysUserRoleService;
}
/// <summary>
/// 获取登录菜单树 🔖
/// </summary>
/// <returns></returns>
public async Task<List<MenuResp>> GetLoginMenuTree()
{
if (UserManager.SuperAdmin)
{
var config = new MapperConfiguration(u => u.CreateMap<MenuResp, SysMenu>().ReverseMap());
IMapper mapper = config.CreateMapper();
var menuList = await _sysMenuRep.QueryTreeByClauseAsync((u => u.Type != MenuTypeEnum.Btn && u.Status == StatusEnum.Enable),
u => new { u.OrderNo, u.Id },
u => u.Children, u => u.Pid, 0);
return menuList.Adapt<List<MenuResp>>();
//return mapper.Map<List<MenuResp>>(menuList);
}
else
{
var menuIdList = await GetMenuIdList();
var menuTree = await _sysMenuRep.QueryTreeByClauseAsync(u => u.Status == StatusEnum.Enable, u => new { u.OrderNo, u.Id },
u => u.Children, u => u.Pid, 0, menuIdList.Select(d => (object)d).ToArray());
DeleteBtnFromMenuTree(menuTree);
return menuTree.Adapt<List<MenuResp>>();
}
}
/// <summary>
/// 删除登录菜单树里面的按钮
/// </summary>
private void DeleteBtnFromMenuTree(List<SysMenu> menuList)
{
if (menuList == null) return;
for (var i = menuList.Count - 1; i >= 0; i--)
{
var menu = menuList[i];
if (menu.Type == MenuTypeEnum.Btn)
menuList.Remove(menu);
else if (menu.Children.Count > 0)
DeleteBtnFromMenuTree(menu.Children);
}
}
/// <summary>
/// 获取菜单列表 🔖
/// </summary>
/// <returns></returns>
public async Task<List<SysMenu>> GetList([FromQuery] MenuReq input)
{
var menuIdList = UserManager.SuperAdmin ? new List<long>() : await GetMenuIdList();
// 有筛选条件时返回list列表防止构造不出树
if (!string.IsNullOrWhiteSpace(input.Title) || input.Type is > 0)
{
return await _sysMenuRep.QueryListByClauseAsync(
!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title),
input.Type is > 0, u => u.Type == input.Type,
menuIdList.Count > 1, u => menuIdList.Contains(u.Id), (u => u.OrderNo)
);
}
return UserManager.SuperAdmin ?
await _sysMenuRep.QueryTreeByClauseAsync(u => u.OrderNo, u => u.Children, u => u.Pid, 0) :
await _sysMenuRep.QueryTreeByClauseAsync(u => u.OrderNo, u => u.Children, u => u.Pid, 0, menuIdList.Select(d => (object)d).ToArray()); // 角色菜单授权时
}
/// <summary>
/// 增加菜单 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<string> AddMenu(AddMenuReq input)
{
string result = "";
var isExist = input.Type != MenuTypeEnum.Btn
? await _sysMenuRep.QueryByClauseAsync(u => u.Title == input.Title && u.Pid == input.Pid)
: await _sysMenuRep.QueryByClauseAsync(u => u.Permission == input.Permission && u.Pid == input.Pid);
if (isExist != null)
{
result = "菜单已存在";
return result;
}
if (!string.IsNullOrWhiteSpace(input.Name))
{
if (await _sysMenuRep.QueryByClauseAsync(u => u.Name == input.Name) != null)
return result = "路由名称重复";
}
if (input.Pid != 0)
{
if (await _sysMenuRep.QueryByClauseAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn) != null)
return result = "父节点不能为按钮类型";
}
// 校验菜单参数
var sysMenu = input.Adapt<SysMenu>();
string checkResult = CheckMenuParam(sysMenu);
if (checkResult == "")
{
await _sysMenuRep.InsertAsync(sysMenu);
return result = "增加菜单成功";
}
else
{
return result = "增加菜单失败";
}
}
/// <summary>
/// 更新菜单 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<int> UpdateMenu(UpdateMenuReq input)
{
int updateResult = 0;
if (input.Id == input.Pid)
throw new ArgumentException($"禁止本节点与父节点相同");
var isExist = input.Type != MenuTypeEnum.Btn
? await _sysMenuRep.QueryByClauseAsync(u => u.Title == input.Title && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id)
: await _sysMenuRep.QueryByClauseAsync(u => u.Permission == input.Permission && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id);
if (isExist != null)
throw new ArgumentException($"菜单已存在");
if (!string.IsNullOrWhiteSpace(input.Name))
{
if ((await _sysMenuRep.QueryByClauseAsync(u => u.Id != input.Id && u.Name == input.Name)) != null)
throw new ArgumentException($"路由名称重复");
}
if (input.Pid != 0)
{
if ((await _sysMenuRep.QueryByClauseAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) != null)
throw new ArgumentException($"父节点不能为按钮类型");
}
// 校验菜单参数
var sysMenu = input.Adapt<SysMenu>();
CheckMenuParam(sysMenu);
bool result = await _sysMenuRep.UpdateAsync(sysMenu);
if (result)
{
updateResult = 200;
return updateResult;
}
return updateResult;
}
/// <summary>
/// 删除菜单 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task DeleteMenu(DeleteMenuReq input)
{
var menuTreeList = await _sysMenuRep.QueryTreeByClauseAsync(u => u.Pid, input.Id, true);
var menuIdList = menuTreeList.Select(u => u.Id).ToList();
await _sysMenuRep.DeleteAsync(u => menuIdList.Contains(u.Id));
// 级联删除角色菜单数据
await _sysRoleMenuMgr.DeleteRoleMenuByMenuIdList(menuIdList);
}
/// <summary>
/// 增加和编辑时检查菜单数据
/// </summary>
/// <param name="menu"></param>
private static string CheckMenuParam(SysMenu menu)
{
string result = "";
var permission = menu.Permission;
if (menu.Type == MenuTypeEnum.Btn)
{
menu.Name = null;
menu.Path = null;
menu.Component = null;
menu.Icon = null;
menu.Redirect = null;
menu.OutLink = null;
menu.IsHide = false;
menu.IsKeepAlive = true;
menu.IsAffix = false;
menu.IsIframe = false;
if (string.IsNullOrEmpty(permission))
return result = "权限标识格式为空";
if (!permission.Contains(':'))
return result = "权限标识格式错误 如xxx:xxx";
}
else
{
menu.Permission = null;
}
return result;
}
/// <summary>
/// 获取当前用户菜单Id集合
/// </summary>
/// <returns></returns>
private async Task<List<long>> GetMenuIdList()
{
var roleIdList = await _sysUserRoleMgr.GetUserRoleIdList(UserManager.UserId);
return await _sysRoleMenuMgr.GetRoleMenuIdList(roleIdList);
}
}
}