购物车,实现增删改查;无bug,还有一个直接修改购物车数量功能未实现

◇◆丶佛笑我妖孽 提交于 2019-12-01 05:02:20
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>购物车</title>
    <link rel="stylesheet" href="assets/css/cssreset.css">
    <link rel="stylesheet" href="css/login.css">
    <link rel="stylesheet" href="assets/css/cosmetics.css">
    <link rel="stylesheet" href="assets/font-awesome-4.5.0/css/font-awesome.css">
    <link rel="stylesheet" href="assets/css/bootstrap.css">
    <style>
        .content{
            width: 1903px;
            height: auto;
            background: url("assets/img/bg.jpg");

        }
        .content{
            background: url("assets/img/bg.jpg");
            background-size: cover;
            width: 100%;
            height: auto;
        }
        .content .title{
            width: 1200px;
            height: 70px;
            margin: 0 auto;
        }
        .content .title ul{
            width: 700px;
            height: 100%;
            display: flex;
            margin-left: 60px;
        }
        .content .title ul li{
            flex: 1;
            text-align: center;
            line-height: 70px;
            font-size: 20px;
            font-weight: normal;
            cursor: pointer;
        }
        .content .title ul li a{
            color: #999999;

        }
        .content .title ul li a:hover{
            color: red;
            text-decoration: none;
        }
        .content .title ul li:nth-child(1){
            border-bottom:2px solid black;
        }
        .content .title ul li:nth-child(1) a{
            color: black;
            font-weight: bold;
        }
        .content .main{
            width: 1200px;
            margin: 0 auto;
            display: flex;
            justify-content: space-around;
        }
        .content  .main .right{
            width: 300px;
            height: 800px;
        }
        .content  .main .right .concat{
            width: 100%;
            height: 420px;
            background-color: white;
            box-shadow:0 0 12px #ccc ;
        }
        .content  .main .right .concat h2{
            font-size: 16px;
            line-height: 40px;
            font-weight: normal;
            text-indent: 1em;
            padding-top: 20px;
        }
        .content  .main .right .concat p{
            text-indent: 1em;
            font-size: 14px;
            line-height: 40px;
            color: #999999;
        }
        .content  .main .right .concat .dapartment:nth-child(3){
            margin-top: 20px;
        }
        .content  .main .right .concat .dapartment>span{
            display: inline-block;
            margin-left: 40px;
            line-height: 20px;
        }
        .content  .main .right .concat .email{
            margin-top: 30px;
            display: inline-block;
        }
        .content  .main .right .special{
            margin-top: 20px;
            height: 230px;
            display: flex;
            flex-direction: column;
            justify-content: center;
            width: 100%;
            background-color: white;
            box-shadow:0 0 12px #ccc ;
        }
        .content  .main .right .special h1{
            font-size: 16px;
            font-weight: normal;
            margin-left: 16px;
            width: 268px;
            line-height: 40px;
            border-bottom: 1px solid #ccc;
        }
        .content  .main .right .special  p{
            margin-left: 16px;
        }
        .content .left{
            width: 800px;
            box-shadow:0 0 12px #ccc ;
        }

        .shopping-car-container {
            padding: 50px 40px;
            width: 800px;
        }

        .shopping-car-container .car-headers-menu {
            border-bottom: 1px solid #f5f5f5;
            padding: 0 15px;
        }

        .shopping-car-container .panel-body {
            padding: 15px 0;
        }

        #checkAll {
            display: inline-block;
            width: 30px;
            position: absolute;
            top: 0;
            left: 20px;
        }


        .shopping-car-container .car-menu label{
            width: 60px;
            height: 30px;
            display: block;
            position: relative;
        }
        /*
         商品区
         * */

        .shopping-car-container .goods-content {
            margin-top: 15px;
        }
        .shopping-car-container .goods-content h1{
            text-align: center;
            margin-top: 80px;
        }

        .shopping-car-container .goods-content  a{
            text-align: center;
            display: block;
            width: 100%;
            margin: 40px;
        }
        .shopping-car-container .goods-content .goods-item {
            margin-top: 0;
        }

        .shopping-car-container .goods-content .goods-item .car-goods-info {
            height: 150px;
            display: flex;
            align-items: center;
            justify-content: center;
            overflow: hidden;

        }

        .shopping-car-container .goods-content .goods-item .goods-image-column img,
        .shopping-car-container .goods-content .goods-item .goods-image-column span {
            display: block;
            float: left;
        }

        .shopping-car-container .goods-content .goods-item .goods-image-column span {
            width: calc(100% - 100px);
            box-sizing: border-box;
            text-indent: 2rem;
            line-height: 25px;
            padding: 10px;
        }
        .goods-item{
            margin-top: 0px;
            border: none;
        }
        .goods-item .panel-body{
            border: none;


        }
        .goods-operate{
            width: 54px;
        }
        .goods-price {
            color: red;
            font-weight: bolder;
            align-items: center;

        }

        .form-control {
            text-align: center;
        }
        .goods-counts{
            width: 120px;
        }
        .goods-counts .btn{
            border-radius: 50%;
            outline: none;
        }
        .single-total {
            color: red;
            font-weight: bold;
        }

        .goods-params {

            display: flex;
            flex-direction: column;
        }
        .goods-params p:nth-child(1){
            color: black;
            font-size: 12px;
            font-weight: bold;
        }
        .goods-params p:nth-child(2){
            font-size: 12px;
            color: darkgray;
        }
        .bottom-menu {
            display: flex;
            align-items: center;
            justify-content: center;
            position: relative;
            margin-left: -20px;
        }

        .bottom-menu span {
            vertical-align: text-bottom;
            position: absolute;
            left: 40px;
            top: 0;
            display: block;
            width: 200px;
        }

        #deleteMulty {
            color: cornflowerblue;
            cursor: pointer;
            vertical-align: text-bottom;
        }

        .bottom-menu-include {
            background: #e5e5e5;
        }

        #selectGoodsCount {
            color: orangered;
            font-size: 16px;
            font-weight: bolder;
            width: 20px;
            display: block;
            left: 60px;
        }

        #selectGoodsMoney {
            color: orangered;
            font-size: 16px;
            font-weight: bolder;
        }

        .panel-default .submitData {
            background: orangered;
            color: white;
            cursor: pointer;
            font-weight: bolder;
            height: 58px;
            position: absolute;
            width: 90px;
            font-size: 14px;
            right: 0;
            top: 0;
        }

        .panel-default .submitDis {
            background: #B0B0B0;
            cursor: no-drop;
        }

        .shopping-car-container .panel-default {
            position: relative;
        }
        .content  .main .left .footer{
            width: 100%;
            height: 200px;
            background-color:#F6F6F6;

        }
        .content  .main .left .footer .three{
            width: 720px;
            height: 100%;
            margin: 0 auto;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .content  .main .left .footer .three .safe{
            width: 184px;
            height: 184px;
        }
        .content  .main .left .footer .three  h2{
            font-size: 18px;
            font-weight: normal;
            line-height: 35px;
        }
        .content  .main .left .footer .three  p{
            font-size: 14px;
            color: #767676;
            line-height: 20px;
        }
        .content  .main .left .footer .three .paystyle{
            width: 184px;
            height: 184px;
        }
        .content  .main .left .footer .three .paystyle img{
            margin-left: 20px;
            margin-top: 20px;
        }
        .content  .main .left .footer .three .return{
            width: 184px;
            height: 184px;
        }
    </style>
</head>
<body>
<div class="cartTop"></div>
<div class="content serve">
    <div class="title">
        <ul>
            <li><a href="">购物袋</a></li>
            <li><a href="">订单提交</a></li>
            <li><a href="">支付</a></li>
        </ul>
    </div>
    <div class="main">
        <div class="left">
            <div class="shopping-car-container">
                <div class="goods-content">
                    <h1>很遗憾,你还未选购商品</h1>
                    <a href="http://localhost:8080/cosmetics.html">点此选购商品</a>
                </div>
                <div class="panel panel-default">
                    <div class="panel-body bottom-menu-include">
                        <div class="col-md-1 check-all-bottom bottom-menu">
                            <label>
                                <input type="checkbox" id="checked-all-bottom" />
                                <span id="checkAllBottom">全选</span>
                            </label>
                        </div>

                        <div class="col-md-6 bottom-menu">

                        </div>
                        <div class="col-md-2 bottom-menu">
                            <span>已选商品 <span id="selectGoodsCount">0</span>&nbsp; &nbsp;&nbsp;件</span>
                        </div>
                        <div class="col-md-1 bottom-menu">
                            <span>合计:<span id="selectGoodsMoney">0.00</span></span>
                        </div>
                        <div class="submitData">
                            提交订单
                        </div>
                    </div>
                </div>
                <div class="modal fade" tabindex="-1" role="dialog" id="deleteItemTip" aria-labelledby="gridSystemModalLabel">
                    <div class="modal-dialog" role="document">
                        <div class="modal-content">
                            <div class="modal-header">
                                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                                <h4 class="modal-title" id="gridSystemModalLabel">提示</h4>
                            </div>
                            <div class="modal-body">
                                确认删除此商品?
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                                <button type="button" class="btn btn-primary deleteSure">确定</button>
                            </div>
                        </div>
                    </div>
                </div>

            </div>
            <div class="footer">
                <div class="three">


                    <div class="safe">
                        <h2>信息安全保障</h2>
                        <p>您的数据包括订单信息都将通过加密的方式传输。</p>
                    </div>
                    <div class="paystyle">
                        <h2>支付方式</h2>
                        <p>我们支持支付宝,网银支付以及微信支付</p>
                        <img src="assets/img/wechat.jpg" alt="">
                        <img src="assets/img/alipay.jpg" alt="">
                    </div>
                    <div class="return">
                        <h2>信息安全保障</h2>
                        <p>您可以享受7天内无理由退货。如需帮助,请拨打客服热线
                            <br>
                            迪奥时装:400-122-6622
                            <br>
                            迪奥美妆:400-921-8833
                        </p>
                    </div>
                </div>
            </div>
        </div>
        <div class="right">
            <div class="concat">
                <h2>您可以通过以下方式联系到我们
                </h2>
                <div class="dapartment">
                    <p><i class="fa fa-weixin"></i> <span>迪奥时装</span>
                    </p>
                    <span>
                    客户服务热线:400 122 66 22</span>
                    <br>
                    <span>
                        (周一至周日 10:00 - 22:00)
                    </span>
                    <br>
                    <span class="email">
                    电子邮件:
                    </span>
                    <br>
                    <span>
                        <a href="">
                        contactdiorasia@dior.com
                    </a>
                    </span>
                </div>
                <div class="dapartment">
                    <p><i class="fa fa-weixin"></i> <span>迪奥美妆</span>
                    </p>
                    <span>
                    客户服务热线:400 921 88 33</span>
                    <br>
                    <span>
                       (周一至周日 9:00 - 21:00)

                    </span>
                    <br>
                    <span class="email">
                    电子邮件:
                    </span>
                    <br>
                    <span>
                        <a href="">ecservice_china@diormail.com

                    </a>
                    </span>
                </div>
            </div>
            <div class="special">
                <h1>Dior迪奥官网购物的特殊礼遇 </h1>
                <p><b>免配送费</b></p>
                <p><b>Dior迪奥美妆订单配以试用装礼赠</b></p>
                <p><b>Dior迪奥艺术包装</b></p>
            </div>

        </div>
    </div>
</div>

</div>
<div class="cartFooter"></div>
</body>
<script src="assets/js/jquery.js"></script>
<script src="assets/js/ajax.js"></script>
<script src="assets/js/jquery.cookie.js"></script>
<script src="assets/js/cookie.js"></script>
<script src="assets/js/jquery-menu.js"></script>
<script src="js/login.js"></script>
<script>
    $(".cartTop").load("http://localhost:8080/public.html .log-h",function () {
        $(".top").find("button").on("click",function () {
            $(".top").css("display","none")
        })
        $(".cartTop").find(".login").on("click",function () {
            if($.cookie("onoff")){
                window.location.href="http://localhost:8080/personcenter.html"
            }
            else{
                alert("您还未登录,请先登录")
                window.location.href='http://localhost:8080/login.html'
            }

        });
        $(".cartTop").find(".fa-shopping-bag").on("click",function () {
            if($.cookie("onoff")){
                window.location.href="http://localhost:8080/car.html"
            }
            else{
                alert("您还未登录,请先登录")
                window.location.href='http://localhost:8080/login.html'
            }

        });
    })
    $(".cartFooter").load("http://localhost:8080/public.html .log-f",function () {
        $(".footer").pull({ //课下再看看
            li:$(".list").find("li"),
            menu:$(".footer").find(".menu"),
            list:$(".footer").find(".list"),
            h2:$(".footer").find("h2"),
        })//下拉地点搜索菜单
    });
</script>
<script>

    class Cart{
        constructor(){
            this.content=document.querySelector(".goods-content")
            this.all=document.querySelector("#checked-all-bottom")
            this.url="http://localhost:8080/assets/data/cosmetics.json";
            this.load();
            this.addEvent()
        }
        addEvent(){
            var that=this;
            $(".submitData").on("click",function () {
                {
                    that.agoods=[];
                    var abox=document.querySelectorAll(".goods-list-item")
                    console.log(abox.length)
                    for(var i=0;i<abox.length;i++){
                        if(abox[i].checked){
                            that.agoods.push({
                                id:abox[i].getAttribute('index'),
                                num:abox[i].getAttribute('num')
                            });
                            console.log(that.agoods)
                        }
                    }
                    that.setCookie()
                    if(that.agoods.length>0){
                        window.location.href="http://localhost:8080/indent.html"
                    }
                }
            })
            this.content.addEventListener("click",function (eve) {
                var e=eve||window.event;
                var target=e.target||e.srcElement;
                if(target.className=="btn btn-danger item-delete"){
                    that.id = target.getAttribute("index");//要把id也改变了
                    target.parentNode.parentNode.parentNode.remove();
                    var subnum=0;
                    var abox=document.querySelectorAll(".goods-list-item");
                    for(var i=0;i<abox.length;i++){ //关键思想:难点!!!!!!!!!!!!!!!
                        if(abox[i].checked){
                            subnum++;
                        }

                    }
                    
                 
                    if(subnum==abox.length){
                        that.all.checked=true;
                    }else{
                        that.all.checked=false;
                    }
                    if(target.parentNode.parentNode.firstElementChild.firstElementChild.firstElementChild.checked){
                        $("#selectGoodsMoney").text(parseFloat( $("#selectGoodsMoney").text())-parseFloat(target.parentNode.parentNode.lastElementChild.previousElementSibling.lastElementChild.innerHTML));
                        $("#selectGoodsCount").text(parseInt($("#selectGoodsCount").text())-parseInt(target.parentNode.parentNode.lastElementChild.previousElementSibling.previousElementSibling.firstElementChild.firstElementChild.nextElementSibling.value))
                    }
                    that.removeCookie();
                }
                if(target.className=="btn btn-default car-add"){
                    that.id = target.getAttribute("index");
                    console.log(that.id)
                    target.parentNode.previousElementSibling.value=parseInt(target.parentNode.previousElementSibling.value)+1
                    console.log( target.parentNode)
                    if(target.parentNode.parentNode.parentNode.parentNode.firstChild.nextSibling.firstChild.nextSibling.firstChild.checked){
                        $("#selectGoodsMoney").text(parseFloat( $("#selectGoodsMoney").text())+parseFloat(parseFloat($(target).attr("price"))));
                        $("#selectGoodsCount").text(parseInt($("#selectGoodsCount").text())+1)
                    }
                    var p=parseFloat($(target).attr("price"))
                    var n=parseFloat(target.parentNode.previousElementSibling.value)
                    target.parentNode.parentNode.parentNode.nextSibling.nextSibling.lastChild.innerHTML=p*n;//单个总价
                    that.count=parseFloat(target.parentNode.previousElementSibling.value)//单个商品num
                    that.updateCookie()
                }
                if(target.className=="btn btn-default car-decrease"){
                    that.id = target.getAttribute("index");
                    console.log(that.id)
                    target.parentNode.nextSibling.nextSibling.value=parseInt( target.parentNode.nextSibling.nextSibling.value)-1;
                    if(target.parentNode.nextSibling.nextSibling.value>=1){
                        if(target.parentNode.parentNode.parentNode.parentNode.firstChild.nextSibling.firstChild.nextSibling.firstChild.checked){
                            $("#selectGoodsMoney").text(parseFloat( $("#selectGoodsMoney").text())-parseFloat(parseFloat($(target).attr("price"))));
                            $("#selectGoodsCount").text(parseInt($("#selectGoodsCount").text())-1)


                        }

                    }
                    if(target.parentNode.nextSibling.nextSibling.value<=1){
                        target.parentNode.nextSibling.nextSibling.value=1;

                    }

                    var p=parseFloat($(target).attr("price"))
                    var n= target.parentNode.nextSibling.nextSibling.value

                    target.parentNode.parentNode.parentNode.nextSibling.nextSibling.lastChild.innerHTML=p*n;
                    that.count=parseFloat(target.parentNode.nextSibling.nextSibling.value)
                    that.updateCookie()
                }
                if(target.id="#checked"){
                    var abox = document.querySelectorAll(".goods-list-item");
                    var subnum=0;

                    if(target.checked){
                        $("#selectGoodsMoney").text(parseFloat( $("#selectGoodsMoney").text())+parseFloat(target.parentNode.parentNode.parentNode.lastChild.previousSibling.previousSibling.previousSibling.lastChild.innerHTML));

                        $("#selectGoodsCount").text(parseFloat($("#selectGoodsCount").text())+parseFloat(target.parentNode.parentNode.parentNode.lastChild.previousSibling.previousSibling.previousSibling.previousElementSibling.children[0].children[1].value))
                    }
                    else{
                        $("#selectGoodsMoney").text(parseFloat( $("#selectGoodsMoney").text())-parseFloat(target.parentNode.parentNode.parentNode.lastChild.previousSibling.previousSibling.previousSibling.lastChild.innerHTML));

                        $("#selectGoodsCount").text(parseFloat($("#selectGoodsCount").text())-parseFloat(target.parentNode.parentNode.parentNode.lastChild.previousSibling.previousSibling.previousSibling.previousElementSibling.children[0].children[1].value))
                    }
                    for(var i=0;i<abox.length;i++){
                        if(abox[i].checked){
                            subnum++;
                        }
                    }
                    if(subnum==abox.length){
                        that.all.checked=true;
                    }else{
                        that.all.checked=false;
                    }
                }

            });
            this.all.addEventListener("click",function () {
                if(that.all.checked==true){
                    that.display();
                    $("#selectGoodsMoney").text(that.rmb);
                    $("#selectGoodsCount").text(that.num);
                    var abox = document.querySelectorAll(".goods-list-item");
                    for (var i = 0; i < abox.length; i++) {
                        abox[i].checked = true;
                    }
                }
                else{
                    $("#selectGoodsMoney").text(0);
                    $("#selectGoodsCount").text(0);
                    var abox = document.querySelectorAll(".goods-list-item");
                    for (var i = 0; i < abox.length; i++) {
                        abox[i].checked = false;
                    }
                }
            })
        }

        setCookie(){
            setCookie("indent",JSON.stringify(this.agoods))
            setCookie("countmoney",$("#selectGoodsMoney").text())

        }
        updateCookie(){
            var i = 0;
            // 遍历数组,找到符合条件的数据
            var onoff = this.cosmetics.some((val,index)=>{//这里的val是cookie中的json的每一个对象。
                i = index;
                return val.id == this.id;//val.id是cookie中的id
            });
            if(onoff){
                // 找到符合的数据之后,更新数组中的数据
                this.cosmetics[i].num = this.count;//这里的this.val是输入框总的值
            }
            // 将数组再设置回cookie
            setCookie("cosmetics",JSON.stringify(this.cosmetics))
        } //更新
        removeCookie(){
            var i=0;
            var onoff=this.cosmetics.some((val,index)=>{ //val是数组对象中中,每一个对象。
                i=index;//每次将传达的索引存出来。就是所点击的那个id在cookie数组中拍的那个位置。
                return val.id==this.id;//返回val的id是否等当前点击的id;如果相等返回true,同时index停止往前走。
            })
            if(onoff){ //找到相同的了。
                this.cosmetics.splice(i,1)
            }
            setCookie("cosmetics",JSON.stringify(this.cosmetics))
            //更改了原来的cookie;
        }  //删除
        load(){
            ajax({
                url:this.url,
                success:res=>{
                    this.res = JSON.parse(res);
                    console.log(this.res);
                    this.getCookie();
                }
            })
        }    //请求ajax
        getCookie(){
            this.cosmetics=getCookie("cosmetics")?JSON.parse(getCookie("cosmetics")):[];
            this.display();
        } //得到cookie
        display(){
            var goodsHtml = ""
            this.rmb=0;
            this.num=0;
            for(var i=0;i<this.res.length;i++){
                for(var j=0;j<this.cosmetics.length;j++){
                    if(this.res[i].id==this.cosmetics[j].id){
                        this.rmb+=this.res[i].singleGoodsMoney* this.cosmetics[j].num;
                        this.num+=(this.cosmetics[j].num*1)

                        goodsHtml += `<div class="goods-item" index="${this.cosmetics[j].id}">
                <div class="panel panel-default">
                <div class="panel-body">
                <div class="col-md-1 car-goods-info">
                <label><input type="checkbox" class="goods-list-item" title=${this.res[i].tip1} img="${this.res[i].url}" num="${this.cosmetics[j].num}" index="${this.res[i].id}" ap="${this.num * this.res[i].price}"  id="checked" /></label>
               </div>
                <div class="col-md-3 car-goods-info goods-image-column">
                <img class="goods-image" src="${this.res[i].url}" style="width: 100px; height: 100px;" />
               </div>
               <div class="col-md-3 car-goods-info goods-params">${this.res[i].tip2}</div>
               <div class="col-md-1 car-goods-info goods-price"><span>¥</span><span class="single-price">${this.res[i].price}</span></div>
               <div class="col-md-1 car-goods-info goods-counts">
                <div class="input-group">
                <div class="input-group-btn">
                <button type="button" class="btn btn-default car-decrease" price="${this.res[i].price}" index="${this.res[i].id}">-</button>
                </div>

                <input type="text" style="width: 50px" class="form-control goods-count" value=${this.cosmetics[j].num}>
               <div class="input-group-btn">
               <button type="button" class="btn btn-default car-add" index="${this.res[i].id}"  price="${this.res[i].price}">+</button>
                </div>
                </div>
                </div>
                <div class="col-md-1 car-goods-info goods-money-count"><span>¥</span><span class="single-total">${this.res[i].singleGoodsMoney* this.cosmetics[j].num}  </span></div>
                <div class="col-md-2 car-goods-info goods-operate">
                <button type="button" class="btn btn-danger item-delete" index="${this.res[i].id}">删除</button>
                </div>
                </div>
                </div>
                </div>`
                    }
                }
            }
            if(!goodsHtml){
                console.log("你好呢" )
            }
            else{
                $(".goods-content")[0].innerHTML= goodsHtml  ;

            }
        }  //渲染页面
    }
    new Cart()


</script>//直接修改购物车物品数量思想:修改了数量存入cookie,如果单选框被勾上了,那么修改总价和总数。总价是加上(物品数量修改后的价格减去修改前的价格。)总数是加上(物品数量修改后的减去修改前的);实现太麻烦了吧。。。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!