刘涛 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

83 行
2.7 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.gallery import GalleryItem
from app.schemas.gallery import GalleryItemSchema, GalleryItemResponse, GalleryListResponse
router = APIRouter(
prefix="/api/gallery",
tags=["旅拍作品"],
dependencies=[Depends(get_current_user)],
)
@router.get("/", response_model=GalleryListResponse)
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(GalleryItem)
if keyword:
query = query.filter(
GalleryItem.title.contains(keyword)
| GalleryItem.location.contains(keyword)
| GalleryItem.photographer.contains(keyword)
)
total = query.count()
items = (
query.order_by(GalleryItem.sort_order, GalleryItem.id.desc())
.offset((page - 1) * page_size)
.limit(page_size)
.all()
)
return GalleryListResponse(
items=[GalleryItemResponse.model_validate(i) for i in items],
total=total,
)
@router.post("/", response_model=GalleryItemResponse, status_code=201)
def create_item(req: GalleryItemSchema, db: Session = Depends(get_db)):
max_order = db.query(sqlfunc.max(GalleryItem.sort_order)).scalar() or 0
item = GalleryItem(**req.model_dump(), sort_order=max_order + 1)
db.add(item)
db.commit()
db.refresh(item)
return GalleryItemResponse.model_validate(item)
@router.put("/{item_id}", response_model=GalleryItemResponse)
def update_item(item_id: int, req: GalleryItemSchema, db: Session = Depends(get_db)):
item = db.query(GalleryItem).get(item_id)
if not item:
raise HTTPException(status_code=404, detail="作品不存在")
for key, val in req.model_dump().items():
setattr(item, key, val)
db.commit()
db.refresh(item)
return GalleryItemResponse.model_validate(item)
@router.delete("/{item_id}")
def delete_item(item_id: int, db: Session = Depends(get_db)):
item = db.query(GalleryItem).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(GalleryItem).filter(GalleryItem.id == iid).update({"sort_order": i})
db.commit()
return {"message": "排序更新成功"}