153 lines
6.0 KiB
C#
153 lines
6.0 KiB
C#
|
|
using Avalonia;
|
|||
|
|
using Cowain.Base.DBContext;
|
|||
|
|
using Cowain.Base.Helpers;
|
|||
|
|
using Cowain.Base.IServices;
|
|||
|
|
using Cowain.Base.Models;
|
|||
|
|
using Cowain.Base.Models.Admins;
|
|||
|
|
using Cowain.Base.Models.Menu;
|
|||
|
|
using Cowain.Base.ViewModels;
|
|||
|
|
using Ke.Bee.Localization.Localizer.Abstractions;
|
|||
|
|
using Microsoft.EntityFrameworkCore;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.Text.Json;
|
|||
|
|
using MenuItem = Cowain.Base.Models.Menu.MenuItem;
|
|||
|
|
|
|||
|
|
namespace Cowain.Base.Services;
|
|||
|
|
|
|||
|
|
public class UserRoleMenuService : BaseService, IUserRoleMenuService
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 菜单数据
|
|||
|
|
/// </summary>
|
|||
|
|
private readonly List<MenuItem> _menuItems;
|
|||
|
|
private readonly PageViewMenuHelper _pageMenuHelper;
|
|||
|
|
public UserRoleMenuService(IDbContextFactory<SqlDbContext> dbContextFactory, PageViewMenuHelper pageMenuHelper, MenuConfigurationContext menuContext) : base(dbContextFactory)
|
|||
|
|
{
|
|||
|
|
_menuItems = menuContext.Menus;
|
|||
|
|
_pageMenuHelper = pageMenuHelper;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<List<UserRoleViewModel>> GetAllAsync()
|
|||
|
|
{
|
|||
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|||
|
|
var userRoles = dbContext.GetDbSet<UserRoleDto>();
|
|||
|
|
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
|||
|
|
var jsonSerializerOptions = new JsonSerializerOptions
|
|||
|
|
{
|
|||
|
|
PropertyNameCaseInsensitive = true
|
|||
|
|
};
|
|||
|
|
var result = await (from ur in userRoles
|
|||
|
|
join urm in userRoleMenus on ur.Id equals urm.RoleId into urms
|
|||
|
|
select new UserRoleViewModel
|
|||
|
|
{
|
|||
|
|
RoleId = ur.Id,
|
|||
|
|
RoleName = ur.RoleName,
|
|||
|
|
IsValid = ur.IsValid,
|
|||
|
|
Menus = new ObservableCollection<UserRoleMenuViewModel>(urms.Select(urm => new UserRoleMenuViewModel
|
|||
|
|
{
|
|||
|
|
Id = urm.Id,
|
|||
|
|
RoleId = urm.RoleId,
|
|||
|
|
MenuKey = urm.MenuKey,
|
|||
|
|
MenuName = _pageMenuHelper.GetMenuName(urm.MenuKey),
|
|||
|
|
MenuActions = new ObservableCollection<string>(JsonSerializer.Deserialize<List<string>>(urm.MenuActions ?? "[]", jsonSerializerOptions) ?? new List<string>())
|
|||
|
|
}).ToList())
|
|||
|
|
}).ToListAsync();
|
|||
|
|
|
|||
|
|
return result ?? new List<UserRoleViewModel>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<ResultModel> EditUserRoleMenuAsync(UserRoleViewModel? userRole)
|
|||
|
|
{
|
|||
|
|
if (userRole == null)
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRole cannot be null");
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(userRole.RoleName))
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRoleName cannot be null");
|
|||
|
|
}
|
|||
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|||
|
|
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
|||
|
|
|
|||
|
|
// 删除旧的菜单
|
|||
|
|
var oldMenus = userRoleMenus.Where(urm => urm.RoleId == userRole.RoleId);
|
|||
|
|
dbContext.RemoveRange(oldMenus);
|
|||
|
|
|
|||
|
|
// 添加新的菜单
|
|||
|
|
var newMenus = userRole.Menus?.Select(menu => new UserRoleMenuDto
|
|||
|
|
{
|
|||
|
|
RoleId = userRole.RoleId,
|
|||
|
|
MenuKey = menu.MenuKey,
|
|||
|
|
MenuActions = JsonSerializer.Serialize(menu.MenuActions)
|
|||
|
|
}).ToList();
|
|||
|
|
|
|||
|
|
if (newMenus != null)
|
|||
|
|
{
|
|||
|
|
await userRoleMenus.AddRangeAsync(newMenus);
|
|||
|
|
var ret = await dbContext.SaveChangesAsync();
|
|||
|
|
// 添加完新的数据后,id需要告诉userRole的Menus
|
|||
|
|
var addedMenus = await userRoleMenus.Where(urm => urm.RoleId == userRole.RoleId).ToListAsync();
|
|||
|
|
if (userRole.Menus != null)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < userRole.Menus.Count; i++)
|
|||
|
|
{
|
|||
|
|
userRole.Menus[i].Id = addedMenus[i].Id;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ResultModel.Success($"UserRoleMenu updated successfully,count is {ret}");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var ret = await dbContext.SaveChangesAsync();
|
|||
|
|
return ResultModel.Success($"UserRoleMenu updated successfully,count is {ret}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public async Task<ResultModel> EditMenuActionsAsync(UserRoleMenuViewModel? userRoleMenu)
|
|||
|
|
{
|
|||
|
|
if (userRoleMenu == null)
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRoleMenu cannot be null");
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(userRoleMenu.MenuKey))
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("MenuKey cannot be null");
|
|||
|
|
}
|
|||
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|||
|
|
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
|||
|
|
var menu = await userRoleMenus.FirstOrDefaultAsync(urm => urm.Id == userRoleMenu.Id);
|
|||
|
|
if (menu == null)
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRoleMenu Actions not found");
|
|||
|
|
}
|
|||
|
|
menu.MenuActions = JsonSerializer.Serialize(userRoleMenu.MenuActions);
|
|||
|
|
dbContext.Update(menu);
|
|||
|
|
var ret = await dbContext.SaveChangesAsync();
|
|||
|
|
return ResultModel.Success($"UserRoleMenu Actions updated successfully,count is {ret}");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async Task<ResultModel> DeleteMenuActionsAsync(UserRoleMenuViewModel? userRoleMenu)
|
|||
|
|
{
|
|||
|
|
if (userRoleMenu == null)
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRoleMenu cannot be null");
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(userRoleMenu.MenuKey))
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("MenuKey cannot be null");
|
|||
|
|
}
|
|||
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|||
|
|
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
|||
|
|
var menu = await userRoleMenus.FirstOrDefaultAsync(urm => urm.Id == userRoleMenu.Id);
|
|||
|
|
if (menu == null)
|
|||
|
|
{
|
|||
|
|
return ResultModel.Error("UserRoleMenu Actions not found");
|
|||
|
|
}
|
|||
|
|
var ret = await DeleteAsync<UserRoleMenuDto>(menu);
|
|||
|
|
return ResultModel.Success($"UserRoleMenu Actions remove successfully,count is {ret}");
|
|||
|
|
}
|
|||
|
|
}
|