product_banner.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """API - 商品轮播图管理"""
  2. from typing import Optional, List
  3. from fastapi import APIRouter, Depends, HTTPException, Query
  4. from sqlalchemy.orm import Session
  5. from app.core.database import get_db
  6. from app.core.auth import get_current_user
  7. from app.core.response import success_response, error_response
  8. from app.crud.product_banner import product_banner
  9. from app.schemas.product_banner import (
  10. ProductBannerCreate,
  11. ProductBannerUpdate,
  12. ProductBannerSortUpdate,
  13. ProductBannerResponse,
  14. ProductBannerListResponse
  15. )
  16. router = APIRouter(prefix="/web/admin/product-banners", tags=["商品轮播图管理"])
  17. def require_admin(current_user: dict = Depends(get_current_user)):
  18. """验证运营人员权限"""
  19. if current_user.get("role") != "admin":
  20. raise HTTPException(status_code=403, detail="需要运营人员权限")
  21. return current_user
  22. @router.get("/product/{product_id}", response_model=dict)
  23. def list_banners(
  24. product_id: str,
  25. db: Session = Depends(get_db),
  26. current_user: dict = Depends(require_admin)
  27. ):
  28. """获取商品的所有轮播图"""
  29. banners = product_banner.get_by_product(db, product_id)
  30. return success_response({
  31. "list": [{
  32. "id": b.id,
  33. "productId": b.product_id,
  34. "mediaType": b.media_type,
  35. "fileUrl": b.file_url,
  36. "thumbnailUrl": b.thumbnail_url,
  37. "sortOrder": b.sort_order,
  38. "createAt": str(b.create_at) if b.create_at else None
  39. } for b in banners],
  40. "total": len(banners)
  41. })
  42. @router.post("/product/{product_id}", response_model=dict)
  43. def create_banners(
  44. product_id: str,
  45. items: List[ProductBannerCreate],
  46. db: Session = Depends(get_db),
  47. current_user: dict = Depends(require_admin)
  48. ):
  49. """批量添加轮播图"""
  50. creator = {"user_id": current_user.get("user_id"), "real_name": current_user.get("real_name")}
  51. items_data = [item.model_dump() for item in items]
  52. banners = product_banner.create_batch(db, product_id, items_data, creator)
  53. return success_response({
  54. "list": [{
  55. "id": b.id,
  56. "productId": b.product_id,
  57. "mediaType": b.media_type,
  58. "fileUrl": b.file_url,
  59. "thumbnailUrl": b.thumbnail_url,
  60. "sortOrder": b.sort_order
  61. } for b in banners],
  62. "total": len(banners)
  63. })
  64. @router.put("/product/{product_id}/sort", response_model=dict)
  65. def update_sort(
  66. product_id: str,
  67. sort_data: ProductBannerSortUpdate,
  68. db: Session = Depends(get_db),
  69. current_user: dict = Depends(require_admin)
  70. ):
  71. """更新轮播图排序"""
  72. items_data = [item.model_dump() for item in sort_data.items]
  73. product_banner.update_sort(db, items_data)
  74. return success_response({"message": "排序更新成功"})
  75. @router.put("/{banner_id}", response_model=dict)
  76. def update_banner(
  77. banner_id: str,
  78. update_data: ProductBannerUpdate,
  79. db: Session = Depends(get_db),
  80. current_user: dict = Depends(require_admin)
  81. ):
  82. """更新轮播图"""
  83. banner = product_banner.update(db, banner_id, update_data.model_dump(exclude_unset=True))
  84. if not banner:
  85. return error_response(404, "轮播图不存在")
  86. return success_response({
  87. "id": banner.id,
  88. "productId": banner.product_id,
  89. "mediaType": banner.media_type,
  90. "fileUrl": banner.file_url,
  91. "thumbnailUrl": banner.thumbnail_url,
  92. "sortOrder": banner.sort_order
  93. })
  94. @router.delete("/{banner_id}", response_model=dict)
  95. def delete_banner(
  96. banner_id: str,
  97. db: Session = Depends(get_db),
  98. current_user: dict = Depends(require_admin)
  99. ):
  100. """删除轮播图"""
  101. result = product_banner.delete(db, banner_id)
  102. if not result:
  103. return error_response(404, "轮播图不存在")
  104. return success_response({"message": "删除成功"})