2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 14:57:16 +08:00

特性(资源监控):新增时间选择

This commit is contained in:
耗子
2022-12-03 02:09:01 +08:00
parent 642d3339fc
commit 7df1fab7ff
3 changed files with 179 additions and 192 deletions

View File

@@ -69,21 +69,15 @@ class MonitorsController extends Controller
{
$start = $request->input('start') ?? now();
$end = $request->input('end') ?? now();
$start = Carbon::create($start)->startOfDay();
$end = Carbon::create($end)->endOfDay();
$start = Carbon::create($start);
$end = Carbon::create($end);
$data = Monitor::query()->where('created_at', '>=', $start)->where('created_at', '<=', $end)->get()->toArray();
$res['code'] = 0;
$res['msg'] = 'success';
if (empty($data)) {
$res['data']['times'] = [];
$res['data']['uptime'] = [];
$res['data']['cpu']['use'] = [];
$res['data']['memory']['mem_use'] = [];
$res['data']['memory']['mem_use_p'] = [];
$res['data']['memory']['swap_use'] = [];
$res['data']['memory']['swap_use_p'] = [];
$res['data']['network']['tx_now'] = [];
$res['data']['network']['rx_now'] = [];
$res['code'] = 1;
$res['msg'] = '暂无数据';
return response()->json($res);
}
foreach ($data as $key => $value) {
$info = json_decode($value['info'], true);

View File

@@ -2,7 +2,7 @@
<div class="layui-fluid">
<div class="layui-card">
<div class="layui-form layui-card-header layuiadmin-card-header-auto">
<div class="layui-form layui-card-body">
<div class="layui-inline">
<span style="margin-right: 10px;">开启监控</span><input type="checkbox" id="monitor-switch"
lay-filter="monitor" lay-skin="switch"
@@ -16,7 +16,22 @@
</button>
</div>
</div>
<div style="float: right;">
<div class="layui-inline" style="float: right;">
<span style="margin-right: 10px;">时间选择</span>
<div id="monitor-date" class="layui-input-inline">
<div class="layui-input-inline">
<input type="text" autocomplete="off" id="monitor-startDate"
class="layui-input"
placeholder="开始时间">
</div>
-
<div class="layui-input-inline">
<input type="text" autocomplete="off" id="monitor-endDate"
class="layui-input"
placeholder="结束时间">
</div>
</div>
<span style="margin-left: 40px;"></span>
<button id="clear_monitor_record" class="layui-btn layui-btn-sm layui-btn-danger">清空监控记录
</button>
</div>
@@ -28,19 +43,6 @@
<div class="layui-card">
<div class="layui-card-header">
<span>负载</span>
<div style="float: right;">
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">昨天
</button>--}}
<button class="layui-btn layui-btn-xs">今天</button>
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">
最近七天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">
最近30天
</button>
<button id="test" class="layui-btn layui-btn-xs layui-btn-primary">自定义时间
</button>--}}
</div>
</div>
<div class="layui-card-body">
<div id="load_monitor" style="width: 100%;height: 400px;"></div>
@@ -52,18 +54,6 @@
<div class="layui-card">
<div class="layui-card-header">
<span>CPU</span>
<div style="float: right;">
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">昨天
</button>--}}
<button class="layui-btn layui-btn-xs">今天</button>
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">
最近七天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">最近30天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">自定义时间
</button>--}}
</div>
</div>
<div class="layui-card-body">
<div id="cpu_monitor" style="width: 100%;height: 400px;"></div>
@@ -77,20 +67,6 @@
<div class="layui-card">
<div class="layui-card-header">
<span>内存</span>
<div style="float: right;">
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">昨天
</button>--}}
<button class="layui-btn layui-btn-xs">今天</button>
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">
最近七天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">
最近30天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">
自定义时间
</button>--}}
</div>
</div>
<div class="layui-card-body">
<div id="memory_monitor" style="width: 100%;height: 400px;"></div>
@@ -101,17 +77,6 @@
<div class="layui-card">
<div class="layui-card-header">
<span>网络</span>
<div style="float: right;">
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">昨天
</button>--}}
<button class="layui-btn layui-btn-xs">今天</button>
{{--<button class="layui-btn layui-btn-xs layui-btn-primary">最近七天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">最近30天
</button>
<button class="layui-btn layui-btn-xs layui-btn-primary">自定义时间
</button>--}}
</div>
</div>
<div class="layui-card-body">
<div id="network_monitor" style="width: 100%;height: 400px;"></div>
@@ -126,6 +91,25 @@
var view = layui.view;
var $ = layui.jquery;
var form = layui.form;
var laydate = layui.laydate;
// 渲染时间选择器
// 默认开始时间为今天0点结束时间为当前时间
var startDate = new Date(new Date().setHours(0, 0, 0, 0));
var endDate = new Date();
// 拼接时间字符串
var startStr = startDate.getFullYear() + '-' + (startDate.getMonth() + 1) + '-' + startDate.getDate() + ' ' + startDate.getHours() + ':' + startDate.getMinutes() + ':' + startDate.getSeconds();
var endStr = endDate.getFullYear() + '-' + (endDate.getMonth() + 1) + '-' + endDate.getDate() + ' ' + endDate.getHours() + ':' + endDate.getMinutes() + ':' + endDate.getSeconds();
laydate.render({
elem: '#monitor-date'
, type: 'datetime'
, range: ['#monitor-startDate', '#monitor-endDate']
, value: startStr + ' - ' + endStr
, calendar: true
, done: function (value, date, endDate) {
getMonitorData(date.year + '-' + date.month + '-' + date.date + ' ' + date.hours + ':' + date.minutes + ':' + date.seconds, endDate.year + '-' + endDate.month + '-' + endDate.date + ' ' + endDate.hours + ':' + endDate.minutes + ':' + endDate.seconds);
}
});
// 获取监控开关和保存天数
admin.req({
@@ -206,136 +190,145 @@
});
});
// 获取监控数据
admin.req({
url: '/api/panel/monitor/getMonitorData',
type: 'get',
dataType: 'json',
success: function (res) {
if (res.code !== 0) {
layer.msg(res.msg, {icon: 2});
return false;
}
let loadChart = renderEcharts('load_monitor', '负载监控', undefined, res.data.times, [{
name: '负载',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.uptime.uptime,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
type: 'value',
}]);
let cpuChart = renderEcharts('cpu_monitor', 'CPU监控', undefined, res.data.times, [{
name: '使用率',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.cpu.use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 %',
min: 0,
max: 100,
type: 'value',
axisLabel: {
formatter: '{value} %'
}
}]);
let memoryChart = renderEcharts('memory_monitor', '内存', {
x: 'left',
data: ["内存", "Swap"]
}, res.data.times, [{
name: '内存',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.memory.mem_use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}, {
name: 'Swap',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.memory.swap_use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 MB',
min: 0,
max: res.data.mem_total,
type: 'value',
axisLabel: {
formatter: '{value} M'
}
}]);
let networkChart = renderEcharts('network_monitor', '网络', {
x: 'left',
data: ["", ""]
}, res.data.times, [{
name: '出',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.network.tx_now,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}, {
name: '入',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.network.rx_now,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 Kb/s',
type: 'value',
axisLabel: {
formatter: '{value} Kb'
}
}]);
// 在窗口大小改变时,重置图表大小
window.addEventListener("resize", function () {
loadChart.resize();
cpuChart.resize();
memoryChart.resize();
networkChart.resize();
});
}, error: function (xhr, status, error) {
console.log('耗子Linux面板ajax请求出错错误' + error);
}
});
getMonitorData(startStr, endStr);
});
// 获取监控数据
function getMonitorData(startDate, endDate) {
layui.use(['admin'], function () {
let admin = layui.admin;
// 获取监控数据
admin.req({
url: '/api/panel/monitor/getMonitorData?start=' + startDate + '&end=' + endDate,
type: 'get',
dataType: 'json',
success: function (res) {
if (res.code !== 0) {
layer.msg(res.msg, {icon: 2});
return false;
}
let loadChart = renderEcharts('load_monitor', '负载', undefined, res.data.times, [{
name: '负载',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.uptime.uptime,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
type: 'value',
}]);
let cpuChart = renderEcharts('cpu_monitor', 'CPU', undefined, res.data.times, [{
name: '使用率',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.cpu.use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 %',
min: 0,
max: 100,
type: 'value',
axisLabel: {
formatter: '{value} %'
}
}]);
let memoryChart = renderEcharts('memory_monitor', '内存', {
x: 'left',
data: ["内存", "Swap"]
}, res.data.times, [{
name: '内存',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.memory.mem_use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}, {
name: 'Swap',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.memory.swap_use,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 MB',
min: 0,
max: res.data.mem_total,
type: 'value',
axisLabel: {
formatter: '{value} M'
}
}]);
let networkChart = renderEcharts('network_monitor', '网络', {
x: 'left',
data: ["", ""]
}, res.data.times, [{
name: '出',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.network.tx_now,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}, {
name: '入',
type: 'line',
smooth: true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: res.data.network.rx_now,
markPoint: {
data: [{type: 'max', name: '最大值'}, {type: 'min', name: '最小值'}]
},
markLine: {
data: [{type: 'average', name: '平均值'}]
}
}], [{
name: '单位 Kb/s',
type: 'value',
axisLabel: {
formatter: '{value} Kb'
}
}]);
// 在窗口大小改变时,重置图表大小
window.addEventListener("resize", function () {
loadChart.resize();
cpuChart.resize();
memoryChart.resize();
networkChart.resize();
});
}, error: function (xhr, status, error) {
console.log('耗子Linux面板ajax请求出错错误' + error);
}
});
});
}
// 渲染图表
function renderEcharts(element_id, title, legend = undefined, data_xAxis, series, yAxis = undefined) {
var Chart = echarts.init(document.getElementById(element_id), layui.echartsTheme);

View File

@@ -3,7 +3,7 @@
<div class="layui-fluid">
<div class="layui-card">
<div class="layui-card-header">
按钮点击一次即可,请勿重复点击以免重复操作,任务中心在右上
按钮点击一次即可,请勿重复点击以免重复操作,任务中心在右上
</div>
<div class="layui-card-body">
<table id="panel-plugin" lay-filter="panel-plugin"></table>