"""青叶 - FastAPI 应用入口""" from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from app.config import settings import os @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期:启动和关闭""" # 启动时 print("🌿 青叶后端启动中...") # 确保上传目录存在 os.makedirs(settings.UPLOAD_DIR, exist_ok=True) # 初始化数据库表(开发阶段用,生产用 Alembic 迁移) from app.database import engine, Base async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) print("📦 数据库表已创建") # 初始化系统配置 from app.database import async_session async with async_session() as db: from app.services.admin_service import AdminService admin_service = AdminService(db) await admin_service.init_system_config() await db.commit() print("⚙️ 系统配置已初始化") print("🚀 青叶后端启动完成!") yield # 关闭时 print("🌿 青叶后端关闭") from app.database import engine await engine.dispose() app = FastAPI( title="青叶 - QingYe", description="青叶社交聊天应用后端 API", version="0.1.0", lifespan=lifespan, ) # CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=settings.CORS_ORIGINS.split(","), allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 静态文件(上传的文件) app.mount("/uploads", StaticFiles(directory=settings.UPLOAD_DIR), name="uploads") # 注册路由 from app.routers import auth, users, conversations, messages, friends, admin, uploads app.include_router(auth.router, prefix="/api/v1/auth", tags=["认证"]) app.include_router(users.router, prefix="/api/v1/users", tags=["用户"]) app.include_router(conversations.router, prefix="/api/v1/conversations", tags=["会话"]) app.include_router(messages.router, prefix="/api/v1/conversations", tags=["消息"]) app.include_router(friends.router, prefix="/api/v1/friends", tags=["好友"]) app.include_router(admin.router, prefix="/api/v1/admin", tags=["管理"]) app.include_router(uploads.router, prefix="/api/v1/uploads", tags=["上传"]) # WebSocket from app.websocket.router import websocket_router app.include_router(websocket_router) @app.get("/") async def root(): return {"name": "青叶 QingYe", "version": "0.1.0", "status": "running"}