美文网首页
记录下 layui 表格组件的二次封装

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

作者: 子木五六 | 来源:发表于2020-02-06 23:09 被阅读0次

    首先感谢@东本三月
    代码参考出自[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);
    });
    

    相关文章

      网友评论

          本文标题:记录下 layui 表格组件的二次封装

          本文链接:https://www.haomeiwen.com/subject/zaspxhtx.html