hulai-admin-api/app/routers/destinations_detail.py
刘涛 8c0a5f489d Initial commit: hulai admin API backend
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 22:01:23 +08:00

93 行
3.2 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from sqlalchemy import func as sqlfunc
from app.database import get_db
from app.auth import get_current_user
from app.models.destination_detail import DestinationDetail
from app.schemas.destination_detail import (
DestinationDetailSchema,
DestinationDetailResponse,
DestinationDetailListResponse,
)
router = APIRouter(
prefix="/api/destinations-detail",
tags=["景点详情"],
dependencies=[Depends(get_current_user)],
)
@router.get("/", response_model=DestinationDetailListResponse)
def list_items(
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=100),
keyword: str = Query("", description="搜索关键词"),
db: Session = Depends(get_db),
):
query = db.query(DestinationDetail)
if keyword:
query = query.filter(
DestinationDetail.name.contains(keyword)
| DestinationDetail.location.contains(keyword)
)
total = query.count()
items = (
query.order_by(DestinationDetail.sort_order, DestinationDetail.id.desc())
.offset((page - 1) * page_size)
.limit(page_size)
.all()
)
return DestinationDetailListResponse(
items=[DestinationDetailResponse.model_validate(i) for i in items],
total=total,
)
@router.post("/", response_model=DestinationDetailResponse, status_code=201)
def create_item(req: DestinationDetailSchema, db: Session = Depends(get_db)):
if db.query(DestinationDetail).filter(DestinationDetail.slug == req.slug).first():
raise HTTPException(status_code=400, detail="该 slug 已存在")
max_order = db.query(sqlfunc.max(DestinationDetail.sort_order)).scalar() or 0
item = DestinationDetail(**req.model_dump(), sort_order=max_order + 1)
db.add(item)
db.commit()
db.refresh(item)
return DestinationDetailResponse.model_validate(item)
@router.put("/{item_id}", response_model=DestinationDetailResponse)
def update_item(item_id: int, req: DestinationDetailSchema, db: Session = Depends(get_db)):
item = db.query(DestinationDetail).get(item_id)
if not item:
raise HTTPException(status_code=404, detail="景点不存在")
existing = db.query(DestinationDetail).filter(
DestinationDetail.slug == req.slug, DestinationDetail.id != item_id
).first()
if existing:
raise HTTPException(status_code=400, detail="该 slug 已被其他景点使用")
for key, val in req.model_dump().items():
setattr(item, key, val)
db.commit()
db.refresh(item)
return DestinationDetailResponse.model_validate(item)
@router.delete("/{item_id}")
def delete_item(item_id: int, db: Session = Depends(get_db)):
item = db.query(DestinationDetail).get(item_id)
if not item:
raise HTTPException(status_code=404, detail="景点不存在")
db.delete(item)
db.commit()
return {"message": "删除成功"}
@router.put("/reorder/batch")
def reorder_items(ids: list[int], db: Session = Depends(get_db)):
for i, iid in enumerate(ids):
db.query(DestinationDetail).filter(DestinationDetail.id == iid).update({"sort_order": i})
db.commit()
return {"message": "排序更新成功"}