Files
WCS/Cowain.Base/Services/UserRoleMenuService.cs
2026-03-02 09:08:20 +08:00

153 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}");
}
}