diff --git a/app/ExceptionHandle.php b/app/ExceptionHandle.php index 453d1260..aedff888 100644 --- a/app/ExceptionHandle.php +++ b/app/ExceptionHandle.php @@ -51,6 +51,7 @@ class ExceptionHandle extends Handle public function render($request, Throwable $e): Response { // 添加自定义异常处理机制 + $request->exception_info = $e; // 其他错误交给系统处理 return parent::render($request, $e); diff --git a/app/admin/middleware.php b/app/admin/middleware.php index afc74238..f95978a6 100644 --- a/app/admin/middleware.php +++ b/app/admin/middleware.php @@ -4,4 +4,5 @@ return [ // 登录验证 app\admin\middleware\v1\Auth::class, app\admin\middleware\v1\RequestId::class, + app\admin\middleware\v1\OperateLog::class, ]; diff --git a/app/admin/middleware/v1/OperateLog.php b/app/admin/middleware/v1/OperateLog.php new file mode 100644 index 00000000..d4797880 --- /dev/null +++ b/app/admin/middleware/v1/OperateLog.php @@ -0,0 +1,53 @@ + $request->uid, + 'title' => '操作日志', + 'version' => $request->layer(), + 'method' => $request->method(), + 'controller' => $request->controller(base: true), + 'action' => $request->action(), + 'url' => $request->url(), + 'ip' => $request->ip(), + 'params' => json_encode($request->param()), + 'status' => $response->getCode() + ]; + + if (empty($request->exception_info)) { + // 记录正常返回信息 + $contentDisposition = $response->getHeader('Content-Disposition'); + if (!empty($contentDisposition) && \think\helper\Str::startsWith($contentDisposition, 'attachment')) { + $log['message'] = $contentDisposition; + } else { + $log['message'] = $response->getData(); + if (is_array($log['message'])) { + $log['message'] = json_encode($log['message'], JSON_UNESCAPED_UNICODE); + } + } + } else { + // 记录异常返回信息 + $log['message'] = (string)$request->exception_info; + } + SysOperateLog::create($log); + + return $response; + } +} diff --git a/app/admin/model/v1/SysOperateLog.php b/app/admin/model/v1/SysOperateLog.php new file mode 100644 index 00000000..3c1bcdc3 --- /dev/null +++ b/app/admin/model/v1/SysOperateLog.php @@ -0,0 +1,35 @@ + 'int', + 'user_id' => 'int', + 'title' => 'string', + 'version' => 'string', + 'method' => 'string', + 'controller' => 'string', + 'action' => 'string', + 'url' => 'string', + 'ip' => 'string', + 'params' => 'string', + 'status' => 'int', + 'message' => 'string', + 'created_at' => 'datetime' + ]; +} diff --git a/database/migrations/20241230082139_create_sys_operate_log.php b/database/migrations/20241230082139_create_sys_operate_log.php index 1c526d98..429b70b9 100644 --- a/database/migrations/20241230082139_create_sys_operate_log.php +++ b/database/migrations/20241230082139_create_sys_operate_log.php @@ -1,5 +1,6 @@ table('sys_operate_log', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '操作日志表']); $table->addColumn('user_id', 'integer', ['limit' => 11, 'default' => 0, 'comment' => '用户ID']) ->addColumn('title', 'string', ['limit' => 50, 'default' => '', 'comment' => '标题']) + ->addColumn('version', 'string', ['limit' => 15, 'default' => '', 'comment' => '版本']) + ->addColumn('method', 'string', ['limit' => 10, 'default' => '', 'comment' => '请求方式']) ->addColumn('controller', 'string', ['limit' => 50, 'default' => '', 'comment' => '控制器']) ->addColumn('action', 'string', ['limit' => 50, 'default' => '', 'comment' => '方法']) ->addColumn('url', 'string', ['limit' => 255, 'default' => '', 'comment' => 'URL']) ->addColumn('ip', 'string', ['limit' => 50, 'default' => '', 'comment' => 'IP']) - ->addColumn('method', 'string', ['limit' => 10, 'default' => '', 'comment' => '请求方式']) ->addColumn('params', 'text', ['comment' => '请求参数']) - ->addColumn('status', 'boolean', ['limit' => 1, 'default' => 1, 'comment' => '状态 1成功 0失败']) - ->addColumn('message', 'string', ['limit' => 255, 'default' => '', 'comment' => '消息']) + ->addColumn('status', MysqlAdapter::PHINX_TYPE_SMALL_INTEGER, ['limit' => 5, 'default' => 200, 'comment' => '状态码']) + ->addColumn('message', MysqlAdapter::PHINX_TYPE_TEXT, ['default' => null, 'comment' => '消息']) ->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间']) ->create(); }