This commit is contained in:
2026-02-17 13:55:30 +08:00
parent f90afaddca
commit 6623c656f4
17 changed files with 1464 additions and 569 deletions

View File

@@ -48,7 +48,7 @@ class LogService
*/
protected function buildQuery(array $params)
{
$query = Log::query()->with('user:id,name,username');
$query = Log::query()->with('user:id,username');
if (!empty($params['user_id'])) {
$query->where('user_id', $params['user_id']);
@@ -108,6 +108,14 @@ class LogService
{
$query = Log::query();
if (!empty($params['method'])) {
$query->where('method', $params['method']);
}
if (!empty($params['status'])) {
$query->where('status', $params['status']);
}
if (!empty($params['start_date']) && !empty($params['end_date'])) {
$query->whereBetween('created_at', [$params['start_date'], $params['end_date']]);
}
@@ -116,10 +124,74 @@ class LogService
$successCount = (clone $query)->where('status', 'success')->count();
$errorCount = (clone $query)->where('status', 'error')->count();
// 计算平均响应时间
$avgTime = (clone $query)->avg('execution_time');
$avgTime = $avgTime ? round($avgTime, 2) : 0;
return [
'total' => $total,
'success' => $successCount,
'error' => $errorCount,
'avg_time' => $avgTime,
];
}
/**
* 导出日志
*
* @param array $params
* @return string
*/
public function export(array $params): string
{
$query = $this->buildQuery($params);
$query->orderBy('created_at', 'desc');
$logs = $query->limit(10000)->get();
// 创建导出数据
$data = [];
foreach ($logs as $log) {
$data[] = [
'ID' => $log->id,
'用户名' => $log->username,
'模块' => $log->module,
'操作' => $log->action,
'请求方式' => $log->method,
'URL' => $log->url,
'IP地址' => $log->ip,
'状态码' => $log->status_code,
'状态' => $log->status === 'success' ? '成功' : '失败',
'执行时间' => $log->execution_time . 'ms',
'创建时间' => $log->created_at,
];
}
// 生成CSV文件
$filename = '系统日志_' . date('YmdHis') . '.csv';
$filepath = storage_path('app/exports/' . $filename);
// 确保目录存在
if (!file_exists(dirname($filepath))) {
mkdir(dirname($filepath), 0755, true);
}
$file = fopen($filepath, 'w');
// 添加BOM以支持Excel中文显示
fprintf($file, chr(0xEF) . chr(0xBB) . chr(0xBF));
// 写入表头
if (!empty($data)) {
fputcsv($file, array_keys($data[0]));
// 写入数据
foreach ($data as $row) {
fputcsv($file, $row);
}
}
fclose($file);
return $filepath;
}
}