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

购物车实现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>
时间: 2024-10-31 12:19:30

电商---实现购物车功能的相关文章

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

最近在试着做电商网站,自然也需要涉及到实现购物车的功能.然后就想到去用cookie来完成购物车的功能. 实现过程是新建一个cookie,把购物车实体类的list放进去,每次给购物车新增商品和删除商品的时候就new一个新的cookie,把key设置成一样的就可以覆盖掉之前的cookie内容了,这样就可以实现每次实现更改购物车内容之后,更新cookie的功能了. 但是完成之后遇到了一个问题,就是如何把这个存在本地客户端的cookie购物车和登录的账号关联起来呢?总不能每个登录用户都共享同一个购物车吧

8、生鲜电商平台-购物车模块的设计与架构

说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题,然后再进行下单与付款. 1. 购物车数据库设计: 说明:业务需求: 1>购物车里面应该存放,那个买家,买了那个菜品的什么规格,有多少数量,然后这个菜品的加工方式如何.(如果存在加工方式的话,就会在这里显示处理.) 2>买家存在购物起送价.也就是用户放入购物车的商品的总价格如果低于配置的起送价,那么这个提交按钮就是灰色的.(不可能你点一个洋葱我们就送过去,成本

用JS做一个简单的电商产品放大镜功能

使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. 实验:制作产品焦点放大图. 所需技能:1.基本的获取页面元素的方法: 2.几个简单的事件: 3.会使用dom设置元素的属性: 案例原理:1.焦点框的跟随鼠标事件: 2.焦点框的移动区域规定: 3.大盒子内容的显示: 适合对象:js初学者 -------------------------------

2019.04.06 电商09 推荐功能猜你喜欢

装饰器吗?显示的应该是商品的信息,是根据什么进行推荐的呢 1.然后就是我想增加新的功能,但是我又不想改变函数体,那么这时候用装饰器 如何使用,装饰器写在函数上面@recommend_view 还要定义装饰器,参数是被修饰的函数名 内部函数_wrapper()这里边的参数是要通过被修饰的函数决定的  当然也有可传参数 装饰器大体的内容内嵌一个函数,还有返回值,主要是参数的传递 添加的功能应该放在修饰响应函数的上方,调用函数会有返回值,记得返回回去, 近期访问的浏览记录吗?然后我要获取上次的id 

2019.04.09 电商25 结算功能1

结算功能要获取很多数据, 现在的主要问题是要知道获取对应的商品信息,要知道我选的是哪个的商品信息啊 它们选框的类名都一样啊,能遍历吗?遍历之后要去获取,它父级属性的值 有多少商品就有多少复选框,可以获取的,有几个就几个 var cks = $('.son_check'); $.each(cks,function(index,ck) 和for in 一样的     cks是遍历的数组,index每一个对象的下标,0,1, 2   ck就是对应的对象 判断是否选中就是要判断它的checked属性 i

php+redis实现电商秒杀功能

这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解),但我觉得,分享思路固然重要,但有了思路,却没有实现的代码,那会让人觉得很浮夸的,在工作中的程序猿都知道,你去实现一个功能模块,一段代码,虽然你有了思路,但是实现的过程也是很耗时的,特别是代码调试,还有各种测试等等.所以我认为,思路+代码,才是一篇好博文的主要核心. 直接进入主题. 一.前言 双十

VUE.JS实现购物车功能

购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3. 服务器端返回JSON格式,使用模板引擎+dom操作更新页面 最近新学习了vue.js,一个轻量级的mvvm(Model-View-ViewModel),vue.js是数据驱动无须操作dom,它提供特殊的html语言,把dom和数据绑定在一起,一旦修改了数据,dom将会自动更新更新. 关于vue.

nopcommerce4.2微信小程序/微信商城开发/微信电商程序开发

基于nopcommerce4.2 开发的微信小程序1.0版本,实现了电商的基础功能,用户可以正常下单.  分类:支持两种情况 1.只需要一级分类(顶部一级分类,下面商品展示) 2.需要展示多级分类(左一级分类,右侧二级分类),点击分类跳转到对应的分类商品 (下面为只需要一级分类的,情况截图)  商品页:轮播图片.价格信息.简要信息.详情信息.属性规格选择等(评价功能完善中) PS:其他信息,例如相关商品展示,后期在完善! 商品属性规则选择  购物车(删除/修改数量) 订单页:地址.留言.价格.运

互联网安全锁现大漏洞 网友建议:不要登录一切网银电商网站

2014.04.11 22:19:51 来源:南方日报作者:南方日报 ( 2 条评论 )  http://www.techweb.com.cn/internet/2014-04-11/2027049.shtml 昨日,被称为"心脏出血"的OpenSSL协议安全漏洞引发了人们对网上支付的担忧.传言称,这个漏洞"波及几乎所有网站",用户"不登录还好,一登录网站就有可能导致用户名和密码失窃".截至昨日18时12分,百度搜索关键词"OpenSS