feat: 菜单维护页面增加对角色授权功能
This commit is contained in:
parent
928afdf0d5
commit
7ea6d0a4e1
|
@ -0,0 +1,114 @@
|
|||
using Bootstrap.Admin.Pages.Shared;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Bootstrap.Admin.Pages.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// 模态框组件类
|
||||
/// </summary>
|
||||
public class AssignModalBase<TItem> : ComponentBase
|
||||
{
|
||||
#nullable disable
|
||||
/// <summary>
|
||||
/// 获得/设置 数据绑定项
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public TItem Item { get; set; }
|
||||
#nullable restore
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 Modal 实例
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public ModalBase? Modal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 Id
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public string Id { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 弹窗标题
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public string Title { get; set; } = "未设置";
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 表格 Toolbar 按钮模板
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public RenderFragment<TItem>? ItemTemplate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 Items
|
||||
/// </summary>
|
||||
public IEnumerable<TItem> Items { get; set; } = new TItem[0];
|
||||
|
||||
/// <summary>
|
||||
/// Toast 组件实例
|
||||
/// </summary>
|
||||
protected Toast? Toast { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 显示提示信息
|
||||
/// </summary>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="text"></param>
|
||||
/// <param name="cate"></param>
|
||||
protected void ShowMessage(string title, string text, ToastCategory cate = ToastCategory.Success) => Toast?.ShowMessage(title, text, cate);
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 保存回调事件
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public Func<IEnumerable<TItem>, bool>? OnSave { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OnAfterRender 方法
|
||||
/// </summary>
|
||||
/// <param name="firstRender"></param>
|
||||
protected override void OnAfterRender(bool firstRender)
|
||||
{
|
||||
if (show)
|
||||
{
|
||||
show = false;
|
||||
Modal?.Toggle();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SetParametersAsync 方法
|
||||
/// </summary>
|
||||
public override Task SetParametersAsync(ParameterView parameters)
|
||||
{
|
||||
parameters.SetParameterProperties(this);
|
||||
if (string.IsNullOrEmpty(Id)) throw new InvalidOperationException("Modal Component Id property must be set");
|
||||
return base.SetParametersAsync(ParameterView.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Save 方法
|
||||
/// </summary>
|
||||
protected void Save()
|
||||
{
|
||||
bool ret = OnSave?.Invoke(Items) ?? false;
|
||||
Modal?.Toggle();
|
||||
ShowMessage(Title, ret ? "保存成功" : "保存失败", ret ? ToastCategory.Success : ToastCategory.Error);
|
||||
}
|
||||
|
||||
private bool show;
|
||||
/// <summary>
|
||||
/// Update 方法
|
||||
/// </summary>
|
||||
public void Update(IEnumerable<TItem> items)
|
||||
{
|
||||
Items = items;
|
||||
show = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -32,31 +32,31 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
/// 勾选回调方法
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public Action<TItem, bool> ToggleCallback { get; set; } = new Action<TItem, bool>((v, c) => { });
|
||||
public Action<TItem, bool>? OnClick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 组件状态改变回调方法
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public Func<TItem, CheckBoxState> SetCheckCallback { get; set; } = new Func<TItem, CheckBoxState>(item => CheckBoxState.UnChecked);
|
||||
public Func<TItem, CheckBoxState>? SetCheckCallback { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// OnParametersSet 方法
|
||||
/// </summary>
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
State = SetCheckCallback(Item);
|
||||
State = SetCheckCallback?.Invoke(Item) ?? CheckBoxState.UnChecked;
|
||||
Checked = State == CheckBoxState.Checked;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 获得/设置 选择框状态
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public CheckBoxState State { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// RenderStateCss 方法
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected string RenderStateCss()
|
||||
|
@ -75,5 +75,15 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 点击选择框方法
|
||||
/// </summary>
|
||||
protected void ToggleClick()
|
||||
{
|
||||
Checked = !Checked;
|
||||
State = Checked ? CheckBoxState.Checked : CheckBoxState.UnChecked;
|
||||
OnClick?.Invoke(Item, Checked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -160,6 +160,11 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获得 Table 组件选择项目集合
|
||||
/// </summary>
|
||||
public IEnumerable<TItem> SelectedItems { get { return Table?.SelectedItems ?? new List<TItem>(); } }
|
||||
|
||||
/// <summary>
|
||||
/// 分页查询方法
|
||||
/// </summary>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Bootstrap.Admin.Pages.Extensions;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Bootstrap.Admin.Pages.Components
|
||||
{
|
||||
|
@ -11,13 +11,13 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
public class ModalBase : ComponentBase
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// 获得/设置 IJSRuntime 实例
|
||||
/// </summary>
|
||||
[Inject]
|
||||
protected IJSRuntime? JSRuntime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 获得/设置 ModalBody 代码块
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public RenderFragment? ModalBody { get; set; }
|
||||
|
@ -29,13 +29,13 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
public RenderFragment? ModalFooter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 获得/设置 Id
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public string Id { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 获得/设置 弹窗标题
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public string Title { get; set; } = "未设置";
|
||||
|
@ -65,7 +65,7 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
public bool ShowFooter { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// OnAfterRender 方法
|
||||
/// </summary>
|
||||
/// <param name="firstRender"></param>
|
||||
protected override void OnAfterRender(bool firstRender)
|
||||
|
@ -111,7 +111,7 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Toggle 弹窗方法
|
||||
/// </summary>
|
||||
public void Toggle()
|
||||
{
|
||||
|
@ -125,19 +125,19 @@ namespace Bootstrap.Admin.Pages.Components
|
|||
public enum ModalSize
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// 默认大小
|
||||
/// </summary>
|
||||
Default,
|
||||
/// <summary>
|
||||
///
|
||||
/// 小窗口
|
||||
/// </summary>
|
||||
Small,
|
||||
/// <summary>
|
||||
///
|
||||
/// 大窗口
|
||||
/// </summary>
|
||||
Large,
|
||||
/// <summary>
|
||||
///
|
||||
/// 超大窗口
|
||||
/// </summary>
|
||||
ExtraLarge,
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
@typeparam TItem
|
||||
@inherits AssignModalBase<TItem>
|
||||
|
||||
<Modal @ref="Modal" Id="@Id" Title="@Title" Size="ModalSize.Large">
|
||||
<ModalBody>
|
||||
<form class="form-inline">
|
||||
<div class="row">
|
||||
@foreach(var item in Items)
|
||||
{
|
||||
<div class="form-group col-md-3 col-sm-4 col-6">
|
||||
@ItemTemplate?.Invoke(item)
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</form>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">
|
||||
<i class="fa fa-times"></i>
|
||||
<span>关闭</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" @onclick="Save">
|
||||
<i class="fa fa-save"></i>
|
||||
<span>保存</span>
|
||||
</button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
|
||||
<Toast @ref="Toast" Id="@($"{Id}_toast")"></Toast>
|
|
@ -1,7 +1,7 @@
|
|||
@typeparam TItem
|
||||
@inherits CheckboxBase<TItem>
|
||||
|
||||
<label role="checkbox" aria-checked="@State.ToCss()" class="@RenderStateCss()" @onclick="e => ToggleCallback(Item, !Checked)">
|
||||
<label role="checkbox" aria-checked="@State.ToCss()" class="@RenderStateCss()" @onclick="ToggleClick">
|
||||
<span class="checkbox-input">
|
||||
<span class="checkbox-inner"></span>
|
||||
</span>
|
||||
|
|
|
@ -21,7 +21,3 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
<tr>
|
||||
@if (ShowCheckbox)
|
||||
{
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" ToggleCallback="ToggleCheck"></Checkbox></th>
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" OnClick="ToggleCheck"></Checkbox></th>
|
||||
}
|
||||
@if (ShowLineNo)
|
||||
{
|
||||
|
@ -77,7 +77,7 @@
|
|||
<tr>
|
||||
@if (ShowCheckbox)
|
||||
{
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" ToggleCallback="ToggleCheck"></Checkbox></th>
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" OnClick="ToggleCheck"></Checkbox></th>
|
||||
}
|
||||
@if (ShowLineNo)
|
||||
{
|
||||
|
@ -98,7 +98,7 @@
|
|||
<tr>
|
||||
@if (ShowCheckbox)
|
||||
{
|
||||
<td class="table-col-checkbox"><Checkbox TItem="TItem" Item="Items.ElementAt(index)" SetCheckCallback="item => SelectedItems.Contains(item) ? CheckBoxState.Checked : CheckBoxState.UnChecked" ToggleCallback="ToggleCheck"></Checkbox></td>
|
||||
<td class="table-col-checkbox"><Checkbox TItem="TItem" Item="Items.ElementAt(index)" SetCheckCallback="item => SelectedItems.Contains(item) ? CheckBoxState.Checked : CheckBoxState.UnChecked" OnClick="ToggleCheck"></Checkbox></td>
|
||||
}
|
||||
@if (ShowLineNo)
|
||||
{
|
||||
|
@ -125,7 +125,7 @@
|
|||
<tr>
|
||||
@if (ShowCheckbox)
|
||||
{
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" ToggleCallback="ToggleCheck"></Checkbox></th>
|
||||
<th class="table-col-checkbox"><Checkbox TItem="TItem" SetCheckCallback="CheckState" OnClick="ToggleCheck"></Checkbox></th>
|
||||
}
|
||||
@if (ShowLineNo)
|
||||
{
|
||||
|
@ -146,7 +146,7 @@
|
|||
<tr>
|
||||
@if (ShowCheckbox)
|
||||
{
|
||||
<td class="table-col-checkbox"><Checkbox TItem="TItem" Item="Items.ElementAt(index)" SetCheckCallback="item => SelectedItems.Contains(item) ? CheckBoxState.Checked : CheckBoxState.UnChecked" ToggleCallback="ToggleCheck"></Checkbox></td>
|
||||
<td class="table-col-checkbox"><Checkbox TItem="TItem" Item="Items.ElementAt(index)" SetCheckCallback="item => SelectedItems.Contains(item) ? CheckBoxState.Checked : CheckBoxState.UnChecked" OnClick="ToggleCheck"></Checkbox></td>
|
||||
}
|
||||
@if (ShowLineNo)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@inherits MenusBase
|
||||
|
||||
<EditPage Id="menu" FixedHeader="@FixedHeader" TItem="Bootstrap.Security.BootstrapMenu" SubmitModalTitle="菜单编辑窗口" QueryModel="QueryModel" OnQuery="Query" OnAdd="Add" OnDelete="Delete" OnSave="Save" OnResetSearch="ResetSearch">
|
||||
<EditPage @ref="EditPage" Id="menu" FixedHeader="@FixedHeader" TItem="Bootstrap.Security.BootstrapMenu" SubmitModalTitle="菜单编辑窗口" QueryModel="QueryModel" OnQuery="Query" OnAdd="Add" OnDelete="Delete" OnSave="Save" OnResetSearch="ResetSearch">
|
||||
<QueryBody>
|
||||
<LgbInputText ColumnClass="col-sm-auto" @bind-Value="@context.Name" maxlength="50" />
|
||||
<LgbInputText ColumnClass="col-sm-auto" @bind-Value="@context.ParentName" maxlength="50" />
|
||||
|
@ -54,3 +54,9 @@
|
|||
</div>
|
||||
</EditTemplate>
|
||||
</EditPage>
|
||||
|
||||
<AssignModal @ref="AssignRoleModal" TItem="Bootstrap.DataAccess.Role" Id="menu-role" Title="角色授权窗口" OnSave="SaveRoles">
|
||||
<ItemTemplate>
|
||||
<Checkbox TItem="Bootstrap.DataAccess.Role" Item="@context" Text="@context.RoleName" SetCheckCallback="SetCheck" OnClick="OnClick" />
|
||||
</ItemTemplate>
|
||||
</AssignModal>
|
|
@ -20,6 +20,11 @@ namespace Bootstrap.Admin.Pages.Views.Admin.Components
|
|||
[Inject]
|
||||
protected AuthenticationStateProvider? AuthenticationStateProvider { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 Modal 实例
|
||||
/// </summary>
|
||||
protected AssignModalBase<Role>? AssignRoleModal { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 菜单类别
|
||||
/// </summary>
|
||||
|
@ -168,11 +173,50 @@ namespace Bootstrap.Admin.Pages.Views.Admin.Components
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 分配角色方法
|
||||
/// 弹窗分配角色方法
|
||||
/// </summary>
|
||||
protected void AssignRoles()
|
||||
{
|
||||
|
||||
// 菜单对角色授权操作
|
||||
if (EditPage != null && EditPage.SelectedItems.Any())
|
||||
{
|
||||
var menuId = EditPage.SelectedItems.First().Id;
|
||||
if (!string.IsNullOrEmpty(menuId))
|
||||
{
|
||||
var roles = RoleHelper.RetrievesByMenuId(menuId);
|
||||
AssignRoleModal?.Update(roles);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存授权角色方法
|
||||
/// </summary>
|
||||
protected bool SaveRoles(IEnumerable<Role> roles)
|
||||
{
|
||||
bool ret = false;
|
||||
if (EditPage != null && EditPage.SelectedItems.Any())
|
||||
{
|
||||
var menuId = EditPage.SelectedItems.First().Id;
|
||||
var roleIds = roles.Where(r => r.Checked == "checked").Select(r => r.Id ?? "");
|
||||
if (!string.IsNullOrEmpty(menuId)) ret = RoleHelper.SavaByMenuId(menuId, roleIds);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择框点击时调用此方法
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <param name="check"></param>
|
||||
protected void OnClick(Role item, bool check)
|
||||
{
|
||||
item.Checked = check ? "checked" : "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置初始化值
|
||||
/// </summary>
|
||||
protected CheckBoxState SetCheck(Role item) => item.Checked == "checked" ? CheckBoxState.Checked : CheckBoxState.UnChecked;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,11 @@ namespace Bootstrap.Admin.Pages.Views.Admin.Components
|
|||
[Parameter]
|
||||
public bool FixedHeader { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 EditPage 实例
|
||||
/// </summary>
|
||||
protected EditPageBase<TItem>? EditPage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 TItem 实例
|
||||
/// </summary>
|
||||
|
|
Loading…
Reference in New Issue