Django+layui 实现列表页的增删改查以及分页功能---列表页展示

背景: 需要做一个列表页,管理内部所有链接

思路:先用前端画出列表页,然后实现列表的功能

  列表页:layui自带的方法渲染,不需要过多的HTML直接JS渲染

  功能:新增、删除、查看、编辑、搜索、分页

  功能实现:前端数据提供给后端处理,渲染返回结果

首先,上一段前端代码,具体解析在页面中有注释

----- 更新数据库提供下拉选项功能

{% extends 'lblb/basePage.html' %}


<head>
    <meta charset="UTF-8">
</head>
<body>
{% block content %}

    <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
        <legend><p>动态添加列表页面</p></legend>
    </fieldset>
    {#功能区: 搜索、新增#}
    {#列表内容:删除、修改 先完成列表内容部分,#}
    {#    点击新增按钮,弹出一个弹窗#}
    {#    填写信息后,提交给后端,后端写入数据库,并且返回给前端#}
    {#    前端每次刷新页面都会请求到数据库中的数据#}
    <blockquote class="layui-elem-quote">
        <div class="layui-row">
            <form class="layui-form layui-col-md12 x-so" id="complain_search">
                <div class="layui-col-md3">
                    ID:
                    <div class="layui-input-inline">
                        <input type="text" name="serviceCode" id="serviceCode"
                               placeholder="请输入ID" autocomplete="off" class="layui-input">
                    </div>
                </div>
                <div class="layui-col-md3">
                    环境:
                    <div class="layui-input-inline">
                        <select name="env" id="env">
                            <option value="">---请选择---</option>
                        </select>
                    </div>
                </div>
                <div class="layui-col-md3">
                    服务端:
                    <div class="layui-input-inline">
                        <select name="serverType" id="serverType">
                            <option value="">---请选择---</option>
                        </select>
                    </div>
                </div>
                <div class="layui-col-md3">
                    国家/地区:
                    <div class="layui-input-inline">
                        <select name="countryArea" id="area">
                            <option value="">---请选择---</option>
                        </select>
                    </div>
                    <button id="search" class="layui-btn layui-btn-normal" lay-submit
                            lay-filter="linkSearch">
                        <i class="layui-icon">&#xe615;</i>
                    </button>
                    <input type="reset" class="layui-btn layui-btn-normal" value="重置">
                </div>

            </form>
        </div>
        <table class="layui-hide" id="linkTable" lay-filter="linkList"></table>
        {#         列表页实现,使用layui推荐的方法渲染#}
    </blockquote>

    <script type="text/html" id="add_event">
        {#    功能按钮,通过lay-event绑定 eg:lay-event="add_link"#}
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm layui-btn-normal" lay-event="add_link"><i class="layui-icon">添加</i>
            </button>
            <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="delete_link">批量删除</button>
        </div>
    </script>

    <script type="text/html" id="optsBar">
        <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">查看</a>
        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
    </script>
    <script type="text/javascript">
        layui.use(['table', 'layer', 'form', 'laypage'], function () {
            var table = layui.table,
                layer = layui.layer,
                form = layui.form,
                laypage = layui.laypage;

            var tableIns = table.render({ // 列表页渲染
                id: "linkReload",    //无所谓,需要需search联动
                elem: '#linkTable'    //需要渲染的元素,表格元素
                , url: '{% url "getLinkList" %}'  //渲染的数据源,由接口提供
                , page: true    // 开启分页功能
                , method: 'get'
                , height: 550   //固定表格高度,超过,则显示scroll
                , toolbar: '#add_event'     //新增设置为toolbar
                , limit: 10     //默认每页10条
                , limits: [5, 10, 20, 30]   // 分页选项
                , even: true    //设置隔行背景
                , response: {
                    // 后端数据格式, 接口返回数据
                    statusName: 'code',
                    msgName: 'msg',
                    statusCode: 200,
                    dataName: 'data',
                    countName: 'count',
                }
                , request: {
                    //前端请求参数;数据传给后端接口处理
                    pageName: 'page',
                    limitName: 'size'
                }
                , cols: [
                    // 表格数据
                    [
                        {checkbox: true}//开启多选框
                        , {
                        field: 'id', width: 150, title: 'ID', templet: function (data) {
                            return data.LAY_INDEX
                        }
                    }
                        , {
                        field: 'env', width: 150, title: '环境', templet: function (data) {
                            if (data.env == "正式环境") {
                                return '<span style="color: #D03948;">正式环境</span>';
                            } else if (data.env == "P环境") {
                                return '<span style="color: #18A4D0;">P环境</span>';
                            } else if (data.env == "测试环境") {
                                return '<span style="color: #5CD03F;">测试环境</span>';
                            }
                        }
                    }
                        , {
                        field: 'server', width: 150, title: '服务端', templet: function (data) {
                            return '<span>' + data.server + '</span>'
                        }
                    }
                        , {
                        field: 'area', width: 150, title: '国家/地区', templet: function (data) {
                            return '<span>' + data.area + '</span>'

                        }
                    }
                        , { // , edit: 'text' 开启单元格编辑
                        field: 'link_details', width: 300, title: 'linkUrl', templet: function (data) {
                            return '<a href="' + data.link_details + '" target="_blank"><u style="color: #0000FF;">' + data.link_details + '</u></a>';
                        }
                    }
                        , {fixed: 'right', title: '操作', toolbar: '#optsBar'}
                    ]
                ]
            });
            $.ajax({
                {# ajax请求searchEnvApi接口,返回对应的下来选项,在前端下拉框中显示 #}
                type: "get",
                url: "{% url 'searchEnvApi' %}",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    for (let index = 0; index < data.data.length; index++) {
                        let dataTemp = data.data[index];
                        if (dataTemp.value == "env") {
                            $("#env").append(new Option(dataTemp.descriptions));
                        } else if (dataTemp.value == "server") {
                            $("#serverType").append(new Option(dataTemp.descriptions))
                        } else if (dataTemp.value == "area") {
                            $("#area").append(new Option(dataTemp.descriptions))
                        }
                    }
                    form.render();
                }
            });
            table.on('toolbar(linkList)', function (obj) {
                var checkStatus = table.checkStatus(obj.config.id),
                    data = checkStatus.data;
                data = eval("(" + JSON.stringify(data) + ")");
                switch (obj.event) {
                    case 'add_link':     // lay-event自定义的新增按钮toolbar事件
                        layer.open({
                            type: 2,
                            title: "新增地址链接操作",
                            area: ['450px', '800px'],
                            fix: false,
                            maxmin: true,
                            shadeClose: true,
                            shade: 0.4,
                            {#skin: 'layui-layer-normal',#}
                            skin: 'layui-layer-rim',
                            content: ["{% url 'addLink' %}", "no"],     // 新增链接,窗口页面
                            btn: ['提交', '取消'],
                            yes: function (index, layero) {
                                // 从iframe中拿到data,获取post数据
                                var json_data = $(layero).find("iframe")[0].contentWindow.callbackdata();
                                $.ajax({
                                    url: "{% url 'addLinkApi' %}",  // 新增链接窗口中的数据处理
                                    type: "post",
                                    datatype: "json",
                                    data: json_data,
                                    async: false,
                                    cache: true,
                                    success: function () {
                                        // 刷新太快了,新增接口,network中没有返回数据
                                        window.location.reload();
                                    }
                                });
                                layer.close(index);
                            }
                        });
                        break;
                    case 'delete_link':
                        // 获取勾选了的CheckBox对应的id->vals里面
                        var vals = new Array();
                        $("td .layui-form-checked").parents("tr").children('[data-field=id]').each(function () {
                            vals.push($(this).text());
                            console.log(vals);
                        });
                        if (vals.length == 0) {  // 未勾选时,提示
                            layer.open({
                                title: "提示"
                                , content: "请选择需要删除的数据"
                            });
                            return false
                        }
                        layer.confirm("确定要全部删除吗?", {
                            btn: ["确定", "取消"],
                            yes: function (index) {
                                var vals = new Array();
                                $("td .layui-form-checked").parents("tr").children('[data-field=id]').each(function () {
                                    vals.push($(this).attr("data-content"));
                                    console.log(vals);
                                });
                                $.ajax({
                                    url: "{% url 'deleteLinkMore' %}"      // 批量删除接口
                                    , type: "post"
                                    , data: JSON.stringify({
                                        "vals": vals
                                    })
                                    , datatype: "json"
                                    , success: function () {
                                        parent.location.reload()        // 删除成功后刷新页面
                                    }
                                })
                            },
                        });
                }
                ;
            });
            table.on('tool(linkList)', function (obj) {
                // 获取tool行数据,这里用来提供数据
                var data = obj.data;
                var json = JSON.stringify(data);
                switch (obj.event) {
                    case 'detail':
                        console.log("链接详情");
                        var oldValues = [];     // 存储当前行数据
                        $.each(data, function (key, value) {
                            if (key != 'id') {
                                oldValues.push(value);
                            }
                        });
                        var index = layer.open({
                            type: 2,
                            title: "链接详情页面",
                            area: ['450px', '800px'],
                            fix: false,
                            maxmin: true,
                            shadeClose: true,
                            {#value: {"env": json.env},#}
                            shade: 0.4,
                            skin: 'layui-layer-rim',
                            content: ["{% url 'linkRead' %}", "no"],       // 链接详情页
                            success: function (layero, index) {
                                // 将列表页中选中行的数据oldValues,注入到iframe页面中对应的input框里
                                var body = layer.getChildFrame('body', index);
                                var iframeWindow = $(layero).find("iframe")[0].contentWindow;  // 获取当前iframe页面
                                var inputList = body.find("input");
                                console.log(inputList, "inputlist")
                                for (var i = 0; i < inputList.length; i++) {
                                    $(inputList[i]).val(oldValues[i])
                                }
                                console.log(inputList)
                            }
                        });
                        break;
                    case 'edit':
                        console.log("编辑链接")
                        var field = obj.field
                            , data = obj.data;
                        console.log(1, data)
                        var oldValues = [];
                        $.each(data, function (name, value) {    // 获取编辑行的原始数据
                            oldValues.push(value);
                        });
                        console.log(2, oldValues);
                        var index = layer.open({
                            type: 2,
                            title: "编辑链接页面",
                            area: ['450px', '800px'],
                            fix: false,
                            maxmin: true,
                            shadeClose: true,
                            shade: 0.4,
                            skin: 'layui-layer-rim',
                            btn: ["编辑", "取消"],
                            content: ["{% url 'linkEdit' %}", "no"],
                            yes: function (index, layero) {
                                // 将data传到编辑页面,然后,编辑页面将对应的id和修改后的数据一同传给后端
                                {#$('[lay-value="CA"]').click()#}
                                let json_data = $(layero).find("iframe")[0].contentWindow.callbackEditData(data);
                                console.log(5, json_data);
                                {#pause#}
                                $.ajax({
                                    url: "{% url 'editLinkApi' %}"      // 处理编辑数据,这里与查看不一样
                                    , type: "post"
                                    , async: false
                                    , cache: false
                                    , data: json_data
                                    , dataType: "json"
                                    , success: function (data) {
                                        location.reload()
                                    }
                                });
                                layer.close(index);
                            },
                            success: function (layero, index) {
                                var body = layer.getChildFrame('body', index); // 获取当前iframe页面的body
                                var iframeWindow = $(layero).find("iframe")[0].contentWindow;  // 获取当前iframe页面
                                var inputList = body.find('input');
                                for (var i = 0; i < inputList.length; i++) {
                                    $(inputList[i]).attr("value", oldValues[i + 1]); //遍历子窗口的input标签,将之前数组中的值一次放入显示
                                    {#$(inputList[i]).val(oldValues[i + 1]); //遍历子窗口的input标签,将之前数组中的值一次放入显示#}
                                }
                            }
                        });
                        break;
                    case 'del':
                        var delIndex = layer.confirm('真的删除id为' + data.id + "的信息吗?", function (delIndex) {
                            $.ajax({
                                url: '{% url "deleteLink" %}' + data.id,    // 单个删除,By_id
                                type: "post",
                                success: function (suc) {
                                    if (suc.code == 200) {
                                        {#obj.del(); //删除对应行(tr)的DOM结构,并更新缓存#}
                                        layer.msg("删除成功", {
                                            icon: 1
                                        });
                                        window.location.reload()
                                    } else {
                                        layer.msg("删除失败", {
                                            icon: 5
                                        });
                                    }
                                }
                            });
                            layer.close(delIndex);
                        });
                        break;
                }
            });
            form.render();
            form.on('submit(linkSearch)', function (data) {
                // 查询, 获取表单数据
                var formData = data.field;
                var id = formData.serviceCode,
                    env = formData.env,
                    server = formData.serverType,
                    area = formData.countryArea;

                table.reload('linkReload', {
                    page: {
                        curr: 1
                    },
                    where: {    // 查询条件
                        id: id,
                        env: env,
                        server: server,
                        area: area
                    },
                    method: 'post',
                    contentType: "application/json;charset=utf-8",
                    url: '{% url "searchLink" %}',      // 后端处理
                });
                return false;
            });
        });
    </script>

{% endblock %}
</body>
View Code

 

posted @ 2020-05-07 16:45  小心走火  阅读(1956)  评论(3编辑  收藏  举报