from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee, ai, community_set, community_set_mapping, community_profit_sharing, partner, health, scheduler, statistics from app.models.database import Base, engine from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse from app.core.response import error_response from fastapi import HTTPException from app.middleware.request_logger import RequestLoggerMiddleware from app.core.response import CustomJSONResponse import logging from app.core.config import settings from app.core.wecombot import WecomBot from app.api.endpoints import wecom from app.api.endpoints import feedback from starlette.middleware.sessions import SessionMiddleware import os from app.core.db_monitor import setup_db_monitor from app.tasks import init_scheduler from contextlib import asynccontextmanager # 创建数据库表 Base.metadata.create_all(bind=engine) # 定义应用生命周期上下文管理器 @asynccontextmanager async def lifespan(app: FastAPI): # 启动时执行 # 初始化并启动任务调度器 init_scheduler() yield # 应用运行期间 # 关闭时执行 # 关闭任务调度器 from app.core.scheduler import scheduler scheduler.shutdown() app = FastAPI( title="Beefast 蜂快到家", description="API 文档", version="1.0.0", docs_url="/docs" if settings.DEBUG else None, lifespan=lifespan # 使用lifespan上下文管理器 ) # 设置数据库连接监控 setup_db_monitor(app) app.default_response_class = CustomJSONResponse # 配置 CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 添加请求日志中间件 app.add_middleware(RequestLoggerMiddleware) app.add_middleware(SessionMiddleware, secret_key=settings.SECRET_KEY) # 添加定时任务路由 app.include_router(scheduler.router, prefix="/api/scheduler", tags=["定时任务管理"]) # 添加其他路由 app.include_router(ai.router, prefix="/api/ai", tags=["AI服务"]) app.include_router(dashboard.router, prefix="/api/dashboard", tags=["仪表盘"]) app.include_router(wechat.router,prefix="/api/wechat",tags=["微信"]) app.include_router(mp.router, prefix="/api/mp", tags=["微信公众号"]) app.include_router(wecom.router, prefix="/api/wecom", tags=["企业微信"]) app.include_router(partner.router, prefix="/api/partner", tags=["合伙人"]) app.include_router(user.router, prefix="/api/user", tags=["用户"]) app.include_router(bank_card.router, prefix="/api/bank-cards", tags=["用户银行卡"]) app.include_router(withdraw.router, prefix="/api/withdraw", tags=["提现"]) app.include_router(point.router, prefix="/api/point", tags=["用户积分"]) app.include_router(point_product.router, prefix="/api/point-products", tags=["积分商品"]) app.include_router(point_product_order.router, prefix="/api/point-product-orders", tags=["积分商品订单"]) app.include_router(account.router, prefix="/api/account", tags=["账户"]) app.include_router(address.router, prefix="/api/address", tags=["配送地址"]) app.include_router(community.router, prefix="/api/community", tags=["社区"]) app.include_router(community_set.router, prefix="/api/community-sets", tags=["社区集合"]) app.include_router(community_set_mapping.router, prefix="/api/community-set-mappings", tags=["社区集合映射"]) app.include_router(community_profit_sharing.router, prefix="/api/community-profit-sharings", tags=["社区分润"]) app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"]) app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"]) app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"]) app.include_router(station.router, prefix="/api/station", tags=["驿站"]) app.include_router(order.router, prefix="/api/order", tags=["订单"]) app.include_router(order_additional_fee.router, prefix="/api/order-additional-fee", tags=["订单加价"]) app.include_router(coupon.router, prefix="/api/coupon", tags=["抵扣券"]) app.include_router(coupon_activity.router, prefix="/api/coupon-activities", tags=["抵扣券活动"]) app.include_router(merchant.router, prefix="/api/merchant", tags=["商家"]) app.include_router(merchant_category.router, prefix="/api/merchant-categories", tags=["商家分类"]) app.include_router(merchant_product.router, prefix="/api/merchant/product", tags=["商家产品"]) app.include_router(merchant_order.router, prefix="/api/merchant/order", tags=["商家订单"]) app.include_router(merchant_pay_order.router,prefix="/api/merchant-pay",tags=["商家在线买单"]) app.include_router(message.router, prefix="/api/message", tags=["消息中心"]) app.include_router(upload.router, prefix="/api/upload", tags=["文件上传"]) app.include_router(config.router, prefix="/api/config", tags=["系统配置"]) app.include_router(log.router, prefix="/api/logs", tags=["系统日志"]) app.include_router(feedback.router, prefix="/api/feedback", tags=["反馈"]) app.include_router(health.router, prefix="/api/health", tags=["系统健康检查"]) app.include_router(statistics.router, prefix="/api/statistics", tags=["统计数据"]) @app.get("/") async def root(): return {"message": "欢迎使用 Beefast 蜂快到家 API"} @app.exception_handler(Exception) async def exception_handler(request, exc): env = "测试环境" if settings.DEBUG else "生产环境" logging.exception(f"【{env}】API异常: {str(exc)}") # 发送企业微信消息 wecom_bot = WecomBot(settings.URL_WECOMBOT_SYS_EXCEPTION) env = os.getenv("APP_ENV", "dev").lower() exception_log = f"""{env}环境**API异常** **请求信息** > 请求方法:{request.method} > 请求URL:{request.url} > 请求体:{request.body} **异常信息** {str(exc)} """ await wecom_bot.send_markdown(exception_log) return CustomJSONResponse( status_code=500, content={ "code": 500, "message": str(exc) } )