mirror of https://github.com/1099438829/apeblog
275 lines
11 KiB
HTML
275 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh">
|
|
<head>
|
|
<title>{$mate_title} - {:system_config('title')}后台管理系统</title>
|
|
{include file="public/header" /}
|
|
<style>
|
|
.div-backdata {
|
|
width: 400px;
|
|
padding: 60px 20px;
|
|
text-align: center;
|
|
}
|
|
|
|
.div-backdata .layui-icon {
|
|
font-size: 50px;
|
|
margin-bottom: 10px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container-fluid p-t-15">
|
|
<div class="col-lg-12">
|
|
<div class="card">
|
|
<ul class="nav nav-tabs page-tabs">
|
|
<li class="active"><a href="#!">备份数据库</a></li>
|
|
<li><a href="/admin/databases/index?type=import">还原数据库</a></li>
|
|
</ul>
|
|
<div class="tab-content">
|
|
<div class="tab-pane active">
|
|
<div id="toolbar" class="toolbar-btn-action">
|
|
<button type="button" class="btn btn-success btn-primary m-r-5" id="btn-export">
|
|
<span aria-hidden="true">立即备份</span>
|
|
</button>
|
|
<button type="button" class="btn btn-success m-r-5" id="btn-optimize">
|
|
<span aria-hidden="true">优化表</span>
|
|
</button>
|
|
<button type="button" class="btn btn-success m-r-5" id="btn-repair">
|
|
<span aria-hidden="true">修复表</span>
|
|
</button>
|
|
</div>
|
|
<table id="tb_departments"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{include file="public/footer"/}
|
|
<script type="text/javascript">
|
|
var loadIndex;
|
|
$('#tb_departments').bootstrapTable({
|
|
classes: 'table table-bordered table-hover table-striped',
|
|
url: '/admin/databases/Lst',
|
|
method: 'post',
|
|
dataType: 'json', // 因为本示例中是跨域的调用,所以涉及到ajax都采用jsonp,
|
|
uniqueId: 'id',
|
|
idField: 'id', // 每行的唯一标识字段
|
|
toolbar: '#toolbar', // 工具按钮容器
|
|
showColumns: false, // 是否显示所有的列
|
|
showRefresh: false, // 是否显示刷新按钮
|
|
responseHandler: function (res) {
|
|
return {
|
|
"total": res.count,
|
|
"rows": res.data,
|
|
};
|
|
},
|
|
pagination: false,
|
|
queryParams: function (params) {
|
|
let temp = toArrayList($(".searchForm").serializeArray());
|
|
return temp;
|
|
},
|
|
columns: [{
|
|
checkbox: true, // 是否显示复选框
|
|
}, {
|
|
field: 'name',
|
|
title: '表名'
|
|
}, {
|
|
field: 'rows',
|
|
title: '数据量',
|
|
}, {
|
|
field: 'data_length',
|
|
title: '数据大小',
|
|
formatter: function (value, row, index) {
|
|
return renderSize(value);
|
|
}
|
|
}, {
|
|
field: 'create_time',
|
|
title: '创建时间',
|
|
}, {
|
|
field: 'operate',
|
|
title: '操作',
|
|
formatter: function (value, row, index) {
|
|
let html = '<a href="#!" class="btn btn-xs btn-default m-r-5 btn-optimize" title="优化表" data-toggle="tooltip" data-trigger="hover"><i class="mdi mdi-rotate-3d"></i></a> \n' +
|
|
'<a class="btn btn-xs btn-default btn-repair" href="#!" title="修复表" data-toggle="tooltip" data-trigger="hover"><i class="mdi mdi-rotate-right-variant"></i></a>';
|
|
return html;
|
|
},
|
|
events: {
|
|
'click .btn-optimize': function (event, value, row, index) {
|
|
$.ajax({
|
|
type: "post",
|
|
url: "/admin/databases/optimize",
|
|
data: {ids: row.name},
|
|
success: function (res) {
|
|
if (res.code == 200 || res.status == 200) {
|
|
parent.lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
} else {
|
|
parent.lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
}
|
|
},
|
|
complete: function () {
|
|
}
|
|
});
|
|
},
|
|
'click .btn-repair': function (event, value, row, index) {
|
|
$.ajax({
|
|
type: "post",
|
|
url: "/admin/databases/repair",
|
|
data: {ids: row.name},
|
|
success: function (res) {
|
|
if (res.code == 200 || res.status == 200) {
|
|
parent.lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
} else {
|
|
parent.lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
}
|
|
},
|
|
complete: function () {
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}],
|
|
onLoadSuccess: function (data) {
|
|
$("[data-toggle='tooltip']").tooltip();
|
|
}
|
|
});
|
|
|
|
//格式化文件大小
|
|
function renderSize(value) {
|
|
if (null == value || value == '') {
|
|
return "0 Bytes";
|
|
}
|
|
var unitArr = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
var index = 0;
|
|
var srcsize = parseFloat(value);
|
|
index = Math.floor(Math.log(srcsize) / Math.log(1024));
|
|
var size = srcsize / Math.pow(1024, index);
|
|
size = size.toFixed(2);//保留的小数位数
|
|
return size + unitArr[index];
|
|
}
|
|
|
|
$("#btn-export").click(function () {
|
|
var checkID = [];
|
|
var selectedItem = $('#tb_departments').bootstrapTable('getAllSelections');
|
|
if (selectedItem == "") return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
for (var i = 0; i < selectedItem.length; i++) {
|
|
checkID.push(selectedItem[i]['name']);
|
|
}
|
|
if (checkID.length == 0) return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
loadIndex = layer.open({
|
|
type: 1,
|
|
title: '',
|
|
area: '440px',
|
|
skin: 'layui-layer-demo', //样式类名
|
|
closeBtn: 0, //不显示关闭按钮
|
|
anim: 2,
|
|
content: '<div id="div-backdata" class="div-backdata"><span class="mdi mdi-36px mdi-spin mdi-loading"></span><div class="content">正在备份数据库,请稍等...</div></div>'
|
|
});
|
|
|
|
$.post("/admin/databases/export", data = {ids: checkID.join(',')}, function (res) {
|
|
if (res.status == 200) {
|
|
updateBackDataInfo("开始备份,请不要关闭本页面!");
|
|
backup(res.data.tab);
|
|
window.onbeforeunload = function () {
|
|
return "正在备份数据库,请不要关闭!"
|
|
}
|
|
} else {
|
|
layer.close(loadIndex);
|
|
layer.msg(res.msg ? res.msg : '操作失败', {icon: 2, time: 3 * 1000});
|
|
}
|
|
}, "json")
|
|
return false;
|
|
})
|
|
|
|
function updateBackDataInfo(info) {
|
|
$('#div-backdata>.content', parent.document).text(info);
|
|
}
|
|
|
|
function backup(tab) {
|
|
$.get("/admin/databases/export", tab, function (res) {
|
|
if (res.status == 200) {
|
|
updateBackDataInfo(res.msg);
|
|
if (res.data.length == 0) {
|
|
console.log(res.msg, res.data)
|
|
layer.close(loadIndex);
|
|
layer.msg(res.msg ? res.msg : '操作成功', {icon: 1, time: 3 * 1000});
|
|
window.onbeforeunload = function () {
|
|
return null
|
|
}
|
|
return;
|
|
}
|
|
backup(res.data.tab);
|
|
} else {
|
|
layer.close(loadIndex);
|
|
layer.msg(res.msg ? res.msg : '操作失败', {icon: 2, time: 3 * 1000});
|
|
}
|
|
}, "json");
|
|
}
|
|
|
|
$("#btn-optimize").click(function () {
|
|
var checkID = [];
|
|
var selectedItem = $('#tb_departments').bootstrapTable('getAllSelections');
|
|
if (selectedItem.length == 0) return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
for (var i = 0; i < selectedItem.length; i++) {
|
|
checkID.push(selectedItem[i]['name'])
|
|
}
|
|
if (checkID.length == 0) return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
$.confirm({
|
|
title: '重要提醒!',
|
|
content: '您确认要执行该操作吗?',
|
|
backgroundDismiss: true,
|
|
buttons: {
|
|
ok: {
|
|
text: '确认',
|
|
btnClass: 'btn-danger',
|
|
action: function () {
|
|
$.post("/admin/databases/optimize", data = {ids: checkID.toString()}, function (res) {
|
|
if (res.code == 200) {
|
|
lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
location.reload();
|
|
} else lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
})
|
|
}
|
|
},
|
|
cancel: {
|
|
text: '取消',
|
|
btnClass: 'btn-primary'
|
|
}
|
|
}
|
|
});
|
|
})
|
|
|
|
$("#btn-repair").click(function () {
|
|
var checkID = [];
|
|
var selectedItem = $('#tb_departments').bootstrapTable('getAllSelections');
|
|
if (selectedItem.length == 0) return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
for (var i = 0; i < selectedItem.length; i++) {
|
|
checkID.push(selectedItem[i]['name'])
|
|
}
|
|
if (checkID.length == 0) return lightyear.notify("没有选中项", 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
$.confirm({
|
|
title: '重要提醒!',
|
|
content: '您确认要执行该操作吗?',
|
|
backgroundDismiss: true,
|
|
buttons: {
|
|
ok: {
|
|
text: '确认',
|
|
btnClass: 'btn-danger',
|
|
action: function () {
|
|
$.post("/admin/databases/repair", data = {ids: checkID.toString()}, function (res) {
|
|
if (res.code == 200) {
|
|
lightyear.notify(res.msg, 'success', 3000, 'mdi mdi-emoticon-happy', 'top', 'center');
|
|
location.reload();
|
|
} else lightyear.notify(res.msg, 'danger', 3000, 'mdi mdi-emoticon-neutral', 'top', 'center');
|
|
})
|
|
}
|
|
},
|
|
cancel: {
|
|
text: '取消',
|
|
btnClass: 'btn-primary'
|
|
}
|
|
}
|
|
});
|
|
})
|
|
</script>
|
|
</body>
|
|
</html> |