- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
构建一个电商通用型商品中心,可支持商品的种类和属性繁多,可以售卖实物、虚拟、会员、服务类商品。每一种商品具有不同的规格,不同的规格的商品有多种价格,商品可支持多种货币的支付.
1)目的是什么?
带大家一起实现一个通用型商品中心,从中学到一些扩展性设计思想.
2)你能学到什么?
3)不能学到什么?
商品中心是电商各个系统的最基础单元,为商城、订单,优惠促销、库存、仓储物流等系统提供基础数据.
电商的基本术语.
参考下面的商品组成模块图,商品模块的组成较为复杂,在定义SKU与SPU时,涉及类目、属性、品牌、生产信息等数据的组合,在定义出SKU后再创建SPU,在SPU上添加商品描述和规格最后就成了商品。根据商品又衍生出了价格管理、评论管理、搜索筛选等模块.
商品类目分为两层:基础数据类目层(后台类目)、前台展示类目层(前台类目)。那为什么要将前、后台类目分开管理,而不是前、后台共用一套类目呢? 后台类目面向商家或供应链人员,商品属性、销售属性及品牌等很多数据都是在基础类目上进行管理; 前台类目面向用户,方便用户查找商品,还可以随着运营需要去调整。比如而且随着节日、时令季节变化,运营会经常变更前台类目.
后台类目主要面向平台运营人员或商家,用于管理商品、属性和品牌等数据。 后台类目相对固定,确定了之后不会轻易变更或删除,如果类目下挂载有商品,就不能删除或作废。 类目树的层次不能太深,一般三层或四层。如果太深,对于商品的管理不太方便。类目树中最后一层类目称为叶子类目,商品必须挂载于叶子类目下.
前台类目主要面向用户,方便用户筛选查找商品,如图图所示。 前台类目可以根据运营需要,灵活多变。所以处理商品的前端类目时,就应该提供多样化的前端类目来支持。 前台类目可支持不同客户端的设置。PC端、H5端、APP端等 前台类目不同于固定的后台类目,编辑很灵活、可重叠、可删除、可随时变动,定时生效.
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='类目表';
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.
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 = '商品表'
扩展性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 = '商品属性表'
不创建新字段,还可以用sql查询,你得到了什么启发?
扩展性2:根据不同类目加载不同属性渲染动态表单.
将一组属性挂载到类目来实现动态表单,你得到了什么启发?
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='类目商品关联表';
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关联表';
sku数据 。
为了方便商品管理,我们需要在系统中建立一套属性库。在定义一个属性时,需要挂载在类目下,区分属性分类(关键属性、销售属性、非关键属性、特殊属性),并确定属性值、显示类型(单选、多选、可自定义)、是否必填.
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='属性表';
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='属性枚举表';
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='分类属性关联表';
当属性库搭建完成后,就会被各个叶子类目调用,添加商品时就需要填写这些属性,商品就有了载体,如图所示.
根据这些属性便能确定商品的唯一性(SKU)。 淘宝的商品属性(类目“男装”→“风衣”) 特别需要注意的是一些规格属性(如颜色、尺码等)。很多产品有 多规格,例如衣服、鞋子等。以一双男鞋为例,有颜色(假设白、红、 黑3种颜色),有尺码(从39~44共6种尺码),那么这个SPU(男鞋) 下面就有18个SKU。这些SKU的属性除了规格属性外,其他属性都是一 致的,所以在新建商品时,可聚合到一起,共用其他属性.
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.
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';
sku属性数据 。
spu表单图片 。
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商品关联表';
价格包括:成本价、原价、售卖价、定金、膨胀金等会随着需求的不断增加,尤其是一些在线教育等垂直行业电商对金额会有各种玩法.
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:不创建新字段,同一个商品可支持多种价格和货币种类 。
本文详细介绍了商品中心设计扩展性设计思想,并在设计方面做了各维度分析.
扩展性总结如下:
动态无限制创建属性数量。 根据不同类目加载不同属性渲染动态表单。 不创建新字段,同一个商品可支持多种价格和货币种类.
希望自己总结的扩展性思想可以让大家在开发过程中有所启发.
最后此篇关于电商通用型商品中心设计的文章就讲到这里了,如果你想了解更多关于电商通用型商品中心设计的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
.NET 框架:4.5.1 我在 Blend for visual studio 2015 中遇到一个奇怪的错误,我找不到它的来源。 如果我在 VS 中打开我的 WPF 解决方案,它会加载并运行良好。
我经常遇到这样的问题,与 Hierarchical RESTful URL design 非常相似 假设该服务仅提供用户上传文档。 POST, GET /accounts PUT, DELETE /a
在 Rails 应用程序中,我使用 devise 来管理我的用户,而我用来销毁 session 的链接不再有效。它正在工作,现在我添加了事件管理员,但没有。 我的链接是 :delete, :clas
我已经坚持了超过 24 小时,试图按照此处发布的其他解决方案进行操作,但我无法使其正常工作。我是 Rails 新手,需要帮助! 我想让我的/users/edit 页面正常工作,以便我可以简单地更改用户
Devise 在以下情况下不会使用户超时: 用户登录,关闭选项卡,然后在超时 + X 分钟内重新访问该 URL。用户仍处于登录状态。 如果选项卡已打开并且稍后刷新/单击,则超时可以正常工作。这意味着
我想使用这样的 slider 我希望该 slider 根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过提供样式代码来帮助我。
您应该为每种方法创建一个请求/响应对象,还是应该为每个服务创建一个? 如果我在所有方法中使用它,我的服务请求对象中将只有 5 个不同的东西,因为我对几乎所有方法使用相同的输入。 响应对象将只有一个字典
我正在尝试在 REST 中对实体的附件进行建模。假设一个缺陷实体可以附加多个附件。每个附件都有描述和一些其他属性(上次修改时间、文件大小...)。附件本身是任何格式的文件(jpeg、doc ...)
我有以下表格: Blogs { BlogName } BlogPosts { BlogName, PostTitle } 博客文章同时建模一个实体和一个关系,根据 6nf(根据第三个宣言)这是无效的。
如果 A 类与 B、C 和 D 类中的每一个都有唯一的交互,那么交互的代码应该在 A 中还是在 B、C 和 D 中? 我正在编写一个小游戏,其中许多对象可以与其他对象进行独特的交互。例如,EMP点击
关于如何记住我与 Omniauth 一起工作似乎有些困惑。 根据这个wiki ,您需要在 OmniauthCallbacksController 中包含以下内容: remember_me(user)
设计问题: 使用 非线程安全 组件(集合,API,...)在/带有 多线程成分 ... 例子 : 组件 1 :多线程套接字服务器谁向消息处理程序发送消息... 组件 2 :非线程安全 消息处理程序 谁
我们目前正在设计一个 RESTful 应用程序。我们决定使用 XML 作为我们的基本表示。 我有以下关于在 XML 中设计/建模应用程序数据的问题。 在 XML 中进行数据建模的方法有哪些?从头开始然
我正在设计一个新的 XSD 来从业务合作伙伴那里获取积分信息。对于每笔交易,合作伙伴必须提供至少一种积分类型的积分值。我有以下几点:
设计支持多个版本的 API 的最佳方法是什么。我如何确保即使我的数据架构发生更改(微小更改),我的 api 的使用者也不会受到影响?任何引用架构、指南都非常有用。 最佳答案 Mark Nottingh
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我想用 php 创建一个网站,其工作方式与 https://www.bitcoins.lc/ 相同。确实,就每个页面上具有相同布局但内容会随着您更改链接/页面而改变而言,我如何在 php 中使用lay
我有一个关于编写 Swing UI 的问题。如果我想制作一个带有某些选项的软件,例如在第一个框架上,我有三个按钮(新建、选项、退出)。 现在,如果用户单击新按钮,我想将框架中的整个内容更改为其他内容。
我正在尝试找出并学习将应用程序拥有的一堆Docker容器移至Kubernetes的模式和最佳实践。诸如Pod设计,服务,部署之类的东西。例如,我可以创建一个其中包含单个Web和应用程序容器的Pod,但
我是一名优秀的程序员,十分优秀!