1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
| """ 产品管理API """ from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from typing import List, Optional import logging
logger = logging.getLogger(__name__)
product_router = APIRouter(prefix="/products", tags=["产品管理"])
@product_router.post("/", response_model=ProductResponse, status_code=status.HTTP_201_CREATED) async def create_product( product: ProductCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """创建产品""" try: db_product = Product( name=product.name, description=product.description, price=product.price, stock=product.stock ) db.add(db_product) db.commit() db.refresh(db_product) logger.info(f"产品创建成功: {product.name}") return db_product except Exception as e: logger.error(f"创建产品失败: {str(e)}") db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="创建产品失败" )
@product_router.get("/", response_model=List[ProductResponse]) async def get_products( skip: int = Query(0, ge=0, description="跳过的记录数"), limit: int = Query(10, ge=1, le=100, description="返回的记录数"), search: Optional[str] = Query(None, description="搜索关键词"), db: Session = Depends(get_db) ): """获取产品列表""" try: query = db.query(Product).filter(Product.is_active == True) if search: query = query.filter(Product.name.contains(search)) products = query.offset(skip).limit(limit).all() return products except Exception as e: logger.error(f"获取产品列表失败: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="获取产品列表失败" )
@product_router.get("/{product_id}", response_model=ProductResponse) async def get_product( product_id: int, db: Session = Depends(get_db) ): """获取产品详情""" try: product = db.query(Product).filter( Product.id == product_id, Product.is_active == True ).first() if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="产品不存在" ) return product except HTTPException: raise except Exception as e: logger.error(f"获取产品详情失败: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="获取产品详情失败" )
@product_router.put("/{product_id}", response_model=ProductResponse) async def update_product( product_id: int, product_update: ProductUpdate, db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """更新产品""" try: product = db.query(Product).filter(Product.id == product_id).first() if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="产品不存在" ) update_data = product_update.dict(exclude_unset=True) for field, value in update_data.items(): setattr(product, field, value) db.commit() db.refresh(product) logger.info(f"产品更新成功: {product.name}") return product except HTTPException: raise except Exception as e: logger.error(f"更新产品失败: {str(e)}") db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="更新产品失败" )
@product_router.delete("/{product_id}") async def delete_product( product_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """删除产品(软删除)""" try: product = db.query(Product).filter(Product.id == product_id).first() if not product: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="产品不存在" ) product.is_active = False db.commit() logger.info(f"产品删除成功: {product.name}") return {"message": "产品删除成功"} except HTTPException: raise except Exception as e: logger.error(f"删除产品失败: {str(e)}") db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="删除产品失败" )
@product_router.get("/search/", response_model=List[ProductResponse]) async def search_products( q: str = Query(..., min_length=2, description="搜索关键词"), skip: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=100), db: Session = Depends(get_db) ): """搜索产品""" try: products = db.query(Product).filter( Product.is_active == True, Product.name.contains(q) ).offset(skip).limit(limit).all() return products except Exception as e: logger.error(f"搜索产品失败: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="搜索产品失败" )
|