layui table的使用与封装

1.版本与封装方式

  • layui-v2.5.4
  • 出于需求的需要,未使用官方所推荐的layui.use()相关方式进行调用.通过了layui.table.render()的非模块化方式(即所有模块一次性加载)进行调用
  • 将layui table的常用方法以字面量的方式进行保存,在其他页面进行调用实现功能.

2.引用

<!-- layui的样式包 -->
<link rel="stylesheet" href="${request.contextPath}/skins/layui/css/layui.css" media="all"/>

<!-- layui的js,模块化使用 -->
<!--<script type="text/javascript" src="${request.contextPath}/skins/layui/layui.js"></script>-->

<!--layui的js,可非模块化 -->
<script type="text/javascript" src="${request.contextPath}/skins/layui/layui.all.js"></script>

3.代码

/*
    * 参考示例:
    * https://www.layui.com/doc/modules/table.html
    * 封装了layui_table的一些常用功能
    * */
    var layui_table = {
        //表格渲染结束后的表格对象
        tableins: null,
        //用于创建表格的参数
        table_para: {
            elem: '#table_div'
            //容器唯一 id.id 是对表格的数据操作方法上是必要的传递条件
            , id: "table_id"
            , height: 400
            //数据接口
            // ,url: '${request.contextPath}/user/query'
            //接口http请求类型
            , method: 'get'
            //默认每页数据条数
            , limit: 20
            //开启分页
            , page: true
            //开启表格头部工具栏区域
            // ,toolbar:"#toolbarDemo"
            //默认工具
            , defaultToolbar: ['filter', 'exports', 'print']
            //其他请求参数
            , where: {}
            //定义请求时相关分页参数
            , request: {
                //页码的参数名称,默认:page
                pageName: 'current'
                //每页数据量的参数名,默认:limit
                , limitName: 'size'
            }
            //对分页返回数据进行转换
            , parseData: function (res) {
                return {
                    //解析接口状态
                    "code": res.code,
                    //解析提示文本
                    "msg": res.msg,
                    //解析数据长度
                    "count": res.data.total,
                    //解析数据列表
                    "data": res.data.records
                };
            }
            // ,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) {
            layui_table.table_para.toolbar = toolbar;
            layui_table.table_para.url = url;
            layui_table.table_para.cols = cols
        },
        //设置表格渲染的核心参数 url,限制条件,表头信息,表格头部工具栏区域(script的id)
        set_table_data_where: function (url,where, cols, toolbar) {
            layui_table.table_para.toolbar = toolbar;
            layui_table.table_para.where=where;
            layui_table.table_para.url = url;
            layui_table.table_para.cols = cols
        },
        //更新表格的参数
        update_table_para:function(para){
            if(para!=null){
                for(var key in para){
                    layui_table.table_para[key]=para[key];
                }
            }
        },
        //表格渲染
        table_render: function (para) {
            //预设表格高度
            layui_table.table_para.height= $("body").height()-80;
            //更新参数
            layui_table.update_table_para(para);
            layui_table.tableins = layui.table.render(layui_table.table_para);
        },

        //表格搜索 参数:搜索参数
        search: function (search_para) {
            var curr_page=1;
            // 将搜索的页码设置为当前表格的页码
            // curr_page=$(".layui-laypage-em").next().html();
            var search_para = {
                where: search_para,
                page: {
                    curr: curr_page
                }
            }
            layui.table.reload(layui_table.table_para.id, search_para)
        },

        //设置点击表格行,进行选中
        click_line_checked: function () {
            //https://fly.layui.com/jie/31942/
            $(document).on("click", ".layui-table-body table.layui-table tbody tr", function () {
                var index = $(this).attr('data-index');
                var tableBox = $(this).parents('.layui-table-box');
                if (tableBox.find(".layui-table-fixed.layui-table-fixed-l").length > 0) {
                    tableDiv = tableBox.find(".layui-table-fixed.layui-table-fixed-l")
                } else {
                    tableDiv = tableBox.find(".layui-table-body.layui-table-main")
                }
                // 加上下面的,限定只能选中一行数据
                // var trs = tableDiv.find(".layui-unselect.layui-form-checkbox.layui-form-checked").parent().parent().parent();
                // for (var i = 0; i < trs.length; i++) {
                //     var ind = $(trs[i]).attr("data-index");
                //     if (ind != index) {
                //         var checkCell = tableDiv.find("tr[data-index=" + ind + "]").find("td div.laytable-cell-checkbox div.layui-form-checkbox I");
                //         if (checkCell.length > 0) {
                //             checkCell.click()
                //         }
                //     }
                // }
                var checkCell = tableDiv.find("tr[data-index=" + index + "]").find("td div.laytable-cell-checkbox div.layui-form-checkbox I");
                if (checkCell.length > 0) {
                    checkCell.click()
                }
            });
            $(document).on("click", "td div.laytable-cell-checkbox div.layui-form-checkbox", function (e) {
                e.stopPropagation()
            });
        },

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

        //要求选中一条数据,且返回id
        selectOne: function () {
            var table_data = layui_table.get_checked_data();
            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
        selectMany: function () {
            var table_data = layui_table.get_checked_data();
            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;
            }
            return many_id;
        },
        //在表头,以指定格式进行时间转换
        date_format: function (date, format) {
            if(format==null){
                format="yyyy-MM-dd hh:mm:ss";
            }
            if (!isEmpty(date)) {
                return new Date(date).format(format)
            }
            return "";
        }
    }
  • 引用到的方法 paraGetOneId和paraGetId,paraArrayToLiteral.
  • 进行设置 jQuery.ajaxSettings.traditional = true; ,能够便捷的传递数组参数
//获取字面量数组的第一个id项
function paraGetOneId(para) {
    if (para.length == 0) {
        return null;
    } else {
        var temp = para[0];
        return temp.id;
    }
}
//获取字面量数组的id项
function paraGetId(para) {
    var ids = [];
    if (para.length == 0) {
        return null;
    }
    for (var i = 0; i < para.length; i++) {
        ids.push(para[i].id)
    }
    return ids;
}
//将ajax()、post()请求时的数组参数视为一个数组,而不是多个数组参数
jQuery.ajaxSettings.traditional = true;

//form的封装参数数组转为参数字面量
function paraArrayToLiteral(para) {
    var literal = {};
    for (var i = 0; i < para.length; i++) {
        var key=para[i].name;
        //如果当前值已经存在,说明有一个参数是数组
        if(literal[key]!=null){
            //把value改成数组类型,储存所有值
            var curr=literal[key];
            if((typeof curr)=="object"){
                curr.push(para[i].value)
                literal[key]=curr;
            }else{
                var temp=new Array()
                temp.push(curr);
                temp.push(para[i].value)
                literal[key]=temp;
            }
        }else{
            literal[key] = para[i].value
        }

    }
    return literal;
}
  • 在与后端的分页代码进行整合上,有两种方式
    一是后端兼容前端,在后端加上一个转换的步骤,将相关的数据按照layui的规范进行set
    二是前端兼容后端,在表格参数上设置layui需要的数据对应到的后端数据
    当前使用的是第二种方法,设置如下(在上面的代码也有):
             //定义请求时相关分页参数
              , request: {
                  //页码的参数名称,默认:page
                  pageName: 'current'
                  //每页数据量的参数名,默认:limit
                  , limitName: 'size'
              }
              //对分页返回数据进行转换
              , parseData: function (res) {
                  return {
                      //解析接口状态
                      "code": res.code,
                      //解析提示文本
                      "msg": res.msg,
                      //解析数据长度
                      "count": res.data.total,
                      //解析数据列表
                      "data": res.data.records
                  };
              }
    ```
    

4.页面使用

  • 下面页面的引用不再说明解释,页面部分地方还未优化,
<!doctype html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta content="always" name="referrer">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <#include "../common/header.html">
</head>
<body>
<!--最外面的灰底框,用于与ifram区别开-->
<div class="col-xs-12 lightgray_div">
    <!--白底框-->
    <div class="col-xs-12 white_div">
        <!--搜索框-->
        <div class="col-xs-12 search_div">
            <div class="input-group g-fr">
                <form id="inquire" class="form-inline ">
                    <div class="input-group ">
                        <select class="form-control" name="role" id="role">
                            <option value="0">所有角色</option>
                            <option value="1">超级管理员</option>
                            <option value="2">管理员</option>
                            <option value="3">高级用户</option>
                            <option value="4">普通用户</option>
                        </select>
                    </div>
                    <div class="input-group ">
                        <input type="text" class="form-control" id="gmt_create" placeholder="注册时间">
                        <input type="hidden" id="gmt_create_start" name="gmt_create_start">
                        <input type="hidden" id="gmt_create_end" name="gmt_create_end">
                    </div>

                    <div class="input-group ">
                        <input type="text" class="form-control" name="username" placeholder="用户姓名">
                    </div>
                    <button type="button" class="layui-btn" style="height: 30px" id="btn_search" onclick="table_func.search()"><i
                            class="layui-icon layui-icon-search"></i></button>
                </form>
            </div>
        </div>
        <div class="col-xs-12">
            <div id="table_parent_div" >
                <table id="table_div"  lay-filter="main"></table>
            </div>
        </div>
    </div>
</div>
</body>
<#include "../common/layui_init.html">
<!--表格工具类的按钮-->
<script type="text/html" id="toolbarBox">
    <div style="margin-bottom: -5px">
        <div class="layui-btn-container " style="float: left;">
            <button class="layui-btn " onclick="table_func.add()"><i class="layui-icon layui-icon-add-1"></i>添加</button>
            <button class="layui-btn  layui-btn-normal" onclick="table_func.edit()"><i
                    class="layui-icon layui-icon-edit"></i>编辑
            </button>
            <button class="layui-btn   layui-btn-danger" onclick="table_func.delete()"><i class="layui-icon layui-icon-delete"></i>删除
            </button>
            <button class="layui-btn   layui-btn-normal" onclick="table_func.set_role()"><i class="layui-icon"></i>设置用户角色
            </button>

        </div>
    </div>
</script>
<script type="text/javascript">
    //表头
    var 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: 'role_info', title: '角色'}
        , {field: 'remark', title: '备注'}
        , {
            field: 'gmt_create', title: '创建时间'
            , templet: function (col) {
                return layui_table.date_format(col.gmt_create, "yyyy-MM-dd hh:mm:ss")
            }
        },
        {
            field: 'gmt_create', title: '修改时间'
            , templet: function (col) {
                return layui_table.date_format(col.gmt_modified, "yyyy-MM-dd hh:mm:ss")
            }
        }
    ]]
    //页面要用的方法
    table_func = {
        //表格初始化
        init: function () {
            //设置表格渲染的参数
            layui_table.set_table_data('${request.contextPath}/user/query', cols, "#toolbarBox");
            //进行表格渲染
            layui_table.table_render();
        },
        //搜索
        search: function () {
            layui_table.search(paraArrayToLiteral($("#inquire").serializeArray()))
        },
        //添加
        add: function () {
            window.location.href = "${request.contextPath}/pages/user/add";
        },
        //编辑
        edit: function () {
            var id = layui_table.selectOne();
            if (id != null) {
                window.location.href = "${request.contextPath}/pages/user/add?id=" + id;
            }
        },
        //删除
        delete: function () {
            var id = layui_table.selectMany();
            if (id != null) {
                layui_layer.confirm("确定要删除吗?",function () {
                    $.post("${request.contextPath}/user/delete", {ids:asString(id)}, function (o) {
                        if (o.code == 0) {
                            layer.msg(o.message);
                            table_func.search();
                        } else {
                            layui_layer.error_alert(o.message);
                        }
                    });
                })
            }
        },
        //设置角色
        set_role: function () {
            var id = layui_table.selectOne();
            if (id != null) {
                layer.open({
                    type:2,
                    title:"设置角色",
                    shadeClose: true,
                    shadeClose: true,
                    shade: 0.5,
                    area: ['90%', '90%'],
                    content: "${request.contextPath}/pages/role/module/set_role?userId="+id,
                    end : function(index, layero){
                        table_func.search();
                    }
                })
            }
        },
    }
    $(function () {
        //设置点击表格行,进行选中
        layui_table.click_line_checked();
        //渲染日期选择框
        layui_date.range_date_render("#gmt_create", "date", "#gmt_create_start", "#gmt_create_end");
        $("#role").select2();
        table_func.init();
    });
</script>
<#include "../common/footer-inner.html">
</html>

5.展示效果

用户管理

6.还需完善的地方

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