mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-08-30 20:55:32 +08:00
196 lines
6.7 KiB
PHP
196 lines
6.7 KiB
PHP
<?php
|
||
/**
|
||
* @internal-framework
|
||
*
|
||
* 此文件为框架内置功能
|
||
*
|
||
* 用途:框架版本更新代码(v2.4.0)- nginx_log 分析模块存量升级
|
||
* 维护者:框架维护者
|
||
*
|
||
* 变更:
|
||
* - system_config 新增 nginx_log 组 4 条运行参数配置
|
||
* raw_retention_days 原始日志保留天数(0=永久)
|
||
* stat_retention_days 统计聚合保留天数(0=永久)
|
||
* topn_default Top N 默认值
|
||
* exclude_static 是否排除静态资源访问
|
||
* - system_menu 新增 4 条菜单(顶级分组 300 + 3 个子菜单 301/302/303)
|
||
* 300 Nginx 日志分析(顶级分组,href 为空)
|
||
* 301 访问统计仪表盘 system.nginx_log_stat/index
|
||
* 302 原始访问日志 system.nginx_access_log/index
|
||
* 303 读取位置管理 system.nginx_log_position/index
|
||
*
|
||
* 设计说明:
|
||
* - 幂等 check-then-insert(先查询存在性,不存在才插入)
|
||
* - 不分配超管权限:AuthServiceBase::isSuperAdmin() 对 admin_id=1 直接返回 true,
|
||
* 为 auth_id=1 植入 system_auth_node 是冗余且无效
|
||
* - 不直接植入权限节点:节点由 admin:permission:nodes 扫描控制器 @NodeAnotation 注解生成
|
||
*
|
||
* 注意:此文件属于框架内核,业务开发者不应修改
|
||
*/
|
||
|
||
use think\console\Input;
|
||
use think\console\Output;
|
||
use think\facade\Db;
|
||
|
||
class UpdateFunction
|
||
{
|
||
/**
|
||
* @var Input
|
||
*/
|
||
public $input;
|
||
|
||
/**
|
||
* @var Output
|
||
*/
|
||
public $output;
|
||
|
||
/**
|
||
* 待新增 sysconfig 配置(nginx_log 组).
|
||
* 字段顺序与 adminInitData/SystemConfig.php 一致:name/group/value/remark/sort.
|
||
*/
|
||
public $newConfigs = [
|
||
[
|
||
'name' => 'raw_retention_days',
|
||
'group' => 'nginx_log',
|
||
'value' => '7',
|
||
'remark' => '原始日志保留天数(0=永久)',
|
||
'sort' => 0,
|
||
],
|
||
[
|
||
'name' => 'stat_retention_days',
|
||
'group' => 'nginx_log',
|
||
'value' => '365',
|
||
'remark' => '统计聚合保留天数(0=永久)',
|
||
'sort' => 0,
|
||
],
|
||
[
|
||
'name' => 'topn_default',
|
||
'group' => 'nginx_log',
|
||
'value' => '10',
|
||
'remark' => 'Top N 默认值(热门 URL/Referer/UA)',
|
||
'sort' => 0,
|
||
],
|
||
[
|
||
'name' => 'exclude_static',
|
||
'group' => 'nginx_log',
|
||
'value' => '1',
|
||
'remark' => '是否排除静态资源访问(0=不排除,1=排除 /css/.js/.png 等扩展名)',
|
||
'sort' => 0,
|
||
],
|
||
];
|
||
|
||
/**
|
||
* 待新增菜单.
|
||
* 字段顺序与 adminInitData/SystemMenu.php 一致:id/pid/title/icon/href/params/target/sort/status.
|
||
* id 显式分配 300-303,与 adminInitData 保持一致(顶级 300 + 3 个子菜单)。
|
||
*/
|
||
public $newMenus = [
|
||
[
|
||
'id' => 300,
|
||
'pid' => 0,
|
||
'title' => 'Nginx 日志分析',
|
||
'icon' => 'fa fa-chart-bar',
|
||
'href' => '',
|
||
'params' => '',
|
||
'target' => '_self',
|
||
'sort' => 0,
|
||
'status' => 1,
|
||
],
|
||
[
|
||
'id' => 301,
|
||
'pid' => 300,
|
||
'title' => '访问统计仪表盘',
|
||
'icon' => 'fa fa-line-chart',
|
||
'href' => 'system.nginx_log_stat/index',
|
||
'params' => '',
|
||
'target' => '_self',
|
||
'sort' => 0,
|
||
'status' => 1,
|
||
],
|
||
[
|
||
'id' => 302,
|
||
'pid' => 300,
|
||
'title' => '原始访问日志',
|
||
'icon' => 'fa fa-file-text',
|
||
'href' => 'system.nginx_access_log/index',
|
||
'params' => '',
|
||
'target' => '_self',
|
||
'sort' => 0,
|
||
'status' => 1,
|
||
],
|
||
[
|
||
'id' => 303,
|
||
'pid' => 300,
|
||
'title' => '读取位置管理',
|
||
'icon' => 'fa fa-map-marker',
|
||
'href' => 'system.nginx_log_position/index',
|
||
'params' => '',
|
||
'target' => '_self',
|
||
'sort' => 0,
|
||
'status' => 1,
|
||
],
|
||
];
|
||
|
||
public function update()
|
||
{
|
||
$this->output->writeln('更新代码');
|
||
|
||
$this->output->info('v2.4.0:nginx_log 分析模块存量升级(补齐 4 条 sysconfig + 4 条菜单)');
|
||
|
||
$configTable = config('database.connections.mysql.prefix', 'ul_') . 'system_config';
|
||
$menuTable = config('database.connections.mysql.prefix', 'ul_') . 'system_menu';
|
||
|
||
// 确认表存在(防御性检查,参照 v2.3.0.php 范式)
|
||
$tablesExist = Db::query(
|
||
"SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME IN (?, ?)",
|
||
[$configTable, $menuTable]
|
||
);
|
||
if (count($tablesExist) < 2) {
|
||
$this->output->warning("表 {$configTable} 或 {$menuTable} 不存在,跳过数据补齐。请先执行 scheme:sync 或 migrate:run 初始化表结构。");
|
||
|
||
return;
|
||
}
|
||
|
||
$configAdded = 0;
|
||
$configSkipped = 0;
|
||
foreach ($this->newConfigs as $cfg) {
|
||
// 幂等:用 (group, name) 检查存在性
|
||
$exists = Db::name('system_config')
|
||
->where('group', $cfg['group'])
|
||
->where('name', $cfg['name'])
|
||
->find();
|
||
if ($exists) {
|
||
$this->output->writeln(" - 配置 {$cfg['group']}.{$cfg['name']} 已存在,跳过");
|
||
++$configSkipped;
|
||
continue;
|
||
}
|
||
|
||
Db::name('system_config')->insert($cfg);
|
||
$this->output->writeln(" - 新增配置 {$cfg['group']}.{$cfg['name']} 完成");
|
||
++$configAdded;
|
||
}
|
||
|
||
$menuAdded = 0;
|
||
$menuSkipped = 0;
|
||
foreach ($this->newMenus as $menu) {
|
||
// 幂等:用 id 检查存在性(顶级菜单 href 为空,不能用 href 去重)
|
||
$exists = Db::name('system_menu')
|
||
->where('id', $menu['id'])
|
||
->find();
|
||
if ($exists) {
|
||
$this->output->writeln(" - 菜单 id={$menu['id']} ({$menu['title']}) 已存在,跳过");
|
||
++$menuSkipped;
|
||
continue;
|
||
}
|
||
|
||
Db::name('system_menu')->insert($menu);
|
||
$this->output->writeln(" - 新增菜单 id={$menu['id']} ({$menu['title']}) 完成");
|
||
++$menuAdded;
|
||
}
|
||
|
||
$totalSkipped = $configSkipped + $menuSkipped;
|
||
$this->output->info("本次新增 {$configAdded} 条配置、{$menuAdded} 条菜单,跳过 {$totalSkipped} 条已存在");
|
||
$this->output->writeln('更新代码完成');
|
||
}
|
||
}
|