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