/** * 分页处理 * @author: yyq<yanqing.yang@yoho.cn> * @date: 2016/8/19 */ 'use strict'; const _ = require('lodash'); /** * 拼接url * @function joinUrl * @param params 要拼接的 参数 * @returns {string} */ const joinUrl = (params) => { let dest = '?'; _.forEach(params, function(value, key) { dest += `${key}=${value}&`; }); return _.trim(dest, '&'); }; /** * 设置分页 * @setPager setPager * @param total 总页数 * @param params 参数 * @returns {object} */ exports.setPager = (total, params)=>{ let resData = {}; let cutStatus, // 切割状态 1:去头 2:去尾 3:双切 i; let pages = []; let currentPage = parseInt(params.page || 1, 10); // 当前页 for (i = currentPage - 2; i <= currentPage + 2; i++) { if (i < 1) { cutStatus = 1; continue; } if (i > total) { cutStatus = cutStatus ? 3 : 2; continue; } pages.push({ url: joinUrl(Object.assign(params, {page: i})), num: i, cur: currentPage === i }); } // 分页中部补全 let len = 5 - pages.length; let list = []; if (cutStatus === 1) { for (i = 1; i <= len; i++) { let p = currentPage + i + 2; if (p > total) { break; } list.push({ url: joinUrl(Object.assign(params, {page: p})), num: p }); } pages = _.concat(pages, list); } else if (cutStatus === 2) { for (i = 1; i <= len; i++) { let p = currentPage - i - 2; if (p < 1) { break; } list.push({ url: joinUrl(Object.assign(params, {page: p})), num: p }); } pages = _.concat(list, pages); } // 分页头尾补全 let fnum = _.get(_.head(pages), 'num', 1), lnum = _.get(_.last(pages), 'num', 1); if (fnum > 1) { if (fnum > 2) { pages = _.concat({ url: joinUrl(Object.assign(params, {page: 1})), num: 1 }, {num: '...'}, pages); } else { pages = _.concat({ url: '?page=1', num: 1 }, pages); } } if (lnum < total) { if (lnum < total - 1) { pages = _.concat(pages, {num: '...'}, { url: joinUrl(Object.assign(params, {page: total})), num: total }); } else { pages = _.concat(pages, { url: joinUrl(Object.assign(params, {page: total})), num: total }); } } resData.pages = pages; // 上一页 if (currentPage > 1) { resData.prePage = {url: joinUrl(Object.assign(params, {page: currentPage - 1}))}; } // 下一页 if (currentPage < total) { resData.nextPage = {url: joinUrl(Object.assign(params, {page: currentPage + 1}))}; } return resData; };