一、数据表
1、规格类目表(用于后台添加商品时使用)
-- 规格类目表
DROP TABLE IF EXISTS `product_spec_group`;
CREATE TABLE `product_spec_group` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规格类目ID',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目唯一编号, 用于在只看到规格类目编号时就能快速知道是什么规格类目',
`spec_group_name` varchar(200) NOT NULL COMMENT '规格类目名称',
`is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除 0-未删除 1-已删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_spg_sn`(`spec_group_sn`) USING BTREE,
UNIQUE INDEX `unq_name`(`spec_group_name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '规格类目表,用于后台添加编辑商品';
2、规格名表
-- 规格名表
DROP TABLE IF EXISTS `product_spec`;
CREATE TABLE `product_spec` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规格ID',
`spec_sn` int(10) UNSIGNED NOT NULL COMMENT '该规格名唯一编号',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '所属规格类目编号,关联product_spec_group',
`spec_name` varchar(200) NOT NULL COMMENT '规格名称',
`sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_spc_sn`(`spec_sn`) USING BTREE,
INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品-规格名表';
3、规格值表
-- 规格值表
DROP TABLE IF EXISTS `product_spec_value`;
CREATE TABLE `product_spec_value` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号,关联product_spec',
`spec_value_sn` varchar(128) NOT NULL COMMENT '规格值唯一编号',
`spec_value_name` varchar(640) NOT NULL DEFAULT '' COMMENT '规格值名称',
`sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
UNIQUE INDEX `unq_spv_sn`(`spec_value_sn`) USING BTREE,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='产品线规格名对应的规格值表';
4、产品表
-- 产品表
DROP TABLE IF EXISTS `product_spu`;
CREATE TABLE `product_spu` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '产品ID',
`title` varchar(200) NOT NULL COMMENT '标题',
`sub_title` varchar(200) NULL DEFAULT NULL COMMENT '副标题',
`category_id` int(10) UNSIGNED NOT NULL COMMENT '分类ID,关联product_category',
`brand_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '品牌ID,关联product_brand',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目唯一编码,关联product_spec_group',
`spu_image` varchar(256) NOT NULL COMMENT '仅用于商品列表中显示的图片',
`is_have_spec` TINYINT(1) NOT NULL COMMENT '表示该产品是否是多规格商品 0-不是 1-是',
`sku_list` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '该产品skuList json化,如果为空值,说明该产品没有规格',
`saleable` tinyint(1) NOT NULL COMMENT '是否上架',
`is_valid` tinyint(1) NOT NULL COMMENT '是否有效',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
`is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_brand_id`(`brand_id`) USING BTREE,
INDEX `idx_category_id`(`category_id`) USING BTREE,
INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE,
INDEX `idx_saleable`(`saleable`) USING BTREE,
INDEX `idx_valid`(`is_valid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '产品表';
5、商品表
-- 商品表
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`spu_id` INT(10) UNSIGNED NOT NULL COMMENT '所属产品ID,关联product_spu',
`title` VARCHAR(200) NOT NULL COMMENT '商品标题',
`images` JSON NULL COMMENT '商品图片',
`price` DECIMAL(10, 2) UNSIGNED NOT NULL COMMENT '价格',
`spec_sn_combination` varchar(128) NOT NULL DEFAULT '' COMMENT '商品规格组合,比如 1_27_99',
`saleable` Tinyint(1) NOT NULL COMMENT '是否上架',
`valid` Tinyint(1) NOT NULL COMMENT '是否有效',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后修改时间',
`is_deleted` Tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_spu_id`(`spu_id`) USING BTREE,
INDEX `idx_saleable`(`saleable`) USING BTREE,
INDEX `idx_valid`(`valid`) USING BTREE,
FULLTEXT INDEX `title`(`title`)
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品表';
6、规格及规格值使用记录维护表
冗余表,维护表,用于记录已经被使用到的规格名唯一编号和规格值唯一编号。
商品添加或编辑时,事务将当前产品spu_id下的所有记录删除,并添加新添加或修改的数据。在后台进行删除规格或规格值时使用到,如果有商品在使用,则不允许删除。
DROP TABLE IF EXISTS `spec_and_value_use_record`;
CREATE TABLE `spec_and_value_use_record` (
`spu_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '产品ID',
`spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号',
`spec_value_sn` varchar(128) NOT NULL DEFAULT '' COMMENT '规格值唯一编号',
`record_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '记录类型 1-规格名 2-规格值',
PRIMARY KEY (`spu_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='规格及规格值使用记录表';
二、请求接口及返回接口需要注意的地方
1、后台操作添加或修改商品时,我们需要组装并存储到指定字段的数据格式
建议按照下面格式组装一个array,存储到product_spu 中的 sku_list 字段,用于之后wap端查询时返回数据。
{
"sku_list": [
{
"spec_sn":"100",
"spec_value_sn_list":["10001", "10002"]
},
{
"spec_sn":"101",
"spec_value_sn_list":["10005", "10006"]
}
]
}
2、wap端请求商品详情时,我们返回给前端的数据格式
无规格商品:
{
"is_have_spec":0,
"sku_sn":"100030",
"price":14000,
"inventory":19
}
多规格商品:
{
"is_have_spec":1,
"sku_list": [
{
"spec_name":"码数",
"spec_value_list":[
{
"spec_value_sn":"10001",
"spec_value":"L",
"sort":1
},
{
"spec_value_sn":"10002",
"spec_value":"XL",
"sort":2
}
]
},
{
"spec_name":"颜色",
"spec_value_list":[
{
"spec_value_sn":"10005",
"spec_value":"绿色",
"sort":1
},
{
"spec_value_sn":"10006",
"spec_value":"紫色",
"sort":5
}
]
}
],
"sku_price":[
{
"sku_sn":"iphone_12_001",
"spec_value_sn_combination":["10001", "10005"],
"price":13000,
"inventory":23
},
{
"sku_sn":"iphone_12_002",
"spec_value_sn_combination":["10001", "10006"],
"price":14000,
"inventory":66
},
{
"sku_sn":"iphone_12_003",
"spec_value_sn_combination":["10002", "10005"],
"price":13500,
"inventory":11
},
{
"sku_sn":"iphone_12_004",
"spec_value_sn_combination":["10002", "10006"],
"price":6666,
"inventory":0
}
]
}
三、需要重点说明的点
如果添加的是无规格产品,我们同样需要在product_sku表中添加一条数据,与多规格产品不同之处只是product_spu表中的is_have_spec字段需要标记为0,并且sku_list为空。
其他的比如商品sku_sn、商品详情图片等数据都需要存储在product_sku数据表中。
之后的零售店与各地仓库的商品库存直接关联到最小库存单位sku上,即关联sku_sn。
四、SQL文件下载
SQL文件:
链接: https://pan.baidu.com/s/1mVlRSUjL1aRPmuUsO-6eXQ
提取码: n172