1. 程式人生 > 實用技巧 >python3 之 天天生鮮 購物車操作 更新與刪除

python3 之 天天生鮮 購物車操作 更新與刪除

是這鳥樣的 當點選 + - 數量時 更新 ; 刪除就是刪除:

html

<li class="col06">
            <div class="num_add">
                <!-- class帶fl  就可以通過 $('. ') 呼叫-->
                <a href="javascript:;" class="add fl">+</a>
                <!-- 沒有定義name='count'或定義為其他名字不與detail相同  是為了區分訂單頁面來自 cart還是detail  
--> <input type="text" class="num_show fl" sku_id="{{ sku.id }}" value="{{sku.count}}"> <a href="javascript:;" class="minus fl">-</a> </div> </li> <li class="col07"><span>{{sku.amount}}</span></li> <li
class="col08"><a href="javascript:;" class="del_btn">刪除</a></li>

script

更新過數量 交給

updateRemoteCartInfo 函式處理
// 增加
        $(".add").click(function(){
            // 獲取操作的商品id
            var sku_id = $(this).next().attr("sku_id");
            // 獲取加操作前的的數量
            var sku_num = $(this
).next().val(); // 進行數量加1 sku_num = parseInt(sku_num); sku_num += 1; // 顯示商品數目的dom var num_dom = $(this).next(); // 更新購物車數量 updateRemoteCartInfo(sku_id, sku_num, num_dom); }); // 減少 $(".minus").click(function(){ // 獲取操作的商品id var sku_id = $(this).prev().attr("sku_id"); // 獲取加操作前的的數量 var sku_num = $(this).prev().val(); // 進行數量加1 sku_num = parseInt(sku_num); sku_num -= 1; if (sku_num < 1) sku_num = 1; // 更新頁面顯示數量 var num_dom = $(this).prev(); // 更新購物車數量 updateRemoteCartInfo(sku_id, sku_num, num_dom); }); var pre_sku_count = 0; $('.num_show').focus(function () { // 記錄使用者手動輸入之前商品數目 pre_sku_count = $(this).val(); }); // 手動輸入 $(".num_show").blur(function(){ var sku_id = $(this).attr("sku_id"); var sku_num = $(this).val(); // 如果輸入的資料不合理,則將輸入值設定為在手動輸入前記錄的商品數目 if (isNaN(sku_num) || sku_num.trim().length<=0 || parseInt(sku_num)<=0) { $(this).val(pre_sku_count); return; } sku_num = parseInt(sku_num); var num_dom = $(this); updateRemoteCartInfo(sku_id, sku_num, num_dom); });
// 更新後端購物車資訊
        function updateRemoteCartInfo(sku_id, sku_count, num_dom) {
            // 傳送給後端的資料
            var req = {
                sku_id: sku_id,
                count: sku_count,
                csrfmiddlewaretoken: "{{ csrf_token }}"
            };
            $.post("/cart/update", req, function(data){
                if (0 == data.code) {
                    // 更新商品數量
                    $(num_dom).val(sku_count);
                    // 更新商品金額資訊
                    var sku_price = $(".cart_list_td[sku_id="+sku_id+"]").children('li.col05').children().text();
                    var sku_amount = parseFloat(sku_price) * sku_count;
                    $(".cart_list_td[sku_id="+sku_id+"]").children('li.col07').children().text(sku_amount.toFixed(2));
                    // 更新頂部商品總數
                    freshTotalGoodsCount();
                    // 更新底部合計資訊
                    freshOrderCommitInfo();
                } else {
                    alert(data.message);
                }
            });
        }
#實現對資料庫 及 cookie 商品的更新
class
UpdateCartView(View): 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': 1, 'message': '引數不完整'}) #驗證 sku_id 在沒有黑客攻擊的情況下其實不會拿到None id try: sku = GoodsSKU.objects.get(id=sku_id) except GoodsSKU.DoesNotExist: return JsonResponse({'code': 2, 'message': '商品不存在'}) #保證 count 為整數 不能隨意輸入:字母、符號等無效 try: count = int(count) except Exception: return JsonResponse({'code': 3, 'message': '數量有誤'}) #判斷 庫存 數量是否充足 if count > sku.stock: return JsonResponse({'code': 4, 'message': '庫存不足'}) #判斷使用者是否登陸 if request.user.is_authenticated(): #獲取使用者id user_id = request.user.id #建立 redis 客戶端 讀取cart redis_conn = get_redis_connection('default') # 從資料庫獲取cart_%s 並判斷 商品是否存在 if redis_conn.hget('cart_%s' % user_id,sku_id): #存在更新sku_id 數量 redis_conn.hset('cart_%s'%user_id,sku_id,count) return JsonResponse({'code': 0, 'message': '新增購物車成功'}) else:#不存在 基本不可能 可能黑客可以能造假id return JsonResponse({'code': 10, 'message': '購物車無該資料'}) else: # 判斷cookie 中是否有 cart資訊 為了更加安全加上判斷 if request.COOKIES.get('cart'): # 如果 cookie中存在 cart 就加載出來 cart_dict = json.loads(request.COOKIES['cart']) if cart_dict[sku_id]: #如果存在 更新數量 cart_dict[sku_id] = count # 把新資料轉換為json 進行序列化轉儲 dump:有 轉儲 的意思 new_cart = json.dumps(cart_dict) response = JsonResponse({'code': 0, 'message': '新增購物車成功'}) #設定 cookie 存入 response.set_cookie('cart',new_cart) return response

刪除

// 刪除
        $(".del_btn").click(function(){
            var sku_id = $(this).parents("ul").attr("sku_id");
            var req = {
                sku_id: sku_id,
                csrfmiddlewaretoken: "{{ csrf_token }}"
            };
            $.post('/cart/delete', req, function(data){
              // window.reload()
                location.href="/cart/info/";  // 刪除後,重新整理頁面
            });
        });
class DelCartView(View):
    def post(self,request):
        #獲得商品 id
        sku_id = request.POST.get('sku_id')
        #驗證商品是否存在  快取等因素商品不存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            return JsonResponse({'code': 1, 'message': '商品不存在'})
        # 判斷使用者是否登陸
        if request.user.is_authenticated():
            # 獲取使用者id
            user_id = request.user.id
            # 建立 redis 客戶端 讀取cart
            redis_conn = get_redis_connection('default')
            #驗證商品
            if redis_conn.hget('cart_%s'%user_id,sku_id):
                #刪除
                redis_conn.hdel('cart_%s'%user_id,sku_id)
            else:
                return JsonResponse({'code': 2, 'message': '商品不存在'})
            return JsonResponse({'code': 0, 'message': '刪除購物車成功'})
        else:
            # 判斷cookie 中是否有 cart資訊  為了更加安全加上判斷
            if request.COOKIES.get('cart'):
                # 如果 cookie中存在 cart  就加載出來
                cart_dict = json.loads(request.COOKIES['cart'])
                #驗證
                if cart_dict[sku_id]:
                    #刪除
                    del cart_dict[sku_id]
                    #刪除後的字典 在此序列 轉儲
                    new_cart = json.dumps(cart_dict)
                else:
                    return JsonResponse({'code': 2, 'message': '商品不存在'})
                response = JsonResponse({'code': 0, 'message': '刪除購物車成功'})
                #設定 cookie 存入
                response.set_cookie('cart',new_cart)
                return response

更新 購物車總數 價格 全選與不全選

function freshOrderCommitInfo() {
            var total_amount = 0;  //總金額
            var total_count = 0;  // 總數量
            $('.cart_list_td').find(':checked').parents('ul').each(function () {
                var sku_amount = $(this).children('li.col07').text();  // 商品的金額
                var sku_count = $(this).find('.num_show').val();  // 商品的數量
                total_count += parseInt(sku_count);
                total_amount += parseFloat(sku_amount);
            });
            // 設定商品的總數和總價
            $("#total_amount").text(total_amount.toFixed(2));
            $("#total_count").text(total_count);
        }

        // 更新頁面頂端全部商品數量
        function freshTotalGoodsCount() {
            var total_count = 0;
            $('.cart_list_td').find(':checkbox').parents('ul').each(function () {
                var sku_count = $(this).find('.num_show').val();
                total_count += parseInt(sku_count);
            });
            $(".total_count>em").text(total_count);
       
// 我的購物車後面的總數
$('#show_count').text(total_count);
}
// 商品對應checkbox發生改變時,全選checkbox發生改變
        $('.cart_list_td').find(':checkbox').change(function () {
            // 獲取商品所有checkbox的數目
            var all_len = $('.cart_list_td').find(':checkbox').length;
            // 獲取選中商品的checkbox的數目
            var checked_len = $('.cart_list_td').find(':checked').length;

            if (checked_len < all_len){
                // 有商品沒有被選中
                $('.settlements').find(':checkbox').prop('checked', false)
            }
            else{
                // 所有商品都被選中
                $('.settlements').find(':checkbox').prop('checked', true)
            }
            freshOrderCommitInfo();
        });

        // 全選和全不選
        $('.settlements').find(':checkbox').change(function () {
            // 1.獲取當前checkbox的選中狀態
            var is_checked = $(this).prop('checked');
            // 2.遍歷並設定商品ul中checkbox的選中狀態
            $('.cart_list_td').find(':checkbox').each(function () {
                // 設定每一個goods ul中checkbox的值
                $(this).prop('checked', is_checked)
            });
            freshOrderCommitInfo();
        });