从零开始Blazor Server(10)--编辑角色
例图
目前的样式是这样的:

其中角色在一个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。
从零开始Blazor Server(10)--编辑角色的更多相关文章
- 从零开始Blazor Server(11)--编辑用户
用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...
- 从零开始Blazor Server(12)--编辑菜单
上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...
- 从零开始Blazor Server(1)--项目搭建
项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...
- 从零开始Blazor Server(3)--添加cookie授权
认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...
- 从零开始Blazor Server(15)--总结
我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...
- 从零开始Blazor Server(2)--整合数据库
开篇 上一篇文章我们留了个尾巴,没有把freesql整合进去,这篇文章我们来整合. 目前的思路呢,是做一个简单的四不像的RABC,也有用户.角色. 权限三部分. 但是其中每个用户只有一个角色,即用户和 ...
- 从零开始Blazor Server(4)--登录系统
说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...
- 从零开始Blazor Server(5)--权限验证
序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...
- 从零开始Blazor Server(6)--基于策略的权限验证
写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...
随机推荐
- Android7.1.2 源码编译并烧写Nexus5X
1.环境配置 Ubuntu18.04 openJDK1.8 Python2.7 2.更新Ubuntu镜像源 编辑/etc/apt/source.list,替换为以下内容 deb http://mirr ...
- 爷青回,canal 1.1.6来了,几个重要特性和bug修复
刚刚在群里看到消息说,时隔一年,canal 1.1.6正式release了,赶紧上去看看有什么新特性. (居然才发布了6个小时,前排围观) 1.什么是canal canal [kə'næl],译意为水 ...
- MIT 6.824(Spring 2020) Lab1: MapReduce 文档翻译
首发于公众号:努力学习的阿新 前言 大家好,这里是阿新. MIT 6.824 是麻省理工大学开设的一门关于分布式系统的明星课程,共包含四个配套实验,实验的含金量很高,十分适合作为校招生的项目经历,在文 ...
- lanedet项目调试记录
苦水时间:最近深度学习调代码真的是调的郁闷,每次调都是旧的问题没有解决,新的问题又冒出来了.新的好不容易解决了,旧的问题还是没有解决思路解决不了. 正文 最近找到一个实现了很多车道线检测算法的gith ...
- Kubernetes Job Controller 原理和源码分析(三)
概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...
- mysql 开启binlog日志,恢复误删的表、数据、mysql库
linux下开启mysql的binlog日志功能 1.配置mysql配置文件my.cnf(内容如下). #配置文件储存的位置log-bin=mysql-bin#5.7以及以上版本需要配置这一行(保证唯 ...
- 线上问题定位利器 jprofiler
1.导出dump windows: jps -l 查看Java进行 jmap -dump:format=b,file=webapi.hprof 20840 查看进程,根据进程号导出hprof文件 ...
- 国内外组态软件对比分析(InTouch、WinCC、iFix、iNeuOS)
在我国自动化控制领域应用较广泛的工业自动化组态软件有Wonderware公司InTouch.西门子公司Wincc.GE公司iFix.国内也有一些传统组态软件厂商,使用的功能和形式基本上十分类似,受当时 ...
- 为什么 C# 访问 null 字段会抛异常?
一:背景 1. 一个有趣的话题 最近在看 硬件异常 相关知识,发现一个有意思的空引用异常问题,拿出来和大家分享一下,为了方便讲述,先上一段有问题的代码. namespace ConsoleApp2 { ...
- 名校AI课推荐 | UC Berkeley《人工智能导论》
深度学习具备强感知能力但缺乏一定的决策能力,强化学习具备决策能力但对感知问题束手无策,因此将两者结合起来可以达到优势互补的效果,为复杂系统的感知决策问题提供了解决思路. 今天我们推荐这样一门课程--U ...