背景: 需要做一个列表页,管理内部所有链接
思路:先用前端画出列表页,然后实现列表的功能
列表页: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"></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', 150, title: 'ID', templet: function (data) { return data.LAY_INDEX } } , { field: 'env', 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', 150, title: '服务端', templet: function (data) { return '<span>' + data.server + '</span>' } } , { field: 'area', 150, title: '国家/地区', templet: function (data) { return '<span>' + data.area + '</span>' } } , { // , edit: 'text' 开启单元格编辑 field: 'link_details', 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>