閱讀只需要三分鐘,轉載請注明出處。
api.product.dotnet.sdao
商品庫微服務 接口設計說明
-
文檔介紹###
商品庫微服務
是一個是一個用于提供商品管理微服務,
不關注庫存。
所有管理功能通過REST api對外接口實現。以下是關于接口
設計思路.
-
設計思路概要描述###
商品庫微服務的功能主要包括:
-
分類
的CRUD -
容器
的CRUD - SPU 及 SKU 的CRUD
- Properties 的CRUD
- Template 屬性模板的CRUD
- 以下的均以京東為例:
Option Description url 分類 是一個樹狀形式的分類展示,攜帶有scope.scope有web,app,全球購,商品庫等等 京東首頁 容器 container,顯示的空間 This link 京東 的分類為例,二級分類下的列表,有多個列表用于顯示的塊,一個列表是一個container。 SPU 是售賣的商品,每個商品都有很多的屬性,所有的商品都具備有相同的屬性集就存在SPU表內 京東商品展示頁 SKU 商品.不同商品編號的商品。 Properties 基本屬性集 Template 模板屬性集. -
-
設計思路詳細描述###
- 分類表
字段: { Id:"分類編號" scope:"作用域", name:"名稱", displayName:"顯示名稱", parentId:"父類編號", order:"排序" ... }
eg:
|分類1:scope=商品庫分類| +------電腦 +----------整機 +----------筆電 +----------配件 +------手機 +----------功能機 +----------智能機 |分類2:scope=APP_UI_Category| +------首頁 +----------推薦 +----------特色 +----------筆電 +----------配件 +------促銷 +----------限時特惠 +----------團購 |分類2:scope=Web| +------首頁 +----------推薦 +----------熱銷 +----------時令 +----------數碼 +------會員 +----------特惠 +----------團購
>---
>>* **SPU表**
>
> 字段:
> {
> Id:"SpuId"
> name:"名稱",
> displayName:"顯示名稱",
> brand:"品牌",
> defaultCate_Id:"默認分類Id"
> ...
> }
> 是售賣的商品,每個商品都有很多的屬性,所有的商品都具備有相同的屬性集就存在SPU表內,比如說Iphone,共同屬性有**Id,Name,displayName,brand(品牌),defaultId(默認分類編號**):手機》智能。共有的屬性(確定所有商品都會有的屬性)就放在SPU表中作為它的字段,不關注庫存。
>* 什么是**默認分類**?
>>>比如說:Ipone是屬于[3C](https://baike.baidu.com/item/3C%E4%BA%A7%E5%93%81/10865989),手機屬于移動電話,相當于類目。
>* 容器相當于分類?
>>>容器也是分類,但是不是此分類非彼分類。這里容器的概念是方便UI展示的。請參考Container表
>
>拋開分類不管,我們只管屬性,SPU是所有商品共有的屬性:brand,name.....,SKU是一個商品下變化的屬性。從程序的角度思考,可以把SPU看成是一個abstract,SKU是它的實現類。SKU{Id,name,displayName,商品編號=Id,外部編號(每一個商品都有一個69碼),Spu_Id}。
>---
>>* **Container表**
>
> {
> Id:'1'//編號。
> categoryId:"1",//特色推薦分類
> categoryName:"特色推薦"
> container_count:"4"http://特色推薦下的容器數量
> container_Id:[1,2,3,4]//包含的容器編號。
> jsons:'自定義存儲json的內容'
> }
>
>
> 容器表:
> {
> Id:'1'//容器編號
> toples:{title,sub_title,cover,price,link,Id:"可以是文章的,可以是商品的"}//點擊點
> categoryId:[1,2,3,4,5] //可以屬于多個分類
> }
>
>假如現在要做一個在APP上展示的一個 推薦 產品。如果現在是沒有容器這個概念,用來設計的話,需要把 **容器_name**:推薦 作為屬性存儲。現在我們單獨做出一張表來作為容器。容器表有一個**Id**,也有一個**默認顯示元素數量**的字段,比如說,我們在一個頁面上只展示4個元素塊。而不同的列表顯示的是不同的。記住,它是一個塊的概念。當我們的后臺管理人員把**商品入庫后**,它手動操作把某一個**入庫的商品加入到容器里面**進來。所有這個表也有一個**productId**。每次讀取容器的時候就可以查詢該容器下的Product。容器它也有一categoryId。
>* 已經存在Category表了,現在容器也有一個categoryId,它是屬于Category的嗎?
>>>不是,Category是一個Scope下的分類,而我們已經把容器單獨抽取出來作為一個表。所以不一樣。容器是用來展示的塊。比如說一個二級分類(Category表)下有一個推薦分類(Category表)頁,推薦的展示頁中有一個塊屬于**”特色推薦“**塊,是用于展示的塊。而Category表沒有展示的概念,是在后臺存儲的。比如說在上面寫的Category分類表,以分類2為例子:**|分類2:scope=APP_UI_Category|**下面有一個首頁,首頁下邊有一個推薦分類。以此為例,假如我們想在推薦分類下展示產品,這個時候我們并不知道該推薦下有哪些產品,APP首頁推薦下的產品 與 Web 端 首頁 推薦下的產品可能不一樣 ,所以我們把Container單獨作為一個表。
>
>>>**每個分類(Category表)下有多個容器塊或者一個容器塊。容器是最小化的,分類(Category是用于劃分的),容器是用來展示的,因為我們在UI下是對顯示數量有控制的,容器是沒有類目這個結構,它是被分類(Category)包含的。它只對自己容器里邊的內容進行界定,比如說items_count(容器數量),默認放4個,還有items(容器集合),還有自定義存儲json的內容(這是一個動態的內容,交給前端處理的,比如說樣式,我希望容器的第一條信息加粗顯示等等。一個分類包含多個容器,一個容器item下包含若干元素(tople),這個元素就是一個點擊點,用tople表示(點擊的意思),比如說,商品,可以是一個點擊點,一篇文章,一個視頻都是一個tople,tople由后臺自動或者非自動或者人工,把商品的屬性添加到這里來,一個tople下有title,sub_title,cover,price,link,Id)**
>
>* 一般瀏覽京東的時候,瀏覽一個推薦分類下的”精選3折起“塊(容器一),”男子精選“塊(容器二),”女子精選“塊(容器三),當我點擊進去”精選3折起“(容器一)的時候不是有多個商品展示嗎?有如下產品(以[adidas](https://shop.m.jd.com/?shopId=58463)為例),會看到多個不同的產品,如下:
>
> {
>
> "男子跑步鞋¥499 <del>¥899</del>(帶封面,點擊可跳轉)"
>
> "男子訓練鞋¥499 <del>¥799</del>(帶封面,點擊可跳轉)"
>
> "男女經典鞋¥289 <del>¥869</del>(帶封面,點擊可跳轉)"
>
> ......
>
> }
>
> 回歸到問題,一個tople下不是應該是對應多個產品嗎?怎么字段是 title,sub_title,cover,price,link,Id ?
>>> 因為這也屬于一個商品的共性,容器是用來展示的,tople也是用來展示商品的,因為我們做的是電商平臺,所以這里就有展示商品這里針對任何商品,這里展示商品都需要有title,sub_tile,cover(封面,只放一張圖),price,link,Id. 所以這么設計,就是這個道理。這里不會調加所有”3折起的產品“,這個tople只是一個簡化的版本。當我們點擊了,就會跳轉到商品詳情頁。[男子跑步鞋¥499 <del>¥899</del>(帶封面,點擊可跳轉)](https://item.m.jd.com/product/10618699195.html),這個時候我們才到商品下去加載商品的東西,什么顏色,尺碼等等屬性。 **這個Id存放的有可能是文章的Id,skuId等等。**
>
>>>**容器和tople都是用來前端展示的東西**
>---
>>* **SKU表**
>
>是SPU的擴展,SKU可能有N個分類。所以沒法寫分類Id,但是SPU表下有一個defaultCate_Id(默認分類編號),所以商品入庫的時候用的是SPU表下的defaultCate_Id。
>
> 字段:
> {
> Id:"skuId"
> name:"屬性名稱",
> displayname:"",
> 商品編碼:"=Id",
> 外部編碼:"69碼",
> spu_id:""
> ...
> }
>---
>>* **Properties表**
>
> 字段:
> {
> Id:"PropertieId"
> external_Id:"外部Id",
> spu_or_sku:"type,spu有屬性,sku也有屬性.",
> name:"屬性名",
> value:"屬性值",
> unit:"單位"
> ...
> }
>**比如說:**
>
>>| Id | external_Id |spu_or_sku|name|value|unit|
>>| ---| ----------- |----------|----|-----|----|
>>|10 | 1 | spu | cpu型號 | x5 | |
>>|11 | 1 | spu | color | red | |
>>|12 | 1 | spu | weight | 500 | g |
>>|13 | 1 | sku | 內存 | 32 | g |
>>|14 | 1 | sku | color |黑色 | |
>>|15 | 1 | sku | bundle_Items |5,3(都是sku) | |
>
>**這張表以后有可能數據量大的時候需要分庫。**
>如果是共有的就寫spu,如果是私有的話,就寫sku。sku是spu的擴展。spu的屬性是重復的屬性,sku的是擴展的,所以brand就不需要要了,spu只管非變量的,變量的它不管。
>
> 顯示的時候,先查找該商品的spuId以及skuId,然后在進行查詢展示。其他的就歸前端去展示。
>
>入庫的時候,可以選擇模板,也可以自己添加。
>
>---
>>* **Template表**
>
>每個人不可能把商品的屬性都記得住。所以需要提供一個Template表。模板是由運營人員來寫的。手機分類下是一個模板,電腦分類下是一個模板,其它分類下面也是一個模板。所以添加產品的時候有一個分類Id.當我們添加產品的時候,選擇了分類后,就會加載默認模板,name就代表屬性,以及是否必填項,value就是自己填寫的。比如說你賣電腦,就需要把CPU寫到規格去。模板的作用就是輔助商品入庫的。為了盡量讓name不需要自己寫而出現這個表的。
>
> 字段:
> {
> Id:"模板編號"
> name:"屬性名稱",
> IsRequired:"是否必填",
> categoryId:"分類Id,商品入庫的時候需要填寫categoryId"
> ...
> }
-
難點區分###
SPU,SKU,Template,Properties之間的關系
例子:你去一個超市,要買一個Iphone,當你跟服務員說:我要買一個Iphone,這個時候
服務員會問你,你要Iphone 6還是 Iphone 6 plus,還是 Iphone 5 還是 Iphone 7等等,會把所有型號問你一遍。
Ipone是代表一個產品的總稱,或者可以說是品牌。Iphone 6 plus 可以看做一個商品,進行銷售的商品。SPU 就代表Iphone 6,Iphone 6 plus, Iphone 5,Iphone 7。有一個共同的屬性:品牌。
品牌是所有商品共有的特性。Properties:添加完一個Iphone 7后,就添加 屬于 SPU 的 Properties,這里填寫的是
Iphone 7 的共同屬性:{weight:xxxg}。而SPU表 填寫的是 所有商品(Ipone,電腦,衣服,酒etc.)的共同屬性,而color是 Iphone 7這個商品的動態屬性:紅色,黑色等等。{sku:1,color:紅色;sku:1,color:黑色;}所以這個不同的屬性是填寫屬于Iphone 7的 SKU 的SKU 就代表Iphone 6,Iphone 6 plus, Iphone 5,Iphone 7。