heyujie
2021-10-09 0892efe5131551631fe287cfda29e59e4f2f6707
src/pages/systemMonitor/index/App.vue
@@ -1,38 +1,99 @@
<template>
  <div class="s-system-monitor">
    <el-tabs id="systemMonitor" v-model="activeName">
      <el-tab-pane label="单元" name="proc">
        <div class="form-title">
          <b>算法单元</b>
          (正在进行{{algoProcessData.length}}个算法单元)
          <el-table :data="algoProcessData" style="width: 100%">
            <el-table-column prop="desc" label="名称" width="180"></el-table-column>
      <el-tab-pane name="proc">
        <span slot="label">
          <span class="iconfont icon">&#xe742;</span>
          单元</span
        >
        <div class="left-tab">
          <div
            class="tab-item"
            :class="activeTab == 0 ? 'tab-item-active' : ''"
            @click="activeTab = 0"
          >
            <div class="title">算法单元</div>
            <div class="subtitle">
              正在进行{{ algoProcessData.length }}个算法单元
            </div>
            <span class="iconfont icon" :style="activeTab == 0 ? {} :{color:'#fff'} ">&#xe741;</span>
          </div>
          <div
            class="tab-item"
            :class="activeTab == 1 ? 'tab-item-active' : ''"
            @click="activeTab = 1"
          >
            <div class="title">应用单元</div>
            <div class="subtitle">正在进行{{ 1 }}个应用单元</div>
            <span class="iconfont icon" :style="activeTab == 1 ? {} :{color:'#fff'} ">&#xe744;</span>
          </div>
        </div>
        <div class="form-title" v-if="activeTab == 0">
          <div class="desc">
            <b>算法单元</b>
            (正在进行{{ algoProcessData.length }}个算法单元)
          </div>
          <el-table
            :data="algoProcessData"
            style="width: 100%"
            :header-cell-style="'background: #F2F2F7;color: #333333;height: 40px;font-size: 16px;'"
            stripe
            class="tableBox"
          >
            <el-table-column
              prop="desc"
              label="名称"
              width="180"
            ></el-table-column>
            <el-table-column label="CPU" width="180">
              <template slot-scope="scope">
                <span>{{ scope.row.cpu.toFixed(2)}} %</span>
                <span>{{ scope.row.cpu.toFixed(2) }} %</span>
              </template>
            </el-table-column>
            <el-table-column label="内存">
              <template slot-scope="scope">
                <span>{{ scope.row.mem.toFixed(2)}} %</span>
                <span>{{ scope.row.mem.toFixed(2) }} %</span>
              </template>
            </el-table-column>
            <el-table-column prop="disk" label="硬盘"></el-table-column>
            <el-table-column label="算力">
              <template slot-scope="scope">
                <span>{{ scope.row.gpu}} M</span>
                <span>{{ scope.row.gpu }} M</span>
              </template>
            </el-table-column>
            <el-table-column prop="net" label="网络"></el-table-column>
          </el-table>
        </div>
        <div class="form-title" style="margin-top:20px">
          <b>应用单元</b>
          (正在进行{{appProcessData.length}}个应用单元)
          <el-table :data="appProcessData" style="width: 100%">
            <el-table-column prop="desc" label="名称" width="180"></el-table-column>
            <el-table-column prop="cpu" label="CPU" width="180"></el-table-column>
        <div class="form-title" v-if="activeTab == 1">
          <div class="desc">
            <b>应用单元</b>
            (正在进行{{ appProcessData.length }}个算法单元)
          </div>
          <el-table
            :data="appProcessData"
            style="width: 100%"
            :header-cell-style="{
              background: '#F2F2F7',
              color: '#333333',
              height: '40px',
            }"
            stripe
            class="tableBox"
          >
            <el-table-column
              prop="desc"
              label="名称"
              width="180"
            ></el-table-column>
            <el-table-column
              prop="cpu"
              label="CPU"
              width="180"
            ></el-table-column>
            <el-table-column prop="mem" label="内存"></el-table-column>
            <el-table-column prop="disk" label="硬盘"></el-table-column>
            <el-table-column prop="gpu" label="算力"></el-table-column>
@@ -41,54 +102,79 @@
        </div>
      </el-tab-pane>
      <el-tab-pane label="性能" name="top">
      <el-tab-pane  name="top">
        <span slot="label">
          <span class="iconfont icon">&#xe743;</span>
          性能</span
        >
        <div class="column-left" ref="left">
          <div class="resize-bar">
            <div
              :class="['ax_default', activeChartItem == 'cpu' ?'selected': '']"
              :class="[
                'ax_default',
                activeChartItem == 'cpu' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('cpu')"
            >
              <div class="ax_default_pic color-cpu"></div>
              <div class="ax_default_text">CPU</div>
              <div class="ax_default_subtext">{{cpuUsedPercent}}%</div>
              <div>
                <div class="ax_default_text">CPU</div>
              <div class="ax_default_subtext">{{ cpuUsedPercent }}%</div>
              </div>
            </div>
            <div
              :class="['ax_default', activeChartItem == 'mem' ?'selected': '']"
              :class="[
                'ax_default',
                activeChartItem == 'mem' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('mem')"
            >
              <div class="ax_default_pic color-mem"></div>
              <div class="ax_default_text">内存</div>
              <div class="ax_default_subtext">{{memUsedPercent}}%</div>
              <div><div class="ax_default_text">内存</div>
              <div class="ax_default_subtext">{{ memUsedPercent }}%</div></div>
            </div>
            <div
              :class="['ax_default', activeChartItem == 'gpu' ?'selected': '']"
              :class="[
                'ax_default',
                activeChartItem == 'gpu' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('gpu')"
            >
              <div class="ax_default_pic color-gpu"></div>
              <div class="ax_default_text">算力</div>
              <div class="ax_default_subtext">{{gpuUsedPercent}}%</div>
             <div> <div class="ax_default_text">算力</div>
              <div class="ax_default_subtext">{{ gpuUsedPercent }}%</div></div>
            </div>
            <div
              :class="['ax_default', activeChartItem == 'net' ?'selected': '']"
              :class="[
                'ax_default',
                activeChartItem == 'net' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('net')"
            >
              <div class="ax_default_pic color-net"></div>
              <div class="ax_default_text">网络</div>
              <div class="ax_default_subtext">{{netSend | byteConver}} / {{netRecive | byteConver}}</div>
             <div> <div class="ax_default_text">网络</div>
              <div class="ax_default_subtext">
                {{ netSend | byteConver }} / {{ netRecive | byteConver }}
              </div></div>
            </div>
            <div
              v-for="(v, k) in disks"
              :key="k"
              :class="['ax_default', activeChartItem == ('disk|' + k) ?'selected': '']"
              @click="setActiveChartItem('disk|'+k)"
              :class="[
                'ax_default',
                activeChartItem == 'disk|' + k ? 'selected' : '',
              ]"
              @click="setActiveChartItem('disk|' + k)"
            >
              <div class="ax_default_pic color-disk"></div>
              <div class="ax_default_text">磁盘 {{k}}</div>
              <div class="ax_default_subtext">{{v.info.total | byteConver}}</div>
              <div><div class="ax_default_text">磁盘 {{ k }}</div>
              <div class="ax_default_subtext">
                {{ v.info.total | byteConver }}
              </div></div>
            </div>
          </div>
@@ -96,92 +182,96 @@
        </div>
        <div class="column-right">
          <div class="max-val">{{yAxisMaxVal}}</div>
          <div class="max-val">{{ yAxisMaxVal }}</div>
          <div ref="graphs" class="graphs-chart"></div>
          <div v-show="activeChartItem == 'cpu'">
            <div class="ax_default_label">
              <b>占用率</b>
              <p>{{cpuUsedPercent}}%</p>
              <p>{{ cpuUsedPercent }}%</p>
            </div>
            <div class="ax_default_label">
              <b>主频</b>
              <p>{{cpuMaxRate}}Ghz</p>
              <p>{{ cpuMaxRate }}Ghz</p>
            </div>
            <div class="ax_default_label">
              <b>插槽</b>
              <p>{{cpuCount}}</p>
              <p>{{ cpuCount }}</p>
            </div>
            <div class="ax_default_label">
              <b>内核</b>
              <p>{{cpuCore}}</p>
              <p>{{ cpuCore }}</p>
            </div>
          </div>
          <div v-show="activeChartItem == 'mem'">
            <div class="ax_default_label">
              <b>使用中</b>
              <p>{{memUsed}}G</p>
              <p>{{ memUsed }}G</p>
            </div>
            <div class="ax_default_label">
              <b>已缓存</b>
              <p>{{memCache}}G</p>
              <p>{{ memCache }}G</p>
            </div>
            <div class="ax_default_label">
              <b>可用</b>
              <p>{{memFree}}G</p>
              <p>{{ memFree }}G</p>
            </div>
          </div>
          <div v-show="activeChartItem == 'net'">
            <div class="ax_default_label">
              <b>接收</b>
              <p>{{netRecive |byteConver}}</p>
              <p>{{ netRecive | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>发送</b>
              <p>{{netSend |byteConver}}</p>
              <p>{{ netSend | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>IP地址</b>
              <p>{{ipAddr}}</p>
              <p>{{ ipAddr }}</p>
            </div>
            <div class="ax_default_label" style="margin-left: 19px;">
            <div class="ax_default_label" style="margin-left: 19px">
              <b>MAC地址</b>
              <p>{{macAddr}}</p>
              <p>{{ macAddr }}</p>
            </div>
          </div>
          <div v-show="isDisk">
            <div class="ax_default_label">
              <b>容量</b>
              <p>{{activeDisk.total |byteConver}}</p>
              <p>{{ activeDisk.total | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>已用</b>
              <p>{{activeDisk.used |byteConver}}</p>
              <p>{{ activeDisk.used | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>可用</b>
              <p>{{activeDisk.free |byteConver}}</p>
              <p>{{ activeDisk.free | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>读取速度</b>
              <p>{{ioRead | byteConver}}</p>
              <p>{{ ioRead | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>写入速度</b>
              <p>{{ioWrite | byteConver}}</p>
              <p>{{ ioWrite | byteConver }}</p>
            </div>
          </div>
        </div>
      </el-tab-pane>
      <el-tab-pane label="服务" name="service">
      <el-tab-pane name="service">
        <span slot="label">
          <span class="iconfont icon">&#xe944;</span>
          服务</span
        >
        <el-table :data="vasystemServicesData">
          <el-table-column label="名称" show-overflow-tooltip>
            <template slot-scope="scope">
              <span>{{ scope.row.name}}</span>
              <span>{{ scope.row.name }}</span>
            </template>
          </el-table-column>
          <el-table-column label="状态" prop="status">
@@ -198,52 +288,54 @@
<script>
import echarts from "echarts";
import { showSystemStates, showService, showProcesses } from "../api/api"
import { showSystemStates, showService, showProcesses } from "../api/api";
export default {
  components: {
  },
  components: {},
  computed: {
    isDisk() {
      return this.activeChartItem.indexOf("disk") == 0
      return this.activeChartItem.indexOf("disk") == 0;
    },
    isAdmin() {
      if (
        sessionStorage.getItem('userInfo') &&
        sessionStorage.getItem('userInfo') !== ''
        sessionStorage.getItem("userInfo") &&
        sessionStorage.getItem("userInfo") !== ""
      ) {
        let loginName = JSON.parse(sessionStorage.getItem('userInfo')).username
        return (
          loginName === 'superadmin' || loginName === 'basic'
        )
        let loginName = JSON.parse(sessionStorage.getItem("userInfo")).username;
        return loginName === "superadmin" || loginName === "basic";
      }
      return false;
    }
    },
  },
  filters: {
    byteConver(limit) {
      var size = "";
      if (limit < 1024) { //如果小于0.1KB转化成B
      if (limit < 1024) {
        //如果小于0.1KB转化成B
        size = limit + "B";
      } else if (limit < 1024 * 1024) {//如果小于0.1MB转化成KB
      } else if (limit < 1024 * 1024) {
        //如果小于0.1MB转化成KB
        size = (limit / 1024).toFixed(2) + "KB";
      } else if (limit < 1024 * 1024 * 1024) { //如果小于0.1GB转化成MB
      } else if (limit < 1024 * 1024 * 1024) {
        //如果小于0.1GB转化成MB
        size = (limit / (1024 * 1024)).toFixed(2) + "MB";
      } else if (limit < 1024 * 1024 * 1024 * 1024) { //其他转化成GB
      } else if (limit < 1024 * 1024 * 1024 * 1024) {
        //其他转化成GB
        size = (limit / (1024 * 1024 * 1024)).toFixed(2) + "GB";
      } else {
        size = (limit / (1024 * 1024 * 1024 * 1024)).toFixed(2) + "TB";
      }
      var sizestr = size + "";
      var len = sizestr.indexOf("\.");
      var len = sizestr.indexOf(".");
      var dec = sizestr.substr(len + 1, 2);
      if (dec == "00") {//当小数点后为00时 去掉小数部分
      if (dec == "00") {
        //当小数点后为00时 去掉小数部分
        return sizestr.substring(0, len) + sizestr.substr(len + 3, 2);
      }
      return sizestr;
    }
    },
  },
  data() {
    return {
@@ -254,6 +346,7 @@
      appProcessData: [],
      vasystemServicesData: [],
      eChartsObj: {},
      activeTab: 0,
      eChartsBaseOpt: {
        title: {
          top: 10,
@@ -261,12 +354,12 @@
        animation: false,
        grid: {
          show: true,
          left: '1%',
          right: '4%',
          bottom: '3%',
          left: "1%",
          right: "4%",
          bottom: "3%",
          containLabel: true,
          borderWidth: 2,
          borderColor: '#000'
          borderColor: "#000",
        },
        xAxis: {
          type: "category",
@@ -274,43 +367,43 @@
          data: Array.from({ length: 60 }, () => 0),
          // show: false,
          axisLabel: {
            show: false
            show: false,
          },
          axisTick: {
            show: false
            show: false,
          },
          splitLine: {
            show: true,
            interval: 5,
            lineStyle: {
              width: 1,
              type: 'solid'
            }
          }
              type: "solid",
            },
          },
        },
        yAxis: {
          type: 'value',
          type: "value",
          // show: false,
          axisLine: {
            show: false
            show: false,
          },
          axisLabel: {
            show: false
            show: false,
          },
          axisTick: {
            show: false
          }
            show: false,
          },
        },
        series: [
          {
            type: 'line',
            symbol: 'none',
            type: "line",
            symbol: "none",
            data: Array.from({ length: 60 }, () => 0),
            // smooth: true,
            itemStyle: {},
            areaStyle: {}
          }
        ]
            areaStyle: {},
          },
        ],
      },
      cpuUtilizations: Array.from({ length: 60 }, () => 0),
      memUtilizations: Array.from({ length: 60 }, () => 0),
@@ -337,7 +430,7 @@
      disks: {},
      activeDisk: {},
      ioRead: 0,
      ioWrite: 0
      ioWrite: 0,
    };
  },
  mounted() {
@@ -351,41 +444,42 @@
      this.procCollect();
      setTimeout(() => {
        this.dataCollection();
      }, 5000)
      }, 5000);
    },
    serviceCollect() {
      showService().then(rsp => {
        if (rsp && rsp.success) {
          rsp.data.sort(function (obj1, obj2) {
            var val1 = obj1.name
            var val2 = obj2.name
            if (val1 < val2) {
              return -1
            } else if (val1 > val2) {
              return 1
            } else {
              return 0
            }
          })
          this.vasystemServicesData = rsp.data;
        }
      }).catch(() => { })
      showService()
        .then((rsp) => {
          if (rsp && rsp.success) {
            rsp.data.sort(function (obj1, obj2) {
              var val1 = obj1.name;
              var val2 = obj2.name;
              if (val1 < val2) {
                return -1;
              } else if (val1 > val2) {
                return 1;
              } else {
                return 0;
              }
            });
            this.vasystemServicesData = rsp.data;
          }
        })
        .catch(() => {});
    },
    procCollect() {
      showProcesses().then(rsp => {
        if (rsp && rsp.success) {
          if (rsp.data.algos)
            this.algoProcessData = rsp.data.algos;
      showProcesses()
        .then((rsp) => {
          if (rsp && rsp.success) {
            if (rsp.data.algos)
              this.algoProcessData = [...rsp.data.algos, ...rsp.data.algos];
          if (rsp.data.apps)
            this.appProcessData = rsp.data.apps;
        }
      }).catch(() => { })
            if (rsp.data.apps) this.appProcessData = rsp.data.apps;
          }
        })
        .catch(() => {});
    },
    getSystemState() {
      showSystemStates().then(rsp => {
      showSystemStates().then((rsp) => {
        if (rsp && rsp.success) {
          // 处理cpu
          this.cpuUtilizations = this.cpuUtilizations.slice(1);
@@ -394,8 +488,12 @@
          if (rsp.data.cpu_info) {
            this.cpuMaxRate = (rsp.data.cpu_info[0].mhz / 1024).toFixed(2);
            this.cpuModel = rsp.data.cpu_info[0].modelName;
            this.cpuCore = Number(rsp.data.cpu_info[rsp.data.cpu_info.length - 1].coreId) + 1;
            this.cpuCount = (rsp.data.cpu_info.length / this.cpuCore).toFixed(0);
            this.cpuCore =
              Number(rsp.data.cpu_info[rsp.data.cpu_info.length - 1].coreId) +
              1;
            this.cpuCount = (rsp.data.cpu_info.length / this.cpuCore).toFixed(
              0
            );
          }
          // 内存
@@ -404,7 +502,12 @@
          this.memTotal = (rsp.data.mem.total / 1024 / 1024 / 1000).toFixed(0);
          this.memUsed = (rsp.data.mem.used / 1024 / 1024 / 1000).toFixed(2);
          this.memFree = (rsp.data.mem.free / 1024 / 1024 / 1000).toFixed(2);
          this.memCache = ((rsp.data.mem.cached + rsp.data.mem.buffers) / 1024 / 1024 / 1000).toFixed(2);
          this.memCache = (
            (rsp.data.mem.cached + rsp.data.mem.buffers) /
            1024 /
            1024 /
            1000
          ).toFixed(2);
          this.memUsedPercent = rsp.data.mem.usedPercent.toFixed(2);
          // 算力
@@ -436,47 +539,54 @@
            } else {
              return 0;
            }
          })
          });
          rsp.data.disk.forEach(d => {
          rsp.data.disk.forEach((d) => {
            if (d.name in this.disks) {
              this.disks[d.name].readBytes = this.disks[d.name].readBytes.slice(1);
              this.disks[d.name].readBytes = this.disks[d.name].readBytes.slice(
                1
              );
              this.disks[d.name].readBytes.push(d.readBytes);
              this.disks[d.name].writeBytes = this.disks[d.name].writeBytes.slice(1);
              this.disks[d.name].writeBytes = this.disks[
                d.name
              ].writeBytes.slice(1);
              this.disks[d.name].writeBytes.push(d.writeBytes);
            } else {
              this.disks[d.name] = {};
              this.disks[d.name]["info"] = d.info;
              this.disks[d.name]["readBytes"] = Array.from({ length: 60 }, () => 0);
              this.disks[d.name]["writeBytes"] = Array.from({ length: 60 }, () => 0);
              this.disks[d.name]["readBytes"] = Array.from(
                { length: 60 },
                () => 0
              );
              this.disks[d.name]["writeBytes"] = Array.from(
                { length: 60 },
                () => 0
              );
            }
          });
          // this.disks = rsp.data.disk;
        }
        this.setChartData();
        setTimeout(() => {
          this.getSystemState();
        }, 1000)
      })
        }, 1000);
      });
    },
    isShow(authority) {
      if (this.isAdmin) {
        return true
      } else if (
        this.buttonAuthority.indexOf(',' + authority + ',') > -1
      ) {
        return true
        return true;
      } else if (this.buttonAuthority.indexOf("," + authority + ",") > -1) {
        return true;
      } else {
        return false
        return false;
      }
    },
    format(array) {
      return [
        this.$moment(array[0]).format("YYYY-MM-DD"),
        this.$moment(array[1]).format("YYYY-MM-DD")
        this.$moment(array[1]).format("YYYY-MM-DD"),
      ];
    },
    setActiveChartItem(item) {
@@ -491,7 +601,7 @@
    setChartData() {
      let option = JSON.parse(JSON.stringify(this.eChartsBaseOpt));
      switch (this.activeChartItem) {
        case 'cpu':
        case "cpu":
          this.yAxisMaxVal = this.cpuModel;
          option.title.text = "CPU";
          option.title.subtext = "%占用率";
@@ -503,7 +613,7 @@
          option.series[0].data = this.cpuUtilizations;
          break;
        case 'mem':
        case "mem":
          this.yAxisMaxVal = this.memTotal + "G";
          option.title.text = "内存";
          option.title.subtext = "内存使用量";
@@ -514,7 +624,7 @@
          option.series[0].areaStyle.color = "#f7bb88";
          option.series[0].data = this.memUtilizations;
          break;
        case 'gpu':
        case "gpu":
          this.yAxisMaxVal = "100%";
          option.title.text = "算力";
          option.title.subtext = "%使用率";
@@ -525,7 +635,7 @@
          option.series[0].areaStyle.color = "#de9dff";
          option.series[0].data = this.gpuUtilizations;
          break;
        case 'net':
        case "net":
          this.yAxisMaxVal = "";
          option.title.text = "网络";
          option.title.subtext = "网络负载";
@@ -534,17 +644,17 @@
          option.series[0].areaStyle.color = "#d68658";
          option.series[0].data = this.netReciveCount;
          option.series.push({
            type: 'line',
            symbol: 'none',
            type: "line",
            symbol: "none",
            data: this.netSendCount,
            // smooth: true,
            itemStyle: {
              color: "#4696da"
              color: "#4696da",
            },
            areaStyle: {
              color: "#4eacfd"
            }
          })
              color: "#4eacfd",
            },
          });
          break;
        default:
          if (this.activeChartItem.indexOf("disk|") == 0) {
@@ -558,17 +668,17 @@
            option.series[0].areaStyle.color = "#4eacfd";
            option.series[0].data = this.disks[dev].readBytes;
            option.series.push({
              type: 'line',
              symbol: 'none',
              type: "line",
              symbol: "none",
              data: this.disks[dev].writeBytes,
              // smooth: true,
              itemStyle: {
                color: "#33ff66"
                color: "#33ff66",
              },
              areaStyle: {
                color: "#33cc66"
              }
            })
                color: "#33cc66",
              },
            });
            this.activeDisk = this.disks[dev].info;
            this.ioRead = this.disks[dev].readBytes[59];
@@ -578,9 +688,8 @@
      }
      this.eChartsObj.setOption(option);
    }
  }
    },
  },
};
</script>
<style lang="scss">
@@ -588,12 +697,187 @@
  width: 100% !important;
  min-width: 759px;
  box-sizing: border-box;
  padding: 10px;
  // background-color: #e9ebf2;
  background-color: #fff;
  height: 100%;
  .el-table th.el-table__cell.is-leaf,
  .el-table td.el-table__cell {
    border-bottom: none;
  }
  .el-table--enable-row-hover .el-table__body tr:hover > td {
    background-color: #4e94ff !important;
    color: #fff;
  }
  .el-table th.el-table__cell > .cell {
    text-align: center;
  }
  .tableBox {
    .el-table td.el-table__cell {
      border-bottom: none;
    }
    .el-table--striped
      .el-table__body
      tr.el-table__row--striped
      td.el-table__cell {
      background: #f8f8ff;
    }
    th {
      padding: 0 !important;
      height: 40px;
      line-height: 40px;
      border-radius: 4px;
    }
    td {
      padding: 0 !important;
      height: 40px;
      line-height: 40px;
    }
  }
  .el-tabs--top {
    height: 100%;
    background: #f2f2f7;
    padding: 4px;
    box-sizing: border-box;
  }
  #systemMonitor .el-tabs__header {
    background: #fff;
    border-radius: 4px;
    background-image: url("/images/systemMonitor/Group 224.png");
    background-repeat: no-repeat;
    background-size: 116px;
    background-position: top 15px right 18px;
  }
  .el-tabs__nav-wrap {
    padding: 25px 20px;
  }
  #systemMonitor .el-tabs__active-bar {
    /* background-color: #ff7733; */
    visibility: hidden;
  }
  #systemMonitor .el-tabs__content {
    padding: 0px !important;
    height: calc(100% - 97px);
    width: calc(100% - 0px);
    .el-tab-pane {
      width: 100%;
      display: flex;
      height: 100%;
      .form-title {
        text-align: left;
        font-size: 14px;
        width: calc(100% - 200px);
        padding: 10px;
        box-sizing: border-box;
        .desc {
          font-size: 16px;
          line-height: 22px;
          color: #4e94ff;
          margin-left: 10px;
          margin-bottom: 5px;
        }
      }
    }
  }
  .left-tab {
    width: 200px;
    height: 100%;
    border-radius: 4px;
    background: #ffffff;
    padding: 20px;
    border-radius: 4px;
    box-sizing: border-box;
    .tab-item {
      width: 160px;
      height: 85px;
      /* left: 24px; */
      color: #333333;
      /* top: 158px; */
      background: #f8f8ff;
      cursor: pointer;
      border: 2px solid transparent;
      border-radius: 8px;
      margin-bottom: 20px;
      padding: 12px;
      box-sizing: border-box;
      text-align: left;
      position: relative;
      .title {
        font-weight: bold;
        font-size: 16px;
        line-height: 22px;
        margin-bottom: 4px;
      }
      .subtitle {
           font-size: 12px;
    line-height: 17px;
    z-index: 99;
    position: absolute;
      }
      .icon{
    color: #6da3f3;
    font-size: 60px;
    position: absolute;
    bottom: 4px;
    right: 4px;
      }
    }
    .tab-item-active {
      background-color: #4e94ff;
      color: #fff;
    }
    .tab-item:hover {
      border: 2px solid #4e94ff;
    }
  }
  .el-tabs__header {
    margin: 0;
  }
  .el-tabs__nav-wrap::after {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 3px;
    background-color: #f2f2f7;
    z-index: 1;
  }
  .form-title {
    text-align: left;
    font-size: 14px;
    margin-left: 4px;
    background: #fff;
  }
  #systemMonitor .el-tabs__header .el-tabs__item:nth-child(2) {
    padding-left: 39px;
  }
  #systemMonitor .el-tabs__header .el-tabs__item {
    padding: 0 39px;
    height: 40px;
    background: #f8f8ff;
    font-family: PingFangSC-Regular;
    font-size: 14px;
    font-weight: bold;
    font-size: 16px;
    color: #222222;
    text-align: center;
    border: 0px solid transparent;
    margin-right: 2px;
  }
  #systemMonitor .el-tabs__header .el-tabs__item:not(.is-disabled):hover {
    color: initial;
  }
  #systemMonitor .el-tabs__header .el-tabs__item.is-active {
    border: none;
    /* font-weight: bold; */
    background: #4e94ff;
    color: #fff !important;
  }
  .graphs-chart {
@@ -622,8 +906,8 @@
  }
  .resize-bar {
    width: 238px;
    height: 610px;
       width: 285px;
height: 600px;
  }
  /* 拖拽线 */
@@ -638,28 +922,38 @@
  }
  .ax_default {
    width: 207px;
    height: 45px;
   width: 270px;
    height: 70px;
    padding: 10px;
    font-size: 15px;
    font-size: 14px;
    margin: 5px;
    cursor: pointer;
    border-radius: 4px;
    box-sizing: border-box;
    display: flex;
    justify-content: space-between;
  }
  .selected {
    background: inherit;
    background-color: #cde8ff;
    // background: inherit;
    // background-color: #cde8ff;
    // border: none;
    // border-radius: 8px;
      background: inherit;
    background-color: #4E94FF;
    border: none;
    border-radius: 8px;
    color: #fff;
  }
  .ax_default_pic {
    position: absolute;
    // position: absolute;
    border-width: 0px;
    width: 66px;
    height: 45px;
       height: 50px;
    box-sizing: border-box;
    border: 1px solid rgba(255, 153, 0, 1);
    background-color: #fff;
    background-repeat: no-repeat;
    background-position: bottom;
  }
@@ -692,14 +986,13 @@
  .ax_default_text {
    position: relative;
    text-align: left;
    margin-left: 72px;
  font-size: 16px;
  }
  .ax_default_subtext {
    font-size: 13px;
    margin-left: 72px;
    line-height: 35px;
    color: #4e4d4d;
    text-align: left;
  }