Ver Fonte

缓存监测完成

vera_min há 2 anos atrás
pai
commit
b9f0bc5e4a

+ 874 - 0
src/views/system/monitor/cache/index.vue

@@ -0,0 +1,874 @@
+<template>
+  <div class="system-cache-container">
+    <div class="flex-row gap-3">
+        <el-col :span="8" class="marg-b-15">
+            <el-card class="box-card-height" style="height:auto">
+                <template #header>
+                    <div class="card-header">
+                        <span>info Keyspace</span>
+                    </div>
+                </template>
+                <table cellspacing="0" style="height: 230px;width: 100%">
+                    <tbody v-if="sysInfo.keyspace">
+                        <tr>
+                            <td>
+                                <div class="cell-card">当前数据库key总数: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.keyspace.db0.keys }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">带有过期时间的key总数: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.keyspace.db0.expires }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">平均存活时间: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.keyspace.db0.avg_ttl }}</div>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+            </el-card>
+        </el-col>
+        <el-col :span="8" class="marg-b-15">
+            <el-card class="box-card-height" style="height:auto">
+                <template #header>
+                    <div class="card-header">
+                        <span>客户端信息</span>
+                    </div>
+                </template>
+                <table cellspacing="0" style="height: 230px;width: 100%">
+                    <tbody v-if="sysInfo.clients">
+                        <tr>
+                            <td>
+                                <div class="cell-card">当前客户端连接数: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.clients.connected_clients }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">输出缓冲区中队列对象个数的最大值: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.clients.client_recent_max_output_buffer }}</div>
+                            </td>
+                        </tr>
+
+                        <tr>
+                            <td>
+                                <div class="cell-card">输入缓冲区中占用的最大容量:</div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.clients.client_recent_max_input_buffer }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">等待阻塞命令的客户端数量:</div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.clients.blocked_clients }}</div>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+                <!-- <div style="height: 250px" ref="chartsWarningRef4"></div> -->
+            </el-card>
+        </el-col>
+        <el-col :span="8" class="marg-b-15">
+            <el-card class="box-card-height" style="height:auto">
+                <template #header>
+                    <div class="card-header">
+                        <span>info CPU</span>
+                    </div>
+                </template>
+                <table cellspacing="0" style="height: 230px;width: 100%">
+                    <tbody v-if="sysInfo.cpu">
+                        <tr>
+                            <td>
+                                <div class="cell-card">Redis主进程在内核态所占用的CPU时钟总和: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.cpu.used_cpu_sys }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">Redis主进程在用户态所占用的CPU时钟总和: </div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.cpu.used_cpu_user }}</div>
+                            </td>
+                        </tr>
+
+                        <tr>
+                            <td>
+                                <div class="cell-card">Redis子进程在内核态所占用的CPU时钟总和:</div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.cpu.used_cpu_sys_children }}</div>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td>
+                                <div class="cell-card">Redis子进程在用户态所占用的CPU时钟总和:</div>
+                            </td>
+                            <td>
+                                <div class="cell-card">{{ sysInfo.cpu.used_cpu_user_children }}</div>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+                <!-- <div style="height: 250px" ref="chartsWarningRef4"></div> -->
+            </el-card>
+        </el-col>
+    </div>
+    <div class="flex-row gap-3">
+      <el-col :span="12" class="marg-b-15">
+        <el-card class="box-card-height" style="height:auto">
+            <template #header>
+                <div class="card-header">
+                    <span>server信息</span>
+                </div>
+            </template>
+            <table cellspacing="0" style="height: 300px;width: 100%">
+                <tbody v-if="sysInfo.clients">
+                    <tr>
+                        <td>
+                            <div class="cell-card">Redis服务版本: </div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.redis_version }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">运行模式: </div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.redis_mode }}</div>
+                        </td>
+                    </tr>
+
+                    <tr>
+                        <td>
+                            <div class="cell-card">Redis所在机器的操作系统:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.os }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">架构:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.arch_bits }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">Redis所使用的事件处理机制:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.multiplexing_api }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">自Redis服务启动以来,运行的秒数:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.server.uptime_in_seconds }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                        <div class="cell-card">自Redis服务启动以来,运行的天数:</div>
+                        </td>
+                        <td>
+                        <div class="cell-card">{{ sysInfo.server.uptime_in_days }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                        <div class="cell-card">serverCron每秒运行次数:</div>
+                        </td>
+                        <td>
+                        <div class="cell-card">{{ sysInfo.server.hz }}</div>
+                        </td>
+                    </tr>
+                </tbody>
+            </table>
+          <!-- <div style="height: 250px" ref="chartsWarningRef5"></div> -->
+        </el-card>
+      </el-col>
+      <el-col :span="12" class="marg-b-15">
+        <el-card class="box-card-height" style="height:auto">
+            <template #header>
+                <div class="card-header">
+                    <span>内存信息</span>
+                </div>
+            </template>
+            <table v-if='sysInfo.memory' cellspacing="0" style="height: 300px;width: 100%">
+                <tbody>
+                    <tr>
+                        <td>
+                            <div class="cell-card">Redis分配器分配的内存总量: </div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.used_memory }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">以可读的格式返回used_memory: </div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.used_memory_human }}</div>
+                        </td>
+                    </tr>
+
+                    <tr>
+                        <td>
+                            <div class="cell-card">从操作系统的角度,Redis进程占用的物理内存总量:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.used_memory_rss }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">内存使用的最大值:</div>
+                        </td>
+                        <td>
+                        <div class="cell-card">{{ sysInfo.memory.used_memory_peak }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">以可读的格式返回used_memory_peak:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.used_memory_peak_human }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <div class="cell-card">Lua引擎所消耗的内存大小:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.used_memory_lua }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                        <div class="cell-card">内存碎片率:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.mem_fragmentation_ratio }}</div>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>
+                        <div class="cell-card">Redis所使用的内存分配器:</div>
+                        </td>
+                        <td>
+                            <div class="cell-card">{{ sysInfo.memory.mem_allocator }}</div>
+                        </td>
+                    </tr>
+                
+                </tbody>
+            </table>
+          <!-- <div style="height: 250px" ref="chartsWarningRef6"></div> -->
+        </el-card>
+      </el-col>
+    </div>
+    <div class="flex-row gap-3">
+      <el-col :xs="24" :sm="24" :md="24" class="marg-b-15">
+        <el-card class="box-card-height" style="height:auto">
+          <template #header>
+            <div class="card-header">
+              <span>基础统计信息</span>
+            </div>
+          </template>
+          <div class="flex-row">
+            <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
+                <el-form-item label="连接过的客户端总数">{{sysInfo.stats.total_connections_received}}</el-form-item>
+                <el-form-item label="执行过的命令总数">{{sysInfo.stats.total_commands_processed}}</el-form-item>
+                <el-form-item label="每秒处理命令条数">{{sysInfo.stats.instantaneous_ops_per_sec}}</el-form-item>
+                <el-form-item label="拒绝的连接个数">{{sysInfo.stats.rejected_connections}}</el-form-item>
+                <el-form-item label="key数量">{{sysInfo.stats.evicted_keys}}</el-form-item>
+
+            </el-form>
+              
+            <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
+                <el-form-item  label="输入总网络流量">{{sysInfo.stats.total_net_input_bytes}} Byte</el-form-item>
+                <el-form-item label="输出总网络流量">{{sysInfo.stats.total_net_output_bytes}} Byte</el-form-item>
+                <el-form-item label="每秒输入字节数">{{sysInfo.stats.instantaneous_input_kbps}}</el-form-item>
+                <el-form-item label="每秒输出字节数">{{sysInfo.stats.instantaneous_output_kbps}}</el-form-item>
+                <el-form-item label="最近fork消耗时间">{{sysInfo.stats.evicted_keys}} μs</el-form-item>
+            </el-form>
+
+            <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
+                <el-form-item label=" ">{{sysInfo.stats.sync_full}}</el-form-item>
+                <el-form-item label="主从部分同步成功次数">{{sysInfo.stats.sync_partial_ok}}</el-form-item>
+                <el-form-item label="主从部分同步失败次数">{{sysInfo.stats.sync_partial_err}}</el-form-item>
+                <el-form-item label="正migrate的Redis个数">{{sysInfo.stats.migrate_cached_sockets}} μs</el-form-item>
+                <el-form-item label="过期的key数量">{{sysInfo.stats.expired_keys}}</el-form-item>
+
+            </el-form>
+
+            <el-form v-if="sysInfo.stats" label-position="right" label-width="160px" class="flex1" style="max-width: 460px">
+                <el-form-item label="当前使用中的频道数量">{{sysInfo.stats.pubsub_channels}}</el-form-item>
+                <el-form-item label="当前使用中的模式数量">{{sysInfo.stats.pubsub_patterns}}</el-form-item>
+                <el-form-item label="不命中次数">{{sysInfo.stats.keyspace_misses}}</el-form-item>
+                <el-form-item label="命中次数">{{sysInfo.stats.keyspace_hits}}</el-form-item>
+            </el-form>
+          </div>
+        </el-card>
+      </el-col>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, getCurrentInstance, defineComponent } from 'vue';
+import * as echarts from 'echarts';
+import 'echarts-wordcloud';
+import dayjs from 'dayjs';
+import getOrigin from '/@/utils/origin'
+let interval: any = null;
+export default defineComponent({
+  name: 'monitor',
+  components: {},
+  setup() {
+    const { proxy } = getCurrentInstance() as any;
+    const state: any = reactive({
+      myCharts: [],
+      sysInfo: {},
+    });
+
+    let myChart1: any;
+    let myChart2: any;
+    let myChart3: any;
+    let myChart4: any;
+    let myChart5: any;
+    let myChart6: any;
+    // const hostData = reactive({
+    //   "bootTime": "2022-11-24T11:12:13+08:00",
+    //   "hostId": "8be74718-1a53-4208-be22-9c126d891ddd",
+    //   "hostname": "iZ2zee04uvnkmhvglw9oghZ",
+    //   "intranet_ip": "172.17.47.62",
+    //   "kernelArch": "x86_64",
+    //   "kernelVersion": "3.10.0-1127.19.1.el7.x86_64",
+    //   "os": "linux",
+    //   "platform": "centos",
+    //   "platformFamily": "rhel",
+    //   "platformVersion": "7.7.1908",
+    //   "procs": 138,
+    //   "public_ip": "101.200.198.249",
+    //   "uptime": 6393278,
+    //   "virtualizationRole": "guest",
+    //   "virtualizationSystem": ""
+    // });
+    // const goInfoData = reactive({
+    //   "goOs": "-", "arch": "-", "goVersion": "-", "goMem": "-", "goName": "-", "goSize": "-", "goVersion": "-", "goroutine": '-', "pwd": "-", "rootPath": "-",
+    //   "runTime": '', "startTime": "-", "intranet_ip": "-"
+    // });
+
+    // 
+    // const stats = reactive({
+    //   "total_connections_received": "-",
+    //   "arch": "-",
+    //   "goVersion": "-",
+    //   "goMem": "-",
+    //   "goName": "-",
+    //   "goSize": "-",
+    //   "goVersion": "-",
+    //   "goroutine": '-',
+    //   "pwd": "-",
+    //   "rootPath": "-",
+    //   "runTime": '',
+    //   "startTime": "-",
+    //   "intranet_ip": "-"
+    // });
+    // 
+
+    // function goInfo(event: { data: any; }) {
+    //   const data = JSON.parse(event.data);
+    //   Object.assign(goInfoData, data);
+    // }
+
+    // function hostInfo(event: { data: any; }) {
+    //   const data = JSON.parse(event.data);
+    //   Object.assign(hostData, data);
+    // }
+
+    const myChart4Data: any = {
+      name: [],
+      value: [],
+    }
+    const myChart5Data: any = {
+      name: [],
+      value: [],
+    }
+    const myChart6Data: any = {
+      name: [],
+      value: [],
+    }
+
+    const moveOption = {
+      tooltip: {
+        trigger: 'axis',
+      },
+      grid: {
+        top: 10,
+        bottom: 20,
+        left: 10,
+        right: 10,
+        containLabel: true
+      },
+      xAxis: {
+        type: 'category',
+        splitLine: {
+          show: false
+        }
+      },
+      yAxis: {
+        type: 'value',
+        boundaryGap: [0, '100%'],
+        splitLine: {
+          show: false
+        }
+      },
+      series: [
+        {
+          name: '使用率',
+          type: 'line',
+          showSymbol: false,
+          data: []
+        }
+      ]
+    };
+
+    function setOptChart1(value: number) {
+      myChart1.setOption({
+        series: [
+          {
+            data: [
+              {
+                value: value,
+                name: '',//cpu
+              },
+            ],
+          },
+        ],
+      });
+    }
+    function setOptChart2(value: number) {
+      myChart2.setOption({
+        series: [
+          {
+            data: [
+              {
+                value: value,
+                name: '',//内存
+              },
+            ],
+          },
+        ],
+      });
+    }
+    function setOptChart3(value: number) {
+      myChart3.setOption({
+        series: [
+          {
+            data: [
+              {
+                value: value,
+                name: '',//磁盘
+              },
+            ],
+          },
+        ],
+      });
+    }
+    function setOptChart(myChart: any, myChartData: any, value: number) {
+      myChartData.name.push(dayjs().format('HH:mm:ss'));
+      myChartData.value.push(value);
+      myChart.setOption({
+        xAxis: {
+          data: myChartData.name
+        },
+        series: [
+          {
+            data: myChartData.value
+          },
+        ],
+      });
+    }
+
+    //CPU
+    const initChartCPU = () => {
+      myChart1 = echarts.init(proxy.$refs.chartsWarningRef1);
+      const option = {
+        tooltip: {
+          formatter: '{a} <br/>{b} : {c}%',
+        },
+        series: [
+          {
+            type: 'gauge',
+            name: 'CPU',
+            radius: '90%', //修改表盘大小
+            title: {
+              show: true, //控制表盘title(今日预计用电量)字体是否显示
+              fontSize: 12, //控制表盘title(今日预计用电量)字体大小
+              'color': 'green',           		//控制表盘title(今日预计用电量)字体颜色
+              offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
+            },
+            axisLine: {
+              show: true,
+              lineStyle: {
+                // 属性lineStyle控制线条样式
+                color: [
+                  [0.3, '#4dabf7'],
+                  [0.6, '#69db7c'],
+                  [0.8, '#ffa94d'],
+                  [1, '#ff6b6b'],
+                ],
+              },
+            },
+            splitNumber: 5, //分割线之间的刻度
+
+            detail: {
+              valueAnimation: true,
+              formatter: '{value}%',
+              textStyle: {
+                fontSize: 20,
+                color: 'red',
+              },
+              offsetCenter: ['0', '80%'], //表盘数据(30%)位置
+            },
+            // data: [
+            // 	{
+            // 		value: 15,
+            // 		name: 'CPU使用率',
+            // 	},
+            // ],
+          },
+        ],
+      };
+      myChart1.setOption(option);
+      state.myCharts.push(myChart1);
+    };
+    //内存
+    const initChartRAM = () => {
+      myChart2 = echarts.init(proxy.$refs.chartsWarningRef2);
+      const option = {
+        tooltip: {
+          formatter: '{a} <br/>{b} : {c}%',
+        },
+        series: [
+          {
+            type: 'gauge',
+            name: '内存',
+            radius: '90%', //修改表盘大小
+            title: {
+              show: true, //控制表盘title(今日预计用电量)字体是否显示
+              fontSize: 12, //控制表盘title(今日预计用电量)字体大小
+              'color': 'green',           		//控制表盘title(今日预计用电量)字体颜色
+              offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
+            },
+            axisLine: {
+              show: true,
+              lineStyle: {
+                // 属性lineStyle控制线条样式
+                color: [
+                  [0.3, '#4dabf7'],
+                  [0.6, '#69db7c'],
+                  [0.8, '#ffa94d'],
+                  [1, '#ff6b6b'],
+                ],
+              },
+            },
+            splitNumber: 5, //分割线之间的刻度
+
+            detail: {
+              valueAnimation: true,
+              formatter: '{value}%',
+              textStyle: {
+                fontSize: 20,
+                color: 'red',
+              },
+              offsetCenter: ['0', '80%'], //表盘数据(30%)位置
+            },
+            // data: [
+            // 	{
+            // 		value: 30,
+            // 		name: '内存使用率',
+            // 	},
+            // ],
+          },
+        ],
+      };
+      myChart2.setOption(option);
+      state.myCharts.push(myChart2);
+    };
+    //磁盘
+    const initChartDISK = () => {
+      myChart3 = echarts.init(proxy.$refs.chartsWarningRef3);
+      const option = {
+        tooltip: {
+          formatter: '{a} <br/>{b} : {c}%',
+        },
+        series: [
+          {
+            type: 'gauge',
+            name: '磁盘',
+            radius: '90%', //修改表盘大小
+            title: {
+              show: true, //控制表盘title(今日预计用电量)字体是否显示
+              fontSize: 12, //控制表盘title(今日预计用电量)字体大小
+              'color': 'green',           		//控制表盘title(今日预计用电量)字体颜色
+              offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
+            },
+            axisLine: {
+              show: true,
+              lineStyle: {
+                // 属性lineStyle控制线条样式
+                color: [
+                  [0.3, '#4dabf7'],
+                  [0.6, '#69db7c'],
+                  [0.8, '#ffa94d'],
+                  [1, '#ff6b6b'],
+                ],
+              },
+            },
+            splitNumber: 5, //分割线之间的刻度
+
+            detail: {
+              valueAnimation: true,
+              formatter: '{value}%',
+              textStyle: {
+                fontSize: 20,
+                color: 'red',
+              },
+              offsetCenter: ['0', '80%'], //表盘数据(30%)位置
+            },
+            // data: [
+            // 	{
+            // 		value: 30,
+            // 		name: '内存使用率',
+            // 	},
+            // ],
+          },
+        ],
+      };
+      myChart3.setOption(option);
+      state.myCharts.push(myChart3);
+    };
+
+    //cpu运行状态
+    // const initChartCPURun = () => {
+    //   myChart4 = echarts.init(proxy.$refs.chartsWarningRef4);
+    //   myChart4.setOption({ ...moveOption });
+    //   state.myCharts.push(myChart4);
+    // };
+
+    // //内存运行状态
+    // const initChartRAMRun = () => {
+    //   myChart5 = echarts.init(proxy.$refs.chartsWarningRef5);
+    //   myChart5.setOption({ ...moveOption });
+    //   state.myCharts.push(myChart5);
+    // };
+
+    // //磁盘运行状态
+    // const initChartDISKRun = () => {
+    //   myChart6 = echarts.init(proxy.$refs.chartsWarningRef6);
+    //   myChart6.setOption({ ...moveOption });
+    //   state.myCharts.push(myChart6);
+    // };
+
+    // 页面加载时
+    // onMounted(() => {
+    //   initChartCPU();
+    //   initChartRAM();
+    //   initChartDISK();
+    //   initChartCPURun();
+    //   initChartRAMRun();
+    //   initChartDISKRun();
+    // });
+
+    function startWs() {
+      // ws = null;
+      // ws = new WebSocket(import.meta.env.VITE_WS_URL + '/monitorServer/ws');
+      // ws.onopen = () => {};
+      // ws.onmessage = ({ data: dataStr }) => {
+      // 	const data = JSON.parse(dataStr);
+      // 	state.sysInfo = data;
+      // 	setOptChart1(data.cpuUsed);
+      // 	setOptChart2(data.memUsage);
+      //   setOptChart3(data.diskUsedPercent);
+      // };
+
+      const es = new EventSource(getOrigin(import.meta.env.VITE_SERVER_URL + "/subscribe/redisinfo"));
+
+      es.addEventListener("stats", statsInfoMsg);
+      es.addEventListener("clients", clientsInfoMsg);
+      es.addEventListener("cpu", cpuInfoMsg);
+      es.addEventListener("server", serverInfoMsg);
+      es.addEventListener("memory", memoryInfoMsg);
+      es.addEventListener("keyspace", keyspaceInfoMsg);
+    }
+
+    startWs();
+
+    function keyspaceInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.keyspace = data
+    }
+
+    function memoryInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.memory = data
+    }
+
+    function serverInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.server = data
+    }
+
+    function cpuInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.cpu = data
+    }
+    
+
+    function statsInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.stats = data
+    }
+
+    function clientsInfoMsg(event: { data: any; }) {
+        const data = JSON.parse(event.data);
+        state.sysInfo.clients = data
+    }
+
+    return {
+      ...toRefs(state),
+    //   goInfoData,
+    //   hostData,
+    //   setOptChart1,
+    //   setOptChart2,
+    //   setOptChart3,
+
+      // ws,
+    };
+  },
+  unmounted() {
+    if (interval) {
+      clearInterval(interval);
+      interval = null;
+    }
+  },
+  data() {
+    return {};
+  },
+  methods: {
+    memorySizeFormat(size: any) {
+      size = parseFloat(size);
+      let rank = 0;
+      let rankchar = 'Bytes';
+      while (size > 1024 && rankchar != 'TB') {
+        size = size / 1024;
+        rank++;
+        if (rank == 1) {
+          rankchar = 'KB';
+        } else if (rank == 2) {
+          rankchar = 'MB';
+        } else if (rank == 3) {
+          rankchar = 'GB';
+        } else if (rank == 4) {
+          rankchar = 'TB';
+        }
+      }
+      return size.toFixed(2) + ' ' + rankchar;
+    },
+    timeFormat(second: any) {
+      if (!second) return '-'
+      second = parseFloat(second);
+      let rank = 0;
+      let rankchar = '秒';
+      while ((second > 60 && rankchar != '小时' && rankchar != '天') || (second > 24 && rankchar == '小时')) {
+        if (rankchar == '小时') {
+          second = second / 24;
+        } else {
+          second = second / 60;
+        }
+        rank++;
+        if (rank == 1) {
+          rankchar = '分';
+        } else if (rank == 2) {
+          rankchar = '小时';
+        } else if (rank == 3) {
+          rankchar = '天';
+        }
+      }
+      return second.toFixed(2) + ' ' + rankchar;
+    },
+  },
+});
+
+</script>
+
+<style scoped lang="scss">
+.el-card {
+	height: 300px;
+	overflow-y: auto;
+}
+
+.marg-b-15 {
+	margin-bottom: 15px;
+}
+
+.cell {
+	box-sizing: border-box;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: normal;
+	word-break: break-all;
+	line-height: 36px;
+	padding-left: 10px;
+	padding-right: 10px;
+}
+
+.cell-card {
+	box-sizing: border-box;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: normal;
+	word-break: break-all;
+	line-height: 36px;
+}
+
+.box-card {
+	min-height: 380px;
+}
+
+.box-card-meter {
+	height: 230px;
+
+	min-height: 180px;
+}
+</style>

+ 1 - 0
src/views/system/monitor/server/index.vue

@@ -601,6 +601,7 @@ export default defineComponent({
 
     function displayHost(event: { data: any; }) {
       const data = JSON.parse(event.data);
+      console.log(data)
       state.sysInfo.os = data.os
       state.sysInfo.kernelArch = data.kernelArch
       state.sysInfo.sysComputerName = data.hostname