"""FastAPI 应用入口""" from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.core.config import settings from app.core.database import engine, SessionLocal from app.core.api_request_log_middleware import ApiRequestLogMiddleware from app.models import models # noqa: F401 from app.api import ( public_router, admin_router, deliver_router, mini_client_router, mini_client_extra_router, mini_common_router, mini_message_router, mini_supplier_router, delivery_router, mini_deliverer_router, upload_router, order_adjust_router, payment_router, attachment_router, invoice_router, system_config_router, delivery_warning_router, message_router, menu_router, system_router, product_banner_router, product_detail_media_router, product_parameter_router, category_parameter_router, product_parameter_value_router, product_review_router, mini_review_router, ) @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期管理""" # 启动时执行 from app.core import login_crypto login_crypto.ensure_initialized() from app.tasks import init_scheduled_tasks try: init_scheduled_tasks(SessionLocal) except Exception as e: import logging logging.warning(f"定时任务调度器启动失败: {e}") yield # 关闭时执行 from app.tasks import shutdown_scheduler try: shutdown_scheduler() except Exception: pass app = FastAPI( title=settings.APP_NAME, description="叁强鲜配平台后端API", version="1.0.0", docs_url="/docs", redoc_url="/redoc", lifespan=lifespan ) # CORS 跨域配置 app.add_middleware( CORSMiddleware, allow_origins=settings.BACKEND_CORS_ORIGINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(ApiRequestLogMiddleware) # 注册路由 app.include_router(public_router, prefix=settings.API_V1_PREFIX) app.include_router(admin_router, prefix=settings.API_V1_PREFIX) app.include_router(deliver_router, prefix=settings.API_V1_PREFIX) app.include_router(mini_client_router) app.include_router(mini_supplier_router) app.include_router(delivery_router, prefix=settings.API_V1_PREFIX) app.include_router(mini_deliverer_router) app.include_router(mini_client_extra_router) app.include_router(mini_common_router) app.include_router(mini_message_router) app.include_router(upload_router) app.include_router(order_adjust_router) app.include_router(payment_router) app.include_router(attachment_router) app.include_router(invoice_router) app.include_router(system_config_router) app.include_router(delivery_warning_router) app.include_router(message_router) app.include_router(menu_router, prefix=settings.API_V1_PREFIX) app.include_router(system_router, prefix=settings.API_V1_PREFIX) app.include_router(product_banner_router, prefix=settings.API_V1_PREFIX) app.include_router(product_detail_media_router, prefix=settings.API_V1_PREFIX) app.include_router(product_parameter_router, prefix=settings.API_V1_PREFIX) app.include_router(category_parameter_router, prefix=settings.API_V1_PREFIX) app.include_router(product_parameter_value_router, prefix=settings.API_V1_PREFIX) app.include_router(product_review_router, prefix=settings.API_V1_PREFIX) app.include_router(mini_review_router) @app.get("/") def root(): """根路径""" return { "name": settings.APP_NAME, "version": "1.0.0", "docs": "/docs" } @app.get("/health") def health_check(): """健康检查""" return {"status": "healthy"}