feat(nginx-log): 多节点适配(node_id 全链路 + 全局/按节点聚合 + 节点筛选 + v2.4.0 升级脚本)

- 6 张表加 node_id 字段 + position/stat 改复合唯一键(migration)
- 6 个 Scheme 同步 node_id 注解 + 唯一键
- Reader 带 node_id 参数 + 懒加载接管(getLastPosition 回退查 node_id='')
- Aggregator 全局行(node_id='')+ 按节点循环 insertAggregatesForScope
- Stat 所有查询方法加 where node_id 条件
- Dashboard 控制器/视图加节点筛选下拉框 + AJAX 带 node_id
- AccessLog 列表加节点列 + 采集进度卡片显示节点信息
- import 定时任务 run_type 改 all(每节点采集自己的日志)
- v2.4.0 升级脚本追加 ALTER TABLE(幂等 check-then-alter)
- 菜单调整:去掉 Nginx 顶级菜单 + 读取位置管理,改为系统管理下挂两个子菜单
- ulthon-timer 文档补充 run_type=all 多节点部署注意事项
This commit is contained in:
augushong
2026-08-08 10:33:20 +08:00
parent f1a2e8fd5d
commit 8faa52ce90
21 changed files with 578 additions and 206 deletions

View File

@@ -19,6 +19,14 @@
<input type="text" class="layui-input" id="dateEnd" placeholder="结束日期" autocomplete="off" style="width:130px;" readonly>
<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="customSearchBtn">查询</button>
</span>
<div class="layui-input-inline" style="margin-left: 15px; width: 180px; vertical-align: middle;">
<select id="node-filter" lay-filter="nodeFilter">
<option value="">全部节点</option>
{volist name="nodes" id="node"}
<option value="{$node.node_id}" {if condition="$node_id eq $node.node_id"}selected{/if}>{$node.node_id}</option>
{/volist}
</select>
</div>
</div>
</div>

View File

@@ -6,11 +6,15 @@
* 后端 URL 不硬编码:用 ua.url('system.nginx_log_stat/index') 由 CONFIG.ADMIN 拼接。
* AJAX 触发方式URL 带 _ajax=1不依赖 Accept header命令行测试友好
*/
layui.use(['table', 'laydate', 'util'], function () {
layui.use(['table', 'laydate', 'util', 'form'], function () {
var table = layui.table;
var laydate = layui.laydate;
var util = layui.util;
var form = layui.form;
// 渲染节点下拉框
form.render();
// ── 配置URL 不硬编码:由 ua.url 拼接 /{ADMIN}/system.nginx_log_stat/index──
var STAT_INDEX_URL = ua.url('system.nginx_log_stat/index');
@@ -129,6 +133,15 @@ layui.use(['table', 'laydate', 'util'], function () {
loadData({ period: 'custom', start: startVal, end: endVal });
});
// ================================================================
// 节点下拉框切换
// ================================================================
form.on('select(nodeFilter)', function (data) {
// 切换节点时用当前 period 重新加载
loadData({ period: currentPeriod });
});
// ================================================================
// AJAX 加载数据
// ================================================================
@@ -141,6 +154,10 @@ layui.use(['table', 'laydate', 'util'], function () {
function loadData(extra) {
extra = extra || {};
// 当前选中的节点 ID默认空字符串=全部节点)
var nodeId = $('#node-filter').val() || '';
extra.node_id = nodeId;
var params = $.extend({ _ajax: 1, period: currentPeriod }, extra);
ua.request.get({