电商---实现购物车功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电商---实现购物车功能相关的知识,希望对你有一定的参考价值。

购物车实现3种方式

1、利用cookie

优点:不占用服务器资源,可以永远保存,不用考虑失效的问题
缺点: 对购买商品的数量是有限制的,存放数据的大小 不可以超过2k,用户如果禁用cookie那么就木有办法购买商品,卓越网实现了用户当用户禁用cookie,也可以购买。

2、利用 session

优点:用户禁用cookie,也可以购物
缺点:占用服务器资源,要考虑session失效的问题

3、利用数据库

优点:可以记录用户的购买行为,便于数据分析用户的喜好,推荐商品
缺点:给数据库造成太大的压力,如果数据量很大的话。

购物车需求分析

1、可以添加商品到购物车中

2、可以删除购物车中的商品

3、可以清空购物车

4、可以更新购物车的商品

5、可以结算

  • js代码
    /**
     * Created by Administrator on 2017/9/3.
     */
    
    
    /***
     * 购物车操作模块
     *
     */
    
    //商品类
    /***
     * @name item
     * @example
       item(sku, name, price, quantity)
     * @params {string} sku 商品的标示
     * @params {string} name 商品的名字
     * @param {number} price 商品的价格
     * @param {number} quantity 商品的数量
     */
    function item(sku, name, price, quantity){
        this.sku = sku;
        this.name = name;
        this.price = price;
        this.quantity = quantity;
    }
    
    var shopCart = function(window){
    
        "use strict";
        //全局变量
        // note new new Date("2020-12-23") 在ie下面报错,不支持这样的语法
        var items = [],cartName=kuaidian_shop_cart,expires = new Date( new Date().getTime()+86400000*30 )
        ,debug = true,decimal = 2;
        var options = {
            cartName : cartName, //cookie的名字
            expires : expires, //cookie失效的时间
            debug : debug,  //是否打印调试信息
            decimal : decimal, //钱的精确到小数点后的位数
            callback : undefined
        };
    
    
        //暴露给外部的接口方法
        return {
            inited : false,
            init: function(option){
                //判断用户是否禁用cookie
                if(!window.navigator.cookieEnabled ){
                    alert(您的浏览器不支持cookie无法使用购物车!,请设置允许设置cookie。);
                    return false;
                }
                //从cookie中获取购物车中的数据
                this.inited = true;
                if(option){
                    extend(options,option);
                }
                var cookie = getCookie(options.cartName);
                if(typeof cookie === undefined){
                    setCookie(options.cartName,‘‘,options.expires);
                }else{
                    //每个item之间用&分开,item的属性之间用|分割
                    var cookie = getCookie(options.cartName);
                    if(cookie){
                        var cItems = cookie.split(&);
                        for(var i=0,l=cItems.length;i<l;i++){
                            var cItem = cItems[i].split(|);
                                var item = {};
                                item.sku = cItem[0] || ‘‘;
                                item.name = cItem[1] || ‘‘;
                                item.price = cItem[2] || ‘‘;
                                item.quantity = cItem[3] || ‘‘;
                                items.push(item);
                        };
                    };
    
                };
            },
            findItem: function(sku){//根据sku标示查找商品
                //如果木有提供sku,则返回所有的item
                if(sku){
                    for(var i=0,l=items.length;i<l;i++){
                        var item = items[i];
                        if(item.sku === sku){
                            return item;
                        }
                    }
                    return undefined;
                }else{
                    return items;
                }
    
            },
            getItemIndex : function(sku){ //获取item在items的数组下标
                for(var i=0,l=items.length;i<l;i++){
                    var item = items[i];
                    if(item.sku == sku){
                        return i;
                    }
                }
                //木有找到返回-1
                return -1;
            },
            addItem: function(item){ //增加一个新商品到购物车
                //添加一个商品
                if(this.findItem(item.sku)){
                    if(options.debug){
                        _log(商品已经存在了);
                        return false;
                    }
                }
                items.push(item);
                _saveCookie();
                return true;
            },
            delItem: function(sku){ //从购物车中删除一个商品
                //删除一个商品
                var index = this.getItemIndex(sku);
                if(index > -1){
                    items.splice(index,1);
                    _saveCookie();
                }else{
                    if(options.debug){
                        _log(商品不存在);
                        return false;
                    }
                }
            },
            updateQuantity: function(item){ //更新商品的数量
                //更新一个商品
                var index = this.getItemIndex(item.sku);
                if(index > -1){
                    items[index].quantity = item.quantity;
                    _saveCookie();
                }else{
                    if(options.debug){
                        _log(商品不存在);
                        return false;
                    }
                }
            },
            emptyCart: function(){
                //清空数组
                items.length = 0;
                _saveCookie();
            },
            checkout: function(){
                //点击结算后的回调函数
                if(options.callback){
                    options.callback();
                }
            },
            getTotalCount: function(sku){
                //获取购物车商品的数量,如果传某个商品的id,那么就返回该商品的数量
                var totalCount = 0;
                if(sku){
                    totalCount = (typeof this.findItem(sku) === undefined ? 0 : this.findItem(sku).quantity );
                }else{
                    for(var i=0,l=items.length;i<l;i++){
                        totalCount += (parseInt(items[i].quantity) === NaN ? 0 : parseInt(items[i].quantity )) ;
                    }
                }
                return totalCount;
            },
            getTotalPrice : function(sku){
                //获取购物车商品的总价格 ,如果传某个商品的id,那么就返回该商品的总价格
                var totalPrice = 0.0;
                if(sku){
                    var num = parseInt((typeof this.findItem(sku) === undefined ? 0 : this.findItem(sku).quantity )),
                    price = parseFloat((typeof this.findItem(sku) === undefined ? 0 : this.findItem(sku).price ));
                    num = num=== NaN ? 0 : num;
                    price = price === NaN ? 0 : price;
                    totalPrice = price * num;
                }else{
                    for(var i=0,l=items.length;i<l;i++){
                        totalPrice += (parseFloat(items[i].price ) * parseInt(items[i].quantity));
                    }
                }
                return totalPrice.toFixed(options.decimal);
            },
            getCookie : getCookie,
            setCookie : setCookie
        };
    
    
        /**
         * 设置cookie
         * @name setCookie
         * @example
           setCookie(name, value[, options])
         * @params {string} name 需要设置Cookie的键名
         * @params {string} value 需要设置Cookie的值
         * @params {string} [path] cookie路径
         * @params {Date} [expires] cookie过期时间
         */
        function setCookie(name, value, options) {
            options = options || {};
            var expires = options.expires || null;
            var path = options.path || "/";
            var domain = options.domain || document.domain;
            var secure = options.secure || null;
            /**
            document.cookie = name + "=" + escape(value)
            + ((expires) ? "; expires=" + expires.toGMTString() : "")
            + "; path=" + path
            + "; domain=" + domain ;
            + ((secure) ? "; secure" : "");
            */
            var str = name + "=" + encodeURIComponent(value)
            + ((expires) ? "; expires=" + expires.toGMTString() : "")
            + "; path=/";
            document.cookie = str;
        };
    
        /**
         * 获取cookie的值
         * @name getCookie
         * @example
           getCookie(name)
         * @param {string} name 需要获取Cookie的键名
         * @return {string|null} 获取的Cookie值,获取不到时返回null
         */
        function getCookie(name) {
            var arr = document.cookie.match(new RegExp("(^| )" + name
                    + "=([^;]*)(;|$)"));
            if (arr != null) {
                return decodeURIComponent(arr[2]);
            }
            return undefined;
        };
    
        //***********************私有方法********************/
        function _saveCookie(){
            var i=0,l=items.length;
            if(l>0){
                var tItems = [];
                for(;i<l;i++){
                    var item = items[i];
                    tItems[i] = item.sku + | +item.name + | + item.price + | + item.quantity;
                };
                var str = tItems.join(&);
                setCookie(options.cartName, str, {expires:options.expires});
            }else{
                setCookie(options.cartName, ‘‘, {expires:options.expires});
            }
    
        };
    
        //***********************工具方法********************/
        //显示调试信息
        function _log(info){
            if(typeof console != undefined){
                console.log(info);
            }
        };
        //继承属性
        function extend(destination, source) {
            for ( var property in source) {
                destination[property] = source[property];
            }
        };
    }(typeof window === undifined ? this: window);

     

  • html页面简单调用
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    </head>
    <body>
    
        <script type="text/javascript" src="./shop.js"></script>
    
        <script>
    
            shopCart.init({
                decimal : 4
               });
    
            var a = new item(aa,bb,12,22);
            shopCart.addItem(a); //添加商品到购物车,参数item
            shopCart.delItem(12345); //从购物车中删除商品,参数squ
    //        shopCart.emptyCart(); //清空购物车
            item.quantity = 4;
            alert(shopCart.getTotalPrice()); //获取购物车中的数量,参数squ
    
    
            shopCart.findItem();//根据sku标示查找商品,参数squ
                //如果木有提供sku,则返回所有的item
            shopCart.getItemIndex(aa) //获取item在items的数组下标,参数squ
            shopCart.updateQuantity(a) //更新商品的数量,参数item
            shopCart.getTotalCount()//获取购物车商品的数量,如果传某个商品的id,那么就返回该商品的数量,参数squ
        </script>
    
    </body>
    </html>

     

以上是关于电商---实现购物车功能的主要内容,如果未能解决你的问题,请参考以下文章

电商---实现购物车功能

关于电商网站购物车功能如何与登录账号相关联的一点想法

电商小程序实战教程-购物车开发

电商小程序实战教程-购物车开发

电商网站中添加商品到购物车功能模块2017.12.8

原生JavsScript实现简单购物车面向对象原生代码