開始前先聊聊五毛錢的:
好久沒寫了,可能是因為懶(哎),寫這個是好事,既幫助了自己,鞏固一下知識,也可以讓別人給自己糾錯糾錯,三月份接觸到了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>