From ec0a30c43d85f0509b47558067acfc4181c9ddc2 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 10 Jun 2026 18:08:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=9C=80=E8=A6=81=E8=B5=84=E6=A0=BC?= =?UTF-8?q?=E7=9A=84=E5=95=86=E5=93=81=E6=AF=8F=E4=B8=AA=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=B6=88=E8=80=971=E4=B8=AA=E8=B5=84=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除后台商品管理的资格消耗设置 - 修改后端资格检查和扣除逻辑为每个订单项消耗1个资格 - 修改前端显示为需要1个资格 Co-Authored-By: Claude Fable 5 --- backend/internal/api/handlers/order.go | 17 ++++++++--------- frontend/src/views/admin/Products.vue | 10 +++------- frontend/src/views/user/Cart.vue | 4 ++-- frontend/src/views/user/ProductDetail.vue | 8 +++----- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/backend/internal/api/handlers/order.go b/backend/internal/api/handlers/order.go index fd81243..4f7ebc7 100644 --- a/backend/internal/api/handlers/order.go +++ b/backend/internal/api/handlers/order.go @@ -47,13 +47,12 @@ func (h *CartHandler) Add(c *gin.Context) { return } - // 检查购物资格 + // 检查购物资格(需要资格的商品,每个订单消耗1个资格) if product.RequireCredit { var user models.User utils.DB.First(&user, userID) - totalCreditCost := product.CreditCost * req.Quantity - if user.PurchaseCredits < totalCreditCost { - c.JSON(http.StatusBadRequest, gin.H{"error": "Insufficient purchase credits. Required: " + strconv.Itoa(totalCreditCost) + ", Available: " + strconv.Itoa(user.PurchaseCredits)}) + if user.PurchaseCredits < 1 { + c.JSON(http.StatusBadRequest, gin.H{"error": "Insufficient purchase credits. This product requires 1 credit per order."}) return } } @@ -158,7 +157,7 @@ func checkOrderExpired(order *models.Order) { if err := tx.First(&product, item.ProductID).Error; err == nil { if product.RequireCredit { tx.Model(&models.User{}).Where("id = ?", order.UserID). - UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + ?", product.CreditCost*item.Quantity)) + UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + 1")) } if product.CreditReward > 0 { tx.Model(&models.User{}).Where("id = ?", order.UserID). @@ -265,7 +264,7 @@ func (h *OrderHandler) Create(c *gin.Context) { if cart.Product.RequireCredit { var user models.User utils.DB.First(&user, userID) - if user.PurchaseCredits < cart.Product.CreditCost*cart.Quantity { + if user.PurchaseCredits < 1 { c.JSON(http.StatusBadRequest, gin.H{"error": "Insufficient purchase credits for " + cart.Product.Name}) return } @@ -357,7 +356,7 @@ func (h *OrderHandler) Create(c *gin.Context) { for _, cart := range carts { if cart.Product.RequireCredit { if err := tx.Model(&models.User{}).Where("id = ?", userID). - UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits - ?", cart.Product.CreditCost*cart.Quantity)).Error; err != nil { + UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits - 1")).Error; err != nil { tx.Rollback() c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to deduct credits"}) return @@ -541,7 +540,7 @@ func (h *OrderHandler) ProcessRefund(c *gin.Context) { if err := tx.First(&product, item.ProductID).Error; err == nil { if product.RequireCredit { tx.Model(&models.User{}).Where("id = ?", order.UserID). - UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + ?", product.CreditCost*item.Quantity)) + UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + 1")) } if product.CreditReward > 0 { tx.Model(&models.User{}).Where("id = ?", order.UserID). @@ -597,7 +596,7 @@ func (h *OrderHandler) CancelOrder(c *gin.Context) { if err := tx.First(&product, item.ProductID).Error; err == nil { if product.RequireCredit { tx.Model(&models.User{}).Where("id = ?", order.UserID). - UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + ?", product.CreditCost*item.Quantity)) + UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + 1")) } if product.CreditReward > 0 { tx.Model(&models.User{}).Where("id = ?", order.UserID). diff --git a/frontend/src/views/admin/Products.vue b/frontend/src/views/admin/Products.vue index 7075495..5fbff28 100644 --- a/frontend/src/views/admin/Products.vue +++ b/frontend/src/views/admin/Products.vue @@ -133,17 +133,13 @@
资格设置
- + + 订单消耗1个资格 - - - - - - + diff --git a/frontend/src/views/user/Cart.vue b/frontend/src/views/user/Cart.vue index f8478da..f498f15 100644 --- a/frontend/src/views/user/Cart.vue +++ b/frontend/src/views/user/Cart.vue @@ -67,7 +67,7 @@
- 需要: {{ item.product?.credit_cost }} + 需要: 1 资格 +{{ item.product?.credit_reward }} @@ -430,7 +430,7 @@ function isOutOfStock(product: any): boolean { // 检查用户是否有足够资格购买 function hasEnoughCredit(product: any): boolean { if (!product || !product.require_credit) return true - return userCredits.value >= (product.credit_cost || 0) + return userCredits.value >= 1 } // 检查商品是否可以选择 diff --git a/frontend/src/views/user/ProductDetail.vue b/frontend/src/views/user/ProductDetail.vue index 805297b..f6a36b7 100644 --- a/frontend/src/views/user/ProductDetail.vue +++ b/frontend/src/views/user/ProductDetail.vue @@ -34,7 +34,7 @@

{{ product.description }}

- {{ $t('product.requireCredit') }}: {{ product.credit_cost * quantity }} + {{ $t('product.requireCredit') }}: 1 (资格不足) +{{ product.credit_reward * quantity }} {{ $t('product.creditReward') }} @@ -88,8 +88,7 @@ const productImages = computed(() => { // 检查用户是否有足够资格购买 function hasEnoughCredit(): boolean { if (!product.value || !product.value.require_credit) return true - const totalCost = product.value.credit_cost * quantity.value - return userCredits.value >= totalCost + return userCredits.value >= 1 } // 获取用户资格信息 @@ -114,8 +113,7 @@ onMounted(async () => { async function addToCart() { // 检查购物资格 if (!hasEnoughCredit()) { - const totalCost = product.value.credit_cost * quantity.value - ElMessage.warning(`资格不足!需要 ${totalCost} 资格,您当前只有 ${userCredits.value} 资格`) + ElMessage.warning(`资格不足!该商品需要1个资格,您当前只有 ${userCredits.value} 资格`) return }