nodeJS 中mongoose操作分頁


開始前先聊聊五毛錢的:

  好久沒寫了,可能是因為懶(哎),寫這個是好事,既幫助了自己,鞏固一下知識,也可以讓別人給自己糾錯糾錯,三月份接觸到了node,先是跟着一些教程寫了一些小實例,感覺自己就喜歡上了node,本人呢對於新的東西比較好奇,但由於實習的原因,並不能專心去學習,也就半了解,五月份回學校做畢設,本來要求的是使用C#,給予.net 的,在接觸過后,並且做了一些就開始放棄了,個人看法,着實不喜歡使用vs,對於配置問題更是讓我頭疼,哪有node這么方便,建個文件夾就開始了,比較有動力!

今天也說一下使用mongodb 數據庫分頁,本人才疏學淺,菜鳥一枚,對於知識點理解不深(按自己的想法來):

先說起因:做一個商品信息列表,商品很多,我們就需要分頁,設計的數據庫方法:

find()   查詢商品,

limit(),     限制顯示文檔個數

skip();     跳過文檔個數,

本人實現方法比較笨,具體看代碼:

首先,得知道商品的總數,查詢數據庫:

cart:function cart(userId){
        return Cart.find({userId:userId,isBuy:1})
            .exec()
    }

再者,首次訪問時,並沒有點擊底下的分頁按鈕,就得來個初始化吧,這樣: pageSize :單頁顯示的文檔數

findCart:function findCart(userId,pageSize){
        return Cart.find({userId:userId,isBuy:1})
            .limit(pageSize)
            .exec()
    },

下來就是分頁的了:   Count:需要跳過的文檔數,他的構成  點擊的頁 (num-1)*pageSize

findGoodsOrder:function findGoodsOrder(userId,pageSize,Count){
        return Cart.find({userId:userId,isBuy:2})
            .limit(pageSize)
            .skip(Count)
            .exec()
    }

好了,數據庫這一塊就好了,再看路由處理:

當然這就是首次訪問了:  將需要分的頁數一塊傳值過去,page變量,需要構造一頁面:

router.get('/cart',function(req,res,next){
    var pagesSize = 4;
    Promise.all([
        CartModel.findCart(req.session.user._id),
        CartModel.cart(req.session.user._id)
    ])
        .then(function(result){
            if(!result){
                req.flash('error','出錯了!');
            }
            var goods = result[0];
            var page = Math.ceil(result[1].length/4);
            req.flash('success','查找成功!');
            //req.session.user.credit = parseInt(user.SecPayment);
            res.render('per-cart',{
                goods:goods,
                page:page
            });
        })
        .catch(next);
});

然后就是分頁請求處理了:傳過來的值為點擊的頁數碼,公式,算出需要跳過幾個文檔數,調用函數就行了,

*注意,這次往回傳的時候是,res.send();說明我們用了ajax,局部刷新頁面:

  先想一想,怎么處理??再看下面。。。。

router.get('/cart/page',function(req,res,next){
    var pageSize=4;
    var page = (parseInt(req.query.count)-1)*4;
    CartModel.findGoodsOrder(req.session.user._id,pageSize,page)
        .then(function(goods){
            if(!goods){
                req.flash('error','出錯了!');
            }
            req.flash('success','查找成功!');
            //req.session.user.credit = parseInt(user.SecPayment);
            res.send({
                goods:goods
            });
        })
        .catch(next);
});

最后,我們就轉到頁面層了,:

頁面構造就不細說了,直接看ajax部分:

page:function(){
            /**數據實現分頁
             * 可累死了,首先不知道如何獲取點擊對象的文本節點值,
             * 對於ajax get/post 沒有理解,
             * 返回的數據處理方式,
             * @type {any|jQuery|HTMLElement}
             */
            var pageNum = $('.page li');    //獲取頁碼對象
            pageNum.click(function(){          //單擊事件,並將這個點擊對象傳過去
                page(this);
            });
            function page(obj){                 //事件處理函數 for(var i =0;i<pageNum.length;i++){
                    pageNum[i].style.backgroundColor = '#fff';          //默認頁碼背景色白色
                }
                obj.style.backgroundColor = '#f00';                //單擊對象背景色為紅色 var count = obj.firstChild.nodeValue;              //獲取單機對象的文本節點值,
                                       //對於DOM操作沒有好的理解,費好大勁,哎,技渣
                $.ajax({                                    //ajax請求
                    type:'GET',
                    url:'/personal/order/page',
                    data:{
                        count:count
                    },
                    dataType:'json',                         //請求的是后台,數據類型必須設置成JSON,
                    success:function(data){                    //不知道還能設置成其他的值不,還不清楚//alert('成功:'+data.data);
                        var goods=data.goods;                  //獲取返回的數據,就是動態添加HTML了, var cart = $('.cartshow');
                        //alert(goods[0].nodeName);
                        //goods[0].innerHTML='hello'
                        var content='<ul>';
                        goods.forEach(function(goods){
                            content+=
                                    ' <li><input type="checkbox" value="'+goods.count*goods.onePrice+'"/></li>'+
                                    '<li><a href="/main/'+goods.goodsId+'/single">'+goods.gName+'</a></li>'+
                                    '<li class="bigshow">'+
                                    '<div>'+
                                    '<img src="/images/45.jpg">'+
                                    '<div>'+
                                    '<label>'+goods.describe+'</label>'+
                                    '<label>尺寸'+goods.size+'</label>'+
                                    '</div></div></li>'+
                                    '<li>'+goods.count+'</li>'+
                                    '<li>'+goods.onePrice+'</li>'+
                                    '<li>'+goods.count*goods.onePrice+'</li>'+
                                    '<li><a href="/singleGoods/'+goods.goodsId+'/2/remove">刪除</a></li>';
                        });
                        content+='</ul>'
                        cart[0].innerHTML = content;
                        lb.price();
                    },
                    error: function(jqXHR, textStatus, errorThrown){
                        alert('error ' + textStatus + " " + errorThrown);
                    }
                });
            }
        }

 

大概的分頁就是這樣了,為什么要寫,因為我遇到這個問題的時候,本來想網上一找,就算了,誰知道呢,哎,難,都是是一個模板,不知道誰拷誰的,對於新手完全看不懂,然后就放棄了,當時對於ajax也不怎么熟悉,查書,找同學討論,可憐,周圍的居然沒有一個學習nodeJS的,討論一些邏輯部分,給自己找找靈感,

大概就是一天的時間,大概是我放了大招(使用代碼量能解決的問題,就不是問題),初步實現了功能。

代碼還有待擴展,如果數據特別多,底下的分頁碼就特別多,這需要一個處理,多的省略號,周圍的五個存在,如:1 ...9 10 11 12 13 .. 20

這又是一個問題,哎!想想頭都大,但目前我先不做這個,以后再考慮吧,下來的工作是一個實時交互功能,論壇聊天那種,給自己加油!

 

有什么問題,歡迎吐糟,共同進步!

<h2>現階段目標:能用代碼量解決的問題,就不是問題!</h2>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM