从零开始Blazor Server(10)

例图

目前的样式是这样的:

role.png

其中角色在一个table里,然后可以增删改查,并且可以给指定的用户分配权限。

创建文件

首先我们在Pages/Admin目录下新建一个Role.razor。因为我们的Admin目录已经使用了_Import来给整个文件夹添加了授权特性,所以我们就无需再次添加了。

添加table

这里添加一个table来显示所有的角色。

<Table TItem="RoleEntity" IsBordered="true" ShowAddButton="true" ShowToolbar="true"        ShowExtendButtons="true" ShowDeleteButtonCallback="entity =>  entity.Id != 1"        OnQueryAsync="OnQueryAsync" OnSaveAsync="OnSaveAsync">     <TableColumns>         <TableColumn @bind-Field="@context.Name"></TableColumn>     </TableColumns>     <RowButtonTemplate>         <TableCellButton Color="Color.Success" Icon="fa fa-edit" Text="编辑权限" OnClick="() => RoleClick(context)"></TableCellButton>     </RowButtonTemplate> </Table>

这里稍微解释一下这个Table。

ShowAddButton="true" ShowToolbar="true"让table显示工具栏并且显示添加按钮。

ShowExtendButtons="true"显示每行的扩展按钮。

ShowDeleteButtonCallback="entity => entity.Id != 1"这个注意一下,我们要保留一个管理员权限不能删除,所以我们这里强制让RoleId=1的列不显示删除按钮,这样我们就不能删除这一列了。

OnQueryAsync="OnQueryAsync" OnSaveAsync="OnSaveAsync"这两个方法一个是查询时使用的,返回数据。一个是保存时使用的,修改的数据入库。

<TableCellButton Color="Color.Success" Icon="fa fa-edit" Text="编辑权限" OnClick="() => RoleClick(context)"></TableCellButton>这里我们新增一个按钮,这个按钮就叫编辑权限,里面我们可以给这个角色赋权。

编写方法

OnQueryAsync:

private Task<QueryData<RoleEntity>> OnQueryAsync(QueryPageOptions arg)     {         var roles = RoleEntity.Select.IncludeMany(x => x.Permissions).Page(arg.PageIndex, arg.PageItems)             .Count(out var count).ToList();         return Task.FromResult<QueryData<RoleEntity>>(new QueryData<RoleEntity>()         {             TotalCount = (int)count,             Items = roles         });     }

这里没啥说的,就是使用分页参数来分页,并且返回总行数和分页数据。这里我们不涉及搜索之类的高级选项,所以整体非常简单。

OnSaveAsync

private Task<bool> OnSaveAsync(RoleEntity arg1, ItemChangedType arg2)     {         arg1.Save();         return Task.FromResult<bool>(true);     }

这个处理更简单,直接Save就好了。

RoleClick:

private void RoleClick(RoleEntity roleEntity)     {         RoleEntity = roleEntity;         Menus = CascadingTree(MenuEntity.Select.ToList(), roleEntity.Permissions, new TreeViewItem<MenuEntity>(new MenuEntity())).ToList();         RoleModal?.Toggle();     }          private IEnumerable<TreeViewItem<MenuEntity>> CascadingTree(IEnumerable<MenuEntity> items, IEnumerable<MenuEntity>? selectedItems, TreeViewItem<MenuEntity> parent) => items.Where(i => i.ParentId == parent.Value.Id).Select(i =>     {         var item = new TreeViewItem<MenuEntity>(i)         {             Text = i.Name,             Icon = i.Icon,             Value = i         };         item.Items = CascadingTree(items, selectedItems, item).ToList();         item.Parent = parent;         if (selectedItems?.Any(x => x.Id == i.Id) == true)         {             item.CheckedState = CheckboxState.Checked;         }         return item;     });

这里的分配权限点击后有两个事要做,一个是获取到所有的Menu,并且做成TreeItem的List,并且根据本身的权限给tree进行勾选。另一个就是打开Modal。

添加Modal

这里我们直接使用Modal来做了,理解起来相对比较简单,如果是正式项目,建议还是使用Dialog来做,更清晰一些。

这里我们在项目里继续加上Modal

<Modal @ref="RoleModal">     <ModalDialog Title="编辑权限">         <BodyTemplate>             <TreeView TItem="MenuEntity" Items="@Menus" ShowCheckbox="true" AutoCheckParent="true" AutoCheckChildren="true"></TreeView>         </BodyTemplate>         <FooterTemplate>             <Button OnClick="SavePermission">保存</Button>         </FooterTemplate>     </ModalDialog> </Modal>

这个Modal只有一个功能,就是在Save的时候获取到所有的已勾选权限,存库。

private void SavePermission()     {         if (RoleEntity == null)         {             return;         }         var menus = new List<MenuEntity>();         SaveRole(Menus!.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);         RoleEntity.Permissions = menus;         RoleEntity.SaveMany(nameof(RoleEntity.Permissions));         RoleModal?.Toggle();     }      private void SaveRole(IEnumerable<TreeViewItem<MenuEntity>> items, List<MenuEntity> menus)     {         menus.AddRange(items.Select(x => x.Value));         foreach (var treeViewItem in items)         {             if (treeViewItem.Items.Any(x => x.CheckedState != CheckboxState.UnChecked))             {                 SaveRole(treeViewItem.Items.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);             }         }     }

代码在Github:https://github.com/j4587698/BlazorLearn,分支lesson10。

商匡云商
Logo
注册新帐户
对比商品
  • 合计 (0)
对比
0
购物车