//! 数据导出:Axum 流式路由(大文件不走 JSON 序列化)。 //! //! 鉴权镜像 [`crate::api::upload`]:从 cookie 取 session,校验管理员。 //! 两种来源:按表导出(表名白名单)/ 按查询导出(强制只读,AST 校验)。 //! 两种格式:CSV(COPY TO STDOUT 流式)/ SQL(逐行拼 INSERT)。 #![allow(clippy::unused_unit)] use axum::body::Body; use axum::extract::Query; use axum::http::{header, HeaderMap, StatusCode}; use axum::response::IntoResponse; use futures::StreamExt; use serde::Deserialize; use crate::auth::session::parse_session_token; #[derive(Deserialize)] pub struct ExportParams { /// `table:` 或 `query: