电商通用型商品中心设计

Posted Jcloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电商通用型商品中心设计相关的知识,希望对你有一定的参考价值。

构建一个电商通用型商品中心,可支持商品的种类和属性繁多,可以售卖实物、虚拟、会员、服务类商品。每一种商品具有不同的规格,不同的规格的商品有多种价格,商品可支持多种货币的支付。

作者:京东物流 高峰

1 需求

构建一个电商通用型商品中心,可支持商品的种类和属性繁多,可以售卖实物、虚拟、会员、服务类商品。每一种商品具有不同的规格,不同的规格的商品有多种价格,商品可支持多种货币的支付。

1)目的是什么?

带大家一起实现一个通用型商品中心,从中学到一些扩展性设计思想。

2)你能学到什么?

  • 理解行业术语和概念
  • 动态sku表单设计
  • 属性和sku扩展性设计
  • 价格扩展性设计
  • 商品规格设计

3)不能学到什么?

  • 商品图片存储设计
  • 商品上下架设计
  • 商品标签设计
  • 库存设计
  • 搜索筛选设计

2 商品的基本概念

商品中心是电商各个系统的最基础单元,为商城、订单,优惠促销、库存、仓储物流等系统提供基础数据。

电商的基本术语。

  1. SKU:(Stock Keeping Uint,即库存量单位),库存控制的最小可用单位。例如“iPhone 7 Plus 128G银色”就是一个SKU,仓库管理、采购进货、库存管理都是以SKU为记录单元。
  2. SPU:(Standard Product Unit,即标准化产品单元),是一组标准化信息的集合,例如“iPhone 7 Plus”就是一个SPU。
  3. 类目:即分类树。电商常用的有两层类目:前台展示类目和后端商品类目。
    前台类目指的是展示给消费者看的类目,会根据季节、销售策略、活动进行变动;
    后台类目属于基础数据,不可随意变动,添加SKU时都需要选择后台类目,进行绑定。
  4. 属性:分为关键属性、销售属性、非关键属性、特殊属性。
  • 关键属性 是指能够唯一确定产品的属性,是必填项,例如手机的屏幕尺寸、型号属于关键属性。
  • 销售属性 是组成SKU的特殊属性,或称为“规格属性”,例如手机的“颜色”、“内存”。
  • 非关键属性 指的是除关键属性、销售属性外的其他属性,如前置摄象头像素、后置摄像头像素、产地、分辨率。
  • 特殊属性 指需要通过调用其他服务才能获取到的属性。

3 商品架构图

参考下面的商品组成模块图,商品模块的组成较为复杂,在定义SKU与SPU时,涉及类目、属性、品牌、生产信息等数据的组合,在定义出SKU后再创建SPU,在SPU上添加商品描述和规格最后就成了商品。根据商品又衍生出了价格管理、评论管理、搜索筛选等模块。

3.1 商品组成模块图

3.2 商品中心核心ER图

3.3 商品中心整体架构图

4 商品类目

4.1 类目管理

商品类目分为两层:基础数据类目层(后台类目)、前台展示类目层(前台类目)。那为什么要将前、后台类目分开管理,而不是前、后台共用一套类目呢?
后台类目面向商家或供应链人员,商品属性、销售属性及品牌等很多数据都是在基础类目上进行管理;
前台类目面向用户,方便用户查找商品,还可以随着运营需要去调整。比如而且随着节日、时令季节变化,运营会经常变更前台类目。

4.2 后台类目

后台类目主要面向平台运营人员或商家,用于管理商品、属性和品牌等数据。
后台类目相对固定,确定了之后不会轻易变更或删除,如果类目下挂载有商品,就不能删除或作废。
类目树的层次不能太深,一般三层或四层。如果太深,对于商品的管理不太方便。类目树中最后一层类目称为叶子类目,商品必须挂载于叶子类目下。

4.3 前台类目

前台类目主要面向用户,方便用户筛选查找商品,如图图所示。
前台类目可以根据运营需要,灵活多变。所以处理商品的前端类目时,就应该提供多样化的前端类目来支持。
前台类目可支持不同客户端的设置。PC端、H5端、APP端等
前台类目不同于固定的后台类目,编辑很灵活、可重叠、可删除、可随时变动,定时生效。

4.4 类目表结构设计

4.1.1 后端类目表设计

 CREATE TABLE `category` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `name` varchar(32) NOT NULL COMMENT \'类目名称\',
  `parent_id` bigint(11) NOT NULL COMMENT \'父id\',
  `leaf` tinyint(4) NOT NULL COMMENT \'是否叶子节点 1是 0不是\',
  `level` tinyint(4) NOT NULL COMMENT \'类目层级\',
  `path` varchar(128) DEFAULT NULL COMMENT \'完整父级路径:父父id_父id\',
  `sort` int(11) unsigned NOT NULL COMMENT \'排序字段\',
  `status` tinyint(4) NOT NULL COMMENT \'分类状态:1上架 2下架\',
  `del` tinyint(4) unsigned NOT NULL COMMENT \'是否删除\',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'类目表\';

4.4.2 后端类目数据展示

5 SKU

SKU算是电商中最基础的概念,SKU是最小库存单元。

以iPhone 8 Plus(SPU)为例,这个SPU的规格有多种(颜色包含金 色、白色、黑色、玫瑰金、银色、亮黑、红色等6种;内存包含32G、 128G、256G等3种),对应18(即3×6)种SKU。比如“iPhone 7 Plus白 色32G”、“iPhone 7 Plus黑色32G”这两个SKU都能具化到实物。仓库系统、采购系统、库存系统等系统都是主要管理SKU。

5.1 sku表设计

CREATE TABLE `sku` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_no` varchar(32) DEFAULT \'\' COMMENT \'商品序列号\',
  `sku_name` varchar(50) DEFAULT NULL COMMENT \'商品名称\',
  `sku_description` varchar(256) DEFAULT NULL COMMENT \'商品描述\',
  `sku_type` tinyint(4) DEFAULT NULL COMMENT \'商品类型:1实物商品、2会员商品、3增值商品,4虚拟物品\',
  `status` tinyint(4) NOT NULL COMMENT \'状态 1未上架2.已上架 3.已下架\',
  `sort` int(10) DEFAULT \'0\' COMMENT \'排序\',
  `boundle` tinyint(4) unsigned DEFAULT \'0\' COMMENT \'是否组合商品 1是 0否\',
  `create_by` int(11) unsigned NOT NULL COMMENT \'创建人ID\',
  `update_by` int(11) unsigned DEFAULT NULL COMMENT \'修改人ID\',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY(`id`) USING BTREE,
  UNIQUE KEY `uk_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = \'商品表\'

5.2 sku表数据

5.3 sku属性表

扩展性1:动态无限制创建属性数量。

CREATE TABLE `sku_attr` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_no` varchar(32) DEFAULT \'\' COMMENT \'商品序列号\',
  `sku_attrs` json DEFAULT NULL COMMENT \'sku属性(商品属性)\',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY(`id`) USING BTREE,
  UNIQUE KEY `uk_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = \'商品属性表\'

5.4 sku属性数据

不创建新字段,还可以用sql查询,你得到了什么启发?

5.5 sku动态表单

扩展性2:根据不同类目加载不同属性渲染动态表单。

将一组属性挂载到类目来实现动态表单,你得到了什么启发?

5.6 商品类目关联

CREATE TABLE `category_to_goods` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `category_id` bigint(20) DEFAULT NULL COMMENT \'类目id\',
  `goods_no` varchar(32) DEFAULT NULL COMMENT \'商品编号\',
  `goods_type` tinyint(4) DEFAULT NULL COMMENT \'商品类型:1sku、2spu\',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  `is_deleted` tinyint(4) unsigned NOT NULL DEFAULT \'0\' COMMENT \'是否删除:0-否,1-是\',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT=\'类目商品关联表\';

5.7 组合sku关系表

CREATE TABLE `bundle_to_sku` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `goods_id` bigint(20) DEFAULT NULL COMMENT \'商品id, 组合商品id\',
  `bundle_id` bigint(20) DEFAULT NULL COMMENT \'组合商品id\',
  `quantity` int(11) DEFAULT NULL COMMENT \'商品数量\',
  `entity_type` tinyint(4) DEFAULT \'1\' COMMENT \'商品的类型:1sku,2组合商品\',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  `is_deleted` tinyint(1) unsigned NOT NULL DEFAULT \'0\' COMMENT \'是否删除:0-否,1-是\',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_bundle_to_goods_bundle_id_index` (`bundle_id`) USING BTREE,
  KEY `idx_bundle_to_goods_object_id_entity_type_index` (`object_id`,`entity_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'套装和sku关联表||套装和spu关联表\';

5.8 组合sku关系数据

sku数据

5.9 创建组合商品表单

6 属性

6.1 属性管理

为了方便商品管理,我们需要在系统中建立一套属性库。在定义一个属性时,需要挂载在类目下,区分属性分类(关键属性、销售属性、非关键属性、特殊属性),并确定属性值、显示类型(单选、多选、可自定义)、是否必填。

6.2 属性的应用场景

  1. 添加商品时候的商品表单渲染。在添加商品时,可通过选择叶子类目,将挂载到叶子类目的属性渲染到表单上。
  2. 在客户端对可根据不同的属性进行搜索、筛选商品。
  3. 在spu页面用户可利用商品规格(销售属性)来定位出不同的sku。
  4. 商品详情页面可展示出后台配置的属性参数数据。

6.3 属性表设计

CREATE TABLE `attribute` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `name` varchar(32) NOT NULL DEFAULT \'\' COMMENT \'属性名称\',
  `code` varchar(32) DEFAULT NULL COMMENT \'属性代码(非必填)\',
  `attr_type` tinyint(4) NOT NULL COMMENT \'属性应用:1商品属性,2销售属性,3特殊属性\',
  `value_type` tinyint(4) DEFAULT NULL COMMENT \'属性值类型:1:字符串,2:数字\',
  `fill_type` tinyint(4) NOT NULL COMMENT \'填写类型:1填写型(字符),2填写型(仅整数数字),3选择型(单选值,非id)4选择型(多选值,非id),5多输入框展示型\',
  `is_filter` tinyint(4) unsigned NOT NULL COMMENT \'是否支持前台筛选:0否 1是\',
  `status` tinyint(11) NOT NULL COMMENT \'状态:1 未上架 2已上架 3已下架\',
  `is_deleted` tinyint(4) unsigned NOT NULL COMMENT \'是否删除\',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'修改时间\',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT=\'属性表\';

6.4 属性表数据

6.5 属性枚举表设计

CREATE TABLE `attribute_enum` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `attr_id` bigint(20) NOT NULL COMMENT \'属性id\',
  `attr_code` varchar(32) DEFAULT NULL,
  `enum_code` bigint(11) DEFAULT NULL COMMENT \'enumcode\',
  `enum_value` varchar(32) NOT NULL COMMENT \'属性枚举值名称\',
  `sort` int(11) NOT NULL COMMENT \'排序\',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'属性枚举表\';

6.6 属性枚举表数据

6.7 属性和类目关联表设计

CREATE TABLE `category_to_attr` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `category_id` bigint(11) NOT NULL COMMENT \'分类id\',
  `attr_id` bigint(20) NOT NULL COMMENT \'属性id\',
  `is_required` tinyint(4) unsigned NOT NULL COMMENT \'是否必填\',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'分类属性关联表\';

6.8 动态生成属性表单

当属性库搭建完成后,就会被各个叶子类目调用,添加商品时就需要填写这些属性,商品就有了载体,如图所示。

根据这些属性便能确定商品的唯一性(SKU)。 淘宝的商品属性(类目“男装”→“风衣”) 特别需要注意的是一些规格属性(如颜色、尺码等)。很多产品有 多规格,例如衣服、鞋子等。以一双男鞋为例,有颜色(假设白、红、 黑3种颜色),有尺码(从39~44共6种尺码),那么这个SPU(男鞋) 下面就有18个SKU。这些SKU的属性除了规格属性外,其他属性都是一 致的,所以在新建商品时,可聚合到一起,共用其他属性。

7 SPU

7.1 SPU概念

SPU 是标准化产品单元。SPU与SKU的关系有许多种,可以一对多、一对一, 绝大部分SPU与SKU都是一对一,多规格的SPU和SKU之间是通过规格属性来连接的。SPU的库存是由其对应的SKU库存共同决定的。

以iPhone 11(SPU)为例,这个SPU的规格有多种(颜色包含白色、黑色、黄金、紫色、绿色、红色等6种;内存包含32G、 128G、256G等3种),对应18(即3×6)种SKU。比如“iPhone 11 白色 64G”、“iPhone 11 黑色 64G”这两个SKU都能具化到实物。仓库系统、采购系统、库存系统等系统都是主要管理SKU。 在日常运营中也很常见一个SKU对应多个SPU。

7.2 SPU和规格设计

CREATE TABLE `spu` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `name` varchar(64) DEFAULT NULL COMMENT \'spu名称\',
  `detail` varchar(256) DEFAULT NULL COMMENT \'商品介绍\',
  `status` tinyint(4) DEFAULT NULL COMMENT \'状态 1未上架2.已上架 2.已下架\',
  `spu_specs` json DEFAULT NULL COMMENT \'商品规格\',
  `creator_id` bigint(20) DEFAULT NULL COMMENT \'创建者\',
  `is_deleted` tinyint(1) unsigned DEFAULT \'0\' COMMENT \'是否删除,0:未删除 1:已删除\',
  `sort` int(10) DEFAULT \'0\' COMMENT \'排序\',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'spu\';

7.3 SPU和规格数据

sku属性数据

spu表单图片

7.4 spu和sku关联表

CREATE TABLE `spu_to_sku` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
  `sku_no` varchar(32) NOT NULL DEFAULT \'\' COMMENT \'sku id\',
  `spu_no` varchar(32) NOT NULL DEFAULT \'\' COMMENT \'spu id\',
  `is_deleted` tinyint(1) DEFAULT \'0\' COMMENT \'是否删除,0:未删除 1:已删除\',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_spu_to_sku` (`spu_no`,`sku_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT=\'spu商品关联表\';

8 价格设计

价格包括:成本价、原价、售卖价、定金、膨胀金等会随着需求的不断增加,尤其是一些在线教育等垂直行业电商对金额会有各种玩法。

CREATE TABLE `sku_price` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `sku_id` bigint(11) unsigned NOT NULL COMMENT \'商品id\',
  `sku_no` varchar(20) NOT NULL DEFAULT \'\' COMMENT \'商品编号\',
  `sku_type` tinyint(4) NOT NULL COMMENT \'商品类型: 1单sku 2组合sku\',
  `sub_goods` tinyint(4) NOT NULL COMMENT \'是否子商品:0否1是\',
  `bundle_id` bigint(20) DEFAULT NULL COMMENT \'组合商品id 默认 空\',
  `price` decimal(10, 2) NOT NULL COMMENT \'价格\',
  `price_type` varchar(32) NOT NULL COMMENT \'价格类型枚举(1.商品原价REAL_PRICE 2.售卖价SELL_PRICE 3.售卖底价... )\',
  `currency_type` tinyint(4) NOT NULL DEFAULT \'1\' COMMENT \'货币类型:1人民币 2虚拟币\',
  `enable` tinyint(4) unsigned DEFAULT \'1\' COMMENT \'是否启用 0 不启用 1  启用\',
  `create_by` int(11) unsigned NOT NULL COMMENT \'创建人ID\',
  `update_by` int(11) unsigned DEFAULT NULL COMMENT \'修改人ID\',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT \'创建时间\',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT \'更新时间\',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_sku_id` (`sku_id`) USING BTREE,
  KEY `idx_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = \'商品价格表\' "

扩展性3:不创建新字段,同一个商品可支持多种价格和货币种类

9 总结

本文详细介绍了商品中心设计扩展性设计思想,并在设计方面做了各维度分析。

扩展性总结如下:

动态无限制创建属性数量。
根据不同类目加载不同属性渲染动态表单。
不创建新字段,同一个商品可支持多种价格和货币种类。

希望自己总结的扩展性思想可以让大家在开发过程中有所启发。

商品中心中台支持系统-商品销售信息设计

目录

商品中心中台支持系统-商品销售信息设计

修订记录

日期 版本 章节 描述 作者
2018-10-25 V1.0 初始版本 无涯

目录

1、商品销售信息设计

本文讲述电商系统构建中,商品中心销售信息模块的相关知识和数据存储设计。

1.1、商品知识

商品销售信息包括商品价格信息,媒体信息,属性信息,商品描述信息等商品的通用扩展信息管理。
媒体信息:商品主图,商品切换图,商品视频。
属性信息:关键属性(通过该属性可搜索信息),一般属性(文本描述)。
应用场景:

  • 1.商品销售信息管理模块。
  • 2.商品销售信息展示模块。
    如京东商品销售界面:
    技术分享图片

1.2、商品销售信息管理

1.2.1、商品销售信息管理思维导图

技术分享图片
商品销售信息暂定包括以上模块,对应物流信息,其他商品扩展模块可在此基础上继续添加。

1.3、应用模块示例

商品销售属性信息列表:
技术分享图片

商品sku扩展信息填写:
技术分享图片
商品销售平台信息填写:
技术分享图片
商品宝描信息填写:
技术分享图片
商品媒体信息填写:
技术分享图片
商品属性信息填写:
技术分享图片

1.4、数据结构设计

1.4.1、数据表设计

平台信息是指商品在不同平台(如淘宝和天猫)销售时,需要设置不同的销售信息。商品还有一部分属性信息是在所有平台都通用的。商品销售信息主要存储在如下数据表中。商品的宝描信息是商品详情页面的具体明细描述信息,他存储在独立的文章系统中。商品中心可通过对应接口存储和获取商品的宝描信息。
技术分享图片

字段说明:
sku扩展表
1.guarantee_period:保质期
2.goods_airlift:空运商品
3.goods_flip:轻抛商品
4.drug_goods:是否药品
5.goods_nature:商品性质
6.sale_price:卖价
7.market_price:市场价
sku平台销售表
1.sku_id:sku编码
2.sale_channel:平台编码
3.goods_phrase:卖点促销语
4.goods_introduce:推荐理由
5.mini_retail_price:最低零售价
6.trade_price:批发价
7.goods_used:商品用途
商品属性关系表
1.sku_id:sku编码
2.attr_id:属性编码
3.attr_relation_id:属性值编码
4.attr_type:属性类型
5.attr_relation_text:商品文本属性值
商品媒体信息表
1.sku_id:sku编码
2.sale_channel:平台编码
3.media_type:媒体类型
4.media_path:媒体路径

1.4.2、商品销售数据示例

展示商品sku扩展数据:
技术分享图片
展示商品平台扩展数据:
技术分享图片
展示商品媒体数据:
技术分享图片
展示商品属性测试数据:
技术分享图片
展示商品宝描测试数据:
技术分享图片

1.5、设计原则说明

属性数据表设计原则:
1.基础信息字段细分独立。
2.业务归类。
3.商品与属性值关系存储为key-value模式,一条记录存储一个对应关系。

























































以上是关于电商通用型商品中心设计的主要内容,如果未能解决你的问题,请参考以下文章

电商商品库的产品设计

电商系统设计之商品管理

中小型电商系统商品属性设计与实现

Django电商网站--架构设计

基于springboot电商生鲜购物商城平台设计与实现(含源码+数据库文件)

如何一步一步用DDD设计一个电商网站—— 把商品卖给用户