"""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, Role, PhaseGroup, BUILTIN_ROLES from auth import hash_password import os # 创建所有表 Base.metadata.create_all(bind=engine) app = FastAPI(title="AirLabs Project", version="1.0.0") # CORS from config import CORS_ORIGINS app.add_middleware( CORSMiddleware, allow_origins=CORS_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 from routers.roles import router as roles_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) app.include_router(roles_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_roles_and_admin(): """首次启动时创建内置角色和默认管理员""" from database import SessionLocal db = SessionLocal() try: # 初始化内置角色 for role_name, role_def in BUILTIN_ROLES.items(): existing = db.query(Role).filter(Role.name == role_name).first() if not existing: role = Role( name=role_name, description=role_def["description"], permissions=role_def["permissions"], is_system=1, ) db.add(role) print(f"[OK] created role: {role_name}") db.commit() # 创建默认管理员(关联超级管理员角色) admin_role = db.query(Role).filter(Role.name == "超级管理员").first() if admin_role and not db.query(User).filter(User.username == "admin").first(): owner = User( username="admin", password_hash=hash_password("admin123"), name="管理员", phase_group=PhaseGroup.PRODUCTION, role_id=admin_role.id, monthly_salary=0, ) db.add(owner) db.commit() print("[OK] default admin created: admin / admin123") finally: db.close()