ThinkPHP分页总数88页优化方案
 
一、基础分页正常渲染(原生自带分页,88页会自动生成分页栏)
 
1. 控制器分页代码(TP5/TP6通用)
 
php   
// list 数据分页,每页10条
$list = Db::name('table')
    ->paginate(10); 

// 赋值模板
$this->assign('list', $list);
 
 
2. 模板输出分页
 
html   
{$list|raw}
 
 
默认分页会自动显示:首页、上一页、中间页码、下一页、末页,88页时中间只展示附近几页,不会一次性输出1-88全部数字,页面不会臃肿。
 
二、分页样式自定义(解决页码太多显示杂乱)
 
方式1:自定义分页模板(推荐,控制显示页码数量)
 
1. 创建分页模板  view/pagination.html 
 
html   
<div class="pagination">
    {if $list->currentPage() > 1}
        <a href="{$list->url(1)}">首页</a>
        <a href="{$list->url($list->currentPage()-1)}">上一页</a>
    {/if}

    <!-- 只展示当前页前后5页,88页不会全部输出 -->
    {for $i = max(1,$list->currentPage()-5); $i <= min($list->lastPage(),$list->currentPage()+5); $i++}
        {if $i == $list->currentPage()}
            <span class="current">{$i}</span>
        {else}
            <a href="{$list->url($i)}">{$i}</a>
        {/if}
    {/for}

    {if $list->currentPage() < $list->lastPage()}
        <a href="{$list->url($list->currentPage()+1)}">下一页</a>
        <a href="{$list->url($list->lastPage())">末页({$list->lastPage()})</a>
    {/if}
    <span>共{$list->total()}条,{$list->lastPage()}页</span>
</div>
 
 
2. 控制器指定分页模板
 
php   
$list = Db::name('table')->paginate(10, false, ['type' => 'app\admin\view\pagination']);
 
 
方式2:简洁分页(只显示上下页+跳转框,适合几十上百页)
 
增加页面跳转输入框,用户直接输入页码跳转,不用翻几十次:
 
html   
<form action="" method="get" style="display:inline-block;margin-left:10px;">
    <input type="number" name="page" min="1" max="{$list->lastPage()}" placeholder="输入页码">
    <button type="submit">跳转</button>
</form>
 
 
三、大数据88页性能优化(关键!数据量大分页卡顿)
 
问题:limit 偏移越大,查询越慢(page=88 等价 limit 870,10)
 
优化方案
 
1. 使用主键id游标分页(大数据首选)
不再依赖page分页,记录上一页最大ID,避免大偏移:
 
php   
// 第一页
$list = Db::name('table')->limit(10)->order('id desc')->select();
// 下一页传参数 last_id
$list = Db::name('table')
    ->where('id','<',$last_id)
    ->limit(10)
    ->order('id desc')
    ->select();
 
 
缺点:不支持直接跳转到第88页,适合前端无限滚动。
 
2. 给排序字段建立索引
 
sql   
ALTER TABLE `table` ADD INDEX idx_create_time (create_time);
 
 
分页排序字段无索引是卡顿核心原因。
 
3. 限制最大可跳转页码
业务上极少有人翻到88页末尾,可前端判断,页码大于50提示筛选条件缩小范围。
4. 增加筛选条件减少总页数
提供时间、状态、关键词搜索,从根源降低总页数,最实用。
 
四、TP6 分页自定义简化写法
 
php   
// 简洁分页,只输出上下页,不带全部数字页码
$list = Db::name('table')
    ->paginate([
        'list_rows' => 10,
        'simple' => true // 简洁分页:仅上一页/下一页,无数字页码
    ]);
 
 
开启  simple=true  后不会渲染1~88所有页码,页面干净。
 
五、前端样式优化,防止分页栏过长
 
css   
.pagination a, .pagination span {
    padding:4px 10px;
    margin:0 3px;
    border:1px solid #eee;
}
.pagination .current {
    background:#007bff;
    color:#fff;
    border-color:#007bff;
}
.pagination {
    margin-top:15px;
    overflow-x:auto; /* 页码过多横向滚动 */
    padding:8px 0;
}
 
 
总结
 
1. 单纯展示88页:自定义分页模板,只显示当前页前后5页,加跳转框;
2. 页面追求简洁:开启  simple  简洁分页,无数字页码;
3. 查询卡顿(88页加载慢):加索引、游标分页、增加搜索筛选减少数据量;
4. 用户体验:增加页码跳转输入框,不用一页页翻到88页。

更多推荐