92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
"""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()
|