位置: 文档库 > PHP > PHP商城开发:如何设计和实现SKU管理模块

PHP商城开发:如何设计和实现SKU管理模块

苍龙出海 上传于 2020-01-13 14:13

《PHP商城开发:如何设计和实现SKU管理模块》

在电商系统开发中,SKU(Stock Keeping Unit,库存量单位)管理是商品管理的核心功能之一。它通过定义商品的唯一属性组合(如颜色、尺寸、规格等),实现精细化库存控制、价格管理和订单处理。本文将结合PHP技术栈,从数据库设计、业务逻辑实现到前端交互,系统阐述SKU管理模块的开发方法。

一、SKU管理模块的核心需求

SKU管理的核心目标是解决多属性商品的唯一标识问题。例如,同一款T恤可能有红色、蓝色两种颜色,以及S、M、L三种尺寸,共需生成6个SKU。每个SKU需独立管理库存、价格、条形码等信息。典型需求包括:

  • 动态属性组合:支持任意数量的商品属性(如颜色、内存、版本)

  • 批量操作:支持批量修改价格、库存、上下架状态

  • 库存预警:设置最低库存阈值并触发提醒

  • 数据校验:防止重复SKU生成,确保属性组合唯一性

二、数据库设计

SKU管理需要三张核心表:商品表(products)、属性表(attributes)、SKU表(skus),并通过中间表实现多对多关系。

1. 商品表(products)

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL COMMENT '商品名称',
  `category_id` int(11) NOT NULL COMMENT '分类ID',
  `description` text COMMENT '商品描述',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 属性表(attributes)

包含属性组(如"颜色")和属性值(如"红色")

CREATE TABLE `attribute_groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '属性组名称',
  `product_id` int(11) NOT NULL COMMENT '所属商品ID',
  PRIMARY KEY (`id`)
);

CREATE TABLE `attribute_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_id` int(11) NOT NULL COMMENT '属性组ID',
  `value` varchar(50) NOT NULL COMMENT '属性值',
  PRIMARY KEY (`id`)
);

3. SKU表(skus)

CREATE TABLE `skus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品ID',
  `sku_code` varchar(30) NOT NULL COMMENT 'SKU编码',
  `price` decimal(10,2) NOT NULL COMMENT '销售价格',
  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存数量',
  `barcode` varchar(50) DEFAULT NULL COMMENT '条形码',
  `specs` json NOT NULL COMMENT '属性组合JSON',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1上架 0下架',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_sku_code` (`sku_code`),
  KEY `idx_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

specs字段使用JSON存储属性组合,例如:

{
  "颜色": "红色",
  "尺寸": "M"
}

三、PHP业务逻辑实现

1. SKU生成服务

核心逻辑是遍历所有属性组合生成SKU:

class SkuGenerator {
  /**
   * 生成所有SKU组合
   * @param int $productId 商品ID
   * @param array $attributeGroups 属性组列表
   * @return array
   */
  public function generateSkus($productId, array $attributeGroups) {
    $combinations = $this->cartesianProduct($attributeGroups);
    $skus = [];
    
    foreach ($combinations as $combo) {
      $specs = [];
      foreach ($combo as $groupId => $valueId) {
        $group = AttributeGroup::find($groupId);
        $value = AttributeValue::find($valueId);
        $specs[$group->name] = $value->value;
      }
      
      $skus[] = [
        'product_id' => $productId,
        'sku_code' => $this->generateSkuCode($productId, $specs),
        'specs' => json_encode($specs),
        'price' => 0, // 默认价格,可后续修改
        'stock' => 0
      ];
    }
    
    return $skus;
  }
  
  private function cartesianProduct(array $attributeGroups) {
    $result = [[]];
    foreach ($attributeGroups as $group) {
      $tmp = [];
      foreach ($result as $product) {
        foreach ($group['values'] as $value) {
          $tmp[] = array_merge($product, [$group['id'] => $value['id']]);
        }
      }
      $result = $tmp;
    }
    return $result;
  }
}

2. SKU编码生成策略

推荐使用商品ID+属性值首字母的组合方式:

private function generateSkuCode($productId, array $specs) {
  $code = 'SP' . str_pad($productId, 6, '0', STR_PAD_LEFT);
  foreach ($specs as $name => $value) {
    $code .= substr(md5($name . $value), 0, 2);
  }
  return $code;
}

3. 库存同步服务

处理订单时需同步减少库存:

class InventoryService {
  public function reduceStock($skuId, $quantity) {
    DB::beginTransaction();
    try {
      $sku = Sku::find($skuId);
      if ($sku->stock decrement('stock', $quantity);
      
      // 记录库存变动日志
      InventoryLog::create([
        'sku_id' => $skuId,
        'change_type' => 'order',
        'change_quantity' => -$quantity,
        'before_stock' => $sku->stock + $quantity,
        'after_stock' => $sku->stock
      ]);
      
      DB::commit();
      return true;
    } catch (Exception $e) {
      DB::rollBack();
      throw $e;
    }
  }
}

四、前端交互实现

1. 属性选择组件

使用Vue.js实现动态属性选择:



2. SKU表格展示

使用DataTables展示SKU列表:

$(document).ready(function() {
  $('#sku-table').DataTable({
    ajax: '/api/skus?product_id=123',
    columns: [
      { data: 'sku_code', title: 'SKU编码' },
      { data: 'specs', title: '规格', 
        render: function(data) {
          return Object.entries(data).map(([k,v]) => `${k}:${v}`).join('; ');
        }
      },
      { data: 'price', title: '价格' },
      { data: 'stock', title: '库存' },
      { data: 'status', title: '状态',
        render: function(data) {
          return data ? '上架' : 
                 '下架';
        }
      }
    ]
  });
});

五、性能优化策略

1. 数据库查询优化

  • 为specs字段创建生成列(MySQL 5.7+)

  • 对常用查询条件建立复合索引

  • 使用缓存存储热门商品SKU数据

2. 批量操作实现

class SkuBatchService {
  public function batchUpdate(array $skuIds, array $data) {
    $affected = Sku::whereIn('id', $skuIds)
      ->when(isset($data['price']), function($q) use ($data) {
        $q->update(['price' => $data['price']]);
      })
      ->when(isset($data['stock']), function($q) use ($data) {
        $q->update(['stock' => $data['stock']]);
      })
      ->count();
    
    return $affected;
  }
}

六、安全与校验

1. 数据唯一性校验

public function validateSkuUniqueness(array $specs, $productId) {
  $existing = Sku::where('product_id', $productId)
    ->where('specs', json_encode($specs))
    ->first();
  
  if ($existing) {
    throw new ValidationException('该规格组合已存在');
  }
}

2. 权限控制

// Laravel中间件示例
public function handle($request, Closure $next) {
  if (!auth()->user()->can('manage-skus')) {
    abort(403);
  }
  
  return $next($request);
}

七、扩展功能设计

1. 图片关联管理

为不同SKU关联不同图片:

CREATE TABLE `sku_images` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_id` int(11) NOT NULL,
  `image_url` varchar(255) NOT NULL,
  `is_main` tinyint(1) DEFAULT '0',
  `sort_order` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_sku_id` (`sku_id`)
);

2. 多级价格体系

CREATE TABLE `sku_prices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_id` int(11) NOT NULL,
  `price_type` varchar(20) NOT NULL COMMENT '会员价/批发价/促销价',
  `price` decimal(10,2) NOT NULL,
  `start_time` datetime DEFAULT NULL,
  `end_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_sku_type` (`sku_id`, `price_type`)
);

八、测试用例设计

1. 单元测试示例

class SkuGeneratorTest extends TestCase {
  public function testGenerateSkusWithTwoAttributes() {
    $product = Product::create(['name' => '测试商品']);
    $groups = [
      ['id' => 1, 'values' => [['id' => 101, 'value' => '红色'], ['id' => 102, 'value' => '蓝色']]],
      ['id' => 2, 'values' => [['id' => 201, 'value' => 'S'], ['id' => 202, 'value' => 'M']]]
    ];
    
    $generator = new SkuGenerator();
    $skus = $generator->generateSkus($product->id, $groups);
    
    $this->assertCount(4, $skus);
    $this->assertEquals(
      '{"颜色":"红色","尺寸":"S"}', 
      $skus[0]['specs']
    );
  }
}

2. 集成测试要点

  • 测试批量更新接口的原子性

  • 验证库存不足时的订单拦截

  • 检查SKU编码的唯一性约束

九、部署与监控

1. 监控指标

  • SKU生成耗时

  • 库存同步成功率

  • 属性组合查询QPS

2. 日志记录

// Laravel日志示例
Log::channel('sku')->info('SKU库存变更', [
  'sku_id' => 123,
  'operator' => auth()->id(),
  'change' => -5,
  'before' => 100,
  'after' => 95
]);

关键词:PHP商城开发、SKU管理、数据库设计、属性组合、库存控制、JSON存储、批量操作、前端交互、性能优化安全校验

简介:本文详细阐述了PHP商城系统中SKU管理模块的设计与实现方法,涵盖数据库设计、业务逻辑、前端交互、性能优化等全流程,提供了属性组合生成、库存同步、批量操作等核心功能的实现代码,并讨论了安全校验、扩展功能设计和测试策略。