商城專案解析(如果通過輸入商品分類顯示商品規格引數,在使用者輸入完商品資訊後,又如何把對應的資料Spu,Sku,庫存Stock,建立時間,最後一次更新時間等輸入到資料庫當中)

Andre_dong發表於2020-11-10

這次我們要去完成規格引數的顯示程式碼。
在這裡插入圖片描述
可以看到規格引數,這裡的前端程式碼是傳送這樣一條請求路徑,加上商品的id,

可以看到下面它有個Data資料,我們可以找一下這個Data對應的是什麼

在這裡插入圖片描述

最終找到了data的forEach,這個forEach是什麼意思呢?這個是遍歷的意思,它用在這裡是解構表示式,我們可以看到這個紅框裡面的屬性名是對應什麼呢?
在這裡插入圖片描述
可以看到,它是對應資料庫裡面的部分屬性的。data肯定是個集合,因為forEach是一個遍歷物件,它裡面的每個元素都在遍歷,所以forEach肯定是個集合。
在這裡插入圖片描述
我們再來看看後臺哪個模組擷取了這個引數分類

在這裡插入圖片描述
在這裡插入圖片描述
但是看看下圖中傳入的是一個gid,瀏覽器是傳入cid,那該怎麼辦呢?
在這裡插入圖片描述
本來下圖這個方法只是傳了gid這個引數,但是我們該如何傳入cid這個引數呢?我們可以這樣,直接在引數方法中加入其他引數,為什麼可以這樣做呢?加入其他引數不就等於要傳入四個引數嗎?其實不是的,在傳入引數這一塊,你寫可以傳入四個引數,但是我這邊可以只傳一個引數,假如我要傳gid,你這邊也只能接收到gid,而不會接收到其他的,為什麼我們要傳入四個引數呢?因為這四個引數對我們來說都有用,我們如果到時候需要用哪個功能,我們就傳入哪個引數。最後我們還需要在Service方法裡面傳入這幾個引數。

我們下面的這個方法是什麼作用呢?我們下面的方法是根據商品的條件去查詢他的規格引數,然而規格引數有很多,這四個引數就是它的規格引數。

在這裡插入圖片描述
Service裡面的方法是一樣的,你如果傳入,它就接收,你如果不傳入,它也不會做出反應,看你傳入哪個引數,哪個方法就會去響應。
在這裡插入圖片描述

來測試一下,啟動服務後,我們看看“新增商品”中的規格引數是什麼變化,選擇好一個商品分類為手機,然後選擇品牌後。
在這裡插入圖片描述
第二步的時候直接選擇下一步,然後到了第三步,可以看到,我們的引數發生了變化,像是型號,機身重量,機身材質工藝,作業系統這些只有手機這種商品才會有這種規格引數,我們輸入商品分類的id,也就是cid後,它會在Mapper方法(我們之前寫好的通過商品分類查詢規格引數方法)傳入cid或者其他引數,然後在Mapper裡面呼叫方法查詢資料庫對應的規格引數並且進行返回。
在這裡插入圖片描述
我們來到第四步,填一下SKU屬性,可以看到,我們先填兩個機身顏色。
在這裡插入圖片描述

記憶體我們寫兩個引數上去,其他屬性也差不多,就是寫兩個引數上去那種
在這裡插入圖片描述

可以看到我們最終生成的商品引數有這麼多條,這是為什麼呢?原來,我們的手機顏色,記憶體,容量,都是選了兩個,那就是2乘2乘2的關係,也就是這裡有三個組,每組兩個,三個組之間互相匹配,得出來這個結果。

在這裡插入圖片描述
然後你可以去選擇啟用哪個組合。
在這裡插入圖片描述
我們最終就可以去儲存商品資訊。
在這裡插入圖片描述

但是卻出現了儲存失敗。
在這裡插入圖片描述
看到瀏覽器這裡,有兩個請求,一個是跨域請求,為什麼說他是跨域請求呢?可以看他的請求方式是OPTIONS,而不是GET或者POST。

在這裡插入圖片描述
另外一個才是真正的請求,為什麼說他是真正的請求呢?因為他有一個POST,POST請求指的是你把一些資料傳送到伺服器,像這裡新增商品,我們是把商品的規格,引數,資訊等等傳送到伺服器。
但是方法我們還沒寫好,所以出現了錯誤。
在這裡插入圖片描述

而且你可以看到他傳的是一個json物件,我們應該要用RequestBody來接收,而且是要用一個物件來接收。這句話是什麼意思呢?也就是你後臺要去接收這個json物件的時候,這個json物件是一個整體,你不能只接收單個引數,因為如果只接收當個引數的話,其他的規格引數你沒辦法接收到,所以我們只能用一個完整的物件去接收這一個完整的json。
在這裡插入圖片描述
可以看到我們要接收這個json物件,可以用spu進行接收,但是這個json物件裡面有幾個spu的pojo方法裡面沒有封裝的物件,因此我們需要去進行一個擴充套件。
在這裡插入圖片描述
但是我們看到skus裡面有個集合,這個又要怎麼去接收它呢?
在這裡插入圖片描述
因此,我們需要加入這個sku物件。如果下次遇到同樣的情況,也就是我們的pojo裡面沒有這種瀏覽器裡面顯示的json物件的集合的,我們可以自己進行建立一個物件
在這裡插入圖片描述
引入物件,這個註解選擇上面的。

在這裡插入圖片描述
在資料庫裡面開啟sku看一看,是對應這些欄位
在這裡插入圖片描述
我們來看看這個庫存欄位,表裡面根本就沒有
在這裡插入圖片描述
庫存欄位只在庫存表裡面才會有。
在這裡插入圖片描述
所以這個註解的意思就是忽略這個欄位的意思。
在這裡插入圖片描述
因為通過上面的步驟,我們已經把skus建好了,然後我們取的名字建議要和瀏覽器裡面的名字是一樣的。不然以後會接收不到。
在這裡插入圖片描述
在這裡插入圖片描述

我們要注意的是,這裡還有個庫存的欄位,我們也要建立對應的類,去寫入這個庫存的pojo。而這個不需要寫進spuBo裡面,因為他在sku裡面
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
然後我們去建立SkuMapper

在這裡插入圖片描述
庫存的Mapper
在這裡插入圖片描述

然後我們不需要建立多一個Service,可以方便一點,直接在Goods的Service裡面和controller裡面進行編寫。
在這裡插入圖片描述
如果我們要儲存商品資訊,該怎麼儲存呢?我們可以開啟這個,然後找到儲存商品對應的按鈕。
在這裡插入圖片描述
可以看到,這裡有個儲存按鈕。

在這裡插入圖片描述
我們可以去method去找找submit方法,
在這裡插入圖片描述
它會進行一個校驗,校驗不通過就執行上面的方法,校驗通過就執行下面的方法。

在這裡插入圖片描述
最終提交請求在這個地方。如果是新增的話就是post,編輯的話就是put
在這裡插入圖片描述
這個就是請求引數,請求引數是什麼呢?
在這裡插入圖片描述
這些就是請求引數。
在這裡插入圖片描述
如果我們點選了儲存,最終並不需要返回什麼結果,可以看到括號裡面是空的,代表沒有返回結果,我們只需要輸出一個欄位給使用者看是否儲存成功了就可以了。
在這裡插入圖片描述
可以看到它的路徑是這個,因為item是我們在閘道器配的微服務路徑名,所以我們不需要寫進controller,所以只需要擷取goods就可以了。

在這裡插入圖片描述

我們的controller方法如下,最後是返回一個已經build了的狀態碼,另外說明一下這是在Goodscontroller裡面的。
在這裡插入圖片描述
再去編寫Service裡面的方法的時候,我們要清楚,我們要新增的表示哪幾個表,首先spu的表肯定要新增的,也就是基本參數列。
在這裡插入圖片描述
別忘了這裡還有spuDetail的表也是需要新增的。
在這裡插入圖片描述
所以spu_detail也是需要新增進去的。
在這裡插入圖片描述
sku也是需要新增進去,而且有兩個組
在這裡插入圖片描述
在這裡插入圖片描述
而且還有一個庫存資訊
在這裡插入圖片描述
下面是sku表
在這裡插入圖片描述
這是庫存資訊表
在這裡插入圖片描述
總共就是新增這些表,但是新增這些表有沒有先後順序呢?如果先新增庫存表的話,skuid從哪裡來,對吧?
在這裡插入圖片描述
如果先新增sku表,那spuid從哪來,
在這裡插入圖片描述
而且spu_detail表也是需要spu_id,所以你需要先去新增spu表。
在這裡插入圖片描述
新增完後我們就有spu_id,然後就可以去新增spu_detail和sku表。
在這裡插入圖片描述
然後sku表也有sku_id了,然後就可以傳給庫存表
在這裡插入圖片描述
在這裡插入圖片描述
編寫Service方法,Service方法在GoodsService裡面進行編寫,下面的Mapper方法能使用第一個就使用第一個,因為第一個效率更高,這種情況針對於插入資料到資料庫的情況。
在這裡插入圖片描述
我們看看資料庫,spu這張表,右邊紅框圈住的地方都是沒有編寫對應的引數方法,那我們該如何進行對他們的操作呢?
在這裡插入圖片描述

這裡進行一個小插曲,我們要進行下面的設定:
在這裡插入圖片描述
為什麼要設定為null呢?如果你不設定為null,別人可以通過專業軟體,寫和你一樣的請求地址,同一樣的請求方式,然後就可以隨便上傳一個檔案上來,如果是上傳病毒,那就有危險。

在這裡插入圖片描述
在這裡插入圖片描述
可以看到,資料庫真的接收到了資料。
在這裡插入圖片描述
上面講到資料表後面那幾個屬性名該怎麼設定,我們可以自己去新增,首先Saleable是是否上架,我們選擇true,setValid是是否可用,商品新增後肯定是上架了而且是可用的。然後建立時間是當前系統時間,其實更新時間有人也會用new Date,但是這裡最好不要用,為什麼呢?如果你去new兩個Date,可能時間會有延遲,相差幾毫秒,所以我們最好是用回剛剛new的時間。

在這裡插入圖片描述
我們來測試一下,點選儲存
在這裡插入圖片描述
可以看到我們的資料,如果找不到路徑的話可以先清空一下控制檯資訊,再點選儲存商品資訊
,對應的控制檯資訊就會出來了。
在這裡插入圖片描述
我們可以對比一下瀏覽器的值,還有資料庫裡面的,可以看到,除了spu_id這個值在瀏覽器上面沒有之外,其他的都有。也就是說瀏覽器並沒有把spu_id傳進來,所以我們要自己在後臺輸入這個spu_id,然後傳進資料庫。
在這裡插入圖片描述
我們從spuBo那裡拿到id,然後傳進spu,可以看到spuBo是沒有去設定它的id的,因為它傳進了資料庫裡面的話,資料庫會自動給它加上id,所以我們不需要給它加上id,但是可以把它的id拿過來賦值給Spu的id。
在這裡插入圖片描述
然後我們記得把spuDetail注入進來,然後我們要去新增sku,卻發現沒有sku的Mapper
在這裡插入圖片描述
順便把庫存的Mapper也加入進去,注意這兩個都要加Autowired註解。

在這裡插入圖片描述
我們skuMapper的方法如下,但是有點要注意的是,我們傳進來的東西不是一個引數這麼簡單,它是一個集合。
在這裡插入圖片描述
在這裡插入圖片描述
所以我們要一個個傳入,那就需要遍歷方法,我們可以用以下的遍歷方法去傳,傳的sku進去的那個insertSelective方法是最終返回的方法,我們在上面要編寫一個個資料怎麼傳進去的方法,可以對照資料庫,需要傳入哪些資料。

在這裡插入圖片描述
我們可以看到瀏覽器資訊並沒有傳入spu_id,所以我們要自己去獲取。
在這裡插入圖片描述
注意那個sku的id為什麼設為null,上面也解釋過,而且我們也不需要去設定它,因為它會自動生成。
在這裡插入圖片描述
然後我們還需要去修改這些數值就行,和上面修改Detail方法一樣,但是我們不是有其他引數嗎?為什麼不傳進來了?首先說明一下,spuBo是spu的擴充套件類,它包括了一切接收新增商品引數的封裝方法,包括sku的,所以使用者輸入的資料在傳入到controller被輸入到spuBo裡面,我們就可以通過spuBo拿到sku資料,這時候的sku就已經有了瀏覽器傳給它的基本資料了,但是它還有一些資料沒有,就是spu的id,建立時間,還有最後一次更新時間,這些資料卻是資料庫所需要的資料,所以我們需要手動在後端方法中去設定它,就行了,它原來的sku就已經包含了使用者輸入給它的資料,我們只是再新增幾個屬性而已,最終傳入到sku。為什麼要寫成遍歷的方式呢?因為你可以看看上面瀏覽器的圖,上面寫著sku不止一個陣列,有第0組和第1組,每個組我們都需要去增加剛剛說的那些資料庫的額外屬性,所以我們需要用到遍歷的方法。這裡要說明一下下面的sku的含義,下面的sku代表的是每一個spuBo.getSkus()的元素,spuBo.getSkus()是什麼呢?它代表的是sku的全部列表(如下面圖中的第二張圖所示),全部sku被傳進去了,我們就取每一個sku元素出來,然後進行增加屬性
在這裡插入圖片描述
在這裡插入圖片描述

還有stock呢?該怎麼寫,我們對照資料庫的表發現它需要這幾個引數。可以看到我們需要加入兩個欄位,一個是id,一個是stock。
在這裡插入圖片描述
這是我們需要加入的,id和Stock,為什麼在sku裡面拿Stock呢?我們可以看看瀏覽器,它在裡面是傳了一個Stock
在這裡插入圖片描述
可以看到是傳了一個Stock
在這裡插入圖片描述
最後有沒有發現一個問題,就是如果新增這些東西的過程中出現了問題怎麼辦,如果出現了問題,會出現一堆的垃圾資訊,那我們資料庫就會崩潰,所以我們需要新增事務,如果出錯了,事務會幫助我們進行回滾。

在這裡插入圖片描述

重新啟動一下微服務後,我們試試點選儲存
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
資料也有了
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
其他表就不一一展示了。

相關文章