column('id', 'ID')->sortable(); // 关联服务 $grid->column('service.name', '服务名称')->sortable(); $grid->column('service.code', '服务代码'); $grid->column('request_id', '请求ID')->copyable(); // HTTP方法 $grid->column('method', '方法')->display(function ($method) { $colors = [ 'GET' => 'success', 'POST' => 'primary', 'PUT' => 'warning', 'DELETE' => 'danger', 'PATCH' => 'info', ]; $color = $colors[$method] ?? 'secondary'; return "{$method}"; }); // URL(截断显示) $grid->column('url', 'URL')->display(function ($url) { $shortUrl = strlen($url) > 50 ? substr($url, 0, 50) . '...' : $url; return "{$shortUrl}"; }); // 响应状态码 $grid->column('response_status', '状态码')->display(function ($status) { if (!$status) { return '-'; } $color = 'secondary'; if ($status >= 200 && $status < 300) { $color = 'success'; } elseif ($status >= 300 && $status < 400) { $color = 'info'; } elseif ($status >= 400 && $status < 500) { $color = 'warning'; } elseif ($status >= 500) { $color = 'danger'; } return "{$status}"; }); // 响应时间 $grid->column('response_time', '响应时间')->display(function ($time) { if (!$time) { return '-'; } $color = 'success'; if ($time > 5000) { $color = 'danger'; } elseif ($time > 2000) { $color = 'warning'; } elseif ($time > 1000) { $color = 'info'; } return "{$time}ms"; })->sortable(); // 日志级别 $grid->column('level', '级别')->display(function ($level) { $logLevel = LOG_LEVEL::tryFrom($level); if ($logLevel) { $color = $logLevel->getColor(); $icon = $logLevel->getIcon(); $label = $logLevel->getLabel(); return " {$label}"; } return $level; }); // 错误信息(截断显示) $grid->column('error_message', '错误信息')->display(function ($error) { if (!$error) { return '-'; } $shortError = strlen($error) > 30 ? substr($error, 0, 30) . '...' : $error; return "{$shortError}"; }); // 用户信息 $grid->column('user_id', '用户ID'); $grid->column('ip_address', 'IP地址'); // 创建时间 $grid->column('created_at', '调用时间')->sortable(); // 过滤器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('service_id', '服务')->select( ThirdPartyService::pluck('name', 'id')->toArray() ); $filter->equal('method', 'HTTP方法')->select([ 'GET' => 'GET', 'POST' => 'POST', 'PUT' => 'PUT', 'DELETE' => 'DELETE', 'PATCH' => 'PATCH', ]); $filter->equal('level', '日志级别')->select(LOG_LEVEL::getOptions()); $filter->between('response_status', '状态码'); $filter->between('response_time', '响应时间(ms)'); $filter->like('request_id', '请求ID'); $filter->like('url', 'URL'); $filter->like('error_message', '错误信息'); $filter->equal('user_id', '用户ID'); $filter->like('ip_address', 'IP地址'); $filter->between('created_at', '调用时间')->datetime(); }); // 批量操作 $grid->batchActions(function (Grid\Tools\BatchActions $batch) { // TODO: 创建批量操作类 // $batch->add('批量删除', new \App\Module\ThirdParty\AdminActions\BatchDeleteLogAction()); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append(' 统计分析'); $tools->append(' 导出日志'); $tools->append(' 清理日志'); }); // 行操作 $grid->actions(function (Grid\Displayers\Actions $actions) { // 移除编辑按钮,日志只读 $actions->disableEdit(); if ($actions->row->error_message) { $actions->append(' 重试'); } }); // 默认排序(最新的在前) $grid->model()->orderBy('created_at', 'desc'); // 禁用创建按钮 $grid->disableCreateButton(); }); } /** * 详情页面 * * @return Show */ protected function detail($id): Show { return Show::make($id, new ThirdPartyLogRepository(), function (Show $show) { $show->field('id', 'ID'); $show->field('service.name', '服务名称'); $show->field('service.code', '服务代码'); $show->field('credential.name', '使用凭证'); $show->field('request_id', '请求ID'); $show->field('method', 'HTTP方法'); $show->field('url', '请求URL'); $show->field('headers', '请求头')->json(); $show->field('params', '请求参数')->json(); $show->field('body', '请求体')->code(); $show->field('response_status', '响应状态码'); $show->field('response_headers', '响应头')->json(); $show->field('response_body', '响应体')->code(); $show->field('response_time', '响应时间')->as(function ($time) { return $time ? $time . ' ms' : '-'; }); $show->field('level', '日志级别')->as(function ($level) { $logLevel = LOG_LEVEL::tryFrom($level); return $logLevel ? $logLevel->getLabel() : $level; }); $show->field('error_message', '错误信息'); $show->field('user_id', '用户ID'); $show->field('ip_address', 'IP地址'); $show->field('user_agent', 'User Agent'); $show->field('created_at', '调用时间'); // 相关日志 $show->relation('relatedLogs', '相关日志', function ($model) { $grid = new Grid(new ThirdPartyLog()); $grid->model()->where('service_id', $model->service_id) ->where('id', '!=', $model->id) ->orderBy('created_at', 'desc') ->limit(10); $grid->column('request_id', '请求ID'); $grid->column('method', '方法'); $grid->column('response_status', '状态码'); $grid->column('response_time', '响应时间(ms)'); $grid->column('level', '级别'); $grid->column('created_at', '时间'); $grid->disableCreateButton(); $grid->disableActions(); $grid->disableFilter(); $grid->disableBatchActions(); return $grid; }); }); } }