/** * 数据库备份 / 还原 * * 权限按钮用完整权限名(database:backup / database:restore / database:delete / database:optimize), * 表格渲染后由 auth.filterDom() 移除无权限按钮。 */ layui.define(['table', 'layer', 'form', 'util', 'element', 'auth', 'http', 'jquery'], function (exports) { var table = layui.table, layer = layui.layer, form = layui.form, auth = layui.auth, http = layui.http, $ = layui.jquery; // 注意:http 的 baseURL 为空,URL 由浏览器按「当前页面所在目录」解析, // 核心后台页面的目录就是 /admin//,所以这里只写动作名(纯相对), // 写成 'database/index' 会被解析成 /admin/database/database/index(404)。 var FUNC = { index: 'index', backup: 'backup', recovery: 'recovery', delete: 'delete', optimize: 'optimize', download: 'download' }; /** * 统一的响应处理:Result 返回 {code, message, data, count} */ function parse(res) { return { code: res.code, msg: res.message, count: res.count || 0, data: res.data || [] }; } /** * 提交型请求 */ function post(url, data, okTip, done) { var loading = layer.load(2); http.post(url, data).then(function (res) { layer.close(loading); if (res && res.code === 0) { layer.msg(okTip || res.message || '操作成功', {icon: 1}); if (done) { done(res.data); } } else { layer.msg((res && res.message) || '操作失败', {icon: 2}); } }).catch(function (err) { layer.close(loading); layer.msg('请求失败:' + (err && err.message ? err.message : '网络异常'), {icon: 2}); }); } /** * 取当前勾选的表名 */ function checkedTables() { var rows = table.checkStatus('tableList').data || []; var names = []; for (var i = 0; i < rows.length; i++) { names.push(rows[i].name); } return names; } var obj = { renderTable: function () { table.render({ elem: '#tableList', url: FUNC.index, where: {type: 'table'}, toolbar: '#tableBar', defaultToolbar: ['filter'], method: 'get', cols: [[ {type: 'checkbox', width: 50}, {field: 'name', title: '表名', minWidth: 220}, {field: 'comment', title: '备注', minWidth: 160}, {field: 'engine', title: '引擎', width: 100}, {field: 'rows', title: '行数', width: 110, sort: true}, {field: 'size_text', title: '大小', width: 110} ]], page: true, limit: 15, limits: [15, 30, 50, 100], response: {statusCode: 0}, parseData: parse, done: function () { var view = $('#tableList').next('.layui-table-view'); auth.filterDom(view); auth.filterDom('.layui-btn[data-perm]'); } }); }, renderBackup: function () { table.render({ elem: '#backupList', url: FUNC.index, where: {type: 'backup'}, toolbar: '#backupBar', method: 'get', cols: [[ {field: 'name', title: '备份名', minWidth: 220}, {field: 'parts', title: '分卷', width: 80}, {field: 'size_text', title: '大小', width: 110}, {field: 'time_text', title: '时间', width: 180, sort: true}, {title: '操作', width: 190, templet: '#backupAction', fixed: 'right'} ]], page: true, limit: 15, response: {statusCode: 0}, parseData: parse, done: function () { var view = $('#backupList').next('.layui-table-view'); auth.filterDom(view); auth.filterDom('.layui-btn[data-perm]'); } }); }, events: function () { // 数据表工具条 table.on('toolbar(tableList)', function (o) { if (o.event === 'backupSelected' || o.event === 'backupAll') { var names = o.event === 'backupAll' ? [] : checkedTables(); if (o.event === 'backupSelected' && names.length === 0) { return layer.msg('请先勾选要备份的表', {icon: 2}); } layer.confirm( o.event === 'backupAll' ? '确认备份全部数据表?' : '确认备份选中的 ' + names.length + ' 张表?', {title: '备份确认'}, function (index) { layer.close(index); post(FUNC.backup, {tables: names, part_size: 2097152}, '备份完成', function () { table.reload('backupList'); }); } ); } else if (o.event === 'optimize') { var opts = checkedTables(); if (opts.length === 0) { return layer.msg('请先勾选要优化的表', {icon: 2}); } post(FUNC.optimize, {tables: opts}, '优化完成', function () { table.reload('tableList'); }); } }); // 备份记录工具条 table.on('toolbar(backupList)', function (o) { if (o.event === 'reload') { table.reload('backupList'); } }); // 备份记录行操作 table.on('tool(backupList)', function (o) { if (o.event === 'download') { window.open(FUNC.download + '?name=' + encodeURIComponent(o.data.name)); } else if (o.event === 'recovery') { layer.confirm( '还原会覆盖当前同名表的数据,确定继续?
建议先做一次新备份', {title: '危险操作', btn: ['确定还原', '取消']}, function (index) { layer.close(index); post(FUNC.recovery, {name: o.data.name}, '还原完成', function () { table.reload('tableList'); }); } ); } else if (o.event === 'delete') { layer.confirm('确定删除该备份?', {title: '提示'}, function (index) { layer.close(index); post(FUNC.delete, {name: o.data.name}, '已删除', function () { table.reload('backupList'); }); }); } }); // 搜索 form.on('submit(data-search-btn)', function (o) { table.reload('tableList', {where: {keyword: o.field.keyword}, page: {curr: 1}}); return false; }); $('#btn-reset').on('click', function () { setTimeout(function () { table.reload('tableList', {where: {keyword: ''}, page: {curr: 1}}); }, 10); }); // 切 tab 时修正列宽(隐藏时渲染的表格宽度会算错) layui.element.on('tab(dbTab)', function () { table.resize('tableList'); table.resize('backupList'); }); } }; obj.renderTable(); obj.renderBackup(); obj.events(); exports('database', obj); });