Skip to content

角色与权限控制

通过 config.permissionsconfig.roles,可以在设计器中预置权限树和角色树。配置后,逻辑条件里可直接按「权限 / 角色」判断,也可在计算公式中使用 HAS_PERMISSIONHAS_ROLE,实现字段显隐、必填、禁用等业务授权。

4-1.png ## 数据结构

权限与角色使用相同的树形结构:

ts
type AuthNode = {
    // 唯一标识,条件判断与公式校验时使用该值
    value: string;
    // 显示名称
    label: string;
    // 子级节点
    children?: AuthNode[];
};

type AuthList = AuthNode[];

预置权限与角色列表

将权限树、角色树写入设计器 config 后,逻辑条件的类型选择中才会出现「权限」「角色」选项。

vue
<template>
    <fc-designer ref="designer" :config="config"/>
</template>
<script setup>
    const config = {
        permissions: [
            {
                value: 'system',
                label: '系统管理',
                children: [
                    {
                        value: 'system:user',
                        label: '用户管理',
                        children: [
                            { value: 'system:user:list', label: '用户列表' },
                            { value: 'system:user:create', label: '新增用户' },
                            { value: 'system:user:edit', label: '编辑用户' },
                            { value: 'system:user:delete', label: '删除用户' },
                        ],
                    },
                    {
                        value: 'system:role',
                        label: '角色管理',
                        children: [
                            { value: 'system:role:list', label: '角色列表' },
                            { value: 'system:role:assign', label: '分配权限' },
                        ],
                    },
                ],
            },
            {
                value: 'goods',
                label: '商品管理',
                children: [
                    { value: 'goods:info:list', label: '商品列表' },
                    { value: 'goods:info:create', label: '发布商品' },
                    { value: 'goods:info:export', label: '导出商品' },
                ],
            },
        ],
        roles: [
            {
                value: 'platform',
                label: '平台端',
                children: [
                    { value: 'platform:admin:super', label: '超级管理员' },
                    { value: 'platform:admin:ops', label: '运营管理员' },
                    { value: 'platform:staff:cs', label: '客服专员' },
                ],
            },
            {
                value: 'merchant',
                label: '商户端',
                children: [
                    { value: 'merchant:store:manager', label: '店长' },
                    { value: 'merchant:store:cashier', label: '收银员' },
                    { value: 'merchant:ops:goods', label: '商品运营' },
                ],
            },
        ],
    };
</script>

说明:

  • 未配置或配置为空数组时,条件面板不会显示对应类型。
  • value 建议使用稳定的业务编码(如 system:user:list),便于前后端统一。
  • 该配置只定义「可选清单」,不等于当前用户已拥有的权限或角色。

注入当前用户权限与角色

运行时(含设计器预览)需要把当前用户实际拥有的权限、角色写入全局数据,逻辑条件与公式才能正确判断。

数据 Key说明数据类型
$permissions当前用户拥有的权限标识列表string[]
$roles当前用户拥有的角色标识列表string[]
js
// 登录成功或进入表单页时注入
formCreate.setData('$permissions', [
    'system:user:list',
    'system:user:edit',
    'goods:info:list',
]);

formCreate.setData('$roles', [
    'merchant:store:manager',
]);

也可在表单事件中通过 API 动态更新:

js
function onFormMounted($inject) {
    const api = $inject.api;
    api.setData('$permissions', ['system:user:list']);
    api.setData('$roles', ['platform:admin:ops']);
}

在逻辑条件中使用

4.png

配置好权限 / 角色列表后,可在隐藏条件、必填条件、禁用条件、数据联动、组件联动等逻辑条件中选择:

  1. 条件类型选择 权限角色
  2. 比较方式选择 包含 / 不包含
  3. 从树中选择目标权限或角色

典型场景:

  • 无「导出商品」权限时隐藏导出按钮
  • 非「店长」角色时禁用金额字段
  • 拥有「审核管理员」角色时显示审批区

在计算公式中使用

内置两个高阶函数,可直接判断当前用户是否拥有指定权限或角色:

函数说明示例
HAS_PERMISSION检查当前用户是否拥有指定权限HAS_PERMISSION("system:user:list") = true
HAS_ROLE检查当前用户是否拥有指定角色HAS_ROLE("merchant:store:manager") = true
text
HAS_PERMISSION("goods:info:export")
text
IF(HAS_ROLE("platform:admin:super"), true, false)

完整函数说明见内置公式函数

与组件操作权限的区别

能力配置项作用对象
角色与权限控制permissions / roles + $permissions / $roles表单运行态业务授权(显隐、必填、禁用、计算等)
组件操作权限componentPermission设计器内组件的编辑操作与配置项权限

二者互不影响,可按场景配合使用。组件操作权限详见控制组件操作权限

注意事项

  • 逻辑条件判断的是 $permissions / $roles 中是否包含所选 value,请保证注入值与树节点 value 一致。
  • 权限、角色变更后需重新 setData,已打开的表单才会按新授权生效。
  • 建议在所有实际渲染表单的渲染器实例上同步写入相同数据,避免设计预览与正式运行结果不一致。