记录下 layui 表格组件的二次封装

首先感谢@东本三月
代码参考出自[https://www.jianshu.com/p/08cd97ebbc43]

html页面代码
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <table class="layui-table" id="tableAdminlog" lay-filter="tableAdminlog"></table>
        </div>
    </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="tablelinebar">
    <a class="layui-btn layui-btn-xs layui-bg-blue" lay-event="view">查看</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<!-- 表格工具栏-->
<script type="text/html" id="tabletoolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm layui-bg-red" lay-event="del">删除</button>
    </div>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="modelView">
    <div id="modelViewDiv" class="layui-card-body">
        <table class="layui-table" lay-even lay-skin="nob" style="word-break: break-all;
    word-wrap: break-word;
    border-collapse: collapse;">
            <thead>
            <tr>
                <th width="100">标题</th>
                <th>内容</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>id</td>
                <td>{{ d.id }}</td>
            </tr>
            <tr>
                <td>admin_id</td>
                <td>{{ d.admin_id }}</td>
            </tr>
            <tr>
                <td>用户名</td>
                <td>{{ d.username }}</td>
            </tr>
            <tr>
                <td>url</td>
                <td>{{ d.url }}</td>
            </tr>
            <tr>
                <td>标题</td>
                <td>{{ d.title }}</td>
            </tr>
            <tr>
                <td>内容</td>
                <td>{{ d.content }}</td>
            </tr>
            <tr>
                <td>ip</td>
                <td>{{ d.ip }}</td>
            </tr>
            <tr>
                <td>useragent</td>
                <td>{{ d.useragent }}</td>
            </tr>
            <tr>
                <td>createtime</td>
                <td>{{ d.createtime }}</td>
            </tr>
            </tbody>
        </table>
        <div class="layui-form-item text-right">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closePageDialog">关闭</button>
        </div>
    </div>
</script>
<!-- js部分 -->
<script>
    layui.use(['layer','laytpl', 'dtable', 'admin'], function () {
        var $ = layui.jquery;
        var layer = layui.layer;
        var dtable = layui.dtable;
        var laytpl = layui.laytpl;
        //表头
        var cols= [[
            {type: 'checkbox', fixed: 'left'},
            {field: 'id',  title: 'ID',width:75,align:'center'},
            {field: 'username',  title: '账号',width:120},
            {field: 'title',  title: '标题'},
            {field: 'url', title: '访问地址'},
            {field: 'ip',  title: 'IP',width:140},
            {field: 'createtime',  title: '时间',width:175},
            {align: 'center', toolbar: '#tablelinebar', title: '操作', width: 150}
        ]];
        // 渲染表格
        insTb = {
            table:null,
            //表格初始化
            init: function () {
                //设置表格渲染的参数
                dtable.set_table_data('{:url("")}', cols, "#tabletoolbar");
                //进行表格渲染
                var data = {
                    elem:'#tableAdminlog'
                    , id:'tableAdminlog'
                    , defaultToolbar: ['filter']
                };
                insTb.table = dtable.table_render(data);
                //激活监听事件
                insTb.listen();
            },
            listen:function() {
                //表格行单击事件
                dtable.listen_click(function (e) {
                });
                //表格行双击事件
                dtable.listen_double(function (obj) {
                    var data = obj.data;
                    showDetailModel(data);
                });
                //表格行工具栏事件
                dtable.listen_line(function (obj) {
                    var data = obj.data;
                    var layEvent = obj.event;
                    if (layEvent === 'view') { // 查看
                        showDetailModel(data);
                    } else if (layEvent === 'del') { // 删除
                        doDel(data.id);
                    }
                });
                //表格头部工具栏事件
                dtable.listen_toolbar(function (obj) {
                    var checkStatus = dtable.checkStatus();
                    switch(obj.event){
                        case 'del':
                            var id = dtable.getMany();
                            console.log(id);
                            if (id != null) {
                                doDel(id);
                            }
                            break;
                    }
                })
            }
        };
        insTb.init();
        // 删除
        function doDel(Ids) {
            layer.confirm('确定要删除吗?', {
                skin: 'layui-layer-admin',
                shade: .1
            }, function (i) {
                layer.close(i);
                layer.load(2);
                $.post('{:url("del")}', {
                    ids: Ids
                }, function (res) {
                    layer.closeAll('loading');
                    if (res.code) {
                        layer.msg(res.msg, {icon: 1});
                        insTb.table.reload();
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }, 'json');
            });
        }
        // 显示表单弹窗
        function showDetailModel(mData) {
            var shtml='';
            laytpl($('#modelView').html()).render(mData,function (html) {
                shtml=html
            });
            parent.layui.admin.open({
                type: 1,
                title: (mData ? '查看' : '添加') + '日志',
                shadeClose:true,
                content: shtml,
                area: ['700px'],
                success: function (layero, dIndex) {
                    $(layero).children('.layui-layer-content').css('overflow', 'visible');

                }
            });
        }

    });
</script>

dtable.js代码

/**
 * 表单扩展模块
 */
layui.define(['table'], function (exports) {
    var $ = layui.jquery;
    var table = layui.table;
    var layer = layui.layer;

    //日期格式化
    Date.prototype.format = function (format) {
        var args = {
            "M+": this.getMonth() + 1,
            "d+": this.getDate(),
            "h+": this.getHours(),
            "m+": this.getMinutes(),
            "s+": this.getSeconds(),
            "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
            "S": this.getMilliseconds()
        };
        if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var i in args) {
            var n = args[i];
            if (new RegExp("(" + i + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? n : ("00" + n).substr(("" + n).length));
        }
        return format;
    };
    //form的封装参数数组转为参数字面量
    paraArrayToLiteral = function (para) {
        var literal={};
        for(var i=0;i<para.length;i++){
            literal[para[i].name]=para[i].value
        }
        return literal;
    };

    //将字面量封装成参数字符串
    LiteralToString = function (literal) {
        var index=0;
        var res="";
        for(var key in literal){
            if(index==0){
                res=res+"?";
            }else{
                res=res+"&";
            }
            res=res+key+"="+literal[key];
            index++;
        }
        return res;
    };

    //将字面量数组封装成参数字符串
    ArrayLiteralToString = function (array) {
        var index=0;
        var res="";
        for(var i=0;i<array.length;i++){
            var literal=array[i];
            for(var key in literal){
                if(index==0){
                    res=res+"?";
                }else{
                    res=res+"&";
                }
                res=res+key+"="+literal[key];
                index++;
            }
        }
        return res;
    };
    //将数组封装成参数字符串
    ArrayToString = function (paraName,array) {
        var res="";
        for(var i=0;i<array.length;i++){
            if(i==0){
                res=res+"?";
            }else{
                res=res+"&";
            }
            res=res+paraName+"="+array[i];
        }
        return res;
    };
    //获取字面量数组的第一个id项
    paraGetOneId = function (para) {
        if(para.length==0){
            return null;
        }else{
            var temp=para[0];
            return temp.id;
        }
    };
    //获取字面量数组的id项
    paraGetId = function (para) {
        var ids=[];
        if(para.length==0){
            return null;
        }
        for(var i=0;i<para.length;i++){
            ids.push(para[i].id)
        }
        return ids;

    };
    asString = function (str) {
        if (str.length == 0) {
            return null;
        }
        return str.join(',');
    };
    isEmpty = function (str){
        if(str==null){
            return true;
        }
        str=str+"";
        return str.replace(/\s/g,"")==""
    };

    /*
    * 参考示例:
    * https://www.layui.com/doc/modules/table.html
    * 封装了layui_table的一些常用功能
    * */
    var Dtable = {
        //表格渲染结束后的表格对象
        tableins: null,
        //用于创建表格的参数
        table_param: {
            elem: '#table_id'
            //容器唯一 id.id 是对表格的数据操作方法上是必要的传递条件
            , id: "table_id"
            //数据接口
            // ,url: '${request.contextPath}/user/query'
            //接口http请求类型
            , method: 'get'
            //默认每页数据条数
            , limit: 15
            , limits:[15,30,50,100]
            //开启分页
            , page: true
            //开启表格头部工具栏区域
            // ,toolbar:"#toolbarDemo"
            //默认工具
            , defaultToolbar: ['filter', 'exports', 'print']
            //其他请求参数
            , where: {}
            //定义请求时相关分页参数
            , request: {
                //页码的参数名称,默认:page
                pageName: 'page'
                //每页数据量的参数名,默认:limit
                , limitName: 'limit'
            }
            //对分页返回数据进行转换
            , parseData: function (res) {
                return {
                    //解析接口状态
                    "code": res.code,
                    //解析提示文本
                    "msg": res.msg,
                    //解析数据长度
                    "count": res.total,
                    //解析数据列表
                    "data": res.data
                };
            }
            // ,cols: [[ //表头
            //     {field: 'id', title: 'id', sort: true,type:'checkbox', fixed: 'left'}
            //     ,{field: 'id', title: 'ID'}
            //     ,{field: 'username', title: '用户名'}
            //     ,{field: 'password', title: '密码'}
            //     ,{field: 'sex', title: '性别'}
            //     ,{field: 'email', title: '邮箱'}
            //     ,{field: 'phone', title: '手机号'}
            //     ,{field: 'remark', title: '备注'}
            // ]]
        },
        //设置表格渲染的核心参数 url和表头信息,表格头部工具栏区域(script的id)
        set_table_data: function (url, cols, toolbar) {
            Dtable.table_param.toolbar = toolbar;
            Dtable.table_param.url = url;
            Dtable.table_param.cols = cols
        },
        //设置表格渲染的核心参数 url,限制条件,表头信息,表格头部工具栏区域(script的id)
        set_table_data_where: function (url,where, cols, toolbar) {
            Dtable.table_param.toolbar = toolbar;
            Dtable.table_param.where=where;
            Dtable.table_param.url = url;
            Dtable.table_param.cols = cols
        },
        //更新表格的参数
        update_table_param:function(para){
            if(para!=null){
                for(var key in para){
                    Dtable.table_param[key]=para[key];
                }
            }
        },
        //表格渲染
        table_render: function (para) {
            //更新参数
            Dtable.update_table_param(para);
            Dtable.tableins = table.render(Dtable.table_param);
            return Dtable.tableins;
        },

        //表格搜索 参数:搜索参数
        search: function (search_param) {
            var curr_page=1;
            // 将搜索的页码设置为当前表格的页码
            // curr_page=$(".layui-laypage-em").next().html();
            var search_param = {
                where: search_param,
                page: {
                    curr: curr_page
                }
            };
            table.reload(Dtable.table_param.id, search_param)
        },
        //监听头部工具栏
        listen_toolbar:function(callback) {
            table.on('toolbar('+Dtable.table_param.id+')', function(obj){
                typeof callback === 'function' && callback(obj);
            });
        },
        //监听行工具栏点击
        listen_line:function(callback) {
            table.on('tool('+Dtable.table_param.id+')', function (obj) {
                typeof callback === 'function' && callback(obj);
            });
        },
        //设置点击表格行,进行选中
        listen_click: function (callback,type=false) {
            var mt = Dtable.table_param.id;
            //设置单击勾选
            table.on('row('+Dtable.table_param.id+')', function(obj){
                var checkCell=obj.tr.find(".layui-form-checkbox");
                if(type == true){
                    if(obj.tr.hasClass('layui-table-click')){
                        obj.tr.removeClass('layui-table-click');
                        checkCell.removeClass('layui-form-checked');
                        table.cache[mt][obj.tr[0].rowIndex]['LAY_CHECKED'] = false;
                    }else {
                        obj.tr.addClass('layui-table-click');
                        checkCell.addClass('layui-form-checked');
                        table.cache[mt][obj.tr[0].rowIndex]['LAY_CHECKED'] = true;
                    }
                }
                typeof callback === 'function' && callback(obj);
            });
        },
        listen_double: function (callback) {
            table.on('rowDouble('+Dtable.table_param.id+')', function(obj){
                typeof callback === 'function' && callback(obj);
            });
        },
        checkStatus:function() {
            var checkStatus = table.checkStatus(Dtable.table_param.id);
            return checkStatus;
        },

        //获取当前选中行的数据
        getData: function () {
            //获取选中行对象
            var checkStatus = table.checkStatus(Dtable.table_param.id);
            //获取数据
            return checkStatus.data;
        },

        //要求选中一条数据,且返回id
        getOne: function () {
            var table_data = Dtable.getData();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length != 1) {
                if (table_data.length == 0) {
                    layer.msg("至少要选中一条数据", {icon: 2});
                } else {
                    layer.msg("只能选择一条数据", {icon: 2});
                }
                return null;
            }
            var one_id = paraGetOneId(table_data);
            if (one_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return one_id;
        },

        //要求选中多条数据,且返回id
        getMany: function (type = false) {
            var table_data = Dtable.getData();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length < 1) {
                layer.msg("至少要选中一条数据", {icon: 2});
                return null;
            }
            var many_id = paraGetId(table_data);
            if (many_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            if (type) return many_id;
            return many_id.join(',');
        },
        //在表头,以指定格式进行时间转换
        date_format: function (date, format) {
            if(format==null){
                format="yyyy-MM-dd hh:mm:ss";
            }
            if (date != null) {
                return new Date(date).format(format)
            }
            return "";
        }
    };

    Dtable.LiteralToString =LiteralToString;
    Dtable.paraArrayToLiteral =paraArrayToLiteral;
    Dtable.ArrayLiteralToString =ArrayLiteralToString;
    Dtable.ArrayToString =ArrayToString;
    Dtable.paraGetOneId =paraGetOneId;
    Dtable.paraGetId =paraGetId;
    Dtable.asString =asString;
    exports('dtable', Dtable);
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • {"keys":[{"key2":"余华","key":"活着","url":"https://www.jians...
    书籍数据记录阅读 500评论 0 0
  • 1-------- 走进前端 2-------- jQuery 3-------- CSS 4-------- A...
    依依玖玥阅读 2,320评论 0 34
  • 今天有点咸🐟想做一只没有梦想的搬运工 十六进制编辑器 十六进制编辑器(二进制文件编辑器或字节编辑器)是一种允许操纵...
    Honny_Boo阅读 2,438评论 0 7
  • 视听说第四单元 1在本文中我学到的最重要的概念 关于出名这件事,不同的人有不同的看法,而成名这件事确实也有利有弊。...
    138张丹丹阅读 525评论 2 0
  • 他们做他们的 唱歌跳舞拍照欣赏思考热闹 我做我的 在同一个时空 佛像该上色了 金灿灿或華艳 我心中的色彩 从数千年...
    赵记伟阅读 213评论 0 2