zhangzengfei
2021-05-21 cd94db8350d7dcb0eadcd489e1998ab94f611451
完善系统监控
5个文件已添加
3个文件已修改
761 ■■■■ 已修改文件
public/apps.json 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/images/systemMonitor/cpu.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/systemMonitor/disk.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/systemMonitor/gpu.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/systemMonitor/mem.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/systemMonitor/net.png 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/systemMonitor/api/api.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/systemMonitor/index/App.vue 715 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/apps.json
@@ -308,8 +308,8 @@
      "type": "2",
      "url": "/view/gb28181/",
      "title": "GB28181配置",
      "width": 600,
      "height": 670,
      "width": 1200,
      "height": 970,
      "iconBlob": "",
      "icon": "../../images/app-mid/GB-config.png",
      "version": "1.0.2",
@@ -461,8 +461,8 @@
      "installed": true,
      "isUpgrade": false,
      "progressMsg": ""
    },{
    },
    {
      "id": "fa5674ee-70cf-4e22-8a06-c17429fb777",
      "name": "乘务员安全行为分析",
      "package": "shuohuangMonitorAnalyze",
@@ -486,19 +486,19 @@
      "progressMsg": ""
    },
    {
      "id": "af412cbe-472e-4dbc-b962-b290483c9ea1",
      "name": "设备中心",
      "package": "deviceCenter",
      "id": "fa5674ee-70cf-4e22-8a06-c171292b777",
      "name": "系统监控",
      "package": "systemMonitor",
      "type": "2",
      "url": "/view/deviceCenter/",
      "title": "设备中心",
      "width": 1200,
      "height": 670,
      "url": "/view/systemMonitor/",
      "title": "系统监控",
      "width": 1220,
      "height": 800,
      "iconBlob": "",
      "icon": "../../images/app-mid/datastack-config.png",
      "version": "1.0.1",
      "create_time": "2021-04-01 21:47:38",
      "create_by": "basic",
      "icon": "../../images/app-mid/visual.png",
      "version": "1.0.0",
      "create_time": "2020-10-09 14:00:08",
      "create_by": "",
      "update_time": "",
      "update_by": "",
      "isDelete": 0,
public/images/systemMonitor/cpu.png
public/images/systemMonitor/disk.png
public/images/systemMonitor/gpu.png
public/images/systemMonitor/mem.png
public/images/systemMonitor/net.png
src/pages/systemMonitor/api/api.ts
@@ -2,7 +2,21 @@
export const showSystemStates = () => {
  return request({
    url: "/data/api-z/system/ShowSystemStates",
    url: "/data/api-z/system/showSystemStates",
    method: "get"
  });
};
export const showService = () => {
  return request({
    url: "/data/api-z/system/showService",
    method: "get"
  });
};
export const showProcesses = () => {
  return request({
    url: "/data/api-z/system/showProcesses",
    method: "get"
  });
};
src/pages/systemMonitor/index/App.vue
@@ -3,66 +3,193 @@
    <el-tabs id="systemMonitor" v-model="activeName">
      <el-tab-pane label="单元" name="proc">
        <div class="form-title">
          <b>算法单元</b>(正在进行5个算法单元)
          <b>算法单元</b>
          (正在进行{{algoProcessData.length}}个算法单元)
          <el-table :data="algoProcessData" style="width: 100%">
            <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>
              </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="硬盘"></el-table-column>
            <el-table-column label="算力">
              <template slot-scope="scope">
                <span>{{ scope.row.gpu}} M</span>
              </template>
            </el-table-column>
            <el-table-column prop="net" label="网络"></el-table-column>
          </el-table>
        </div>
        <el-divider></el-divider>
        <div class="form-title">
          <b>应用单元</b>(正在进行5个应用单元)
        <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>
            <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>
            <el-table-column prop="net" label="网络"></el-table-column>
          </el-table>
        </div>
        <el-divider></el-divider>
      </el-tab-pane>
      <el-tab-pane label="性能" name="top">
        <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 class="ax_default_text">CPU</div>
              <div class="ax_default_subtext">{{cpuUsedPercent}}%</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 class="ax_default_text">内存</div>
              <div class="ax_default_subtext">{{memUsedPercent}}%</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 class="ax_default_text">算力</div>
              <div class="ax_default_subtext">{{gpuUsedPercent}}%</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 class="ax_default_text">网络</div>
              <div class="ax_default_subtext">{{netSend | byteConver}} / {{netRecive | byteConver}}</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 class="ax_default_text">磁盘 {{k}}</div>
              <div class="ax_default_subtext">{{v.info.total | byteConver}}</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-table :data="vasystemServicesData">
          <el-table-column label="名称" show-overflow-tooltip>
            <template slot-scope="scope">
              <span>{{ scope.row.name}}</span>
            </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,66 +198,15 @@
<script>
import echarts from "echarts";
import { showSystemStates } from "../api/api"
import { showSystemStates, showService, showProcesses } from "../api/api"
export default {
  components: {
  },
  data() {
    return {
      activeName: "proc",
      eChartsObj: {},
      eChartsBaseOpt: {
        animation: false,
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: Array.from({ length: 100 }, () => 0),
          axisLabel: {
            show: false
          },
          axisTick: {
            show: false
          }
        },
        yAxis: {
          type: 'value',
          axisLabel: {
            show: false
          },
          axisTick: {
            show: false
          }
        },
        series: [
          {
            type: 'line',
            symbol: 'none',
            data: Array.from({ length: 100 }, () => 0),
            // smooth: true,
            areaStyle: {}
          }
        ]
      },
      services: [
        {
          name: "系统配置服务",
          status: "已启动",
          text: "实现系统的通用功能配置"
        }
      ]
    };
  },
  mounted() {
    this.initChart();
    if (!this.isShow('vindicate:device')) {
      this.activeName = "dbvdc"
    }
  },
  computed: {
    isDisk() {
      return this.activeChartItem.indexOf("disk") == 0
    },
    isAdmin() {
      if (
        sessionStorage.getItem('userInfo') &&
@@ -144,7 +220,248 @@
      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: {},
      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: 60 }, () => 0),
          // show: false,
          axisLabel: {
            show: false
          },
          axisTick: {
            show: false
          },
          splitLine: {
            show: true,
            interval: 5,
            lineStyle: {
              width: 1,
              type: 'solid'
            }
          }
        },
        yAxis: {
          type: 'value',
          // show: false,
          axisLine: {
            show: false
          },
          axisLabel: {
            show: false
          },
          axisTick: {
            show: false
          }
        },
        series: [
          {
            type: 'line',
            symbol: 'none',
            data: Array.from({ length: 60 }, () => 0),
            // smooth: true,
            itemStyle: {},
            areaStyle: {}
          }
        ]
      },
      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();
  },
  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
@@ -162,20 +479,105 @@
        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);
    }
  }
@@ -195,24 +597,35 @@
  }
  .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;
    overflow-x: auto;
  }
  .resize-bar {
    width: 200px;
    height: 400px;
  .max-val {
    position: absolute;
    right: 4%;
    top: 8%;
  }
  .resize-bar {
    width: 238px;
    height: 610px;
  }
  /* 拖拽线 */
  .resize-line {
    position: absolute;
@@ -225,41 +638,98 @@
  }
  .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: 207px;
    height: 45px;
    padding: 10px;
    font-size: 15px;
    margin: 5px;
    cursor: pointer;
    margin-bottom: 15px;
  }
  .selected {
    background: inherit;
    background-color: #cde8ff;
    border: none;
    border-radius: 8px;
  }
  .ax_default_pic {
    position: absolute;
    border-width: 0px;
    width: 65px;
    width: 66px;
    height: 45px;
    background: inherit;
    background-color: rgba(255, 255, 255, 0);
    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-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: left;
    margin-left: 72px;
  }
  .ax_default_subtext {
    font-size: 13px;
    margin-left: 72px;
    line-height: 35px;
    color: #4e4d4d;
    text-align: left;
  }
  .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 +766,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 {