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写完权限代码,加上写完这篇文章,总用时不到一个小时。