1. 程式人生 > >layui的入坑之路

layui的入坑之路

用一個簡單的例子講layui的內容,後期如果有機會會慢慢補充,如果有什麼不足的話希望閱者能多多包涵和建議。
注意:後臺處理的不是用框架,用的是麻煩的servlet,後面補充的話儘量用ssm框架補充,不過servlet都可以實現,框架應該就更簡單了,這個問題應該不用擔心。
實現效果:


登入介面,你看到的都有實現


這裡寫圖片描述


功能

  • 搜尋:模糊搜尋(常規操作)
  • 刪除:上面的刪除可以實現多行刪除,下面則為單行
  • 匯出:匯出我這裡的需求是匯出Excel檔案,但是隻能匯入到預設路徑
  • 匯入:更具路徑匯入(此處要設定,下文會說明)
  • 分頁:分頁是可以的
  • 借書,還書:用彈出層實現
  • 表資料:有做直接更改,沒用彈出層(太麻煩)

接下來對程式碼的講解.
html

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui</title
>
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="layui/css/layui.css"> <script src="layui/layui.js">
</script> <script src="layui/layui.all.js"></script> <!-- 注意:如果你直接複製所有程式碼到本地,上述css路徑需要改成你本地的 --> </head> <style type="text/css"> .layui-table-cell{ height:100px; line-height: 100px; } </style> <body> <hr> <div class="demoTable"> <label class="layui-form-label">搜尋</label> <div class="layui-inline"> <input class="layui-input" name="keyword" id="demoReload" autocomplete="off"> </div> <button class="layui-btn" data-type="reload">搜尋</button> <button class="layui-btn layui-btn-danger" data-type="delSelect">刪除</button> <button class="layui-btn layui-btn-warm" data-type="download" >匯出</button> <button class="layui-btn layui-btn-normal" data-type="upload">匯入</button> <input type="file" name="file" id="file"> </div> <hr> <table class="layui-hide" id="LAY_table_user" lay-filter="dataTable"></table> <div id="pagePicker"></div> </body> </html>
  • style 裡的內容是解決table每行高度顯示問題的,可以更具自己的需求調整。
  • layui的包路徑需要正確,還有需要注意控制元件的id,name,data-type,lay-filter

js就拿一部分
操作框

<script type="text/html" id="barDemo">
    <a class="layui-btn layui-btn-mini" lay-event="edit">編輯</a>
    <a class="layui-btn layui-btn-danger layui-btn-mini" lay-event="del">刪除</a>
    <a class="layui-btn layui-btn-primary layui-btn-mini" lay-event="borrowBook">借書</a>
    <a class="layui-btn layui-btn-primary layui-btn-mini" lay-event="returnBook">還書</a>
    </script>


table

在table中的圖片是可以放大檢視的,效果如下,有一點需要注意,圖片的名字不能有中文(尚未解決)

layui.use(["form","laypage","layer","table","element","upload"], function(){
        var table = layui.table;
        var form=layui.form;
        var laypage=layui.laypage;
        var layer=layui.layer;
        var element = layui.element;
        var upload = layui.upload;
        //方法級渲染
        table.render({
             elem: '#LAY_table_user',
             url: 'servlet/BookController',
             done: function(res, curr, count) { //表格資料載入完後的事件
                   //呼叫示例
                   layer.photos({//點選圖片彈出
                       photos: '.layer-photos-demo',
                       anim: 1 //0-6的選擇,指定彈出圖片動畫型別,預設隨機(請注意,3.0之前的版本用shift引數)
                   });
               },
             cols: [[
                {checkbox: true, fixed: true},
                {field:'bookId', title: 'id', width:150, sort: true, fixed: true},
                {field:'bookName', title: '書名', width:150, sort: true,edit:true},
                {field:'bookCount', title: '剩餘數量', width:150, sort: true,edit:true},
                {field:'bookPath', title: '圖片', width:110,templet:function (d) {
                                                        var bookpath = "<%=basePath %>" +d.bookPath;
                                                        return '<div class="layer-photos-demo" style="cursor:pointer;">' +
                                                            '<img  src="' + bookpath + '" width="80px" height="100px"></div>';
                                                            }
                },
                {field:'right', title: '操作', width:350,toolbar:"#barDemo"}
                   ]],
             id: 'testReload',
             page: {
                layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'], //自定義分頁佈局
              //,curr: 5 //設定初始在第 5 頁
                groups: 1, //只顯示 1 個連續頁碼
                first: false, //不顯示首頁
                last: false, //不顯示尾頁
                limit:2,
                limits:[1,2,3,4,5,6,7,8,9,10]
            }
        });


頁面中的button響應事件

        $('.demoTable .layui-btn').on('click', function(){
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
        });
        //這是layui所又除了表格按鈕之外的按鈕監聽實現出,屬性與button的data-type屬性相對應
        var $ = layui.$, active = {
            //搜尋按鈕 key的值是搜尋框的值
            reload: function(){
                var demoReload = $('#demoReload');
                //傳入搜尋值
                table.reload('testReload', {
                    where: {
                        key: demoReload.val()
                    }
                });
            },
            //多行刪除
            delSelect: function(){ 
                 //獲取選中資料
                 var checkStatus = table.checkStatus('testReload')
                 var data = checkStatus.data;
                 if(checkStatus.data.length==0){
                     layer.msg('請選擇要刪除的資料', {icon: 5});
                     return;
                 }
                 //詢問框
                 layer.confirm('是否刪除選中的資料?', {
                     btn: ['刪除','取消'] //按鈕
                 }, function(){
                     var ids = "";
                     //這裡先遍歷,然後到後臺處理
                     for(var i = 0; i < data.length ;i++){
                         ids += data[i].bookId + ";";
                     }
                     $.ajax({
                         url: "servlet/BookController",
                         type: "GET",
                         data:{"ids":ids,"memthodname":"mulDeleteBook" },
                         dataType: "json",
                         success: function(data){
                            if(data.data){
                                layer.msg("刪除成功", {icon: 6});
                                table.reload('testReload', {
                                    where: {
                                        key: ""
                                    }
                                });
                            }else{
                                layer.msg("刪除失敗", {icon: 5});
                            }
                         }
                     });
                 }, function(){
                     layer.closeAll();
                 });
            },
            //把表格轉化成Excel檔案(檔案上傳下載這部分慎用,沒有深入研究)
            download:function(){
                 $.ajax({
                     url: "servlet/BookController",
                     data:{"memthodname":"BookExport"},
                     type: "GET",
                     dataType: "json",
                     success: function(data){
                         if(data.data){
                             layer.msg("匯出成功", {icon: 6});
                         }else{
                             layer.msg("匯出失敗", {icon: 5});
                         }
                     }
                 });
            },
            upload:function(){
                var filePath = $('#file').val();
                if(filePath == ""){
                    layer.msg("請選擇檔案之後在匯入", {icon: 5});
                    return;
                }
                //alert(filePath);
                 $.ajax({
                     url: "servlet/BookController",
                     data:{"memthodname":"BookImport","filePath":filePath},
                     type: "GET",
                     dataType: "json",
                     success: function(data){
                         if(data.data){
                             layer.msg("匯入成功", {icon: 6});
                             table.reload('testReload', {
                                 where: {
                                     key: ""
                                 }
                             });
                         }else{
                             layer.msg("匯入失敗", {icon: 5});
                         }
                     }
                 });
            }

        };


table直接修改資料

        //監聽單元格編輯 dataTable 對應 <table> 中的 lay-filter="dataTable"
        table.on('edit(dataTable)', function(obj){
            var value = obj.value, //得到修改後的值
                    data = obj.data, //得到所在行所有鍵值
                    field = obj.field; //得到欄位
            //layer.msg('[ID: '+ data.userId +'] ' + field + ' 欄位更改為:'+ value);
            $.ajax({
                url: "servlet/BookController",
                type: "POST",
                data:{"bookId":data.bookId,"memthodname":"edituv","field":field,"value":value},
                dataType: "json",
                success: function(data){
                    if(data.data){
                        //同步更新表格和快取對應的值
                        layer.msg("修改成功", {icon: 6});
                    }else{
                        layer.msg("修改失敗", {icon: 5});
                    }
                }

            });

        });


table中的按鈕

借書使用的是彈出層,編輯用的是layer.prompt,編輯只監聽其中的一項並做修改,沒有太大的意義,如果希望編輯能夠修改多個數據的話,需要自己做彈出層或者擴充套件layer.prompt.

        table.on('tool(dataTable)', function(obj){
            var data = obj.data;
            if(obj.event === 'borrowBook'){
                var body;
                layer.open({
                    type: 2,
                    title: '' +
                    '<li id="icon" class="layui-icon layui-icon-release layui-anim layui-anim-scaleSpring" ' +
                    'style="font-size: 30px; color: #009688;" data-anim="layui-anim-scaleSpring"></li> 編輯 ',

                    shadeClose: true,
                    shade: false,
                    btn: ['新增'],
                    btnAlign: 'c',
                    maxmin: true, //開啟最大化最小化按鈕
                    area: ['470px', '500px'],//area: [window.screen.width / 2 + 'px', window.screen.height / 2 + 'px'], //寬高
                    content: "<%=basePath %>"   +"Dialog.html",
                    success: function(layero, index){
                        body = layer.getChildFrame('body',index);
                        body.find("input#bookname").val(data.bookName);
                    },
                    yes: function(layero, index){
                        var userName = body.find("input#username").val();
                        var stuName = body.find("input#stuname").val();
                        var bookName = body.find("input#bookname").val();
                        if(userName == null){
                            layer.msg("使用者名稱不能為空", {icon: 5});
                            return;
                        }
                        $.ajax({
                            url: "servlet/BookController",
                            type: "GET",
                            data:{"userName":userName,
                                  "memthodname":"addBorrow",
                                  "stuName":stuName,
                                  "bookName":bookName},
                            dataType: "json",
                            success: function(data){
                                if(data.data){
                                    layer.alert('借書成功!',function(){
                                        layer.closeAll();
                                        table.reload('testReload', {
                                             where: {
                                                 key: ""
                                             }
                                        });
                                    });
                                }else{
                                    layer.msg("借書失敗", {icon: 5});
                                }
                            }
                        });
                    }
                });
            } else if(obj.event === 'returnBook'){


            }else if(obj.event === 'del'){
                layer.confirm('真的刪除行麼', function(index){
                    console.log(data);
                    $.ajax({
                        url: "servlet/BookController",
                        type: "GET",
                        data:{"bookId":data.bookId,"memthodname":"deleteuv" },
                        dataType: "json",
                        success: function(data){
                            if(data.data){
                                obj.del();
                                layer.close(index);
                                layer.msg("刪除成功", {icon: 6});
                            }else{
                                layer.msg("刪除失敗", {icon: 5});
                            }
                        }

                    });
                });
            } else if(obj.event === 'edit'){
                layer.prompt({
                    formType: 2
                    ,title: '修改 ['+ data.bookName +'] 的數量'
                    ,value: data.bookCount
                }, function(value, index){
                    EidtUv(data,value,index,obj);
                });
            }
        });

彈出層程式碼


彈出層程式碼就一起貼了,js程式碼和html寫在一起。
下面的圖片書名是table傳進去的,學生姓名是輸入學號之後非同步獲取的,這樣基本可以滿足彈出層的需求了。

<!DOCTYPE html>
<html>
<head>
<title>Dialog.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="layui/css/layui.css">
<script src="layui/layui.js"></script>
<script src="layui/layui.all.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
</head>
<body>
    <fieldset class="layui-elem-field layui-field-title ">
        <legend>
            <li id="icon"
                class="layui-icon layui-icon-face-smile layui-anim layui-anim-rotate "
                style="font-size: 30px; color: #1E9FFF;"
                data-anim="layui-anim-rotate"></li> <span style="font-size: 8px">請輸入借書資訊</span>
        </legend>
        <br>
        <div class="layui-field-box" style="width: 97%">
            <form class="layui-form" action="">
                <div class="layui-form-item">
                    <label class="layui-form-label">姓名 :</label>
                    <div class="layui-input-block">
                        <input type="text" name="stuname" id="stuname" disabled="disabled"
                            autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">書名 :</label>
                    <div class="layui-input-block">
                        <input type="text" name="bookname" id="bookname" disabled="disabled"
                            autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">使用者名稱/學號  :</label>
                    <div class="layui-input-block">
                        <input type="text" name="username" id="username" lay-verify="title"
                            autocomplete="off" placeholder="請輸入學號或使用者名稱" class="layui-input">
                    </div>
                    <div class="layui-form-mid layui-word-aux"></div>
                </div>
                <br>
                <br>
            </form>
        </div>
    </fieldset>
    <script type="text/javascript">
    layui.use(['layer', 'table','element','form','laydate'], function(){
          var form = layui.form,
          layer = layui.layer,
          layedit = layui.layedit,
          laydate = layui.laydate;
          //日期控制元件
          var dag=window.parent;
          laydate.render({
              elem: '#issueDate'
            });
        form.render(); 
    });
    //監聽身份證資訊
    $(function(){
          $("#username").blur(function(){
          var value=$(this).val();
          $.ajax({
            async:true,  //非同步載入
            data:{"userName":value,"memthodname":"findStuName"}, //引數
            type:"get",
            url:"servlet/BookController",
            dataType:"text",
            success:function(data){
                 var toObj = JSON.parse(data);
                 if(toObj.data.length <= 0){
                    layer.msg("沒有該學號的學生", {icon: 5});
                 }
                 //轉化成JSON字串
                 $("#stuname").val(toObj.data);
            }
          });
        });
    }); 
    </script>
</body>
</html>

到這裡所有的前臺程式碼就貼完了,這只是layui的一點點基礎內容,對於更高大上的東西后面還要研究,如果有機會的話我會繼續寫。
對了,上面的程式碼都是包含在

 layui.use(["form","laypage","layer","table","element","upload"], function(){

所以你如果是全拷貝了在最後還要加上 }); 不然一個簡單的錯誤找半天就冤枉了。

關於所有的前臺傳後臺,因為用的是servlet,所有值都可以用request接收
如果傳的是亂碼,那是中文的原因對於接收到的字串做格式轉化就可以了,如:

stuName = new String(stuName.getBytes("iso-8859-1"),"utf-8");

還有最重要的一點就是response的問題了,對於傳到前臺的資料可能回困擾新開始使用layui的cxy(本人也是),傳到前臺最關鍵的就是layui的url接收的值必須要滿足幾個欄位
你當然可以直接可以直接傳,但是那樣太麻煩了,可以做一個response的類(如果你嫌創類麻煩的話,網上應該有直接設值的方法,我記得有)
我貼上我的

package com.zse.ajax;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Response<T> implements Serializable{
    //成功
    public static final String RESULT_SUCCESS = "success";
    //可以預見但是不能處理的異常, 如SQLException, IOException等等
    public static final String RESULT_ERROR = "error";

    private static final long serialVersionUID = -2049439550666128636L;

    // 標識變數
    private String result = RESULT_SUCCESS;                                                                                                                     
    // 陣列, 存放業務失敗提示
    private List<String> msg;
    // 物件, 存放欄位格式錯誤資訊
    private List<String> errors;

    private Integer code;

    private Integer count;

    private T data;


    public Response(){
        msg = new ArrayList<String>(1);
        errors = new ArrayList<String>(1);
        code=0;
    }
    public Integer getcode() {
        return code;
    }
    public void setcode(Integer code) {
        this.code = code;
    }
    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public List<String> getmsg() {
        return msg;
    }
    /**
     * 設定業務錯誤資訊
     * @param message
     */
    public void setMessage(String message) {
        this.msg.clear();
        this.msg.add(message);
    }
    public List<String> getErrors() {
        return errors;
    }
    /**
     * 設定系統錯誤資訊
     * @param error
     */
    public void setError(String error) {
        this.errors.clear();
        this.errors.add(error);
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

類似這樣的類,像layui的欄位你新增,然後在建構函式賦值就OK了。

 Response<List<Book>> r = ResponseFactory.getDefaultSuccessResponse();
        r.setData(bookList);
        r.setCount(bookDao.getAllBooksCount());
        response.getWriter().print(JSONSerializer.toJSON(r).toString());

後臺像上面那樣寫前臺就匹配得到了。

到最後面,不要忘了導包。json的包,資料庫的包,檔案處理的包,這裡只寫前臺。