Bläddra i källkod

增加服务监控功能

xusl 2 år sedan
förälder
incheckning
68efacb87f

+ 27 - 0
backend/src/main/java/com/jiayue/ssi/controller/ServerController.java

@@ -0,0 +1,27 @@
+package com.jiayue.ssi.controller;
+
+import com.jiayue.ssi.annotation.InterfaceLimit;
+import com.jiayue.ssi.entity.Server;
+import com.jiayue.ssi.util.ResponseVO;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 服务器监控
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/server")
+public class ServerController {
+    // @PreAuthorize("@ss.hasPermi('monitor:server:list')")
+    @GetMapping()
+    @InterfaceLimit
+    public ResponseVO getInfo() throws Exception {
+        Server server = new Server();
+        server.copyTo();
+        return ResponseVO.success(server);
+    }
+}

+ 2 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysMenuController.java

@@ -33,6 +33,7 @@ public class SysMenuController {
      */
     // @PreAuthorize("@ss.hasPermi('system:menu:list')")
     @GetMapping("/list")
+    @InterfaceLimit
     public ResponseVO list(SysMenu menu) {
         try {
             List<SysMenu> menus = sysMenuService.selectMenuList(menu, SecurityContextUtil.getSysUser().getId());
@@ -109,6 +110,7 @@ public class SysMenuController {
      * @return 执行结果
      */
     @PutMapping
+    @InterfaceLimit
     public ResponseVO update(@RequestBody SysMenu menu) {
         if (menu.getMenuId() == null) {
             return ResponseVO.fail("主键为空不能修改!");

+ 238 - 0
backend/src/main/java/com/jiayue/ssi/entity/Server.java

@@ -0,0 +1,238 @@
+package com.jiayue.ssi.entity;
+
+import java.net.UnknownHostException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import com.ruoyi.common.utils.Arith;
+import com.ruoyi.common.utils.ip.IpUtils;
+import com.ruoyi.framework.web.domain.server.*;
+
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.hardware.CentralProcessor.TickType;
+import oshi.software.os.FileSystem;
+import oshi.software.os.OSFileStore;
+import oshi.software.os.OperatingSystem;
+import oshi.util.Util;
+
+/**
+ * 服务器相关信息
+ *
+ * @author ruoyi
+ */
+public class Server
+{
+    private static final int OSHI_WAIT_SECOND = 1000;
+
+    /**
+     * CPU相关信息
+     */
+    private Cpu cpu = new Cpu();
+
+    /**
+     * 內存相关信息
+     */
+    private Mem mem = new Mem();
+
+    /**
+     * JVM相关信息
+     */
+    private Jvm jvm = new Jvm();
+
+    /**
+     * 服务器相关信息
+     */
+    private Sys sys = new Sys();
+
+    /**
+     * 磁盘相关信息
+     */
+    private List<SysFile> sysFiles = new LinkedList<SysFile>();
+
+    public Cpu getCpu()
+    {
+        return cpu;
+    }
+
+    public void setCpu(Cpu cpu)
+    {
+        this.cpu = cpu;
+    }
+
+    public Mem getMem()
+    {
+        return mem;
+    }
+
+    public void setMem(Mem mem)
+    {
+        this.mem = mem;
+    }
+
+    public Jvm getJvm()
+    {
+        return jvm;
+    }
+
+    public void setJvm(Jvm jvm)
+    {
+        this.jvm = jvm;
+    }
+
+    public Sys getSys()
+    {
+        return sys;
+    }
+
+    public void setSys(Sys sys)
+    {
+        this.sys = sys;
+    }
+
+    public List<SysFile> getSysFiles()
+    {
+        return sysFiles;
+    }
+
+    public void setSysFiles(List<SysFile> sysFiles)
+    {
+        this.sysFiles = sysFiles;
+    }
+
+    public void copyTo() throws Exception
+    {
+        SystemInfo si = new SystemInfo();
+        HardwareAbstractionLayer hal = si.getHardware();
+
+        setCpuInfo(hal.getProcessor());
+
+        setMemInfo(hal.getMemory());
+
+        setSysInfo();
+
+        setJvmInfo();
+
+        setSysFiles(si.getOperatingSystem());
+    }
+
+    /**
+     * 设置CPU信息
+     */
+    private void setCpuInfo(CentralProcessor processor)
+    {
+        // CPU信息
+        long[] prevTicks = processor.getSystemCpuLoadTicks();
+        Util.sleep(OSHI_WAIT_SECOND);
+        long[] ticks = processor.getSystemCpuLoadTicks();
+        long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];
+        long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];
+        long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];
+        long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];
+        long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];
+        long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];
+        long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];
+        long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];
+        long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
+        cpu.setCpuNum(processor.getLogicalProcessorCount());
+        cpu.setTotal(totalCpu);
+        cpu.setSys(cSys);
+        cpu.setUsed(user);
+        cpu.setWait(iowait);
+        cpu.setFree(idle);
+    }
+
+    /**
+     * 设置内存信息
+     */
+    private void setMemInfo(GlobalMemory memory)
+    {
+        mem.setTotal(memory.getTotal());
+        mem.setUsed(memory.getTotal() - memory.getAvailable());
+        mem.setFree(memory.getAvailable());
+    }
+
+    /**
+     * 设置服务器信息
+     */
+    private void setSysInfo()
+    {
+        Properties props = System.getProperties();
+        sys.setComputerName(IpUtils.getHostName());
+        sys.setComputerIp(IpUtils.getHostIp());
+        sys.setOsName(props.getProperty("os.name"));
+        sys.setOsArch(props.getProperty("os.arch"));
+        sys.setUserDir(props.getProperty("user.dir"));
+    }
+
+    /**
+     * 设置Java虚拟机
+     */
+    private void setJvmInfo() throws UnknownHostException
+    {
+        Properties props = System.getProperties();
+        jvm.setTotal(Runtime.getRuntime().totalMemory());
+        jvm.setMax(Runtime.getRuntime().maxMemory());
+        jvm.setFree(Runtime.getRuntime().freeMemory());
+        jvm.setVersion(props.getProperty("java.version"));
+        jvm.setHome(props.getProperty("java.home"));
+    }
+
+    /**
+     * 设置磁盘信息
+     */
+    private void setSysFiles(OperatingSystem os)
+    {
+        FileSystem fileSystem = os.getFileSystem();
+        List<OSFileStore> fsArray = fileSystem.getFileStores();
+        for (OSFileStore fs : fsArray)
+        {
+            long free = fs.getUsableSpace();
+            long total = fs.getTotalSpace();
+            long used = total - free;
+            SysFile sysFile = new SysFile();
+            sysFile.setDirName(fs.getMount());
+            sysFile.setSysTypeName(fs.getType());
+            sysFile.setTypeName(fs.getName());
+            sysFile.setTotal(convertFileSize(total));
+            sysFile.setFree(convertFileSize(free));
+            sysFile.setUsed(convertFileSize(used));
+            sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));
+            sysFiles.add(sysFile);
+        }
+    }
+
+    /**
+     * 字节转换
+     *
+     * @param size 字节大小
+     * @return 转换后值
+     */
+    public String convertFileSize(long size)
+    {
+        long kb = 1024;
+        long mb = kb * 1024;
+        long gb = mb * 1024;
+        if (size >= gb)
+        {
+            return String.format("%.1f GB", (float) size / gb);
+        }
+        else if (size >= mb)
+        {
+            float f = (float) size / mb;
+            return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
+        }
+        else if (size >= kb)
+        {
+            float f = (float) size / kb;
+            return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
+        }
+        else
+        {
+            return String.format("%d B", size);
+        }
+    }
+}

+ 101 - 0
backend/src/main/java/com/jiayue/ssi/entity/server/Cpu.java

@@ -0,0 +1,101 @@
+package com.jiayue.ssi.entity.server;
+
+import com.ruoyi.common.utils.Arith;
+
+/**
+ * CPU相关信息
+ *
+ * @author ruoyi
+ */
+public class Cpu
+{
+    /**
+     * 核心数
+     */
+    private int cpuNum;
+
+    /**
+     * CPU总的使用率
+     */
+    private double total;
+
+    /**
+     * CPU系统使用率
+     */
+    private double sys;
+
+    /**
+     * CPU用户使用率
+     */
+    private double used;
+
+    /**
+     * CPU当前等待率
+     */
+    private double wait;
+
+    /**
+     * CPU当前空闲率
+     */
+    private double free;
+
+    public int getCpuNum()
+    {
+        return cpuNum;
+    }
+
+    public void setCpuNum(int cpuNum)
+    {
+        this.cpuNum = cpuNum;
+    }
+
+    public double getTotal()
+    {
+        return Arith.round(Arith.mul(total, 100), 2);
+    }
+
+    public void setTotal(double total)
+    {
+        this.total = total;
+    }
+
+    public double getSys()
+    {
+        return Arith.round(Arith.mul(sys / total, 100), 2);
+    }
+
+    public void setSys(double sys)
+    {
+        this.sys = sys;
+    }
+
+    public double getUsed()
+    {
+        return Arith.round(Arith.mul(used / total, 100), 2);
+    }
+
+    public void setUsed(double used)
+    {
+        this.used = used;
+    }
+
+    public double getWait()
+    {
+        return Arith.round(Arith.mul(wait / total, 100), 2);
+    }
+
+    public void setWait(double wait)
+    {
+        this.wait = wait;
+    }
+
+    public double getFree()
+    {
+        return Arith.round(Arith.mul(free / total, 100), 2);
+    }
+
+    public void setFree(double free)
+    {
+        this.free = free;
+    }
+}

+ 131 - 0
backend/src/main/java/com/jiayue/ssi/entity/server/Jvm.java

@@ -0,0 +1,131 @@
+package com.jiayue.ssi.entity.server;
+
+import java.lang.management.ManagementFactory;
+
+import com.ruoyi.common.utils.Arith;
+import com.ruoyi.common.utils.DateUtils;
+
+/**
+ * JVM相关信息
+ *
+ * @author ruoyi
+ */
+public class Jvm
+{
+    /**
+     * 当前JVM占用的内存总数(M)
+     */
+    private double total;
+
+    /**
+     * JVM最大可用内存总数(M)
+     */
+    private double max;
+
+    /**
+     * JVM空闲内存(M)
+     */
+    private double free;
+
+    /**
+     * JDK版本
+     */
+    private String version;
+
+    /**
+     * JDK路径
+     */
+    private String home;
+
+    public double getTotal()
+    {
+        return Arith.div(total, (1024 * 1024), 2);
+    }
+
+    public void setTotal(double total)
+    {
+        this.total = total;
+    }
+
+    public double getMax()
+    {
+        return Arith.div(max, (1024 * 1024), 2);
+    }
+
+    public void setMax(double max)
+    {
+        this.max = max;
+    }
+
+    public double getFree()
+    {
+        return Arith.div(free, (1024 * 1024), 2);
+    }
+
+    public void setFree(double free)
+    {
+        this.free = free;
+    }
+
+    public double getUsed()
+    {
+        return Arith.div(total - free, (1024 * 1024), 2);
+    }
+
+    public double getUsage()
+    {
+        return Arith.mul(Arith.div(total - free, total, 4), 100);
+    }
+
+    /**
+     * 获取JDK名称
+     */
+    public String getName()
+    {
+        return ManagementFactory.getRuntimeMXBean().getVmName();
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getHome()
+    {
+        return home;
+    }
+
+    public void setHome(String home)
+    {
+        this.home = home;
+    }
+
+    /**
+     * JDK启动时间
+     */
+    public String getStartTime()
+    {
+        return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate());
+    }
+
+    /**
+     * JDK运行时间
+     */
+    public String getRunTime()
+    {
+        return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
+    }
+
+    /**
+     * 运行参数
+     */
+    public String getInputArgs()
+    {
+        return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
+    }
+}

+ 61 - 0
backend/src/main/java/com/jiayue/ssi/entity/server/Mem.java

@@ -0,0 +1,61 @@
+package com.jiayue.ssi.entity.server;
+
+import com.ruoyi.common.utils.Arith;
+
+/**
+ * 內存相关信息
+ *
+ * @author ruoyi
+ */
+public class Mem
+{
+    /**
+     * 内存总量
+     */
+    private double total;
+
+    /**
+     * 已用内存
+     */
+    private double used;
+
+    /**
+     * 剩余内存
+     */
+    private double free;
+
+    public double getTotal()
+    {
+        return Arith.div(total, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setTotal(long total)
+    {
+        this.total = total;
+    }
+
+    public double getUsed()
+    {
+        return Arith.div(used, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setUsed(long used)
+    {
+        this.used = used;
+    }
+
+    public double getFree()
+    {
+        return Arith.div(free, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setFree(long free)
+    {
+        this.free = free;
+    }
+
+    public double getUsage()
+    {
+        return Arith.mul(Arith.div(used, total, 4), 100);
+    }
+}

+ 84 - 0
backend/src/main/java/com/jiayue/ssi/entity/server/Sys.java

@@ -0,0 +1,84 @@
+package com.jiayue.ssi.entity.server;
+
+/**
+ * 系统相关信息
+ *
+ * @author ruoyi
+ */
+public class Sys
+{
+    /**
+     * 服务器名称
+     */
+    private String computerName;
+
+    /**
+     * 服务器Ip
+     */
+    private String computerIp;
+
+    /**
+     * 项目路径
+     */
+    private String userDir;
+
+    /**
+     * 操作系统
+     */
+    private String osName;
+
+    /**
+     * 系统架构
+     */
+    private String osArch;
+
+    public String getComputerName()
+    {
+        return computerName;
+    }
+
+    public void setComputerName(String computerName)
+    {
+        this.computerName = computerName;
+    }
+
+    public String getComputerIp()
+    {
+        return computerIp;
+    }
+
+    public void setComputerIp(String computerIp)
+    {
+        this.computerIp = computerIp;
+    }
+
+    public String getUserDir()
+    {
+        return userDir;
+    }
+
+    public void setUserDir(String userDir)
+    {
+        this.userDir = userDir;
+    }
+
+    public String getOsName()
+    {
+        return osName;
+    }
+
+    public void setOsName(String osName)
+    {
+        this.osName = osName;
+    }
+
+    public String getOsArch()
+    {
+        return osArch;
+    }
+
+    public void setOsArch(String osArch)
+    {
+        this.osArch = osArch;
+    }
+}

+ 114 - 0
backend/src/main/java/com/jiayue/ssi/entity/server/SysFile.java

@@ -0,0 +1,114 @@
+package com.jiayue.ssi.entity.server;
+
+/**
+ * 系统文件相关信息
+ *
+ * @author ruoyi
+ */
+public class SysFile
+{
+    /**
+     * 盘符路径
+     */
+    private String dirName;
+
+    /**
+     * 盘符类型
+     */
+    private String sysTypeName;
+
+    /**
+     * 文件类型
+     */
+    private String typeName;
+
+    /**
+     * 总大小
+     */
+    private String total;
+
+    /**
+     * 剩余大小
+     */
+    private String free;
+
+    /**
+     * 已经使用量
+     */
+    private String used;
+
+    /**
+     * 资源的使用率
+     */
+    private double usage;
+
+    public String getDirName()
+    {
+        return dirName;
+    }
+
+    public void setDirName(String dirName)
+    {
+        this.dirName = dirName;
+    }
+
+    public String getSysTypeName()
+    {
+        return sysTypeName;
+    }
+
+    public void setSysTypeName(String sysTypeName)
+    {
+        this.sysTypeName = sysTypeName;
+    }
+
+    public String getTypeName()
+    {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName)
+    {
+        this.typeName = typeName;
+    }
+
+    public String getTotal()
+    {
+        return total;
+    }
+
+    public void setTotal(String total)
+    {
+        this.total = total;
+    }
+
+    public String getFree()
+    {
+        return free;
+    }
+
+    public void setFree(String free)
+    {
+        this.free = free;
+    }
+
+    public String getUsed()
+    {
+        return used;
+    }
+
+    public void setUsed(String used)
+    {
+        this.used = used;
+    }
+
+    public double getUsage()
+    {
+        return usage;
+    }
+
+    public void setUsage(double usage)
+    {
+        this.usage = usage;
+    }
+}

+ 333 - 0
ui/src/views/monitor/server/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-row>
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <div slot="header"><span><i class="el-icon-cpu"></i> CPU</span></div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+              <tr>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">属性</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">值</div>
+                </th>
+              </tr>
+              </thead>
+              <tbody>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">核心数</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.cpu">{{ server.cpu.cpuNum }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">用户使用率</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.cpu">{{ server.cpu.used }}%</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">系统使用率</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.cpu">{{ server.cpu.sys }}%</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">当前空闲率</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.cpu">{{ server.cpu.free }}%</div>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <div slot="header"><span><i class="el-icon-tickets"></i> 内存</span></div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+              <tr>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">属性</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">内存</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">JVM</div>
+                </th>
+              </tr>
+              </thead>
+              <tbody>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">总内存</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.mem">{{ server.mem.total }}G</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.total }}M</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">已用内存</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.mem">{{ server.mem.used }}G</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.used }}M</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">剩余内存</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.mem">{{ server.mem.free }}G</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.free }}M</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">使用率</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.mem" :class="{'text-danger': server.mem.usage > 80}">
+                    {{ server.mem.usage }}%
+                  </div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm" :class="{'text-danger': server.jvm.usage > 80}">
+                    {{ server.jvm.usage }}%
+                  </div>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span><i class="el-icon-monitor"></i> 服务器信息</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <tbody>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">服务器名称</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.sys">{{ server.sys.computerName }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">操作系统</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.sys">{{ server.sys.osName }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">服务器IP</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.sys">{{ server.sys.computerIp }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">系统架构</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.sys">{{ server.sys.osArch }}</div>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span><i class="el-icon-coffee-cup"></i> Java虚拟机信息</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;table-layout:fixed;">
+              <tbody>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">Java名称</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.name }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">Java版本</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.version }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">启动时间</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.startTime }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">运行时长</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.runTime }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td colspan="1" class="el-table__cell is-leaf">
+                  <div class="cell">安装路径</div>
+                </td>
+                <td colspan="3" class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.home }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td colspan="1" class="el-table__cell is-leaf">
+                  <div class="cell">项目路径</div>
+                </td>
+                <td colspan="3" class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div>
+                </td>
+              </tr>
+              <tr>
+                <td colspan="1" class="el-table__cell is-leaf">
+                  <div class="cell">运行参数</div>
+                </td>
+                <td colspan="3" class="el-table__cell is-leaf">
+                  <div class="cell" v-if="server.jvm">{{ server.jvm.inputArgs }}</div>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span><i class="el-icon-receiving"></i> 磁盘状态</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+              <tr>
+                <th class="el-table__cell el-table__cell is-leaf">
+                  <div class="cell">盘符路径</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">文件系统</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">盘符类型</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">总大小</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">可用大小</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">已用大小</div>
+                </th>
+                <th class="el-table__cell is-leaf">
+                  <div class="cell">已用百分比</div>
+                </th>
+              </tr>
+              </thead>
+              <tbody v-if="server.sysFiles">
+              <tr v-for="(sysFile, index) in server.sysFiles" :key="index">
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.dirName }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.sysTypeName }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.typeName }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.total }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.free }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell">{{ sysFile.used }}</div>
+                </td>
+                <td class="el-table__cell is-leaf">
+                  <div class="cell" :class="{'text-danger': sysFile.usage > 80}">{{ sysFile.usage }}%</div>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {getServer} from "@/api/monitor/server";
+
+export default {
+  name: "Server",
+  data() {
+    return {
+      // 服务器信息
+      server: []
+    };
+  },
+  created() {
+    this.getList();
+    this.openLoading();
+  },
+  methods: {
+    /** 查询服务器信息 */
+    getList() {
+      this.$axios.get('/monitor/server').then((res) => {
+        this.server = response.data;
+        this.$modal.closeLoading();
+      })
+    },
+    // 打开加载层
+    openLoading() {
+      this.$modal.loading("正在加载服务监控数据,请稍候!");
+    }
+  }
+};
+</script>