feat: 增加主机节点表结构代码

This commit is contained in:
augushong
2025-08-23 22:44:47 +08:00
parent 46722e5a66
commit b1a6b37ee0
12 changed files with 282 additions and 15 deletions

View File

@@ -0,0 +1,13 @@
<?php
namespace app\admin\controller\system;
use app\admin\service\annotation\ControllerAnnotation;
use base\admin\controller\system\HostBase;
/**
* @ControllerAnnotation(title="system_host",module="系统")
*/
class Host extends HostBase
{
}

View File

@@ -0,0 +1,9 @@
<?php
namespace app\admin\model;
use base\admin\model\SystemHostBase;
class SystemHost extends SystemHostBase
{
}

View File

@@ -0,0 +1,24 @@
<?php
namespace base\admin\controller\system;
use app\admin\service\annotation\ControllerAnnotation;
use app\common\controller\AdminController;
use think\App;
/**
* @ControllerAnnotation(title="system_host")
*/
class HostBase extends AdminController
{
use \app\admin\traits\Curd;
public function __construct(App $app)
{
parent::__construct($app);
$this->model = new \app\admin\model\SystemHost();
$this->assign('select_list_status', $this->model::SELECT_LIST_STATUS, true);
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace base\admin\model;
use app\common\model\TimeModel;
/**
* @property int $id ID
* @property string $node_id 节点ID
* @property string $ip_address IP地址
* @property int $status 状态 0:离线,1:在线
* @property string $last_heartbeat_at 最后心跳时间
* @property string $os_info 系统信息
* @property string $php_version PHP版本
* @property string $cpu_load CPU负载
* @property int $memory_usage 内存占用
* @property int $disk_free 磁盘可用空间
* @property int $disk_total 磁盘总空间
* @property string $create_time 首次运行时间
*/
class SystemHostBase extends TimeModel
{
protected $name = 'system_host';
protected $deleteTime = false;
public const SELECT_LIST_STATUS = ['0' => '离线', '1' => '在线'];
}

View File

@@ -0,0 +1,10 @@
var init = {
tableElem: '#currentTable',
tableRenderId: 'currentTableRenderId',
indexUrl: 'system.host/index',
addUrl: 'system.host/add' + location.search,
editUrl: 'system.host/edit',
deleteUrl: 'system.host/delete',
exportUrl: 'system.host/export',
modifyUrl: 'system.host/modify',
};

View File

@@ -0,0 +1,77 @@
<div class="layuimini-container">
<form id="app-form" class="layui-form layuimini-form">
<div class="layui-form-item">
<label class="layui-form-label">节点ID</label>
<div class="layui-input-block">
<input type="text" name="node_id" class="layui-input" lay-verify="required" placeholder="请输入节点ID" value="{$Request.param.node_id|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">IP地址</label>
<div class="layui-input-block">
<input type="text" name="ip_address" class="layui-input" placeholder="请输入IP地址" value="{$Request.param.ip_address|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
{foreach $select_list_status as $k=>$v}
<input type="radio" name="status" value="{$k}" title="{$v}" {in name="k" value="$Request.param.status"}checked=""{/in}>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最后心跳时间</label>
<div class="layui-input-block">
<input type="text" name="last_heartbeat_at" data-date="" data-date-type="datetime" class="layui-input" placeholder="请输入最后心跳时间" value="{$Request.param.last_heartbeat_at|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系统信息</label>
<div class="layui-input-block">
<input type="text" name="os_info" class="layui-input" placeholder="请输入系统信息" value="{$Request.param.os_info|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">PHP版本</label>
<div class="layui-input-block">
<input type="text" name="php_version" class="layui-input" placeholder="请输入PHP版本" value="{$Request.param.php_version|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">CPU负载</label>
<div class="layui-input-block">
<input type="text" name="cpu_load" class="layui-input" placeholder="请输入CPU负载" value="{$Request.param.cpu_load|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">内存占用</label>
<div class="layui-input-block">
<input type="text" name="memory_usage" class="layui-input" placeholder="请输入内存占用" value="{$Request.param.memory_usage|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">磁盘可用空间</label>
<div class="layui-input-block">
<input type="text" name="disk_free" class="layui-input" placeholder="请输入磁盘可用空间" value="{$Request.param.disk_free|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">磁盘总空间</label>
<div class="layui-input-block">
<input type="text" name="disk_total" class="layui-input" placeholder="请输入磁盘总空间" value="{$Request.param.disk_total|default=''}">
</div>
</div>
<div class="hr-line"></div>
<div class="layui-form-item text-center">
{notempty name='$Request.param.backTagId'}
<div class="layui-btn layui-btn-sm page-back-button" layuimini-content-href="{$Request.param.backTagId}" data-back="1">返回</div>
{/notempty}
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div>
</form>
</div>

View File

@@ -0,0 +1,3 @@
$(function(){
ua.listen();
})

View File

@@ -0,0 +1,77 @@
<div class="layuimini-container">
<form id="app-form" class="layui-form layuimini-form">
<div class="layui-form-item">
<label class="layui-form-label">节点ID</label>
<div class="layui-input-block">
<input type="text" name="node_id" class="layui-input" lay-verify="required" placeholder="请输入节点ID" value="{$row.node_id|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">IP地址</label>
<div class="layui-input-block">
<input type="text" name="ip_address" class="layui-input" placeholder="请输入IP地址" value="{$row.ip_address|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
{foreach $select_list_status as $k=>$v}
<input type="radio" name="status" value="{$k}" title="{$v}" {in name="k" value="$row.status"}checked=""{/in}>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最后心跳时间</label>
<div class="layui-input-block">
<input type="text" name="last_heartbeat_at" data-date="" data-date-type="datetime" class="layui-input" placeholder="请输入最后心跳时间" value="{$row.last_heartbeat_at|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系统信息</label>
<div class="layui-input-block">
<input type="text" name="os_info" class="layui-input" placeholder="请输入系统信息" value="{$row.os_info|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">PHP版本</label>
<div class="layui-input-block">
<input type="text" name="php_version" class="layui-input" placeholder="请输入PHP版本" value="{$row.php_version|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">CPU负载</label>
<div class="layui-input-block">
<input type="text" name="cpu_load" class="layui-input" placeholder="请输入CPU负载" value="{$row.cpu_load|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">内存占用</label>
<div class="layui-input-block">
<input type="text" name="memory_usage" class="layui-input" placeholder="请输入内存占用" value="{$row.memory_usage|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">磁盘可用空间</label>
<div class="layui-input-block">
<input type="text" name="disk_free" class="layui-input" placeholder="请输入磁盘可用空间" value="{$row.disk_free|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">磁盘总空间</label>
<div class="layui-input-block">
<input type="text" name="disk_total" class="layui-input" placeholder="请输入磁盘总空间" value="{$row.disk_total|default=''}">
</div>
</div>
<div class="hr-line"></div>
<div class="layui-form-item text-center">
{notempty name='$Request.param.backTagId'}
<div class="layui-btn layui-btn-sm page-back-button" layuimini-content-href="{$Request.param.backTagId}" data-back="1">返回</div>
{/notempty}
<button type="submit" class="layui-btn layui-btn-normal layui-btn-sm" lay-submit>确认</button>
<button type="reset" class="layui-btn layui-btn-primary layui-btn-sm">重置</button>
</div>
</form>
</div>

View File

@@ -0,0 +1,3 @@
$(function(){
ua.listen();
})

View File

@@ -0,0 +1,13 @@
<div class="layuimini-container">
<div class="layuimini-main">
<table id="currentTable" class="layui-table layui-hide"
data-auth-index="{:auth('system.host/index')}"
data-auth-add="{:auth('system.host/add')}"
data-auth-edit="{:auth('system.host/edit')}"
data-auth-delete="{:auth('system.host/delete')}"
data-auth-export="{:auth('system.host/export')}"
data-auth-modify="{:auth('system.host/modify')}"
lay-filter="currentTable">
</table>
</div>
</div>

View File

@@ -0,0 +1,10 @@
$(function(){
ua.table.render({
init: init,
cols: [[
{type: 'checkbox'},
{field: 'id', title: 'ID'},
{field: 'node_id', title: '节点ID'},
{field: 'ip_address', title: 'IP地址'},
{field: 'status', search: 'select', selectList: ua.getDataBrage('select_list_status'), title: '状态', templet: ua.table.switch},
{field: 'last_heartbeat_at', title: '最后心跳时间'},

View File

@@ -1,4 +1,3 @@
<?php
namespace base\common\service;
@@ -9,7 +8,7 @@ use think\facade\Log;
/**
* 主机(节点)服务 - 基础类
* 用于注册、上报主机心跳及性能指标
* 用于注册、上报主机心跳及性能指标.
*/
class HostServiceBase
{
@@ -36,7 +35,7 @@ class HostServiceBase
// 2. 如果文件不存在或为空生成新的唯一ID
// 格式: hostname-8位随机字符串
$hostname = gethostname() ?: 'unknown_host';
$uniqueSuffix = substr(md5(uniqid((string)mt_rand(), true)), 0, 8);
$uniqueSuffix = substr(md5(uniqid((string) mt_rand(), true)), 0, 8);
$newHostId = "{$hostname}-{$uniqueSuffix}";
// 3. 将新ID写入文件以便下次启动时使用
@@ -58,6 +57,7 @@ class HostServiceBase
$hostId = self::getHostId();
if (empty($hostId)) {
Log::error('无法获取当前主机ID心跳更新失败');
return;
}
@@ -84,7 +84,7 @@ class HostServiceBase
}
/**
* 收集主机的动态性能指标 (不依赖任何外部系统命令)
* 收集主机的动态性能指标 (不依赖任何外部系统命令).
* @return array
*/
public static function collectHostMetrics(): array
@@ -93,29 +93,29 @@ class HostServiceBase
$cpuLoad = null;
if (function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
$cpuLoad = is_array($load) ? implode(',', array_map(fn($l) => round($l, 2), $load)) : null;
$cpuLoad = is_array($load) ? implode(',', array_map(fn ($l) => round($l, 2), $load)) : null;
}
return [
'status' => 1,
'last_heartbeat_at' => date('Y-m-d H:i:s'),
'ip_address' => gethostbyname(gethostname()),
'cpu_load' => $cpuLoad,
'memory_usage' => memory_get_usage(), // false: 获取脚本自身内存占用
'disk_free' => disk_free_space(App::getRootPath()),
'disk_total' => disk_total_space(App::getRootPath()),
'status' => 1,
'last_heartbeat_at' => date('Y-m-d H:i:s'),
'ip_address' => gethostbyname(gethostname()),
'cpu_load' => $cpuLoad,
'memory_usage' => memory_get_usage(), // false: 获取脚本自身内存占用
'disk_free' => disk_free_space(App::getRootPath()),
'disk_total' => disk_total_space(App::getRootPath()),
];
}
/**
* 收集主机的静态信息 (仅在首次注册时调用)
* 收集主机的静态信息 (仅在首次注册时调用).
* @return array
*/
public static function collectStaticInfo(): array
{
return [
'os_info' => php_uname(),
'php_version' => PHP_VERSION,
'os_info' => php_uname(),
'php_version' => PHP_VERSION,
];
}
}