using AntDesign.TableModels;
using EasyTemplate.Tool;
using Microsoft.JSInterop;
using SqlSugar;
namespace EasyTemplate.Blazor.Web.Components.Pages.Management.Role;
public partial class Role
{
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
DefaultCheckedKeys = Global.Menus.Where(x => x.Necessary == true).Select(x => x.Id.ToString()).ToArray();
await NavigationManager.RedirectLogin(IJSRuntime);
//await Query();
}
}
///
/// 查
///
///
private async Task Query()
{
Loading = true;
RefAsync total = 0;
var res = await Repository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(Q_Name), x => x.Name.Contains(Q_Name))
.OrderByDescending(x => x.Id)
.ToPageListAsync(Pi, Ps, total);
Total = total.Value;
DataSource = res;
Loading = false;
//_table.ReloadData();
}
///
/// 增/改
///
///
///
private async Task InsertOrUpdate(SystemRole data)
{
bool flag = false;
if (data.Id == 0)
{
if (Repository.AsQueryable().Any(x => x.Name.ToLower() == data.Name.ToLower()))
{
MessageService.Error("该账号名已存在");
return false;
}
var id = Repository.AsInsertable(data).ExecuteReturnIdentity();
RoleMenu.Insert(new SystemRoleMenu() { RoleId = id, MenuId = 1 });
return id > 0;
}
else
{
if (Repository.AsQueryable().Any(x => x.Name.ToLower() == data.Name.ToLower() && x.Id != data.Id))
{
MessageService.Error("该账号名已存在");
return false;
}
return await Repository.AsUpdateable()
.SetColumns(x => x.Name == data.Name)
.SetColumns(x => x.RoleType == data.RoleType)
.SetColumns(x => x.Enabled == data.Enabled)
.Where(x => x.Id == data.Id)
.ExecuteCommandAsync() > 0;
}
}
///
/// 删除
///
///
///
private async Task Delete(SystemRole row)
{
if (!await Comfirm($"确认删除 [{row.Name}] ?")) return;
var flag = await Repository.AsUpdateable()
.SetColumns(x => x.IsDelete == true)
.Where(x => x.Id == row.Id)
.ExecuteCommandAsync() > 0;
Table.ReloadData(Pi, Ps);
}
///
///
///
private void UpdateMenu()
{
if (SelectedRow is null)
{
MessageService.Error("请先选择一个角色");
return;
}
var nodes = Tree.CheckedKeys;
if (nodes.Length == 0)
{
MessageService.Error("请选择菜单");
return;
}
bool flag = false;
try
{
RoleMenu.Context.Ado.BeginTran();
RoleMenu.AsDeleteable().Where(x => x.RoleId == SelectedRow.Data.Id).ExecuteCommand();
var menuIds = CalculateIds(nodes.ToList());
var menus = menuIds.Select(x => new SystemRoleMenu() { RoleId = SelectedRow.Data.Id, MenuId = Convert.ToInt32(x) }).ToList();
flag = RoleMenu.InsertRange(menus);
RoleMenu.Context.Ado.CommitTran();
}
catch (Exception ex)
{
RoleMenu.Context.Ado.RollbackTran();
flag = false;
}
if (flag)
{
MessageService.Success("修改成功");
}
else
{
MessageService.Error("修改失败");
}
CheckedKeys = Tree.CheckedKeys;
SelectedRow = null;
Table.ReloadData(Pi, Ps);
//StateHasChanged();
}
private List CalculateIds(List ids)
{
var result = new List();
foreach (var id in ids)
{
var menuId = long.Parse(id);
AddParentIds(menuId, result);
}
return result;
}
private void AddParentIds(long id, List result)
{
var menu = Menu.AsQueryable().First(m => m.Id == id);
if (menu != null && !result.Contains(menu.Id))
{
result.Add(menu.Id);
if (menu.ParentId != 0)
{
AddParentIds(menu.ParentId, result);
}
}
}
///
/// 重置查询
///
private async Task ResetQuery()
{
Q_Name = string.Empty;
Pi = 1;
await Query();
}
protected override async void OnInitialized()
{
await Query();
}
private async Task OnChange(QueryModel query)
=> await Query();
private async Task Search()
=> await Query();
private void OnRowClick(RowData row)
{
SelectedRow = row;
CheckedKeys = RoleMenu.AsQueryable()
.LeftJoin((rm, m) => rm.MenuId == m.Id)
.Where((rm, m) => rm.RoleId == row.Data.Id)
.Select((rm, m) => m.Id.ToString())
.ToArray();
//这里最好做一下筛选,也可以不做,目的是去除Global.Menus树形结构中没有的数据,如果_CheckedKeys有,而Global.Menus没有,会报错
//一般出现的情形是有人从数据库删除了某个菜单项,但前端没有及时刷新,导致_CheckedKeys与Global.Menus数据不匹配
CheckedKeys = FilterCheckedKeys(CheckedKeys, Global.Menus);
}
///
/// 过滤已选中的菜单项,确保它们在菜单树中存在
///
///
///
///
private string[] FilterCheckedKeys(string[] checkedKeys, List menuTree)
{
var validIds = new HashSet();
void CollectIds(List menus)
{
if (menus == null) return;
foreach (var menu in menus)
{
validIds.Add(menu.Id.ToString());
if (menu.Children != null && menu.Children.Count > 0)
CollectIds(menu.Children);
}
}
CollectIds(menuTree);
return checkedKeys.Where(id => validIds.Contains(id)).ToArray();
}
private void CheckedChanged(SystemRole row)
{
Repository.AsUpdateable()
.SetColumns(x => x.Enabled == row.Enabled)
.Where(x => x.Id == row.Id)
.ExecuteCommand();
//_table.ReloadData();
}
///
/// 注入实例
///
[Inject] private SqlSugarRepository Repository { get; set; }
///
///
///
[Inject] private SqlSugarRepository RoleMenu { get; set; }
///
///
///
[Inject] private SqlSugarRepository Menu { get; set; }
///
///
///
[Inject] NavigationManager NavigationManager { get; set; }
///
///
///
[Inject] IJSRuntime IJSRuntime { get; set; }
///
/// 账号
///
private string Q_Name { get; set; }
///
///
///
private string[] DefaultCheckedKeys = [];
///
///
///
private string[] CheckedKeys = [];
///
///
///
private RowData SelectedRow;
///
///
///
private ITable Table;
///
///
///
private Tree Tree;
///
///
///
private IEnumerable SelectedRows = [];
///
///
///
private List DataSource;
///
///
///
private int Pi = 1;
///
///
///
private int Ps = 20;
///
///
///
private int Total;
///
///
///
private bool Loading = false;
///
///
///
Func ShowTotal => x => $"总共 {Total} 条";
}