from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from packages.core.logger import app_logger # 我们将之前写好的 trade 接口引入 from apps.api.routers import trade, entity, export, subscription, bi, health # 获取项目根目录 BASE_DIR = Path(__file__).resolve().parent.parent.parent STATIC_DIR = BASE_DIR / "apps" / "api" / "static" @asynccontextmanager async def lifespan(app: FastAPI): # 启动时初始化 app_logger.info("Initializing API Service...") yield # 关闭时 app_logger.info("Closing API Service...") app = FastAPI( title="Customs Data API", description="海关数据查询服务 API", version="1.0.0", lifespan=lifespan ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 挂载静态文件 app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static") @app.get("/", tags=["UI"]) async def serve_ui(): return FileResponse(str(STATIC_DIR / "index.html")) @app.get("/api/v1/health", tags=["System"]) async def health_check(): return {"status": "ok", "service": "Customs Data API"} app.include_router(health.router, prefix="/api/v1/health", tags=["Health"]) app.include_router(trade.router, prefix="/api/v1/trade", tags=["Trade Search"]) app.include_router(entity.router, prefix="/api/v1/entity", tags=["Entity Search"]) app.include_router(export.router, prefix="/api/v1/export", tags=["Export"]) app.include_router(subscription.router, prefix="/api/v1/subscription", tags=["Subscription"]) app.include_router(bi.router, prefix="/api/v1/bi", tags=["BI Dashboard"])