Files
yu-zhi-ran/platform/backend/app/main.py
T

66 lines
2.2 KiB
Python

import logging
from fastapi import FastAPI, Depends, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from sqlalchemy.orm import Session
from datetime import datetime
from pathlib import Path
import os
from .database import engine, get_db, init_db
from .models import Base
from .api import topics, system, articles, publisher
from .initial_data import import_topics_from_json
app = FastAPI(title="宇之然内容创作平台", version="0.1.0")
logger = logging.getLogger(__name__)
# CORS - 生产环境应限制 origins
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # TODO: 生产环境改为具体域名
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 初始化数据库
Base.metadata.create_all(bind=engine)
init_db()
import_topics_from_json() # 首次自动导入
# 注册路由
app.include_router(topics.router)
app.include_router(system.router)
app.include_router(articles.router)
app.include_router(publisher.router)
# 挂载前端静态文件
FRONTEND_DIR = Path(__file__).parent.parent.parent / "frontend"
STATIC_DIR = FRONTEND_DIR / "static"
# 检查前端文件是否存在,若不存在下载Element Plus等依赖
if not FRONTEND_DIR.exists():
FRONTEND_DIR.mkdir(parents=True, exist_ok=True)
logger = logging.getLogger(__name__)
logger.warning(f"Frontend dir not found: {FRONTEND_DIR}, will serve API only")
# 默认静态文件服务(若前端存在)
if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
app.mount("/", StaticFiles(directory=str(FRONTEND_DIR), html=True), name="frontend")
if STATIC_DIR.exists():
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
logging.getLogger(__name__).info(f"Frontend mounted at / from {FRONTEND_DIR}")
else:
@app.get("/")
def root():
return {
"service": "宇之然内容创作平台 API",
"version": "0.1.0",
"docs": "/docs",
"frontend_missing": str(FRONTEND_DIR)
}
if __name__ == "__main__":
import uvicorn
uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)