1. 程式人生 > >樂優商城第九天,第十天,(商品規格引數模版的新增,商品的新增)

樂優商城第九天,第十天,(商品規格引數模版的新增,商品的新增)

樂優商城第9,10兩天,商品的新增,是整個後臺系統最難的地方,尤其是前端頁面,這裡把中心放在後端程式碼和業務邏輯上

spu是一種商品的總稱,比如小米8

sku是細分領域,比如xiaomi8 星空黑64G

商品的新增涉及4張表,spu,spudetail,sku,store

其實就是兩張表spu和sku,但是spudetail資料量太為龐大,而且不常用,我們採取了垂直拆分的方式,而sku的庫存,因為要經常讀寫,所以我們這裡單獨拆出了一張表stoke,為了讀寫分離。

我們這裡有個 很重要的資料庫思想

我們想一下,商品的規格引數資訊數不勝數,我們如何操作,才能夠讓規格引數更好操作呢,我們來事想到了,每一個分類對應一個模版,因為同一個細分領域的事物,他一般就有相同的屬性,所以,我們這裡以分類id為id,建立一個模版,一個分類具有一個json格式的模版,這樣商品的規格模版問題就完美解決了。


那麼,引數模版的問題就被順利地解決了

我們可以開始商品的新增了

首先,點選頁面的新增按鈕,會彈出對話方塊,


此時,我們需要去資料庫中查詢商品的分類資訊,當我們選擇完畢之後,我們會根據選擇的cid,去查詢他對應的品牌的資訊

然後品牌就可以填寫了。   接下來就是一些簡單資訊的填寫,spu和spudetail的資訊就填寫完成。

接下來,是sku頁面的顯示,第一個頁面是全域性屬性,是根據模版中的global來顯示的


接下來,就是sku的特殊屬性,特殊屬性會根據笛卡爾積樞紐工程若干個,我們可以根據需求選擇


最後,提交的時候,因為資料量過大,我們以json的格式進行提交


格式如下:

{
    "categories": [
        {
            "name": "手機",
            "id": 74
        },
        {
            "name": "手機通訊",
            "id": 75
        },
        {
            "name": "手機",
            "id": 76
        }
    ],
    "brandId": 1528,
    "title": "1111",
    "subTitle": "1",
    "spuDetail": {
        "packingList": "1",
        "afterService": "1",
        "description": "<p>11111</p>",
        "specTemplate": "{\"機身顏色\":[\"111111\"],\"記憶體\":[\"1GB及以下\"],\"機身儲存\":[\"8GB及以下\"]}",
        "specifications": "[{\"group\":\"主體\",\"params\":[{\"k\":\"品牌\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"型號\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"上市年份\",\"searchable\":false,\"global\":true,\"numerical\":true,\"unit\":\"年\",\"v\":\"1\"}]},{\"group\":\"基本資訊\",\"params\":[{\"k\":\"機身顏色\",\"searchable\":false,\"global\":false},{\"k\":\"機身重量(g)\",\"searchable\":false,\"global\":true,\"numerical\":true,\"unit\":\"g\",\"v\":\"1\"},{\"k\":\"機身材質工藝\",\"searchable\":false,\"global\":true,\"v\":\"1\"}]},{\"group\":\"作業系統\",\"params\":[{\"k\":\"作業系統\",\"searchable\":true,\"global\":true,\"v\":\"IOS\"}]},{\"group\":\"主晶片\",\"params\":[{\"k\":\"CPU品牌\",\"searchable\":true,\"global\":true,\"v\":\"驍龍(Snapdragon)\"},{\"k\":\"CPU型號\",\"searchable\":false,\"global\":true,\"v\":\"1\"},{\"k\":\"CPU核數\",\"searchable\":true,\"global\":true,\"v\":\"二核\"},{\"k\":\"CPU頻率\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"GHz\",\"v\":\"1\"}]},{\"group\":\"儲存\",\"params\":[{\"k\":\"記憶體\",\"searchable\":true,\"global\":false,\"numerical\":false,\"unit\":\"\"},{\"k\":\"機身儲存\",\"searchable\":true,\"global\":false,\"numerical\":false,\"unit\":\"\"}]},{\"group\":\"螢幕\",\"params\":[{\"k\":\"主螢幕尺寸(英寸)\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"英寸\",\"v\":\"1\"},{\"k\":\"解析度\",\"searchable\":false,\"global\":true,\"v\":\"1\"}]},{\"group\":\"攝像頭\",\"params\":[{\"k\":\"前置攝像頭\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"萬\",\"v\":\"1\"},{\"k\":\"後置攝像頭\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"萬\",\"v\":\"1\"}]},{\"group\":\"電池資訊\",\"params\":[{\"k\":\"電池容量(mAh)\",\"searchable\":true,\"global\":true,\"numerical\":true,\"unit\":\"mAh\",\"v\":\"1\"}]}]"
    },
    "cid1": 74,
    "cid2": 75,
    "cid3": 76,
    "skus": [
        {
            "id": null,
            "enable": true,
            "title": "1111 8GB及以下 1GB及以下 111111",
            "images": "",
            "ownSpec": "{\"機身儲存\":\"8GB及以下\",\"記憶體\":\"1GB及以下\",\"機身顏色\":\"111111\"}",
            "indexes": "0_0_0",
            "stock": null
        }
    ]

}

這樣,spu和sku的資料就齊全了,spu,spudetail,skus(一個sku的集合),這樣就全了

下面,我們來到後端程式碼的書寫

首先,我們是post方式提交,而且是json,我們用@ResquestBody來接收

@PostMapping
public ResponseEntity<Void> addGoods(@RequestBody GoodsBo goods){
this.goodsService.addGoods(goods);
return ResponseEntity.status(HttpStatus.OK).body(null);
}

goods是一個實體類,裡面包含了我們要提交的所有資料

public class GoodsBo extends Spu {
private SpuDetail spuDetail;
private List<Sku> skus;

繼承自spu,新增spudetail,skus,這樣就可以完美接收傳過來的資料了,然後就是四個表的資料的新增

,資料的新增很簡單,直接亮出程式碼

public void addGoods(GoodsBo goods) {
//儲存spu
Spu spu = new Spu();
BeanUtils.copyProperties(goods, spu);
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis);
spu.setSaleable(true);
spu.setValid(true);
spu.setCreateTime(date);
spu.setLastUpdateTime(date);
spuMapper.insertSelective(spu);
//儲存spuDetail
SpuDetail spuDetail = goods.getSpuDetail();
spuDetail.setSpuId(spu.getId());
spuDetailMapper.insertSelective(spuDetail);
//儲存skustore
List<Sku> skus = goods.getSkus();
for (Sku sku : skus) {
sku.setSpuId(spu.getId());
sku.setEnable(true);
sku.setCreateTime(date);
sku.setLastUpdateTime(date);
skuMapper.insertSelective(sku);
Stock stock = new Stock();
Long stocks = sku.getStock();
stock.setStock(stocks);
stock.setSkuId(sku.getId());
stockMapper.insertSelective(stock);
    }

當然了,這當中,我肯定也遇到了各種問題,其中最叼的一個坑是資料型別的不一致,前端傳過來的庫存欄位stock是一個物件,而我後端接收的是一個基本資料型別,這樣導致,我的addGoods方法根本進不來。。。。。。。。這個是最大方的坑,可能以後還會經常遇到吧

相關推薦

商城九天商品規格引數模版新增商品新增

樂優商城第9,10兩天,商品的新增,是整個後臺系統最難的地方,尤其是前端頁面,這裡把中心放在後端程式碼和業務邏輯上spu是一種商品的總稱,比如小米8sku是細分領域,比如xiaomi8 星空黑64G商品的新增涉及4張表,spu,spudetail,sku,store其實就是兩

商城九天購物車

html5的web儲存localstorage 沒有時間限制,只能儲存字串。可以在網頁之間傳輸資訊。購物車的流程。首先,我們在商品詳情頁點選加入購物車,把sku資訊儲存在localstorge中,當頁面跳轉到購物車頁面的時候,我們判斷有沒有登陸 ,沒有登陸的話,我們儲存在本地

商城授權中心與登陸

很早之前,聽人家做淘淘商城的人一直說單點登入,但是一直不明白單點登陸是什麼,看百度百科如果是這樣的話,那麼我們這個應該也算是一種單點登陸的解決方案。我們的登陸是服務端無狀態的登陸採用jwt+rsa對稱式加密演算法來生成一個令牌,儲存在瀏覽器,瀏覽器下次可以通過攜帶cookie

商城Elasticsearch

spring data Elasticsearch1.匯入依賴<dependencies> <dependency> <groupId>org.springframework.boot</groupId>

商城—— 訂單中心

目錄 一、我的訂單頁 1.1. 頁面效果 1.2 後臺介面 1.3 頁面改造 1.3.1 資料載入 1.3.2 分頁條 1.4 測試 1.5 訂單狀態過濾 1.5.1 全部訂單(16) 1.5.2 待付款(3) 1.5.3 待發貨(4) 1.5.4 待

商城——訂單微服務

目錄 五、地址管理 5.1 頁面效果 5.2 資料庫表設計 5.3 頁面優化 5.3.1 在data中定義資料 5.3.2 模態框 5.3.3 方法繫結 5.3.4 效果展示 5.4 後臺介面 5.4.1 實體類 5

商城——訂單微服務

目錄 四、細節優化 4.1 支付頁面顯示總金額 4.1.1 支付頁面 4.1.2 支付成功頁面 4.2 修改訂單號的傳遞方式 4.2.1 修改訂單提交函式 4.2.2 修改支付頁面 4.3 訂單提交時進行登入認證 4.4 本地資料刪除 4.5 購物車資料更新

商城——訂單微服務

目錄 二、訂單結算頁 2.1 頁面跳轉 2.2 收貨人資訊 2.3 支付方式 2.4 商品列表 2.4.1 購物車資訊獲取 2.4.2 頁面渲染 2.5 總金額 2.6 提交訂單 2.6.1 頁面提交 2.6.2 精度損失問題 三、微信支付 3.1

商城——訂單微服務

目錄 一、建立訂單微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 1.5 配置匯入 1.6 屬性讀取 1.7 支付工具類 1.8 修改閘道器配置 二、實體類準備 2.1 Order.java 2.2 OrderD

商城——訂單微服務

目錄 一、訂單系統介面 1.1 Swagger-UI 1.1.1 什麼是OpenApi 1.1.2 什麼是Swagger 1.1.3 快速入門 1.2 測試介面 1.2.1 建立訂單介面 1.2.2 生成ID方式 1.2.3 查詢訂單介面

商城——購物車

目錄 一、搭建購物車微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 二、購物車功能分析 2.1 需求 2.2 流程圖 三、未登入購物車 3.1 準備 3.1.1 購物車的資料結構 3.1.2 web本地儲存

商城——授權中心

目錄 三、首頁判斷登入狀態 3.1 頁面程式碼 3.2 後臺實現校驗使用者介面 3.3 測試 3.4 重新整理token 四、閘道器的登入攔截 4.1 引入jwt相關配置 4.2 編寫過濾邏輯 4.3 白名單 三、首頁判斷登入狀態 雖然cookie已經

商城——授權中心

目錄 一、無狀態登入原理 1.1 什麼是有狀態 1.2 什麼是無狀態 1.3 如何實現無狀態 1.4 JWT 1.4.1 簡介 1.4.2 資料格式 1.4.3 JWT互動流程 1.4.4 非對稱加密 1.5 結合Zuul的鑑權流程 1.5.1 沒有RSA

商城——使用者註冊

目錄 七、根據使用者名稱和密碼查詢使用者 7.1 介面說明 7.2 Controller 7.3 Service 7.4 測試 八、在註冊頁進行測試 七、根據使用者名稱和密碼查詢使用者 7.1 介面說明 功能描述:查詢功能,根據引數中的使用者名稱和密碼查詢指定

商城——使用者註冊

  五、傳送簡訊功能 5.1 介面說明 功能描述:根據使用者輸入的手機號,生成隨機驗證碼,長度為6位,純數字。並且呼叫簡訊服務,傳送驗證碼到使用者手機。 介面路徑:POST /code 引數說明: 引數 說明

商城——RabbitMQ及資料同步

一、RabbitMQ 1.1 搜尋與商品服務的問題 1.2 訊息佇列(MQ) 1.2.1 什麼是訊息佇列 1.2.2 AMQP和JMS 1.2.3 常見MQ產品 1.2.4 RabbitMQ 1.3 下載和安裝 1.3.1 下載 1.3.2 安裝 二、五種

商城服務鑑權

一、使用者鑑權 客戶端請求服務時,根據提交的token獲取使用者資訊,看是否有使用者資訊及使用者資訊是否正確,這個在樂優商城中已經實現。 二、服務鑑權 微服務中,一般有多個服務,服務與服務之間相互呼叫時,有的服務介面比較敏感,比如資金服務,不允許其他服務隨便呼叫,所以要進行服務呼叫的許可

商城秒殺總結

目錄 一、快取優化 1.1 頁面快取 將不經常改動的頁面直接快取到redis中,然後用Thymeleaf檢視解析器將快取的頁面直接渲染出來。 1.2 物件快取 將經常使用的物件資訊放入redis中,比如

商城商品管理

目錄 3.8 表單提交 3.8.1 新增提交按鈕和動畫 樣式: <v-layout row> <v-spacer></v-spacer> <v-btn

商城商品管理

目錄 3.4 商品描述資訊 商品描述資訊比較複雜,而且圖文並茂,甚至包括視訊。 這樣的內容,一般都會使用富文字編輯器。 3.4.1 富文字編輯器 通俗來說:富文字,就是比較豐富的文字編輯器。