ThinkPHP5.0+aceAdmin+dataTables實現異步分頁功能

最近在寫後臺的數據管理,有的時候由於數據過多需要使用分頁功能,而我作爲一個前端,由於用習慣了異步請求的功能在使用dataTables這個插件的時候,它也提供了利用Ajax來實現異步的分頁功能,所以就去官網看了一下。

dataTables官網

後臺數據列表頁,用的是ThinkPHP5框架+aceAdmin—ui


雖然現在的數據比較少只有22條,但是如果數據太多的話,會卡死服務器的

頁面其他代碼就不展示了 只貼基礎代碼

這個表格代碼

<div class="table_menu_list">
  <table class="table table-striped table-bordered table-hover" id="sample-table">
    <thead>
    <tr>
      <th width="25"><label><input type="checkbox" class="ace"><span class="lbl"></span></label></th>
      <th width="60">編號</th>
      <th width="70">機構名稱</th>
      <th width="105">機構地址</th>
      <th width="70">聯繫人</th>
      <th width="90">聯繫電話</th>
      <th width="145">所屬區域</th>
      <th width="100">地址經度</th>
      <th width="100">地址緯度</th>
      <th width="70">狀態</th>
      <th width="120">操作</th>
    </tr>
    </thead>
    <tbody></tbody>
  </table>

然後是js實例化代碼

var oTable1 = $('#sample-table').dataTable({
 processing: true,
 serverSide: true,
 ajax: {
  "url":"serverURL",//這個地方換成你自己的請求接口
  "data":function(d){ //額外傳遞的參數
  }
 },
 bStateSave: true,//狀態保存
 // aLengthMenu : [10, 30, 50, 100, 150],
 bProcessing : true,
 bAutoWidth: false,
 bFilter : true, //是否啓動過濾、搜索功能
 bInfo : true, //是否顯示頁腳信息,DataTables插件左下角顯示記錄數
 createdRow: function ( row, data, index ) {
  $(row).addClass('text-c');
  $('#count').html(data.recordsFiltered);
 },
 "order": [[ 1, "asc" ]],
 aoColumns: [
  {
   "sClass": "text-center",
   "data": "aid",
   "render": function (data, type, full, meta) {
    return '<input type="checkbox" name="select" value="' + data + '" />';
   },
   "bSortable": false  },
  { "mData": "aid" },
  { "mData": "name"},
  { "mData": "address"},
  { "mData": "contact"},
  { "mData": "phone"},
  { "mData": "region"},
  { "mData": "longitude"},
  { "mData": "latitude"},
      {
       "sClass": "td-status",
       "data": "status",
        "render": function (data) {
         if(data == 1){
           return `<span class="label label-success radius">合作中</span>`
          }else {
           return `<span class="label label-defaunt radius">停止合作</span>`
          }
        }
      },
      {
       "sClass": "td-manage",
       "data": "status",
        "render": function (data, type, full, meta) {
         var html = '';
          if(data == 1){
           html += `<a onClick="member_stop(this,${full['aid']})"  href="javascript:;" title="停止合作"  class="btn btn-xs btn-success">
            <i class="fa fa-check"></i></a>`
          }else{
           html += `<a style="text-decoration:none" class="btn btn-xs" onClick="member_start(this,${full['aid']})" href="javascript:;"
            title="開啓合作"><i class="fa fa-close"></i></a>`
          }
          html += `<a title="編輯" onclick="member_edit(${full['aid']})" href="javascript:;"  class="btn btn-xs btn-info" >
            <i class="fa fa-edit"></i>
          </a>
          <a title="刪除" href="javascript:;"  onclick="member_del(this,${full['aid']})" class="btn btn-xs btn-warning" >
            <i class="fa fa-remove"></i>
          </a>`
          return html;
        }
      }
 ]
  });

有的時候在表格的td裏面需要再次渲染標籤,就會用到 render方法 ,它接收四個參數,如果實在不知道是什麼參數,那就輸出一下,會找到你想要的。

然後是後端接口代碼

public function cooperation_list(Request $request)
{
    if (Request::instance() -> isAjax()){
        //接收參數
        $data = $request->param();
        $cooa = new CooperativeAddr();
        //獲取Datatables發送的參數 必要
        $draw = $data['draw']; //這個值直接返回給前臺
        $where = array();
        //搜索框
        $search = trim($data['search']['value']); //獲取前臺傳過來的過濾條件
        if(strlen($search) > 0) {
        $where['aid|longitude|latitude|name|address|contact|phone'] = array('like','%'.$search.'%');
        }
        //定義查詢數據總記錄數sql
        $recordsTotal = $cooa->where('isdelete',0)->count();
        //定義過濾條件查詢過濾後的記錄數sql
        $recordsFiltered = $cooa->where($where)->where('isdelete',0)->count();
        //排序條件
        $orderArr = [1=>'aid', 2=>'rid'];
        //獲取要排序的字段
        $orderField = (empty($orderArr[$data['order']['0']['column']])) ? 'aid' : $orderArr[$data['order']['0']['column']];
        //需要空格,防止字符串連接在一塊
        $order = $orderField.' '.$data['order']['0']['dir'];
        //按條件過濾找出記錄
        $result = [];
        //備註:$data['start']起始條數 $data['length']查詢長度
        $result = $cooa->alias('a')
            ->where($where)
            -> join('dawj_cooperative_region r','a.rid = r.rid')
            -> field('aid,longitude,latitude,name,address,region,status,contact,phone')
            ->where('isdelete',0)
            ->order($order)
            ->limit(intval($data['start']), intval($data['length']))
            ->select();
        //處理數據
        if(!empty($result)) {
            foreach ($result as $key => $value) {
                $result[$key]['recordsFiltered'] = $recordsFiltered;
            }
        }
        //拼接要返回的數據
        $list = array(
            "draw" => intval($draw),
            "recordsTotal" => intval($recordsTotal),
            "recordsFiltered"=>intval($recordsFiltered),
            "data" => $result,
        );
        return json($list);
    }
    $region_list = CooperativeRegion::where('isdel',0)
                 -> field('rid,region')
                 -> select();
    $view = new View();
    return $view->fetch('cooperation_list',['region_list' => $region_list]);

}

這段代碼相信用過ThinkPHP5框架的都會懂,不做太多解釋

然後,後端返回的字段必須和前端需要的參數一致,就是前端在實例化時寫在aoColums裏面的data數據,後端一定要返回

最後貼一張請求的參數,參數非常的多,當然如果沒有你想要傳遞的參數,也可以在ajax請求的時候附帶額外的參數,比如時間段