Browse Source

feat(merge): merge xyh

Next xyh
Lind 3 years ago
parent
commit
c2aa84d3e4

+ 7 - 5
src/components/DashBoard/baseCard.tsx

@@ -4,23 +4,25 @@ import type { EchartsProps } from './echarts';
 import Echarts from './echarts';
 import Echarts from './echarts';
 import Style from './index.less';
 import Style from './index.less';
 import classNames from 'classnames';
 import classNames from 'classnames';
+import { forwardRef } from 'react';
 
 
 interface BaseCardProps extends HeaderProps, EchartsProps {
 interface BaseCardProps extends HeaderProps, EchartsProps {
   height: number;
   height: number;
   className?: string;
   className?: string;
 }
 }
 
 
-export default (props: BaseCardProps) => {
+export default forwardRef((props: BaseCardProps, ref) => {
   const { height, className, options, ...formProps } = props;
   const { height, className, options, ...formProps } = props;
+
   return (
   return (
     <div
     <div
-      className={classNames(Style['dash-board-echarts'], className)}
+      className={classNames(Style['dash-board'], className)}
       style={{
       style={{
         height: height || 200,
         height: height || 200,
       }}
       }}
     >
     >
-      <Header {...formProps} />
-      <Echarts options={options} />
+      <Header ref={ref} {...formProps} />
+      <Echarts options={options} className={Style['echarts']} />
     </div>
     </div>
   );
   );
-};
+});

+ 3 - 1
src/components/DashBoard/echarts.tsx

@@ -19,9 +19,11 @@ import { CanvasRenderer } from 'echarts/renderers';
 
 
 import Style from './index.less';
 import Style from './index.less';
 import type { EChartsOption } from 'echarts';
 import type { EChartsOption } from 'echarts';
+import classNames from 'classnames';
 
 
 export interface EchartsProps {
 export interface EchartsProps {
   options?: EChartsOption;
   options?: EChartsOption;
+  className?: string;
 }
 }
 
 
 echarts.use([
 echarts.use([
@@ -93,7 +95,7 @@ export default (props: EchartsProps) => {
 
 
   return (
   return (
     <div
     <div
-      className={Style.content}
+      className={classNames(Style['content'], props.className)}
       ref={(ref) => {
       ref={(ref) => {
         if (ref) {
         if (ref) {
           setTimeout(() => {
           setTimeout(() => {

+ 17 - 4
src/components/DashBoard/header.tsx

@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { forwardRef, useImperativeHandle, useRef } from 'react';
 import Style from './index.less';
 import Style from './index.less';
 import { Col, Form, Row } from 'antd';
 import { Col, Form, Row } from 'antd';
 import type { TimeType } from './timePicker';
 import type { TimeType } from './timePicker';
@@ -16,11 +16,16 @@ export interface HeaderProps {
     Children: React.ReactNode;
     Children: React.ReactNode;
   };
   };
   initialValues?: any;
   initialValues?: any;
+  /**
+   * true 关闭初始化时触发onParamsChange
+   */
+  closeInitialParams?: boolean;
   defaultTime?: TimeType;
   defaultTime?: TimeType;
 }
 }
 
 
-export default (props: HeaderProps) => {
+export default forwardRef((props: HeaderProps, ref) => {
   const [form] = Form.useForm();
   const [form] = Form.useForm();
+  const isCloseInitial = useRef<boolean>(false);
 
 
   const change = async (data: any) => {
   const change = async (data: any) => {
     if (props.onParamsChange) {
     if (props.onParamsChange) {
@@ -28,6 +33,10 @@ export default (props: HeaderProps) => {
     }
     }
   };
   };
 
 
+  useImperativeHandle(ref, () => ({
+    getValues: form.getFieldsValue,
+  }));
+
   return (
   return (
     <div className={Style.header}>
     <div className={Style.header}>
       <div className={Style.title}>{props.title}</div>
       <div className={Style.title}>{props.title}</div>
@@ -39,7 +48,11 @@ export default (props: HeaderProps) => {
           preserve={false}
           preserve={false}
           initialValues={props.initialValues}
           initialValues={props.initialValues}
           onValuesChange={(_, allValue) => {
           onValuesChange={(_, allValue) => {
-            change(allValue);
+            if (props.closeInitialParams && !isCloseInitial.current) {
+              isCloseInitial.current = true;
+            } else {
+              change(allValue);
+            }
           }}
           }}
         >
         >
           <Row style={{ width: '100%' }}>
           <Row style={{ width: '100%' }}>
@@ -60,4 +73,4 @@ export default (props: HeaderProps) => {
       </div>
       </div>
     </div>
     </div>
   );
   );
-};
+});

+ 6 - 2
src/components/DashBoard/index.less

@@ -1,4 +1,4 @@
-.dash-board-echarts {
+.dash-board {
   display: flex;
   display: flex;
   flex-direction: column;
   flex-direction: column;
   width: 100%;
   width: 100%;
@@ -21,8 +21,12 @@
 }
 }
 
 
 .content {
 .content {
-  flex-grow: 1;
   width: 100%;
   width: 100%;
+  height: 100%;
+}
+
+.echarts {
+  flex-grow: 1;
   height: 0;
   height: 0;
   margin-top: 12px;
   margin-top: 12px;
 }
 }

+ 95 - 11
src/pages/link/DashBoard/index.tsx

@@ -1,14 +1,71 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import { PageContainer } from '@ant-design/pro-layout';
 import DashBoard from '@/components/DashBoard';
 import DashBoard from '@/components/DashBoard';
-import { Radio } from 'antd';
-import { useState } from 'react';
+import { Radio, Select } from 'antd';
+import { useEffect, useRef, useState } from 'react';
 import type { EChartsOption } from 'echarts';
 import type { EChartsOption } from 'echarts';
+import { useRequest } from 'umi';
+import Service from './service';
+import moment from 'moment';
+
+type RefType = {
+  getValues: Function;
+};
+
+const service = new Service('dashboard');
 
 
 export default () => {
 export default () => {
   const [options, setOptions] = useState<EChartsOption>({});
   const [options, setOptions] = useState<EChartsOption>({});
+  const [serverId, setServerId] = useState(undefined);
+
+  const NETWORKRef = useRef<RefType>(); // 网络流量
+  const CPURef = useRef<RefType>(); // CPU使用率
+  const JVMRef = useRef<RefType>(); // JVM内存使用率
+
+  const { data: serverNode } = useRequest(service.serverNode, {
+    formatResult: (res) => res.result.map((item: any) => ({ label: item.name, value: item.id })),
+  });
 
 
-  const getEcharts = async (data: any) => {
-    console.log(data);
+  const getNetworkEcharts = () => {
+    const data = NETWORKRef.current!.getValues();
+    if (data) {
+      service.queryMulti([
+        {
+          dashboard: 'systemMonitor',
+          object: 'network',
+          measurement: 'traffic',
+          dimension: 'agg',
+          params: {
+            type: data.type,
+            interval: '1h',
+            from: moment(data.time[0]).format('YYYY-MM-DD HH:mm:ss'),
+            to: moment(data.time[1]).format('YYYY-MM-DD HH:mm:ss'),
+          },
+        },
+      ]);
+    }
+  };
+
+  const getCPUEcharts = () => {
+    const data = CPURef.current!.getValues();
+    if (data) {
+      service.queryMulti([
+        {
+          dashboard: 'systemMonitor',
+          object: 'cpu',
+          measurement: 'traffic',
+          dimension: 'agg',
+          params: {
+            type: data.type,
+            interval: '1h',
+            from: moment(data.time[0]).format('YYYY-MM-DD HH:mm:ss'),
+            to: moment(data.time[1]).format('YYYY-MM-DD HH:mm:ss'),
+          },
+        },
+      ]);
+    }
+  };
+
+  const getEcharts = async () => {
     setOptions({
     setOptions({
       xAxis: {
       xAxis: {
         type: 'category',
         type: 'category',
@@ -26,39 +83,66 @@ export default () => {
     });
     });
   };
   };
 
 
+  useEffect(() => {
+    if (serverId) {
+      getNetworkEcharts();
+    }
+  }, [serverId]);
+
+  useEffect(() => {
+    if (serverNode && serverNode.length) {
+      setServerId(serverNode[0].value);
+    }
+  }, [serverNode]);
+
   return (
   return (
     <PageContainer>
     <PageContainer>
       <div>
       <div>
+        {serverNode && serverNode.length ? (
+          <Select
+            value={serverId}
+            options={serverNode}
+            onChange={(value) => {
+              setServerId(value);
+            }}
+            style={{ width: 300 }}
+          />
+        ) : null}
         <div>
         <div>
           <DashBoard
           <DashBoard
             title={'网络流量'}
             title={'网络流量'}
-            initialValues={{ test: false }}
+            ref={NETWORKRef}
+            initialValues={{ type: 'bytesSent' }}
             height={400}
             height={400}
+            closeInitialParams={true}
             extraParams={{
             extraParams={{
-              key: 'test',
+              key: 'type',
               Children: (
               Children: (
                 <Radio.Group buttonStyle={'solid'}>
                 <Radio.Group buttonStyle={'solid'}>
-                  <Radio.Button value={true}>上行</Radio.Button>
-                  <Radio.Button value={false}>下行</Radio.Button>
+                  <Radio.Button value={'bytesRead'}>上行</Radio.Button>
+                  <Radio.Button value={'bytesSent'}>下行</Radio.Button>
                 </Radio.Group>
                 </Radio.Group>
               ),
               ),
             }}
             }}
             defaultTime={'week'}
             defaultTime={'week'}
             options={options}
             options={options}
-            onParamsChange={getEcharts}
+            onParamsChange={getNetworkEcharts}
           />
           />
         </div>
         </div>
         <div style={{ display: 'flex' }}>
         <div style={{ display: 'flex' }}>
           <DashBoard
           <DashBoard
             title={'CPU使用率趋势'}
             title={'CPU使用率趋势'}
-            initialValues={{ test: false }}
+            closeInitialParams={true}
+            ref={CPURef}
             height={400}
             height={400}
             defaultTime={'week'}
             defaultTime={'week'}
             options={options}
             options={options}
-            onParamsChange={getEcharts}
+            onParamsChange={getCPUEcharts}
           />
           />
           <DashBoard
           <DashBoard
             title={'JVM内存使用率趋势'}
             title={'JVM内存使用率趋势'}
+            closeInitialParams={true}
+            ref={JVMRef}
             height={400}
             height={400}
             defaultTime={'week'}
             defaultTime={'week'}
             options={options}
             options={options}

+ 16 - 0
src/pages/link/DashBoard/service.ts

@@ -0,0 +1,16 @@
+import BaseService from '@/utils/BaseService';
+import SystemConst from '@/utils/const';
+import { request } from 'umi';
+
+class Service extends BaseService<any> {
+  serverNode = () =>
+    request(`/${SystemConst.API_BASE}/network/resources/clusters`, { method: 'GET' });
+
+  /**
+   * echarts数据
+   */
+  queryMulti = (data: any) =>
+    request(`/${SystemConst.API_BASE}/dashboard/_multi`, { method: 'POST', data });
+}
+
+export default Service;