博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp+datatables+ajax 大量数据服务器端查询
阅读量:4494 次
发布时间:2019-06-08

本文共 3831 字,大约阅读时间需要 12 分钟。

今天一白天全耗在这个问题上了,知乎2小时除外... 现在19:28分,记下来以备后查。

 

问题描述:从后台数据库查询人员信息,1w多条,使用一个好看的基于bootstrap的模板 Bootstrap-Admin-Template-master ,其中集成了datatable组件,使用默认配置将后台php查询的数据给到前端网页,发现速度比较慢,20s左右,急脾气的人会砸电脑,为了爱护显示器起见,解决它。

思路:1、修改后台php查询代码,实现分页,前端要看那一页就把那页的数据查出来给他,分页的数据不过几十条,应该秒开了吧;

2、研究datatable组件,有否选项支持异步查询。

动手历史:先按照第1个办法来,修改后台thinkphp的indexAction

 1     
function index3()
 2     {
 3         
$person = D('BlacklistPerson');
 4         import('ORG.Util.Page');
//
 导入分页类
 5 
        // $count      = $person->where($map)->count();//总数量
 6 
        
$count=
$person->
count("id");
 7         
$listRows='7';
 8         
$p       = 
new Page(
$count,
$listRows);
 9          
//
 实例化分页类 传入总记录数和每页显示的条数
10 
        
$p->setConfig('theme', '<li><a>%totalRow% %header%</a></li> %upPage% %downPage% %first%  %prePage%  %linkPage%  %nextPage% %end% ');
11         
$page       = 
$p->show();
//
 分页显示输出
12 
        
$this->assign('page',
$page);
//
 赋值分页输出  
13 
14         
$fields='id,name,dept_com,address,origin,cardNum,filingTime';
15 
16         
$list = 
$person->field(
$fields)->limit(
$p->firstRow,
$p->listRows)->select();
17         
$this->assign('rlist', 
$list);     
18         
$this->display();
19 
20         dump(
$person->getLastSql());
21         dump(
$count);
22         dump(
$p->firstRow);
23         dump(
$p->listRows);
24         dump(
$list);     
25 

26     } 

 前端页面如下:

 1 
<
head
>
 2 
<
script 
src
="__PUBLIC__/jquery-2.1.3/jquery-2.1.3.min.js"
></
script
>
 3 
<
script 
src
="__PUBLIC__/Bootstrap-Admin-Template-master/dist/assets/js/jquery.dataTables.min.js"
></
script
>
 4 
<!--
 <script src="../../../Public/jquery-2.1.3/jquery-2.1.3.min.js"></script>
 5 
<script src="../../../Public/Bootstrap-Admin-Template-master/dist/assets/js/jquery.dataTables.min.js"></script> 
-->
 6 
</
head
>
 7 
 8 
 9 
10     
<
table 
id
="example"
 class
="display"
 cellspacing
="0"
 width
="100%"
>
11                 
<
thead
>
12                     
<
tr
>
13                         
<
th
>id
</
th
>
14                         
<
th
>name
</
th
>
15                         
<
th
>dept_com
</
th
>
16                         
<
th
>cardNum
</
th
>
17                     
</
tr
>
18                 
</
thead
>
19 
20                 
<
tfoot
>
21                     
<
tr
>
22                         
<
th
>id
</
th
>
23                         
<
th
>name
</
th
>
24                         
<
th
>dept_com
</
th
>
25                         
<
th
>cardNum
</
th
>
26 
27                     
</
tr
>
28                 
</
tfoot
>
29     
</
table
>
30 
31 
32 
33 
34 
35 
36 
<
script
>
37     $(document).ready(
function() {
38     $('#example').DataTable( {
39         "processing": 
true,
40         "serverSide": 
true,
41         "ajax": "__PUBLIC__/scripts/server_processing.php"
42     } );
43 } );

44 </script> 

 成功了,但是现实效果很丑,完全不和模板里datatable那近乎完美的美工同一个世界;对于本人这样的css小白加懒虫加半个强迫症,实在不能接受;

走第2种方法试试;

datatable这么牛的组件肯定有简单的设置来支持ajax之类的异步技术吧,跑去datatable.net一阵翻腾,还真有:http://datatables.net/examples/data_sources/server_side.html ;

按部就班试试,有两个比较烦人的问题,一是使用此方法需要用json格式,thinkphp后端返回的是数组,encode_json就行了吧,还不行,仔细一看datatable要求的json格式需要多几个参数,原thinkphp查出的数据数组只是其“data”:“....”部分,只传data会报错,http://datatables.net/manual/tech-notes/1;这几个参数貌似也不复杂,总条数,删选条数之类的,直接用官网给的服务端脚本吧,server_processing.php,ssp.class.php,前者指定服务器参数和查询列,后者是实际查询操作类;好,查出来了,给前台的datatable,使用

1 <script>
2     $(document).ready(
function() {
3     $('#example').DataTable( {
4         "processing": 
true,
5         "serverSide": 
true,
6         "ajax": "__PUBLIC__/scripts/server_processing.php"
7     } );
8 } );

9 </script> 

 居然报错,说是example已经初始化了,不能再初始化,折腾了三四个小时了,大冷天都冒汗了你给我看这个?莫非要让我去翻出模板怎么封装的datatable,修改默认的初始方式?不至于这么不人道,错误扔给度娘,居然官网就有解答,真是良心网站;http://datatables.net/manual/tech-notes/3;按教程用retrieve: true,强制重新初始化;

 1 <script>
 2     $(document).ready(
function() {
 3     $('#dataTable2').DataTable( {
 4         
//
明知DataTable已经初始化了,仍强制重新调整初始化选项
 5 
        retrieve: 
true,
 6         "processing": 
true,
 7         "serverSide": 
true,
 8         "ajax": "__PUBLIC__/scripts/server_processing.php",
 9         "columnDefs": [ {
10         "targets": [ 6 ],
11         "data": 
null,
12         "defaultContent": "i am not empty",
13         "render": 
function ( data, type, row ) {
14             
return "<a href=\"__URL__/more/id/"+row[0]+"\" class=\"btn btn-info btn-xs btn-grad\">查看</a>";
15         }
16   } ]
17     } );
18 } );

19 </script> 

最后一个问题了,俺得加个明细按钮啊,原来模板中是传list给volist方法便利,拼接个超链出来,现在咋办,datatable自身怎么指定列的动态值,继续翻官网,找到 http://datatables.net/reference/option/columns.data ,不错,有个render方法,可以拿来用;于是就有了上面的第14行。

 

测试刷刷的秒开,打完收工,结束一天充(ku)实(bi)的生活。 

转载于:https://www.cnblogs.com/javajava/p/4998787.html

你可能感兴趣的文章
软件工程第一次作业
查看>>
乘法逆元+模的运算规则
查看>>
.net 实现微信公众平台的主动推送信息
查看>>
线程池ThreadPool详解
查看>>
宝石TD迷宫设计器
查看>>
DOM对象和JQuery对象的区别
查看>>
vue脚手架安装笔记
查看>>
P2146 [NOI2015]软件包管理器
查看>>
像素与DPI之间的关系
查看>>
druid监控配置
查看>>
css颜色代码大全
查看>>
物理系统(二)
查看>>
css3中-moz、-ms、-webkit与盒子模型
查看>>
DataTable 整行为空时,去除空行,常用于Excel导入,转换为DataTable时出现
查看>>
网络相关面试题1
查看>>
一种让谷歌搜索引擎拒绝搜索的字符串
查看>>
实现毛玻璃效果
查看>>
[BZOJ4082][Wf2014]Surveillance[倍增]
查看>>
kill -9杀掉nginx主进程、reload失败解决办法
查看>>
objdump 用法
查看>>