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 += ''+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(); 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}); }); } }); } 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 = "
" + "

IP:监听IP请勿随意修改

" + "

port: 监听端口,一般无需修改

" + "

dbPath:数据存储位置

" + "

path:日志文件位置

" + "

pidFilePath:PID保存路径

" + "

安全认证:"+body_auth+"

" + "
\ \ " + "
"; // 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 = '
\ \ \ \ \ \
\
\ \ \ \ \ \ '+ // ''+ '\ \ \ '+ list +'\
数据库名用户名密码备份备注操作
\
\
\
\ 同步选中\ 同步所有\ 从服务器获取\
\
\
'; $(".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: "
\
\ root密码\
\ \
\
\
", 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('执行成功!'); }); }