/** * guang-伪静态处理修改 * example: http://guang.yohobuy.com/boys-t4-p2/ * 其中 p2 的意思为:page=2 第二页 * @author: huangtao * @date: 2016/09/01 */ 'use strict'; let _ = require('lodash'); let Handlebars = require('handlebars'); let ALL_TYPES = { stand: 'p-page-n', mini: 'p-n', full: 'f-p-page-n-l-info-input-gobtn', fullellipsis: 'f-p-pe-n-l-info-input-gobtn', ellipsis: 'p-pe-n' }; exports.spager = function() { let options = arguments[arguments.length - 1]; let baseUrl = (arguments.length > 1 ? arguments[0] : null) || options.hash.baseUrl || '', page = (options.hash.page || 1) * 1, showNum = (options.hash.showNum || 7) * 1, pageSize = options.hash.pageSize || 20, totalPages = options.hash.totalPages, totalRecords = options.hash.totalRecords, theme = options.hash.theme || 'pager', currentClass = options.hash.currentClass || 'cur', // min full stand ellipsis or: f-首页, p-上一页, page-页码,n-下一页,l-最后一页,info-displayMsg,inout输入框,gobtn-goto Btn type = options.hash.type || 'stand', pageVar = options.hash.pageVar || 'page', pageSizeVar = options.hash.pageSizeVar || 'pageSize'; // 清除原来page(page=1&) 重新定义page let clearPageReg = /\/$/, clearSizeReg = new RegExp(pageSizeVar + '=[^&]*(&|$)'), base = baseUrl.replace(clearPageReg, ''); if (options.hash.pageSize) { base = base.replace(clearSizeReg, ''); } base += '-' + (options.hash.pageSize ? (pageSizeVar + pageSize + '-') : '') + pageVar; function getPageNums(ntype) { var pageNums = []; var num = showNum; if (ntype === 'e') { num = num - 2; num = num > 2 ? num : 2; } /** 分页展示页码个数begin 规则:展示最靠近当前页的指定个数 **/ let pageShowMax = num % 2 === 0 ? page - 1 : page; let pageShowMin = page; for (let i = 0; i < Math.floor(num / 2); i++) { pageShowMax++; pageShowMin--; if (pageShowMax > totalPages) { pageShowMax = totalPages; if (pageShowMin > 1) { pageShowMin--; } } if (pageShowMin < 1) { pageShowMin = 1; if (pageShowMax < totalPages) { pageShowMax++; } } } for (let n = pageShowMin; n <= pageShowMax; n++) { pageNums.push(n); } if (ntype === 'e') { if (pageShowMin > 3) { pageNums.unshift(1, '.'); } else if (pageShowMin === 2) { pageNums.unshift(1); } else if (pageShowMin === 3) { pageNums.unshift(1, 2); } if (pageShowMax < totalPages - 2) { pageNums.push('.', totalPages); } else { for (let x = pageShowMax + 1; x <= totalPages; x++) { pageNums.push(x); } } } return pageNums; } function renderItem(arr) { /** 分页展示页码个数end **/ let ret = ''; if (_.isArray(arr) && arr.length) { arr.forEach((val) => { if (val === '.') { ret += '<a>...</a>'; } else { ret += `<a href="${base}${val}/"` + (page === val ? `class="${currentClass}"` : '') + ` title="第${val}页">${val}</a>`; } }); } return ret; } function createStandItems() { return renderItem(getPageNums()); } function createEllipsisItems() { return renderItem(getPageNums('e')); } if (!totalPages) { if (!totalRecords || !pageSize) { return new Handlebars.SafeString(''); } else { totalPages = Math.ceil(totalRecords / pageSize); } } let items = ALL_TYPES[type] ? ALL_TYPES[type] : type; items = _.isArray(items) ? items : (items || ALL_TYPES.stand).split('-'); let hasPage = false; // 配置中如果配置了多次 page/pe 则将忽略,只第一次有效 let ret = `<div class="pager ${theme}">`; items.forEach(function(val) { switch (val) { case 'f' : if (page > 1) { ret += `<a href="${base}1/" title="首页">首页</a>`; } break; case 'p' : if (page > 1) { ret += `<a href="${base}` + (page - 1) + '/' + '" title="上一页"><span class="iconfont"></span>上一页</a>'; } break; case 'n' : if (page < totalPages) { ret += `<a href="${base}` + (page + 1) + '/' + '" title="下一页">下一页<span class="iconfont"></span></a>'; } break; case 'l' : if (page < totalPages) { ret += `<a href="${base}${totalPages}" title="尾页">尾页</a>`; } break; case 'info' : ret += '共{totalRecords}条/{totalPages}页'; break; case 'input' : // input // ret += '<span class="{cls}"><input value="{value}" type="text"></span>'; break; case 'gobtn' : // goto btn break; case 'page' : if (!hasPage) { ret += createStandItems(); } hasPage = true; break; case 'pe' : if (!hasPage) { ret += createEllipsisItems(); } hasPage = true; break; default: break; } }); if (options.fn) { ret += options.fn(options.context); } ret += '</div>'; return new Handlebars.SafeString(ret); };