"""电商套图工作台 - FastAPI 入口。""" from __future__ import annotations import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from api import collection, generate, products, proxy, suites from config import get_settings from db import init_db from services.storage import media_root logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s") @asynccontextmanager async def lifespan(app: FastAPI): await init_db() yield app = FastAPI(title="电商套图工作台", version="0.1.0", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["*"], # 插件 background 无 CORS 限制,这里兜底 allow_methods=["*"], allow_headers=["*"], ) app.include_router(collection.router) app.include_router(products.router) app.include_router(suites.router) app.include_router(generate.router) app.include_router(proxy.router) # 静态托管生成的图片/转存素材 app.mount("/media", StaticFiles(directory=str(media_root())), name="media") @app.get("/api/health") async def health(): settings = get_settings() return { "ok": True, "provider": settings.image_provider, "ark_configured": bool(settings.ark_api_key), "dashscope_configured": bool(settings.dashscope_api_key), } if __name__ == "__main__": import uvicorn settings = get_settings() uvicorn.run("main:app", host=settings.host, port=settings.port, reload=False)