1. 程式人生 > >Mysql 資料分頁處理(Node.js的實現)

Mysql 資料分頁處理(Node.js的實現)

最近做專案的時候,有一個介面需要分頁處理,就是每頁返回20條資料:比如:https://api.cn?pagg=1
這裡的page就是需要獲取的哪一頁資料的請求引數,返回的json,當然就是返回給前臺需要的資料。

例項

PC端

這裡寫圖片描述
這個做PC端是比較常見的,這個其實需要後端返回一個必須要的資料,就是總的條數,至於每頁多少條這個是需求定的,當然還有的就是當前的頁數和當前頁數的資料。
比如下面的資料:

{
 "total": 1836,   // 總的條數
 "ret_code": 0,
 "totalPages": 92,  // 總頁數
 "currentPage": 1   // 當前頁數
"bookList": [ // 當前頁 的資料 { "summary": "", "id": 3, "bookclass": 1, "author": "張峰", "count": "0", "name": "從寶寶排洩物看", "fcount": 0, "img": "http://www.yi18.net/img/book/00003.jpg", "rcount": 0, "from": "張峰" }, …… ] }

手機端

手機端其實也基本是這樣的,差別在於手機端頁面是下拉重新整理或者上拉載入更多。

HBuilder webApp開發(二)表格上拉載入更多下拉重新整理[2017.05.24更新]這是之前寫的一個實現表格上拉載入更多下拉重新整理功能的手機頁面。其實後端需要返回的資料和上面的一樣。

後端實現

獲取介面請求引數

這個不同後端語言或者框架有不同獲取方式,但是思路基本一樣。獲取這個引數是為了拼接sql語句的。

查詢總條數

我使用的是Mysql,SELECT COUNT(*) FROM record這裡的record是表名。這條sql語句就可以獲取到當前表中的資料總條數,當然有限制條件的就有點不一樣。

分頁處理

下面就是重點了,分頁。
首先看看需求,每次取20條。那麼就有一個位置的偏移了。第一次是0~19,第二次是20~29,依次下去。但是接口裡面的第一頁通常引數會傳遞一個1過來。

var start = (page - 1) * 20;
var sql = 'SELECT * FROM record limit ' + start + ',20';

這裡的sql語句,裡面的start就是每次查村的起始點,後面的20就是位置偏移,也就是每次需要查詢的條數。
這裡的sql語句,難點就是limit的使用。

思路

上面似乎分析了很多,下面再來整理一下思路。

  1. 分析需求,每次獲取20條資料;
  2. 前端需要顯示當前頁,總條數,當前頁面的資料;
  3. 後端,獲取總條數,獲取需要查詢的資料,處理總頁數

具體程式碼實現

router.all('/api', function(req, res, next){
    var param = '';
    if (req.method == "POST") {
        param = req.body;
    } else{
        param = req.query || req.params; 
    }
    if (param.page == '' || param.page == null || param.page == undefined) {
        res.end(JSON.stringify({msg:'請傳入引數page',status:'102'}));
        return;
    }
    var start = (param.page - 1) * 20;
    var sql = 'SELECT COUNT(*) FROM record; SELECT * FROM record limit ' + start + ',20'; 
    pool.getConnection(function(err, connection) {
        if(err) throw err;
        connection.query(sql,function (err, results) {
            connection.release();
            if (err){
                throw err
            }else{
                // 計算總頁數
                var allCount = results[0][0]['COUNT(*)'];
                var allPage = parseInt(allCount)/20;
                var pageStr = allPage.toString();
                // 不能被整除
                if (pageStr.indexOf('.')>0) {
                    allPage = parseInt(pageStr.split('.')[0]) + 1; 
                }
                var userList = results[1];
                res.end(JSON.stringify({msg:'操作成功',status:'100',totalPages:allPage,currentPage:param.page,data:userList}));
           }
        })
    })
});