一张图解析FastAdmin中的表格列表的功能

Karson 7月前 4797

https://cdn.forum.fastadmin.net/uploads/201708/29/6a09d3e6f9e9342aaf96a8540147370e
点击图片查看高清大图

功能描述

请根据图片上的数字索引查看对应功能说明。
1.时间筛选器
如果想在搜索栏使用时间区间进行搜索,则可以在JS中修改修改字段属性,如

{field: 'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD"'},

其中type为类型,使用datetime将会把结果转换成时间戳进行搜索,如果你的数据库存储的是日期时间型数据,则移除该type属性,data指附件到input文本框上的属性
最新版FastAdmin已经支持用户体验更好的datetimerange插件,使用方式是:

{field:'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass:'datetimerange'}

2.状态列表
默认我们的搜索都是一个文本框,如果需要改成下拉列表框,则需要使用如下代码

{field: 'status', title: __('Status'), formatter: Table.api.formatter.status, searchList: {'normal': __('Normal'), 'hidden': __('Hidden')}, style: 'min-width:100px;'},

其中searchList使用的是一个JSON数据,同时searchList仍然支持数据、JSON对象、Ajax对象、Function函数。
普通搜索栏的搜索荐默认都是全部启用的,如果想禁用字段在普通搜索栏的显示,可以在字段属性中添加operate: false来禁用,如下方代码

{field: 'status', title: __('Status'), operate:false, formatter: Table.api.formatter.status}

3.添加、编辑、删除、导入、批量操作按钮
FastAdmin的添加、编辑、删除按钮默认是由{:build_toolbar()}生成的,默认是全部生成。如果我们只需要其中的部分按钮,则可以传入参数来实现,如{:build_toolbar('refresh,add')},这样将只会生成刷新和添加按钮。同时也支持调整参数的位置来调整最后生成的位置,另外请注意{:build_toolbar()}还会根据当前管理员的权限判断按钮是否显示,例如你使用{:build_toolbar('refresh,add')},如果当前管理员没有添加的权限,添加按钮仍然不会显示 。
目前build_toolbar支持的按钮有:

refresh: 刷新按钮
add: 添加
edit: 编辑
del: 删除
import: 导入

批量操作按钮是直接在视图页面上添加的HTML代码,直接修改即可。
启用导入请参考:https://forum.fastadmin.net/d/540
4.自定义搜索
FastAdmin中的Bootstrap-table表格的自定义搜索功能是非常强大的,我们可以按需要修改来实现自己的搜索功能,这里实现的功能是点击自定义搜索则发起搜索分类ID为1的数据,代码如下:

$(document).on("click", ".btn-singlesearch", function () {
    var options = table.bootstrapTable('getOptions');
    options.pageNumber = 1;
    options.queryParams = function (params) {
        return {
            search: params.search,
            sort: params.sort,
            order: params.order,
            filter: JSON.stringify({category_id: 1}),
            op: JSON.stringify({category_id: '='}),
            offset: params.offset,
            limit: params.limit,
        };
    };
    table.bootstrapTable('refresh', {});
    Toastr.info("当前执行的是自定义搜索");
    return false;
});

首先我们为自定义搜索这个按钮绑定上点击事件,这样当我们点击按钮时则发起搜索请求。其次注意我们获取了Bootstra-table表格的属性配置,并修改了其中的pageNumberqueryParamspageNumber指页码置为第一页,queryParams是这里的重点,我们修改了其中的filteropfilter是我们的过滤条件,op是我们的条件操作符,操作符支持=、!=、LIKE、NOT LIKE、>、>=、<、<=、IN(...)、NOT IN(...)、BETWEEN、NOT BETWEEN、LIKE %...%、IS NULL、IS NOT NULL,这里的filterop支持同时搜索多个条件。
5.快速搜索
快速搜索在键入关键词时将实时从服务端搜索数据,如果你的数据表数据较大,建议关键此功能,关闭的方法是使用search:false,其次快速搜索默认只会搜索主键id这个字段,如果你需要搜索其它字段,则需要在服务端你的控制器中定义$searchFields这个值,如下

protected $searchFields = 'id,name,title';

这样在快速搜索时将会搜索id,name,title这三个字段。
6.浏览模式、显示隐藏列、导出、通用搜索
浏览模式可以切换卡片视图和表格视图两种模式,如果不需要此功能,可以设置showToggle: false
显示隐藏列可以快速切换字段列的显示和隐藏,如果不需要此功能,可以设置showColumns: false,如果想要表格中的字段列默认隐藏可以设置字段属性visible: false即可默认隐藏
导出按钮默认将导出整个表的所有行,如果需要仅导出当前分页的数据,需要设置exportDataType: 'basic',如果想导出选中的行,则可以设置为exportDataType: 'selected',如果不需要此功能,可以设置showExport: false
通用搜索指表格上方的搜索,通用搜索的表单默认是隐藏的,如果需要默认显示,需要设置searchFormVisible: true,如果不需要通用搜索功能,可以设置commonSearch: false。如果想要控制字段列不参考搜索则可以设置字段列属性为operate: false即可。
7. 分类名称(关联搜索出分类表的名称)
这里显示的分类名称是根据分类表关联查询出来的结果,如果我们启用关联查询,我们必须在当前控制器中设置属性protected $relationSearch = true;,同时我们的index方法也需要重写,请参考下方的完整代码中PHP部分。如果我们启用了关联查询,当两个表中的字段有冲突时,我们必须在字段中加上别名。请参考下方的完整代码中JS部分。
8.标志和图片
FastAdmin封装了许多常用的方法,我们可以快速的调用即可。

Table.api.formatter.icon 快速将字段渲染成一个按钮,仅支持Fontawesome按钮
Table.api.formatter.image 快速将字段渲染成图片展示的形式
Table.api.formatter.images 快速将字段渲染成多图片展示的形式,字段数据请以,进行分隔
Table.api.formatter.status 快速将字段渲染成状态,仅支持normal/hidden/deleted/locked这四个状态
Table.api.formatter.url 快速将字段渲染成URL框
Table.api.formatter.search 快速将字段渲染成可搜索的链接,点击后将执行搜索
Table.api.formatter.addtabs 快速将字段渲染成可添加到选项卡的链接,点击后将把链接添加到选项卡
Table.api.formatter.flag 快速将字段渲染成标志,仅支持index/hot/recommend/new这四种标志
Table.api.formatter.label 快速将字段渲染Label标签
Table.api.formatter.datetime 快速时间戳数据渲染成日期时间数据
Table.api.formatter.operate 操作栏固定按钮
Table.api.formatter.buttons 快速生成多个按钮
9.状态
此处的状态是根据第8项中的Table.api.formatter.status进行生成的。
10.按钮组
按钮组的功能是根据第8项中的Table.api.formatter.buttons进行生成的,代码如下
{field: 'id', title: __('按钮'), table: table, buttons: [
    {name: 'detail', text: '弹窗', title: '弹窗标题', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail', callback:function(data){}},
    {name: 'detail', text: 'Ajax', title: 'Ajax标题', icon: 'fa fa-flash', classname: 'btn btn-xs btn-success btn-ajax', url: 'page/detail', success:function(data, ret){}, error:function(){}},
    {name: 'detail', text: '选项卡', title: '选项卡标题', icon: 'fa fa-flash', classname: 'btn btn-xs btn-info btn-addtabs', url: 'page/detail'}
], operate:false, formatter: Table.api.formatter.buttons}

其中classname中的btn-dialog、btn-ajax、btn-addtabs,FastAdmin已经为这几个固定的Class注册了事件,所以可以直接使用,如果想要实现其它功能,需要自己手动编写代码绑定事件才可使用。
btn-dialog的按钮会自动注册callback事件
btn-ajax的按钮会自动注册成功和失败的事件
11.操作
操作区域默认是排序、编辑、删除这三个按钮,此功能也是根据第8项中Table.api.formatter.operate来实现的。排序按钮只在表中存在weigh字段时才会出现,编辑按钮和删除按钮会根据管理员所拥有的权限进行按需显示。其次Table.api.formatter.operate也支持buttons属性来配置多个其它按钮,如示例图中的详情按钮。请参考下方完整代码中JS部分。

完整代码

PHP代码

<?php
namespace app\admin\controller;
use app\common\controller\Backend;
/**
 * 单页管理
 *
 * @icon fa fa-circle-o
 * @remark 用于管理普通的单页面,通常用于关于我们、联系我们、商务合作等单一页面
 */
class Page extends Backend
{
    protected $model = null;
    protected $relationSearch = true;
    public function _initialize()
    {
        parent::_initialize();
        $this->model = model('Page');
    }
    /**
     * 查看
     */
    public function index()
    {
        if ($this->request->isAjax())
        {
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $total = $this->model
                    ->with("category")
                    ->where($where)
                    ->order($sort, $order)
                    ->count();
            $list = $this->model
                    ->with("category")
                    ->where($where)
                    ->order($sort, $order)
                    ->limit($offset, $limit)
                    ->select();
            $result = array("total" => $total, "rows" => $list);
            return json($result);
        }
        return $this->view->fetch();
    }
}

JS代码:

define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
    var Controller = {
        index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    index_url: 'page/index',
                    add_url: 'page/add',
                    edit_url: 'page/edit',
                    del_url: 'page/del',
                    multi_url: 'page/multi',
                    table: 'page',
                }
            });
            var table = $("#table");
            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                sortName: 'weigh',
                columns: [
                    [
                        {field: 'state', checkbox: true},
                        {field: 'id', title: __('Id'), operate: false},
                        {field: 'category_id', title: __('Category_id'), operate: '='},
                        {field: 'category.name', title: __('Category'), operate: '=', formatter: Table.api.formatter.search},
                        {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '关键字,模糊搜索'},
                        {field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag, operate: false},
                        {field: 'image', title: __('Image'), formatter: Table.api.formatter.image, operate: false},
                        {field: 'views', title: __('Views'), operate: false},
                        {field: 'comments', title: __('Comments'), operate: false},
                        {field: 'weigh', title: __('Weigh'), operate: false},
                        {field: 'status', title: __('Status'), formatter: Table.api.formatter.status, searchList: {'normal': __('Normal'), 'hidden': __('Hidden')}, style: 'min-width:100px;'},
                        {field: 'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD"'},
                        {field: 'id', title: __('按钮'), table: table, buttons: [
                                {name: 'detail', text: '弹窗', title: '弹窗标题', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail'},
                                {name: 'detail', text: 'Ajax', title: 'Ajax标题', icon: 'fa fa-flash', classname: 'btn btn-xs btn-success btn-ajax', url: 'page/detail'},
                                {name: 'detail', text: '选项卡', title: '选项卡标题', icon: 'fa fa-flash', classname: 'btn btn-xs btn-info btn-addtabs', url: 'page/detail'}
                            ], operate:false, formatter: Table.api.formatter.buttons},
                        {field: 'operate', title: __('Operate'), table: table, buttons: [
                                {name: 'detail', text: '详情', title: '详情', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail'}
                            ], events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                    ]
                ],
                //普通搜索
                commonSearch: true,
                titleForm: '', //为空则不显示标题,不定义默认显示:普通搜索
            });
            // 为表格绑定事件
            Table.api.bindevent(table);
            
            //指定搜索条件
            $(document).on("click", ".btn-singlesearch", function () {
                var options = table.bootstrapTable('getOptions');
                options.pageNumber = 1;
                options.queryParams = function (params) {
                    return {
                        search: params.search,
                        sort: params.sort,
                        order: params.order,
                        filter: JSON.stringify({category_id: 1}),
                        op: JSON.stringify({category_id: '='}),
                        offset: params.offset,
                        limit: params.limit,
                    };
                };
                table.bootstrapTable('refresh', {});
                Toastr.info("当前执行的是自定义搜索");
                return false;
            });
            //获取选中项
            $(document).on("click", ".btn-selected", function () {
                Layer.alert(JSON.stringify(table.bootstrapTable('getSelections')));
            });
            //启动和暂停按钮
            $(document).on("click", ".btn-start,.btn-pause", function () {
                //在table外不可以使用添加.btn-change的方法
                //只能自己调用Table.api.multi实现
                Table.api.multi("changestatus", 0, table, this);
            });
        },
        add: function () {
            Controller.api.bindevent();
        },
        edit: function () {
            Controller.api.bindevent();
        },
        api: {
            bindevent: function () {
                Form.api.bindevent($("form[role=form]"));
            }
        }
    };
    return Controller;
});

HTML代码:

<div class="panel panel-default panel-intro">
    {:build_heading()}
    <div class="panel-body">
        <div id="myTabContent" class="tab-content">
            <div class="tab-pane fade active in" id="one">
                <div class="widget-body no-padding">
                    <div id="toolbar" class="toolbar">
                        {:build_toolbar()}
                        <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
                        <div class="dropdown btn-group {:$auth->check('page/multi')?'':'hide'}">
                            <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
                            <ul class="dropdown-menu text-left" role="menu">
                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
                            </ul>
                        </div>
                        <a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-user"></i> 自定义搜索</a>
                        <a class="btn btn-success btn-change btn-start" data-params="action=start" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-play"></i> 启动</a>
                        <a class="btn btn-danger btn-change btn-pause" data-params="action=pause" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-pause"></i> 暂停</a>
                    </div>
                    <table id="table" class="table table-striped table-bordered table-hover" 
                           data-operate-edit="{:$auth->check('page/edit')}" 
                           data-operate-del="{:$auth->check('page/del')}" 
                           width="100%">
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
最后于 2月前 被Karson编辑
最新回复 (52)
  • 胡导 7月前
    0 引用 2

    现在点击进入页面就直接显示所有的数据,那如果我想点击进去时就加入我的搜索条件呢,这样的话我是要在哪里把搜索条件加进去呢?也就是说我的表格数据只需要显示某个字段按搜索条件得出的数据。@Karson

  • likcoc 7月前
    0 引用 3

    正需要这个,MARK了

  • Karson 楼主 打赏 7月前
    0 引用 4

    @胡导 参考上方的第4条,自定义搜索,把queryParams放在表格实例化的配置中去,而不是用按钮点击触发。

  • 胡导 7月前
    0 引用 5

    补充一下,例如我现在有上万条的数据,而我现在只需要显示部分筛选出来的数据,那我这筛选条件加到什么地方。例如,某个字段"状态":“OPEN”和“CLOSE”,那我只想在打开表格时只显示OPEN状态的数据。@Karson

  • 胡导 7月前
    0 引用 6

    @Karson OK

  • 胡导 7月前
    0 引用 7

    我把它加到js里的index方法后面,搜索被正确执行了,满足之前的需求。但是会弹出警告信息:未知的数据格式。@Karson

  • Karson 楼主 打赏 7月前
    0 引用 8
  • 胡导 7月前
    0 引用 9

    不好意思,问题已解决,应该是我位置放错了。

  • threettiger 7月前
    0 引用 10

    很好,很强大

  • lnlingyuan 7月前
    0 引用 11

    mark

  • Doscript 7月前
    0 引用 12

    mark

  • wudi 7月前
    0 引用 13

    哪位大神知道多条件搜索怎么写,很急

  • ynew 7月前
    0 引用 14

    怎么在js里修改列宽呢?{field: 'shop.name', title: __('Shop'),'min-width':'200px'}和{field: 'shop.name', title: __('Shop'),‘width':'200px'},都不起作用。

  • cncbec 6月前
    0 引用 15

    这么好的帖子,没有收藏功能吗?

  • lirozsmrwm 6月前
    0 引用 16

    好东西啊~!~必须收藏:heart_eyes:

  • 岳绮罗 6月前
    0 引用 17

    https://cdn.forum.fastadmin.net/uploads/201710/10/9309d4b18d19b345f780de39de07a131
    框架怎么根据不同的判断条件显示可操作的按钮?
    我没开票之前操作显示开票,开过之后显示详情?

  • Karson 楼主 打赏 6月前
    0 引用 18

    @岳绮罗 自己定义formatter使用function来实现。

    最后于 6月前 被Karson编辑
  • 岳绮罗 6月前
    0 引用 19

    @Karson OK,搞定了!多谢
    https://cdn.forum.fastadmin.net/uploads/201710/11/2c1d2037403dfd6547e6d5b94d3e9530

    最后于 6月前 被岳绮罗编辑
  • 岳绮罗 6月前
    0 引用 20

    @Karson
    搞定了,多谢

  • 谐戏 6月前
    0 引用 21

    非常好,让我豁然开朗!

  • kevin222 6月前
    0 引用 22

    能否支持表格单列多个字段的显示https://cdn.forum.fastadmin.net/uploads/201710/17/755c3f483b2c13b25e0fc4591ab8d3cf

  • Karson 楼主 打赏 6月前
    0 引用 23

    @kevin222 单例多个字段 可以使用formatter函数来格式化。

  • 谐戏 6月前
    0 引用 24

    赋值:$this->assignconfig("aa", "bb");
    使用:Config.aa

  • huff 6月前
    0 引用 25

    自定义搜索带下拉框的怎么做?

  • chance 6月前
    0 引用 26

    自定义搜索中:
    点击自定义搜索则发起搜索分类ID为1的数据,无法点击分页,就是说分页失效了,只能看看第一页的数据
    https://cdn.forum.fastadmin.net/uploads/201710/25/625ddd8c6557e21d2a7bd6f8ec2619a7

  • slysjun 5月前
    0 引用 27

    编辑时js如何获取编辑行的数据?

  • yangliu 5月前
    0 引用 28

    as大家好的就看撒谎短时几十块大和的就看撒谎端口数多久卡上的就看撒谎的就看撒谎加上就看撒谎的空间撒谎打卡拉升阶段卡视角昆仑决奥斯卡了多久萨克雷即可拉伸觉得是克拉就大神昆仑决的上课啦觉得是克拉大家快来撒进的空气礼物就诶欧文噢诶我就可怜群文件昆仑决萨迪克连接的快乐撒娇的快乐撒娇的快乐撒娇的快乐撒娇的快乐撒娇打开了撒即可拉伸卡拉胶打开

  • yang57861637 5月前
    0 引用 29

    @Karson .添加、编辑、删除按钮 是 {:build_toolbar()} 生成的 ,我要是想打印添加的数据,在哪里打印?

  • ryante 5月前
    0 引用 30

    那个自定义的按钮的参数怎么改变,第10点那里

  • shadowaix 5月前
    0 引用 31

    mark

  • April 5月前
    0 引用 32

    mark

  • 人定胜天 5月前
    0 引用 33

    https://cdn.forum.fastadmin.net/uploads/201711/21/6d0af73e73c5a7548712458eb8450be0
    当一行中有个字段的数据太长了,如何限制他的展示长度

  • Karson 楼主 打赏 5月前
    0 引用 34

    @人定胜天 使用formatter进行字符串截取。试试

    formatter: function(value){
        return value.substr(0, 20);
    }
  • ruisen 5月前
    0 引用 35

    如果我index()中获取列表数据时采用join 后 返回的别名字段,那么在js配置文件中field值就是这个字段的别名了,而通用查询中查询的也是这个字段的别名,就无法查询了

  • korai 4月前
    0 引用 36

    通用搜索 commonSearch 的时候 怎么获取到 页面本来的 分页数量 limit的值 呢

  • Karson 楼主 打赏 4月前
    0 引用 37

    @ruisen 如果需要使用关联查询,记得把$relationSearch置为true

  • flashboycn 4月前
    0 引用 38

    @Karson 请教下,我完全照抄的代码(替换了完整代码中的3段),为什么没有显示图中3上面的 1和2两部分(3上面的检索区域都没有出现)?

    最后于 4月前 被flashboycn编辑
  • bwqyujianweilai 4月前
    0 引用 39

    mark一下

  • LovePHP 4月前
    0 引用 40

    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'supplier.supplier_name' in 'where clause'

  • olfy 3月前
    0 引用 41

    nice。解决大部分问题。3Q.:pray:

  • xxyalx 3月前
    0 引用 42

    赞一个 , 感谢分享

  • xuaimin 3月前
    0 引用 43

    mark

  • jadeglorious 3月前
    0 引用 44

    如果想根据某一个或者某个字段格式化整行数据的显示样式应该怎么做。

  • jadeglorious 3月前
    0 引用 45

    @jadeglorious 比如根据库存、报警库存两个字段,如果库存小于或者等于报警库存的值,则将整行数据加背景,字体加粗等设置特殊样式怎么处理

  • jiangpengju 3月前
    0 引用 46

    全部代码中没有model,不会报错么,控制器不存在:app\common\model\Page

  • jiangpengju 3月前
    0 引用 47

    @kevin222 你这个实现没,具体formatter的设计代码是什么呀,可以分享一下么

  • 0 引用 48

    mark

  • 湛蓝天空 3月前
    0 引用 49
    @Karson Table.api.formatter.status 快速将字段渲染成状态,仅支持normal/hidden/deleted/locked这四个状态
    如果我用户的性别存储的是 1 和2 怎么将表格中的状态转为 1- 男 2-女 3-保密
  • xpxwcn 2月前
    0 引用 50

    data-operate-edit="{:$auth->check('page/edit')}" 是不是没权限就会不显示编辑按钮?

  • Karson 楼主 打赏 2月前
    0 引用 51

    @xpxwcn 是的。

  • 哼哼哈嗨 1月前
    0 引用 52

    想问下btn-ajax使用ajax之后后台需要返回什么格式的参数呢,处理后返回回来都只有个OK的显示没法提示成功
    还有就是绑定的success方法重写了没有用

  • adminz 1月前
    0 引用 53

    我自定义了一个按钮 用于审核 执行完ajax我想刷新一下 表格 但是window.location.reload(),直接重新加载了表格 有没有什么方法是只刷新一下本页面 不跳回到第一页

  • royliuforever 1月前
    0 引用 54

    很详细细致。mark

  • paitson 1月前
    0 引用 55

    想问一下,我的footerFormatter没有生效,已经指定了true属性,在论坛上也没有看见关于这方面的话题,能否出一个指点的帖子或者其他的东西呢?

  • wwy 22天前
    0 引用 56

    请问表格中的“联动搜索”如何使用,例子中的那个好像没有传递参数。image.png
    这里面把管理员组改了个名字。而且只能选择第一个。
    能解释下这段的意思吗?
    $("input[name='title']", form).addClass("cxselect").data("source", "auth/adminlog/selectpage").data("primaryKey", "title").data("field", "title").data("orderBy", "id desc");

    OK了,是因为Bootstraptable.php 中的cxselect 的文件107行换成 $list = \app\admin\model\Admin::where('id', 'in', $adminIds)->field('id as value, username AS name, loginfailure, logintime')->select();
    增加 loginfailure, logintime两项,否则会出现问题。

    最后于 22天前 被wwy编辑
  • Hien 13天前
    0 引用 57
    Karson [@岳绮罗](/user/426) 自己定义formatter使用function来实现。

    @岳绮罗 根据条件判断显示按钮的formatter怎么写,求附上代码

  • tanyl2006 1天前
    0 引用 58

    茅塞顿开,豁然开朗!必须收藏。

  • 未登录
    54
返回
发表回复