Skip to main content

资源管理

资源管理中主要管理的是需要存入资源表,来做权限控制的资源,默认存在的资源类型为RESOURCE,比如需要被权限控制的前端页面或者按钮等资源。这种需要存入资源表的数据,可扩展类型,也就是自定义资源类型

初始化资源管理,如果用户管理和角色管理中需要配置这些资源的权限,则需把这个ResourceStore放在UserManagementStore和RoleStore之前初始化。

import { systemStore, systemStoreNames, ResourceStore } from 'mlog-service';
systemStore.set(systemStoreNames.resourceStore, new ResourceStore({
  resources: [
    {
      key: 'RESOURCE',
      name: '资源',
    }
  ]
})); // 或者不传参,也会默认生成RESOURCE类型

新增资源时需填写的几个字段有如下含义和规则:

1)资源名称:资源名称就是表示资源的中文名,可重复,如果这个资源表示的是一整个页面,建议统一命名为访问权限;如果表示页面中的一部分,比如按钮或者表格,可根据实际含义命名。

2)分组:分组是为了在权限配置中将资源列表展示为树形结构,这个分组需要填写为这个资源的父级,一般为中文。

3)资源标识符:需要在这个app下唯一,所以建议命名为:分组/资源名称。用户登录后接口会返回用户有无资源权限的列表,列表中的key就是这里的资源标识符,value就是有无权限,所以前端项目代码中要根据这个来控制相关要素展示与否。

4)是否仅管理员可用:表示只有超级管理员和管理员的资源权限配置列表中才能看到这个资源。

比如:

新增一个资源表示首页的页面。 资源名称:访问权限,分组:首页,资源标识符:home

新增一个资源表示首页页面下的数据列表表格。 资源名称:数据列表,分组:首页,资源标识符:home/dataList

这里配置出来的资源树有个特征:有子节点的父节点不代表具体的资源,只是作为分组展示。所有的叶子节点才表示资源。所以上面两个例子中,虽然首页和首页下的数据列表是包含关系,但是它们在同一级,父节点都是首页。
资源新增之后,如果是超管角色的,默认权限就是有该资源的权限,如果是其他角色,默认权限是无该资源权限。(后端的逻辑)

对应的前端资源判断是否展示

mlog-servie中的userStore中提供了一个hasAuth(资源标识符)的方法,返回true或false,表示有无权限,页面上可根据这个展示相关要素,示例代码如下:

// global.store.ts
import { getMLogServiceConfig } from 'mlog-service';

public get config() {
  return getMLogServiceConfig();
}
/**
* 有无权限
* @param identifier 资源标识符
* @returns 
*/
public hasAuth(identifier: string): boolean {
  return this.config?.userStore?.hasAuth(identifier);
}

// tsx
import React from 'react';
...
return (
  <div>
    {globalStore.hasAuth('home/dataList') ?
      <div>数据列表</div>
    : null}
  </div>
)

视图类型

配置的资源在用户和角色权限配置中有两种展现形式,一个是表格形式(table),一个是树形结构(tree),在初始化ResourceStore时,每种资源类型中有个allowedViewTypes参数来控制在用户和角色权限配置中以哪种方式展示。

systemStore.set(systemStoreNames.resourceStore, new ResourceStore({
  resources: [
    {
      key: 'RESOURCE',
      name: '资源',
      allowedViewTypes: ['tree', 'table']
    },
  ]
}));

自定义资源类型

资源管理中除了管理资源类型为RESOURCE的资源外,也能添加自定义类型的资源,添加的规则和权限的控制同RESOURCE一样。比如添加资源类型为AREA的资源,表示区域。

systemStore.set(systemStoreNames.resourceStore, new ResourceStore({
  resources: [
    {
      key: 'RESOURCE',
      name: '资源',
    },
    {
      key: 'AREA', // 资源类型:ResourceType
      name: '区域', // 资源名称
      allowedViewTypes: ['tree'], // 在权限配置中该资源展示的视图类型为树形
    }
  ]
}));

自定义资源类型的时候,需要将这里定义的资源类型resource key告知后端,后端也需要配置。需要后端同步.../kuzzle/_me接口返回的内容。

使用外部资源数据

使用外部资源数据是指不在资源表内进行维护的资源,一般是项目特有情况。这时需要将资源数据通过datas参数传入ResourceStore。这种资源类型命名规则为EX_${string}

// 水质项目中的外部资源,一般是在项目中获取到资源数据后,按照type IResourceItem类型组装。
const devices: IResourceItem[] = [
  {
    id: "K68220016", // 资源ID,设置为和identifier一样的
    identifier: "K68220016", // 资源标识符
    name: "K68220016", // 资源名称
    tag: "江苏省/太湖", // 表示分组,如:所属省份/点位
    path: "江苏省/太湖/K68220016", // 表示路径,规则为tag/id。在资源表中的资源,这个字段是添加资源时后端自动生成的,外部资源的话需要手动传入
    type: "EX_DEVICE", // 资源类型
    isAdmin: false // 是否仅超级管理员可用
  },
  {
    id: "G02409568",
    identifier: "G02409568",
    name: "G02409568",
    tag: "江苏省/太湖",
    path: "江苏省/太湖/G02409568",
    type: "EX_DEVICE",
    isAdmin: false
  },
  {
    id: "L43020758",
    identifier: "L43020758",
    name: "L43020758",
    tag: "江苏省/太湖",
    path: "江苏省/太湖/L43020758",
    type: "EX_DEVICE",
    isAdmin: false
  }
]
// 在初始化用户和角色前,先初始化资源。因为用户和角色的权限配置中需用到这里的入参资源
systemStore.set(systemStoreNames.resourceStore, new ResourceStore({
  resources: [
    {
      key: 'RESOURCE',
      name: '资源',
    },
    {
      key: 'AREA',
      name: '区域',
      allowedViewTypes: ['tree'],
    },
    {
      key: 'EX_DEVICE',
      name: '设备',
      datas: devices,
      allowedViewTypes: ['tree'],
    }
  ]
}));

外部资源目前没有在资源管理中展示,会直接展示到用户或者角色的权限配置中。需要在相应的store的allowedResourceTypes参数(权限设置中显示的资源类型)中添加EX_DEVICE,见用户权限设置

数据表权限中使用到的一些数据资源

1、全局单日查询量 DATA_TABLE_LIMIT_COUNT

2、条件模板库 DATA_TABLE_CONFIG