first commit

This commit is contained in:
jeremygan2021
2025-11-16 17:21:25 +08:00
commit a2682dc040
46 changed files with 5976 additions and 0 deletions

111
main.py Normal file
View File

@@ -0,0 +1,111 @@
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
import os
from config import settings
from database import init_db
from mqtt_manager import mqtt_manager
from api import api_router
from admin_routes import admin_router
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时执行
logger.info("正在启动墨水屏桌面屏幕系统服务端...")
# 初始化数据库
try:
init_db()
logger.info("数据库初始化完成")
except Exception as e:
logger.error(f"数据库初始化失败: {str(e)}")
# 连接MQTT代理
try:
mqtt_manager.connect()
logger.info("MQTT连接已启动")
except Exception as e:
logger.error(f"MQTT连接失败: {str(e)}")
# 确保静态文件目录存在
os.makedirs(settings.static_dir, exist_ok=True)
yield
# 关闭时执行
logger.info("正在关闭墨水屏桌面屏幕系统服务端...")
# 断开MQTT连接
mqtt_manager.disconnect()
logger.info("MQTT连接已断开")
# 创建FastAPI应用
app = FastAPI(
title=settings.app_name,
description="基于 FastAPI + MQTT + HTTP/HTTPS + NTP 的轻量级墨水屏显示系统服务端",
version="1.0.0",
lifespan=lifespan
)
# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 在生产环境中应该设置具体的允许来源
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 挂载静态文件
app.mount("/static", StaticFiles(directory=settings.static_dir), name="static")
# 注册API路由
app.include_router(api_router)
# 包含管理后台路由
app.include_router(admin_router, prefix="/admin", tags=["管理后台"])
# 根路径
@app.get("/")
async def root():
return {
"message": "墨水屏桌面屏幕系统服务端",
"version": "1.0.0",
"docs": "/docs",
"redoc": "/redoc"
}
# 健康检查
@app.get("/health")
async def health_check():
return {
"status": "healthy",
"mqtt_connected": mqtt_manager.connected
}
# 中间件:记录请求日志
@app.middleware("http")
async def log_requests(request: Request, call_next):
logger.info(f"请求: {request.method} {request.url}")
response = await call_next(request)
logger.info(f"响应状态码: {response.status_code}")
return response
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=9999,
reload=settings.debug
)