Przeglądaj źródła

fix: bug修复及网络组件

wzyyy 3 lat temu
rodzic
commit
e9818fe9d5

+ 1 - 1
src/pages/Northbound/DuerOS/Detail/Doc.tsx

@@ -54,7 +54,7 @@ const Doc = () => {
         </div>
         </div>
         <h1>Token地址</h1>
         <h1>Token地址</h1>
         <div>请复制并填写:HTTPS://{location.host}/api/v1/token</div>
         <div>请复制并填写:HTTPS://{location.host}/api/v1/token</div>
-        <h2>ClientSecret</h2>
+        <h1>ClientSecret</h1>
         <div>请复制物联网平台-第三方平台中的secureKey,填写到DuerOS平台。</div>
         <div>请复制物联网平台-第三方平台中的secureKey,填写到DuerOS平台。</div>
         <div></div>
         <div></div>
         <h1>WebService</h1>
         <h1>WebService</h1>

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

@@ -285,7 +285,9 @@ const InstanceDetail = observer(() => {
         <Descriptions size="small" column={4}>
         <Descriptions size="small" column={4}>
           <Descriptions.Item label={'ID'}>
           <Descriptions.Item label={'ID'}>
             <Tooltip placement="topLeft" title={InstanceModel.detail?.id}>
             <Tooltip placement="topLeft" title={InstanceModel.detail?.id}>
-              <div className="ellipsis-70">{InstanceModel.detail?.id}</div>
+              <div className="ellipsis" style={{ maxWidth: 250 }}>
+                {InstanceModel.detail?.id}
+              </div>
             </Tooltip>
             </Tooltip>
           </Descriptions.Item>
           </Descriptions.Item>
           <Descriptions.Item label={'所属产品'}>
           <Descriptions.Item label={'所属产品'}>

+ 3 - 1
src/pages/device/Instance/Export/index.tsx

@@ -9,6 +9,7 @@ import type { DeviceInstance } from '../typings';
 import SystemConst from '@/utils/const';
 import SystemConst from '@/utils/const';
 import encodeQuery from '@/utils/encodeQuery';
 import encodeQuery from '@/utils/encodeQuery';
 import { downloadFile } from '@/utils/util';
 import { downloadFile } from '@/utils/util';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
 
 
 interface Props {
 interface Props {
   visible: boolean;
   visible: boolean;
@@ -117,7 +118,8 @@ const Export = (props: Props) => {
     >
     >
       <div style={{ background: 'rgb(236, 237, 238)' }}>
       <div style={{ background: 'rgb(236, 237, 238)' }}>
         <p style={{ padding: 10 }}>
         <p style={{ padding: 10 }}>
-          选择单个产品时可导出其下属设备的详细数据,不选择产品时导出所有设备的基础数
+          <ExclamationCircleOutlined style={{ marginRight: 5 }} />
+          选择单个产品时可导出其下属设备的详细数据,不选择产品时导出所有设备的基础数量。
         </p>
         </p>
       </div>
       </div>
       <div style={{ marginTop: '20px' }}>
       <div style={{ marginTop: '20px' }}>

+ 1 - 1
src/pages/device/Product/Detail/index.tsx

@@ -287,7 +287,7 @@ const ProductDetail = observer(() => {
       }
       }
       title={
       title={
         <Tooltip placement="topLeft" title={productModel.current?.name}>
         <Tooltip placement="topLeft" title={productModel.current?.name}>
-          <div className="ellipsis" style={{ width: 250 }}>
+          <div className="ellipsis" style={{ maxWidth: 250 }}>
             {productModel.current?.name}
             {productModel.current?.name}
           </div>
           </div>
         </Tooltip>
         </Tooltip>

+ 3 - 2
src/pages/device/components/Metadata/Import/index.tsx

@@ -11,6 +11,7 @@ import { useParams } from 'umi';
 import { Store } from 'jetlinks-store';
 import { Store } from 'jetlinks-store';
 import SystemConst from '@/utils/const';
 import SystemConst from '@/utils/const';
 import { onlyMessage } from '@/utils/util';
 import { onlyMessage } from '@/utils/util';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
 
 
 interface Props {
 interface Props {
   visible: boolean;
   visible: boolean;
@@ -213,8 +214,8 @@ const Import = (props: Props) => {
     >
     >
       <div style={{ background: 'rgb(236, 237, 238)' }}>
       <div style={{ background: 'rgb(236, 237, 238)' }}>
         <p style={{ padding: 10 }}>
         <p style={{ padding: 10 }}>
-          <span style={{ color: '#f5222d' }}>注</span>
-          导入的物模型会覆盖原来的属性、功能、事件、标签,请谨慎操作。
+          <ExclamationCircleOutlined style={{ marginRight: 5 }} />
+          导入的物模型会覆盖原来的属性、功能、事件、标签,请谨慎操作。
           {/* <br /> */}
           {/* <br /> */}
           {/*物模型格式请参考文档:*/}
           {/*物模型格式请参考文档:*/}
           {/*<a*/}
           {/*<a*/}

+ 1 - 1
src/pages/home/components/GuideHome.tsx

@@ -38,7 +38,7 @@ const GuideItem = (props: GuideItemProps) => {
 
 
   return (
   return (
     <div
     <div
-      className={'home-guide-item step-bar'}
+      className={'home-guide-item step-bar pointer'}
       onClick={jumpPage}
       onClick={jumpPage}
       style={{ marginTop: 12, padding: 10, border: '1px solid #eee' }}
       style={{ marginTop: 12, padding: 10, border: '1px solid #eee' }}
     >
     >

+ 107 - 10
src/pages/link/Type/Detail/index.tsx

@@ -15,7 +15,7 @@ import {
 } from '@formily/antd';
 } from '@formily/antd';
 import type { ISchema } from '@formily/json-schema';
 import type { ISchema } from '@formily/json-schema';
 import { useEffect, useMemo, useRef } from 'react';
 import { useEffect, useMemo, useRef } from 'react';
-import type { Field } from '@formily/core';
+import { Field, FieldDataSource } from '@formily/core';
 import { createForm, onFieldReact, onFieldValueChange } from '@formily/core';
 import { createForm, onFieldReact, onFieldValueChange } from '@formily/core';
 import { Card } from 'antd';
 import { Card } from 'antd';
 import styles from './index.less';
 import styles from './index.less';
@@ -26,6 +26,7 @@ import FAutoComplete from '@/components/FAutoComplete';
 import { Store } from 'jetlinks-store';
 import { Store } from 'jetlinks-store';
 import { PermissionButton } from '@/components';
 import { PermissionButton } from '@/components';
 import usePermissions from '@/hooks/permission';
 import usePermissions from '@/hooks/permission';
+import { action } from '@formily/reactive';
 
 
 /**
 /**
  *  根据类型过滤配置信息
  *  根据类型过滤配置信息
@@ -65,6 +66,20 @@ const Save = observer(() => {
     });
     });
   }, []);
   }, []);
 
 
+  const useAsyncData = (services: (arg0: Field) => Promise<FieldDataSource>) => (field: Field) => {
+    field.loading = true;
+    services(field).then(
+      action.bound!((resp: any) => {
+        const save = location.href.split('/');
+        if (save[save.length - 1] === ':id') {
+          field.value = resp[0].value;
+        }
+        field.dataSource = resp;
+        field.loading = false;
+      }),
+    );
+  };
+
   const getResourcesClusters = () => {
   const getResourcesClusters = () => {
     // eslint-disable-next-line @typescript-eslint/no-use-before-define
     // eslint-disable-next-line @typescript-eslint/no-use-before-define
     const checked = form.getValuesIn('cluster')?.map((i: any) => i?.serverId) || [];
     const checked = form.getValuesIn('cluster')?.map((i: any) => i?.serverId) || [];
@@ -84,17 +99,17 @@ const Save = observer(() => {
       });
       });
     }
     }
   };
   };
+  const getCertificates = () =>
+    service.getCertificates().then((resp: any) =>
+      resp.result?.map((item: any) => ({
+        label: item.name,
+        value: item.id,
+      })),
+    );
 
 
   const getResourceById = (id: string, type: string) =>
   const getResourceById = (id: string, type: string) =>
     service.getResourceClustersById(id).then((resp) => filterConfigByType(resp.result, type));
     service.getResourceClustersById(id).then((resp) => filterConfigByType(resp.result, type));
 
 
-  // const getAllResources = () =>
-  //   service.getAllResources().then((resp) =>
-  //     resp.result?.map((item: any) => ({
-  //       label: item.clusterNodeId,
-  //       value: item.clusterNodeId,
-  //     })));
-
   const form = useMemo(
   const form = useMemo(
     () =>
     () =>
       createForm({
       createForm({
@@ -103,6 +118,7 @@ const Save = observer(() => {
         effects() {
         effects() {
           onFieldValueChange('type', (field, f) => {
           onFieldValueChange('type', (field, f) => {
             const value = (field as Field).value;
             const value = (field as Field).value;
+            // console.log(field)
             if (f.modified) {
             if (f.modified) {
               f.deleteValuesIn('configuration');
               f.deleteValuesIn('configuration');
               f.deleteValuesIn('cluster');
               f.deleteValuesIn('cluster');
@@ -538,6 +554,79 @@ const Save = observer(() => {
           },
           },
         },
         },
       },
       },
+      secure: {
+        title: '开启DTLS',
+        'x-decorator': 'FormItem',
+        'x-component': 'Radio.Group',
+        'x-decorator-props': {
+          gridSpan: 1,
+          labelAlign: 'left',
+          layout: 'vertical',
+        },
+        required: true,
+        default: false,
+        enum: [
+          { label: '是', value: true },
+          { label: '否', value: false },
+        ],
+      },
+      certId: {
+        title: '证书',
+        'x-decorator': 'FormItem',
+        'x-component': 'Select',
+        'x-component-props': {
+          placeholder: '请选择证书',
+        },
+        'x-decorator-props': {
+          gridSpan: 1,
+          labelAlign: 'left',
+          layout: 'vertical',
+        },
+        required: true,
+        'x-reactions': [
+          '{{useAsyncDataSource(getCertificates)}}',
+          {
+            dependencies: ['..secure'],
+            fulfill: {
+              state: {
+                visible: '{{$deps[0]===true}}',
+              },
+            },
+          },
+        ],
+      },
+      privateKeyAlias: {
+        title: '私钥别名',
+        'x-decorator': 'FormItem',
+        'x-component': 'Input',
+        'x-component-props': {
+          placeholder: '请输入私钥别名',
+        },
+        'x-decorator-props': {
+          gridSpan: 1,
+          labelAlign: 'left',
+          layout: 'vertical',
+        },
+        required: true,
+        'x-validator': [
+          {
+            max: 64,
+            message: '最多可输入64个字符',
+          },
+          {
+            required: true,
+            message: '请输入私钥别名',
+          },
+        ],
+        'x-reactions': {
+          dependencies: ['..secure'],
+          fulfill: {
+            state: {
+              visible: '{{$deps[0]===true}}',
+            },
+          },
+        },
+      },
     },
     },
   };
   };
   const schema: ISchema = {
   const schema: ISchema = {
@@ -584,13 +673,14 @@ const Save = observer(() => {
             'x-component-props': {
             'x-component-props': {
               placeholder: '请选择类型',
               placeholder: '请选择类型',
             },
             },
+            default: {},
             'x-validator': [
             'x-validator': [
               {
               {
                 required: true,
                 required: true,
                 message: '请输入名称',
                 message: '请输入名称',
               },
               },
             ],
             ],
-            'x-reactions': ['{{useAsyncDataSource(getSupports)}}'],
+            'x-reactions': ['{{useAsyncData(getSupports)}}'],
           },
           },
           shareCluster: {
           shareCluster: {
             title: '集群',
             title: '集群',
@@ -737,7 +827,14 @@ const Save = observer(() => {
         <Form form={form} layout="vertical" style={{ padding: 30 }}>
         <Form form={form} layout="vertical" style={{ padding: 30 }}>
           <SchemaField
           <SchemaField
             schema={schema}
             schema={schema}
-            scope={{ formCollapse, useAsyncDataSource, getSupports, getResourcesClusters }}
+            scope={{
+              formCollapse,
+              useAsyncDataSource,
+              useAsyncData,
+              getSupports,
+              getResourcesClusters,
+              getCertificates,
+            }}
           />
           />
           <FormButtonGroup.Sticky>
           <FormButtonGroup.Sticky>
             <FormButtonGroup.FormItem>
             <FormButtonGroup.FormItem>

+ 5 - 0
src/pages/link/service.ts

@@ -36,6 +36,11 @@ class Service extends BaseService<NetworkItem> {
 
 
   changeState = (id: string, status: 'start' | 'shutdown') =>
   changeState = (id: string, status: 'start' | 'shutdown') =>
     request(`${SystemConst.API_BASE}/network/config/${id}/_${status}`, { method: 'POST' });
     request(`${SystemConst.API_BASE}/network/config/${id}/_${status}`, { method: 'POST' });
+
+  getCertificates = () =>
+    request(`/${SystemConst.API_BASE}/network/certificate/_query/no-paging?paging=false`, {
+      method: 'GET',
+    });
 }
 }
 
 
 export default Service;
 export default Service;

+ 3 - 3
src/pages/media/Home/index.tsx

@@ -68,7 +68,7 @@ export default () => {
     {
     {
       key: 'EQUIPMENT',
       key: 'EQUIPMENT',
       name: '添加视频设备',
       name: '添加视频设备',
-      english: 'ADD VIDEO EQUIPMENT',
+      english: 'STP 1',
       auth: !!devicePermission.add,
       auth: !!devicePermission.add,
       url: deviceUrl,
       url: deviceUrl,
       param: { save: true },
       param: { save: true },
@@ -76,14 +76,14 @@ export default () => {
     {
     {
       key: 'SCREEN',
       key: 'SCREEN',
       name: '分屏展示',
       name: '分屏展示',
-      english: 'SPLIT SCREEN DISPLAY',
+      english: 'STP 2',
       auth: !!splitScreenUrl,
       auth: !!splitScreenUrl,
       url: splitScreenUrl,
       url: splitScreenUrl,
     },
     },
     {
     {
       key: 'CASCADE',
       key: 'CASCADE',
       name: '国标级联',
       name: '国标级联',
-      english: 'GB CASCADE',
+      english: 'STP 3',
       auth: !!cascadeUrl,
       auth: !!cascadeUrl,
       url: cascadeUrl,
       url: cascadeUrl,
     },
     },

+ 0 - 1
src/pages/notice/Config/index.tsx

@@ -124,7 +124,6 @@ const Config = observer(() => {
         defaultMessage: '操作',
         defaultMessage: '操作',
       }),
       }),
       valueType: 'option',
       valueType: 'option',
-      align: 'center',
       width: 200,
       width: 200,
       fixed: 'right',
       fixed: 'right',
       render: (text, record) => [
       render: (text, record) => [