5.后台商品模块
商品模块是商城项目最核心的模块,也是最复杂的。如果说你能掌握这个模块,那对你来说绝对是获益匪浅,这模块会涉及到以下知识点:
- 聊聊电商领域中的
SPU
和SKU
- 表的设计,告诉你为什么要这么设计
- 复杂的查询,例如属性筛选
篇幅限制,可以访问:实力进阶,教你使用thinkphp6开发一款商城系统,如果对你有帮助,记得点赞哈~
5.1SPU和SKU
在电商领域,SPU
(Standard Product Unit)和SKU
(Stock Keeping Unit)是两个常用的概念,用于对商品进行分类和管理。
SPU的定义:指标准化的产品单元,通常指一组具有相似属性、功能和用途的商品。SPU可以看作是一类商品的集合,具有相同的基本特征。
如图,这是京东商城商品列表
相信买东西的时候大家都打开过这样的一个列表页,可能很多时候你把列表中的商品理解为一个具体的产品。实际上它是一个spu
,它包含了一些通用的属性,例如cpu型号、内存、屏幕尺寸、颜色等,并且还有一组通用的图片和描述。
SKU定义:它就是具有独特属性的单个具体产品
如图
点击某个spu
,进入具体的spu
详情,里面展示的是每个具体的sku
,比如图片中的每种颜色和版本的组合就是一个具体sku
,每个sku
都有自己的属性及库存。
5.2表设计
商品模块相关表的设计很复杂,涉及到的表非常多,下面我会一个个的讲,以后大家项目中遇到可以适当的参考一下。
5.2.1品牌表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
brand_name | varchar(30) | 品牌名称 |
brand_image | varchar(255) | 品牌图片 |
sort | int(11) | 排序 |
remark | varchar(255) | 品牌介绍 |
is_show | tinyint(1) | 是否显示:1-是.0-否 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
如果说商品涉及到品牌,那么就需要有相应的品牌管理功能,一般来说涉及到名字、图片、排序等字段,至于展示端展示的是名称还是图片,这就看具体需求。
5.2.2分类表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
pid | int(11) | 父级id |
category_name | varchar(30) | 分类名称 |
image | varchar(255) | 分类图片 |
remark | varchar(255) | 分类描述 |
level | tinyint(1) | 等级 |
sort | int(11) | 排序 |
is_show | tinyint(1) | 是否显示:1-是;0-否 |
is_recommend | tinyint(1) | 是否首页推荐:1-是;0-否 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
商品分类表是非常重要的,我们买东西的时候一般会选择分类,例如手机、衣服、笔记本、食品等分类。这里的pid
、level
字段是跟分类层级有观的,因为分类有一级分类、二级分类、三级分类,甚至更多,另外还有个”是否首页推荐“字段,适用于首页展示某些商品,也是常用需求之一。
5.2.3规格表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
cate_id | int(11) | 最后一级商品分类ID |
spec_name | varchar(30) | 规格名称 |
sort | tinyint(4) | 排序 |
is_advanced | tinyint(1) | 高级选项:0-否, 1-是 |
is_show | tinyint(1) | 显示:0-否,1-是 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
商品规格或者说属性,这里的属性是跟分类绑定的,因为不同的分类有不同的属性,例如手机、衣服属性是不一样的,另外鉴于页面的展示的原因,一般需要把属性划分为高级选项和普通选项,这个可参考京东。如果说你属性没有那么多,其实没必要设置高级选项。
5.2.4规格属性值表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
spec_id | int(11) | 规格ID |
spec_value | varchar(30) | 规格属性值 |
sort | tinyint(4) | 排序 |
is_show | tinyint(1) | 是否显示:1-是,0-否 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
这个也很好理解,每个属性都有多个值,例如手机的属性-机身内容它有1TB、512GB、256GB等值
5.2.5商品表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
goods_name | varchar(150) | 商品名称 |
goods_spu | bigint(20) | 商品SPU |
one_cate_id | int(11) | 一级分类 |
two_cate_id | int(11) | 二级分类 |
three_cate_id | int(11) | 三级分类 |
four_cate_id | int(11) | 四级分类 |
brand_id | int(11) | 品牌 |
supplier_id | int(11) | 供应商 |
image | varchar(255) | 商品主图 |
remark | varchar(255) | 商品简介 |
content | text | 商品详细描述 |
status | tinyint(1) | 商品状态:-1-回收站;0-下架;1-上架 |
sort | int(11) | 排序 |
sales_sum | int(11) | 商品销量 |
comment_sum | int(11) | 评论数量 |
click_sum | int(11) | 点击数量 |
price | decimal(10,2) | 商品价格 |
discount_factor | decimal(10,2) | 折扣系数 |
freight_type | tinyint(1) | 运费类型:1-包邮;2-统一运费;3-运费模板 |
freight_price | decimal(10,2) | 统一运费金额 |
freight_template_id | int(11) | 运费模板 |
is_new | tinyint(1) | 新品推荐:1-是;0-否 |
is_hot | tinyint(1) | 热点产品:1-是;0-否 |
is_team | tinyint(1) | 开启拼团:1-是;0-否 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
商品表存储什么字段,都是根据实际业务来设计的,下面我分下面几点来解释
- 像商品名、图片、价格这些用于展示的,都是必须的。
- 商品SPU,这个字段是商品的唯一标识,像京东商品之间的关联就是使用SPU,而不是自增ID,不过我们使用自增ID关联即可,一般来说使用php开发都是一些小商城了,没有那么规范,这里提出来主要是让大家知道有这么一个设计原则。
- 四级分类,这里限定了四级分类,如果说还不够,那么加字段,弄到五级即可。
- 商品详细描述,正常来说不应该存储到这里的,这里应该拆分多一个表专门存储商品的详细描述,但也要看实际情况,如果说你开发的商城,商品数量就一两万,拆不拆分都可以,因为几乎不影响性能。就算以后数据量突然暴增,到时拆分开也可以。
- 排序,一般用户会看销量、评论数量,因此记录这两个数就很有必要了。
- 销售手段,比如说新品推荐、热点产品、拼图等等
- 跟运费有关的些字段,比如免运费、统一运费等
5.2.6评论表
字段 | 类型 | 备注 |
---|---|---|
id | int(11) | 主键(PRIMARY) |
goods_id | int(11) | 商品ID |
goods_item_id | int(11) | 某种规格商品ID |
order_goods_id | int(11) | 订单商品表id |
user_id | int(11) | 用户ID |
goods_star | tinyint(1) | 商品评论星级:1-5星 |
service_star | tinyint(1) | 服务评论星级:1-5星 |
express_star | tinyint(1) | 物流评论星级:1-5星 |
comment | varchar(255) | 商品评论 |
reply | varchar(255) | 商家回复 |
status | tinyint(1) | 显示状态 0-隐藏 1-显示 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
商品评论需要记录商品ID,具体的某款产品(SKU)ID,评论的用户ID,评论内容,另外还设置了商品的评价、售后服务的评价、无论的评价。
5.2.7评论的图片/视频表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
type | tinyint(1) | 文件类型:1-图片,2-视频 |
goods_comment_id | int(11) | 商品评价id |
url | varchar(255) | 文件链接l |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
用户上传商品的图片和视频
5.2.8商品拥有的规格属性表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
goods_id | int(11) | 商品ID |
spec_id | int(11) | 规格ID |
spec_value_id | int(11) | 规格属性ID |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
这里存储了商品ID、规格ID、规格属性ID,这个表主要用于属性筛选
5.2.9商品SKU表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
goods_id | int(11) | 商品ID |
title | varchar(100) | 标题 |
sku | bigint(20) | 商品SKU |
spec_ids | varchar(200) | 多个规格id,隔开 |
spec_value_ids | varchar(200) | 多个规格属性值ID,隔开 |
market_price | decimal(10,2) | 市场价 |
price | decimal(10,2) | 价格 |
cost_price | decimal(10,2) | 成本价 |
stock | int(10) | 库存 |
bar_code | varchar(200) | 条码 |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
这个表主要是存储了用于商品详情展示的信息,比如说规格、价格、库存等,注意这里存储规格和规格属性值,后面我们可以看看如何进行筛选。
另外这里我们也新增了商品SKU字段,其意义跟SPU类似。
5.2.10 商品SKU主图
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
type | tinyint(1) | 文件类型:1-图片,2-视频 |
sku | bigint(20) | 商品评价id |
url | varchar(255) | 文件链接 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
详情里面的轮播图
5.2.11商品点击表
字段 | 类型 | 备注 |
---|---|---|
id | int(10) unsigned | 主键(PRIMARY) |
user_id | int(11) | 用户ID |
goods_id | int(11) | 商品ID |
creator | int(11) | 创建者 |
updator | int(11) | 更新者 |
create_time | datetime | 创建时间 |
update_time | datetime | 更新时间 |
delete_time | datetime | 删除时间 |
为什么要这个表?对于一些体量比较大的商城来说,收集用户的行为是非常重要的,这个不单单说后台用于页面的统计,更多的是用于推荐系统,他们需要足够大的数据去训练推荐模型。
5.2.12 商品收藏表
字段 | 类型 | 为空 | 额外 | 默认 | 整理 | 备注 |
---|---|---|---|---|---|---|
id | int(10) unsigned | PK | auto_increment | 主键(PRIMARY) | ||
user_id | int(11) | YES | 0 | 用户ID | ||
goods_id | int(11) | YES | 0 | 商品ID | ||
create_time | datetime | YES | 创建时间 | |||
update_time | datetime | YES | 更新时间 | |||
delete_time | datetime | YES | 删除时间 |
这个也是收集用户行为相关的表