- 新增 Announcement 数据模型,支持公告的增删改查 - 后台管理新增"公告管理"Tab(创建/编辑/删除/启用禁用) - 客户端 /api/announcement 改为从数据库读取 - 账号服务重构,新增无感换号、自动分析等功能 - 新增后台任务调度器、数据库迁移脚本 - Schema/Service/Config 全面升级至 v2.1 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
from fastapi import FastAPI, Request
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.responses import HTMLResponse, FileResponse
|
|
from contextlib import asynccontextmanager
|
|
import os
|
|
import logging
|
|
|
|
from app.database import engine, Base
|
|
from app.api import client_router, admin_router
|
|
from app.tasks import start_scheduler, stop_scheduler, run_startup_tasks
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s [%(name)s] %(levelname)s: %(message)s"
|
|
)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
# 启动时创建数据库表
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
# 启动后台任务调度器
|
|
start_scheduler()
|
|
|
|
# 运行启动任务
|
|
await run_startup_tasks()
|
|
|
|
yield
|
|
|
|
# 关闭时停止调度器
|
|
stop_scheduler()
|
|
|
|
|
|
app = FastAPI(
|
|
title="蜂鸟Pro 管理后台",
|
|
description="蜂鸟Pro 账号管理系统 API v2.1",
|
|
version="2.1.0",
|
|
lifespan=lifespan
|
|
)
|
|
|
|
# CORS 配置
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# 静态文件
|
|
static_path = os.path.join(os.path.dirname(__file__), "..", "static")
|
|
if os.path.exists(static_path):
|
|
app.mount("/static", StaticFiles(directory=static_path), name="static")
|
|
|
|
# 模板路径
|
|
templates_path = os.path.join(os.path.dirname(__file__), "..", "templates")
|
|
|
|
# 注册路由
|
|
app.include_router(client_router)
|
|
app.include_router(admin_router)
|
|
|
|
|
|
@app.get("/", response_class=HTMLResponse)
|
|
async def index():
|
|
"""管理后台首页"""
|
|
index_file = os.path.join(templates_path, "index.html")
|
|
if os.path.exists(index_file):
|
|
return FileResponse(index_file, media_type="text/html")
|
|
return HTMLResponse(content="""
|
|
<html>
|
|
<head><title>CursorPro 管理后台</title></head>
|
|
<body>
|
|
<h1>CursorPro 管理后台</h1>
|
|
<p>请访问 <a href="/docs">/docs</a> 查看 API 文档</p>
|
|
</body>
|
|
</html>
|
|
""")
|
|
|
|
|
|
@app.get("/health")
|
|
async def health_check():
|
|
"""健康检查"""
|
|
return {"status": "ok"}
|