diff --git a/backend/internal/api/handlers/product.go b/backend/internal/api/handlers/product.go
index 8fe6338..43c7813 100644
--- a/backend/internal/api/handlers/product.go
+++ b/backend/internal/api/handlers/product.go
@@ -49,16 +49,17 @@ func (h *CategoryHandler) Create(c *gin.Context) {
}
category := models.Category{
- Name: req.Name,
- Description: req.Description,
- ParentID: req.ParentID,
- MinAmount: req.MinAmount,
- MaxAmount: req.MaxAmount,
- MinQuantity: req.MinQuantity,
- MaxQuantity: req.MaxQuantity,
- MinWeight: req.MinWeight,
- MaxWeight: req.MaxWeight,
- SortOrder: req.SortOrder,
+ Name: req.Name,
+ Description: req.Description,
+ ParentID: req.ParentID,
+ MinAmount: req.MinAmount,
+ MaxAmount: req.MaxAmount,
+ MinQuantity: req.MinQuantity,
+ MaxQuantity: req.MaxQuantity,
+ MinWeight: req.MinWeight,
+ MaxWeight: req.MaxWeight,
+ AllowCrossCategory: req.AllowCrossCategory != nil && *req.AllowCrossCategory,
+ SortOrder: req.SortOrder,
}
if err := utils.DB.Create(&category).Error; err != nil {
@@ -122,6 +123,9 @@ func (h *CategoryHandler) Update(c *gin.Context) {
if req.SortOrder != nil {
updates["sort_order"] = *req.SortOrder
}
+ if req.AllowCrossCategory != nil {
+ updates["allow_cross_category"] = *req.AllowCrossCategory
+ }
utils.DB.Model(&category).Updates(updates)
c.JSON(http.StatusOK, gin.H{"data": category})
diff --git a/backend/internal/models/category.go b/backend/internal/models/category.go
index 62af1fa..d35ba24 100644
--- a/backend/internal/models/category.go
+++ b/backend/internal/models/category.go
@@ -7,22 +7,23 @@ import (
)
type Category struct {
- ID uint `gorm:"primaryKey" json:"id"`
- Name string `gorm:"size:100;not null;uniqueIndex" json:"name"`
- Description string `json:"description"`
- ParentID *uint `json:"parent_id"`
- MinAmount *float64 `json:"min_amount"`
- MaxAmount *float64 `json:"max_amount"`
- MinQuantity *int `json:"min_quantity"`
- MaxQuantity *int `json:"max_quantity"`
- MinWeight *float64 `json:"min_weight"`
- MaxWeight *float64 `json:"max_weight"`
- 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:"-"`
- ProductCount int64 `gorm:"-" json:"product_count"`
- Children []Category `gorm:"foreignKey:ParentID" json:"children,omitempty"`
+ ID uint `gorm:"primaryKey" json:"id"`
+ Name string `gorm:"size:100;not null;uniqueIndex" json:"name"`
+ Description string `json:"description"`
+ ParentID *uint `json:"parent_id"`
+ MinAmount *float64 `json:"min_amount"`
+ MaxAmount *float64 `json:"max_amount"`
+ MinQuantity *int `json:"min_quantity"`
+ MaxQuantity *int `json:"max_quantity"`
+ MinWeight *float64 `json:"min_weight"`
+ MaxWeight *float64 `json:"max_weight"`
+ AllowCrossCategory bool `gorm:"default:false" json:"allow_cross_category"`
+ 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:"-"`
+ ProductCount int64 `gorm:"-" json:"product_count"`
+ Children []Category `gorm:"foreignKey:ParentID" json:"children,omitempty"`
}
func (Category) TableName() string {
diff --git a/backend/internal/schemas/product.go b/backend/internal/schemas/product.go
index 9cfd4e0..0de40e7 100644
--- a/backend/internal/schemas/product.go
+++ b/backend/internal/schemas/product.go
@@ -1,29 +1,31 @@
package schemas
type CreateCategoryRequest struct {
- Name string `json:"name" binding:"required"`
- Description string `json:"description"`
- ParentID *uint `json:"parent_id"`
- MinAmount *float64 `json:"min_amount"`
- MaxAmount *float64 `json:"max_amount"`
- MinQuantity *int `json:"min_quantity"`
- MaxQuantity *int `json:"max_quantity"`
- MinWeight *float64 `json:"min_weight"`
- MaxWeight *float64 `json:"max_weight"`
- SortOrder int `json:"sort_order"`
+ Name string `json:"name" binding:"required"`
+ Description string `json:"description"`
+ ParentID *uint `json:"parent_id"`
+ MinAmount *float64 `json:"min_amount"`
+ MaxAmount *float64 `json:"max_amount"`
+ MinQuantity *int `json:"min_quantity"`
+ MaxQuantity *int `json:"max_quantity"`
+ MinWeight *float64 `json:"min_weight"`
+ MaxWeight *float64 `json:"max_weight"`
+ AllowCrossCategory *bool `json:"allow_cross_category"`
+ SortOrder int `json:"sort_order"`
}
type UpdateCategoryRequest struct {
- Name *string `json:"name"`
- Description *string `json:"description"`
- ParentID *uint `json:"parent_id"`
- MinAmount *float64 `json:"min_amount"`
- MaxAmount *float64 `json:"max_amount"`
- MinQuantity *int `json:"min_quantity"`
- MaxQuantity *int `json:"max_quantity"`
- MinWeight *float64 `json:"min_weight"`
- MaxWeight *float64 `json:"max_weight"`
- SortOrder *int `json:"sort_order"`
+ Name *string `json:"name"`
+ Description *string `json:"description"`
+ ParentID *uint `json:"parent_id"`
+ MinAmount *float64 `json:"min_amount"`
+ MaxAmount *float64 `json:"max_amount"`
+ MinQuantity *int `json:"min_quantity"`
+ MaxQuantity *int `json:"max_quantity"`
+ MinWeight *float64 `json:"min_weight"`
+ MaxWeight *float64 `json:"max_weight"`
+ AllowCrossCategory *bool `json:"allow_cross_category"`
+ SortOrder *int `json:"sort_order"`
}
type CreateProductRequest struct {
diff --git a/frontend/src/views/admin/Categories.vue b/frontend/src/views/admin/Categories.vue
index 46bee47..51cbe02 100644
--- a/frontend/src/views/admin/Categories.vue
+++ b/frontend/src/views/admin/Categories.vue
@@ -14,6 +14,13 @@
-
+
+
+
+ {{ row.allow_cross_category ? '允许' : '不允许' }}
+
+
+
编辑
@@ -41,6 +48,9 @@
+
+
+
取消
@@ -65,7 +75,7 @@ const paginatedCategories = computed(() => {
const start = (page.value - 1) * pageSize
return categories.value.slice(start, start + pageSize)
})
-const form = reactive({ name: '', description: '', min_amount: undefined as number | undefined, max_amount: undefined as number | undefined, min_quantity: undefined as number | undefined, max_quantity: undefined as number | undefined, min_weight: undefined as number | undefined, max_weight: undefined as number | undefined })
+const form = reactive({ name: '', description: '', min_amount: undefined as number | undefined, max_amount: undefined as number | undefined, min_quantity: undefined as number | undefined, max_quantity: undefined as number | undefined, min_weight: undefined as number | undefined, max_weight: undefined as number | undefined, allow_cross_category: false })
function handlePageChange() {
window.scrollTo({ top: 0, behavior: 'smooth' })
@@ -78,13 +88,13 @@ async function fetchCategories() {
function openAdd() {
editing.value = null
- Object.assign(form, { name: '', description: '', min_amount: undefined, max_amount: undefined, min_quantity: undefined, max_quantity: undefined, min_weight: undefined, max_weight: undefined })
+ Object.assign(form, { name: '', description: '', min_amount: undefined, max_amount: undefined, min_quantity: undefined, max_quantity: undefined, min_weight: undefined, max_weight: undefined, allow_cross_category: false })
showAdd.value = true
}
function editCat(row: any) {
editing.value = row
- Object.assign(form, { name: row.name, description: row.description || '', min_amount: row.min_amount, max_amount: row.max_amount, min_quantity: row.min_quantity, max_quantity: row.max_quantity, min_weight: row.min_weight, max_weight: row.max_weight })
+ Object.assign(form, { name: row.name, description: row.description || '', min_amount: row.min_amount, max_amount: row.max_amount, min_quantity: row.min_quantity, max_quantity: row.max_quantity, min_weight: row.min_weight, max_weight: row.max_weight, allow_cross_category: row.allow_cross_category || false })
showAdd.value = true
}