Kaynağa Gözat

fix(权限): 修改产品、设备跳转页面权限

xieyonghong 3 yıl önce
ebeveyn
işleme
4aa7d6ed79

+ 36 - 29
src/pages/device/Instance/Detail/Config/index.tsx

@@ -1,4 +1,4 @@
-import { Button, Descriptions, message, Popconfirm, Space, Tooltip } from 'antd';
+import { Descriptions, message, Space, Tooltip } from 'antd';
 import { InstanceModel, service } from '@/pages/device/Instance';
 import { useEffect, useState } from 'react';
 import type { ConfigMetadata } from '@/pages/device/Product/typings';
@@ -10,6 +10,7 @@ import {
   UndoOutlined,
 } from '@ant-design/icons';
 import Edit from './Edit';
+import { PermissionButton } from '@/components';
 
 const Config = () => {
   const params = useParams<{ id: string }>();
@@ -26,6 +27,7 @@ const Config = () => {
 
   const [metadata, setMetadata] = useState<ConfigMetadata[]>([]);
   const [visible, setVisible] = useState<boolean>(false);
+  const { permission } = PermissionButton.usePermission('device/Instance');
 
   const id = InstanceModel.detail?.id || params?.id;
 
@@ -83,7 +85,8 @@ const Config = () => {
       <div style={{ display: 'flex', marginBottom: 20 }}>
         <div style={{ fontSize: 16, fontWeight: 700 }}>配置</div>
         <Space>
-          <Button
+          <PermissionButton
+            isPermission={permission.update}
             type="link"
             onClick={async () => {
               setVisible(true);
@@ -91,48 +94,52 @@ const Config = () => {
           >
             <EditOutlined />
             编辑
-          </Button>
+          </PermissionButton>
           {InstanceModel.detail.state?.value !== 'notActive' && (
-            <Popconfirm
-              title="确认重新应用该配置?"
-              onConfirm={async () => {
-                const resp = await service.deployDevice(id || '');
-                if (resp.status === 200) {
-                  message.success('操作成功');
-                  getDetail();
-                }
+            <PermissionButton
+              popConfirm={{
+                title: '确认重新应用该配置?',
+                onConfirm: async () => {
+                  const resp = await service.deployDevice(id || '');
+                  if (resp.status === 200) {
+                    message.success('操作成功');
+                    getDetail();
+                  }
+                },
               }}
+              isPermission={permission.update}
+              type="link"
             >
-              <Button type="link">
-                <CheckOutlined />
-                应用配置
-              </Button>
+              <CheckOutlined />
+              应用配置
               <Tooltip title="修改配置后需重新应用后才能生效。">
                 <QuestionCircleOutlined />
               </Tooltip>
-            </Popconfirm>
+            </PermissionButton>
           )}
           {InstanceModel.detail?.aloneConfiguration && (
-            <Popconfirm
-              title="确认恢复默认配置?"
-              onConfirm={async () => {
-                const resp = await service.configurationReset(id || '');
-                if (resp.status === 200) {
-                  message.success('恢复默认配置成功');
-                  getDetail();
-                }
+            <PermissionButton
+              popConfirm={{
+                title: '确认恢复默认配置?',
+                onConfirm: async () => {
+                  const resp = await service.configurationReset(id || '');
+                  if (resp.status === 200) {
+                    message.success('恢复默认配置成功');
+                    getDetail();
+                  }
+                },
               }}
+              type="link"
+              isPermission={permission.update}
             >
-              <Button type="link">
-                <UndoOutlined />
-                恢复默认
-              </Button>
+              <UndoOutlined />
+              恢复默认
               <Tooltip
                 title={`该设备单独编辑过配置信息,点击此将恢复成默认的配置信息,请谨慎操作。`}
               >
                 <QuestionCircleOutlined />
               </Tooltip>
-            </Popconfirm>
+            </PermissionButton>
           )}
         </Space>
       </div>

+ 6 - 3
src/pages/device/Instance/Detail/Info/index.tsx

@@ -1,4 +1,4 @@
-import { Button, Card, Descriptions } from 'antd';
+import { Card, Descriptions } from 'antd';
 import { InstanceModel } from '@/pages/device/Instance';
 import moment from 'moment';
 import { observer } from '@formily/react';
@@ -9,10 +9,12 @@ import { useState } from 'react';
 import type { DeviceInstance } from '../../typings';
 import { EditOutlined } from '@ant-design/icons';
 import Tags from '@/pages/device/Instance/Detail/Tags';
+import { PermissionButton } from '@/components';
 
 const Info = observer(() => {
   const intl = useIntl();
   const [visible, setVisible] = useState<boolean>(false);
+  const { permission } = PermissionButton.usePermission('device/Instance');
 
   return (
     <>
@@ -23,7 +25,8 @@ const Info = observer(() => {
           bordered
           title={[
             <span key={1}>设备信息</span>,
-            <Button
+            <PermissionButton
+              isPermission={permission.update}
               key={2}
               type={'link'}
               onClick={() => {
@@ -32,7 +35,7 @@ const Info = observer(() => {
             >
               <EditOutlined />
               编辑
-            </Button>,
+            </PermissionButton>,
           ]}
         >
           <Descriptions.Item

+ 8 - 5
src/pages/device/Instance/Detail/index.tsx

@@ -1,7 +1,7 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import { InstanceModel, service } from '@/pages/device/Instance';
 import { history, useParams } from 'umi';
-import { Badge, Button, Card, Descriptions, Divider, message } from 'antd';
+import { Badge, Card, Descriptions, Divider, message } from 'antd';
 import type { ReactNode } from 'react';
 import { useEffect, useState } from 'react';
 import { observer } from '@formily/react';
@@ -19,7 +19,7 @@ import type { DeviceMetadata } from '@/pages/device/Product/typings';
 import MetadataAction from '@/pages/device/components/Metadata/DataBaseAction';
 import { Store } from 'jetlinks-store';
 import SystemConst from '@/utils/const';
-import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
+import { getMenuPathByParams, getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
 import useSendWebsocketMessage from '@/hooks/websocket/useSendWebsocketMessage';
 import { PermissionButton } from '@/components';
 
@@ -207,19 +207,22 @@ const InstanceDetail = observer(() => {
         <Descriptions size="small" column={4}>
           <Descriptions.Item label={'ID'}>{InstanceModel.detail?.id}</Descriptions.Item>
           <Descriptions.Item label={'所属产品'}>
-            <Button
+            <PermissionButton
               type={'link'}
               size={'small'}
+              isPermission={!!getMenuPathByCode(MENUS_CODE['device/Product'])}
               onClick={() => {
                 const url = getMenuPathByParams(
                   MENUS_CODE['device/Product/Detail'],
                   InstanceModel.detail?.productId,
                 );
-                history.replace(url);
+                if (url) {
+                  history.replace(url);
+                }
               }}
             >
               {InstanceModel.detail?.productName}
-            </Button>
+            </PermissionButton>
           </Descriptions.Item>
         </Descriptions>
       }

+ 2 - 4
src/pages/device/Instance/Save/index.tsx

@@ -1,9 +1,9 @@
-import { Col, Form, Input, message, Row, Select } from 'antd';
+import { Col, Form, Input, message, Row, Select, Modal } from 'antd';
 import { service } from '@/pages/device/Instance';
 import type { DeviceInstance } from '../typings';
 import { useEffect, useState } from 'react';
 import { useIntl } from '@@/plugin-locale/localeExports';
-import { Modal, UploadImage } from '@/components';
+import { UploadImage } from '@/components';
 import { debounce } from 'lodash';
 
 interface Props {
@@ -119,8 +119,6 @@ const Save = (props: Props) => {
       })}
       confirmLoading={loading}
       onOk={handleSave}
-      permissionCode={'device/Instance'}
-      permission={'add'}
     >
       <Form
         form={form}

+ 5 - 17
src/pages/device/Instance/index.tsx

@@ -19,7 +19,7 @@ import {
 import { model } from '@formily/reactive';
 import Service from '@/pages/device/Instance/service';
 import type { MetadataItem } from '@/pages/device/Product/typings';
-import { useIntl, connect } from 'umi';
+import { useIntl } from 'umi';
 import Save from './Save';
 import Export from './Export';
 import Import from './Import';
@@ -72,7 +72,6 @@ const Instance = () => {
   const location = useLocation();
 
   useEffect(() => {
-    console.log(location);
     if (location.state) {
       const _terms: any[] = [];
       Object.keys(location.state).forEach((key) => {
@@ -280,7 +279,7 @@ const Instance = () => {
     <Menu>
       <Menu.Item key="1">
         <PermissionButton
-          isPermission={permission.delete}
+          isPermission={permission.export}
           icon={<ExportOutlined />}
           type="default"
           onClick={() => {
@@ -303,7 +302,7 @@ const Instance = () => {
       </Menu.Item>
       <Menu.Item key="4">
         <PermissionButton
-          isPermission={permission.active}
+          isPermission={permission.action}
           icon={<CheckCircleOutlined />}
           type="primary"
           ghost
@@ -324,7 +323,7 @@ const Instance = () => {
       </Menu.Item>
       <Menu.Item key="5">
         <PermissionButton
-          isPermission={permission.sync}
+          isPermission={true}
           icon={<SyncOutlined />}
           type="primary"
           onClick={() => {
@@ -591,15 +590,4 @@ const Instance = () => {
   );
 };
 
-const mapState = (state: any) => {
-  return {
-    locationState: state.location.locationState,
-    path: state.location.path,
-  };
-};
-
-const actionCreate = {
-  cleanLocationState: (payload: any) => ({ type: 'location/clean', payload }),
-};
-
-export default connect(mapState, actionCreate)(Instance);
+export default Instance;

+ 17 - 11
src/pages/device/Product/Detail/Access/index.tsx

@@ -13,6 +13,7 @@ import { createSchemaField } from '@formily/react';
 import { createForm } from '@formily/core';
 import { QuestionCircleOutlined } from '@ant-design/icons';
 import TitleComponent from '@/components/TitleComponent';
+import usePermissions from '@/hooks/permission';
 
 const componentMap = {
   string: 'Input',
@@ -25,6 +26,7 @@ const Access = () => {
   const [access, setAccess] = useState<any>();
   const [providers, setProviders] = useState<any[]>([]);
   const [networkList, setNetworkList] = useState<any[]>([]);
+  const { permission } = usePermissions('device/Product');
 
   const MetworkTypeMapping = new Map();
   MetworkTypeMapping.set('websocket-server', 'WEB_SOCKET_SERVER');
@@ -352,17 +354,21 @@ const Access = () => {
         <div style={{ padding: '100px 0' }}>
           <Empty
             description={
-              <span>
-                请先
-                <a
-                  onClick={() => {
-                    setConfigVisible(true);
-                  }}
-                >
-                  选择
-                </a>
-                设备接入网关,用以提供设备接入能力
-              </span>
+              permission.add ? (
+                <span>
+                  请先
+                  <a
+                    onClick={() => {
+                      setConfigVisible(true);
+                    }}
+                  >
+                    选择
+                  </a>
+                  设备接入网关,用以提供设备接入能力
+                </span>
+              ) : (
+                '暂无权限,请联系管理员'
+              )
             }
           />
         </div>

+ 7 - 19
src/pages/device/Product/Detail/index.tsx

@@ -1,17 +1,6 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import { useIntl, useLocation, useParams } from 'umi';
-import {
-  Badge,
-  Button,
-  Card,
-  Descriptions,
-  message,
-  Popconfirm,
-  Space,
-  Spin,
-  Switch,
-  Tooltip,
-} from 'antd';
+import { Badge, Card, Descriptions, message, Popconfirm, Space, Spin, Switch, Tooltip } from 'antd';
 import BaseInfo from '@/pages/device/Product/Detail/BaseInfo';
 import { observer } from '@formily/react';
 import { productModel, service } from '@/pages/device/Product';
@@ -208,23 +197,22 @@ const ProductDetail = observer(() => {
         <Spin spinning={loading}>
           <Descriptions size="small" column={2}>
             <Descriptions.Item label={'设备数量'}>
-              <Button
+              <PermissionButton
                 type={'link'}
+                isPermission={!!getMenuPathByCode(MENUS_CODE['device/Instance'])}
                 style={{ padding: 0, height: 'auto' }}
                 onClick={() => {
                   const url = getMenuPathByCode(MENUS_CODE['device/Instance']);
                   const params = {
                     productId: productModel.current?.id,
                   };
-                  // props.push({
-                  //   locationState: params,
-                  //   path: url,
-                  // });
-                  history.push(url, params);
+                  if (url) {
+                    history.push(url, params);
+                  }
                 }}
               >
                 {productModel.current?.count || 0}
-              </Button>
+              </PermissionButton>
             </Descriptions.Item>
           </Descriptions>
         </Spin>

+ 18 - 6
src/pages/device/Product/index.tsx

@@ -192,9 +192,10 @@ const Product = observer(() => {
       type={'link'}
       style={{ padding: 0 }}
       isPermission={permission.delete}
+      disabled={record.state === 1}
       popConfirm={{
         title: intl.formatMessage({
-          id: record.state === 1 ? 'pages.device.productDetail.deleteTip' : 'page.table.isDelete',
+          id: 'page.table.isDelete',
           defaultMessage: '是否删除?',
         }),
         onConfirm: async () => {
@@ -207,7 +208,10 @@ const Product = observer(() => {
       }}
       tooltip={{
         title: intl.formatMessage({
-          id: 'pages.data.option.remove',
+          id:
+            record.state === 1
+              ? 'pages.device.productDetail.deleteTip'
+              : 'pages.data.option.remove',
           defaultMessage: '删除',
         }),
       }}
@@ -477,12 +481,20 @@ const Product = observer(() => {
                 type={'link'}
                 style={{ padding: 0 }}
                 isPermission={permission.delete}
+                disabled={record.state === 1}
+                tooltip={
+                  record.state === 1
+                    ? {
+                        title: intl.formatMessage({
+                          id: 'pages.device.productDetail.deleteTip',
+                          defaultMessage: '已发布的产品不能进行删除操作',
+                        }),
+                      }
+                    : undefined
+                }
                 popConfirm={{
                   title: intl.formatMessage({
-                    id:
-                      record.state === 1
-                        ? 'pages.device.productDetail.deleteTip'
-                        : 'page.table.isDelete',
+                    id: 'page.table.isDelete',
                     defaultMessage: '是否删除?',
                   }),
                   onConfirm: async () => {

+ 4 - 1
src/pages/media/Device/Channel/index.tsx

@@ -239,7 +239,10 @@ export default () => {
             search={false}
             headerTitle={[
               type === ProviderValue.GB281 ? (
-                <Tooltip key="button" title={'接入方式为GB/T28281时,不支持新增'}>
+                <Tooltip
+                  key="button"
+                  title={<div style={{ width: 265 }}>接入方式为GB/T28281时,不支持新增</div>}
+                >
                   <Button disabled>
                     {intl.formatMessage({
                       id: 'pages.data.option.add',

+ 2 - 2
src/pages/media/Device/Save/ProviderSelect.tsx

@@ -61,9 +61,9 @@ export default (props: ProviderProps) => {
     tab!.onTabSaveSuccess = (value: any) => {
       addItemKey.current = value.id;
       getProviderList({
-        sorts: [{ column: 'createTime', value: 'desc' }],
+        sorts: [{ name: 'createTime', value: 'asc' }],
         terms: [{ column: 'provider', value: props.type }],
-        paging: false,
+        pageSize: 100,
       });
     };
   }, [props.type]);

+ 2 - 2
src/pages/media/Device/Save/SaveProduct.tsx

@@ -24,9 +24,9 @@ export default (props: SaveProps) => {
   useEffect(() => {
     if (visible) {
       getProviderList({
-        sorts: [{ column: 'createTime', value: 'desc' }],
+        sorts: [{ name: 'createTime', value: 'desc' }],
         terms: [{ column: 'provider', value: props.type }],
-        paging: false,
+        pageSize: 100,
       });
     }
   }, [visible]);