Files
ulthon_admin/extend/base/admin/service/adminUpdateCodeData/v2.4.0.php

196 lines
6.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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.0nginx_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('更新代码完成');
}
}