商城專案解析(如果通過輸入商品分類顯示商品規格引數,在使用者輸入完商品資訊後,又如何把對應的資料Spu,Sku,庫存Stock,建立時間,最後一次更新時間等輸入到資料庫當中)
這次我們要去完成規格引數的顯示程式碼。
可以看到規格引數,這裡的前端程式碼是傳送這樣一條請求路徑,加上商品的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
最後有沒有發現一個問題,就是如果新增這些東西的過程中出現了問題怎麼辦,如果出現了問題,會出現一堆的垃圾資訊,那我們資料庫就會崩潰,所以我們需要新增事務,如果出錯了,事務會幫助我們進行回滾。
重新啟動一下微服務後,我們試試點選儲存
資料也有了
其他表就不一一展示了。
相關文章
- 華為商品管理系統批次更新商品時提示:請至少輸入一組國家碼和價格
- 專案時間管理各過程的輸入輸出關係
- 如何在MySQL提示符中顯示當前使用者、資料庫、時間等資訊MySql資料庫
- 使用者輸入網址到顯示對應的⻚面解析全過程
- 模擬輸入密碼時顯示‘*’,然後將密碼輸出密碼
- 穀粒商城day61-商品服務-API-新增商品-儲存SPU基本資訊+儲存SKU基本資訊+呼叫遠端服務儲存優惠等資訊API
- 資料儲存與輸出輸入
- Adroid edittext 輸入小數時只能輸入到小數點後的固定位數
- 寫java程式時輸入資料Java
- 資料的輸入輸出
- 在Delphi中處理資料庫日期型欄位的顯示與輸入 (轉)資料庫
- vue 商品sku新增,笛卡爾演算法,商品新增。動態生成table,table新增值後 再生成的table 不改變table之前輸入的值Vue演算法
- 對資料泵資料傳輸的時間統計
- Oracle帶輸入輸出引數的儲存過程Oracle儲存過程
- 在sqlplus中呼叫in out輸入輸出引數的儲存過程SQL儲存過程
- 03 資料輸入-輸出
- 在Excel中設定當資料輸入錯誤時提示出錯信Excel
- 計算階乘-當輸入的資料是帶小數時引發異常
- javascript實時顯示文字框輸入字數JavaScript
- 如何透過API獲取實時商品資料API
- EXCEL中如何橫向輸入資料?Excel
- 如何按最後修改時間對 ls 命令的輸出進行排序排序
- [C++]輸入/輸出流類庫C++
- Java中如何得到檔案的建立時間&最後修改時間Java
- 如何限制使用者在某個時間段內禁止登入資料庫資料庫
- 電商專案,不同的商品,自動化場景應該怎麼設計呢?(我目前就是寫了每個商品進入詳情頁到輸入資訊再到下單的正常流程)
- 輸入進入停車場時間,獲取系統當前時間,計算停車費用並按照指定的格式輸入清單
- jive建立論壇或發貼時,輸入的中文名顯示亂碼,檢視資料庫中,也為亂碼資料庫
- 把csv檔案的資料匯入到oracle資料庫中Oracle資料庫
- Python資料的輸入與輸出Python
- 驗證使用者輸入的口令是否與資料庫中的匹配資料庫
- 如何在Excel表格中快速輸入有規則的資料Excel
- C#中呼叫SQL儲存過程(帶輸入輸出引數的例子)C#SQL儲存過程
- oracle儲存過程procedure輸入引數為空_如果顯示錶列不為 null的記錄Oracle儲存過程Null
- 實際案例:如何實現報表回寫時引數聯動輸入資料
- 限制使用者在某個時間段內禁止登入資料庫資料庫
- 重新思考資料輸入
- 驗證使用者輸入的字串是否為日期時間字串