function mgPost(method, version, args,callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
var req_data = {};
req_data['name'] = 'mongodb';
req_data['func'] = method;
req_data['version'] = version;
if (typeof(args) == 'string'){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/run', req_data, function(data) {
layer.close(loadT);
if (!data.status){
//错误展示10S
layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function mgPostN(method, version, args,callback){
var req_data = {};
req_data['name'] = 'mongodb';
req_data['func'] = method;
req_data['version'] = version;
if (typeof(args) == 'string'){
req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
$.post('/plugins/run', req_data, function(data) {
if (!data.status){
//错误展示10S
layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']});
return;
}
if(typeof(callback) == 'function'){
callback(data);
}
},'json');
}
function mgAsyncPost(method,args){
var _args = null;
if (typeof(args) == 'string'){
_args = JSON.stringify(toArrayObject(args));
} else {
_args = JSON.stringify(args);
}
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
return syncPost('/plugins/run', {name:'mongodb', func:method, args:_args});
}
function mongoStatus() {
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'mongodb', func:'run_info'}, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
var rdata = $.parseJSON(data.data);
var con = '
\
\
字段 | 当前值 | 说明 | \
\
host | ' + rdata.host + ' | 服务器 |
\
version | ' + rdata.version + ' | 版本 |
\
db_path | ' + rdata.db_path + ' | 数据路径 |
\
uptime | ' + rdata.uptime + ' | 已运行秒 |
\
connections | ' + rdata.connections + ' | 当前链接数 |
\
collections | ' + rdata.collections + ' | 文档数 |
\
insert | ' + rdata.pf['insert'] + ' | 插入命令数 |
\
query | ' + rdata.pf['query'] + ' | 查询命令数 |
\
update | ' + rdata.pf['update'] + ' | 更新命令数 |
\
delete | ' + rdata.pf['delete'] + ' | 删除命令数 |
\
getmore | ' + rdata.pf['getmore'] + ' | getmore命令数 |
\
command | ' + rdata.pf['command'] + ' | 执行命令数 |
\
\
';
$(".soft-man-con").html(con);
},'json');
}
function mongoDocStatus() {
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'mongodb', func:'run_doc_info'}, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
var rdata = $.parseJSON(data.data);
var t = '';
for(var i=0; i';
t += ''+rdata.dbs[i]["db"]+' | ';
t += ''+toSize(rdata.dbs[i]["totalSize"])+' | ';
t += ''+toSize(rdata.dbs[i]["storageSize"])+' | ';
t += ''+toSize(rdata.dbs[i]["dataSize"])+' | ';
t += ''+toSize(rdata.dbs[i]["indexSize"])+' | ';
t += ''+rdata.dbs[i]["indexes"]+' | ';
t += ''+rdata.dbs[i]["objects"]+' | ';
t += '';
}
// console.log(t);
var con = '\
\
库名 | 大小 | 存储大小 | 数据 | 索引 | 文档数据 | 对象 | \
'+t+'\
';
// console.log(rdata.dbs);
$(".soft-man-con").html(con);
},'json');
}
function mongoReplStatus() {
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
$.post('/plugins/run', {name:'mongodb', func:'run_repl_info'}, function(data) {
layer.close(loadT);
if (!data.status){
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
return;
}
var rdata = $.parseJSON(data.data);
var rdata = rdata.data;
var tbody = '';
if (rdata.status == '无'){
tbody += '无数据 |
';
} else{
tbody += '状态 | ' + rdata.status + ' | 主/从 |
\
同步文档 | ' + rdata.setName + ' | 文档名 |
\
hosts | ' + rdata.hosts + ' | 服务器所有节点 |
\
primary | ' + rdata.primary + ' | 主节点 |
\
me | ' + rdata.me + ' | 本机 |
';
}
// console.log(rdata);
var repl_on = 'btn-danger';
var repl_on_title = '未开启';
if ('repl_name' in rdata && rdata['repl_name'] != ''){
repl_on = '';
repl_on_title = '已开启';
}
var con = "\
Mongodb副本配置\
\
\
";
con += '\
\
字段 | 当前值 | 说明 | \
\
'+tbody+'\
\
\
';
$(".soft-man-con").html(con);
},'json');
}
//设置副本名称
function mongoReplCfgReplSetName(){
mgPost('run_doc_info', '', '', function(rdata){
var rdata = $.parseJSON(rdata.data);
layer.open({
type: 1,
area: '300px',
title: '设置副本名称',
closeBtn: 1,
shift: 5,
shadeClose: false,
btn:["提交","关闭"],
content: "",
success: function(){
// console.log(rdata);
var rlist = rdata['dbs'];
var dbs = [];
var selectHtml = '';
for (var i = 0; i < rlist.length; i++) {
// console.log(rlist[i]['db']);
var dbname = rlist[i]['db'];
if (['admin','local','config'].includes(dbname)){
} else {
dbs.push(dbname);
}
}
if (dbs.length == 0 ){
selectHtml += "";
}
for (index in dbs) {
selectHtml += "";
}
$('select[name="replSetName"]').html(selectHtml);
},
yes:function(index){
var data = {};
data['name'] = $('select[name=replSetName]').val();
mgPost('repl_set_name', '',data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
if (rdata['status']){
layer.close(index);
mongoReplCfgInit();
}
},{icon: rdata.status ? 1 : 2});
});
}
});
});
}
function mongoReplCfgNodes(){
var def_node = '127.0.0.1:27017';
layer.open({
type: 1,
area: '500px',
title: '添加节点',
closeBtn: 1,
shift: 5,
shadeClose: true,
btn:["提交","关闭"],
content: "",
yes:function(index){
// var data = $("#mod_pwd").serialize();
var data = {};
data['node'] = $('input[name=node]').val();
data['priority'] = $('input[name=priority]').val();
data['arbiterOnly'] = $('select[name=arbiterOnly]').val();
mgPost('repl_set_node', '',data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
if (rdata['status']){
layer.close(index);
mongoReplCfgInit();
}
},{icon: rdata.status ? 1 : 2},5000);
});
}
});
}
function mongoReplCfgDelNode(host){
mgPost('del_repl_node', '', {"node":host}, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata['status']);
showMsg(rdata.msg,function(){
if (rdata['status']){
mongoReplCfgInit();
}
},{icon: rdata.status ? 1 : 2});
});
}
function mongoReplCfgInit(){
mgPostN('get_repl_config', '', '', function(data){
var rdata = $.parseJSON(data.data);
$('#repl_name').html("同步副本:"+rdata.data['name']);
var node = '';
for (var i = 0; i < rdata.data['nodes'].length; i++) {
var t = rdata.data['nodes'][i];
var op = '删除';
node += ''+t['host']+' | '+op+' |
';
}
$('#repl_node tbody').html(node);
});
}
function mongoReplCfg(){
layer.open({
type: 1,
title: "副本设置",
area: ['580px', '380px'],
closeBtn: 1,
shadeClose: false,
btn: ["初始化","取消","添加节点","设置同步副本","关闭副本同步"],
content: '',
success:function(){
mongoReplCfgInit();
},
yes:function(){
mgPost('repl_init', '', '', function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
mongoReplStatus();
},{icon: rdata.status ? 1 : 2});
});
return false;
},
btn3:function(){
mongoReplCfgNodes();
return false;
},
btn4:function(){
mongoReplCfgReplSetName();
return false;
},
btn5:function(){
mgPost('repl_close', '', '', function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
if (rdata['status']){
mongoReplStatus();
}
},{icon: rdata.status ? 1 : 2});
});
return false;
}
});
}
//配置修改
function mongoSetConfig() {
mgPost('get_config', '','',function(data){
var rdata = $.parseJSON(data.data);
if (!rdata['status']){
layer.msg(rdata['msg']);
return;
}
rdata = rdata.data;
if (rdata['security']['authorization'] == 'enabled'){
var body_auth = '';
} else {
var body_auth = '';
}
var body = "";
// console.log(body);
$(".soft-man-con").html(body);
});
}
function mongoConfigAuth(){
mgPost('set_config_auth', '','',function(rdata){
var rdata = $.parseJSON(rdata.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function mongoConfigSave(){
var data = {};
data['bind_ip'] = $('input[name="bind_ip"]').val();
data['port'] = $('input[name="port"]').val();
data['data_path'] = $('input[name="data_path"]').val();
data['log'] = $('input[name="log"]').val();
data['pid_file_path'] = $('input[name="pid_file_path"]').val();
mgPost('set_config', '',data,function(rdata){
// console.log(rdata);
var rdata = $.parseJSON(rdata.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
}
function dbList(page, search){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
}
if(typeof(search) != 'undefined'){
_data['search'] = search;
}
_data['page'] = page;
_data['page_size'] = 10;
// console.log(_data);
mgPost('get_db_list', '',_data, function(data){
// console.log(data);
var rdata = $.parseJSON(data.data);
// console.log(rdata);
var list = '';
for(i in rdata.data){
list += '';
list +=' | ';
list += '' + rdata.data[i]['name'] +' | ';
list += '' + rdata.data[i]['username'] +' | ';
list += '' +
'***' +
''+
''+
' | ';
list += ''+rdata.data[i]['ps']+' | ';
list += '';
list += ''+(rdata.data[i]['is_backup']?'已备份':'未备份') +' | ';
list += '工具 | ' +
'权限 | ' +
'改密 | ' +
'删除' +
' | ';
list += '
';
}
//
// \
var con = '\
\
\
\
\
\
\
\
\
\
同步选中\
同步所有\
从服务器获取\
\
\
';
$(".soft-man-con").html(con);
$('#databasePage').html(rdata.page);
readerTableChecked();
});
}
function addDatabase(type){
layer.open({
type: 1,
area: '500px',
title: '添加数据库',
closeBtn: 1,
shift: 5,
shadeClose: true,
btn:["提交","关闭"],
content: "",
success:function(){
$("input[name='name']").keyup(function(){
var v = $(this).val();
$("input[name='db_user']").val(v);
$("input[name='ps']").val(v);
});
$('select[name="dataAccess"]').change(function(){
var v = $(this).val();
if (v == 'ip'){
$(this).after("");
} else {
$('#dataAccess_subid').remove();
}
});
},
yes:function(index) {
var data = $("#add_db").serialize();
data = decodeURIComponent(data);
var dataObj = toArrayObject(data);
if(!dataObj['address']){
dataObj['address'] = dataObj['dataAccess'];
}
mgPost('add_db', '',dataObj, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
if (rdata.status){
layer.close(index);
dbList();
}
},{icon: rdata.status ? 1 : 2}, 2000);
});
}
});
}
function setRootPwd(type, pwd){
if (type==1){
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
dbList();
},{icon: rdata.status ? 1 : 2});
});
return;
}
var index = layer.open({
type: 1,
area: '500px',
title: '修改数据库密码',
closeBtn: 1,
shift: 5,
btn:["提交", "关闭", "复制ROOT密码", "强制修改"],
shadeClose: true,
content: "",
yes:function(layerIndex){
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
},
btn3:function(){
var password = $("#MyPassword").val();
copyText(password);
return false;
},
btn4:function(layerIndex){
layer.confirm('强制修改,是为了在重建时使用,确定强制?', {
btn: ['确定', '取消']
}, function(index, layero){
layer.close(index);
var password = $("#MyPassword").val();
mgPost('set_root_pwd', '',{password:password,force:'1'}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layerIndex);
dbList();
},{icon: rdata.status ? 1 : 2});
});
});
return false;
}
});
}
function syncGetDatabase(){
mgPost('sync_get_databases', '', '', function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
dbList();
},{ icon: rdata.status ? 1 : 2 });
});
}
function showHidePass(obj){
var a = "glyphicon-eye-open";
var b = "glyphicon-eye-close";
if($(obj).hasClass(a)){
$(obj).removeClass(a).addClass(b);
$(obj).prev().text($(obj).prev().attr('data-pw'))
}
else{
$(obj).removeClass(b).addClass(a);
$(obj).prev().text('***');
}
}
function setDbPs(id, name, obj) {
var _span = $(obj);
var _input = $("");
_span.hide().after(_input);
_input.focus();
_input.blur(function(){
$(this).remove();
var ps = _input.val();
_span.text(ps).show();
var data = {name:name,id:id,ps:ps};
mgPost('set_db_ps', '',data, function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
});
});
_input.keyup(function(){
if(event.keyCode == 13){
_input.trigger('blur');
}
});
}
function delDb(id, name){
safeMessage('删除['+name+']','您真的要删除['+name+']吗?',function(){
var data='id='+id+'&name='+name;
mgPost('del_db', '', data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
dbList();
},{icon: rdata.status ? 1 : 2}, 600);
});
});
}
function delDbBatch(){
var arr = [];
$('input[type="checkbox"].check:checked').each(function () {
var _val = $(this).val();
var _name = $(this).parent().next().text();
if (!isNaN(_val)) {
arr.push({'id':_val,'name':_name});
}
});
safeMessage('批量删除数据库','您共选择了[2]个数据库,删除后将无法恢复,真的要删除吗?',function(){
var i = 0;
$(arr).each(function(){
var data = mgAsyncPost('del_db', this);
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,time:2000,shade: [0.3, '#000']});
}
i++;
});
var msg = '成功删除['+i+']个数据库!';
showMsg(msg,function(){
dbList();
},{icon: 1}, 600);
});
}
function setDbPass(id, username, password){
layer.open({
type: 1,
area: '500px',
title: '修改数据库密码',
closeBtn: 1,
shift: 5,
shadeClose: true,
btn:["提交","关闭"],
content: "",
yes:function(index){
// var data = $("#mod_pwd").serialize();
var data = {};
data['name'] = $('input[name=name]').val();
data['password'] = $('#MyPassword').val();
data['id'] = $('input[name=id]').val();
mgPost('set_user_pwd', '',data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(index);
dbList();
},{icon: rdata.status ? 1 : 2});
});
}
});
}
function repTools(db_name, res){
mgPost('get_db_info', '', {name:db_name}, function(data){
var rdata = $.parseJSON(data.data);
var rdata = rdata.data;
// console.log(rdata.collection_list);
var tbody = '';
for (var i = 0; i < rdata.collection_list.length; i++) {
tbody += '\
' + rdata.collection_list[i].collection_name + ' | \
' + rdata.collection_list[i].count + ' | \
' + toSize(rdata.collection_list[i].size) + ' | \
' + toSize(rdata.collection_list[i].avg_obj_size) + ' | \
' + toSize(rdata.collection_list[i].storage_size) + ' | \
' + rdata.collection_list[i].nindexes + ' | \
' + toSize(rdata.collection_list[i].total_index_size) + ' | \
'
}
layer.open({
type: 1,
title: "MongoDB工具箱【" + db_name + "】",
area: ['780px', '480px'],
closeBtn: 1,
shadeClose: false,
content: '\
\
\
\
\
\
\
集合名称 | \
文档数量 | \
内存中的大小 | \
对象平均大小 | \
存储大小 | \
索引数量 | \
索引大小 | \
\
\
' + tbody + '\
\
\
\
'
});
tableFixed('database_fix');
});
}
function syncToDatabase(type){
var data = [];
$('input[type="checkbox"].check:checked').each(function () {
if (!isNaN($(this).val())) data.push($(this).val());
});
var postData = 'type='+type+'&ids='+JSON.stringify(data);
mgPost('sync_to_databases', '',postData, function(data){
var rdata = $.parseJSON(data.data);
// console.log(rdata);
showMsg(rdata.msg,function(){
dbList();
},{ icon: rdata.status ? 1 : 2 });
});
}
function setDbAccess(username,name){
mgPost('get_db_access','','username='+username, function(data){
var rdata = $.parseJSON(data.data);
if (!rdata.status){
layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']});
return;
}
var db_roles = rdata.data.roles;
var all_roles = rdata.data.all_roles;
// console.log(all_roles);
var role_list;
var index = layer.open({
type: 1,
area: '500px',
title: '设置数据库权限',
closeBtn: 1,
shift: 5,
btn:["提交","取消"],
shadeClose: true,
content: "",
success:function(layers, index){
document.getElementById('layui-layer' + index).getElementsByClassName('layui-layer-content')[0].style.overflow = 'unset';
var role_data = [];
for (var i = 0; i < db_roles.length; i++) {
var t = {};
t['name'] = db_roles[i]['role'];
t['value'] = db_roles[i]['role'];
role_data.push(t);
}
role_list = xmSelect.render({
el: '#role_list',
language: 'zn',
toolbar: {show: true,},
paging: false,
data: role_data,
});
var pdata = [];
for (var i = 0; i < all_roles.length; i++) {
var tval = all_roles[i];
var isSelected = false;
for (var db_i = 0; db_i < db_roles.length; db_i++) {
var db_name = db_roles[db_i]['role'];
if (db_name == tval['role']){
isSelected = true;
}
}
var t = {name:tval['name'],value:tval['role']};
if (isSelected){
t = {name:tval['name'],value:tval['role'], selected: true};
}
pdata.push(t);
}
role_list.update({data:pdata});
},
yes:function(index){
var data = $("#set_db_access").serialize();
data = decodeURIComponent(data);
var dataObj = toArrayObject(data);
dataObj['username'] = username;
dataObj['name'] = name;
mgPost('set_db_access', '',dataObj, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(index);
dbList();
},{icon: rdata.status ? 1 : 2});
});
}
});
});
}
function setBackup(db_name){
var layerIndex = layer.open({
type: 1,
title: "数据库[MongoDB]备份详情",
area: ['600px', '280px'],
closeBtn: 1,
shadeClose: false,
content: '\
\
\
\
\
\
\
\
\
\
文件名称 | \
文件大小 | \
备份时间 | \
操作 | \
\
\
\
\
\
\
',
success:function(index){
$('#btn_backup').click(function(){
mgPost('set_db_backup', '',{name:db_name}, function(data){
showMsg('执行成功!', function(){
setBackupReq(db_name);
}, {icon:1}, 2000);
});
});
$('#btn_local_import').click(function(){
setLocalImport(db_name);
});
setBackupReq(db_name);
},
});
}
function setBackupReq(db_name, obj){
mgPost('get_db_backup_list', '', {name:db_name}, function(data){
var rdata = $.parseJSON(data.data);
var tbody = '';
for (var i = 0; i < rdata.data.length; i++) {
tbody += '\
' + rdata.data[i]['name'] + ' | \
' + rdata.data[i]['size'] + ' | \
' + rdata.data[i]['time'] + ' | \
\
导入 | \
下载 | \
删除\
| \
';
}
$('#database_table tbody').html(tbody);
});
}
function delBackup(filename, name, path){
if(typeof(path) == "undefined"){
path = "";
}
mgPost('delete_db_backup','',{filename:filename,path:path},function(){
layer.msg('执行成功!');
setTimeout(function(){
setBackupReq(name);
},2000);
});
}
function downloadBackup(file){
window.open('/files/download?filename='+encodeURIComponent(file));
}
function importBackup(file,name){
mgPost('import_db_backup','',{file:file,name:name}, function(data){
layer.msg('执行成功!');
});
}
function setLocalImport(db_name){
//上传文件
function uploadDbFiles(upload_dir){
var up_db = layer.open({
type:1,
closeBtn: 1,
title:"上传导入文件["+upload_dir+']',
area: ['500px','300px'],
shadeClose:false,
content:'\
\
\
\
\
\
\
文件编码:\
\
\
\
\
',
success:function(){
$('#filesClose').click(function(){
layer.close(up_db);
});
}
});
uploadStart(function(){
getList();
layer.close(up_db);
});
}
function getList(){
mgPost('get_db_backup_import_list','',{}, function(data){
var rdata = $.parseJSON(data.data);
var file_list = rdata.data.list;
var upload_dir = rdata.data.upload_dir;
var tbody = '';
for (var i = 0; i < file_list.length; i++) {
tbody += '\
' + file_list[i]['name'] + ' | \
' + file_list[i]['size'] + ' | \
' + file_list[i]['time'] + ' | \
\
导入 | \
删除\
| \
';
}
$('#import_db_file_list').html(tbody);
$('input[name="upload_dir"]').val(upload_dir);
$("#import_db_file_list .del").on('click',function(){
var index = $(this).attr('index');
var filename = file_list[index]["name"];
mgPost('delete_db_backup','',{filename:filename,path:upload_dir},function(){
showMsg('执行成功!', function(){
getList();
},{icon:1},2000);
});
});
});
}
var layerIndex = layer.open({
type: 1,
title: "从文件导入数据",
area: ['600px', '380px'],
closeBtn: 1,
shadeClose: false,
content: '\
\
\
\
\
\
\
\
\
\
文件名称 | \
文件大小 | \
备份时间 | \
操作 | \
\
\
\
\
\
\
- 仅支持sql、zip、sql.gz、(tar.gz|gz|tgz)
\
- zip、tar.gz压缩包结构:test.zip或test.tar.gz压缩包内,必需包含test.sql
\
- 若文件过大,您还可以使用SFTP工具,将数据库文件上传到/www/backup/import
\
\
\
',
success:function(index){
$('#btn_file_upload').click(function(){
var upload_dir = $('input[name="upload_dir"]').val();
uploadDbFiles(upload_dir);
});
getList();
},
});
}
function importDbExternal(file,name){
mgPost('import_db_external','',{file:file,name:name}, function(data){
layer.msg('执行成功!');
});
}