优化运维中心样式

pull/1682/head
648540858 2024-11-04 15:46:03 +08:00
parent 7a39f8a439
commit c9e2ad1b45
5 changed files with 167 additions and 99 deletions

View File

@ -3,8 +3,9 @@ package com.genersoft.iot.vmp.vmanager.bean;
import com.genersoft.iot.vmp.common.VersionPo; import com.genersoft.iot.vmp.common.VersionPo;
import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.VersionInfo; import lombok.Data;
@Data
public class SystemConfigInfo { public class SystemConfigInfo {
private int serverPort; private int serverPort;
@ -12,36 +13,5 @@ public class SystemConfigInfo {
private UserSetting addOn; private UserSetting addOn;
private VersionPo version; private VersionPo version;
public int getServerPort() {
return serverPort;
}
public void setServerPort(int serverPort) {
this.serverPort = serverPort;
}
public SipConfig getSip() {
return sip;
}
public void setSip(SipConfig sip) {
this.sip = sip;
}
public UserSetting getAddOn() {
return addOn;
}
public void setAddOn(UserSetting addOn) {
this.addOn = addOn;
}
public VersionPo getVersion() {
return version;
}
public void setVersion(VersionPo version) {
this.version = version;
}
} }

View File

@ -11,8 +11,8 @@ import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.conf.security.JwtUtils; import com.genersoft.iot.vmp.conf.security.JwtUtils;
import com.genersoft.iot.vmp.gb28181.service.IDeviceChannelService; import com.genersoft.iot.vmp.gb28181.service.IDeviceChannelService;
import com.genersoft.iot.vmp.gb28181.service.IDeviceService; import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
import com.genersoft.iot.vmp.service.bean.MediaServerLoad; import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.streamProxy.service.IStreamProxyService; import com.genersoft.iot.vmp.streamProxy.service.IStreamProxyService;
@ -25,13 +25,24 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.hardware.NetworkIF;
import oshi.software.os.OperatingSystem;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@Tag(name = "服务控制") @Tag(name = "服务控制")
@ -75,7 +86,6 @@ public class ServerController {
private IRedisCatchStorage redisCatchStorage; private IRedisCatchStorage redisCatchStorage;
@GetMapping(value = "/media_server/list") @GetMapping(value = "/media_server/list")
@ResponseBody @ResponseBody
@Operation(summary = "流媒体服务列表", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Operation(summary = "流媒体服务列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
@ -140,7 +150,7 @@ public class ServerController {
@ResponseBody @ResponseBody
public void deleteMediaServer(@RequestParam String id) { public void deleteMediaServer(@RequestParam String id) {
MediaServer mediaServer = mediaServerService.getOne(id); MediaServer mediaServer = mediaServerService.getOne(id);
if(mediaServer == null) { if (mediaServer == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "流媒体不存在"); throw new ControllerException(ErrorCode.ERROR100.getCode(), "流媒体不存在");
} }
mediaServerService.delete(mediaServer); mediaServerService.delete(mediaServer);
@ -170,9 +180,11 @@ public class ServerController {
// throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); // throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());
// } // }
// }); // });
}; }
@Operation(summary = "获取系统信息信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) ;
@Operation(summary = "获取系统配置信息", security = @SecurityRequirement(name = JwtUtils.HEADER))
@GetMapping(value = "/system/configInfo") @GetMapping(value = "/system/configInfo")
@ResponseBody @ResponseBody
public SystemConfigInfo getConfigInfo() { public SystemConfigInfo getConfigInfo() {
@ -234,7 +246,7 @@ public class ServerController {
List<MediaServer> allOnline = mediaServerService.getAllOnline(); List<MediaServer> allOnline = mediaServerService.getAllOnline();
if (allOnline.isEmpty()) { if (allOnline.isEmpty()) {
return result; return result;
}else { } else {
for (MediaServer mediaServerItem : allOnline) { for (MediaServer mediaServerItem : allOnline) {
result.add(mediaServerService.getLoad(mediaServerItem)); result.add(mediaServerService.getLoad(mediaServerItem));
} }
@ -258,4 +270,80 @@ public class ServerController {
return result; return result;
} }
@GetMapping(value = "/info")
@ResponseBody
@Operation(summary = "获取系统信息")
public Map<String, Map<String, String>> getInfo() {
Map<String, Map<String, String>> result = new LinkedHashMap<>();
Map<String, String> hardwareMap = new LinkedHashMap<>();
result.put("硬件信息", hardwareMap);
SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardware = systemInfo.getHardware();
// 获取CPU信息
CentralProcessor.ProcessorIdentifier processorIdentifier = hardware.getProcessor().getProcessorIdentifier();
hardwareMap.put("CPU", processorIdentifier.getName());
// 获取内存
GlobalMemory memory = hardware.getMemory();
hardwareMap.put("内存", formatByte(memory.getTotal() - memory.getAvailable()) + "/" + formatByte(memory.getTotal()));
hardwareMap.put("制造商", systemInfo.getHardware().getComputerSystem().getManufacturer());
hardwareMap.put("产品名称", systemInfo.getHardware().getComputerSystem().getModel());
// 网卡
List<NetworkIF> networkIFs = hardware.getNetworkIFs();
StringBuilder ips = new StringBuilder();
for (int i = 0; i < networkIFs.size(); i++) {
NetworkIF networkIF = networkIFs.get(i);
String ipsStr = StringUtils.join(networkIF.getIPv4addr());
if (ObjectUtils.isEmpty(ipsStr)) {
continue;
}
ips.append(ipsStr);
if (i < networkIFs.size() - 1) {
ips.append(",");
}
}
hardwareMap.put("网卡", ips.toString());
Map<String, String> operatingSystemMap = new LinkedHashMap<>();
result.put("操作系统", operatingSystemMap);
OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
operatingSystemMap.put("名称", operatingSystem.getFamily() + " " + operatingSystem.getVersionInfo().getVersion());
operatingSystemMap.put("类型", operatingSystem.getManufacturer());
Map<String, String> platformMap = new LinkedHashMap<>();
result.put("平台信息", platformMap);
VersionPo version = versionInfo.getVersion();
platformMap.put("版本", version.getVersion());
platformMap.put("构建日期", version.getBUILD_DATE());
platformMap.put("GIT分支", version.getGIT_BRANCH());
platformMap.put("GIT地址", version.getGIT_URL());
platformMap.put("GIT日期", version.getGIT_DATE());
platformMap.put("GIT版本", version.getGIT_Revision_SHORT());
platformMap.put("DOCKER环境", new File("/.dockerenv").exists()?"是":"否");
return result;
}
/**
*
*/
private static String formatByte(long byteNumber) {
//换算单位
double FORMAT = 1024.0;
double kbNumber = byteNumber / FORMAT;
if (kbNumber < FORMAT) {
return new DecimalFormat("#.##KB").format(kbNumber);
}
double mbNumber = kbNumber / FORMAT;
if (mbNumber < FORMAT) {
return new DecimalFormat("#.##MB").format(mbNumber);
}
double gbNumber = mbNumber / FORMAT;
if (gbNumber < FORMAT) {
return new DecimalFormat("#.##GB").format(gbNumber);
}
double tbNumber = gbNumber / FORMAT;
return new DecimalFormat("#.##TB").format(tbNumber);
}
} }

View File

@ -1,26 +1,26 @@
<template> <template>
<div id="operations" style="width: 100%; height: 100%"> <div id="operations" >
<el-container > <el-container class="container-box">
<el-aside width="200px" style="text-align: left"> <el-aside width="200px" style="text-align: left" >
<el-menu :default-active="activeIndex" :height="winHeight" @select="handleSelect"> <el-menu :default-active="activeIndex" :height="winHeight" @select="handleSelect">
<el-menu-item index="systemInfo"> <el-menu-item index="systemInfo">
<template slot="title"><i class="el-icon-message"></i>平台信息</template> <template slot="title"><i class="el-icon-s-home"></i>平台信息</template>
</el-menu-item> </el-menu-item>
<el-submenu index="log"> <el-submenu index="log">
<template slot="title"><i class="el-icon-message"></i>日志信息</template> <template slot="title"><i class="el-icon-document"></i>日志信息</template>
<el-menu-item index="historyLog">历史日志</el-menu-item> <el-menu-item index="historyLog">历史日志</el-menu-item>
<el-menu-item index="realTimeLog">实时日志</el-menu-item> <el-menu-item index="realTimeLog">实时日志</el-menu-item>
</el-submenu> </el-submenu>
<el-submenu index="senior"> <el-submenu index="senior">
<template slot="title"><i class="el-icon-setting"></i>高级维护</template> <template slot="title"><i class="el-icon-setting"></i>高级维护</template>
<el-menu-item disabled="disabled" index="tcpdump">网络抓包</el-menu-item> <el-menu-item index="tcpdump">网络抓包</el-menu-item>
<el-menu-item disabled="disabled" index="networkCard">网卡信息</el-menu-item>
</el-submenu> </el-submenu>
</el-menu> </el-menu>
</el-aside> </el-aside>
<el-main style="background-color: #FFFFFF; margin: 20px"> <el-main style="background-color: #FFFFFF; margin: 0 20px 20px 20px">
<operationsForRealLog v-if="activeIndex==='realTimeLog'"></operationsForRealLog> <operationsForRealLog v-if="activeIndex==='realTimeLog'"></operationsForRealLog>
<operationsForHistoryLog v-if="activeIndex==='historyLog'"></operationsForHistoryLog> <operationsForHistoryLog v-if="activeIndex==='historyLog'"></operationsForHistoryLog>
<operationsForSystemInfo v-if="activeIndex==='systemInfo'"></operationsForSystemInfo>
</el-main> </el-main>
</el-container> </el-container>
</div> </div>
@ -30,12 +30,13 @@
import operationsForRealLog from './operationsForRealLog' import operationsForRealLog from './operationsForRealLog'
import operationsForHistoryLog from './operationsForHistoryLog.vue' import operationsForHistoryLog from './operationsForHistoryLog.vue'
import operationsForSystemInfo from './operationsForSystemInfo.vue'
export default { export default {
name: 'log', name: 'log',
components: { components: {
operationsForRealLog, operationsForHistoryLog operationsForRealLog, operationsForHistoryLog, operationsForSystemInfo
}, },
data() { data() {
return { return {
@ -43,7 +44,7 @@ export default {
winHeight: (window.innerHeight - 170) + "px", winHeight: (window.innerHeight - 170) + "px",
data: [], data: [],
filter: "", filter: "",
activeIndex: "historyLog" activeIndex: "systemInfo"
}; };
}, },
@ -61,55 +62,10 @@ export default {
</script> </script>
<style> <style>
.videoList { .container-box {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
}
.video-item {
position: relative;
width: 15rem;
height: 10rem;
margin-right: 1rem;
background-color: #000000;
}
.video-item-img {
position: absolute; position: absolute;
top: 0; top: 80px;
bottom: 0; width: calc(100% - 20px);
left: 0; height: calc(100% - 80px);
right: 0;
margin: auto;
width: 100%;
height: 100%;
}
.video-item-img:after {
content: "";
display: inline-block;
position: absolute;
z-index: 2;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
width: 3rem;
height: 3rem;
background-image: url("../assets/loading.png");
background-size: cover;
background-color: #000000;
}
.video-item-title {
position: absolute;
bottom: 0;
color: #000000;
background-color: #ffffff;
line-height: 1.5rem;
padding: 0.3rem;
width: 14.4rem;
} }
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div id="app" style="width: 100%"> <div id="app" style="width: 100%; background-color: #FFFFFF">
<div class="page-header"> <div class="page-header">
<div class="page-title"> <div class="page-title">
<div>历史日志</div> <div>历史日志</div>
@ -109,7 +109,7 @@ export default {
chooseRecord: null, // chooseRecord: null, //
updateLooper: 0, // updateLooper: 0, //
winHeight: window.innerHeight - 250, winHeight: window.innerHeight - 180,
loading: false, loading: false,
mediaServerObj: new MediaServer(), mediaServerObj: new MediaServer(),

View File

@ -0,0 +1,54 @@
<template>
<div id="operationsForSystemInfo" style="margin: 40px">
<el-descriptions v-for="(value, key) in systemInfoList" :key="key" :column="2" :loading="loading">
<template slot="title">
<span>{{key}}</span>
</template>
<el-descriptions-item v-for="(childValue, childKey) in value" :key="childKey" >
<template slot="label">
<span>{{childKey}}</span>
</template>
{{ childValue }}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<script>
export default {
name: 'operationsForSystemInfo',
data() {
return {
loading: false,
winHeight: window.innerHeight - 220,
systemInfoList: {
"测试": {
"qwqew": "1111"
}
},
};
},
created() {
this.initData()
},
methods: {
initData: function () {
this.loading = true;
this.$axios({
method: 'get',
url: `/api/server/info`,
}).then((res) => {
console.log(res)
if (res.data.code === 0) {
this.systemInfoList = res.data.data;
}
this.loading = false;
}).catch((error) => {
console.log(error);
this.loading = false;
});
},
}
};
</script>