61 行
2.0 KiB
Python
61 行
2.0 KiB
Python
from __future__ import annotations
|
|
import subprocess
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database import get_db
|
|
from app.auth import get_current_user
|
|
from app.config import settings
|
|
from app.models.user import AdminUser
|
|
from app.models.export_log import ExportLog
|
|
from app.schemas.export import ExportRequest, ExportLogResponse
|
|
from app.services.export_service import export_modules
|
|
|
|
router = APIRouter(prefix="/api/export", tags=["导出"], dependencies=[Depends(get_current_user)])
|
|
|
|
|
|
@router.post("/")
|
|
def do_export(req: ExportRequest, db: Session = Depends(get_db), current_user: AdminUser = Depends(get_current_user)):
|
|
results = export_modules(db, req.modules)
|
|
all_success = all(v == "success" for v in results.values())
|
|
|
|
# Optionally trigger rebuild
|
|
rebuild_msg = ""
|
|
if req.trigger_rebuild and all_success:
|
|
try:
|
|
subprocess.run(
|
|
["npx", "nuxi", "generate"],
|
|
cwd=settings.NUXT_PROJECT_PATH,
|
|
timeout=300,
|
|
capture_output=True,
|
|
)
|
|
rebuild_msg = " | 静态站已重新构建"
|
|
except Exception as e:
|
|
rebuild_msg = f" | 构建失败: {str(e)}"
|
|
|
|
# Log
|
|
log = ExportLog(
|
|
exported_by=current_user.username,
|
|
modules=req.modules if "all" not in req.modules else ["all"],
|
|
status="success" if all_success else "failed",
|
|
message=str(results) + rebuild_msg,
|
|
)
|
|
db.add(log)
|
|
db.commit()
|
|
|
|
return {"results": results, "rebuild": rebuild_msg}
|
|
|
|
|
|
@router.get("/log", response_model=list[ExportLogResponse])
|
|
def get_export_log(db: Session = Depends(get_db)):
|
|
logs = db.query(ExportLog).order_by(ExportLog.created_at.desc()).limit(50).all()
|
|
return [
|
|
ExportLogResponse(
|
|
id=l.id, exported_by=l.exported_by, modules=l.modules,
|
|
status=l.status, message=l.message,
|
|
created_at=l.created_at.isoformat() if l.created_at else None,
|
|
)
|
|
for l in logs
|
|
]
|