Przeglądaj źródła

feat(按钮权限): 添加按钮权限函数

xieyonghong 3 lat temu
rodzic
commit
24b6313455
3 zmienionych plików z 152 dodań i 107 usunięć
  1. 2 1
      src/pages/device/Instance/index.tsx
  2. 42 2
      src/utils/menu/index.ts
  3. 108 104
      src/utils/menu/router.ts

+ 2 - 1
src/pages/device/Instance/index.tsx

@@ -29,7 +29,7 @@ import { ProTableCard } from '@/components';
 import SystemConst from '@/utils/const';
 import Token from '@/utils/token';
 import DeviceCard from '@/components/ProTableCard/CardItems/device';
-import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
+import { getMenuPathByParams, MENUS_CODE, getButtonPermission } from '@/utils/menu';
 
 export const statusMap = new Map();
 statusMap.set('在线', 'success');
@@ -393,6 +393,7 @@ const Instance = () => {
               setCurrent({});
             }}
             style={{ marginRight: 12 }}
+            disabled={getButtonPermission('device/Instance', 'delete')}
             key="button"
             icon={<PlusOutlined />}
             type="primary"

+ 42 - 2
src/utils/menu/index.ts

@@ -1,10 +1,11 @@
 // 路由components映射
 import type { IRouteProps } from 'umi';
 import type { MenuItem } from '@/pages/system/Menu/typing';
-import { getDetailNameByCode, MENUS_CODE } from './router';
+import { BUTTON_PERMISSION, getDetailNameByCode, MENUS_CODE, MENUS_CODE_TYPE } from './router';
 
 /** localStorage key */
 export const MENUS_DATA_CACHE = 'MENUS_DATA_CACHE';
+export const MENUS_BUTTONS_CACHE = 'MENUS_BUTTONS_CACHE';
 
 const DetailCode = 'detail';
 
@@ -196,17 +197,56 @@ export const getMenus = (extraRoutes: IRouteProps[]): any[] => {
 export const saveMenusCache = (routes: MenuItem[]) => {
   const list: MenuItem[] = flatRoute(routes);
   const listObject = {};
+  const buttons = {};
   list.forEach((route) => {
     listObject[route.code] = route.url;
   });
+  // 过滤按钮权限
+  list
+    .filter((item) => item.buttons)
+    .forEach((item) => {
+      buttons[item.code] = item.buttons.map((btn) => btn.id);
+    });
   try {
     localStorage.setItem(MENUS_DATA_CACHE, JSON.stringify(listObject));
+    localStorage.setItem(MENUS_BUTTONS_CACHE, JSON.stringify(buttons));
   } catch (e) {
-    console.log(e);
+    console.warn(e);
   }
 };
 
 /**
+ * 匹配按钮权限
+ * @param code 路由code
+ * @param permission {string | string[]} 权限名称
+ */
+export const getButtonPermission = (
+  code: MENUS_CODE_TYPE,
+  permission: BUTTON_PERMISSION | BUTTON_PERMISSION[],
+): boolean => {
+  let buttons = {};
+  try {
+    const buttonString = localStorage.getItem(MENUS_BUTTONS_CACHE);
+    buttons = JSON.parse(buttonString || '{}');
+  } catch (e) {
+    console.warn(e);
+  }
+
+  if (!!Object.keys(buttons).length) {
+    const _buttonArray = buttons[code];
+    return !_buttonArray.some((btnId: string) => {
+      if (typeof permission === 'string') {
+        return permission === btnId;
+      } else {
+        return permission.includes(btnId);
+      }
+      return false;
+    });
+  }
+  return true;
+};
+
+/**
  * 通过缓存的数据取出相应的路由url
  * @param code
  */

+ 108 - 104
src/utils/menu/router.ts

@@ -1,108 +1,112 @@
 /** 路由Code */
-export const MENUS_CODE = {
-  'Analysis/CPU': 'Analysis/CPU',
-  'Analysis/DeviceChart': 'Analysis/DeviceChart',
-  'Analysis/DeviceMessage': 'Analysis/DeviceMessage',
-  'Analysis/Jvm': 'Analysis/Jvm',
-  'Analysis/MessageChart': 'Analysis/MessageChart',
-  Analysis: 'Analysis',
-  'cloud/Aliyun': 'cloud/Aliyun',
-  'cloud/Ctwing': 'cloud/Ctwing',
-  'cloud/DuerOS': 'cloud/DuerOS',
-  'cloud/Onenet': 'cloud/Onenet',
-  'device/Alarm': 'device/Alarm',
-  'device/Category/Save': 'device/Category/Save',
-  'device/Category': 'device/Category',
-  'device/Command': 'device/Command',
-  'device/DataSource': 'device/DataSource',
-  'device/Firmware/Save': 'device/Firmware/Save',
-  'device/Firmware': 'device/Firmware',
-  'device/Instance': 'device/Instance',
-  'device/Location': 'device/Location',
-  'device/Product/Save': 'device/Product/Save',
-  'device/Product': 'device/Product',
-  'device/components/Alarm/Edit': 'device/components/Alarm/Edit',
-  'device/components/Alarm/Record': 'device/components/Alarm/Record',
-  'device/components/Alarm/Setting': 'device/components/Alarm/Setting',
-  'device/components/Alarm': 'device/components/Alarm',
-  'device/components/Metadata/Base/Edit': 'device/components/Metadata/Base/Edit',
-  'device/components/Metadata/Base': 'device/components/Metadata/Base',
-  'device/components/Metadata/Cat': 'device/components/Metadata/Cat',
-  'device/components/Metadata/Import': 'device/components/Metadata/Import',
-  'device/components/Metadata': 'device/components/Metadata',
-  'edge/Device': 'edge/Device',
-  'edge/Product': 'edge/Product',
-  'link/Certificate': 'link/Certificate',
-  'link/Gateway': 'link/Gateway',
-  'link/Opcua': 'link/Opcua',
-  'link/Protocol/Debug': 'link/Protocol/Debug',
-  'link/Protocol': 'link/Protocol',
-  'link/Type': 'link/Type',
-  'link/AccessConfig': 'link/AccessConfig',
-  Log: 'Log',
-  'media/Cascade': 'media/Cascade',
-  'media/Cascade/Save': 'media/Cascade/Save',
-  'media/Cascade/Channel': 'media/Cascade/Channel',
-  'media/Config': 'media/Config',
-  'media/Device': 'media/Device',
-  'media/Device/Channel': 'media/Device/Channel',
-  'media/Device/Playback': 'media/Device/Playback',
-  'media/Reveal': 'media/Reveal',
-  'media/Stream': 'media/Stream',
-  'media/Stream/Detail': 'media/Stream/Detail',
-  'notice/Type': 'notice/Type',
-  'notice/Config': 'notice/Config',
-  'media/SplitScreen': 'media/SplitScreen',
-  'notice/Type/Config': 'notice/Config',
-  'notice/Config/Detail': 'notice/Config/Detail',
-  'notice/Template': 'notice/Template',
-  'notice/Template/Detail': 'notice/Template/Detail',
-  'rule-engine/Instance': 'rule-engine/Instance',
-  'rule-engine/SQLRule': 'rule-engine/SQLRule',
-  'rule-engine/Scene': 'rule-engine/Scene',
-  'simulator/Device': 'simulator/Device',
-  'system/DataSource': 'system/DataSource',
-  'system/Department/Assets': 'system/Department/Assets',
-  'system/Department/Member': 'system/Department/Member',
-  'system/Department': 'system/Department',
-  'system/Menu': 'system/Menu',
-  'system/OpenAPI': 'system/OpenAPI',
-  'system/Permission': 'system/Permission',
-  'system/Role/Detail': 'system/Role/Detail',
-  'system/Role': 'system/Role',
-  'system/Tenant/Detail/Assets': 'system/Tenant/Detail/Assets',
-  'system/Tenant/Detail/Info': 'system/Tenant/Detail/Info',
-  'system/Tenant/Detail/Member': 'system/Tenant/Detail/Member',
-  'system/Tenant/Detail/Permission': 'system/Tenant/Detail/Permission',
-  'system/Tenant/Detail': 'system/Tenant/Detail',
-  'system/Tenant': 'system/Tenant',
-  'system/User': 'system/User',
-  'user/Login': 'user/Login',
-  'visualization/Category': 'visualization/Category',
-  'visualization/Configuration': 'visualization/Configuration',
-  'visualization/Screen': 'visualization/Screen',
-  'device/Firmware/Detail/History': 'device/Firmware/Detail/History',
-  'device/Firmware/Detail/Task/Detail': 'device/Firmware/Detail/Task/Detail',
-  'device/Firmware/Detail/Task/Release': 'device/Firmware/Detail/Task/Release',
-  'device/Firmware/Detail/Task/Save': 'device/Firmware/Detail/Task/Save',
-  'device/Firmware/Detail/Task': 'device/Firmware/Detail/Task',
-  'device/Firmware/Detail': 'device/Firmware/Detail',
-  'device/Instance/Detail/Config/Tags': 'device/Instance/Detail/Config/Tags',
-  'device/Instance/Detail/Config': 'device/Instance/Detail/Config',
-  'device/Instance/Detail/Functions': 'device/Instance/Detail/Functions',
-  'device/Instance/Detail/Info': 'device/Instance/Detail/Info',
-  'device/Instance/Detail/Log': 'device/Instance/Detail/Log',
-  'device/Instance/Detail/MetadataLog/Event': 'device/Instance/Detail/MetadataLog/Event',
-  'device/Instance/Detail/MetadataLog/Property': 'device/Instance/Detail/MetadataLog/Property',
-  'device/Instance/Detail/Running': 'device/Instance/Detail/Running',
-  'device/Instance/Detail': 'device/Instance/Detail',
-  'device/Product/Detail/BaseInfo': 'device/Product/Detail/BaseInfo',
-  'device/Product/Detail': 'device/Product/Detail',
-  'link/AccessConfig/Detail': 'link/AccessConfig/Detail',
-  'system/Menu/Detail': 'system/Menu/Detail',
-  'system/Department/Detail': 'system/Department/Detail',
-  'link/Type/Detail': 'link/Type/Detail',
-};
+export enum MENUS_CODE {
+  'Analysis/CPU' = 'Analysis/CPU',
+  'Analysis/DeviceChart' = 'Analysis/DeviceChart',
+  'Analysis/DeviceMessage' = 'Analysis/DeviceMessage',
+  'Analysis/Jvm' = 'Analysis/Jvm',
+  'Analysis/MessageChart' = 'Analysis/MessageChart',
+  Analysis = 'Analysis',
+  'cloud/Aliyun' = 'cloud/Aliyun',
+  'cloud/Ctwing' = 'cloud/Ctwing',
+  'cloud/DuerOS' = 'cloud/DuerOS',
+  'cloud/Onenet' = 'cloud/Onenet',
+  'device/Alarm' = 'device/Alarm',
+  'device/Category/Save' = 'device/Category/Save',
+  'device/Category' = 'device/Category',
+  'device/Command' = 'device/Command',
+  'device/DataSource' = 'device/DataSource',
+  'device/Firmware/Save' = 'device/Firmware/Save',
+  'device/Firmware' = 'device/Firmware',
+  'device/Instance' = 'device/Instance',
+  'device/Location' = 'device/Location',
+  'device/Product/Save' = 'device/Product/Save',
+  'device/Product' = 'device/Product',
+  'device/components/Alarm/Edit' = 'device/components/Alarm/Edit',
+  'device/components/Alarm/Record' = 'device/components/Alarm/Record',
+  'device/components/Alarm/Setting' = 'device/components/Alarm/Setting',
+  'device/components/Alarm' = 'device/components/Alarm',
+  'device/components/Metadata/Base/Edit' = 'device/components/Metadata/Base/Edit',
+  'device/components/Metadata/Base' = 'device/components/Metadata/Base',
+  'device/components/Metadata/Cat' = 'device/components/Metadata/Cat',
+  'device/components/Metadata/Import' = 'device/components/Metadata/Import',
+  'device/components/Metadata' = 'device/components/Metadata',
+  'edge/Device' = 'edge/Device',
+  'edge/Product' = 'edge/Product',
+  'link/Certificate' = 'link/Certificate',
+  'link/Gateway' = 'link/Gateway',
+  'link/Opcua' = 'link/Opcua',
+  'link/Protocol/Debug' = 'link/Protocol/Debug',
+  'link/Protocol' = 'link/Protocol',
+  'link/Type' = 'link/Type',
+  'link/AccessConfig' = 'link/AccessConfig',
+  Log = 'Log',
+  'media/Cascade' = 'media/Cascade',
+  'media/Cascade/Save' = 'media/Cascade/Save',
+  'media/Cascade/Channel' = 'media/Cascade/Channel',
+  'media/Config' = 'media/Config',
+  'media/Device' = 'media/Device',
+  'media/Device/Channel' = 'media/Device/Channel',
+  'media/Device/Playback' = 'media/Device/Playback',
+  'media/Reveal' = 'media/Reveal',
+  'media/Stream' = 'media/Stream',
+  'media/Stream/Detail' = 'media/Stream/Detail',
+  'notice/Type' = 'notice/Type',
+  'notice/Config' = 'notice/Config',
+  'media/SplitScreen' = 'media/SplitScreen',
+  'notice/Type/Config' = 'notice/Config',
+  'notice/Config/Detail' = 'notice/Config/Detail',
+  'notice/Template' = 'notice/Template',
+  'notice/Template/Detail' = 'notice/Template/Detail',
+  'rule-engine/Instance' = 'rule-engine/Instance',
+  'rule-engine/SQLRule' = 'rule-engine/SQLRule',
+  'rule-engine/Scene' = 'rule-engine/Scene',
+  'simulator/Device' = 'simulator/Device',
+  'system/DataSource' = 'system/DataSource',
+  'system/Department/Assets' = 'system/Department/Assets',
+  'system/Department/Member' = 'system/Department/Member',
+  'system/Department' = 'system/Department',
+  'system/Menu' = 'system/Menu',
+  'system/OpenAPI' = 'system/OpenAPI',
+  'system/Permission' = 'system/Permission',
+  'system/Role/Detail' = 'system/Role/Detail',
+  'system/Role' = 'system/Role',
+  'system/Tenant/Detail/Assets' = 'system/Tenant/Detail/Assets',
+  'system/Tenant/Detail/Info' = 'system/Tenant/Detail/Info',
+  'system/Tenant/Detail/Member' = 'system/Tenant/Detail/Member',
+  'system/Tenant/Detail/Permission' = 'system/Tenant/Detail/Permission',
+  'system/Tenant/Detail' = 'system/Tenant/Detail',
+  'system/Tenant' = 'system/Tenant',
+  'system/User' = 'system/User',
+  'user/Login' = 'user/Login',
+  'visualization/Category' = 'visualization/Category',
+  'visualization/Configuration' = 'visualization/Configuration',
+  'visualization/Screen' = 'visualization/Screen',
+  'device/Firmware/Detail/History' = 'device/Firmware/Detail/History',
+  'device/Firmware/Detail/Task/Detail' = 'device/Firmware/Detail/Task/Detail',
+  'device/Firmware/Detail/Task/Release' = 'device/Firmware/Detail/Task/Release',
+  'device/Firmware/Detail/Task/Save' = 'device/Firmware/Detail/Task/Save',
+  'device/Firmware/Detail/Task' = 'device/Firmware/Detail/Task',
+  'device/Firmware/Detail' = 'device/Firmware/Detail',
+  'device/Instance/Detail/Config/Tags' = 'device/Instance/Detail/Config/Tags',
+  'device/Instance/Detail/Config' = 'device/Instance/Detail/Config',
+  'device/Instance/Detail/Functions' = 'device/Instance/Detail/Functions',
+  'device/Instance/Detail/Info' = 'device/Instance/Detail/Info',
+  'device/Instance/Detail/Log' = 'device/Instance/Detail/Log',
+  'device/Instance/Detail/MetadataLog/Event' = 'device/Instance/Detail/MetadataLog/Event',
+  'device/Instance/Detail/MetadataLog/Property' = 'device/Instance/Detail/MetadataLog/Property',
+  'device/Instance/Detail/Running' = 'device/Instance/Detail/Running',
+  'device/Instance/Detail' = 'device/Instance/Detail',
+  'device/Product/Detail/BaseInfo' = 'device/Product/Detail/BaseInfo',
+  'device/Product/Detail' = 'device/Product/Detail',
+  'link/AccessConfig/Detail' = 'link/AccessConfig/Detail',
+  'system/Menu/Detail' = 'system/Menu/Detail',
+  'system/Department/Detail' = 'system/Department/Detail',
+  'link/Type/Detail' = 'link/Type/Detail',
+}
+
+export type MENUS_CODE_TYPE = keyof typeof MENUS_CODE;
+
+export type BUTTON_PERMISSION = 'add' | 'delete' | 'import' | 'view' | 'export' | 'update' | string;
 
 export const getDetailNameByCode = {
   'system/Menu/Detail': '菜单详情',