jiachenlong/backend/app/main.py

116 lines
3.5 KiB
Python
Raw Normal View History

2026-03-23 11:08:52 +08:00
# FastAPI 应用入口
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from app.core.database import engine, Base
from app.core.logging_config import logger, setup_logging
from app.core.error_handler import setup_error_handlers
from app.middleware.logging import logging_middleware
from app.routers import auth, collections, operations
from app.routers import ocr as ocr_router
from app.routers import users as users_router
from app.routers import information as information_router
2026-04-15 21:42:52 +08:00
from app.routers import yichens as yichens_router
from app.routers import seek as seek_router
from app.routers import deal as deal_router
2026-03-23 11:08:52 +08:00
# 版本信息 - 从 config/VERSION 文件读取
def get_version():
"""从 config/VERSION 文件读取版本号"""
try:
version_file = Path(__file__).parent.parent.parent / "config" / "VERSION"
if version_file.exists():
with open(version_file, 'r', encoding='utf-8') as f:
for line in f:
if line.startswith('VERSION='):
return line.strip().split('=', 1)[1]
except Exception as e:
logger.error(f"读取 VERSION 文件失败:{e}")
return "0.0.0" # 默认版本号
__version__ = get_version()
__app_name__ = "甲辰收藏系统 FastAPI 后端"
# 启动时创建数据库表
Base.metadata.create_all(bind=engine)
# 初始化日志系统
setup_logging()
logger.info(f"{__app_name__} v{__version__} 启动成功")
# 创建 FastAPI 应用
app = FastAPI(
title=__app_name__,
version=__version__,
description="生肖纪念钞收藏管理系统后端 API"
)
# 设置全局错误处理器
setup_error_handlers(app)
2026-04-15 21:42:52 +08:00
# CORS 配置 - 生产环境限制域名
ALLOWED_ORIGINS = os.getenv("ALLOWED_ORIGINS", "http://47.103.29.111,http://120.55.81.21,https://socoolbot.com").split(",")
2026-03-23 11:08:52 +08:00
app.add_middleware(
CORSMiddleware,
2026-04-15 21:42:52 +08:00
allow_origins=ALLOWED_ORIGINS,
2026-03-23 11:08:52 +08:00
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 挂载静态文件目录(图片上传和项目静态资源)
uploads_dir = "uploads"
os.makedirs(uploads_dir, exist_ok=True)
app.mount("/uploads", StaticFiles(directory=uploads_dir), name="uploads")
2026-04-15 21:42:52 +08:00
# 挂载项目静态资源目录
static_dir = Path(__file__).parent.parent / "static"
if static_dir.exists():
app.mount("/static", StaticFiles(directory=str(static_dir)), name="static")
2026-03-23 11:08:52 +08:00
# 添加日志中间件
app.middleware("http")(logging_middleware)
# 注册路由
app.include_router(auth.router)
app.include_router(collections.router)
app.include_router(operations.router)
app.include_router(ocr_router.router) # OCR 识别
app.include_router(users_router.router) # 当前用户接口
app.include_router(users_router.admin_router) # 管理员用户管理
2026-04-15 21:42:52 +08:00
app.include_router(information_router.router)
app.include_router(yichens_router.router) # 一尘看板
app.include_router(seek_router.router) # 寻配号
app.include_router(deal_router.router) # 成交行情
2026-03-23 11:08:52 +08:00
@app.get("/")
def root():
"""根路径"""
return {
"name": __app_name__,
"version": __version__,
"status": "running"
}
@app.get("/health")
def health_check():
"""健康检查"""
return {"status": "healthy"}
if __name__ == "__main__":
import uvicorn
port = int(os.getenv("PORT", "3000"))
uvicorn.run(app, host="0.0.0.0", port=port)
2026-04-15 21:42:52 +08:00
from app.routers import seek as seek_router
from app.routers import deal as deal_router