樂優(yōu)商城學(xué)習(xí)筆記二十五-購物車(一)


title: 樂優(yōu)商城學(xué)習(xí)筆記二十五-購物車(一)
date: 2019-04-25 21:11:46
tags:
- 樂優(yōu)商城
- java
- springboot
categories:
- 樂優(yōu)商城


0.學(xué)習(xí)目標(biāo)

1.搭建購物車服務(wù)

1.1.創(chuàng)建module

image
image

1.2.pom依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>leyou</artifactId>
        <groupId>com.leyou.parent</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.leyou.service</groupId>
    <artifactId>ly-cart</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
</project>

1.3.配置文件

server:
  port: 8088
spring:
  application:
    name: cart-service
  redis:
    host: 192.168.56.101
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
    registry-fetch-interval-seconds: 5
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1
    instance-id: ${eureka.instance.ip-address}.${server.port}
    lease-renewal-interval-in-seconds: 3
    lease-expiration-duration-in-seconds: 10

1.4.啟動類

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class LyCartApplication {

    public static void main(String[] args) {
        SpringApplication.run(LyCartApplication.class, args);
    }
}

2.購物車功能分析

2.1.需求

需求描述:

  • 用戶可以在登錄狀態(tài)下將商品添加到購物車
    • 放入數(shù)據(jù)庫
    • 放入redis(采用)
  • 用戶可以在未登錄狀態(tài)下將商品添加到購物車
    • 放入localstorage
  • 用戶可以使用購物車一起結(jié)算下單
  • 用戶可以查詢自己的購物車
  • 用戶可以在購物車中可以修改購買商品的數(shù)量蜜另。
  • 用戶可以在購物車中刪除商品。
  • 在購物車中展示商品優(yōu)惠信息
  • 提示購物車商品價格變化

2.2.流程圖:

image

這幅圖主要描述了兩個功能:新增商品到購物車右蹦、查詢購物車滔以。

新增商品:

  • 判斷是否登錄
    • 是:則添加商品到后臺Redis中
    • 否:則添加商品到本地的Localstorage

無論哪種新增捉腥,完成后都需要查詢購物車列表:

  • 判斷是否登錄
    • 否:直接查詢localstorage中數(shù)據(jù)并展示
    • 是:已登錄,則需要先看本地是否有數(shù)據(jù)你画,
      • 有:需要提交到后臺添加到redis抵碟,合并數(shù)據(jù),而后查詢
      • 否:直接去后臺查詢redis坏匪,而后返回

3.未登錄購物車

3.1.準(zhǔn)備

3.1.1購物車的數(shù)據(jù)結(jié)構(gòu)

首先分析一下未登錄購物車的數(shù)據(jù)結(jié)構(gòu)拟逮。

我們看下頁面展示需要什么數(shù)據(jù):

image

因此每一個購物車信息,都是一個對象适滓,包含:

{
    skuId:2131241,
    title:"小米6",
    image:"",
    price:190000,
    num:1,
    ownSpec:"{"機身顏色":"陶瓷黑尊享版","內(nèi)存":"6GB","機身存儲":"128GB"}"
}

另外敦迄,購物車中不止一條數(shù)據(jù),因此最終會是對象的數(shù)組凭迹。即:

[
    {...},{...},{...}
]

3.1.2.web本地存儲

知道了數(shù)據(jù)結(jié)構(gòu)罚屋,下一個問題,就是如何保存購物車數(shù)據(jù)嗅绸。前面我們分析過脾猛,可以使用Localstorage來實現(xiàn)。Localstorage是web本地存儲的一種朽砰,那么尖滚,什么是web本地存儲呢?

什么是web本地存儲瞧柔?

image

web本地存儲主要有兩種方式:

  • LocalStorage:localStorage 方法存儲的數(shù)據(jù)沒有時間限制漆弄。第二天、第二周或下一年之后造锅,數(shù)據(jù)依然可用撼唾。
  • SessionStorage:sessionStorage 方法針對一個 session 進行數(shù)據(jù)存儲。當(dāng)用戶關(guān)閉瀏覽器窗口后哥蔚,數(shù)據(jù)會被刪除倒谷。

LocalStorage的用法

語法非常簡單:

image
localStorage.setItem("key","value"); // 存儲數(shù)據(jù)
localStorage.getItem("key"); // 獲取數(shù)據(jù)
localStorage.removeItem("key"); // 刪除數(shù)據(jù)

注意:localStorage和SessionStorage都只能保存字符串蛛蒙。

不過,在我們的common.js中渤愁,已經(jīng)對localStorage進行了簡單的封裝:

image

示例:

image

3.1.3.獲取num

添加購物車需要知道購物的數(shù)量牵祟,所以我們需要獲取數(shù)量大小。我們在Vue中定義num抖格,保存數(shù)量:

image

然后將num與頁面的input框綁定诺苹,同時給+-的按鈕綁定事件:

image

編寫事件:

image

3.2.添加購物車

3.2.1.點擊事件

我們看下商品詳情頁:

image

現(xiàn)在點擊加入購物車會跳轉(zhuǎn)到購物車成功頁面。

不過我們不這么做雹拄,我們綁定點擊事件收奔,然后實現(xiàn)添加購物車功能。

image

addCart方法中判斷用戶的登錄狀態(tài):

image

3.2.2.獲取數(shù)量滓玖,添加購物車

addCart(){
    // 判斷登錄狀態(tài)
    ly.http.get("/auth/verify")
        .then(resp => {

    })
        .catch(() => {
        // 未登錄坪哄,添加到localstorage
        // 1、查詢本地購物車
        const carts = ly.store.get("carts") || [];
        let cart = carts.find(c => c.skuId === this.sku.id);
        // 2势篡、判斷是否存在
        if(cart){
            // 3翩肌、存在,改數(shù)量
            cart.num += this.num;
        }else {
            // 4殊霞、不存在摧阅,新增
            cart = {
                skuId: this.sku.id,
                title: this.sku.title,
                image: this.images[0],
                price: this.sku.price,
                num: this.num,
                ownSpec: JSON.stringify(this.ownSpec)
            };
            carts.push(cart);
        }
        // 把carts寫回localstorage
        ly.store.set("carts", carts);

        // 跳轉(zhuǎn)
        window.location.;
    });
}

結(jié)果:

image

添加完成后,頁面會跳轉(zhuǎn)到購物車結(jié)算頁面:cart.html

3.3.查詢購物車

3.3.1.校驗用戶登錄

因為會多次校驗用戶登錄狀態(tài)绷蹲,因此我們封裝一個校驗的方法:

在common.js中:

image

3.3.2.查詢購物車

頁面加載時,就應(yīng)該去查詢購物車顾孽。

var cartVm = new Vue({
    el: "#cartApp",
    data: {
        ly,
        carts: [],// 購物車數(shù)據(jù)
    },
    created() {
        this.loadCarts();
    },
    methods: {
        loadCarts() {
            // 先判斷登錄狀態(tài)
            ly.verifyUser()
                .then(() => {
                    // 已登錄

                })
                .catch(() => {
                    // 未登錄
                    this.carts = ly.store.get("carts") || [];
                    this.selected = this.carts;
                })
                }
    }
    components: {
        shortcut: () => import("/js/pages/shortcut.js")
    }
})

刷新頁面祝钢,查看控制臺Vue實例:

image

3.5.2.渲染到頁面

接下來,我們在頁面中展示carts的數(shù)據(jù):

頁面位置:

image

修改后:

image

要注意若厚,價格的展示需要進行格式化拦英,這里使用的是我們在common.js中定義的formatPrice方法:

image

效果:

[圖片上傳失敗...(image-4b986b-1556198414795)]

3.6.修改數(shù)量

我們給頁面的 +-綁定點擊事件,修改num 的值:

image

兩個事件:

increment(c) {
    c.num++;
    ly.verifyUser()
        .then(() => {
            // TODO 已登錄测秸,向后臺發(fā)起請求
        })
        .catch(() => {
            // 未登錄疤估,直接操作本地數(shù)據(jù)
            ly.store.set("carts", this.carts);
    })
},
decrement(c) {
    if (c.num <= 1) {
        return;
    }
    c.num--;
    this.verifyUser()
        .then(() => {
        // TODO 已登錄,向后臺發(fā)起請求
        })
        .catch(() => {
            // 未登錄霎冯,直接操作本地數(shù)據(jù)
            ly.store.set("carts", this.carts);
        })
},

3.7.刪除商品

給刪除按鈕綁定事件:

image

點擊事件中刪除商品:

deleteCart(i) {
    this.verifyUser()
        .then(() => {
            // 已登錄
        })
        .catch(() => {
            // 未登錄
            this.carts.splice(i, 1);
            ly.store.set("carts", this.carts);
        })
}

3.8.選中商品

在頁面中铃拇,每個購物車商品左側(cè),都有一個復(fù)選框沈撞,用戶可以選擇部分商品進行下單慷荔,而不一定是全部:

image

我們定義一個變量,記錄所有被選中的商品:

image

3.8.1.選中一個

我們給商品前面的復(fù)選框與selected綁定缠俺,并且指定其值為當(dāng)前購物車商品:

image

3.8.2.初始化全選

我們在加載完成購物車查詢后显晶,初始化全選:

image

3.8.4.總價格

然后編寫一個計算屬性贷岸,計算出選中商品總價格:

computed: {
    totalPrice() {
        return this.selected.map(c => c.num * c.price).reduce((p1, p2) => p1 + p2, 0);
    }
}

在頁面中展示總價格:

image

效果:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磷雇,隨后出現(xiàn)的幾起案子偿警,更是在濱河造成了極大的恐慌,老刑警劉巖唯笙,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟蒸,死亡現(xiàn)場離奇詭異,居然都是意外死亡睁本,警方通過查閱死者的電腦和手機尿庐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呢堰,“玉大人抄瑟,你說我怎么就攤上這事⊥魈郏” “怎么了皮假?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骂维。 經(jīng)常有香客問我惹资,道長,這世上最難降的妖魔是什么航闺? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任褪测,我火速辦了婚禮,結(jié)果婚禮上潦刃,老公的妹妹穿的比我還像新娘侮措。我一直安慰自己,他們只是感情好乖杠,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布分扎。 她就那樣靜靜地躺著,像睡著了一般胧洒。 火紅的嫁衣襯著肌膚如雪畏吓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天卫漫,我揣著相機與錄音菲饼,去河邊找鬼。 笑死汛兜,一個胖子當(dāng)著我的面吹牛巴粪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肛根,長吁一口氣:“原來是場噩夢啊……” “哼辫塌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起派哲,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤臼氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芭届,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體储矩,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年褂乍,在試婚紗的時候發(fā)現(xiàn)自己被綠了持隧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逃片,死狀恐怖屡拨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褥实,我是刑警寧澤呀狼,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站损离,受9級特大地震影響哥艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僻澎,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一貌踏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窟勃,春花似錦哩俭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸捏。三九已至谬运,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垦藏,已是汗流浹背梆暖。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掂骏,地道東北人轰驳。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親级解。 傳聞我的和親對象是個殘疾皇子冒黑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于商城中購物車功能,天貓是必須登錄才能將商品加入到購物車勤哗,京東則可以在不登錄狀態(tài)下也可以加入購物車抡爹,這里就模仿京...
    奇點一氪閱讀 2,920評論 1 4
  • 7 構(gòu)建在線商店 在上一章中,你創(chuàng)建了關(guān)注系統(tǒng)和用戶活動流芒划。你還學(xué)習(xí)了Django信號是如何工作的冬竟,并在項目中集成...
    lakerszhy閱讀 2,013評論 0 3
  • 產(chǎn)品需求文檔(PRD),是一個產(chǎn)品項目由“概念化”階段進入到“圖紙化”階段的最主要的一個文檔民逼,其作用是“對市場需求...
    當(dāng)時不是尋常閱讀 2,218評論 0 14
  • 豬頭說拼苍,你一定要幸福呦笑诅! 豬頭說,還好沒結(jié)婚要不就耽誤你了映屋。 可燕子走后苟鸯, 豬頭追著跑著,甚至懇求著棚点,燕子你帶我走...
    十五雁歸來閱讀 446評論 0 0
  • 秋天一日日地走向深濃瘫析。 我大概八年沒有感覺過這種秋的況味了砌梆。無論太原,還是蘭州贬循,秋都躲在夏的尾巴上咸包,輕巧地就從身邊...
    四小姐的家閱讀 722評論 0 49