zhangzengfei
2022-07-20 4a800a8fc83c6bd1f86a8e847b079a51a7532c09
src/pages/systemMonitor/index/App.vue
@@ -1,68 +1,310 @@
<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>(正在进行5个算法单元)
      <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">
              正在进行{{ appProcessData.length }}个应用单元
            </div>
            <span
              class="iconfont icon"
              :style="activeTab == 1 ? {} : { color: '#fff' }"
              >&#xe744;</span
            >
          </div>
        </div>
        <el-divider></el-divider>
        <div class="form-title" v-if="activeTab == 0">
          <div class="desc">
            <b>算法单元</b>
            (正在进行{{ algoProcessData.length }}个算法单元)
          </div>
        <div class="form-title">
          <b>应用单元</b>(正在进行5个应用单元)
          <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 label="名称" width="231">
              <template slot-scope="scope">
                <span class="iconfont icon">&#xe74d;</span>
                <span>{{ scope.row.desc }} </span>
              </template>
            </el-table-column>
            <el-table-column label="CPU">
              <template slot-scope="scope">
                <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>
              </template>
            </el-table-column>
            <!-- <el-table-column
              prop="disk"
              label="硬盘"
              width="150"
            ></el-table-column> -->
            <el-table-column label="算力">
              <template slot-scope="scope">
                <span>{{ scope.row.gpu }} M</span>
              </template>
            </el-table-column>
          </el-table>
        </div>
        <el-divider></el-divider>
        <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;font-size: 16px;'"
            stripe
            class="tableBox"
          >
            <el-table-column prop="desc" label="名称"></el-table-column>
            <el-table-column prop="cpu" label="CPU">
              <template slot-scope="scope">
                <span>{{ scope.row.cpu.toFixed(2) }} %</span>
              </template>
            </el-table-column>
            <el-table-column prop="mem" label="内存">
              <template slot-scope="scope">
                <span>{{ scope.row.mem.toFixed(2) }} %</span>
              </template>
            </el-table-column>
            <!--   <el-table-column prop="disk" label="硬盘"></el-table-column>
            <el-table-column prop="gpu" label="算力"></el-table-column>
            <el-table-column prop="net" label="网络"></el-table-column> -->
          </el-table>
        </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">
              <div class="ax_default_pic"></div>
              <div>CPU</div>
              <div>100%</div>
            <div
              :class="[
                'ax_default',
                activeChartItem == 'cpu' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('cpu')"
            >
              <div class="ax_default_pic color-cpu"></div>
              <div>
                <div class="ax_default_text">CPU</div>
                <div class="ax_default_subtext">{{ cpuUsedPercent }}%</div>
              </div>
            </div>
            <div class="ax_default">
              <div class="ax_default_pic"></div>
              <div>内存</div>
              <div>100%</div>
            <div
              :class="[
                'ax_default',
                activeChartItem == 'mem' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('mem')"
            >
              <div class="ax_default_pic color-mem"></div>
              <div>
                <div class="ax_default_text">内存</div>
                <div class="ax_default_subtext">{{ memUsedPercent }}%</div>
              </div>
            </div>
            <div class="ax_default">
              <div class="ax_default_pic"></div>
              <div>磁盘</div>
              <div>100%</div>
            <div
              :class="[
                'ax_default',
                activeChartItem == 'gpu' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('gpu')"
            >
              <div class="ax_default_pic color-gpu"></div>
              <div>
                <div class="ax_default_text">算力</div>
                <div class="ax_default_subtext">{{ gpuUsedPercent }}%</div>
              </div>
            </div>
            <div class="ax_default">
              <div class="ax_default_pic"></div>
              <div>算力</div>
              <div>100%</div>
            <div
              :class="[
                'ax_default',
                activeChartItem == 'net' ? 'selected' : '',
              ]"
              @click="setActiveChartItem('net')"
            >
              <div class="ax_default_pic color-net"></div>
              <div>
                <div class="ax_default_text">网络</div>
                <div class="ax_default_subtext">
                  {{ netSend | byteConver }} / {{ netRecive | byteConver }}
                </div>
              </div>
            </div>
            <div class="ax_default">
              <div class="ax_default_pic"></div>
              <div>网络</div>
              <div>100%</div>
            <div
              v-for="(v, k) in disks"
              :key="k"
              :class="[
                'ax_default',
                activeChartItem == 'disk|' + k ? 'selected' : '',
              ]"
              @click="setActiveChartItem('disk|' + k)"
            >
              <div class="ax_default_pic color-disk"></div>
              <div>
                <div class="ax_default_text">磁盘 {{ k }}</div>
                <div class="ax_default_subtext">
                  {{ v.info.total | byteConver }}
                </div>
              </div>
            </div>
          </div>
          <div class="resize-line"></div>
        </div>
        <div class="column-right">
          <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>
            </div>
            <div class="ax_default_label">
              <b>主频</b>
              <p>{{ cpuMaxRate }}Ghz</p>
            </div>
            <div class="ax_default_label">
              <b>插槽</b>
              <p>{{ cpuCount }}</p>
            </div>
            <div class="ax_default_label">
              <b>内核</b>
              <p>{{ cpuCore }}</p>
            </div>
          </div>
          <div v-show="activeChartItem == 'mem'">
            <div class="ax_default_label">
              <b>使用中</b>
              <p>{{ memUsed }}G</p>
            </div>
            <div class="ax_default_label">
              <b>已缓存</b>
              <p>{{ memCache }}G</p>
            </div>
            <div class="ax_default_label">
              <b>可用</b>
              <p>{{ memFree }}G</p>
            </div>
          </div>
          <div v-show="activeChartItem == 'net'">
            <div class="ax_default_label">
              <b>接收</b>
              <p>{{ netRecive | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>发送</b>
              <p>{{ netSend | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>IP地址</b>
              <p>{{ ipAddr }}</p>
            </div>
            <div class="ax_default_label" style="margin-left: 19px">
              <b>MAC地址</b>
              <p>{{ macAddr }}</p>
            </div>
          </div>
          <div v-show="isDisk">
            <div class="ax_default_label">
              <b>容量</b>
              <p>{{ activeDisk.total | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>已用</b>
              <p>{{ activeDisk.used | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>可用</b>
              <p>{{ activeDisk.free | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>读取速度</b>
              <p>{{ ioRead | byteConver }}</p>
            </div>
            <div class="ax_default_label">
              <b>写入速度</b>
              <p>{{ ioWrite | byteConver }}</p>
            </div>
          </div>
        </div>
      </el-tab-pane>
      <el-tab-pane label="服务" name="service">
        <el-table height="93%" :data="services" border :cell-style="cellStyle">
          <el-table-column label="名称" align="center" show-overflow-tooltip>
      <el-tab-pane name="service">
        <span slot="label">
          <span class="iconfont icon">&#xe944;</span>
          服务</span
        >
        <el-table
          :data="vasystemServicesData"
          :header-cell-style="'color: #333333;height: 40px;font-size: 16px;'"
          stripe
          class="tableBox"
        >
          <el-table-column label="名称" show-overflow-tooltip>
            <template slot-scope="scope">
              <span>{{ scope.row.name}}</span>
              <div class="name_container">
                <span class="iconfont icon">&#xe74d;</span>
                <span>{{ scope.row.name }}</span>
              </div>
            </template>
          </el-table-column>
          <el-table-column label="状态" prop="status" align="center" width="130px"></el-table-column>
          <el-table-column label="描述" prop="text" align="center"></el-table-column>
          <el-table-column label="状态" prop="status">
            <template slot-scope="scope">
              <span>{{ scope.row.pid == 0 ? "未启动" : "已启动" }}</span>
            </template>
          </el-table-column>
          <el-table-column label="描述" prop="desc"></el-table-column>
        </el-table>
      </el-tab-pane>
    </el-tabs>
@@ -71,114 +313,412 @@
<script>
import echarts from "echarts";
import { showSystemStates } from "../api/api"
import { showSystemStates, showService, showProcesses } from "../api/api";
export default {
  components: {
  components: {},
  computed: {
    isDisk() {
      return this.activeChartItem.indexOf("disk") == 0;
    },
    isAdmin() {
      if (
        sessionStorage.getItem("userInfo") &&
        sessionStorage.getItem("userInfo") !== ""
      ) {
        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
        size = limit + "B";
      } else if (limit < 1024 * 1024) {
        //如果小于0.1MB转化成KB
        size = (limit / 1024).toFixed(2) + "KB";
      } else if (limit < 1024 * 1024 * 1024) {
        //如果小于0.1GB转化成MB
        size = (limit / (1024 * 1024)).toFixed(2) + "MB";
      } 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 dec = sizestr.substr(len + 1, 2);
      if (dec == "00") {
        //当小数点后为00时 去掉小数部分
        return sizestr.substring(0, len) + sizestr.substr(len + 3, 2);
      }
      return sizestr;
    },
  },
  data() {
    return {
      activeName: "proc",
      activeChartItem: "cpu",
      yAxisMaxVal: "100%",
      algoProcessData: [],
      appProcessData: [],
      vasystemServicesData: [],
      eChartsObj: {},
      activeTab: 0,
      eChartsBaseOpt: {
        title: {
          top: 10,
        },
        animation: false,
        grid: {
          show: true,
          left: "1%",
          right: "4%",
          bottom: "3%",
          containLabel: true,
          borderWidth: 2,
          borderColor: "#000",
        },
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: Array.from({ length: 100 }, () => 0),
          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",
              color: "rgb(242,242,242)",
            },
          },
        },
        yAxis: {
          type: 'value',
          type: "value",
          // show: false,
          axisLine: {
            show: false,
          },
          axisLabel: {
            show: false
            show: false,
          },
          axisTick: {
            show: false
          }
            show: false,
          },
          splitLine: {
            lineStyle: {
              color: "rgb(242,242,242)",
            },
          },
        },
        series: [
          {
            type: 'line',
            symbol: 'none',
            data: Array.from({ length: 100 }, () => 0),
            type: "line",
            symbol: "none",
            data: Array.from({ length: 60 }, () => 0),
            // smooth: true,
            areaStyle: {}
          }
        ]
            itemStyle: {},
            areaStyle: {},
          },
        ],
      },
      services: [
        {
          name: "系统配置服务",
          status: "已启动",
          text: "实现系统的通用功能配置"
        }
      ]
      cpuUtilizations: Array.from({ length: 60 }, () => 0),
      memUtilizations: Array.from({ length: 60 }, () => 0),
      gpuUtilizations: Array.from({ length: 60 }, () => 0),
      diskIOWriteCount: Array.from({ length: 60 }, () => 0),
      diskIOReadCount: Array.from({ length: 60 }, () => 0),
      netReciveCount: Array.from({ length: 60 }, () => 0),
      netSendCount: Array.from({ length: 60 }, () => 0),
      cpuModel: "",
      cpuUsedPercent: 0,
      cpuMaxRate: 0,
      cpuCount: 0,
      cpuCore: 0,
      memTotal: 0,
      memUsed: 0,
      memFree: 0,
      memCache: 0,
      memUsedPercent: 0,
      netSend: 0,
      netRecive: 0,
      ipAddr: "",
      macAddr: "",
      gpuUsedPercent: 0,
      disks: {},
      activeDisk: {},
      ioRead: 0,
      ioWrite: 0,
    };
  },
  mounted() {
    this.dataCollection();
    this.initChart();
    if (!this.isShow('vindicate:device')) {
      this.activeName = "dbvdc"
    }
  },
  computed: {
    isAdmin() {
      if (
        sessionStorage.getItem('userInfo') &&
        sessionStorage.getItem('userInfo') !== ''
      ) {
        let loginName = JSON.parse(sessionStorage.getItem('userInfo')).username
        return (
          loginName === 'superadmin' || loginName === 'basic'
        )
      }
      return false;
    }
  },
  methods: {
    // 循环采集所有数据
    dataCollection() {
      this.serviceCollect();
      this.procCollect();
      setTimeout(() => {
        this.dataCollection();
      }, 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(() => {});
    },
    procCollect() {
      showProcesses()
        .then((rsp) => {
          if (rsp && rsp.success) {
            if (rsp.data.algos) this.algoProcessData = rsp.data.algos;
            if (rsp.data.apps) this.appProcessData = rsp.data.apps;
          }
        })
        .catch(() => {});
    },
    getSystemState() {
      showSystemStates().then((rsp) => {
        if (rsp && rsp.success) {
          // 处理cpu
          this.cpuUtilizations = this.cpuUtilizations.slice(1);
          this.cpuUtilizations.push(rsp.data.cpu.toFixed(2));
          this.cpuUsedPercent = this.cpuUtilizations[59];
          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.memUtilizations = this.memUtilizations.slice(1);
          this.memUtilizations.push(rsp.data.mem.usedPercent.toFixed(2));
          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.memUsedPercent = rsp.data.mem.usedPercent.toFixed(2);
          // 算力
          this.gpuUtilizations = this.gpuUtilizations.slice(1);
          this.gpuUtilizations.push(rsp.data.gpu.toFixed(2));
          this.gpuUsedPercent = this.gpuUtilizations[59];
          // 网络
          this.netReciveCount = this.netReciveCount.slice(1);
          this.netReciveCount.push(rsp.data.net.bytesRecv);
          this.netSendCount = this.netSendCount.slice(1);
          this.netSendCount.push(rsp.data.net.bytesSent);
          this.netRecive = this.netReciveCount[59];
          this.netSend = this.netSendCount[59];
          this.macAddr = rsp.data.net.mac;
          if (rsp.data.net.addr.length) {
            this.ipAddr = rsp.data.net.addr[0].addr;
          }
          // 磁盘
          rsp.data.disk.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;
            }
          });
          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.push(d.readBytes);
              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 = rsp.data.disk;
        }
        this.setChartData();
        setTimeout(() => {
          this.getSystemState();
        }, 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) {
      this.activeChartItem = item;
      this.eChartsObj.clear();
      this.setChartData();
    },
    initChart() {
      this.eChartsObj = echarts.init(this.$refs.graphs);
      this.eChartsObj.setOption(this.eChartsBaseOpt);
      this.cpuMonitor()
      this.getSystemState();
    },
    cpuMonitor() {
      let rate = Math.floor(Math.random() * 100);
      let data = this.eChartsBaseOpt.series[0].data.slice(1);
      data.push(rate)
      this.eChartsBaseOpt.series[0].data = data;
      this.eChartsObj.setOption(this.eChartsBaseOpt);
      setTimeout(() => {
        this.cpuMonitor()
      }, 1000)
    }
    setChartData() {
      let option = JSON.parse(JSON.stringify(this.eChartsBaseOpt));
      switch (this.activeChartItem) {
        case "cpu":
          this.yAxisMaxVal = this.cpuModel;
          option.title.text = "CPU";
          option.title.subtext = "%占用率";
          option.yAxis.max = 100;
          option.yAxis.min = 0;
          option.grid.borderColor = "#8aadd0";
          option.series[0].itemStyle.color = "#8aadd0";
          option.series[0].areaStyle.color = "#a8d4ff";
          option.series[0].data = this.cpuUtilizations;
  }
          break;
        case "mem":
          this.yAxisMaxVal = this.memTotal + "G";
          option.title.text = "内存";
          option.title.subtext = "内存使用量";
          option.yAxis.max = 100;
          option.yAxis.min = 0;
          option.grid.borderColor = "#ff9900";
          option.series[0].itemStyle.color = "#ff9900";
          option.series[0].areaStyle.color = "#f7bb88";
          option.series[0].data = this.memUtilizations;
          break;
        case "gpu":
          this.yAxisMaxVal = "100%";
          option.title.text = "算力";
          option.title.subtext = "%使用率";
          option.yAxis.max = 100;
          option.yAxis.min = 0;
          option.grid.borderColor = "#bc84d8";
          option.series[0].itemStyle.color = "#bc84d8";
          option.series[0].areaStyle.color = "#de9dff";
          option.series[0].data = this.gpuUtilizations;
          break;
        case "net":
          this.yAxisMaxVal = "";
          option.title.text = "网络";
          option.title.subtext = "网络负载";
          option.grid.borderColor = "#4696da";
          option.series[0].itemStyle.color = "#ffa16a";
          option.series[0].areaStyle.color = "#d68658";
          option.series[0].data = this.netReciveCount;
          option.series.push({
            type: "line",
            symbol: "none",
            data: this.netSendCount,
            // smooth: true,
            itemStyle: {
              color: "#4696da",
            },
            areaStyle: {
              color: "#4eacfd",
            },
          });
          break;
        default:
          if (this.activeChartItem.indexOf("disk|") == 0) {
            let dev = this.activeChartItem.split("|")[1];
            this.yAxisMaxVal = "";
            option.title.text = "磁盘";
            option.title.subtext = "磁盘传输速率";
            option.grid.borderColor = "#33cc66";
            option.series[0].itemStyle.color = "#4696da";
            option.series[0].areaStyle.color = "#4eacfd";
            option.series[0].data = this.disks[dev].readBytes;
            option.series.push({
              type: "line",
              symbol: "none",
              data: this.disks[dev].writeBytes,
              // smooth: true,
              itemStyle: {
                color: "#33ff66",
              },
              areaStyle: {
                color: "#33cc66",
              },
            });
            this.activeDisk = this.disks[dev].info;
            this.ioRead = this.disks[dev].readBytes[59];
            this.ioWrite = this.disks[dev].writeBytes[59];
          }
          break;
      }
      this.eChartsObj.setOption(option);
    },
  },
};
</script>
<style lang="scss">
@@ -186,33 +726,225 @@
  width: 100% !important;
  min-width: 759px;
  box-sizing: border-box;
  padding: 10px;
  // background-color: #e9ebf2;
  background-color: #fff;
  height: 100%;
  .name_container {
    text-align: left;
    margin-left: 38%;
  }
  .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;
      text-align: center;
    }
  }
  .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 {
    height: 380px;
    width: 450px;
    height: 500px;
    width: 900px;
    margin-left: 15px;
    // border: 1px solid rgb(69, 69, 172);
  }
  .column-left {
    background-color: #fff;
    position: relative;
    float: left;
  }
  .column-right {
    //overflow: hidden;
    overflow-y: hidden;
    background-color: #fff;
    overflow-y: auto;
    overflow-x: auto;
  }
  .resize-bar {
    width: 200px;
    height: 400px;
  .max-val {
    position: absolute;
    right: 4%;
    top: 8%;
  }
  .resize-bar {
    width: 285px;
    // height: 600px;
  }
  /* 拖拽线 */
  .resize-line {
    position: absolute;
@@ -225,41 +957,113 @@
  }
  .ax_default {
    font-family: "Arial Normal", "Arial";
    font-weight: 400;
    font-style: normal;
    font-size: 13px;
    text-align: center;
    line-height: normal;
    width: 200px;
    height: 50px;
    font-size: 16px;
    width: 270px;
    height: 70px;
    padding: 10px;
    font-size: 14px;
    margin: 5px;
    cursor: pointer;
    margin-bottom: 15px;
    border-radius: 4px;
    box-sizing: border-box;
    display: flex;
    justify-content: space-between;
    color: #333333;
  }
  .ax_default:hover {
    color: #333333;
    background: #f8f8ff;
  }
  .selected {
    // 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: 65px;
    height: 45px;
    background: inherit;
    background-color: rgba(255, 255, 255, 0);
    width: 66px;
    height: 50px;
    box-sizing: border-box;
    border-width: 1px;
    border-style: solid;
    border-color: rgba(255, 153, 0, 1);
    border-radius: 0px;
    -moz-box-shadow: none;
    -webkit-box-shadow: none;
    box-shadow: none;
    border: 1px solid rgba(255, 153, 0, 1);
    background-color: #fff;
    background-repeat: no-repeat;
    background-position: bottom;
  }
  .color-cpu {
    border-color: #8aadd0;
    background-image: url("/images/systemMonitor/cpu.png");
  }
  .color-mem {
    border-color: #ff9900;
    background-image: url("/images/systemMonitor/mem.png");
  }
  .color-gpu {
    border-color: #bc84d8;
    background-image: url("/images/systemMonitor/gpu.png");
  }
  .color-net {
    border-color: #4696da;
    background-image: url("/images/systemMonitor/net.png");
  }
  .color-disk {
    border-color: #33cc66;
    background-image: url("/images/systemMonitor/disk.png");
  }
  .ax_default_text {
    position: relative;
    text-align: right;
    font-size: 16px;
    line-height: 22px;
    font-weight: bold;
  }
  .ax_default_subtext {
    font-size: 14px;
    line-height: 20px;
    text-align: right;
  }
  .ax_default_label {
    width: 120px;
    font-size: 15px;
    display: inline-block;
    float: left;
    b {
      font-family: "思源黑体";
      font-weight: 400;
      font-style: normal;
      color: #a1a1a1;
    }
    p {
      margin-top: 5px;
    }
  }
  .ax_label_flex {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
  }
  .s-system-monitor-breadcrumb {
    height: 5%;
    box-sizing: border-box;
    border: 1px solid #e4e7ed;
    box-shadow: #e4e7ed 0px 0px 9px inset;
    box-shadow: #e4e7ed 0px 0px 9px inset;
    border-radius: 5px;
  }
@@ -296,12 +1100,13 @@
      }
    }
  }
  .el-tabs__content {
    height: calc(100% - 64px);
    width: calc(100% - 20px);
    box-sizing: border-box;
    overflow-y: auto;
    padding: 10px 40px !important;
    padding: 10px 10px !important;
    .el-tab-pane {
      width: 100%;
      .s-title {