Files
2026-06-14 10:01:47 +08:00

94 lines
3.3 KiB
Python

"""青叶 - 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, moments, leaves, trees, capsules, echoes, sync, climates, flash, garden
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=["上传"])
app.include_router(moments.router, prefix="/api/v1/moments", tags=["朋友圈"])
app.include_router(leaves.router, prefix="/api/v1/leaves", tags=["心情叶"])
app.include_router(trees.router, prefix="/api/v1/trees", tags=["好友之树"])
app.include_router(capsules.router, prefix="/api/v1/capsules", tags=["时光胶囊"])
app.include_router(echoes.router, prefix="/api/v1/echoes", tags=["念念回音"])
app.include_router(sync.router, prefix="/api/v1/sync", tags=["默契种子"])
app.include_router(climates.router, prefix="/api/v1/climates", tags=["聊天气候"])
app.include_router(flash.router, prefix="/api/v1/flash", tags=["萤火虫时刻"])
app.include_router(garden.router, prefix="/api/v1/garden", 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"}