From 46daa0999b5aabc9da30788f587de9038e9029f3 Mon Sep 17 00:00:00 2001 From: nuyue Date: Sun, 12 Jul 2026 18:52:27 +0800 Subject: [PATCH] feat: add shipping template management and update favicon --- backend/internal/api/handlers/order.go | 89 ++++- backend/internal/api/handlers/product.go | 42 ++- .../api/handlers/shipping_template.go | 260 ++++++++++++++ backend/internal/api/routes/routes.go | 10 + backend/internal/models/product.go | 48 +-- backend/internal/models/shipping_template.go | 35 ++ backend/internal/schemas/product.go | 72 ++-- backend/internal/schemas/shipping_template.go | 29 ++ frontend/index.html | 2 +- frontend/public/favicon.ico | Bin 0 -> 370070 bytes frontend/public/favicon.svg | 1 - frontend/src/api/index.ts | 7 + frontend/src/layouts/AdminLayout.vue | 7 +- frontend/src/router/index.ts | 1 + frontend/src/views/admin/Products.vue | 24 +- .../src/views/admin/ShippingTemplates.vue | 337 ++++++++++++++++++ 16 files changed, 865 insertions(+), 99 deletions(-) create mode 100644 backend/internal/api/handlers/shipping_template.go create mode 100644 backend/internal/models/shipping_template.go create mode 100644 backend/internal/schemas/shipping_template.go create mode 100644 frontend/public/favicon.ico delete mode 100644 frontend/public/favicon.svg create mode 100644 frontend/src/views/admin/ShippingTemplates.vue diff --git a/backend/internal/api/handlers/order.go b/backend/internal/api/handlers/order.go index d6a854f..e57e945 100644 --- a/backend/internal/api/handlers/order.go +++ b/backend/internal/api/handlers/order.go @@ -300,14 +300,80 @@ func (h *OrderHandler) Create(c *gin.Context) { break } - var shippingFeeFirstWeight, shippingFeePerGram, serviceFeeRate, taxRate, channelFeeRate float64 + // 获取收货地址省份 + var shippingAddress models.Address + var province string + if err := utils.DB.First(&shippingAddress, req.ShippingAddressID).Error; err == nil { + province = shippingAddress.Province + } + + // 使用运费模板计算运费 + shippingFee := 0.0 + + // 按运费模板分组计算 + type TemplateGroup struct { + TemplateID *uint + Weight float64 + Quantity int + Subtotal float64 + } + templateGroups := make(map[uint]*TemplateGroup) + noTemplateGroup := &TemplateGroup{Subtotal: 0, Weight: 0, Quantity: 0} + + for _, cart := range carts { + var templateID uint + if cart.Product.ShippingTemplateID != nil { + templateID = *cart.Product.ShippingTemplateID + } + + if templateID == 0 { + // 没有运费模板,累加到无模板组 + noTemplateGroup.Weight += cart.Product.Weight * float64(cart.Quantity) + noTemplateGroup.Quantity += cart.Quantity + noTemplateGroup.Subtotal += cart.Product.Price * float64(cart.Quantity) + } else { + if _, ok := templateGroups[templateID]; !ok { + templateGroups[templateID] = &TemplateGroup{ + TemplateID: &templateID, + Weight: 0, + Quantity: 0, + Subtotal: 0, + } + } + templateGroups[templateID].Weight += cart.Product.Weight * float64(cart.Quantity) + templateGroups[templateID].Quantity += cart.Quantity + templateGroups[templateID].Subtotal += cart.Product.Price * float64(cart.Quantity) + } + } + + // 计算有模板的运费 + for _, group := range templateGroups { + fee, _ := CalculateShippingFee(group.TemplateID, group.Weight, group.Quantity, group.Subtotal, province) + shippingFee += fee + } + + // 计算无模板的运费(使用旧的系统设置) + if noTemplateGroup.Subtotal > 0 { + var shippingFeeFirstWeight, shippingFeePerGram float64 + var setting models.SystemSetting + if err := utils.DB.Where("`key` = ?", "shipping_fee_first_weight").First(&setting).Error; err == nil { + shippingFeeFirstWeight, _ = strconv.ParseFloat(setting.Value, 64) + } + if err := utils.DB.Where("`key` = ?", "shipping_fee_per_gram").First(&setting).Error; err == nil { + shippingFeePerGram, _ = strconv.ParseFloat(setting.Value, 64) + } + if noTemplateGroup.Subtotal < 99 && shippingFeeFirstWeight > 0 { + fee := shippingFeeFirstWeight + if noTemplateGroup.Weight > 500 { + fee += shippingFeePerGram * (noTemplateGroup.Weight - 500) + } + shippingFee += fee + } + } + + // 获取其他费率 + var serviceFeeRate, taxRate, channelFeeRate float64 var setting models.SystemSetting - if err := utils.DB.Where("`key` = ?", "shipping_fee_first_weight").First(&setting).Error; err == nil { - shippingFeeFirstWeight, _ = strconv.ParseFloat(setting.Value, 64) - } - if err := utils.DB.Where("`key` = ?", "shipping_fee_per_gram").First(&setting).Error; err == nil { - shippingFeePerGram, _ = strconv.ParseFloat(setting.Value, 64) - } if err := utils.DB.Where("`key` = ?", "service_fee_rate").First(&setting).Error; err == nil { serviceFeeRate, _ = strconv.ParseFloat(setting.Value, 64) } @@ -318,15 +384,6 @@ func (h *OrderHandler) Create(c *gin.Context) { channelFeeRate, _ = strconv.ParseFloat(setting.Value, 64) } - // 根据商品重量计算运费 - shippingFee := 0.0 - if subtotal < 99 && shippingFeeFirstWeight > 0 { - shippingFee = shippingFeeFirstWeight - if totalWeight > 500 { - shippingFee += shippingFeePerGram * (totalWeight - 500) - } - } - serviceFee := subtotal * serviceFeeRate / 100 tax := subtotal * taxRate / 100 channelFee := subtotal * channelFeeRate / 100 diff --git a/backend/internal/api/handlers/product.go b/backend/internal/api/handlers/product.go index 65ea7e8..37ffca5 100644 --- a/backend/internal/api/handlers/product.go +++ b/backend/internal/api/handlers/product.go @@ -225,7 +225,7 @@ func (h *ProductHandler) GetByID(c *gin.Context) { func (h *ProductHandler) AdminList(c *gin.Context) { var products []models.Product - utils.DB.Preload("Categories").Preload("Brand").Order("created_at DESC").Find(&products) + utils.DB.Preload("Categories").Preload("Brand").Preload("ShippingTemplate").Order("created_at DESC").Find(&products) c.JSON(http.StatusOK, gin.H{"data": products}) } @@ -237,22 +237,23 @@ func (h *ProductHandler) Create(c *gin.Context) { } product := models.Product{ - Name: req.Name, - Description: req.Description, - Price: req.Price, - Weight: req.Weight, - MinPurchase: req.MinPurchase, - MaxPurchase: req.MaxPurchase, - MinWeight: req.MinWeight, - MaxWeight: req.MaxWeight, - MinAmount: req.MinAmount, - MaxAmount: req.MaxAmount, - RequireCredit: req.RequireCredit, - CreditCost: req.CreditCost, - CreditReward: req.CreditReward, - Images: req.Images, - BrandID: req.BrandID, - IsActive: true, + Name: req.Name, + Description: req.Description, + Price: req.Price, + Weight: req.Weight, + MinPurchase: req.MinPurchase, + MaxPurchase: req.MaxPurchase, + MinWeight: req.MinWeight, + MaxWeight: req.MaxWeight, + MinAmount: req.MinAmount, + MaxAmount: req.MaxAmount, + RequireCredit: req.RequireCredit, + CreditCost: req.CreditCost, + CreditReward: req.CreditReward, + Images: req.Images, + BrandID: req.BrandID, + ShippingTemplateID: req.ShippingTemplateID, + IsActive: true, } if err := utils.DB.Create(&product).Error; err != nil { @@ -276,7 +277,7 @@ func (h *ProductHandler) Create(c *gin.Context) { } } - utils.DB.Preload("Categories").Preload("CustomFields").Preload("Brand").First(&product, product.ID) + utils.DB.Preload("Categories").Preload("CustomFields").Preload("Brand").Preload("ShippingTemplate").First(&product, product.ID) c.JSON(http.StatusCreated, gin.H{"data": product}) } @@ -343,6 +344,9 @@ func (h *ProductHandler) Update(c *gin.Context) { if req.BrandID != nil { updates["brand_id"] = *req.BrandID } + if req.ShippingTemplateID != nil { + updates["shipping_template_id"] = *req.ShippingTemplateID + } utils.DB.Model(&product).Updates(updates) @@ -363,7 +367,7 @@ func (h *ProductHandler) Update(c *gin.Context) { } } - utils.DB.Preload("Categories").Preload("CustomFields").Preload("Brand").First(&product, product.ID) + utils.DB.Preload("Categories").Preload("CustomFields").Preload("Brand").Preload("ShippingTemplate").First(&product, product.ID) c.JSON(http.StatusOK, gin.H{"data": product}) } diff --git a/backend/internal/api/handlers/shipping_template.go b/backend/internal/api/handlers/shipping_template.go new file mode 100644 index 0000000..87a264f --- /dev/null +++ b/backend/internal/api/handlers/shipping_template.go @@ -0,0 +1,260 @@ +package handlers + +import ( + "encoding/json" + "math" + "net/http" + "strconv" + + "sale/internal/models" + "sale/internal/schemas" + "sale/internal/utils" + + "github.com/gin-gonic/gin" +) + +type ShippingTemplateHandler struct{} + +func NewShippingTemplateHandler() *ShippingTemplateHandler { + return &ShippingTemplateHandler{} +} + +// List 获取运费模板列表 +func (h *ShippingTemplateHandler) List(c *gin.Context) { + var templates []models.ShippingTemplate + utils.DB.Order("sort_order ASC, id ASC").Find(&templates) + + // 解析 provinces JSON 为数组 + type TemplateResponse struct { + models.ShippingTemplate + ProvincesList []string `json:"provinces_list"` + } + + var response []TemplateResponse + for _, t := range templates { + var provinces []string + if t.Provinces != "" { + json.Unmarshal([]byte(t.Provinces), &provinces) + } + response = append(response, TemplateResponse{ + ShippingTemplate: t, + ProvincesList: provinces, + }) + } + + c.JSON(http.StatusOK, gin.H{"data": response}) +} + +// GetByID 获取单个运费模板 +func (h *ShippingTemplateHandler) GetByID(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + var template models.ShippingTemplate + if err := utils.DB.First(&template, id).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "运费模板不存在"}) + return + } + + var provinces []string + if template.Provinces != "" { + json.Unmarshal([]byte(template.Provinces), &provinces) + } + + c.JSON(http.StatusOK, gin.H{ + "data": gin.H{ + "ShippingTemplate": template, + "provinces_list": provinces, + }, + }) +} + +// Create 创建运费模板 +func (h *ShippingTemplateHandler) Create(c *gin.Context) { + var req schemas.CreateShippingTemplateRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + // 如果设为默认,先取消其他默认模板 + if req.IsDefault { + utils.DB.Model(&models.ShippingTemplate{}).Where("is_default = ?", true).Update("is_default", false) + } + + // 序列化省份列表 + var provincesJSON string + if len(req.Provinces) > 0 { + data, _ := json.Marshal(req.Provinces) + provincesJSON = string(data) + } + + template := models.ShippingTemplate{ + Name: req.Name, + CalcType: req.CalcType, + FirstUnit: req.FirstUnit, + FirstFee: req.FirstFee, + AdditionalUnit: req.AdditionalUnit, + AdditionalFee: req.AdditionalFee, + FreeAmount: req.FreeAmount, + Provinces: provincesJSON, + IsDefault: req.IsDefault, + SortOrder: req.SortOrder, + } + + if err := utils.DB.Create(&template).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "创建运费模板失败"}) + return + } + + c.JSON(http.StatusCreated, gin.H{"data": template}) +} + +// Update 更新运费模板 +func (h *ShippingTemplateHandler) Update(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + var template models.ShippingTemplate + if err := utils.DB.First(&template, id).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "运费模板不存在"}) + return + } + + var req schemas.UpdateShippingTemplateRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + updates := make(map[string]interface{}) + + if req.Name != nil { + updates["name"] = *req.Name + } + if req.CalcType != nil { + updates["calc_type"] = *req.CalcType + } + if req.FirstUnit != nil { + updates["first_unit"] = *req.FirstUnit + } + if req.FirstFee != nil { + updates["first_fee"] = *req.FirstFee + } + if req.AdditionalUnit != nil { + updates["additional_unit"] = *req.AdditionalUnit + } + if req.AdditionalFee != nil { + updates["additional_fee"] = *req.AdditionalFee + } + if req.FreeAmount != nil { + updates["free_amount"] = *req.FreeAmount + } + if req.Provinces != nil { + if len(req.Provinces) > 0 { + data, _ := json.Marshal(req.Provinces) + updates["provinces"] = string(data) + } else { + updates["provinces"] = "" + } + } + if req.IsDefault != nil { + if *req.IsDefault { + utils.DB.Model(&models.ShippingTemplate{}).Where("is_default = ? AND id != ?", true, id).Update("is_default", false) + } + updates["is_default"] = *req.IsDefault + } + if req.SortOrder != nil { + updates["sort_order"] = *req.SortOrder + } + + utils.DB.Model(&template).Updates(updates) + utils.DB.First(&template, id) + + c.JSON(http.StatusOK, gin.H{"data": template}) +} + +// Delete 删除运费模板 +func (h *ShippingTemplateHandler) Delete(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + + var template models.ShippingTemplate + if err := utils.DB.First(&template, id).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "运费模板不存在"}) + return + } + + // 检查是否有关联的商品 + var count int64 + utils.DB.Model(&models.Product{}).Where("shipping_template_id = ?", id).Count(&count) + if count > 0 { + c.JSON(http.StatusBadRequest, gin.H{"error": "该运费模板已被商品关联,无法删除"}) + return + } + + if err := utils.DB.Delete(&template).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "删除运费模板失败"}) + return + } + + c.JSON(http.StatusOK, gin.H{"message": "删除成功"}) +} + +// CalculateShippingFee 计算运费(供内部调用) +func CalculateShippingFee(templateID *uint, weight float64, quantity int, subtotal float64, province string) (float64, error) { + var template models.ShippingTemplate + + // 如果没有指定模板,使用默认模板 + if templateID == nil || *templateID == 0 { + if err := utils.DB.Where("is_default = ?", true).First(&template).Error; err != nil { + // 没有默认模板,运费为0 + return 0, nil + } + } else { + if err := utils.DB.First(&template, *templateID).Error; err != nil { + // 模板不存在,使用默认模板 + if err := utils.DB.Where("is_default = ?", true).First(&template).Error; err != nil { + return 0, nil + } + } + } + + // 检查适用地区 + if template.Provinces != "" && province != "" { + var provinces []string + json.Unmarshal([]byte(template.Provinces), &provinces) + matched := false + for _, p := range provinces { + if p == province { + matched = true + break + } + } + if !matched { + // 地址不在适用范围内,使用默认模板 + var defaultTemplate models.ShippingTemplate + if err := utils.DB.Where("is_default = ?", true).First(&defaultTemplate).Error; err == nil { + template = defaultTemplate + } + } + } + + // 检查是否满足包邮条件 + if template.FreeAmount > 0 && subtotal >= template.FreeAmount { + return 0, nil + } + + // 根据计费方式计算运费 + var totalUnit float64 + if template.CalcType == models.CalcTypeWeight { + totalUnit = weight // 重量(克) + } else { + totalUnit = float64(quantity) // 件数 + } + + // 计算运费 + if totalUnit <= template.FirstUnit { + return template.FirstFee, nil + } + + remainingUnit := totalUnit - template.FirstUnit + additionalCount := math.Ceil(remainingUnit / template.AdditionalUnit) + + return template.FirstFee + additionalCount*template.AdditionalFee, nil +} diff --git a/backend/internal/api/routes/routes.go b/backend/internal/api/routes/routes.go index d79c651..96f4be5 100644 --- a/backend/internal/api/routes/routes.go +++ b/backend/internal/api/routes/routes.go @@ -27,6 +27,7 @@ func SetupRoutes(r *gin.Engine) { paymentHandler := handlers.NewPaymentHandler() logHandler := handlers.NewLogHandler() purchaseGroupHandler := handlers.NewPurchaseGroupHandler() + shippingTemplateHandler := handlers.NewShippingTemplateHandler() r.Use(middlewares.CORSMiddleware()) @@ -250,6 +251,15 @@ func SetupRoutes(r *gin.Engine) { admin.GET("/logs", logHandler.GetLogs) admin.DELETE("/logs", logHandler.ClearLogs) admin.GET("/logs/info", logHandler.GetLogInfo) + + adminShippingTemplates := admin.Group("/shipping-templates") + { + adminShippingTemplates.GET("", shippingTemplateHandler.List) + adminShippingTemplates.GET("/:id", shippingTemplateHandler.GetByID) + adminShippingTemplates.POST("", shippingTemplateHandler.Create) + adminShippingTemplates.PUT("/:id", shippingTemplateHandler.Update) + adminShippingTemplates.DELETE("/:id", shippingTemplateHandler.Delete) + } } } } diff --git a/backend/internal/models/product.go b/backend/internal/models/product.go index 2f57333..6bfae6b 100644 --- a/backend/internal/models/product.go +++ b/backend/internal/models/product.go @@ -7,29 +7,31 @@ import ( ) type Product struct { - ID uint `gorm:"primaryKey" json:"id"` - Name string `gorm:"size:255;not null" json:"name"` - Description string `json:"description"` - Price float64 `gorm:"type:decimal(10,2);not null" json:"price"` - Weight float64 `gorm:"type:decimal(10,2);default:0" json:"weight"` // 商品克重(克) - MinPurchase int `gorm:"default:1" json:"min_purchase"` - MaxPurchase *int `json:"max_purchase"` - MinWeight *float64 `json:"min_weight"` - MaxWeight *float64 `json:"max_weight"` - MinAmount *float64 `json:"min_amount"` - MaxAmount *float64 `json:"max_amount"` - RequireCredit bool `gorm:"default:false" json:"require_credit"` - CreditCost int `gorm:"default:0" json:"credit_cost"` - CreditReward int `gorm:"default:0" json:"credit_reward"` - Images string `gorm:"type:text" json:"images"` - IsActive bool `gorm:"default:true" json:"is_active"` - BrandID *uint `json:"brand_id"` - Brand *Brand `json:"brand,omitempty"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` - Categories []Category `gorm:"many2many:product_categories;" json:"categories,omitempty"` - CustomFields []ProductCustomField `json:"custom_fields,omitempty"` + ID uint `gorm:"primaryKey" json:"id"` + Name string `gorm:"size:255;not null" json:"name"` + Description string `json:"description"` + Price float64 `gorm:"type:decimal(10,2);not null" json:"price"` + Weight float64 `gorm:"type:decimal(10,2);default:0" json:"weight"` // 商品克重(克) + MinPurchase int `gorm:"default:1" json:"min_purchase"` + MaxPurchase *int `json:"max_purchase"` + MinWeight *float64 `json:"min_weight"` + MaxWeight *float64 `json:"max_weight"` + MinAmount *float64 `json:"min_amount"` + MaxAmount *float64 `json:"max_amount"` + RequireCredit bool `gorm:"default:false" json:"require_credit"` + CreditCost int `gorm:"default:0" json:"credit_cost"` + CreditReward int `gorm:"default:0" json:"credit_reward"` + Images string `gorm:"type:text" json:"images"` + IsActive bool `gorm:"default:true" json:"is_active"` + BrandID *uint `json:"brand_id"` + Brand *Brand `json:"brand,omitempty"` + ShippingTemplateID *uint `json:"shipping_template_id"` + ShippingTemplate *ShippingTemplate `json:"shipping_template,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` + Categories []Category `gorm:"many2many:product_categories;" json:"categories,omitempty"` + CustomFields []ProductCustomField `json:"custom_fields,omitempty"` } func (Product) TableName() string { diff --git a/backend/internal/models/shipping_template.go b/backend/internal/models/shipping_template.go new file mode 100644 index 0000000..4d140a5 --- /dev/null +++ b/backend/internal/models/shipping_template.go @@ -0,0 +1,35 @@ +package models + +import ( + "time" + + "gorm.io/gorm" +) + +// ShippingTemplate 运费模板 +type ShippingTemplate struct { + ID uint `gorm:"primaryKey" json:"id"` + Name string `gorm:"size:255;not null" json:"name"` // 模板名称(如"江浙沪包邮"、"偏远地区") + CalcType string `gorm:"size:20;not null;default:'weight'" json:"calc_type"` // 计费方式:weight=按重量, piece=按件数 + FirstUnit float64 `gorm:"type:decimal(10,2);not null" json:"first_unit"` // 首重/首件数量 + FirstFee float64 `gorm:"type:decimal(10,2);not null" json:"first_fee"` // 首重/首件价格 + AdditionalUnit float64 `gorm:"type:decimal(10,2);not null" json:"additional_unit"` // 续重/续件数量 + AdditionalFee float64 `gorm:"type:decimal(10,2);not null" json:"additional_fee"` // 续重/续件价格 + FreeAmount float64 `gorm:"type:decimal(10,2);default:0" json:"free_amount"` // 包邮金额(0表示不包邮) + Provinces string `gorm:"type:text" json:"provinces"` // 适用省份列表(JSON数组,为空表示全国) + IsDefault bool `gorm:"default:false" json:"is_default"` // 是否默认模板 + SortOrder int `gorm:"default:0" json:"sort_order"` // 排序 + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` +} + +func (ShippingTemplate) TableName() string { + return "shipping_templates" +} + +// 计费方式常量 +const ( + CalcTypeWeight = "weight" // 按重量计费 + CalcTypePiece = "piece" // 按件数计费 +) diff --git a/backend/internal/schemas/product.go b/backend/internal/schemas/product.go index 4783da4..84a7663 100644 --- a/backend/internal/schemas/product.go +++ b/backend/internal/schemas/product.go @@ -41,44 +41,46 @@ type UpdatePurchaseGroupRequest struct { } type CreateProductRequest struct { - Name string `json:"name" binding:"required"` - Description string `json:"description"` - Price float64 `json:"price" binding:"gte=0"` - Weight float64 `json:"weight"` - MinPurchase int `json:"min_purchase"` - MaxPurchase *int `json:"max_purchase"` - MinWeight *float64 `json:"min_weight"` - MaxWeight *float64 `json:"max_weight"` - MinAmount *float64 `json:"min_amount"` - MaxAmount *float64 `json:"max_amount"` - RequireCredit bool `json:"require_credit"` - CreditCost int `json:"credit_cost"` - CreditReward int `json:"credit_reward"` - Images string `json:"images"` - BrandID *uint `json:"brand_id"` - CategoryIDs []uint `json:"category_ids"` - CustomFields []CustomFieldRequest `json:"custom_fields"` + Name string `json:"name" binding:"required"` + Description string `json:"description"` + Price float64 `json:"price" binding:"gte=0"` + Weight float64 `json:"weight"` + MinPurchase int `json:"min_purchase"` + MaxPurchase *int `json:"max_purchase"` + MinWeight *float64 `json:"min_weight"` + MaxWeight *float64 `json:"max_weight"` + MinAmount *float64 `json:"min_amount"` + MaxAmount *float64 `json:"max_amount"` + RequireCredit bool `json:"require_credit"` + CreditCost int `json:"credit_cost"` + CreditReward int `json:"credit_reward"` + Images string `json:"images"` + BrandID *uint `json:"brand_id"` + ShippingTemplateID *uint `json:"shipping_template_id"` + CategoryIDs []uint `json:"category_ids"` + CustomFields []CustomFieldRequest `json:"custom_fields"` } type UpdateProductRequest struct { - Name *string `json:"name"` - Description *string `json:"description"` - Price *float64 `json:"price"` - Weight *float64 `json:"weight"` - MinPurchase *int `json:"min_purchase"` - MaxPurchase *int `json:"max_purchase"` - MinWeight *float64 `json:"min_weight"` - MaxWeight *float64 `json:"max_weight"` - MinAmount *float64 `json:"min_amount"` - MaxAmount *float64 `json:"max_amount"` - RequireCredit *bool `json:"require_credit"` - CreditCost *int `json:"credit_cost"` - CreditReward *int `json:"credit_reward"` - Images *string `json:"images"` - IsActive *bool `json:"is_active"` - BrandID *uint `json:"brand_id"` - CategoryIDs []uint `json:"category_ids"` - CustomFields []CustomFieldRequest `json:"custom_fields"` + Name *string `json:"name"` + Description *string `json:"description"` + Price *float64 `json:"price"` + Weight *float64 `json:"weight"` + MinPurchase *int `json:"min_purchase"` + MaxPurchase *int `json:"max_purchase"` + MinWeight *float64 `json:"min_weight"` + MaxWeight *float64 `json:"max_weight"` + MinAmount *float64 `json:"min_amount"` + MaxAmount *float64 `json:"max_amount"` + RequireCredit *bool `json:"require_credit"` + CreditCost *int `json:"credit_cost"` + CreditReward *int `json:"credit_reward"` + Images *string `json:"images"` + IsActive *bool `json:"is_active"` + BrandID *uint `json:"brand_id"` + ShippingTemplateID *uint `json:"shipping_template_id"` + CategoryIDs []uint `json:"category_ids"` + CustomFields []CustomFieldRequest `json:"custom_fields"` } type CustomFieldRequest struct { diff --git a/backend/internal/schemas/shipping_template.go b/backend/internal/schemas/shipping_template.go new file mode 100644 index 0000000..33c107c --- /dev/null +++ b/backend/internal/schemas/shipping_template.go @@ -0,0 +1,29 @@ +package schemas + +// CreateShippingTemplateRequest 创建运费模板请求 +type CreateShippingTemplateRequest struct { + Name string `json:"name" binding:"required"` + CalcType string `json:"calc_type" binding:"required,oneof=weight piece"` + FirstUnit float64 `json:"first_unit" binding:"required,gt=0"` + FirstFee float64 `json:"first_fee" binding:"gte=0"` + AdditionalUnit float64 `json:"additional_unit" binding:"required,gt=0"` + AdditionalFee float64 `json:"additional_fee" binding:"gte=0"` + FreeAmount float64 `json:"free_amount"` + Provinces []string `json:"provinces"` // 省份列表 + IsDefault bool `json:"is_default"` + SortOrder int `json:"sort_order"` +} + +// UpdateShippingTemplateRequest 更新运费模板请求 +type UpdateShippingTemplateRequest struct { + Name *string `json:"name"` + CalcType *string `json:"calc_type" binding:"omitempty,oneof=weight piece"` + FirstUnit *float64 `json:"first_unit" binding:"omitempty,gt=0"` + FirstFee *float64 `json:"first_fee" binding:"omitempty,gte=0"` + AdditionalUnit *float64 `json:"additional_unit" binding:"omitempty,gt=0"` + AdditionalFee *float64 `json:"additional_fee" binding:"omitempty,gte=0"` + FreeAmount *float64 `json:"free_amount"` + Provinces []string `json:"provinces"` + IsDefault *bool `json:"is_default"` + SortOrder *int `json:"sort_order"` +} \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index b8bc810..f3c3d0f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,7 @@ - + Sale diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cc5277ac08af815b704faee891125804f771b17f GIT binary patch literal 370070 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ⅅ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

!nPQ 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 dDB-M literal 0 HcmV?d00001 diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/frontend/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index fbf4b6d..2082a8e 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -190,4 +190,11 @@ export const adminApi = { getLogs: (lines?: number) => api.get('/admin/logs', { params: { lines: lines || 500 } }), clearLogs: () => api.delete('/admin/logs'), getLogInfo: () => api.get('/admin/logs/info'), + + // 运费模板 + getShippingTemplates: () => api.get('/admin/shipping-templates'), + getShippingTemplateById: (id: number) => api.get(`/admin/shipping-templates/${id}`), + createShippingTemplate: (data: any) => api.post('/admin/shipping-templates', data), + updateShippingTemplate: (id: number, data: any) => api.put(`/admin/shipping-templates/${id}`, data), + deleteShippingTemplate: (id: number) => api.delete(`/admin/shipping-templates/${id}`), } diff --git a/frontend/src/layouts/AdminLayout.vue b/frontend/src/layouts/AdminLayout.vue index dba8af9..89955b0 100644 --- a/frontend/src/layouts/AdminLayout.vue +++ b/frontend/src/layouts/AdminLayout.vue @@ -69,6 +69,10 @@ 日志管理 + + + 运费管理 + {{ $t('admin.systemSettings') }} @@ -168,7 +172,7 @@ import { ref, computed } from 'vue' import { useRouter, useRoute } from 'vue-router' import { useI18n } from 'vue-i18n' -import { DataAnalysis, User, Folder, Grid, Stamp, Goods, List, Van, Trophy, ChatDotSquare, Setting, Document, Picture, Compass, Fold, Expand, HomeFilled, FullScreen, ArrowDown, SwitchButton, ArrowRight, Wallet, Notebook } from '@element-plus/icons-vue' +import { DataAnalysis, User, Folder, Grid, Stamp, Goods, List, Van, Trophy, ChatDotSquare, Setting, Document, Picture, Compass, Fold, Expand, HomeFilled, FullScreen, ArrowDown, SwitchButton, ArrowRight, Wallet, Notebook, Box } from '@element-plus/icons-vue' import { useUserStore } from '../store/user' import { useCartStore } from '../store/cart' @@ -197,6 +201,7 @@ const pageTitles: Record = { '/admin/banners': '轮播图管理', '/admin/payment': '支付管理', '/admin/logs': '日志管理', + '/admin/shipping-templates': '运费管理', '/admin/settings': '系统设置' } diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index af947b9..d07a75d 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -53,6 +53,7 @@ const routes = [ { path: 'banners', name: 'AdminBanners', component: () => import('../views/admin/Banners.vue') }, { path: 'payment', name: 'AdminPayment', component: () => import('../views/admin/PaymentChannels.vue') }, { path: 'logs', name: 'AdminLogs', component: () => import('../views/admin/Logs.vue') }, + { path: 'shipping-templates', name: 'AdminShippingTemplates', component: () => import('../views/admin/ShippingTemplates.vue') }, ], }, { diff --git a/frontend/src/views/admin/Products.vue b/frontend/src/views/admin/Products.vue index 8cffc43..2de5d44 100644 --- a/frontend/src/views/admin/Products.vue +++ b/frontend/src/views/admin/Products.vue @@ -133,6 +133,15 @@ + + + + + + + + +

@@ -171,6 +180,7 @@ import { getImageUrl } from '../../utils/image' const products = ref([]) const categories = ref([]) const brands = ref([]) +const shippingTemplates = ref([]) const loading = ref(false) const saving = ref(false) const showAdd = ref(false) @@ -202,7 +212,8 @@ const form = reactive({ credit_reward: 0, is_active: true, category_ids: [] as number[], - brand_id: undefined as number | undefined + brand_id: undefined as number | undefined, + shipping_template_id: undefined as number | undefined }) function getFirstImage(images: string) { @@ -268,13 +279,18 @@ async function fetchBrands() { brands.value = res.data || [] } +async function fetchShippingTemplates() { + const res: any = await adminApi.getShippingTemplates() + shippingTemplates.value = res.data || [] +} + function openAdd() { editing.value = null Object.assign(form, { name: '', description: '', price: 0, weight: 0, stock: 0, min_purchase: 1, max_purchase: undefined, require_credit: false, credit_cost: 0, credit_reward: 0, - is_active: true, category_ids: [], brand_id: undefined + is_active: true, category_ids: [], brand_id: undefined, shipping_template_id: undefined }) fileList.value = [] uploadedUrls.value = [] @@ -296,7 +312,8 @@ function editProd(row: any) { credit_reward: row.credit_reward || 0, is_active: row.is_active !== false, category_ids: (row.categories || []).map((c: any) => c.id), - brand_id: row.brand_id + brand_id: row.brand_id, + shipping_template_id: row.shipping_template_id }) const images = row.images ? row.images.split(',').map((s: string) => s.trim()).filter(Boolean) : [] uploadedUrls.value = images @@ -350,6 +367,7 @@ onMounted(() => { fetchProducts() fetchCategories() fetchBrands() + fetchShippingTemplates() }) diff --git a/frontend/src/views/admin/ShippingTemplates.vue b/frontend/src/views/admin/ShippingTemplates.vue new file mode 100644 index 0000000..4e536e1 --- /dev/null +++ b/frontend/src/views/admin/ShippingTemplates.vue @@ -0,0 +1,337 @@ + + + + + \ No newline at end of file