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:
augushong
2026-07-28 06:21:13 +08:00
parent 7987001cd2
commit d5329cdd45
26 changed files with 1203 additions and 34 deletions

View File

@@ -0,0 +1,122 @@
<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">客户端 IP IPv6</label>
<div class="layui-input-block">
<input type="text" name="remote_addr" class="layui-input" lay-verify="required" placeholder="请输入客户端 IP含 IPv6" value="{$Request.param.remote_addr|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">HTTP 认证用户名</label>
<div class="layui-input-block">
<input type="text" name="remote_user" class="layui-input" placeholder="请输入HTTP 认证用户名" value="{$Request.param.remote_user|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">请求时间戳(业务时区)</label>
<div class="layui-input-block">
<input type="text" name="time_local" data-date="" data-date-type="datetime" class="layui-input" lay-verify="required" placeholder="请输入请求时间戳(业务时区)" value="{$Request.param.time_local|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">HTTP 方法</label>
<div class="layui-input-block">
<input type="text" name="method" class="layui-input" placeholder="请输入HTTP 方法" value="{$Request.param.method|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">请求 URI 255 截断)</label>
<div class="layui-input-block">
<input type="text" name="uri" class="layui-input" lay-verify="required" placeholder="请输入请求 URI超 255 截断)" value="{$Request.param.uri|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">查询字符串</label>
<div class="layui-input-block">
<input type="text" name="query_string" class="layui-input" lay-verify="required" placeholder="请输入查询字符串" value="{$Request.param.query_string|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">HTTP 协议版本</label>
<div class="layui-input-block">
<input type="text" name="http_version" class="layui-input" placeholder="请输入HTTP 协议版本" value="{$Request.param.http_version|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">HTTP 状态码</label>
<div class="layui-input-block">
<input type="text" name="status" class="layui-input" placeholder="请输入HTTP 状态码" value="{$Request.param.status|default='0'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">响应体字节数</label>
<div class="layui-input-block">
<input type="text" name="body_bytes_sent" class="layui-input" placeholder="请输入响应体字节数" value="{$Request.param.body_bytes_sent|default='0'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">Referer</label>
<div class="layui-input-block">
<input type="text" name="http_referer" class="layui-input" lay-verify="required" placeholder="请输入Referer" value="{$Request.param.http_referer|default=''}">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">User-Agent 500 截断)</label>
<div class="layui-input-block">
<textarea name="http_user_agent" class="layui-textarea" lay-verify="required" placeholder="请输入User-Agent超 500 截断)">{$Request.param.http_user_agent|default=''}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">nginx 请求总耗时</label>
<div class="layui-input-block">
<input type="text" name="request_time" class="layui-input" placeholder="请输入nginx 请求总耗时" value="{$Request.param.request_time|default='0.000'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">upstream 响应时间</label>
<div class="layui-input-block">
<input type="text" name="upstream_response_time" class="layui-input" placeholder="请输入upstream 响应时间" value="{$Request.param.upstream_response_time|default='0.000'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">总发送字节数(含 header</label>
<div class="layui-input-block">
<input type="text" name="bytes_sent" class="layui-input" placeholder="请输入总发送字节数(含 header" value="{$Request.param.bytes_sent|default='0'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">国家GeoIP 预留)</label>
<div class="layui-input-block">
<input type="text" name="country" class="layui-input" placeholder="请输入国家GeoIP 预留)" value="{$Request.param.country|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">省份GeoIP 预留)</label>
<div class="layui-input-block">
<input type="text" name="province" class="layui-input" placeholder="请输入省份GeoIP 预留)" value="{$Request.param.province|default=''}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">城市GeoIP 预留)</label>
<div class="layui-input-block">
<input type="text" name="city" class="layui-input" placeholder="请输入城市GeoIP 预留)" value="{$Request.param.city|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>