天天看點

Layui前端架構

官網

https://www.layui.com/

datagrid

加序号列

在table.render的cols參數中加序号列

{field: 'rank', title: '序号',width:60, 
   templet: function(d){
      return d.LAY_TABLE_INDEX+1;
}}      

複選框不居中顯示問題

.layui-table-cell .layui-form-checkbox[lay-skin="primary"]{
     top: 50%;
     transform: translateY(-50%);
}      

擷取所選行指定屬性

擷取datagrid複選框標明行的指定屬性,傳回以逗号分割的字元串屬性。背景可以直接用list或者String[]接收資料.

/**
         * 擷取所選行ids
         * tableidStr dagagridtable的id,例如'dataGridList'
         * idObj 屬性,例如'sysid'
         **/
        function getAllCheck(tableidStr,idObj){
            var ids_arr = [];
            var checkStatus = table.checkStatus(tableidStr);
            var rows = checkStatus.data;
            for(var i in rows){
                ids_arr.push(rows[i][idObj]);  //擷取row[i]資料行的idObj屬性
            }
            var ids_result = ids_arr.join(',');
            return ids_result;
        }      

分頁&條件查詢

先分頁查詢,翻頁後再輸入條件進行查詢,此時查詢條件會把目前頁數給帶過去,一定要把page的目前頁置為1

table.reload('dataGridList', {
                url: "./authrole/getListByPage",
                page:{
                    curr:1
                }
                ,where: {rolename:rolename} 
            });      

form表單

驗證取消必填

需要修改兩個檔案:form.js和layui.all.js

phone:[/(^$)|^1\d{10}$/,'請輸入正确的手機号'],
email:[/(^$)|^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,'郵箱格式不正确'],
url:[/(^$)|(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,'連結格式不正确'],
number:[/(^$)|^\d+$/,'隻能填寫數字'],
date:[/(^$)|^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,'日期格式不正确'],
identity:[/(^$)|(^\d{15}$)|(^\d{17}(x|X|\d)$)/,'請輸入正确的身份證号']

新增部分:(^$)|      

如果該選項為必填:建議使用,lay-verify=“required|number”校驗

button點選頁面重新整理

button在form表單中,點選button會導緻頁面重新整理,需要加上type="button"

<button class="layui-btn ty-btn" type="button" onclick="active()">激活</button>      

下拉框動态資料

html

<select name="type" id="type_up" lay-verify="" lay-verify="">
     <option value="">請選擇</option>
</select>      

js

layui.use('form', function(){
        var form = layui.form;
        $.ax('./setting/selectByExample', {type:'warnconfig_type'}, 'POST', function(data) {
            /*success*/
            var selects='';
            /*周遊資料,生成option選項*/
            for(var i in data){
                var  its='<option value="'+data[i].code+'">'+data[i].value+'</option>';
                selects +=its;
            }
            /*添加到指定的下拉框下面*/
            $("#type_up").append(selects);
            /*渲染*/
            form.render('select')
        }, function(e) {
            /*error*/
        }, false); //同步
    });      

下拉框回顯

/*周遊id為type_up的下拉框,因為隻有一個是以隻執行一次*/
$("#type_up").each(function() {
  /*周遊下拉框下的option子結點*/
    $(this).children("option").each(function() {
      //移除option的selected屬性
        $(this).removeAttr("selected");
        //如果option的value和回顯資料的type值相同
        if (this.value == d.type) {
            //選中下拉框中的值
        $('#type_up').val(d.type);
        }
    });
});

/*渲染下拉框*/
layui.use('form', function(){
    var form = layui.form;
  form.render('select');
});      

下拉框清空

function queryClear(){
            layui.use('form', function(){
                $('#isActiveQuery').val('');  //先設定值
                var form = layui.form;    
                form.render('select'); //重新整理select選擇框渲染
            });
        }      

Radio監控

<div class="layui-form-item">
    <label class="layui-form-label">單選框</label>
    <div class="layui-input-block">
        <input type="radio"  lay-filter="sex" name="sex" value="男" title="男" checked="">
        <input type="radio"  lay-filter="sex" name="sex" value="女" title="女">
        <input type="radio"  lay-filter="sex" name="sex" value="禁" title="禁用" disabled="">
    </div>
</div>      
layui.use(['form', 'layer', 'jquery' ], function () {
            $ = layui.jquery;
            var layer = layui.layer,
                form = layui.form;
                //監聽多選框點選事件  主要是通過 lay-filter="sex"  來監聽
            form.on('radio(sex)', function (data) {
                console.log(data);  //列印目前選擇的資訊
                if( data.elem.checked){      //判斷目前多選框是選中還是取消選中
                    alert('目前選中');
                }else{
                    alert('取消選中')
                }
                var value = data.value;   //  目前選中的value值
            });
        });      

Radio渲染不上去

<div class="layui-input-block">
                    <input type="radio" name="sex_up" value="1" title="男" checked>
                    <input type="radio" name="sex_up" value="0" title="女">
                </div>

                layui.use('form', function(){
                    if(d.sex == 0){
                        $("input[name=sex_up][value='0']").prop("checked", d.sex == 0 ? true : false);
                    }else{
                        $("input[name=sex_up][value='1']").prop("checked", d.sex == 1 ? true : false);
                    }
                    var form = layui.form;
                    form.render("radio"); //更新全部
                });      

CheckBox布局混亂

Checkbox框高度過高

.layui-form-checkbox[lay-skin=primary],.layui-form-checkbox[lay-skin=primary] span{
     max-height: 20px;
}      

Checkbox監控選擇框

在選擇第六個時彈出來最多隻能選擇五個

<input name="roleids[]" lay-filter="checkbox_role-filter" lay-skin="primary" type="checkbox" value="admin1" title="管理者">      
/*lay-filter='checkbox_role-filter'的複選框*/
          form.on('checkbox(checkbox_role-filter)',function(data){
            console.log(data);
            if ($("input[lay-filter='checkbox_role-filter']:checked").length>5){
                //将選中的全部取消
                //$("input[lay-filter='checkbox_role-filter']:checked").removeAttr("checked");
                //$(this).checked = false;
                $(this).prop("checked", false); 
                form.render('checkbox'); 
                layer.msg("最多隻能選擇5個标簽", {
                    time : 3000,
                    icon : 10 
                });
            }
          });      

Checkbox擷取值

//擷取checkbox[lay-filter='checkbox_role-filter']的值,ssm可以直接用String[]接收
            var arr = new Array();
            $("input[lay-filter='checkbox_role-filter']:checked").each(function(i){
                arr[i] = $(this).val();
            });
            var roleids = arr.join(',');      

動态添加Checkbox

//所有角色複選框
            $.ajax({
                url: "./authrole/selectByExample"
                    , data: {}
                    , type: "post"
                    , dataType: "json"
                    , success: function (data) {
                        var str = '';
                        $.each(data, function (index, role) {
                            str +='<input name="roleids[]" lay-filter="checkbox_role-filter" lay-skin="primary" type="checkbox" value="'+role.id+'" title="'+role.rolename+'">';
                        });
                        //放入html中
                        $('#rolesCheckboxDiv').html(str);
                        //渲染表單
                        layui.use('form', function(){
                            var form = layui.form;
                            form.render("checkbox"); //渲染checkbox
                        });
                    }
                    ,error:function(e){
                        layer.alert("請求失敗",{title:'提示',icon: 2});
                    }
            });      

switch控件

datagrid中switch控件

//動态添加switch
    templet: function(d){
         if(d.isActive == 0)
               return '<input type="checkbox" value="'+d.groupid+'" lay-text="啟用|停用" lay-filter="switchFilter" name="switch" lay-skin="switch">';
         if(d.isActive == 1)
            return '<input type="checkbox" value="'+d.groupid+'" checked="" lay-text="啟用|停用" lay-filter="switchFilter" name="switch" lay-skin="switch">';
    }

        //switch事件監控
        layui.use(['form'], function(){
            var form = layui.form
                ,layer = layui.layer
            //監聽switchFilter開關
            form.on('switch(switchFilter)', function(data){  //data為switch控件,用控件的value屬性傳值;
                var groupid = data.value;
                var isActive = '';
                console.info();
                if(this.checked){
                    isActive = '1';
                    //layer.msg('開關checked:'+ (this.checked ? 'true' : 'false'), {offset: '6px'});
                    //layer.tips('溫馨提示:開關狀态的文字可以随意定義,而不僅僅是ON|OFF', data.othis)
                }else{
                    isActive = '0';
                    //layer.msg('開關: 關掉了', {offset: '6px'});
                }

                //do some ajax opeartiopns;
                $.ax('./group/switchAcitve', {groupid:groupid,isActive:isActive}, 'POST', function(data) {
                    if (data.code == "success") {
                        layer.msg(data.msg, {offset: '6px'});
                    }else {
                        layer.alert(data.msg,{title:'提示',icon: 2});
                    }
                }, function(e) {
                    layer.alert('出問題啦~請稍後再試~',{title:'提示',icon: 2});
                }, false);

            });
        });      

ajax送出switch控件

if($('#ispub_add').is(':checked')) {
   ispub_add = "1";
}else{
   ispub_add = "0";
}      

表單送出擷取不到字段

<c:choose>
     <c:when test="${order.repstate == 1}">
         <form class="layui-form" id="repForm1">
               <div class="layui-input-block"><button class="layui-btn" lay-submit lay-filter="formRepFilter">立即送出</button></div>
         </form>
     </c:when>
     <c:when test="${order.repstate <= 2}">
         <form class="layui-form" id="repForm2">
         </form>
     </c:when>
     <c:otherwise></c:otherwise>
</c:choose>      

多個form表單寫在jstl标簽裡面,保證伺服器渲染後在浏覽器端隻有一個form标簽。這種情況下可以用

layui.use('form', function(){
    var form = layui.form;
    form.on('submit(formRepFilter)', function(data){
        console.info(data.field);
    });
});      

如果一個界面必須同時出現多個form标簽,那就隻能用單擊事件觸發serialize();

$('#form').serialize();      

頁籤

<script>
        //注意:頁籤 依賴 element 子產品,否則無法進行功能性操作
        layui.use('element', function () {
            var element = layui.element;
            element.on('tab(tab_box)', function (data) {
                console.log(data);
                if(data.index == 0 || data.index == 1 || data.index == 2){
                    //index表示頁籤下标
                    $(document).resize()
                }
            });
        });
</script>

<div class="layui-tab layui-tab-brief" lay-filter="tab_box">
  <ul class="layui-tab-title">
    <li class="layui-this">網站設定</li>
    <li>使用者管理</li>
    <li>權限配置設定</li>
  </ul>
  <div class="layui-tab-content">
    <div class="layui-tab-item layui-show">内容1</div>
    <div class="layui-tab-item">内容2</div>
    <div class="layui-tab-item">内容3</div>
  </div>
</div>        

關閉目前tab頁面

//跳轉到其他界面
        window.location.href = "${liveurl}";
        //關閉目前視窗
        var lay_id = $(".layui-tab-title .layui-this",parent.document).find('.layui-tab-close').click();      

點選左側菜單中間出現對應頁面

<div class="layui-side layui-bg-black">
    <div class="layui-side-scroll">-->
      <ul class="layui-nav layui-nav-tree site-demo-nav main_left" lay-filter="side">
                        <li class="layui-nav-item">
                            <a class="javascript:;" href="javascript:;">
                                <i class="layui-icon" style="top: 3px;">&#xe614;</i><cite>系統管理</cite>
                            </a>
                            <dl class="layui-nav-child">
                                <dd class="">
                                    <a _href="./userinfo/i">
                                        <cite>系統使用者</cite>
                                    </a>
                                </dd>
                                <dd class="">
                                    <a href="javascript:;" _href="./system/pingtai.html">
                                        <cite>平台配置</cite>
                                    </a>
                                </dd>
                            </dl>
                        </li>
                        <li class="layui-nav-item">
                            <a class="javascript:;" href="javascript:;" _href="./audit.html">
                                <i class="layui-icon" style="top: 3px;">&#xe63c;</i><cite>審計管理</cite>
                            </a>
                        </li>
       </ul>
    </div>
  </div>
  <div class="layui-body">
    <!-- 内容主體區域 -->
    <iframe frameborder="0" scrolling="yes" style="width:100%;height:100%" src="" id="lay-content"></iframe>
  </div>      
$(function(){
   $(".main_left li a").on("click",function(){
      var address =$(this).attr("_href");
      $("#lay-content").attr("src",address);
   });
});      

也可以用開源架構x-admin

Layui樹

一定要用layui2.5.5+,否則顯示不出來

//初始化
    layui.use('tree', function(){
        tree = layui.tree;
        getTreeData();
    });
    /*擷取樹*/
    function getTreeData() {
        $.ajax({
            url: "./permission/selectPermissionTree"
            , data: {}
            , type: "post"
            , dataType: "json"
            , success: function (data) {
                tree.render({
                    elem: '#permissiontree'
                    ,data: data
                    ,edit: ['add', 'update', 'del'] //操作節點的圖示
                    ,click: function(obj){
                        var data = obj.data;
                        $('#moduleid').val(data.id);
                        $('#modulename').val(data.title);
                        $('#path').val(data.href);
                        $('#ordernumber').val(data.ordernumber);

                        layui.use('form', function() {
                            var form = layui.form;
                            //監聽修改送出
                            form.on('submit(formEdit)', function(data){
                                $.ajax({
                                    url: "./permission/updateByPrimaryKeySelective"
                                    , data: data.field
                                    , type: "post"
                                    , dataType: "json"
                                    , success: function (data) {
                                        if (data.code == "success") {
                                            layer.alert(data.msg,{title:'提示',icon: 1},function(index){
                                                layer.close(index);
                                                getTreeData();
                                            });
                                        }else {
                                            layer.alert(data.msg,{title:'提示',icon: 2});
                                        }
                                    }
                                });
                                return false;
                            });
                        });
                    }
                    ,operate: function(obj){
                        var type = obj.type; //得到操作類型:add、edit、del
                        var data = obj.data; //得到目前節點的資料
                        var elem = obj.elem; //得到目前節點元素

                        if(type === 'add'){ //增加節點
                            add(data);
                        } else if(type === 'update'){ //修改節點
                            rename(data);
                        } else if(type === 'del'){ //删除節點
                            del(data.id);
                        }
                    }
                });
            }

        });
    }      

樹複選框回顯

在添加時一定隻添加葉子結點,回顯時才不會因為把父節點設定選中導緻整個子樹都選中。

添加時值添加子結點toListDF方法是關鍵。

/**
     * 配置權限
     */
    function allotPermission() {
        var checkData = tree.getChecked('permissiontreeID');
        var modultlist = treeToList(checkData);
        var roleid = $('#roleid_permission').val();

        var data = {moduleids:modultlist.join(','),roleId:roleid};
        $.ax('./permission/addmodulejoinrole', data, 'POST', function(data) {
            if (data.code == "success") {
                layer.alert(data.msg,{title:'提示',icon: 1},function(index){
                    layer.close(index);
                    layer.close(allotLayer);
                    //getTreeData();  //重新整理樹
                });
            }else {
                layer.alert(data.msg,{title:'提示',icon: 2});
                getTreeData();  //重新整理樹
            }
        }, function(e) {
            layer.alert('出問題啦~請稍後再試~',{title:'提示',icon: 2});
            getTreeData();  //重新整理樹
        }, false);
    }

    /**
     * 樹轉list
     */
    function treeToList(tree){
        for(var i in tree){  //周遊樹的第一層,隻有一個根結點
            var node = tree[i];
            list = [];  //結果lsit
            if (node.children.length !== 0) { //第一層加入到list中,因為根結點子產品設定為虛拟結點,是以不用加入
                /*list.push(node.id);*/
                toListDF(node.children, list, node.id);  //周遊子樹,并加入到list中.
            }
        }
        return list;
    }

    /**
     * 深度優先周遊樹
     * 一個遞歸方法
     * @params tree:要轉換的樹結構資料
     * @params list:儲存結果的清單結構資料,初始傳list = []
     * @params parentId:目前周遊節點的父級節點id,初始為null(因為根節點無parentId)
     **/
    function toListDF (tree, list, parentId) {
        for (var i in tree) { //周遊最上層
            //将目前樹放入list中
            var node = tree[i];
            //如果有子結點,再周遊子結點
            if (node.children.length !== 0) {
                toListDF(node.children, list, node.id)  //遞歸
            }else {
                list.push(node.id);
            }
        }
    }      

富文本框

https://www.layui.com/doc/modules/layedit.html

<textarea id="layedit" style="display: none;"></textarea>      
/*建構富文本編輯器*/
            layui.use('layedit', function(){
                var layedit = layui.layedit;

                //建構一個預設的編輯器
                layedit_up_index = layedit.build('content_up',
                    {tool:['strong' //加粗
                        , 'italic' //斜體
                        , 'underline' //下劃線
                        , 'del' //删除線
                        , '|' //分割線
                        , 'left' //左對齊
                        , 'center' //居中對齊
                        , 'right' //右對齊
                        , 'link' //超連結
                        , 'unlink' //清除連結
                    ]
                    });
            });      

在彈框中建構富文本編輯器時,要先彈出再建構。

自動填充插件

autocomplete

Layui前端架構

HTML代碼

<input type="text" name="type" id="typeQuery" autocomplete="off" class="layui-input" placeholder="請輸入類型,格式:表名_字段名">      

JS代碼

/*引入樣式*/
layui.link('./asset/layui2.5.5/extra/autocomplete.css');

/*配置第三方庫*/
layui.config({
    version: false,
    debug: false,
    base: './asset/layui2.5.5/extra/'
});

/*使用autocomplete*/
layui.use(['jquery', 'autocomplete'], function () {
    var $ = layui.jquery,
        autocomplete = layui.autocomplete;
    autocomplete.render({
        elem: $('#typeQuery')[0],
        url: './setting/getSettingType',
        template_val: '{{d.type}}',
        template_txt: '{{d.type}} <span class=\'layui-badge layui-bg-gray\'>{{d.remark}}</span>',
        onselect: function (resp) {

        }
    });
});      

資料格式

資料清單要放在data中,code要為0

Layui前端架構

成果

Layui前端架構

插件

excel.js

自動把excel檔案讀取到記憶體中,存儲為對象數組。需要轉換為json格式的字元串以application/json傳輸到背景。

引入layui_exts/excel.js

Html代碼

<input type="file" class="layui-btn layui-btn-primary" id="LAY-excel-import-excel" multiple="multiple">      
$(function() {
        // 監聽上傳檔案的事件
        $('#LAY-excel-import-excel').change(function (e) {
            var files = e.target.files;
            try {
                // 方式一:先讀取資料,後梳理資料
                LAY_EXCEL.importExcel(files, {}, function (data) {
                    data = LAY_EXCEL.filterImportData(data,{
                        'name': 'A'
                        /*,'date': function (v, item, data, rowIndex, newFieldName) {
                            if (rowIndex == 0) {
                                // 直接調用輔助方法格式化,也可以轉換為 Date 對象後自行處理
                                return LAY_EXCEL.dateCodeFormat(item['B'], 'YYYY-MM-DD HH:ii:ss')
                            } else {
                                return item['B'];
                            }
                        }*/
                        , 'phone': 'B'
                        , 'facultyName': 'C'
                        , 'className': 'D'
                    })
                    var teacherData = data[0].Sheet1;
                    if(teacherData[0].name.indexOf('教師') != -1 && teacherData[1].name == '教師姓名'){
                        teacherData.splice(0,2);   //删除前兩項
                    }else{
                        layer.alert("模闆不符合要求,請重新下載下傳模闆!");
                    }
                    var teacherjsonData = JSON.stringify(teacherData);
                    $('#teacherjsonData').val(teacherjsonData);
                    //console.log($('#teacherjsonData').val());
                });
            } catch (e) {
                layer.alert(e.message);
            }
        });
    });      

用application/json格式上傳資料

layui.use('form', function(){
        var form = layui.form;
        //監聽修改送出
        form.on('submit(formUpload)', function(data){

            layer.confirm('确認導入教師資訊嗎?', {icon: 3, title:'提示'}, function(index){
                var teachers = $('#teacherjsonData').val();

                if(teachers==null||teachers==''){
                    layer.alert('上傳内容為空!',{title:'提示',icon: 2});
                }

                $.ajax({
                    url: "../../back/teacherManager/addBatch"
                    , data: teachers
                    , contentType: "application/json;charset=UTF-8"
                    , type: "post"
                    , dataType: "json"
                    , success: function (data) {
                        if (data.code == "success") {
                            layer.alert(data.msg,{title:'提示',icon: 1},function(index){
                                layer.close(editLayer);
                                layer.close(index);
                                layui.form.render();
                                table.reload('teacherInfoList', {
                                    url: "../../back/teacherManager/getAllTeacher"
                                    //,where: {} //設定異步資料接口的額外參數
                                });
                            });
                            $("#form_upload")[0].reset();
                        }else {
                            layer.alert(data.msg,{title:'提示',icon: 2});
                        }
                    }
                });
            });
            return false;
        });
    });      

發送資料内容如下:

Layui前端架構

X-admin

重新整理後tab頁依然存在的問題。x-admin把tab的清單放入localstorage中,重新整理時把localstorage清除即可。

$(function () {
            /*清除localstorage的内容*/
            var storage=window.localStorage;
            storage.clear();
        });      

iframe頁打開新的tab頁

首先檢視iframe外部打開新的tab頁的js代碼。

Layui前端架構
window.parent.xadmin.add_tab(rowdata.projectName+"收款合同",'./cont_receive/redirect?projectid='+rowdata.id,true);