1. 程式人生 > 實用技巧 >python3 之 天天生鮮 加入購物車及動態效果

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