Files
WCS/Cowain.Base/Services/UserRoleMenuService.cs

153 lines
6.0 KiB
C#
Raw Normal View History

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 successfullycount is {ret}");
}
else
{
var ret = await dbContext.SaveChangesAsync();
return ResultModel.Success($"UserRoleMenu updated successfullycount 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 successfullycount 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 successfullycount is {ret}");
}
}