完善购物车系统

简介: 目录:完善加入购物车的提示页完善购物车的删除细节说明之前有写了一个购物车,将会员和游客,分开.会员加车存数据库,游客加车存cookie.但是这个系统,加入购物车就会跳转至购物车页面.

目录:

  1. 完善加入购物车的提示页
  2. 完善购物车的删除
  3. 细节说明

之前有写了一个购物车,将会员和游客,分开.会员加车存数据库,游客加车存cookie.但是这个系统,加入购物车就会跳转至购物车页面.但是在京东等电商当中,我发现他们并不是这样处理的

图片来自京东

京东会先跳往一个加入购物车成功的一个页面.这样做有什么好处呢

  • 可以诱导用户继续购物
  • 可以让cookie写入成功(这个在后面会有详细说明)
  • 可以不用将某件商品加入购物车,而直接进入购物车(这算是个bug的修复)

首先我们需要明白,做这样的购物车优化,我们需要些什么.

  • 首先我们需要一个前端页面代码,这个不是今天的重点,我就不说了

我们直接来看看流程图


购物车优化.png

我们按照这个思路,写了一个加入购物车提示页方法

    /**
     * 提示加车成功页面
     */
    public function actionCarttips()
    {
        //接收前台数据
        $data = Yii::$app->request->get();
        //判断用户是否登陆
        if (Yii::$app->user->isGuest) {
            //如果没有登陆,调用未登陆加车方法
            if (!$this->guestAddCart($data)) {
                echo '数据出错,稍后再试游客';
                exit;
            }
        } else {
            //如果登陆,调用登陆加车方法
            if (!$this->memberAddCart($data)) {
                echo '数据出错,稍后再试';
                exit;
            }
        }
        //渲染加车提示页面,传入id,继续购物使用
        return $this->render('CartTips', ['goods_id' => $data['goods_id']]);
    }

在这段代码中,我在这个控制器里之前就已经封装好了,游客和会员两个不同的加入购物车方法.
由于商品详情页,我使用的是页面静态化,所有只能使用get传值来避免csrf验证
get接收到值过后,传给相应的方法,完成加车,渲染加车提示页面.
这里有个小细节,我们传递了一个goods_id到前端页面,这里是为了让用户点击继续购物的时候能够直接跳回之前的那个商品页面.让用户体验更完善.


下面我们来看看购物车里商品的删除,一个购物车,必须得有删除功能,我们不能规定用户加入购物车后就不能删除,也许是用户手滑或则别的什么原因,购物车里必须有删除.

这里我们选择的是异步请求删除
之所以要选择异步是因为,异步删除不刷新页面感觉比较高级.还有就是异步请求,只会传递数据,并不会重新加载静态资源.这样反应也会比较快

下面我们来看看删除购物车的流程


购物车删除.png

我们先来看前端jquery代码

<script type="text/javascript" src="<?= Yii::$app->params['jquery'] ?>"></script>
<script type="text/javascript" src="/statics/plug/layer/layer/layer.js"></script>
<script type="text/javascript" src="/statics/js/cart1.js"></script>
<script type="text/javascript">
    $(function () {
        //使用事件委派,委派到删除的a标签上.a标签有两个属性,一个是class="del",一个是goods_id="对应的商品id"
        $("#cart_content").on('click', ".del", function (event) {
            //获取到id
            var goods_id = $(event.target).attr('goods_id');
            //通过寻找父级对象.找到点击删除的那一行tr
            var dom = $(event.target).parents('.num_tr');
            if (confirm('您真的要删除这个商品吗')) {
                //将id发送到后台接口,获取json结果
                $.getJSON(
                    '<?=\yii\helpers\Url::to(['goods/delcart'])?>',
                    {'goods_id': goods_id},
                    function (data) {
                        if (data.status) {
                            //成功
                            layer.msg(data.message, {icon: 1});
                            //删除dom节点
                            dom.remove();
                           //重新计算总价
                            var price = 0;
                            if ($(".onePrice") !== undefined) {
                                $('.onePrice').each(function (i, v) {
                                    price += Number($(v).text());
                                });
                            }
                            $("#total").text(price);
                        } else {
                            //弹出小标签提示
                            layer.msg(data.message, {icon: 2});
                        }
                    }
                )
            }
        })
    })
</script>

前段jq代码,使用了两个小技术.一个是事件委派,一个是ajax异步请求技术.这里就不细讲了.我们重点来看看后台的接口方法

    /**
     * 删除购物车中的数据接口
     */
    public function actionDelcart()
    {
        $goods_id = Yii::$app->request->get('goods_id');
        if (Yii::$app->user->isGuest) {
            //游客
            //获取cookie
            $cookieobj = Yii::$app->request->cookies;
            $cookieValue = $cookieobj->getValue('cart_cookie');
            if (empty($cookieValue)) {
                echo json_encode(['status' => 0, 'message' => '购物车中没有这个商品']);
                exit;
            }
            //反序列化cookie中的数据
            $cartArr = unserialize($cookieValue);
            foreach ($cartArr as $key => $value) {
                if ($key == $goods_id) {
                    unset($key);
                }
            }
            //序列化
            $serArr = serialize($cartArr);
            //将cookie写入
            Yii::$app->response->cookies->add(new Cookie([
                'name' => 'cart_cookie',
                'value' => $serArr
            ]));
            echo json_encode(['status' => 1, 'message' => '删除成功']);
        }
        else{
            //会员
            //查出数据库中这个商品的对象
            $cartModel=Cart::findOne(['goods_id'=>$goods_id,'user_id'=>Yii::$app->user->identity->getId(),'status'=>2]);
            if (empty($cartModel)) {
                echo json_encode(['status' => 0, 'message' => '购物车中没有这个商品']);
                exit;
            }
            //修改这条商品的状态
            $cartModel->status=0;
            $cartModel->save();
            echo json_encode(['status' => 1, 'message' => '删除成功']);
        }
    }

这里首先将游客和会员分开,使用Yii::$app->user->isGuset来判断

  • 游客的话,要复杂一点,我们将cookie里的数据取出,然后找到相应的goods_id对应的那条数据,将它删除,随后,又将剩下的数据再序列化后,再写入cookie.返回json化的执行结果
  • 会员我们是选择查出购物车表中的含有当前用户和含有goods_id的一条数据对象
    将这一对象的状态改为0,这样完成的删除,同样的,返回一条json化的执行结果

之前有提到要在购物车中加上提示页面,对写入cookie更友好.

我们都知道,cookie是存储在浏览器中的数据.当我们的代码执行到写入一条cookie时,并没有真正的写入,原因是我们必须在response,也就是渲染页面时候才能写入到cookie,在之前的版本中.我发现,当我渲染页面,在cookie中取值,并没有刚加入的cookie数据.

当时我的解决方案就是,在渲染页面中把get到的值,合并到之前的cookie中,来解决cookie写入慢半拍的问题,可是这一解决方案,始终感觉不够优雅,数据来源复杂化了.

所有采用中间加一页的方法的话,就在渲染提示页的时候就成功加入cookie,当用户这是点击购物车时候,我们直接到cookie中取值,就可与取到完整的数据

相关文章
|
3月前
|
存储 SQL NoSQL
商城业务---购物车
这篇文章讨论了商城业务中购物车功能的实现,包括用户登录状态下和未登录状态下购物车的处理方式。文章详细描述了购物车的基本需求、流程分析、判断用户登录状态的拦截器实现、临时购物车和登录购物车的数据操作,以及添加商品到购物车的过程。此外,还提到了可能遇到的问题和解决方案,以及在Redis中存储商品信息的不同数据结构选择。最后,文章展示了未登录和登录状态下购物车的使用效果和Redis中数据的存储情况。
商城业务---购物车
|
4月前
|
监控 供应链 数据安全/隐私保护
ERP系统中的库存周转率优化与管理解析
【7月更文挑战第25天】 ERP系统中的库存周转率优化与管理解析
210 0
|
6月前
|
搜索推荐 测试技术
对淘宝购物车进行测试用例设计
对淘宝购物车进行测试用例设计
306 0
|
6月前
|
JavaScript
基础购物车功能
基础购物车功能
|
6月前
|
供应链 数据库 UED
商城如何设计订单系统超级有用
商城如何设计订单系统超级有用
243 0
|
6月前
|
数据库 网络架构 UED
支付设计白皮书:支付系统的路由系统设计
支付设计白皮书:支付系统的路由系统设计
223 1
|
存储 NoSQL Redis
82分布式电商项目 - 购物车需求分析
82分布式电商项目 - 购物车需求分析
64 1
|
前端开发 JavaScript
27分布式电商项目 - 商品录入(基本功能)
27分布式电商项目 - 商品录入(基本功能)
91 0
|
存储 JSON NoSQL
购物车系统设计
在用户选购商品时,下单前,暂存用户想购买的商品。 购物车对数据可靠性要求不高,性能也无特别要求,在整个电商系统是相对容易设计和实现的一个子系统。
652 0
|
存储 移动开发 缓存
电商开发系列 - 购物车如何设计?
购物车,是购物平台(网上商城)必备的功能,像京东、淘宝、当当都有这样的功能,那购物车是怎么实现的,做过商城的小伙伴应该知道,未做过商城的小伙伴可能就不知道,为了让初入商城开发的小伙伴了解这块怎么做,从程序开发的角度来讨论一下这个场景
360 0