【云岚到家】-day05-3-项目迁移-商品管理


1 项目迁移-商品管理

1.1 迁移目标

通过服务管理的学习,将所学技术迁移到商品管理,通过迁移,有能力理解商品管理的需求并进行分析和设计。

商品管理的应用场景非常广泛,通过迁移,有能力根据需求去分析设计不同场景下的商品管理方案。

电商行业: 涉及商品分类管理、商品信息管理、商品库存管理、商品发布审核流程等业务。

餐饮行业: 涉及菜品分类管理、菜品图片管理、菜品信息管理、上下架等业务。

旅游行业: 涉及酒店信息管理、酒店服务管理、旅游套餐管理等业务。

教育行业: 涉及课程分类管理、课程师资管理、课程信息管理、课程发布及审核流程等业务。

服务行业: 涉及家政服务、维修服务等各类服务项目的管理。

1.2 能力基础

学完前三章需具备以下能力方可进行商品管理模块迁移。

1.2.1 使用状态控制业务流程的设计能力

商品管理业务流程通常会有多个分支,并且流程中存在一些业务限制,我们可以参考服务管理中通过状态字段去控制业务流程的方法进行设计。

我们回顾服务项的管理流程,服务项的状态包括:0:草稿,1禁用,2启用

状态之间的变化关系如下:

在这里插入图片描述

通过状态进行业务流程管理举例:

服务项启用

在这里插入图片描述

服务项禁用

如果该服务项在某些区域正在运营将无法禁用,需要先将该服务项在所有区域下架方可禁用。

关于服务项在区域上架和下架的操作参见:区域服务管理模块。

在这里插入图片描述

服务项删除

在这里插入图片描述

1.2.2 多表关联关系分析与设计能力

商品管理模块会涉及多个数据表,表与表存在一定的关系,为了扩展方便表扩展可能不设外键,但是逻辑关系是存在的,要求具备多表关联分析与设计的能力。

我们可以参考服务管理中的表设计的基本方法对商品管理模块进行表设计。

服务管理模块四个核心表的关系如下:

在这里插入图片描述

serve_type:服务类型表

serve_item: 服务项表,存储了本平台的家政服务项目

每个服务项都有一个服务类型,一个服务类型下有多个服务项,服务类型与服务项是一对多关系。

region:区域表,存储运营地区信息,一般情况区域表行政级别是市。

serve: 服务表,存储了各个区域运营的服务及相关信息。

注意:这里不要把serve表简单理解为只是区域表和服务项表的中间关系表,因为如果是简单的关联关系表只需记录区域表和服务项表各自的主键Id即可,serve记录的是平台运营服务的信息,凡是与运营相关的信息都要记录在serve表,比如:运营价格。后期也可能会增加其它运营相关的字段。

region与serve_item是什么关系?

一个区域下可以设置多个服务项,一个服务项可以被多个区域设置,region与serve_item是多对多关系。

1.2.3 缓存方案设计与应用能力

为了减少对数据库的访问,提高访问性能通常会使用缓存。商品管理中对商品信息查询也会用到缓存,我们需要具备缓存方案的设计及应用能力。

我们可以参考第三章的内容进行缓存方案的设计,同时要避免高并发场景下缓存穿透、击穿、雪崩等问题,使用SpringCache等缓存框架操作缓存。

1.3 需求分析

下边对电商后台商品管理进行分析,包含:商品发布、审核、管理、商品上下架、删除等业务。

1.3.1 业务流程

商品发布流程图

在这里插入图片描述

1.3.2 界面原型

1.3.2.1 发布商品原型

第一步选择商品分类

在这里插入图片描述

第二步填写商品信息,上传商品图片、销售信息(属性、属性值、库存、价格等)

在这里插入图片描述

商品查询原型

在这里插入图片描述

商品审核列表:

在这里插入图片描述

1.3.3 功能列表

商品管理主要涉及以下功能列表:

模块功能点详细介绍
品牌管理新增、编辑、禁用、删除、查询主要涉及到对商品品牌的管理
分类管理新增、编辑、禁用、删除、查询主要涉及到对商品分类的管理
属性管理新增、编辑、禁用、删除、查询主要涉及到对商品属性及属性值进行管理
商品发布基本信息填写、规格与属性设置、图片上传、定价策略、库存设置、商品发布计划管理和上架新的商品。
商品展示商品详情展示,包括:名称、详情描述、品牌、分类、价格、商品规格、库存状态、商品评价、推荐商品等信息。通过切换sku展示商品的基本信息,包括名称、描述、品牌、分类等。显示商品的售价,并可以标明是否有促销活动或折扣。显示商品的规格和属性,如颜色、尺寸、重量等显示商品的库存状态,如有货、限量、预售等,以帮助用户了解商品的可购买性。如果有用户评价,展示商品的评价和评分。提供更详细的商品描述,包括商品的特性、用途、材料等,以满足用户对商品的深入了解需求。
商品搜索关键字搜索、分类搜索、搜索排序、热门搜索推荐、高级搜索用户可以通过输入关键词来搜索与其相关的商品。提供各种过滤选项,如商品分类、品牌、价格范围、颜色、尺寸等,以帮助用户精确筛选符合其需求的商品。允许用户根据不同的标准对搜索结果进行排序,例如价格从低到高、销量从高到低等。展示当前热门的搜索关键词,以帮助用户发现流行的商品或主题。提供高级搜索选项,允许用户更精细地调整搜索条件,如日期范围、品牌筛选等。

1.4 系统设计

1.4.1 SPU与SKU

概念:

品牌:商品的品牌

分类:商品的分类,可以是一级、二级等商品分类。

如下图:

在这里插入图片描述

SPU和SKU的概念:

SPU:Standard Product Unit,标准产品单元,可以理解为一个产品型号,比如小米8 就是一个标准的产品单元,它属于生产制造过程的一个标准品,标准品在缺乏具体规格信息的时候是不能直接售卖的。

SKU:Stock Keeping Unit,最小库存单元,也就是对应仓库中的一件商品,这个商品的规格信息在入库的时候就已经确定了的,因此是可以直接售卖的。Spu+一或多个销售属性对应一个Sku,例如:小米8黑128G,其中黑和128G就是销售属性,小米8就是一个Spu

下图中商品列表中商品名称通常显示Spu的名称:

Spu信息包括:商品名称、商品分类、商品图片、关联的商品属性等。

在这里插入图片描述

点击一个商品进入详细页面显示Sku相关的信息,如下图:

Sku信息包括:库存信息,Sku名称、Sku图片、关联的存储容量,颜色等销售属性。

在这里插入图片描述

1.4.2 表设计

商品管理模块表设计:

表名称表名存储内容
品牌表product_brands商品的品牌信息,如:华为、小米
类别表product_category商品分类信息,树型结构(标志字段为parent_id),多级分类:手机通讯–>手机
spu表product_spu标准产品单位
sku表product_sku最小库存单位
销售属性表product_attr销售属性项目,比如:颜色
销售属性值product_attr_value销售属性项目下的属性值,比如:颜色下有典雅黑典、雨后初晴、勃朗蓝、燃橙色
sku库存表product_sku_stocksku库存信息
sku属性关系表product_spu_sku_attr_mapspu下 有哪些sku spu下 有那些销售属性 spu下 每个销售属性对应的销售属性值(一对多) spu下 每个销售属性值对应的sku(一对多)
1.4.2.1 商品管理模块表

商品管理模块表设计:

表名称表名存储内容
品牌表product_brands商品的品牌信息,如:华为、小米
类别表product_category商品分类信息,树型结构(标志字段为parent_id),多级分类:手机通讯–>手机
spu表product_spu标准产品单位
sku表product_sku最小库存单位
销售属性表product_attr销售属性项目,比如:颜色
销售属性值product_attr_value销售属性项目下的属性值,比如:颜色下有典雅黑典、雨后初晴、勃朗蓝、燃橙色
sku库存表product_sku_stocksku库存信息
sku属性关系表product_spu_sku_attr_mapspu下 有哪些sku spu下 有那些销售属性 spu下 每个销售属性对应的销售属性值(一对多) spu下 每个销售属性值对应的sku(一对多)

通过发布商品例子理解每个表存储的数据内容:

  1. 填写商品信息(商品名称、品牌、类别、描述、图片等)存储spu表
  2. 编辑商品规格及价格,存储到sku表、sku属性关系表
  3. 编辑商品库存,存储到sku库存表
1.4.2.2 E-R图

数据E-R图:

通过ER图理解表之间的关系。

在这里插入图片描述

1.4.2.3 建表SQL
1.4.2.3.1 分类表

本表采用树型结构设计,关键字段为pid

名称数据类型允许为空主键长度字段描述
idintNOYES10分类ID
pidintNONO10父ID,一级分类的pid为0
category_namevarcharNONO255分类名称
category_descvarcharNONO255分类描述
category_levelintNONO10分类级别,1:代表一级分类,2:代表二级分类,3:代表三级分类
pic_urlvarcharNONO255分类图片
pathvarcharNONO255分类地址{pid}-{child_id}-…
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_category
-- ----------------------------
DROP TABLE IF EXISTS `goods_category`;
CREATE TABLE `goods_category`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `pid` int(0) NOT NULL DEFAULT 0 COMMENT '父ID,一级分类的pid为0',
  `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类名称',
  `category_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类描述',
  `category_level` int(0) NOT NULL DEFAULT 1 COMMENT '分类级别,1:代表一级分类,2:代表二级分类,3:代表三级分类',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类图片',
  `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类地址{pid}-{child_id}-...',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '类别表' ROW_FORMAT = Dynamic;
1.4.2.3.2 品牌表
名称数据类型允许为空主键长度字段描述
idintNOYES10品牌ID
brands_namevarcharNONO255品牌名称
brands_descvarcharNONO255品牌描述
logo_urlvarcharNONO255品牌logo图片
category_idintNONO10分类id
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_brands
-- ----------------------------
DROP TABLE IF EXISTS `goods_brands`;
CREATE TABLE `goods_brands`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '品牌ID',
  `brands_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌名称',
  `brands_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌描述',
  `logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌logo图片',
  `category_id` int(0) NOT NULL COMMENT '分类id',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '品牌表' ROW_FORMAT = Dynamic;
1.4.2.3.3 属性表
名称数据类型允许为空主键长度字段描述
idintNOYES10销售属性ID
attr_namevarcharNONO255销售属性名称
attr_descvarcharNONO255销售属性描述
category_idintYESNO10分类id
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_attr
-- ----------------------------
DROP TABLE IF EXISTS `goods_attr`;
CREATE TABLE `goods_attr`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '销售属性ID',
  `attr_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性名称',
  `attr_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性描述',
  `category_id` int(0) NULL DEFAULT NULL COMMENT '分类id',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '销售属性表' ROW_FORMAT = Dynamic;
1.4.2.3.4 属性值表
名称数据类型允许为空主键长度字段描述
idintNOYES10销售属性值ID
attr_idintNONO10销售属性ID
valuevarcharNONO255销售属性值
value_descvarcharNONO255销售属性值描述
logo_urlvarcharNONO255属性值log地址,
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_attr_value
-- ----------------------------
DROP TABLE IF EXISTS `goods_attr_value`;
CREATE TABLE `goods_attr_value`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '销售属性值ID',
  `attr_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性ID',
  `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性值',
  `value_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性值描述',
  `logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '属性值log地址,',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '销售属性值' ROW_FORMAT = Dynamic;
1.4.2.3.5 商品spu表
名称数据类型允许为空主键长度字段描述
idintNOYES10SPU ID
brand_idintNONO10品牌ID
category_idintNONO10分类ID
spu_namevarcharNONO255spu名称
spu_descvarcharNONO255spu描述
selling_pointvarcharNONO255卖点
unitvarcharNONO255spu单位
banner_urltextYESNO65535banner图片 多个图片逗号分隔
main_urltextYESNO65535商品介绍主图 多个图片逗号分隔
spu_statusintNONO10待提交、待审核、审核不通过、审核通过、售罄、暂停销售、上架、部分下架、全部下架
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_spu
-- ----------------------------
DROP TABLE IF EXISTS `goods_spu`;
CREATE TABLE `goods_spu`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'SPU ID',
  `brand_id` int(0) NOT NULL DEFAULT 0 COMMENT '品牌ID',
  `category_id` int(0) NOT NULL DEFAULT 0 COMMENT '分类ID',
  `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu名称',
  `spu_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu描述',
  `selling_point` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '卖点',
  `unit` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu单位',
  `banner_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'banner图片 多个图片逗号分隔',
  `main_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品介绍主图 多个图片逗号分隔',
   `spu_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'spu表' ROW_FORMAT = Dynamic;
1.4.2.3.6 商品sku表
名称数据类型允许为空主键长度字段描述
idintNOYES10SKU ID
spu_idintNONO10SPU ID
attrstextYESNO65535销售属性值{attr_id}-{attr_value_id} 多个销售属性值逗号分隔
banner_urltextYESNO65535banner图片 多个图片逗号分隔
main_urltextYESNO65535商品介绍主图 多个图片逗号分隔
priceintNONO10售价,整数方式保存
market_priceintNONO10市场价,整数方式保存
sku_statusintNONO10正常、下架、售罄
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_sku
-- ----------------------------
DROP TABLE IF EXISTS `goods_sku`;
CREATE TABLE `goods_sku`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'SKU ID',
  `spu_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SPU ID',
  `attrs` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '销售属性值{attr_id}-{attr_value_id} 多个销售属性值逗号分隔',
  `banner_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'banner图片 多个图片逗号分隔',
  `main_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品介绍主图 多个图片逗号分隔',
  `price` int(0) NOT NULL DEFAULT 0 COMMENT '售价,整数方式保存',
  `market_price` int(0) NOT NULL DEFAULT 0 COMMENT '市场价,整数方式保存',
  `sku_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'sku表' ROW_FORMAT = Dynamic;
1.4.2.3.7 sku-spu属性关系表
名称数据类型允许为空主键长度字段描述
idintNOYES10自增ID
spu_idintNONO10SPU ID
sku_idintNONO10SKU ID
attr_idintNONO10销售属性ID
attr_namevarcharNONO255销售属性名称
attr_value_idintNONO10销售属性值ID
attr_value_namevarcharNONO255销售属性值
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_spu_sku_attr_map
-- ----------------------------
DROP TABLE IF EXISTS `goods_spu_sku_attr_map`;
CREATE TABLE `goods_spu_sku_attr_map`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `spu_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SPU ID',
  `sku_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SKU ID',
  `attr_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性ID',
  `attr_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '销售属性名称',
  `attr_value_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性值ID',
  `attr_value_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '销售属性值',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '关联关系冗余表' ROW_FORMAT = Dynamic;
1.4.2.3.8 库存表
名称数据类型允许为空主键长度字段描述
idintNOYES10自增ID
sku_idintNONO10SKU ID
quantityintNONO10库存
warn_quantityintYESNO10警戒数量,用于告诉销售方该及时捕获了
create_atintNONO10创建时间
create_byintNONO10创建人staff_id
update_atintNONO10更新时间
update_byintNONO10修改人staff_id
statustinyintNONO3状态 1:enable, 0:disable, -1:deleted
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for goods_sku_stock
-- ----------------------------
DROP TABLE IF EXISTS `goods_sku_stock`;
CREATE TABLE `goods_sku_stock`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `sku_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SKU ID',
  `quantity` int(0) NOT NULL DEFAULT 0 COMMENT '库存',
  `warn_quantity` int(0) NULL DEFAULT NULL COMMENT '警戒数量,用于告诉销售方该及时捕获了',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'sku库存表' ROW_FORMAT = Dynamic;
1.4.2.3.9 完整建表SQL
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for 商品分类
-- ----------------------------
DROP TABLE IF EXISTS `goods_category`;
CREATE TABLE `goods_category`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `pid` int(0) NOT NULL DEFAULT 0 COMMENT '父ID,一级分类的pid为0',
  `category_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类名称',
  `category_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类描述',
  `category_level` int(0) NOT NULL DEFAULT 1 COMMENT '分类级别,1:代表一级分类,2:代表二级分类,3:代表三级分类',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类图片',
  `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '分类地址{pid}-{child_id}-...',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '分类表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for 商品品牌
-- ----------------------------
DROP TABLE IF EXISTS `goods_brands`;
CREATE TABLE `goods_brands`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '品牌ID',
  `brands_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌名称',
  `brands_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌描述',
  `logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '品牌logo图片',
  `category_id` int(0) NOT NULL COMMENT '分类id',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '品牌表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for 商品属性
-- ----------------------------
DROP TABLE IF EXISTS `goods_attr`;
CREATE TABLE `goods_attr`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '销售属性ID',
  `attr_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性名称',
  `attr_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性描述',
  `category_id` int(0) NULL DEFAULT NULL COMMENT '分类id',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '销售属性表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for 商品属性值
-- ----------------------------
DROP TABLE IF EXISTS `goods_attr_value`;
CREATE TABLE `goods_attr_value`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '销售属性值ID',
  `attr_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性ID',
  `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性值',
  `value_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '销售属性值描述',
  `logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '属性值log地址,',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '销售属性值' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for goods_spu
-- ----------------------------
DROP TABLE IF EXISTS `goods_spu`;
CREATE TABLE `goods_spu`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'SPU ID',
  `brand_id` int(0) NOT NULL DEFAULT 0 COMMENT '品牌ID',
  `category_id` int(0) NOT NULL DEFAULT 0 COMMENT '分类ID',
  `spu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu名称',
  `spu_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu描述',
  `selling_point` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '卖点',
  `unit` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'spu单位',
  `banner_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'banner图片 多个图片逗号分隔',
  `main_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品介绍主图 多个图片逗号分隔',
   `spu_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'spu表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for goods_sku
-- ----------------------------
DROP TABLE IF EXISTS `goods_sku`;
CREATE TABLE `goods_sku`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'SKU ID',
  `spu_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SPU ID',
  `attrs` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '销售属性值{attr_id}-{attr_value_id} 多个销售属性值逗号分隔',
  `banner_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'banner图片 多个图片逗号分隔',
  `main_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '商品介绍主图 多个图片逗号分隔',
  `price` int(0) NOT NULL DEFAULT 0 COMMENT '售价,整数方式保存',
  `market_price` int(0) NOT NULL DEFAULT 0 COMMENT '市场价,整数方式保存',
  `sku_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'sku表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for goods_spu_sku_attr_map
-- ----------------------------
DROP TABLE IF EXISTS `goods_spu_sku_attr_map`;
CREATE TABLE `goods_spu_sku_attr_map`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `spu_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SPU ID',
  `sku_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SKU ID',
  `attr_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性ID',
  `attr_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '销售属性名称',
  `attr_value_id` int(0) NOT NULL DEFAULT 0 COMMENT '销售属性值ID',
  `attr_value_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '销售属性值',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '关联关系冗余表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for goods_sku_stock
-- ----------------------------
DROP TABLE IF EXISTS `goods_sku_stock`;
CREATE TABLE `goods_sku_stock`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `sku_id` int(0) NOT NULL DEFAULT 0 COMMENT 'SKU ID',
  `quantity` int(0) NOT NULL DEFAULT 0 COMMENT '库存',
  `warn_quantity` int(0) NULL DEFAULT NULL COMMENT '警戒数量,用于告诉销售方该及时捕获了',
  `create_at` int(0) NOT NULL DEFAULT 0 COMMENT '创建时间',
  `create_by` int(0) NOT NULL DEFAULT 0 COMMENT '创建人staff_id',
  `update_at` int(0) NOT NULL DEFAULT 0 COMMENT '更新时间',
  `update_by` int(0) NOT NULL DEFAULT 0 COMMENT '修改人staff_id',
  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 1:enable, 0:disable, -1:deleted',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'sku库存表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

1.4.3 接口与方案

1.4.3.1 商品发布

商品发布是对商品spu进行发布。

首先填写商品spu信息,包含基础信息、图文信息、销售信息、支付信息、物流信息、售后信息等,发布后等待审核。

审核通过后商品自动上架。

商品审核指对发布的商品spu信息进行审核,审核通过后更改审核状态。

在这里插入图片描述

接口设计如下:

接口名称:商品spu发布接口

接口场景:商品spu发布,将商品spu及sku信息写入数据库

接口路径:PUT /goods/spu/release

请求参数:JSON格式,如下

{
    "baseInfo":{ //基础信息
        "categoryId":"int,四级分类id",
        "spuName":"string,spu名称",
        "brandsId":"int,品牌id",
        "skuIds":[]//skuid列表    
    },
    "showInfo"{ //展示信息
       "mainUrl": "sring,商品主图"
       // 其他字段没有业务逻辑不再列举 
    },
    "saleInfo":{//销售信息
        //字段没有业务逻辑不再列举
    },
    "stockDeductionWay":"int,库存扣减方式,1:拍下减库存,2:付款减库存",
    "expressInfo":{ //物流信息
        "unifyExpressFee":"int,统一运费,单位分",
        "expressFeeTemplateId":"int,运费模板id",
        //其他字段没有业务逻辑不再列举 
    },
    "afterMaketInfo":{
        "supportExchange":"boolean,支持换货",
        "supportHassleFreeReturn7":"boolean,支持七天无理由退货"
    },
    "onShelfType":"int,上架类型,1:立即上架,2:定时上架、3:放入仓库",
    "scheduleOnShelfTime":"string,定时上架时间,时间格式:yyyy-MM-dd HH:mm:ss"
}

响应内容:分类信息,json格式

{
 "code": "200",
    "msg": "OK",
    "result": {
        "id":"int,商品spu id"
    }
}
1.4.3.2 商品上架

商品上架操作分为两种:

针对spu上架:

商品发布后审核通过自动进行商品上架,更新商品spu的状态为上架,自动对商品spu下的所有sku执行上架操作。

针对sku上架

仅将sku的状态改为已上架。

上架操作分为立即上架、定时上架方案:

立即上架

如果上架类型为“立即上架”,审核通过后修改spu的状态为已上架,同时将下边所有sku状态设置成已上架;

商品上架后需要将商品信息同步到Elasticsearch中,使用Canal+MQ同步方式,如下:

在这里插入图片描述

定时上架

如果上架类型为“定时上架”,审核通过后修改spu的状态为审核通过,通过xxl-job 进行任务调度,在上架时间到来时执行商品上架操作。

在这里插入图片描述

1.4.3.3 商品下架

商品下架分为:

针对spu的下架:更新spu的状态为下架、更新该spu下全部sku状态为下架。

针对sku的下架:仅更新该sku的状态为下架。

下架操作只有立即下架,没有定时下架。

下架操作流程与上架类似,需要基于Canal+MQ删除Elasticsearch的索引数据。

在这里插入图片描述

1.4.3.4 根据id查询spu信息

接口名称:根据spu的id查看spu详细信息

接口场景:在商品修改界面请求此接口查询spu的详细信息,此接口不提供缓存功能。

接口路径:GET /product/spu/{spuId}

请求参数:spuId

响应内容:spu详细信息,json格式,示例如下

{
    "code": "200",
    "msg": "OK",
    "result": {
        "brandInfo": {
            "id": "number, 品牌ID",
            "brandName": "string, 品牌名称",
            "brandDesc": "string, 品牌描述",
            "logoUrl": "string, 品牌logo图片",
        },
        "categoryInfo": {
            "id": "number, 分类ID",
            "categoryName": "string, 分类名称",
            "categoryDesc": "string, 分类描述",
            "picUrl": "string, 分类图片",
            "path": "string, 分类地址{pid}-{child_id}-...",
        },
        "spuInfo": {
            "id": "number, spu id",
            "spuName": "string, spu名称",
            "spuDesc": "string, spu描述",
            "sellingPoint": "string, 卖点",
            "unit": "string, spu单位",
            "bannerUrl": [
                "string, banner 图片url",
                "string, banner 图片url",
            ],
            "mainUrl": [
                "string, 商品介绍主图 图片url",
                "string, 商品介绍主图 图片url",
            ],
            "attrs": [ // 有那些销售属性
                { 
                    "id": "销售属性ID",
                    "attrName": "string, 销售属性名称",
                    "attrDesc": "string, 销售属性描述",
                    "values": [ // 每个销售属性对应的销售属性值(一对多) 
                        {
                            "id": "销售属性值ID",
                            "valueName": "string, 销售属性值",
                            "valueDesc": "string, 销售属性值描述",
                            // 每个销售属性值对应的sku(一对多) 
                            // 页面初始化时,按钮不可点击逻辑判断: 如果该销售属性值下所有sku没有库存,则该销售属性按钮不可点击
                            // 选择销售属性值时,按钮不可点击逻辑判断:销售属性构成双向链表,每个销售属性又是一个单向链表存改销售属性对应的所有销售属性值。每当选择一个销售属性值时先前和后一个销售属性遍历,执销售属性值下所有sku售罄的按钮不可点击,且当前销售属性值map记录key为当前点击的销售属性值ID,值统一标示一下就行,目的记录是由于选择了哪个销售属性值使得当前的销售属性值为售罄状态
                            // 取消选择销售属性值时,按钮不可点击逻辑恢复判断:数据结构同上,遍历,记录的map删除key为当前取消选中的销售属性值,并判断是否还有别的key使得该销售属性值为售罄状态,如果没有则恢复未售罄状态
                            "skus": [
                                "int, sku id",
                                "int, sku id",
                            ],
                        }
                    ],
                }
            ],
            "skus": [ // 有哪些sku
                "int, sku id",
                "int, sku id",
            ],
            "skus_map": {
            // valueid的拼接遵循先升序排序,然后再进行拼接,中间使用'-'拼接
                "{valueId1}-{valueId2}-...": "number, sku id 1",
                "{valueId1}-{valueId3}-...": "number, sku id 2",
                "{valueId2}-{valueId3}-...": "number, sku id 3",
                "{valueId1}-{valueId4}-...": "number, sku id 4",
            }
        }
    }
}
1.4.3.5 商品分类四级联动

接口名称:四级分类联动接口

接口场景:在商品发布界面选择分类,实现四级分类联动,后端将商品分类返回给前端由前端实现联动效果。

接口路径:GET /goods/category/linkage

请求参数:无

响应内容:分类信息,json格式

{
 "code": "200",
    "msg": "OK",
    "result": {
        "categorys":[{
            "id": "number, 一级分类id",
            "categoryName": "string,一级分类名称",
            "children":[{ //二级分类
                "id": "number, 二级分类id",
                "categoryName": "string,二级分类名称",
                "children":[{ //三级分类
                    "id":"number, 三级分类id",
                    "categoryName": "string,三级分类名称",
                    "children":[{ //四级分类
                        "id": "number, 四级分类id",
                        "categoryName": "string,四级分类名称"
                     }]
                 }]
              }]
            },{
            "id": "number, 一级分类id",
            "categoryName": "string,一级分类名称",
            "children":[{ //二级分类
                "id": "number, 二级分类id",
                "categoryName": "string,二级分类名称",
                "children":[{ //三级分类
                    "id": "number, 三级分类id",
                    "categoryName": "string,三级分类名称",
                    "children":[{ //四级分类
                        "id": "number, 四级分类id",
                        "categoryName": "string,四级分类名称"
                     }]
                 }]
              }]
            }]
    }
}

实现方案

商品分类表采用树型结构设计,针对树型结构查询的方式有两种:通过表的自连接、通过MySQL8递归查询,详情参考:https://www.bilibili.com/video/BV1j8411N7Bm?p=32&vd_source=81d4489ba9312103debc8ee843169f23

查询到数据后在Java程序中组装成上述数据结构。

1.4.3.6 根据id查询sku信息

接口名称:根据sku的id查看sku详细信息

接口场景:在商品搜索列表点击商品名称进入商品详情页面,在商品详情页面选择销售属性查询sku信息,此接口提供缓存功能。

接口路径:GET /product/sku/{skuId}

请求参数:skuId

响应内容:sku详细信息,json格式,示例如下

{
    "code": "200",
    "msg": "OK",
    "result": {
        "id": "number, sku id",
        "name":"string, 多个属性值根据属性id排序进行拼接,格式:{valueName1}{valueName2}",
        "desc": "string, sku描述",
        "unit": "string, sku单位",
        "bannerUrl": [
            "string, banner 图片url",
            "string, banner 图片url",
        ],
        "main_url": [
            "string, 商品介绍主图 图片url",
            "string, 商品介绍主图 图片url",
        ],
        "price": "int, 售价单位分",
        "marketPrice": "int, 市场价单位分",
        "skuStock" : "long,库存"
    }
}

缓存方案:

缓存信息包括两部分:

  1. 对sku及相关spu的信息(商品名称、图片、分类等)进行缓存,如下:

    缓存信息缓存时间缓存类型key缓存操作时机
    sku信息缓存1天StringCACHE:sku::sku_id上架:添加缓存 修改信息:更新缓存 下架:删除缓存 缓存过期后查询:添加缓存
    spu信息缓存1天StringCACHE:spu::spu_id上架:添加缓存 修改信息:更新缓存 下架:删除缓存 缓存过期后查询:添加缓存
  2. 查询库存时对库存进行缓存,避免查询数据库

    缓存信息缓存时间缓存类型key缓存操作时机
    sku库存信息缓存10分钟StringCACHE:sku_stock::sku_id缓存过期后查询:添加缓存
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AAA码农宝哥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值