"""AirLabs Project —— 主入口""" from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from database import engine, Base from models import User, UserRole, PhaseGroup from auth import hash_password import os # 创建所有表 Base.metadata.create_all(bind=engine) app = FastAPI(title="AirLabs Project", version="1.0.0") # CORS(开发阶段允许所有来源) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 from routers.auth import router as auth_router from routers.users import router as users_router from routers.projects import router as projects_router from routers.submissions import router as submissions_router from routers.costs import router as costs_router from routers.dashboard import router as dashboard_router app.include_router(auth_router) app.include_router(users_router) app.include_router(projects_router) app.include_router(submissions_router) app.include_router(costs_router) app.include_router(dashboard_router) # 前端静态文件 frontend_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "frontend", "dist") if os.path.exists(frontend_dir): app.mount("/assets", StaticFiles(directory=os.path.join(frontend_dir, "assets")), name="assets") @app.get("/{full_path:path}") async def serve_frontend(full_path: str): file_path = os.path.join(frontend_dir, full_path) if os.path.isfile(file_path): return FileResponse(file_path) return FileResponse(os.path.join(frontend_dir, "index.html")) @app.on_event("startup") def init_default_owner(): """首次启动时创建默认 Owner 账号""" from database import SessionLocal db = SessionLocal() try: if not db.query(User).filter(User.role == UserRole.OWNER).first(): owner = User( username="admin", password_hash=hash_password("admin123"), name="管理员", phase_group=PhaseGroup.PRODUCTION, role=UserRole.OWNER, monthly_salary=0, ) db.add(owner) db.commit() print("[OK] default admin created: admin / admin123") finally: db.close()