main.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """FastAPI 应用入口"""
  2. from contextlib import asynccontextmanager
  3. from fastapi import FastAPI
  4. from fastapi.middleware.cors import CORSMiddleware
  5. from app.core.config import settings
  6. from app.core.database import engine, SessionLocal
  7. from app.core.api_request_log_middleware import ApiRequestLogMiddleware
  8. from app.models import models # noqa: F401
  9. from app.api import (
  10. public_router,
  11. admin_router,
  12. deliver_router,
  13. mini_client_router,
  14. mini_client_extra_router,
  15. mini_common_router,
  16. mini_message_router,
  17. mini_supplier_router,
  18. delivery_router,
  19. mini_deliverer_router,
  20. upload_router,
  21. order_adjust_router,
  22. payment_router,
  23. attachment_router,
  24. invoice_router,
  25. system_config_router,
  26. delivery_warning_router,
  27. message_router,
  28. menu_router,
  29. system_router,
  30. product_banner_router,
  31. product_detail_media_router,
  32. product_parameter_router,
  33. category_parameter_router,
  34. product_parameter_value_router,
  35. product_review_router,
  36. mini_review_router,
  37. )
  38. @asynccontextmanager
  39. async def lifespan(app: FastAPI):
  40. """应用生命周期管理"""
  41. # 启动时执行
  42. from app.core import login_crypto
  43. login_crypto.ensure_initialized()
  44. from app.tasks import init_scheduled_tasks
  45. try:
  46. init_scheduled_tasks(SessionLocal)
  47. except Exception as e:
  48. import logging
  49. logging.warning(f"定时任务调度器启动失败: {e}")
  50. yield
  51. # 关闭时执行
  52. from app.tasks import shutdown_scheduler
  53. try:
  54. shutdown_scheduler()
  55. except Exception:
  56. pass
  57. app = FastAPI(
  58. title=settings.APP_NAME,
  59. description="叁强鲜配平台后端API",
  60. version="1.0.0",
  61. docs_url="/docs",
  62. redoc_url="/redoc",
  63. lifespan=lifespan
  64. )
  65. # CORS 跨域配置
  66. app.add_middleware(
  67. CORSMiddleware,
  68. allow_origins=settings.BACKEND_CORS_ORIGINS,
  69. allow_credentials=True,
  70. allow_methods=["*"],
  71. allow_headers=["*"],
  72. )
  73. app.add_middleware(ApiRequestLogMiddleware)
  74. # 注册路由
  75. app.include_router(public_router, prefix=settings.API_V1_PREFIX)
  76. app.include_router(admin_router, prefix=settings.API_V1_PREFIX)
  77. app.include_router(deliver_router, prefix=settings.API_V1_PREFIX)
  78. app.include_router(mini_client_router)
  79. app.include_router(mini_supplier_router)
  80. app.include_router(delivery_router, prefix=settings.API_V1_PREFIX)
  81. app.include_router(mini_deliverer_router)
  82. app.include_router(mini_client_extra_router)
  83. app.include_router(mini_common_router)
  84. app.include_router(mini_message_router)
  85. app.include_router(upload_router)
  86. app.include_router(order_adjust_router)
  87. app.include_router(payment_router)
  88. app.include_router(attachment_router)
  89. app.include_router(invoice_router)
  90. app.include_router(system_config_router)
  91. app.include_router(delivery_warning_router)
  92. app.include_router(message_router)
  93. app.include_router(menu_router, prefix=settings.API_V1_PREFIX)
  94. app.include_router(system_router, prefix=settings.API_V1_PREFIX)
  95. app.include_router(product_banner_router, prefix=settings.API_V1_PREFIX)
  96. app.include_router(product_detail_media_router, prefix=settings.API_V1_PREFIX)
  97. app.include_router(product_parameter_router, prefix=settings.API_V1_PREFIX)
  98. app.include_router(category_parameter_router, prefix=settings.API_V1_PREFIX)
  99. app.include_router(product_parameter_value_router, prefix=settings.API_V1_PREFIX)
  100. app.include_router(product_review_router, prefix=settings.API_V1_PREFIX)
  101. app.include_router(mini_review_router)
  102. @app.get("/")
  103. def root():
  104. """根路径"""
  105. return {
  106. "name": settings.APP_NAME,
  107. "version": "1.0.0",
  108. "docs": "/docs"
  109. }
  110. @app.get("/health")
  111. def health_check():
  112. """健康检查"""
  113. return {"status": "healthy"}