mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-07-09 19:42:47 +08:00
feat: 增加主机节点表结构代码
This commit is contained in:
13
app/admin/controller/system/Host.php
Normal file
13
app/admin/controller/system/Host.php
Normal 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
|
||||||
|
{
|
||||||
|
}
|
||||||
9
app/admin/model/SystemHost.php
Normal file
9
app/admin/model/SystemHost.php
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\admin\model;
|
||||||
|
|
||||||
|
use base\admin\model\SystemHostBase;
|
||||||
|
|
||||||
|
class SystemHost extends SystemHostBase
|
||||||
|
{
|
||||||
|
}
|
||||||
24
extend/base/admin/controller/system/HostBase.php
Normal file
24
extend/base/admin/controller/system/HostBase.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
28
extend/base/admin/model/SystemHostBase.php
Normal file
28
extend/base/admin/model/SystemHostBase.php
Normal 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' => '在线'];
|
||||||
|
}
|
||||||
10
extend/base/admin/view/system/host/_common.js
Normal file
10
extend/base/admin/view/system/host/_common.js
Normal 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',
|
||||||
|
};
|
||||||
77
extend/base/admin/view/system/host/add.html
Normal file
77
extend/base/admin/view/system/host/add.html
Normal 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>
|
||||||
3
extend/base/admin/view/system/host/add.js
Normal file
3
extend/base/admin/view/system/host/add.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
$(function(){
|
||||||
|
ua.listen();
|
||||||
|
})
|
||||||
77
extend/base/admin/view/system/host/edit.html
Normal file
77
extend/base/admin/view/system/host/edit.html
Normal 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>
|
||||||
3
extend/base/admin/view/system/host/edit.js
Normal file
3
extend/base/admin/view/system/host/edit.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
$(function(){
|
||||||
|
ua.listen();
|
||||||
|
})
|
||||||
13
extend/base/admin/view/system/host/index.html
Normal file
13
extend/base/admin/view/system/host/index.html
Normal 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>
|
||||||
10
extend/base/admin/view/system/host/index.js
Normal file
10
extend/base/admin/view/system/host/index.js
Normal 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: '最后心跳时间'},
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace base\common\service;
|
namespace base\common\service;
|
||||||
@@ -9,7 +8,7 @@ use think\facade\Log;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 主机(节点)服务 - 基础类
|
* 主机(节点)服务 - 基础类
|
||||||
* 用于注册、上报主机心跳及性能指标
|
* 用于注册、上报主机心跳及性能指标.
|
||||||
*/
|
*/
|
||||||
class HostServiceBase
|
class HostServiceBase
|
||||||
{
|
{
|
||||||
@@ -36,7 +35,7 @@ class HostServiceBase
|
|||||||
// 2. 如果文件不存在或为空,生成新的唯一ID
|
// 2. 如果文件不存在或为空,生成新的唯一ID
|
||||||
// 格式: hostname-8位随机字符串
|
// 格式: hostname-8位随机字符串
|
||||||
$hostname = gethostname() ?: 'unknown_host';
|
$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}";
|
$newHostId = "{$hostname}-{$uniqueSuffix}";
|
||||||
|
|
||||||
// 3. 将新ID写入文件,以便下次启动时使用
|
// 3. 将新ID写入文件,以便下次启动时使用
|
||||||
@@ -58,6 +57,7 @@ class HostServiceBase
|
|||||||
$hostId = self::getHostId();
|
$hostId = self::getHostId();
|
||||||
if (empty($hostId)) {
|
if (empty($hostId)) {
|
||||||
Log::error('无法获取当前主机ID,心跳更新失败');
|
Log::error('无法获取当前主机ID,心跳更新失败');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ class HostServiceBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收集主机的动态性能指标 (不依赖任何外部系统命令)
|
* 收集主机的动态性能指标 (不依赖任何外部系统命令).
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function collectHostMetrics(): array
|
public static function collectHostMetrics(): array
|
||||||
@@ -93,7 +93,7 @@ class HostServiceBase
|
|||||||
$cpuLoad = null;
|
$cpuLoad = null;
|
||||||
if (function_exists('sys_getloadavg')) {
|
if (function_exists('sys_getloadavg')) {
|
||||||
$load = 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 [
|
return [
|
||||||
@@ -108,7 +108,7 @@ class HostServiceBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收集主机的静态信息 (仅在首次注册时调用)
|
* 收集主机的静态信息 (仅在首次注册时调用).
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function collectStaticInfo(): array
|
public static function collectStaticInfo(): array
|
||||||
|
|||||||
Reference in New Issue
Block a user