astock-agent/backend/app/main.py
2026-04-16 16:40:56 +08:00

95 lines
2.6 KiB
Python

"""A 股分析推荐 Agent - FastAPI 入口"""
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.config import settings
from app.db.database import init_db
from app.engine.scheduler import start_scheduler, stop_scheduler
from app.api import market, sectors, recommendations, stocks, websocket, chat, auth
logging.basicConfig(
level=logging.DEBUG if settings.debug else logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger(__name__)
async def ensure_admin_exists():
"""如果没有管理员用户,自动创建默认管理员"""
from sqlalchemy import select, insert
from app.db.database import get_db
from app.db.tables import users_table
from app.core.auth import hash_password
async with get_db() as db:
result = await db.execute(
select(users_table).where(users_table.c.role == "admin")
)
if result.first() is None:
await db.execute(
insert(users_table).values(
username=settings.admin_username,
password_hash=hash_password(settings.admin_password),
role="admin",
is_active=True,
)
)
await db.commit()
logger.info(f"默认管理员用户 '{settings.admin_username}' 已创建")
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动
logger.info("A 股分析推荐 Agent 启动中...")
await init_db()
logger.info("数据库初始化完成")
await ensure_admin_exists()
start_scheduler()
logger.info("调度器已启动")
yield
# 关闭
stop_scheduler()
logger.info("服务已关闭")
app = FastAPI(
title="A 股分析推荐 Agent",
description="基于资金驱动的四层漏斗模型,盘中实时分析推荐 A 股",
version="1.0.0",
lifespan=lifespan,
)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=[settings.frontend_url, "http://localhost:3002"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 路由
app.include_router(market.router)
app.include_router(sectors.router)
app.include_router(recommendations.router)
app.include_router(stocks.router)
app.include_router(chat.router)
app.include_router(auth.router)
# WebSocket
app.websocket("/ws")(websocket.ws_endpoint)
@app.get("/api/health")
async def health():
return {
"status": "ok",
"service": "astock-agent",
"llm_enabled": bool(settings.deepseek_api_key),
}