購物車邏輯代碼

需求分析:

列表頁list.html

html結(jié)構(gòu)

 <p class="login-txt">登錄</p>
    <p> <a href="register.html">注冊</a></p>
    <p><a href="./shopCart.html">購物車</a></p>
    <div id="box">
        <ul>
           
        </ul>
    </div>
    <div class="mask">
        <div class="login">
            <p><input type="text" class="user"/></p>
            <p><input type="text" class="pw"/></p>
            <p><button>登錄</button>></p>
        </div>
    </div>
    <script src="js/axios.js"></script>
    <script src="js/jquery.js"></script>
    <script src="js/jquery.cookie.js"></script>
    <script src="js/list.js"></script>
    <script src="js/addCart.js"></script>
    <script src="js/login.js"></script>
列表頁功能一: 初始化展示商品列表

前端代碼

let page = 1;  //頁碼
let mask = document.querySelector(".mask") //獲取dom

// 渲染數(shù)據(jù)
function render(data) {
    if (data.code === 0) {
        let html = ''
        data.list.forEach((item) => {
            html += `
            <li>
                <a href="./detail.html?id=${item.Id}">
                    <div class="pro_img"><img src="https:${item.imgUrl}" width="150" height="150"></div>
                    <h3 class="pro_name"><a href="#"> ${item.title} </a></h3>
                    <p class="pro_price">${item.price}元</p>
                    <p></p>
                    <div class="add_btn" data-id="${item.Id}">加入購物車</div>
                </a>
            </li>
            `
        })
        $("#box ul").append(html)
    }
}
// 初始化加載數(shù)據(jù)
function initData() {
    axios.get("/product",{
        params: {
            page
        }
    })
    .then((res) => {
        render(res.data)
    })
}

initData()

后端代碼

// 查詢所有商品(分頁顯示)
router.get("/product", (req, res) => {
    let { page } = req.query;
    const pageSize = 10;
    let start = (page - 1) * pageSize
    let sql = `select * from midata order by Id asc limit ?,?`
    conn.query(sql, [start, pageSize], function (err, result) {
        if (err) {
            console.log('查詢數(shù)據(jù)庫失敗');
        } else {
            let data;
            if (result.length) {
                data = {
                    code: 0,
                    list: result
                }
            } else {
                data = {
                    code: 1,
                    msg: '沒有結(jié)果 '
                }
            }
            res.send(data)
        }
    })
})
列表頁功能二: 登錄入口酱虎,可在本頁面顯示登錄窗口咖杂,實現(xiàn)登錄功能
// 每個頁面中的登錄
function login() {
    $(".mask button").on("click", function () {
        let data = {
            user: $(".user").val(),
            pw: $(".pw").val()
        }
        axios.post('/login', data)
            .then((res) => {
                console.log(res.data);
                mask.classList.remove("active")
                $.cookie("user",data.user,{ expires: 100})
            })
    })

}
//登錄彈窗
function loginBox() {
    let loginTxt = document.querySelector(".login-txt")
    var login = document.querySelector(".login")

    //綁定事件啦撮,單擊登錄時谁撼,顯示彈窗
    loginTxt.onclick = function () {
        mask.classList.add("active")
    }

    //單擊遮罩層砂沛,讓遮罩層消失
    mask.onclick = function () {
        this.classList.remove("active")
    }

    //阻止冒泡
    login.onclick = function (e) {
        e.stopPropagation()
    }
}
login()
loginBox()
列表頁功能三: 每個商品實現(xiàn)加入購物車功能

先驗證是否登錄,如何沒有登錄哀澈,進(jìn)行登錄牌借,如果已登錄,則把商品id和用戶id傳向后端接口

前端代碼

function cart() {
    // 加入購物車
    function addCart() {
        $("#box ul").on("click", ".add_btn", function () {
            //驗證用戶是否登錄
            let userId = $.cookie("user");
            let proId = $(this).data("id")  //獲取商品Id
            console.log(proId);
            if (!userId) {
                //當(dāng)cookie不存在割按,即沒有登錄
                mask.classList.add("active")
                return;
            }
            let data = {
                userId,
                proId
            }
            axios.post("/cart",data)
            .then((res)=>{
                console.log(res.data);
            })
        })

    }
    addCart();
}
cart()

后端代碼

// 添加商品到購物車
router.post("/cart", (req, res) => {
    //接收參數(shù)
    let { userId, proId } = req.body;
    let sql = "select * from cart where userId = ? and proId = ?"
    conn.query(sql, [userId, proId], function (err, result) {
        if (err) {
            console.log('數(shù)據(jù)庫訪問失敗');
        } else {

            let data;
            if (result.length) {
                console.log('11');
                //當(dāng)前用戶存在該商品
                let cartId = result[0].cartId
                let num = result[0].num + 1
                // 更新商品數(shù)量 
                let sql = "update cart set num = ? where cartId = ?"
                conn.query(sql, [num, cartId], function (err, result) {
                    if (result.affectedRows === 1) {
                        res.send({
                            code: 0,
                            msg: '添加購物車成功膨报,數(shù)量更改'
                        })
                    }
                })
            } else {
                console.log(22);
                //當(dāng)前用戶不存在該商品
                let sql = "insert into cart (userId,proId,num) values (?,?,?)"
                conn.query(sql, [userId, proId, 1], function (err, result) {
                    if (result.affectedRows === 1) {
                        res.send({
                            code: 0,
                            msg: '添加購物車成功,數(shù)量初始為1'
                        })
                    }
                })
            }
        }
    })
})
列表頁功能四: 加入購物車

后端接口接收商品id和用戶id适荣,先驗證該用戶的當(dāng)前商品是否存在现柠,如果不存在,則新增弛矛,如果存在够吩,則修改數(shù)量

前端代碼

function cart() {
    // 加入購物車
    function addCart() {
        $("#box ul").on("click", ".add_btn", function () {
            //驗證用戶是否登錄
            let userId = $.cookie("user");
            let proId = $(this).data("id")  //獲取商品Id
            console.log(proId);
            if (!userId) {
                //當(dāng)cookie不存在,即沒有登錄
                mask.classList.add("active")
                return;
            }
            let data = {
                userId,
                proId
            }
            axios.post("/cart",data)
            .then((res)=>{
                console.log(res.data);
            })
        })

    }
    addCart();
}
cart()

后端代碼

// 添加商品到購物車
router.post("/cart", (req, res) => {
    //接收參數(shù)
    let { userId, proId } = req.body;
    let sql = "select * from cart where userId = ? and proId = ?"
    conn.query(sql, [userId, proId], function (err, result) {
        if (err) {
            console.log('數(shù)據(jù)庫訪問失敗');
        } else {

            let data;
            if (result.length) {
                console.log('11');
                //當(dāng)前用戶存在該商品
                let cartId = result[0].cartId
                let num = result[0].num + 1
                // 更新商品數(shù)量 
                let sql = "update cart set num = ? where cartId = ?"
                conn.query(sql, [num, cartId], function (err, result) {
                    if (result.affectedRows === 1) {
                        res.send({
                            code: 0,
                            msg: '添加購物車成功丈氓,數(shù)量更改'
                        })
                    }
                })
            } else {
                console.log(22);
                //當(dāng)前用戶不存在該商品
                let sql = "insert into cart (userId,proId,num) values (?,?,?)"
                conn.query(sql, [userId, proId, 1], function (err, result) {
                    if (result.affectedRows === 1) {
                        res.send({
                            code: 0,
                            msg: '添加購物車成功周循,數(shù)量初始為1'
                        })
                    }
                })
            }
        }
    })
})
列表頁功能五: 跳轉(zhuǎn)至詳情頁

單擊商品,跳轉(zhuǎn)到詳情頁万俗,并傳遞當(dāng)前商品id

前端代碼

<a href="./detail.html?id=${item.Id}">商品</a>

詳情頁: detail.html

詳情頁功能一: 初始化獲取商品id, 請求后端接口湾笛,獲取商品信息并渲染

前端代碼

// 獲取Id
function getId(){
    let search = location.search; // "?id=100"
    let result = search.match(/^\?id=(\d+)$/)
    let id = result[1];
    return id
}
//渲染數(shù)據(jù)
function render(res){
    if (res.data.code === 0) {
        let item = res.data.list[0]
        let html = ''
        html += `
        <li>
            <a href="./detail.html?id=${item.Id}">
                <div class="pro_img"><img src="https:${item.imgUrl}" width="150" height="150"></div>
                <h3 class="pro_name"><a href="#"> ${item.title} </a></h3>
                <p class="pro_price">${item.hot}元</p>
                <div class="add_btn" data-id="${item.Id}">加入購物車</div>
            </a>
        </li>
        `
        $("#box ul").append(html)
    }
}
//獲取指定id對應(yīng)的商品信息
function getProduct() {
    let id = getId()
    axios.get(`/product/${id}`)
        .then((res) => {
            render(res)
        })
}
getProduct()

后端代碼

router.get("/product/:id", (req, res) => {
    let { id } = req.params;
    let sql = `select * from midata where id = ?`
    conn.query(sql, [id], function (err, result) {
        if (err) {
            console.log('查詢數(shù)據(jù)庫失敗');
        } else {
            let data;
            if (result.length) {
                data = {
                    code: 0,
                    list: result
                }
            } else {
                data = {
                    code: 1,
                    msg: '沒有結(jié)果 '
                }
            }
            res.send(data)
        }
    })
})
詳情頁功能二: 加入購物車功能,邏輯參考列表頁功能

購物車 shopCart.html

購物車功能一: 初始化請求后臺接口闰歪,并傳遞當(dāng)前用戶id, 請求該用戶的所有購物信息并展示

前端代碼

// 查看用戶是否登錄
function checkIsLogin(userId) {
    if (!userId) return;
    //登錄過
    $("h1").addClass("hide")
    $(".car").removeClass("hide")
}
//渲染數(shù)據(jù)
function render(res) {
    if (res.data.code == 0) {
        let html = ""
        res.data.list.forEach((item) => {
            html += `
        <div class="row hid">
        <div class="check left"> <input type="checkbox" class="select"></div>
        <div class="img left"><img src="img/03-car-02.png" width="80" height="80"></div>
        <div class="name left"><span> ${item.title} </span></div>
        <div class="price left"><span>${item.price}元</span></div>
        <div class="item_count_i">
            <div class="num_count">
                <div class="count_d" data-id="${item.cartId}">-</div>
                <div class="c_num">${item.num}</div>
                <div class="count_i" data-id="${item.cartId}">+</div>
            </div>
        </div>
        <div class="subtotal left"><span>${item.price * item.num}元</span></div>
        <div class="ctrl left"><a href="javascript:;" data-id="${item.cartId}">×</a></div>
    </div>
        `
        })
        $(".list").html(html)
    }
}
// 請求購物車列表數(shù)據(jù)
function loadData() {
    let userId = $.cookie("user")
    checkIsLogin(userId)
    // 請求數(shù)據(jù)
    axios.get("/cart", {
        params: {
            userId
        }
    })
        .then((res) => {
            render(res)
        })

}

后端代碼

//查詢購物車信息
router.get("/cart", (req, res) => {
    let { userId } = req.query;
    let sql = `select * from cart,midata where cart.userId = ? and cart.proId = midata.Id order by cart.cartId desc`
    conn.query(sql, [userId], function (err, result) {
        if (err) {
            console.log('查詢數(shù)據(jù)庫失敗');
        } else {
            let data;
            if (result.length) {
                data = {
                    code: 0,
                    list: result
                }
            } else {
                data = {
                    code: 1,
                    msg: '沒有結(jié)果 '
                }
            }
            res.send(data)
        }
    })
})

購物車功能二: 復(fù)選框全選的單擊事件: 選中時嚎研,所有商品也要選中,取消選擇時库倘,所有商品也取消選擇. 同時計算總價

計算總價

let total = 0;  //總價
//計算總價
function getTotal() {
    total = 0;
    [...$(".list .select")].forEach((item) => {
        if ($(item).prop("checked")) {
            let subTotal = parseFloat($(item).parent().parent().find(".subtotal span").text())
            total += subTotal
        }
    })
    $("#sum_area #price_num").text(total)
}

前端代碼

// 全選功能
function checkAll() {
    $(".check-all").on("click", function () {
        let selected = $(this).prop("checked")
        $(".list .select").prop("checked", selected)
        getTotal()
    })
}
購物車功能三. 每個商品復(fù)選框的單擊事件: 單擊時临扮,要遍歷所有商品的選中狀態(tài)论矾,都被選中,則選中“全選”復(fù)選框杆勇,都取消選中拇囊,則取消“全選”復(fù)選框。 同時計算總價

前端代碼

//切換某一個商品的選擇狀態(tài)
function toggleOne() {
    $(".list").on("click", ".select", function () {
        let selected = $(this).prop("checked")
        if (selected) {
            let flag = [...$(".list .select")].every((item) => {
                return $(item).prop("checked")
            })
            if (flag) {
                $(".check-all").prop("checked", true)
            }
        } else {
            $(".check-all").prop("checked", false)
        }
        getTotal()
    })
}
購物車功能四. 加減數(shù)量: 獲取原有數(shù)量靶橱,加或減后寥袭,調(diào)用后端接口,傳遞數(shù)量关霸,CartId, 后端則把對應(yīng)購物車信息的數(shù)量進(jìn)行更新传黄。 前端接收到更新成功后,計算小計價格队寇,并同時計算總價

前端代碼

//改變數(shù)量
function changeNum(el, type) {
    $(".list").on("click", el, function () {
        let num = $(this).siblings(".c_num").text()
        type === 'add' ? num++ : num--
        //后端接口
        let data = {
            cartId: $(this).data("id"),
            num
        }
        axios.put("/cart", data)
            .then((res) => {
                //前端 
                $(this).parent().parent().siblings(".check").children(".select").prop("checked", true);
                let price = parseFloat($(this).parent().parent().siblings(".price").children("span").text())
                $(this).siblings(".c_num").text(num)
                let subTotal = num * price
                $(this).parent().parent().siblings(".subtotal").children("span").text(subTotal)
                getTotal()
            })
    })
}

后端代碼

//修改商品數(shù)量
router.put("/cart", (req, res) => {
    //接收參數(shù)
    let { cartId, num } = req.body;
    let sql = "update cart set num = ? where cartId = ?"
    conn.query(sql, [num, cartId], function (err, result) {
        if (err) {
            console.log('數(shù)據(jù)庫訪問失敗');
        } else {
            if (result.affectedRows === 1) {
                res.send({
                    code: 0,
                    msg: '添加購物車成功膘掰,數(shù)量更改'
                })
            }
        }
    })
})
購物車功能五: 刪除: 調(diào)用后端接口,傳遞CartId, 在后端刪除指定CartId的信息佳遣,前端接收到成功刪除后识埋,再次到后端請求當(dāng)前用戶所有購物車信息并渲染

前端代碼

// 刪除購物車信息
function delCart() {
    $(".list").on("click", ".ctrl a", function () {
        let cartId = $(this).data("id")
        axios.delete(`/cart/${cartId}`)
            .then((res) => {
                loadData()
            })
    })
}

后端代碼

//刪除購物車信息
router.delete("/cart/:cartId", (req, res) => {
    let { cartId } = req.params;
    let sql = `delete from cart where cartId = ?`
    conn.query(sql, [cartId], function (err, result) {
        if (err) {
            console.log('查詢數(shù)據(jù)庫失敗');
        } else {
            let data;
            if (result.affectedRows === 1) {
                data = {
                    code: 0,
                    msg: '刪除成功'
                }
            }
            res.send(data)
        }
    })
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市零渐,隨后出現(xiàn)的幾起案子窒舟,更是在濱河造成了極大的恐慌,老刑警劉巖诵盼,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠豺,死亡現(xiàn)場離奇詭異,居然都是意外死亡风宁,警方通過查閱死者的電腦和手機洁墙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒财,“玉大人热监,你說我怎么就攤上這事∫” “怎么了孝扛?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骂际。 經(jīng)常有香客問我疗琉,道長,這世上最難降的妖魔是什么歉铝? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮凑耻,結(jié)果婚禮上太示,老公的妹妹穿的比我還像新娘柠贤。我一直安慰自己,他們只是感情好类缤,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布臼勉。 她就那樣靜靜地躺著,像睡著了一般餐弱。 火紅的嫁衣襯著肌膚如雪宴霸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天膏蚓,我揣著相機與錄音瓢谢,去河邊找鬼。 笑死驮瞧,一個胖子當(dāng)著我的面吹牛氓扛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播论笔,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼采郎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狂魔?” 一聲冷哼從身側(cè)響起蒜埋,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎最楷,沒想到半個月后理茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡管嬉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年皂林,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚯撩。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡础倍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胎挎,到底是詐尸還是另有隱情沟启,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布犹菇,位于F島的核電站德迹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揭芍。R本人自食惡果不足惜胳搞,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肌毅,春花似錦筷转、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笨奠,卻和暖如春袭蝗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背般婆。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工到腥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腺兴。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓左电,卻偏偏與公主長得像,于是被迫代替她去往敵國和親页响。 傳聞我的和親對象是個殘疾皇子篓足,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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