hulai-admin-api/app/routers/winter_camp.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

134 行
5.1 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.database import get_db
from app.auth import get_current_user
from app.models.winter_camp import WinterCampConfig, WinterCampHotel, WinterCampItinerary, WinterCampFaq
from app.schemas.winter_camp import (
WinterCampConfigSchema, WinterCampHotelSchema, WinterCampHotelResponse,
WinterCampItinerarySchema, WinterCampItineraryResponse,
WinterCampFaqSchema, WinterCampFaqResponse,
)
router = APIRouter(prefix="/api/winter-camp", tags=["冬季营"], dependencies=[Depends(get_current_user)])
def _get_config(db: Session) -> WinterCampConfig:
config = db.query(WinterCampConfig).first()
if not config:
config = WinterCampConfig()
db.add(config)
db.flush()
return config
@router.get("/config", response_model=WinterCampConfigSchema)
def get_config(db: Session = Depends(get_db)):
c = _get_config(db)
return WinterCampConfigSchema(
name=c.name, positioning=c.positioning, days=c.days, nights=c.nights,
max_families=c.max_families, total_sessions=c.total_sessions,
age_range=c.age_range, deposit=c.deposit, season=c.season, route=c.route,
why_hulunbuir=c.why_hulunbuir, closing_note=c.closing_note,
photographer=c.photographer, winter_clothing=c.winter_clothing,
camp_advantages=c.camp_advantages or [], service_config=c.service_config or [],
camp_essentials=c.camp_essentials or [],
)
@router.put("/config")
def update_config(req: WinterCampConfigSchema, db: Session = Depends(get_db)):
c = _get_config(db)
c.name = req.name
c.positioning = req.positioning
c.days = req.days
c.nights = req.nights
c.max_families = req.max_families
c.total_sessions = req.total_sessions
c.age_range = req.age_range
c.deposit = req.deposit
c.season = req.season
c.route = req.route
c.why_hulunbuir = req.why_hulunbuir
c.closing_note = req.closing_note
c.photographer = req.photographer
c.winter_clothing = req.winter_clothing
c.camp_advantages = req.camp_advantages
c.service_config = req.service_config
c.camp_essentials = req.camp_essentials
db.commit()
return {"message": "冬季营配置更新成功"}
# --- Hotels ---
@router.get("/hotels", response_model=list[WinterCampHotelResponse])
def list_hotels(db: Session = Depends(get_db)):
rows = db.query(WinterCampHotel).order_by(WinterCampHotel.sort_order).all()
return [WinterCampHotelResponse(id=h.id, name=h.name, star=h.star, nights=h.nights, description=h.description, sort_order=h.sort_order) for h in rows]
@router.put("/hotels")
def update_hotels(items: list[WinterCampHotelSchema], db: Session = Depends(get_db)):
db.query(WinterCampHotel).delete()
for i, h in enumerate(items):
db.add(WinterCampHotel(name=h.name, star=h.star, nights=h.nights, description=h.description, sort_order=i))
db.commit()
return {"message": "酒店信息更新成功"}
# --- Itinerary ---
@router.get("/itinerary", response_model=list[WinterCampItineraryResponse])
def list_itinerary(db: Session = Depends(get_db)):
rows = db.query(WinterCampItinerary).order_by(WinterCampItinerary.sort_order).all()
return [
WinterCampItineraryResponse(id=d.id, day=d.day, title=d.title, summary=d.summary, highlights=d.highlights or [], hotel=d.hotel, sort_order=d.sort_order)
for d in rows
]
@router.put("/itinerary")
def update_itinerary(items: list[WinterCampItinerarySchema], db: Session = Depends(get_db)):
db.query(WinterCampItinerary).delete()
for i, d in enumerate(items):
db.add(WinterCampItinerary(day=d.day, title=d.title, summary=d.summary, highlights=d.highlights, hotel=d.hotel, sort_order=i))
db.commit()
return {"message": "行程更新成功"}
# --- FAQ ---
@router.get("/faq", response_model=list[WinterCampFaqResponse])
def list_faq(db: Session = Depends(get_db)):
rows = db.query(WinterCampFaq).order_by(WinterCampFaq.sort_order).all()
return [WinterCampFaqResponse(id=f.id, question=f.question, answer=f.answer, sort_order=f.sort_order) for f in rows]
@router.post("/faq", response_model=WinterCampFaqResponse, status_code=201)
def create_faq(req: WinterCampFaqSchema, db: Session = Depends(get_db)):
f = WinterCampFaq(question=req.question, answer=req.answer)
db.add(f)
db.commit()
db.refresh(f)
return WinterCampFaqResponse(id=f.id, question=f.question, answer=f.answer, sort_order=f.sort_order)
@router.put("/faq/{f_id}")
def update_faq(f_id: int, req: WinterCampFaqSchema, db: Session = Depends(get_db)):
f = db.query(WinterCampFaq).get(f_id)
if not f:
raise HTTPException(status_code=404, detail="FAQ不存在")
f.question = req.question
f.answer = req.answer
db.commit()
return {"message": "更新成功"}
@router.delete("/faq/{f_id}")
def delete_faq(f_id: int, db: Session = Depends(get_db)):
f = db.query(WinterCampFaq).get(f_id)
if not f:
raise HTTPException(status_code=404, detail="FAQ不存在")
db.delete(f)
db.commit()
return {"message": "删除成功"}