- 实现查询API (query.py): 支持star_id/unique_id/nickname三种查询方式 - 实现计算模块 (calculator.py): CPM/自然搜索UV/搜索成本计算 - 实现品牌API集成 (brand_api.py): 批量并发调用,10并发限制 - 实现导出服务 (export_service.py): Excel/CSV导出 - 前端组件: QueryForm/ResultTable/ExportButton - 主页面集成: 支持6种页面状态 - 测试: 44个测试全部通过,覆盖率88% Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
60 lines
1.4 KiB
Python
60 lines
1.4 KiB
Python
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from fastapi import APIRouter, Query
|
|
from fastapi.responses import StreamingResponse
|
|
from io import BytesIO
|
|
|
|
from app.services.export_service import generate_excel, generate_csv
|
|
|
|
router = APIRouter()
|
|
|
|
# 存储最近的查询结果 (简化实现, 生产环境应使用 Redis 等缓存)
|
|
_cached_data: list = []
|
|
|
|
|
|
def set_export_data(data: list):
|
|
"""设置导出数据缓存."""
|
|
global _cached_data
|
|
_cached_data = data
|
|
|
|
|
|
def get_export_data() -> list:
|
|
"""获取导出数据缓存."""
|
|
return _cached_data
|
|
|
|
|
|
@router.get("/export")
|
|
async def export_data(
|
|
format: Literal["xlsx", "csv"] = Query("xlsx", description="导出格式"),
|
|
):
|
|
"""
|
|
导出查询结果.
|
|
|
|
Args:
|
|
format: 导出格式 (xlsx 或 csv)
|
|
|
|
Returns:
|
|
文件下载响应
|
|
"""
|
|
data = get_export_data()
|
|
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
|
|
if format == "xlsx":
|
|
content = generate_excel(data)
|
|
media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
filename = f"kol_data_{timestamp}.xlsx"
|
|
else:
|
|
content = generate_csv(data)
|
|
media_type = "text/csv; charset=utf-8"
|
|
filename = f"kol_data_{timestamp}.csv"
|
|
|
|
return StreamingResponse(
|
|
BytesIO(content),
|
|
media_type=media_type,
|
|
headers={
|
|
"Content-Disposition": f'attachment; filename="{filename}"',
|
|
},
|
|
)
|