ERP系统的出入库功能需要精细控制权限,本文演示如何给页面增加自定义权限子项,并根据权限控制按钮显示和功能使用。
源码地址:https://github.com/NewLifeX/NewLife.ERP
基础知识
魔方使用标识位来控制权限项,Int32最多支持32种权限。内置排到了8,用户自定义权限可以从16开始。
重载批量操作视图
给采购单和销售单重载 _List_Toolbar_Batch 视图
这里放置了三个按钮,各自使用不同的权限控制,如果没有该权限,则直接不显示该按钮。
代码如下:
@using NewLife.Common; @{ var user = ViewBag.User as IUser ?? User.Identity as IUser; var fact = ViewBag.Factory as IEntityFactory; var set = ViewBag.PageSetting as PageSetting; } @if (set.EnableSelect) { if (this.Has((PermissionFlags)16)) { <button type="button" class="btn btn-purple btn-sm" data-action="action" data-url="@Url.Action("SetIn")" data-fields="keys" disabled> 入库 </button> } if (this.Has((PermissionFlags)32)) { <button type="button" class="btn btn-purple btn-sm" data-action="action" data-url="@Url.Action("CancelIn")" data-fields="keys" disabled> 取消入库 </button> } if (this.Has(PermissionFlags.Update)) { <button type="button" class="btn btn-purple btn-sm" data-action="action" data-url="@Url.Action("Fix")" data-fields="keys" disabled> 修正 </button> } }
运行项目,效果如下:
三个按钮默认是禁用状态,在下发有数据行选中后,将会高亮可点击。
实现批量操作接口
每个按钮对应后台控制器的一个Action接口,这里也必须验证权限,避免接口被非法调用。
相对于一般的接口,这个方法多了权限特性和名称特性,指定使用32号权限位,同时该权限名是“取消入库”。代码如下:
/// <summary>批量取消入库</summary> /// <returns></returns> [EntityAuthorize((PermissionFlags)32)] [DisplayName("取消入库")] public ActionResult CancelIn() { var count = 0; var ids = GetRequest("keys").SplitAsInt(); if (ids.Length > 0) { using var tran = PurchaseOrder.Meta.CreateTrans(); foreach (var id in ids) { var entity = PurchaseOrder.FindById(id); if (entity != null) count += _purchaseService.CancelIn(entity); } tran.Commit(); } return JsonRefresh($"共处理[{count}]个订单"); }
其它几个接口类似,不再重复。
设置自定义权限
启动项目,进入“系统管理”、“角色”页,双击(编辑)进入任意角色。
从权限设置页可以看到,多出来了出入库相关的权限设置。
进入销售单菜单页面,可以看到多出来“出库”和“取消出库”的权限子项,它们的数值分别是16和32。
到这里,自定义功能权限完成。
今早8点起床,给ERP写完权限代码,加上写完这篇文章,总用时不到一个小时。