mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-09-05 07:15:31 +08:00
feat(nginx-log): curd 生成 raw/position 后台并改只读
- NginxAccessLog + NginxLogPosition Scheme 加 #[Component] 注解 - Scheme Table name 补 ul_ 前缀(curd 严格校验要求) - curd 生成 nginx 模块完整后台(controller/model/view/js) - Base/App 双层只读控制器(参照 TimerLogBase 范式) - AccessLogBase: add/edit/delete/modify 全部 error - LogPositionBase: 同上 - 视图改造: - access_log 裁剪到 8 列核心字段(time_local/method/uri/status/remote_addr/request_time/body_bytes_sent/http_user_agent) - status/request_time 自定义 badge 渲染 - toolbar 清空 + operat 仅保留详情(B 类只读页面) - log_position 全字段 + 只读化 - HTTP 验证:index 200 OK + add/edit/delete/modify 全部返回错误
This commit is contained in:
11
app/admin/view/nginx/log_position/_common.js
Normal file
11
app/admin/view/nginx/log_position/_common.js
Normal file
@@ -0,0 +1,11 @@
|
||||
var init = {
|
||||
tableElem: '#currentTable',
|
||||
tableRenderId: 'currentTableRenderId',
|
||||
indexUrl: 'nginx.log_position/index',
|
||||
addUrl: '',
|
||||
editUrl: '',
|
||||
readUrl: 'nginx.log_position/read',
|
||||
deleteUrl: '',
|
||||
exportUrl: '',
|
||||
modifyUrl: '',
|
||||
};
|
||||
56
app/admin/view/nginx/log_position/add.html
Normal file
56
app/admin/view/nginx/log_position/add.html
Normal file
@@ -0,0 +1,56 @@
|
||||
<div class="layuimini-container">
|
||||
<form id="app-form" class="layui-form layuimini-form">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">日志文件绝对路径</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="file_path" class="layui-input" lay-verify="required" placeholder="请输入日志文件绝对路径" value="{$Request.param.file_path|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">文件 inode,用于检测日志轮转</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="inode" class="layui-input" placeholder="请输入文件 inode,用于检测日志轮转" value="{$Request.param.inode|default='0'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次读取到的字节偏移</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="offset" class="layui-input" placeholder="请输入上次读取到的字节偏移" value="{$Request.param.offset|default='0'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次读取时间戳</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="last_read_time" data-date="" data-date-type="datetime" class="layui-input" placeholder="请输入上次读取时间戳" value="{$Request.param.last_read_time|default='0'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次最后一行的 md5 哈希(容错校验)</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="last_line_hash" class="layui-input" placeholder="请输入上次最后一行的 md5 哈希(容错校验)" value="{$Request.param.last_line_hash|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">解析失败累计次数</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="parse_fail_count" class="layui-input" placeholder="请输入解析失败累计次数" value="{$Request.param.parse_fail_count|default='0'}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">解析失败样本行(最多保留若干条)</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="parse_fail_samples" class="layui-textarea" placeholder="请输入解析失败样本行(最多保留若干条)">{$Request.param.parse_fail_samples|default=''}</textarea>
|
||||
</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
app/admin/view/nginx/log_position/add.js
Normal file
3
app/admin/view/nginx/log_position/add.js
Normal file
@@ -0,0 +1,3 @@
|
||||
$(function(){
|
||||
ua.listen();
|
||||
})
|
||||
56
app/admin/view/nginx/log_position/edit.html
Normal file
56
app/admin/view/nginx/log_position/edit.html
Normal file
@@ -0,0 +1,56 @@
|
||||
<div class="layuimini-container">
|
||||
<form id="app-form" class="layui-form layuimini-form">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">日志文件绝对路径</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="file_path" class="layui-input" lay-verify="required" placeholder="请输入日志文件绝对路径" value="{$row.file_path|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">文件 inode,用于检测日志轮转</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="inode" class="layui-input" placeholder="请输入文件 inode,用于检测日志轮转" value="{$row.inode|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次读取到的字节偏移</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="offset" class="layui-input" placeholder="请输入上次读取到的字节偏移" value="{$row.offset|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次读取时间戳</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="last_read_time" data-date="" data-date-type="datetime" class="layui-input" placeholder="请输入上次读取时间戳" value="{$row.last_read_time|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">上次最后一行的 md5 哈希(容错校验)</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="last_line_hash" class="layui-input" placeholder="请输入上次最后一行的 md5 哈希(容错校验)" value="{$row.last_line_hash|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">解析失败累计次数</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="parse_fail_count" class="layui-input" placeholder="请输入解析失败累计次数" value="{$row.parse_fail_count|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-form-text">
|
||||
<label class="layui-form-label">解析失败样本行(最多保留若干条)</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="parse_fail_samples" class="layui-textarea" placeholder="请输入解析失败样本行(最多保留若干条)">{$row.parse_fail_samples|raw|default=''}</textarea>
|
||||
</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
app/admin/view/nginx/log_position/edit.js
Normal file
3
app/admin/view/nginx/log_position/edit.js
Normal file
@@ -0,0 +1,3 @@
|
||||
$(function(){
|
||||
ua.listen();
|
||||
})
|
||||
9
app/admin/view/nginx/log_position/index.html
Normal file
9
app/admin/view/nginx/log_position/index.html
Normal file
@@ -0,0 +1,9 @@
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
<table id="currentTable" class="layui-table layui-hide"
|
||||
data-auth-index="{:auth('nginx.log_position/index')}"
|
||||
data-auth-read="{:auth('nginx.log_position/read')}"
|
||||
lay-filter="currentTable">
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
41
app/admin/view/nginx/log_position/index.js
Normal file
41
app/admin/view/nginx/log_position/index.js
Normal file
@@ -0,0 +1,41 @@
|
||||
$(function(){
|
||||
ua.table.render({
|
||||
init: init,
|
||||
toolbar: [],
|
||||
defaultToolbar: ['filter'],
|
||||
cols: [[
|
||||
{type: 'checkbox'},
|
||||
{field: 'id', title: 'ID', width: 80},
|
||||
{field: 'file_path', title: '文件路径', minWidth: 250},
|
||||
{field: 'inode', title: 'inode', width: 120},
|
||||
{field: 'offset', title: '偏移量', width: 120},
|
||||
{field: 'last_read_time', title: '最后读取时间', width: 170, search: 'range', templet: ua.table.date},
|
||||
{field: 'last_line_hash', title: '最后行哈希', width: 160, search: false},
|
||||
{field: 'parse_fail_count', title: '失败次数', width: 100, search: 'number_limit', templet: function(d) {
|
||||
var c = parseInt(d.parse_fail_count);
|
||||
if (c > 0) return '<span class="layui-badge layui-bg-red">' + c + '</span>';
|
||||
return '<span class="layui-badge layui-bg-green">0</span>';
|
||||
}},
|
||||
{field: 'parse_fail_samples', title: '失败样本', minWidth: 200, search: false},
|
||||
{field: 'create_time', title: '创建时间', width: 170, search: 'range', templet: ua.table.date},
|
||||
{field: 'update_time', title: '更新时间', width: 170, search: false, templet: ua.table.date},
|
||||
{
|
||||
width: 100, title: '操作', templet: ua.table.tool, fixed: 'right', operat: [
|
||||
[{
|
||||
class: 'layui-btn layui-btn-primary layui-btn-xs',
|
||||
method: 'tab',
|
||||
field: 'id',
|
||||
text: '详情',
|
||||
title: '查看详情',
|
||||
auth: 'read',
|
||||
url: init.readUrl,
|
||||
icon: ''
|
||||
}]
|
||||
]
|
||||
},
|
||||
|
||||
]],
|
||||
});
|
||||
|
||||
ua.listen();
|
||||
})
|
||||
119
app/admin/view/nginx/log_position/read.html
Normal file
119
app/admin/view/nginx/log_position/read.html
Normal file
@@ -0,0 +1,119 @@
|
||||
<div class="layuimini-container detail-container">
|
||||
<div class="layuimini-main">
|
||||
<div class="layui-card detail-card">
|
||||
<div class="layui-card-header detail-header">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-md9">
|
||||
<h2 class="detail-title">#{$row.id} {$title}</h2>
|
||||
<div class="detail-id">ID: {$row.id}</div>
|
||||
</div>
|
||||
<div class="layui-col-md3 text-right detail-actions">
|
||||
<button class="layui-btn layui-btn-primary" layuimini-content-href="{$Request.param.backTagId}" data-back="1">返回</button>
|
||||
<button class="layui-btn" onclick="location.href='{:url("edit", ["id" => $row.id])}'">编辑</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body detail-content">
|
||||
<div class="layui-row layui-col-space12">
|
||||
<!-- 左侧主体内容 -->
|
||||
<div class="layui-col-md8 detail-main">
|
||||
<div class="detail-field-group">
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">日志文件绝对路径</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.file_path"}
|
||||
{$row.file_path}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">文件 inode,用于检测日志轮转</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.inode"}
|
||||
{$row.inode}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">上次读取到的字节偏移</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.offset"}
|
||||
{$row.offset}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">上次读取时间戳</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.last_read_time"}
|
||||
{$row.last_read_time|date="Y-m-d H:i:s"}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">上次最后一行的 md5 哈希(容错校验)</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.last_line_hash"}
|
||||
{$row.last_line_hash}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">解析失败累计次数</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.parse_fail_count"}
|
||||
{$row.parse_fail_count}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">解析失败样本行(最多保留若干条)</div>
|
||||
<div class="detail-field-value" style="white-space: pre-wrap;">
|
||||
{notempty name="row.parse_fail_samples"}
|
||||
{$row.parse_fail_samples|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧基础信息 -->
|
||||
<div class="layui-col-md4 detail-side">
|
||||
<h3 class="detail-side-title">基础信息</h3>
|
||||
<div class="detail-field-group">
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">ID</div>
|
||||
<div class="detail-field-value">{$row.id}</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">创建时间戳</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.create_time"}
|
||||
{$row.create_time|date="Y-m-d H:i:s"}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
22
app/admin/view/nginx/log_position/read.js
Normal file
22
app/admin/view/nginx/log_position/read.js
Normal file
@@ -0,0 +1,22 @@
|
||||
$(function(){
|
||||
// 删除数据
|
||||
window.deleteData = function(id) {
|
||||
layer.confirm('确定要删除这条数据吗?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
$.post('{{:url("delete")}}', {id: id}, function(res) {
|
||||
if (res.code == 0) {
|
||||
layer.msg('删除成功', {icon: 1}, function() {
|
||||
location.href = '{{:url("index")}}';
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}, 'json');
|
||||
layer.close(index);
|
||||
});
|
||||
};
|
||||
|
||||
ua.listen();
|
||||
})
|
||||
Reference in New Issue
Block a user