例图

目前的样式是这样的:

其中角色在一个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)--编辑角色的更多相关文章

  1. 从零开始Blazor Server(11)--编辑用户

    用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...

  2. 从零开始Blazor Server(12)--编辑菜单

    上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...

  3. 从零开始Blazor Server(1)--项目搭建

    项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...

  4. 从零开始Blazor Server(3)--添加cookie授权

    认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...

  5. 从零开始Blazor Server(15)--总结

    我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...

  6. 从零开始Blazor Server(2)--整合数据库

    开篇 上一篇文章我们留了个尾巴,没有把freesql整合进去,这篇文章我们来整合. 目前的思路呢,是做一个简单的四不像的RABC,也有用户.角色. 权限三部分. 但是其中每个用户只有一个角色,即用户和 ...

  7. 从零开始Blazor Server(4)--登录系统

    说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...

  8. 从零开始Blazor Server(5)--权限验证

    序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...

  9. 从零开始Blazor Server(6)--基于策略的权限验证

    写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...

随机推荐

  1. 开源LIMS系统miso LIMS(适用于NGS基因测序)

    开源地址 https://github.com/miso-lims/miso-lims github加速可使用:https://kfqbvpat.fast-github.tk/-----https:/ ...

  2. 计算机网络 - HTTP和HTTPS的区别

    计算机网络 - HTTP和HTTPS的区别 http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份. https具有安全性的ssl加密传输协议,加密采用对称加密. https协议需要 ...

  3. CabloyJS v4.0.0支持工作流引擎及更多 🎉

    截至2020年12月21日冬至,花了近5年时间作出最小可用NodeJS开源全栈框架,这就是CabloyJS V4.0.0 5年,90个模块,30万行代码,5400次提交(Commits),开启Node ...

  4. ConfigurationManager姿势快闪

    C# ConfigurationManager使用记录 最近一个祖传代码是使用.NET Fx写就的,我在使用控制台程序获取配置时有些折腾. 下面记录一些管理配置文件的姿势: Configuration ...

  5. 从零开始实现lmax-Disruptor队列(二)多消费者、消费者组间消费依赖原理解析

    MyDisruptor V2版本介绍 在v1版本的MyDisruptor实现单生产者.单消费者功能后.按照计划,v2版本的MyDisruptor需要支持多消费者和允许设置消费者组间的依赖关系. 由于该 ...

  6. 第2章 C++编程入门

    C++中的数据分为常量和变量. 2.1常量(Constants) 顾名思义,常量的值在程序中不能改变 Type of constant(常量数据类型) | integer:整型 | floating- ...

  7. 认识一下什么是JSP

    摘要:JSP,全称是Java Server Pages,即Java服务器页面,是由Sun Microsystems公司主导创建的一种动态网页技术标准. 本文分享自华为云社区<Java服务器页面- ...

  8. 聊聊 C++ 和 C# 中的 lambda 玩法

    这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我 ...

  9. 23.Nginx+keepalived负载均衡高可用

    Nginx+keepalived负载均衡高可用 结构图 环境: 主 服务器:192.168.239.10 备 服务器:192.168.239.20 Web 服务器1:192.168.239.40 We ...

  10. Phantomjs实用代码段(持续更新中……)

    一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...