python3 之 天天生鲜 加入购物车及动态效果

 

 加入购物车获取id 和 数量

sku是通过传参来的 获取id

html   

<a href="javascript:;" class="add_cart" id="add_cart" sku_id="{{ sku.id }}">加入购物车</a>



<script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
    <script type="text/javascript">
var $add_x = $('#add_cart').offset().top;
        var $add_y = $('#add_cart').offset().left;

        var $to_x = $('#show_count').offset().top;
        var $to_y = $('#show_count').offset().left;

        $(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'});

        // 点击加入购物车
        $('#add_cart').click(function(){
            // 将商品的id 和 数量发送给后端视图,保存到购物车数据中
            var req_data = {
                sku_id: $('#add_cart').attr("sku_id"),
                count: $("#num_show").val(),
                csrfmiddlewaretoken: "{{ csrf_token }}"
            };

            // 使用ajax向后端发送数据
            $.post('/cart/add/', req_data, function (response_data) {
                if (0 == response_data.code) {
                    // 添加购物车成功的
                    $(".add_jump").stop().animate({
                    'left': $to_y+7,
                    'top': $to_x+7},
                    "fast", function() {
                        $(".add_jump").fadeOut('fast',function(){
                            $('#show_count').html(response_data.cart_num);
                            });
                        });
                    }
                else {
                    // 添加购物车失败
                    alert(response_data.message)
                }
            });
        });

 

 

def post(self, request):
        # 获得商品 id和count
        sku_id = request.POST.get('sku_id')
        count = request.POST.get('count')
        # 判断参数完整性
        if not all([sku_id, count]):
            return JsonResponse({'code': 2, 'message': '参数不完整'})
        # 判断商品是否存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            return JsonResponse({'code': 3, 'message': '商品不存在'})
        # 判断 count数量 是否可用 转换为整形
        try:
            count = int(count)
        except Exception as e:
            print(e.with_traceback,'错误类型-----------------------')
            return JsonResponse({'code': 4, 'message': '数量错误'})

        #判断库存
        if count > sku.stock:
            return JsonResponse({'code': 5, 'message': '库存不足'})

        #判断用户已登陆  购物车存入数据库
        if request.user.is_authenticated():
            #创建django-redis客户端
            redis_conn = get_redis_connection('default')
            #获取用户 id
            user_id = request.user.id
            #从数据库获取cart_%s value值  user_id:{sku_id(key),count(value)}
            origin_count = redis_conn.hget('cart_%s'%user_id,sku_id)
            # 如果商品在购物车中存在,就直接累加商品数量
            if origin_count != None:
                count += int(origin_count)
            # 写入数据库
            redis_conn.hset('cart_%s'%user_id,sku_id,count)
            #获取购物车 商品数量
            cart_num = 0
            #获取全部购物车数据
            cart_dict = redis_conn.hgetall('cart_%s'%user_id)
            # 遍历得到value  全部数量相加总和
            for num in cart_dict.values():
                #从数据库得到的是字节 需要转换为整数
                cart_num += int(num)
            # json方式响应添加购物车结果 code:代码;编码
            return JsonResponse({'code': 0, 'message': '添加购物车成功', 'cart_num': cart_num})
        else:
            #购物车存入 cookie
            # 判断cookie 中是否有 cart信息
            if request.COOKIES.get('cart'):
                #如果 cookie中存在 cart  就加载出来
                cart_dict = json.loads(request.COOKIES['cart'])
            else:
                cart_dict = {}
            # 查看该商品是否存在cookie
            if sku_id in cart_dict.items():
                #存在 该商品相加
                count += cart_dict[sku_id]
            #更新该商品数量
            cart_dict[sku_id] = count
            # 把新数据转换为json 进行序列化转储   dump:有 转储 的意思
            new_cart = json.dumps(cart_dict)

            #定义购物车显示数量
            cart_num = 0
            for num in cart_dict.values():
                cart_num += num
            # json方式响应添加购物车结果
            response = JsonResponse({'code': 0, 'message': '添加购物车成功', 'cart_num': cart_num})
            # 存入 cookie
            response.set_cookie("cart", new_cart)

            return response

 

posted @ 2020-10-29 15:11  Py_beginner  阅读(126)  评论(0编辑  收藏  举报