Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 18.219.31.133
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
www /
server /
panel /
BTPanel /
static /
js /
[ HOME SHELL ]
Name
Size
Permission
Action
Validform_v5.3.2_min.js
20.17
KB
-rwxr-xr-x
aes.js
22.15
KB
-rwxr-xr-x
bootstrap-select.min.js
30.91
KB
-rwxr-xr-x
bootstrap.min.js
35.95
KB
-rwxr-xr-x
bt_upload.js
6.46
KB
-rwxr-xr-x
china.js
60.38
KB
-rwxr-xr-x
clipboard.min.js
10.41
KB
-rwxr-xr-x
config.js
62.92
KB
-rwxr-xr-x
control.js
43.36
KB
-rwxr-xr-x
countryCode.json
27.27
KB
-rwxr-xr-x
crontab.js
61.74
KB
-rwxr-xr-x
database.js
103.01
KB
-rwxr-xr-x
docker.js
151.43
KB
-rwxr-xr-x
echarts.min.js
950.32
KB
-rwxr-xr-x
files.js
233.97
KB
-rwxr-xr-x
files.min.js
121.19
KB
-rwxr-xr-x
firewall.js
102.42
KB
-rwxr-xr-x
i18next.min.js
47.94
KB
-rwxr-xr-x
index.html
0
B
-rwxr-xr-x
index.js
123.52
KB
-rwxr-xr-x
jquery-1.10.2.min.js
90.88
KB
-rwxr-xr-x
jquery-2.2.4.min.js
83.57
KB
-rwxr-xr-x
jquery-ui.min.js
247.72
KB
-rwxr-xr-x
jquery.contextify.min.js
2.7
KB
-rwxr-xr-x
jquery.dragsort-0.5.2.min.js
8.92
KB
-rwxr-xr-x
jquery.fly.min.js
1.79
KB
-rwxr-xr-x
jquery.i18n.properties.js
16.59
KB
-rwxr-xr-x
jquery.qrcode.min.js
13.67
KB
-rwxr-xr-x
jsencrypt.min.js
175.64
KB
-rwxr-xr-x
logs.js
39.53
KB
-rwxr-xr-x
md5.js
8.34
KB
-rwxr-xr-x
polyfill.js
9.31
KB
-rwxr-xr-x
polyfill.min.js
520
B
-rwxr-xr-x
public.js
231.13
KB
-rwxr-xr-x
public_backup.js
352.53
KB
-rwxr-xr-x
qrcode.min.js
19.46
KB
-rwxr-xr-x
requestAnimationFrame.js
901
B
-rwxr-xr-x
site.js
458.68
KB
-rwxr-xr-x
socket.io.min.js
63.54
KB
-rwxr-xr-x
soft.js
266.85
KB
-rwxr-xr-x
term.js
48.74
KB
-rwxr-xr-x
tools.js
130.2
KB
-rwxr-xr-x
tools.min.js
80.67
KB
-rwxr-xr-x
upload-drog.js
38.45
KB
-rwxr-xr-x
upload.js
8.11
KB
-rwxr-xr-x
xterm.js
295.86
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : database.js
var database = { // 远程服务器列表 cloudDatabaseList: [], // 远程服务器表格实例 dbCloudServerTable: null, // 初始化 init: function () { this.event(); var type = this.getType(); $('.database-pos .tabs-item[data-type="' + type + '"]').trigger('click'); }, // 事件 event: function () { var that = this; // 切换分类 $('.database-pos .tabs-item').click(function () { var index = $(this).index(); var type = $(this).data('type'); bt.set_cookie('db_page_model', type); $(this).addClass('active').siblings().removeClass('active'); $('.db_table_view .tab-con .tab-con-block').eq(index).removeClass('hide').siblings().addClass('hide'); // 获取远程数据库 that.getCloudDatabase(function () { that.getDatabaseList(); }); }); // 安装数据库插件 $('.prompt_description').on('click', '.btn-install-mysql', function () { var db_type = that.getType(); if (db_type == 'pgsql') { // 判断是否安装插件 bt.soft.get_soft_find('pgsql_manager', function (rdata) { for (var i = 0; i < rdata.versions.length; i++) { // 判断是否安装版本 if (rdata.versions[i].setup == true) { bt.soft.set_lib_config('pgsql_manager', 'PostgreSQL管理器') break; }else{ bt.soft.install('pgsql_manager') break; } } }); } else { bt.soft.install(db_type); } }); // 添加远程数据库 $('.prompt_description').on('click', '.btn-add-cloud-server', function () { that.render_db_cloud_server_view(); }); redis.event(); }, // 获取当前分类 getType: function () { return bt.get_cookie('db_page_model') || 'mysql'; }, // 通过分类获取当前数据库 getDatabaseList: function (config) { var type = this.getType(); switch (type) { case 'mysql': mysql.getDatabaseList(config); break; case 'sqlserver': sqlserver.getDatabaseList(config); break; case 'mongodb': bt_tools.send({ url: 'database/' + type + '/get_root_pwd' }, function (_status) { mongodb.mongoDBAccessStatus = _status.authorization == 'enabled' ? true : false; mongodb.getDatabaseList(config); }); break; case 'redis': redis.getDatabaseList(config); break; case 'pgsql': pgsql.getDatabaseList(config); break; } }, // 获取远程数据库 getCloudDatabase: function (callback) { var that = this; var type = this.getType(); var params = { url: 'database?action=GetCloudServer', data: { type: type }, }; if (type != 'mysql') { params.url = 'database/' + type + '/GetCloudServer'; params.data = { data: JSON.stringify({ type: type }) }; } bt_tools.send( params, function (cloudData) { that.cloudDatabaseList = cloudData; // 是否安装本地或远程服务器 if (cloudData.length <= 0) { var tips = lan.database.cloud_not_config1 + ', <a class="btlink btn-install-mysql">Click install</a> | <a class="btlink btn-add-cloud-server">' + lan.database.add_cloud_btn + '</a>'; if (type == 'sqlserver') tips = lan.database.cloud_not_config2 + ', <a class="btlink btn-add-cloud-server">' + lan.database.add_cloud_btn + '</a>'; $('.mask_layer').removeClass('hide'); $('.prompt_description').html(tips); } else { $('.mask_layer').addClass('hide'); } // 渲染远程数据库列表 that.renderCloudServerSelect(); // 渲染远程数据库表格 that.renderCloudServerTable(); callback && callback(cloudData); }, lan.database.get_cloud_list_tips ); }, // 获取程服务器列表 getCloudServerList: function (callback) { var list = this.cloudDatabaseList; var cloudList = []; $.each(list, function (index, item) { var ps = item.ps; var host = item.db_host; if (!ps || !host) return; var tips = ps != '' ? ps + ' (' + host + ')' : host; cloudList.push({ title: tips, value: item.id }); }); callback && callback(cloudList); }, // 渲染远程数据库选择框 renderCloudServerSelect: function () { var that = this; var type = this.getType(); var idMap = { mysql: '#bt_database_table', sqlserver: '#bt_sqldatabase_table', mongodb: '#bt_mongodb_table', pgsql: '#bt_pgsql_table', } var id = idMap[type]; if ($(id + ' .database_type_select_filter').length == 0) { $(id + ' .bt_search').before('<select class="bt-input-text mr5 database_type_select_filter" style="width: 120px" name="db_type_filter_' + type + '"></select>'); $(id + ' .database_type_select_filter').change(function () { that.getDatabaseList({ isInit: true }); }); } var option = '<option value="all">' + lan.public.all + '</option>'; $.each(this.cloudDatabaseList, function (index, item) { var tips = item.ps != '' ? item.ps : item.db_host; option += '<option value="' + item.id + '">' + tips + '</option>'; }); $(id + ' .database_type_select_filter').html(option); }, // 打开远程服务器列表弹框 open_cloud_server: function () { var that = this; var $layer = null; bt_tools.open({ title: lan.database.cloud_server_list, area: '860px', btn: false, skin: 'databaseCloudServer', content: '<div id="db_cloud_server_table" class="pd20"></div>', success: function (layero) { $layer = layero; this.getServerTable(); that.getCloudDatabase(); }, getServerTable: function () { var _that = this; that.dbCloudServerTable = bt_tools.table({ el: '#db_cloud_server_table', data: [], default: lan.database.cloud_server_empty, height: 300, column: [ { fid: 'db_host', title: lan.database.server_address, width: 100, template: function (item) { return '<span class="flex"><span class="text-overflow" title="' + item.db_host + '">' + item.db_host + '</span></span>'; }, }, { fid: 'db_port', width: 80, title: lan.database.port, }, { fid: 'db_type', width: 110, title: lan.database.type, }, { fid: 'db_user', width: 90, title: lan.database.user, }, { fid: 'db_password', width: 190, type: 'password', title: lan.database.add_pass, copy: true, eye_open: true, }, { fid: 'ps', title: lan.database.add_ps, template: function (item) { var ps = item.ps; return '<span class="flex"><span class="text-overflow" title="' + ps + '">' + ps + '</span></span>'; }, }, { type: 'group', width: 130, title: lan.database.operation, align: 'right', group: [ { title: 'Get DB', event: function (row) { bt.database.sync_database(row.id, function (rdata) { if (rdata.status) { that.getDatabaseList(); } }); }, }, { title: lan.public.edit, event: function (row) { that.render_db_cloud_server_view(row, true); }, }, { title: lan.public.del, event: function (row) { that.del_db_cloud_server(row); }, }, ], }, ], tootls: [ { type: 'group', positon: ['left', 'top'], list: [ { title: lan.public.add + ' ' + lan.database.cloud_server, active: true, event: function () { that.render_db_cloud_server_view(); }, }, ], }, ], success: function (config) { that.cloudDatabaseList = config.data; _that.setLayerCenter(); }, }); }, // 设置弹窗居中 setLayerCenter: function () { if (!$layer) return; var height = $(window).height(); var layerHeight = $layer.height(); var top = (height - layerHeight) / 2; $layer.css('top', top); }, }); }, // 渲染远程数据库表格 renderCloudServerTable: function () { if (this.dbCloudServerTable) { var list = this.cloudDatabaseList; var data = []; for (var i = 0; i < list.length; i++) { var element = list[i]; if(element.id == 0) continue data.push(element) } this.dbCloudServerTable.$reader_content(data); } }, // 添加/编辑远程服务器视图 render_db_cloud_server_view: function (config, is_edit) { var that = this; if (!config) { var type = this.getType(); var dataMap = { mysql: { user: 'root', port: '3306' }, sqlserver: { user: 'sa', port: '1433' }, redis: { user: 'root', port: '6379' }, mongodb: { user: 'root', port: '27017' }, pgsql: { user: 'postgres', port: '5432' }, } config = { db_host: '', db_port: dataMap[type].port, db_user: '', db_password: '', db_user: dataMap[type].user, ps: '', }; } var title = is_edit ? lan.public.edit : lan.public.add; bt_tools.open({ title: title + ' ' + lan.database.cloud_server, area: '460px', btn: [lan.public.save, lan.public.cancel], skin: 'addCloudServerProject', content: { class: 'pd20', form: [ { label: lan.database.server_address, group: { type: 'text', name: 'db_host', width: '260px', value: config.db_host, placeholder: lan.database.input_server_address, event: function () { $('[name=db_host]').on('input', function () { $('[name=db_ps]').val($(this).val()); }); }, }, }, { label: lan.database.port, group: { type: 'number', name: 'db_port', width: '260px', value: config.db_port, placeholder: lan.database.input_port, }, }, { label: lan.database.user, group: { type: 'text', name: 'db_user', width: '260px', value: config.db_user, placeholder: lan.database.input_username, }, }, { label: lan.database.add_pass, group: { type: 'text', name: 'db_password', width: '260px', value: config.db_password, placeholder: lan.database.input_password, }, }, { label: lan.database.add_ps, group: { type: 'text', name: 'db_ps', width: '260px', value: config.ps, placeholder: lan.database.server_note, }, }, { group: { type: 'help', style: { 'margin-top': '0' }, list: [lan.database.remote_help_1, lan.database.remote_help_2, lan.database.remote_help_3, lan.database.remote_help_4], }, }, ], }, yes: function (form, indexs) { if (form.db_host == '') return layer.msg(lan.database.input_server_address, { icon: 2 }); if (form.db_port == '') return layer.msg(lan.database.input_port, { icon: 2 }); if (form.db_user == '') return layer.msg(lan.database.input_username, { icon: 2 }); if (form.db_password == '') return layer.msg(lan.database.input_password, { icon: 2 }); if (is_edit) form['id'] = config['id']; var type = that.getType(); var tips = is_edit ? lan.database.edit_cloud_server_tips : lan.database.add_cloud_server_tips; form['type'] = type; var layerT = bt.load(tips); var interface = is_edit ? 'ModifyCloudServer' : 'AddCloudServer'; var url = type === 'mysql' ? '/database?action=' + interface : '/database/' + type + '/' + interface; bt_tools.send({ url: url, data: type === 'mysql' ? form : { data: JSON.stringify(form) }, }, function (rdata) { layerT.close(); if (rdata.status) { that.reset_server_config(); layer.close(indexs); layer.msg(rdata.msg, { icon: 1 }); } else { layer.msg(rdata.msg, { time: 0, icon: 2, closeBtn: 2, shade: 0.3, area: '650px', }); } }); }, }); }, // 删除远程服务器管理关系 del_db_cloud_server: function (row) { var that = this; bt.confirm( { title: lan.public.del + ' [' + row.db_host + '] ' + lan.database.cloud_server, msg: lan.database.del_cloud_server_tips + '!', }, function () { var type = that.getType(); var params = { url: 'database?action=RemoveCloudServer', data: { id: row.id } } if (type != 'mysql') { params.url = 'database/' + type + '/RemoveCloudServer'; params.data = { data: JSON.stringify({ id: row.id }) }; } bt_tools.send(params, function (rdata) { if (rdata.status) { that.reset_server_config(); } bt.msg(rdata); }); } ); }, // 重新加载服务 reset_server_config: function () { var type = this.getType(); $('.database-pos .tabs-item[data-type="' + type + '"]').trigger('click'); }, // 删除数据库 del_database: function (wid, dbname, obj, callback) { var that = this; var rendom = bt.get_random_code(); var num1 = rendom['num1']; var num2 = rendom['num2']; var title = ''; var tips = 'The deletion may affect the business!'; title = typeof dbname === 'function' ? 'Batch delete databases' : 'Delete database [ ' + dbname + ' ]'; if (obj && obj.db_type > 0) { tips = lan.database.del_cloud_database_tips; } layer.open({ type: 1, title: title, icon: 0, skin: 'delete_site_layer', area: '530px', closeBtn: 2, shadeClose: true, content: "<div class='bt-form webDelete pd30' id='site_delete_form'>" + "<i class='layui-layer-ico layui-layer-ico0'></i>" + "<div class='f13 check_title' style='margin-bottom: 20px;'>" + tips + '</div>' + "<div style='color:red;margin:18px 0 18px 18px;font-size:14px;font-weight: bold;'>Note: The data is priceless, please operate with caution! ! !" + (!recycle_bin_db_open ? '<br><br>Risk: The DB recycle bin is not enabled, deleting will disappear forever!' : '') + '</div>' + "<div class='vcode'>" + lan.bt.cal_msg + "<span class='text'>" + num1 + ' + ' + num2 + "</span>=<input type='number' id='vcodeResult' value=''></div>" + '</div>', btn: [lan.public.ok, lan.public.cancel], yes: function (indexs) { var vcodeResult = $('#vcodeResult'), data = { id: wid, name: dbname }; if (vcodeResult.val() === '') { layer.tips('Calculation result cannot be empty', vcodeResult, { tips: [1, 'red'], time: 3000 }); vcodeResult.focus(); return false; } else if (parseInt(vcodeResult.val()) !== num1 + num2) { layer.tips('Incorrect calculation result', vcodeResult, { tips: [1, 'red'], time: 3000 }); vcodeResult.focus(); return false; } if (typeof dbname === 'function') { delete data.id; delete data.name; } layer.close(indexs); var arrs = wid instanceof Array ? wid : [wid]; var ids = JSON.stringify(arrs), countDown = 9; if (arrs.length == 1) countDown = 4; title = typeof dbname === 'function' ? 'Confirm the information again, delete the database in batches' : 'Confirm the information again, Delete Database [ ' + dbname + ' ]'; var loadT = bt.load('Checking database data information, please wait...'); var type = that.getType(); var params = { url: 'database?action=check_del_data', data: { ids: ids } } if (type != 'mysql') { params.url = 'database/' + type + '/check_del_data'; params.data = { data: JSON.stringify({ ids: ids }) }; } bt_tools.send(params, function (res) { loadT.close(); layer.open({ type: 1, title: title, closeBtn: 2, skin: 'verify_site_layer_info active', area: '740px', content: '<div class="check_delete_site_main pd30">' + '<i class="layui-layer-ico layui-layer-ico0"></i>' + '<div class="check_layer_title">aaPanel kindly reminds you, please calm down for a few seconds, and then confirm whether you want to delete the data.</div>' + '<div class="check_layer_content">' + '<div class="check_layer_item">' + '<div class="check_layer_site"></div>' + '<div class="check_layer_database"></div>' + '</div>' + '</div>' + '<div class="check_layer_error ' + (recycle_bin_db_open ? 'hide' : '') + '"><span class="glyphicon glyphicon-info-sign"></span>Risk: The database recycle bin is not enabled. After the database is deleted, the database will disappear forever!</div>' + '<div class="check_layer_message">Please read the above information to be deleted carefully to prevent the database from being deleted by mistake. Confirm the deletion and there is still <span style="color:red;font-weight: bold;">' + countDown + '</span> seconds to operate.</div>' + '</div>', btn: ['Delete (Can be operated after ' + countDown + ' seconds)', 'Cancel'], success: function (layers) { var html = '', rdata = res.data; var filterData = rdata.filter(function (el) { return ids.indexOf(el.id) != -1; }); for (var i = 0; i < filterData.length; i++) { var item = filterData[i], newTime = parseInt(new Date().getTime() / 1000), t_icon = '<span class="glyphicon glyphicon-info-sign" style="color: red;width:15px;height: 15px;;vertical-align: middle;"></span>'; database_html = (function (item) { var is_time_rule = newTime - item.st_time > 86400 * 30 && item.total > 1024 * 10, is_database_rule = res.db_size <= item.total, database_time = bt.format_data(item.st_time, 'yyyy-MM-dd'), database_size = bt.format_size(item.total); var f_size = '<i ' + (is_database_rule ? 'class="warning"' : '') + ' style = "vertical-align: middle;" > ' + database_size + '</i> ' + (is_database_rule ? t_icon : ''); var t_size = 'Note: This database is large and may be important data. Please operate with caution.\nDatabase: ' + database_size; return ( '<div class="check_layer_database">' + '<span title="Database: ' + item.name + '">Database: ' + item.name + '</span>' + '<span ' + (item.total > 0 ? 'title="' + t_size + '"' : '') + '>Size: ' + f_size + '</span>' + '<span title="' + (is_time_rule && item.total != 0 ? 'Important: This database was created earlier and may be important data. Please operate with caution.' : '') + 'Time:' + database_time + '">Ctime:<i ' + (is_time_rule && item.total != 0 ? 'class="warning"' : '') + '>' + database_time + '</i></span>' + '</div>' ); })(item); if (database_html !== '') html += '<div class="check_layer_item">' + database_html + '</div>'; } if (html === '') html = '<div style="text-align: center;width: 100%;height: 100%;line-height: 300px;font-size: 15px;">No data</div>'; $('.check_layer_content').html(html); var interVal = setInterval(function () { countDown--; $(layers) .find('.layui-layer-btn0') .text('Delete (Can be operated after ' + countDown + ' seconds)'); $(layers).find('.check_layer_message span').text(countDown); }, 1000); setTimeout(function () { $(layers).find('.layui-layer-btn0').text('Delete'); $(layers).find('.check_layer_message').html('<span style="color:red">Note: Please read carefully the above information to be deleted to prevent the database from being deleted by mistake</span>'); $(layers).removeClass('active'); clearInterval(interVal); }, countDown * 1000); }, yes: function (indes, layers) { if ($(layers).hasClass('active')) { layer.tips('Please confirm the message, there are ' + countDown + ' seconds left', $(layers).find('.layui-layer-btn0'), { tips: [1, 'red'], time: 3000 }); return; } if (typeof dbname === 'function') { dbname(data); } else { bt.database.del_database(data, function (rdata) { layer.closeAll(); if (rdata.status) that.getDatabaseList(); if (callback) callback(rdata); bt.msg(rdata); }); } }, }); }); }, }); }, // 同步数据库 sync_to_database: function (type) { var that = this; var data = []; $('input[type="checkbox"].check:checked').each(function () { if (!isNaN($(this).val())) data.push($(this).val()); }); console.log(type); bt.database.sync_to_database({ type: type, ids: JSON.stringify(data) }, function (rdata) { if (rdata.status) that.getDatabaseList(); }); }, // 设置数据库密码 set_data_pass: function (id, username, password) { var that = this; var bs = bt.database.set_data_pass(function (rdata) { if (rdata.status) that.getDatabaseList(); bt.msg(rdata); }); $('.name' + bs).val(username); $('.id' + bs).val(id); $('.password' + bs).val(password); }, // 显示备份列表 showBackupList: function (id, dbname) { var that = this; bt.open({ type: 1, skin: 'demo-class', area: '700px', title: lan.database.backup_title + ' - [' + dbname + ']', closeBtn: 2, shift: 5, shadeClose: false, content: '\ <div class="divtable pd15">\ <div id="dataBackupList"></div>\ </div>', success: function ($layer) { var _that = this; _that.$layer = $layer; this.renderBackupList(); }, // 备份列表 renderBackupList: function () { if (this.backupTable == null) { var _that = this; this.backupTable = bt_tools.table({ el: '#dataBackupList', url: '/data?action=getData', param: { table: 'backup', search: id, type: '1', limit: 8 }, autoHeight: true, load: true, default: '[' + dbname + '] The database backup list is empty', column: [ { fid: 'name', title: lan.database.backup_name, width: 220, fixed: true, }, { fid: 'size', title: lan.database.backup_size, width: 80, type: 'text', template: function (row) { return bt.format_size(row.size); }, }, { fid: 'addtime', width: 150, title: lan.database.backup_time, }, { fid: 'opt', title: lan.database.operation, type: 'group', width: 150, align: 'right', group: [ { title: lan.database.backup_re, event: function (row) { bt.database.input_sql(row.filename, dbname); }, }, { title: lan.database.download, template: function (row) { return '<a class="btlink" href="/download?filename=' + row.filename + '&name=' + row.name + '" target="_blank">' + lan.database.download + '</a>'; }, }, { title: lan.database.del, event: function (row) { bt.database.del_backup(row.id, function () { _that.renderBackupList(); that.getDatabaseList(); }); }, }, ], }, ], tootls: [ { type: 'group', // 按钮组 positon: ['left', 'top'], list: [ { title: lan.database.backup, active: true, event: function (ev) { // 备份数据库 bt.database.backup_data(id, function (rdata) { bt.msg(rdata); if (rdata.status) { _that.renderBackupList(); that.getDatabaseList(); } }); }, }, ], }, { type: 'page', // 分页类型 positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', // 分页请求字段,默认为 : p page: 1, // 当前分页 默认:1 numberParam: 'limit', // 分页数量请求字段默认为 : limit defaultNumber: 8, // 分页数量默认 : 20条 }, ], success: function () { _that.setLayerCenter(); }, }); } else { this.backupTable.$refresh_table_list(); } }, // 设置弹窗居中 setLayerCenter: function () { var $layer = this.$layer; if (!$layer) return; var height = $(window).height(); var layerHeight = $layer.height(); var top = (height - layerHeight) / 2; $layer.css('top', top); }, }); }, // 显示导入 showImport: function (dbname) { var that = this; var type = this.getType(); var path = bt.get_cookie('backup_path') + '/database'; var tips = bt.render_help([lan.database.input_ps1, lan.database.input_ps2, bt.os != 'Linux' ? lan.database.input_ps3.replace(/\/www.*\/database/, path) : lan.database.input_ps3]); if (type == 'pgsql') { tips = bt.render_help(['Only support sql', bt.os != 'Linux' ? lan.database.input_ps3.replace(/\/www.*\/database/, path) : lan.database.input_ps3]); } bt.open({ type: 1, shift: 5, closeBtn: 2, shadeClose: false, title: lan.database.input_title_file + '[' + dbname + ']', area: ['600px', '500px'], content: '<div class="pd15"><div id="dataInputList"></div>' + tips + '</div>', success: function () { this.renderImportList(); }, renderImportList: function () { var _that = this; if (this.importTable) { this.importTable.$refresh_table_list(); } else { var param = { p: 1, reverse: 'True', sort: 'mtime', tojs: 'GetFiles', showRow: 100, path: path }; this.importTable = bt_tools.table({ el: '#dataInputList', url: '/files?action=GetDir', load: true, param: param, height: 276, default: 'No data', dataFilter: function (rdata) { var data = []; for (var i = 0; i < rdata.FILES.length; i++) { if (rdata.FILES[i] == null) continue; var fmp = rdata.FILES[i].split(';'); var ext = bt.get_file_ext(fmp[0]); if (ext != 'sql' && ext != 'zip' && ext != 'gz' && ext != 'tgz') continue; data.push({ name: fmp[0], size: fmp[1], etime: fmp[2] }); } return { data: data }; }, column: [ { fid: 'name', title: lan.files.file_name, width: 190, template: function (item) { return '<span class="flex" title="' + item.name + '"><span class="text-overflow" style="flex: 1; width: 0;">' + item.name + '</span></span>'; } }, { fid: 'etime', title: lan.files.file_etime, width: 130, type: 'text', template: function (item) { var time = bt.format_data(item.etime); return '<span>' + time + '</span>'; }, }, { fid: 'size', title: lan.files.file_size, width: 70, type: 'text', template: function (item) { return bt.format_size(item.size); }, }, { type: 'group', title: 'Operating', align: 'right', width: 90, group: [ { title: lan.database.input, event: function (row) { var filePath = path + '/' + row.name; bt.database.input_sql(filePath, dbname); }, }, { title: 'Del', event: function (row) { var fileName = path + '/' + row.name; layer.confirm(lan.get('recycle_bin_confirm', [fileName]), { title: lan.files.del_file, closeBtn: 2, icon: 3 }, function (index) { layer.msg(lan.public.the, { icon: 16, time: 0, shade: [0.3, '#000'] }); $.post('/files?action=DeleteFile', 'path=' + encodeURIComponent(fileName), function (rdata) { layer.close(index); bt.msg(rdata); if (rdata.status) { _that.renderImportList(); } }); }); }, }, ], }, ], tootls: [ { type: 'group', // 按钮组 positon: ['left', 'top'], list: [ { title: lan.database.input_local_up, event: function (ev) { // 上传数据库 var type = that.getType(); var suffix = type == 'pgsql' ? '.sql' : '.sql,.gz,.tar.gz,.zip'; bt_upload_file.open(path, suffix, lan.database.input_up_type, function () { _that.renderImportList(); }); }, }, ], }, ], }); } }, }); }, }; var mysql = { // 数据库表格实例 databaseTable: null, // 获取数据库列表 getDatabaseList: function (config) { if (this.databaseTable) { config = config || {}; if (config.isInit) this.databaseTable.config.page.page = 1; this.databaseTable.$refresh_table_list(true); return; } var _that = this; var type = database.getType(); var param = { table: 'databases', search: '' }; $('#bt_database_table').empty(); this.databaseTable = bt_tools.table({ el: '#bt_database_table', url: '/data?action=getData', param: param, // 参数 minWidth: '1000px', autoHeight: true, pageName: 'mysql', default: 'The database list is empty', // 数据为空时的默认提示 beforeRequest: function () { var db_type_val = $('.database_type_select_filter').val(); switch (db_type_val) { case 'all': delete param['db_type']; delete param['sid']; break; case 0: param['db_type'] = 0; break; default: delete param['db_type']; param['sid'] = db_type_val; } return param; }, // 排序 sortParam: function (data) { return { order: data.name + ' ' + data.sort, }; }, column: [ { fid: 'id', type: 'checkbox', width: 20 }, { fid: 'name', width: 120, title: lan.database.add_name, template: function (item) { return '<span class="limit-text-length" style="width: 100px;" title="' + item.name + '">' + item.name + '</span>'; }, }, { fid: 'username', width: 120, title: lan.database.user, sort: function () { database_table.$refresh_table_list(true); }, template: function (item) { return '<span class="limit-text-length" style="width: 100px;" title="' + item.username + '">' + item.username + '</span>'; }, }, { fid: 'password', width: 220, title: lan.database.add_pass, type: 'password', copy: true, eye_open: true, template: function (row) { var id = row.id; var username = row.username; var password = row.password; if (row.password === '') return '<span span class="c9 cursor" onclick="database.set_data_pass(\'' + id + "','" + username + "','" + password + '\')">' + lan.database.not_found_pwd_1 + '<span class="red">' + lan.database.not_found_pwd_2 + '</span>' + lan.database.not_found_pwd_3 + '!</span>'; return true; }, }, bt.public.get_quota_config('database'), { fid: 'backup', title: lan.database.backup, width: 130, template: function (item) { var backup = lan.database.backup_empty; var _class = 'bt_warning'; if (item.backup_count > 0) { backup = lan.database.backup_ok; _class = 'bt_success'; } var num = item.backup_count > 0 ? '(' + item.backup_count + ')' : ''; // 备份链接 var backupLink = '<a href="javascript:;" class="btlink ' + _class + '" onclick="database.showBackupList(' + item.id + ", '" + item.name + '\')">' + backup + num + '</a>'; // 导入链接 var importLink = '<a href="javascript:;" class="btlink" onclick="database.showImport(\'' + item.name + '\')">' + lan.database.input + '</a>'; return '<span>' + backupLink + ' | ' + importLink + '</span>'; }, }, { fid: 'position', title: lan.database.position, type: 'text', template: function (row) { var type_column = '-'; var host = row.conn_config.db_host; var port = row.conn_config.db_port; switch (row.db_type) { case 0: type_column = lan.database.add_auth_local; break; case 1: type_column = (lan.database.cloud_database + '(' + host + ':' + port + ')').toString(); break; case 2: var list = database.cloudDatabaseList; $.each(list, function (index, item) { var db_host = item.db_host; var db_port = item.db_port; if (row.sid == item.id) { // 默认显示备注 if (item.ps !== '') { type_column = item.ps; } else { type_column = (lan.database.cloud_database + '(' + db_host + ':' + db_port + ')').toString(); } } }); break; } return '<span class="flex" title="' + type_column + '"><span class="size_ellipsis">' + type_column + '</span></span>'; }, }, { fid: 'ps', title: lan.database.add_ps, type: 'input', blur: function (row, index, ev) { bt.pub.set_data_ps( { id: row.id, table: 'databases', ps: ev.target.value, }, function (res) { layer.msg(res.msg, res.status ? {} : { icon: 2 }); } ); }, keyup: function (row, index, ev) { if (ev.keyCode === 13) { $(this).blur(); } }, }, { type: 'group', title: lan.database.operation, width: 280, align: 'right', group: [ { title: lan.database.admin, tips: lan.database.admin_title, hide: function (row) { return row.db_type != 0; }, event: function (row) { bt.database.open_phpmyadmin(row.name, row.username, row.password); }, }, { title: lan.database.auth, tips: lan.database.set_db_auth, hide: function (row) { return row.db_type == 1; }, event: function (row) { bt.database.set_data_access(row.username); }, }, { title: lan.database.tools, tips: lan.database.mysql_tools, event: function (row) { _that.rep_tools(row.name); }, }, { title: lan.database.edit_pass, tips: lan.database.edit_pass_title, hide: function (row) { return row.db_type == 1; }, event: function (row) { database.set_data_pass(row.id, row.username, row.password); }, }, { title: lan.database.del, tips: lan.database.del_title, event: function (row) { database.del_database(row.id, row.name, row); }, }, ], }, ], tootls: [ { // 按钮组 type: 'group', positon: ['left', 'top'], list: [ { title: lan.database.add_title, active: true, event: function () { database.getCloudServerList(function (list) { bt.database.add_database(list, function (res) { if (res.status) _that.getDatabaseList(); }); }); }, }, { title: lan.database.edit_root, event: function () { bt.database.set_root('root'); }, }, { title: 'phpMyAdmin', event: function () { bt.database.open_phpmyadmin('', 'root', bt.config.mysql_root); }, }, { title: lan.database.cloud_server, event: function () { database.open_cloud_server(); }, }, { title: 'Sync all', style: { 'margin-left': '30px' }, event: function () { database.sync_to_database(0); }, }, { title: 'Get DB from server', event: function () { database.getCloudServerList(function (list) { bt_tools.open({ title: lan.database.select_position, area: '450px', skin: 'databaseCloudServer', btn: [lan.public.confirm, lan.public.cancel], content: { class: 'pd20', form: [ { label: lan.database.position, group: { type: 'select', name: 'sid', width: '260px', list: list, }, }, ], }, success: function ($layer) { $layer.find('.layui-layer-content').css('overflow', 'inherit'); }, yes: function (form, index) { bt.database.sync_database(form.sid, function (rdata) { if (rdata.status) { _that.getDatabaseList(); layer.close(index); } }); }, }); }); }, }, // { // title: 'Recycle bin', // style: { // 'position': 'absolute', // 'right': '-5px' // }, // icon: 'trash', // event: function () { // bt.recycle_bin.open_recycle_bin(6) // } // } ], }, { type: 'batch', // batch_btn positon: ['left', 'bottom'], placeholder: 'Select batch operation', buttonValue: 'Execute', disabledSelectValue: 'Select the DB to execute!!', selectList: [ { title: 'Sync to Server', url: '/database?action=SyncToDatabases&type=1', paramName: 'ids', //列表参数名,可以为空 paramId: 'id', // 需要传入批量的id th: 'Database Name', refresh: true, beforeRequest: function (list) { var arry = []; $.each(list, function (index, item) { arry.push(item.id); }); return JSON.stringify(arry); }, success: function (res, list, that) { layer.closeAll(); var html = ''; $.each(list, function (index, item) { html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right"><span style="color:' + (res.status ? '#20a53a' : 'red') + '">' + res.msg + '</span></td>\ </tr>'; }); that.$batch_success_table({ title: 'Batch sync selected', th: 'Database Name', area: '450px', html: html, }); }, }, { title: 'Database Backup', url: type == 'mysql' ? 'database?action=ToBackup' : '/database/' + type + '/ToBackup', load: true, param: function (row) { return type == 'mysql' ? { id: row.id } : {data:JSON.stringify({id: row.id})} }, // 手动执行,data参数包含所有选中的站点 callback: function (that) { that.start_batch({}, function (list) { var html = ''; for(var i=0;i<list.length;i++){ var item = list[i]; html += '<tr><td>'+ item.name +'</td><td><div style="float:right;"><span style="color:'+ (item.request.status?'#20a53a':'red') +'">'+ item.request.msg +'</span></div></td></tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch backup database', th: 'Database Name', html: html, area: '480px', }); _that.getDatabaseList(); }); } }, { title: 'Delete database', url: '/database?action=DeleteDatabase', load: true, refresh: true, param: function (row) { return { id: row.id, name: row.name, }; }, callback: function (that) { // 手动执行, data参数包含所有选中的站点 var ids = []; for (var i = 0; i < that.check_list.length; i++) { ids.push(that.check_list[i].id); } database.del_database(ids, function (param) { that.start_batch(param, function (list) { layer.closeAll(); var html = ''; for (var i = 0; i < list.length; i++) { var item = list[i]; html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right">\ <span style="color:' + (item.request.status ? '#20a53a' : 'red') + '">' + item.request.msg + '</span>\ </td>\ </tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch deletion', th: 'Database Name', html: html, }); _that.getDatabaseList(); }); }); }, }, ], }, { type: 'search', positon: ['right', 'top'], placeholder: lan.database.database_search, searchParam: 'search', // 搜索请求字段,默认为 search value: '', // 当前内容,默认为空 }, { type: 'page', // 分页显示 positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', //分页请求字段,默认为 : p page: 1, //当前分页 默认:1 numberParam: 'limit', //分页数量请求字段默认为 : limit number: 20, //分页数量默认 : 20条 numberList: [10, 20, 50, 100, 200], // 分页显示数量列表 numberStatus: true, // 是否支持分页数量选择,默认禁用 jump: true, //是否支持跳转分页,默认禁用 }, ], success: function () { $('.feedback-btn').remove(); $('.tootls_group.tootls_top .pull-left').append('<span style="display:inline-block; margin-left:10px;vertical-align: bottom;" class="feedback-btn"><span class="flex" style="align-items: center;margin-right:16px;width:100px;"><i class="icon-demand"></i><a class="btlink" onClick="javascript:bt.openFeedback({title:\'aaPanel demand feedback collection\',placeholder:\'<span>If you encounter any problems or imperfect functions during use, please describe <br> your problems or needs to us in detail, we will try our best to solve or improve for <br> you</span>\',recover:\'We pay special attention to your requirements feedback, and we conduct regular weekly requirements reviews. I hope I can help you better\',key:993,proType:2});" style="margin-left: 5px;">Feedback</a></span></span>'); } }); database.renderCloudServerSelect(); }, // 数据库工具 rep_tools: function (db_name) { var that = this; layer.open({ type: 1, title: lan.database.mysql_tools_box + ' [ ' + db_name + ' ]', area: ['870px', '590px'], closeBtn: 2, shadeClose: false, content: '\ <div class="pd15">\ <div class="db_tools_info">\ <div class="info">\ <div class="name">' + lan.database.db_name + ': <span>--</span></div>\ <div class="size">' + lan.database.size + ': <span>0 B</span></div>\ </div>\ <div class="hide" id="db_tools"></div>\ </div>\ <div id="databaseToolsTable"></div>\ </div>', success: function (layero, index) { var _that = this; var tips = '<ul class="help-info-text c7">\ <li>' + lan.database.tb_repair + '</li>\ <li>' + lan.database.tb_optimization + '</li>\ <li>' + lan.database.tb_change_engine + '</li>\ </ul>'; $('#databaseToolsTable').after(tips); var repair = '<button class="btn btn-default btn-sm btn-tools-repair">' + lan.database.repair + '</button>'; var optimization = '<button class="btn btn-default btn-sm btn-tools-opt">' + lan.database.optimization + '</button>'; var innoDB = '<button class="btn btn-default btn-sm btn-tools-innodb">' + lan.database.change + 'InnoDB</button>'; var myisam = '<button class="btn btn-default btn-sm btn-tools-myisam">' + lan.database.change + 'MyISAM</button>'; $('#db_tools').html(repair + optimization + innoDB + myisam); // 修复 $('#db_tools').on('click', '.btn-tools-repair', function () { _that.rep_database(db_name); }); // 优化 $('#db_tools').on('click', '.btn-tools-opt', function () { _that.op_database(db_name); }); // 转成innoDb $('#db_tools').on('click', '.btn-tools-innodb', function () { _that.to_database_type(db_name, null, 'InnoDB'); }); // 转成MyISAM $('#db_tools').on('click', '.btn-tools-myisam', function () { _that.to_database_type(db_name, null, 'MyISAM'); }); this.getTable(); }, getTable: function () { $('#db_tools').addClass('hide'); if (this.table) { this.table.$refresh_table_list(); return; } var _that = this; var types = { InnoDB: 'InnoDB', MyISAM: 'MyISAM' }; this.table = bt_tools.table({ el: '#databaseToolsTable', url: '/database?action=GetInfo', param: { db_name: db_name }, height: '355px', autoHeight: true, dataFilter: function (res) { $('.db_tools_info .name span').text(res.database); $('.db_tools_info .name span').attr('title', res.database); $('.db_tools_info .size span').text(res.data_size); return { data: res.tables }; }, handleSelectionChange: function (row, list, ev) { if (list.length) { $('#db_tools').removeClass('hide'); } else { $('#db_tools').addClass('hide'); } }, column: [ { type: 'checkbox', width: 20, }, { fid: 'table_name', title: lan.database.tb_name, type: 'text', width: 170, template: function (row) { return '<span class="flex"><span class="text-overflow" title="' + row.table_name + '">' + row.table_name + '</span></span>'; }, }, { fid: 'type', title: lan.database.engine, }, { fid: 'collation', title: lan.database.character, type: 'text', width: 130, template: function (item) { return '<span class="flex"><span class="text-overflow" title="' + item.collation + '">' + item.collation + '</span></span>'; }, }, { fid: 'rows_count', title: lan.database.row_num, width: 100, }, { fid: 'data_size', title: lan.database.size, }, { type: 'group', align: 'right', title: lan.database.operation, width: 250, group: [ { title: lan.database.backup_re, event: function (row) { _that.rep_database(db_name, row.table_name); }, }, { title: lan.database.optimization, event: function (row) { _that.op_database(db_name, row.table_name); }, }, { template: function (row) { var setType = row.type == 'InnoDB' ? types.MyISAM : types.InnoDB; return lan.database.change + setType; }, event: function (row) { var setType = row.type == 'InnoDB' ? types.MyISAM : types.InnoDB; _that.to_database_type(db_name, row.table_name, setType); }, }, ], }, ], }); $('#databaseToolsTable').on('change', '.cust—checkbox-input', function () { var isChecked = false; var elems = $('#databaseToolsTable tbody .cust—checkbox'); for (var i = 0; i < elems.length; i++) { if ($(elems[i]).hasClass('active')) { isChecked = true; break; } } if (isChecked) { $('#db_tools').removeClass('hide'); } else { $('#db_tools').addClass('hide'); } }); }, // 修复表 rep_database: function (db_name, tables) { var _that = this; var dbs = this.rep_checkeds(tables); var loadT = layer.msg(lan.database.send_repair_command, { icon: 16, time: 0 }); bt.send('ReTable', 'database/ReTable', { db_name: db_name, tables: JSON.stringify(dbs) }, function (rdata) { layer.close(loadT); bt.msg(rdata); if (rdata.status) _that.getTable(); }); }, // 优化表 op_database: function (db_name, tables) { var _that = this; var dbs = this.rep_checkeds(tables); var loadT = layer.msg(lan.database.send_opt_command, { icon: 16, time: 0 }); bt.send('OpTable', 'database/OpTable', { db_name: db_name, tables: JSON.stringify(dbs) }, function (rdata) { layer.close(loadT); bt.msg(rdata); if (rdata.status) _that.getTable(); }); }, // 转换表类型 to_database_type: function (db_name, tables, type) { var _that = this; var dbs = this.rep_checkeds(tables); var loadT = layer.msg(lan.database.send_change_command, { icon: 16, time: 0, shade: [0.3, '#000'] }); bt.send('AlTable', 'database/AlTable', { db_name: db_name, tables: JSON.stringify(dbs), table_type: type }, function (rdata) { layer.close(loadT); bt.msg(rdata); if (rdata.status) _that.getTable(); }); }, rep_checkeds: function (tables) { var dbs = []; if (tables) { dbs.push(tables); } else { var table = this.table; if (table) { $.each(table.checkbox_list, function (index, item) { var row = table.data[item]; dbs.push(row.table_name); }); } } if (dbs.length < 1) { layer.msg(lan.database.choose_at_least_one_tb, { icon: 2 }); return false; } return dbs; }, }); }, } var sqlserver = { // 服务器列表 databaseTable: null, // 渲染数据库列表 getDatabaseList: function (config) { if (this.databaseTable) { config = config || {}; if (config.isInit) this.databaseTable.config.page.page = 1; this.databaseTable.$refresh_table_list(true); return } var _that = this; var type = database.getType(); var param = { table: 'databases', search: '' } this.databaseTable = bt_tools.table({ el: '#bt_sqldatabase_table', url: 'database/sqlserver/get_list', param: param, //参数 minWidth: '1000px', load: true, autoHeight: true, default: "The database list is empty", // 数据为空时的默认提示 pageName: 'database', beforeRequest:function(beforeData){ var db_type_val = $('.sqlserver_type_select_filter').val() switch(db_type_val){ case 'all': delete param['db_type'] delete param['sid'] break; case 0: param['db_type'] = 0; break; default: delete param['db_type']; param['sid'] = db_type_val } if (beforeData.hasOwnProperty('data') && typeof beforeData.data === 'string') { delete beforeData['data'] return { data: JSON.stringify($.extend(param,beforeData)) } } return {data:JSON.stringify(param)} }, column:[ {type: 'checkbox',width: 20}, {fid: 'name', title: lan.database.add_name,type:'text'}, {fid: 'username',title: lan.database.user,type:'text',sort:true}, {fid:'password',title: lan.database.add_pass,type:'password',copy:true,eye_open:true}, { title: lan.database.position, type: 'text', width: 116, template: function (row) { var type_column = '-' switch(row.db_type){ case 0: type_column = lan.database.add_auth_local break; case 1: type_column = (lan.database.cloud_database + '('+row.conn_config.db_host+':'+row.conn_config.db_port+')').toString() break; case 2: var list = database.cloudDatabaseList; $.each(list,function(index,item){ if(row.sid == item.id){ if(item.ps !== ''){ // 默认显示备注 type_column = item.ps }else{ type_column = (lan.database.cloud_database + '('+item.db_host+':'+item.db_port+')').toString() } } }) break; } return '<span class="flex" style="width:100px" title="'+type_column+'"><span class="size_ellipsis" style="width: 0; flex: 1;">'+type_column+'</span></span>' } }, { fid: 'ps', title: lan.database.add_ps, type: 'input', blur: function (row, index, ev) { bt.pub.set_data_ps({ id: row.id, table: 'databases', ps: ev.target.value }, function (res) { layer.msg(res.msg, (res.status ? {} : { icon: 2 })); }); }, keyup: function (row, index, ev) { if (ev.keyCode === 13) { $(this).blur(); } } }, { type: 'group', title: lan.database.operation, width: 220, align: 'right', group: [ { title: lan.database.edit_pass, tips: lan.database.edit_pass_title, hide: function (rows) { return rows.db_type == 1 }, event: function (row) { database.set_data_pass(row.id, row.username, row.password); } }, { title: lan.database.del, tips: lan.database.del_title, event: function (row) { database.del_database(row.id, row.name, row); } } ] } ], sortParam: function (data) { return { 'order': data.name + ' ' + data.sort }; }, tootls: [{ // 按钮组 type: 'group', positon: ['left', 'top'], list: [{ title: lan.database.add_title, active: true, event: function () { database.getCloudServerList(function (list) { bt.database.add_database(list, function (res) { if (res.status) _that.getDatabaseList(); }) }); } },{ title: lan.database.cloud_server, event:function(){ database.open_cloud_server(); } },{ title: 'Sync all', style:{'margin-left':'30px'}, event: function () { bt.database.sync_to_database({ type:0, ids: [] }, function (res) { if (res.status) _that.getDatabaseList(); }) } },{ title: 'Get DB from server', event: function () { database.getCloudServerList(function (list) { bt_tools.open({ title: lan.database.select_position, area: '450px', btn: [lan.public.confirm, lan.public.cancel], skin: 'databaseCloudServer', content: { 'class':'pd20', form:[{ label: lan.database.position, group:{ type: 'select', name: 'sid', width: '260px', list: list } }] }, success: function (layers) { $(layers).find('.layui-layer-content').css('overflow','inherit'); }, yes:function (form, layers, index){ bt.database.sync_database(form.sid, function (rdata) { if (rdata.status){ _that.getDatabaseList(); layer.close(layers) } }); } }); }); } }] },{ type: 'batch', // batch_btn positon: ['left', 'bottom'], placeholder: 'Select batch operation', buttonValue: 'Execute', disabledSelectValue: 'Select the DB to execute!!', selectList: [{ title: 'Sync to Server', url: '/database/' + type + '/SyncToDatabases', paramName: 'data', //列表参数名,可以为空 th: 'Database Name', beforeRequest: function(list) { var arry = []; $.each(list, function (index, item) { arry.push(item.id); }); return JSON.stringify({ids:JSON.stringify(arry),type:1}) }, success: function (res, list, that) { layer.closeAll(); var html = ''; $.each(list, function (index, item) { html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right"><span style="color:' + (res.status ? '#20a53a' : 'red') + '">' + res.msg + '</span></td>\ </tr>'; }); that.$batch_success_table({ title: 'Batch sync selected', th: 'Database Name', area: '450px', html: html }); } },{ title: 'Delete database', url: '/database/' + type + '/DeleteDatabase', load: true, param: function (row) { return { data: JSON.stringify({ id: row.id, name: row.name }) } }, callback: function (that) { // 手动执行,data参数包含所有选中的站点 var ids = []; for (var i = 0; i < that.check_list.length; i++) { ids.push(that.check_list[i].id); } database.del_database(ids,function(param){ that.start_batch(param, function (list) { layer.closeAll() var html = ''; for (var i = 0; i < list.length; i++) { var item = list[i]; html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right">\ <span style="color:' + (item.request.status ? '#20a53a' : 'red') + '">' + item.request.msg + '</span>\ </td>\ </tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch deletion', th: 'Database Name', html: html }); _that.getDatabaseList(); }); }) } }] }, { type: 'search', positon: ['right', 'top'], placeholder: lan.database.database_search, searchParam: 'search', //搜索请求字段,默认为 search value: '',// 当前内容,默认为空 }, { //分页显示 type: 'page', positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', //分页请求字段,默认为 : p page: 1, //当前分页 默认:1 numberParam: 'limit', //分页数量请求字段默认为 : limit number: 20, //分页数量默认 : 20条 numberList: [10, 20, 50, 100, 200], // 分页显示数量列表 numberStatus: true, // 是否支持分页数量选择,默认禁用 jump: true, //是否支持跳转分页,默认禁用 }], }); database.renderCloudServerSelect(); } } var mongodb = { // 数据库表格实例 databaseTable: null, // 是否开启安全认证 mongoDBAccessStatus: false, // 获取数据库列表 getDatabaseList :function() { if (this.databaseTable) { this.databaseTable.$refresh_table_list(true); return; } var _that = this; var type = database.getType(); var param = { table: 'databases', search: '' } $('#bt_mongodb_table').empty(); this.databaseTable = bt_tools.table({ el: '#bt_mongodb_table', url: 'database/' + type + '/get_list', param: param, //参数 minWidth: '1000px', load: true, autoHeight: true, default: 'The database list is empty', // 数据为空时的默认提示 pageName: 'database', beforeRequest:function(beforeData){ var db_type_val = $('input[name="db_type_filter_' + type + '"]').val(); switch(db_type_val){ case 'all': delete param['db_type'] delete param['sid'] break; case 0: param['db_type'] = 0; break; default: delete param['db_type']; param['sid'] = db_type_val } if (beforeData.hasOwnProperty('data') && typeof beforeData.data === 'string') { delete beforeData['data'] return { data: JSON.stringify($.extend(param,beforeData)) } } return {data:JSON.stringify(param)} }, sortParam: function (data) { return { 'order': data.name + ' ' + data.sort }; }, column:[ { type: 'checkbox', width: 20 }, { fid: 'name', title: lan.database.add_name, type:'text' }, { fid: 'username', title: lan.database.user, type:'text', sort: true }, { fid: 'password', title: lan.database.add_pass, type:'password', copy:true, eye_open:true }, { fid:'backup', title: lan.database.backup, width: 130, template: function (item) { var backup = lan.database.backup_empty; var _class = "bt_warning"; if (item.backup_count > 0) { backup = lan.database.backup_ok; _class = 'bt_success'; } var num = item.backup_count > 0 ? '(' + item.backup_count + ')' : ''; // 备份链接 var backupLink = '<a href="javascript:;" class="btlink ' + _class + '" onclick="database.showBackupList(' + item.id + ", '" + item.name + '\')">' + backup + num + '</a>'; // 导入链接 var importLink = '<a href="javascript:;" class="btlink" onclick="database.showImport(\'' + item.name + '\')">' + lan.database.input + '</a>'; return '<span>' + backupLink + ' | ' + importLink + '</span>'; } }, { fid: 'position', title: lan.database.position, type: 'text', width: 120, template: function (row) { var type_column = '-'; var host = row.conn_config.db_host; var port = row.conn_config.db_port; switch(row.db_type){ case 0: type_column = lan.database.add_auth_local; break; case 1: type_column = (lan.database.cloud_database + '(' + host + ':' + port + ')').toString(); break; case 2: var list = database.cloudDatabaseList; $.each(list, function(index, item) { var db_host = item.db_host; var db_port = item.db_port; if (row.sid == item.id) { // 默认显示备注 if (item.ps !== '') { type_column = item.ps } else { type_column = (lan.database.cloud_database + '(' + db_host + ':' + db_port + ')').toString(); } } }) break; } return '<span class="flex" title="' + type_column + '"><span class="text-overflow">' + type_column + '</span></span>'; } }, { fid: 'ps', title: lan.database.add_ps, type: 'input', blur: function (row, index, ev) { bt.pub.set_data_ps({ id: row.id, table: 'databases', ps: ev.target.value }, function (res) { layer.msg(res.msg, (res.status ? {} : { icon: 2 })); }); }, keyup: function (row, index, ev) { if (ev.keyCode === 13) { $(this).blur(); } } }, { type: 'group', title: lan.database.operation, width: 220, align: 'right', group: [{ title: lan.database.edit_pass, tips: lan.database.edit_pass_title, hide:function(rows){return rows.db_type == 1}, event: function (row) { database.set_data_pass(row.id, row.username, row.password); } }, { title: lan.database.del, tips: lan.database.del_title, event: function (row) { database.del_database(row.id, row.name, row); } }] } ], tootls: [{ // 按钮组 type: 'group', positon: ['left', 'top'], list: [ { title: lan.database.add_title, active: true, event: function () { database.getCloudServerList(function (list) { bt.database.add_database(list, function (res) { if (res.status) _that.getDatabaseList(); }); }); } }, { title: lan.database.edit_root, event: function (ev) { if (_that.mongoDBAccessStatus) { bt.database.set_root('mongo'); } else { $(ev.currentTarget).next().click(); layer.msg(lan.database.safety_auth_warn1, { icon: 0 }); } } }, { title: lan.database.safety_auth, event: function () { layer.open({ type: 1, closeBtn: 2, shift: 5, shadeClose: false, title: lan.database.safety_auth, area: '400px', btn: false, content:'\ <div class="bt-form pd20">\ <div class="line">\ <span class="tname" style="width: 160px;">' + lan.database.safety_auth + '</span>\ <div class="info-r" style="margin-left: 160px;">\ <div class="inlineBlock mr50" style="margin-top: 5px;vertical-align: -6px;">\ <input class="btswitch btswitch-ios" id="mongodb_access" type="checkbox" name="monitor">\ <label class="btswitch-btn" for="mongodb_access" style="margin-bottom: 0;"></label>\ </div>\ </div>\ </div>\ <ul class="help-info-text c7" style="margin-top: 8px;">\ <li>' + lan.database.safety_auth_tips1 + '</li>\ </ul>\ </div>', success:function(){ var status = _that.mongoDBAccessStatus $('#mongodb_access').attr('checked', status) $('#mongodb_access').click(function(){ var _status = $(this).prop('checked') bt_tools.send({ url: 'database/' + type + '/set_auth_status', data:{ data: JSON.stringify({ status: _status ? 1 : 0 })}, verify: true }, function (rdata) { if (rdata.status) { _that.mongoDBAccessStatus = _status layer.msg(rdata.msg, { icon: 1 }); } }, lan.database.safety_auth_req1) }) } }) } }, { title: lan.database.cloud_server, event:function(){ database.open_cloud_server(); } }, { title: 'Sync all', style:{'margin-left':'30px'}, event: function () { bt.database.sync_to_database({type:0,data:[]},function(res){ if(res.status) _that.getDatabaseList(); }) } }, { title: 'Get DB from server', event: function () { database.getCloudServerList(function (list) { bt_tools.open({ title: lan.database.select_position, area: '450px', btn: [lan.public.confirm, lan.public.cancel], skin: 'databaseCloudServer', content: { 'class':'pd20', form:[{ label: lan.database.position, group:{ type: 'select', name: 'sid', width: '260px', list: list } }] }, success: function (layers) { $(layers).find('.layui-layer-content').css('overflow','inherit'); }, yes:function (form, layers, index){ bt.database.sync_database(form.sid, function (rdata) { if (rdata.status){ _that.getDatabaseList(); layer.close(layers) } }); } }); }); } } ] }, { type: 'batch', //batch_btn positon: ['left', 'bottom'], placeholder: 'Select batch operation', buttonValue: 'Execute', disabledSelectValue: 'Select the DB to execute!!', selectList: [ { title: 'Sync to Server', url: '/database/' + type + '/SyncToDatabases', paramName: 'data', //列表参数名,可以为空 th: 'Database Name', beforeRequest: function(list) { var arry = []; $.each(list, function (index, item) { arry.push(item.id); }); return JSON.stringify({ids:JSON.stringify(arry),type:1}) }, success: function (res, list, that) { layer.closeAll(); var html = ''; $.each(list, function (index, item) { html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right"><span style="color:' + (res.status ? '#20a53a' : 'red') + '">' + res.msg + '</span></td>\ </tr>'; }); that.$batch_success_table({ title: 'Batch sync selected', th: 'Database Name', area: '450px', html: html }); } }, { title: 'Database Backup', url: type == 'mysql' ? 'database?action=ToBackup' : '/database/' + type + '/ToBackup', load: true, param: function (row) { return type == 'mysql' ? { id: row.id } : {data:JSON.stringify({id: row.id})} }, // 手动执行,data参数包含所有选中的站点 callback: function (that) { that.start_batch({}, function (list) { var html = ''; for(var i=0;i<list.length;i++){ var item = list[i]; html += '<tr><td>'+ item.name +'</td><td><div style="float:right;"><span style="color:'+ (item.request.status?'#20a53a':'red') +'">'+ item.request.msg +'</span></div></td></tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch backup database', th: 'Database Name', html: html, area: '480px', }); _that.getDatabaseList(); }); } }, { title: 'Delete database', url: '/database/' + type + '/DeleteDatabase', load: true, param: function (row) { return { data: JSON.stringify({ id: row.id, name: row.name }) } }, callback: function (that) { // 手动执行,data参数包含所有选中的站点 var ids = []; for (var i = 0; i < that.check_list.length; i++) { ids.push(that.check_list[i].id); } database.del_database(ids,function(param){ that.start_batch(param, function (list) { layer.closeAll() var html = ''; for (var i = 0; i < list.length; i++) { var item = list[i]; html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right">\ <span style="color:' + (item.request.status ? '#20a53a' : 'red') + '">' + item.request.msg + '</span>\ </td>\ </tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch deletion', th: 'Database Name', html: html }); _that.getDatabaseList(); }); }) } }] }, { type: 'search', positon: ['right', 'top'], placeholder: lan.database.database_search, searchParam: 'search', //搜索请求字段,默认为 search value: '',// 当前内容,默认为空 }, { type: 'page', // 分页显示 positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', //分页请求字段,默认为 : p page: 1, //当前分页 默认:1 numberParam: 'limit', //分页数量请求字段默认为 : limit number: 20, //分页数量默认 : 20条 numberList: [10, 20, 50, 100, 200], // 分页显示数量列表 numberStatus: true, // 是否支持分页数量选择,默认禁用 jump: true, //是否支持跳转分页,默认禁用 } ] }); database.renderCloudServerSelect(); } } var redis = { // 数据库表格实例 databaseTable: null, redisDBList: [], // 当前远程信息 cloudInfo: { sid: 0, title: 'local server' }, event: function () { var that = this; // 添加Key $('.addRedisDB').click(function () { that.set_redis_library(); }); // 远程服务器 $('.RedisCloudDB').click(function () { database.open_cloud_server(); }); // 备份 $('.backupRedis').click(function () { that.backup_redis_list() }); // 清空所有 $('.emptyRedisDB').click(function () { that.choose_redis_list(); }); // 远程服务器列表点击事件 $('#bt_redis_view').on('change', '.redis_type_select_filter', function(){ that.cloudInfo.sid = $(this).val(); that.cloudInfo.title = $(this).find('option:selected').text(); that.render_redis_content(); }); }, getDatabaseList: function () { var that = this; this.cloudInfo.sid = database.cloudDatabaseList.length == 0 ? 0 : database.cloudDatabaseList[0].id this.cloudInfo.title = database.cloudDatabaseList.length == 0 ? 'local server' : database.cloudDatabaseList[0].ps // 远程服务器列表 that.renderServerSelect(); // 渲染redis列表 this.render_redis_content() }, // 渲染redis选择器 renderServerSelect: function () { var _option = ''; $.each(database.cloudDatabaseList, function (index, item) { var _tips = item.ps != '' ? item.ps : item.db_host; _option += '<option value="' + item.id + '">' + _tips + '</option>'; }); if ($('#bt_redis_view .tool_list_right .redis_type_select_filter').length === 0) { $('#bt_redis_view .tool_list_right').append('<select class="bt-input-text mr5 redis_type_select_filter" style="width:110px" name="db_type_filter">' + _option + '</select>'); } else { $('#bt_redis_view .tool_list_right .redis_type_select_filter').html(_option); } }, // 渲染redis列表 render_redis_content: function (id) { var that = this; $('#redis_content_tab').remove(); $('#bt_redis_view').append('\ <div id="redis_content_tab">\ <div class="tab-nav"></div>\ <div class="tab-con redis_table_content" style="padding:10px 0"></div>\ </div>'); var tabHTML = ''; bt_tools.send({ url: 'database/redis/get_list', data: { data: JSON.stringify({ sid: that.cloudInfo.sid }) } }, function (rdata) { that.redisDBList = rdata; $.each(rdata, function (index, item) { tabHTML += '<span data-id="' + item.id + '">' + item.name + '(' + item.keynum + ')</span>'; }); $('#redis_content_tab .tab-nav').html(tabHTML); setTimeout(function () { if (id) { $('#redis_content_tab .tab-nav span:contains(DB' + id + ')').click(); } else { if (rdata.length == 0) { $('#redis_content_tab .tab-nav').remove(); that.render_redis_table(0); } else { $('#redis_content_tab .tab-nav span:eq(0)').click(); } } }, 50); // redis数据库点击事件 $('#redis_content_tab .tab-nav span').click(function () { var _id = $(this).data('id'); $(this).addClass('on').siblings().removeClass('on'); that.render_redis_table(_id); }); }); }, render_redis_table: function (id) { if (this.databaseTable && id == undefined) { this.databaseTable.$refresh_table_list(true); return; } var that = this; $('.redis_table_content').empty(); this.databaseTable = bt_tools.table({ el: '.redis_table_content', url: 'database/redis/get_db_keylist', param: { db_idx: id }, //参数 minWidth: '1000px', autoHeight: true, load: true, default: 'The database list is empty', // 数据为空时的默认提示 pageName: 'database', beforeRequest:function(beforeData){ var db_type_val = that.cloudInfo.sid; var param = {}; switch (db_type_val) { case 0: param['db_type'] = 0; break; default: delete param['db_type']; param['sid'] = db_type_val; } if (beforeData.hasOwnProperty('data') && typeof beforeData.data === 'string') { delete beforeData['data']; return { data: JSON.stringify($.extend(param, { db_idx: id }, beforeData)) }; } return { data: JSON.stringify($.extend(param, { db_idx: id, limit: beforeData.limit })) }; }, column:[ { type: 'checkbox', width: 20 }, { fid: 'name', title: lan.public_backup.key }, { fid: 'val', title: lan.public_backup.value, type:'text', template: function (row) { var _val = $('<div></div>').text(row.val) return '<div class="flex" style="width: 350px;" title="'+_val.text().replace(/\"/g, '\"')+'"><span class="text-overflow">'+_val.text()+'</span><span class="ico-copy cursor btcopy ml5" title="' + lan.mail_sys.copy + '"></span></div>'; }, event: function(row,index,ev,key){ if($(ev.target).hasClass('btcopy')){ bt.pub.copy_pass(row.val.replaceAll(""", "\"")); } } }, { fid: 'type', title: lan.database.data_type }, { fid: 'len', title: lan.database.data_len }, { fid: 'endtime', title: lan.database.term_of_validity, type: 'text', template: function (row) { return that.reset_time_format(row.endtime); }, }, { type: 'group', title: lan.database.operation, width: 220, align: 'right', group: [ { title: lan.public.edit, tips: lan.database.edit_data, hide: function (rows) { return rows.type == 'string' || rows.type == 'int' ? false : true; }, event: function (row) { row.db_idx = id; that.set_redis_library(row); }, }, { title: lan.public.del, tips: lan.database.del_data, event: function (row) { layer.confirm( lan.database.del_key_value_tips + ' [' + row.name + ']?', { title: lan.database.del_key_value, closeBtn: 2, icon: 0, }, function (index) { bt_tools.send({ url: 'database/redis/del_redis_val', data: { data: JSON.stringify({ db_idx: id, key: row.name, sid: that.cloudInfo.sid }) } }, function (rdata) { if (rdata.status) { that.render_redis_table(); that.change_tabs_num(); } bt_tools.msg(rdata); layer.close(index); }); } ); }, }, ], }, ], tootls: [ { type: 'search', positon: ['right', 'top'], placeholder: lan.database.search_key, searchParam: 'search', //搜索请求字段,默认为 search value: '', // 当前内容,默认为空 }, { type: 'batch', positon: ['left', 'bottom'], config: { title: ' delete', url: 'database/redis/del_redis_val', param: function (row) { return { data:JSON.stringify({db_idx:id,key:row.name,sid:that.cloudInfo.sid}) } }, load: true, callback: function (that) { bt.confirm({ title: 'Batch delete Key', msg: 'Delete selected keys in batches. Do you want to continue?', icon: 0 }, function (index) { layer.close(index); that.start_batch({}, function (list) { var html = ''; for (var i = 0; i < list.length; i++) { var item = list[i]; html += '<tr>\ <td>\ <span class="text-overflow" title="' + item.name + '">' + item.name + '</span>\ </td>\ <td>\ <div class="text-right"><span style="color:' + (item.request.status ? '#20a53a' : 'red') + '">' + item.request.msg + '</span></div>\ </td>\ </tr>'; } database_table.$batch_success_table({ title: 'Batch delete Key', th: 'Key', html: html }); database_table.$refresh_table_list(true); }); }); } } }, { //分页显示 type: 'page', positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', //分页请求字段,默认为 : p page: 1, //当前分页 默认:1 numberParam: 'limit', //分页数量请求字段默认为 : limit number: 20, //分页数量默认 : 20条 numberList: [10, 20, 50, 100, 200], // 分页显示数量列表 numberStatus: true, // 是否支持分页数量选择,默认禁用 jump: true, //是否支持跳转分页,默认禁用 }, ], success: function () { var arry = []; var maxWidth = ''; for (var i = 0; i < $('.size_ellipsis').length; i++) { arry.push($('.size_ellipsis').eq(i).width()); } maxWidth = Math.max.apply(null, arry); $('.size_ellipsis').width(maxWidth + 5); } }); }, // 设置tabs的数量 change_tabs_num: function () { var text = $('#redis_content_tab .tab-nav .on').text(); var reg = new RegExp('(?<=\()(.+?)(?=\))'); var num = text.match(reg)[0]; if (!isNaN(num)) { num--; $('#redis_content_tab .tab-nav .on').text(text.replace(/\([0-9]\)/ig, '(' + num + ')')); } }, // redis备份列表 backup_redis_list: function () { var that = this; var redisBackupTable = null; bt_tools.open({ title: 'Redis ' + lan.database.backup_list, area: '927px', btn: false, skin: 'redisBackupList', content: '<div id="redisBackupTable" class="pd20"></div>', success: function ($layer) { redisBackupTable = bt_tools.table({ el: '#redisBackupTable', default: lan.database.backup_list_empty, height: 478, url: 'database/redis/get_backup_list', column:[ { fid: 'name', title: lan.database.backup_name, width: 170, template: function (item) { return '<span class="flex" title="' + item.name + '"><span class="text-overflow">' + item.name + '</span></span>'; }, }, { fid: 'filepath', title: lan.database.backup_path, template: function (item) { return '<span class="flex" title="' + item.filepath + '"><span class="text-overflow">' + item.filepath + '</span></span>'; }, }, { fid: 'mtime', width: 140, title: lan.database.backup_time, type: 'text', template: function (row) { return '<span>' + bt.format_data(row.mtime) + '</span>'; }, }, { fid: 'size', title: lan.database.backup_size, type: 'text', width: 120, template: function (row) { return '<span>' + bt.format_size(row.size) + '</span>'; }, }, { fid: 'sid', width: 120, title: lan.database.backup_location, template: function (row) { var type_column = '-'; var host = row.conn_config.db_host; var port = row.conn_config.db_port; switch (row.sid) { case '0': type_column = lan.database.add_auth_local; break; case '1': type_column = (lan.database.cloud_database + '(' + host + ':' + port + ')').toString(); break; case '2': var list = database.cloudDatabaseList; $.each(list, function (index, item) { var db_host = item.db_host; var db_port = item.db_port; if (row.sid == item.id) { // 默认显示备注 if (item.ps !== '') { type_column = item.ps } else { type_column = (lan.database.cloud_database + '(' + db_host + ':' + db_port + ')').toString(); } } }); break; } return '<span class="flex" title="' + type_column + '"><span class="text-overflow">' + type_column + '</span></span>'; }, }, { type: 'group', title: lan.database.operation, align: 'right', width: 100, group: [ { title: lan.database.backup_re, event: function (row) { bt.prompt_confirm(lan.database.backup_re_confirm_tit, lan.database.backup_re_confirm_cont1 + row.name + lan.database.backup_re_confirm_cont2, function () { bt_tools.send( { url: 'database/redis/InputSql', data: { data: JSON.stringify({ file: row.filepath, sid: 0 }) } }, function (rdata) { if (rdata.status) that.render_redis_content(); bt_tools.msg(rdata); }, lan.database.restore_data ); }); }, }, { title: lan.database.del, event: function (row) { layer.confirm( lan.database.del_backup_cont1 + row.name + lan.database.del_backup_cont2, { title: lan.database.del_backup, closeBtn: 2, icon: 0, }, function (index) { bt_tools.send( { url: 'database/redis/DelBackup', data: { data: JSON.stringify({ file: row.filepath }) } }, function (rdata) { if (rdata.status) redisBackupTable.$refresh_table_list(true); bt_tools.msg(rdata); layer.close(index); }, lan.database.del_backup_load ); } ); }, }, ], }, ], tootls: [ { type: 'group', positon: ['left', 'top'], list: [ { title: lan.database.backup_btn1, active: true, event: function () { bt_tools.send({ url: 'database/redis/ToBackup' }, function (rdata) { if (rdata.status) redisBackupTable.$refresh_table_list(true); bt_tools.msg(rdata); }); }, }, ], }, ], success: function () { if (!$layer) return; var height = $(window).height(); var layerHeight = $layer.height(); var top = (height - layerHeight) / 2; $layer.css('top', top); } }) } }) }, // 添加/编辑redis库 set_redis_library: function (row) { var that = this; var redis_form = null; bt_tools.open({ title: (row ? lan.public.edit + ' [' + row.name + ']' : lan.public.add) + ' Key' + (!row ? ' to [' + that.cloudInfo.title + ']' : ''), area: '420px', btn: [row ? lan.public.save : lan.public.add, lan.public.cancel], content: '<div class="ptb20" id="redis_library_form"></div>', success: function (layers) { redis_form = bt_tools.form({ el:'#redis_library_form', form: [ { label: lan.public_backup.db, group: { type: 'select', name: 'db_idx', width: '260px', list: [ { title: 'DB0', value: 0 }, { title: 'DB1', value: 1 }, { title: 'DB2', value: 2 }, { title: 'DB3', value: 3 }, { title: 'DB4', value: 4 }, { title: 'DB5', value: 5 }, { title: 'DB6', value: 6 }, { title: 'DB7', value: 7 }, { title: 'DB8', value: 8 }, { title: 'DB9', value: 9 }, { title: 'DB10', value: 10 }, { title: 'DB11', value: 11 }, { title: 'DB12', value: 12 }, { title: 'DB13', value: 13 }, { title: 'DB14', value: 14 }, { title: 'DB15', value: 15 }, ], disabled: row ? true : false, }, }, { label: lan.public_backup.key, group: { type: 'text', name: 'name', width: '260px', placeholder: lan.database.key_input, disabled: row ? true : false, }, }, { label: lan.public_backup.value, group: { type: 'textarea', name: 'val', width: '260px', style: { 'min-height': '100px', 'line-height': '22px', 'padding-top': '5px', resize: 'both', }, placeholder: lan.database.value_input, }, }, { label: lan.database.term_of_validity, group: { type: 'number', name: 'endtime', width: '235px', placeholder: lan.database.term_of_validity_input, unit: lan.bt.s, }, }, { group: { type: 'help', style: { 'margin-left': '30px' }, list: ['A validity period of 0 means permanent'], }, }, ], data: row ? row : { db_idx: $('#redis_content_tab .tab-nav span.on').data('id') || undefined }, }); this.setLayerCenter(layers); }, yes: function (indexs) { var formValue = redis_form.$get_form_value(); if (formValue.name == '') return layer.msg(lan.database.key_input_tips); if (formValue.val == '') return layer.msg(lan.database.value_input_tips); if (formValue.endtime <= 0) delete formValue.endtime; if (row) { formValue['db_idx'] = $('#redis_content_tab .tab-nav span.on').data('id'); } formValue['sid'] = that.cloudInfo.sid; bt_tools.send( { url: 'database/redis/set_redis_val', data: { data: JSON.stringify(formValue) } }, function (res) { if (res.status) { layer.close(indexs); that.render_redis_content(formValue.db_idx); } bt_tools.msg(res); }, (row ? lan.database.redis_form_req1 : lan.database.redis_form_req2) ); }, setLayerCenter: function ($layer) { var height = $(window).height(); var layerHeight = $layer.height(); var top = (height - layerHeight) / 2; $layer.css('top', top); }, }); }, // 选择需要清空的redis库 choose_redis_list:function(){ var that = this; layer.open({ type: 1, area: '430px', title: lan.database.clear_redis_tit1 + '[' + this.cloudInfo.title + ']' + lan.database.clear_redis_tit2, btn: [lan.public.confirm, lan.public.cancel], shift: 5, closeBtn: 2, shadeClose: false, content:'\ <div class="bt-form pd20" id="choose_redis_from">\ <div class="line">\ <span class="tname" style="width: 150px;">' + lan.database.select_database + '</span>\ <div class="info-r">\ <div class="rule_content_list">\ <div class="rule_checkbox_group" bt-event-click="checkboxMysql" bt-event-type="active_all"><input name="*" type="checkbox" style="display: none;">\ <div class="bt_checkbox_groups active"></div>\ <span class="rule_checkbox_title">' + lan.database.all_select + '</span></div>\ <ul class="rule_checkbox_list"></ul>\ </div>\ </div>\ </div>\ </div>', success: function(layers, index) { var rule_site_list = ''; $.each(that.redisDBList,function(index,item){ rule_site_list += '\ <li>\ <div class="rule_checkbox_group" bt-event-click="checkboxMysql" bt-event-type="active">\ <span class="glyphicon glyphicon-menu-right" style="display:none" aria-hidden="true" bt-event-click="checkboxMysql" bt-event-type="fold"></span>\ <input name="'+ item.name +'" type="checkbox" data-id="'+item.id+'" checked=checked style="display: none;">\ <div class="bt_checkbox_groups active"></div>\ <span class="rule_checkbox_title">'+ item.name +'</span>\ </div>\ </li>'; $('.rule_checkbox_list').html(rule_site_list); that.event_bind(); }); }, yes: function (index, layers) { var redisIDList = []; $('#choose_redis_from .rule_checkbox_list input').each(function (index, el) { if ($(this).prop('checked')) { redisIDList.push($(this).data('id')); } }); if (redisIDList.length == 0) return layer.msg(lan.database.clear_redis_tips1, { icon: 2 }); layer.confirm( lan.database.clear_redis_confirm_cont, { title: lan.database.clear_redis_confirm_tit, closeBtn: 2, icon: 0, }, function (index) { bt_tools.send({ url: 'database/redis/clear_flushdb', data: { data: JSON.stringify({ ids: JSON.stringify(redisIDList), sid: that.cloudInfo.sid }) } }, function (rdata) { if (rdata.status) { that.render_redis_content(); layer.closeAll(); } bt_tools.msg(rdata); }); } ); }, }) }, event_bind:function(){ $('.rule_checkbox_group') .unbind('click') .click(function (ev) { var _type = $(this).attr('bt-event-type'), _checkbox = '.bt_checkbox_groups'; switch (_type) { case 'active_all': // 选中全部 var thatActive = $(this).find(_checkbox), thatList = $(this).next(); if (thatActive.hasClass('active')) { thatActive.removeClass('active').prev().prop('checked', false); thatList.find(_checkbox).removeClass('active').prev().prop('checked', false); } else { thatActive.addClass('active').prev().prop('checked', true); thatList.find(_checkbox).addClass('active').prev().prop('checked', true); } break; case 'active': // 激活选中和取消 var thatActive = $(this).find(_checkbox), thatList = $(this).next(); if (thatActive.hasClass('active')) { thatActive.removeClass('active').prev().prop('checked', false); $('.mysql_content_list>.mysql_checkbox_group input').prop('checked', false).next().removeClass('active'); if (thatList.length == 1) { thatList.find(_checkbox).removeClass('active').prev().prop('checked', false); } else { var nodeLength = $(this).parent().siblings().length + 1, nodeList = $(this).parent().parent(); if (nodeList.find('.bt_checkbox_groups.active').length != nodeLength) { nodeList.prev().find(_checkbox).removeClass('active').prev().prop('checked', false); } } } else { thatActive.addClass('active').prev().prop('checked', true); if (thatList.length == 1) { thatList.find(_checkbox).addClass('active').prev().prop('checked', true); } else { var nodeLength = $(this).parent().siblings().length + 1, nodeList = $(this).parent().parent(); if (nodeList.find('.bt_checkbox_groups.active').length == nodeLength) { nodeList.prev().find(_checkbox).addClass('active').prev().prop('checked', true); } } } break; case 'fold': //折叠数据库列表 if ($(this).hasClass('glyphicon-menu-down')) { $(this).removeClass('glyphicon-menu-down').addClass('glyphicon-menu-right').parent().next().hide(); } else { $(this).removeClass('glyphicon-menu-rigth').addClass('glyphicon-menu-down').parent().next().show(); } break; } $('.rule_content_list').removeAttr('style'); ev.stopPropagation(); }); }, // 重置时间格式 reset_time_format: function (time) { if (time == 0) return lan.public_backup.permanent; var theTime = parseInt(time); // 秒 var middle = 0; // 分 var hour = 0; // 小时 if (theTime > 60) { middle = parseInt(theTime / 60); theTime = parseInt(theTime % 60); if (middle > 60) { hour = parseInt(middle / 60); middle = parseInt(middle % 60); } } var result = '' + parseInt(theTime) + ' ' + lan.site.second + (theTime > 1 ? 's' : ''); if (middle > 0) { result = '' + parseInt(middle) + ' ' + lan.crontab.minute + (middle > 1 ? 's' : '') + ' ' + result; } if (hour > 0) { result = '' + parseInt(hour) + ' ' + lan.crontab.hour + (hour > 1 ? 's' : '') + ' ' + result; } return result; }, } var pgsql ={ // 数据库表格实例 databaseTable: null, // 获取数据库列表 getDatabaseList: function (config) { if (this.databaseTable) { config = config || {}; if (config.isInit) this.databaseTable.config.page.page = 1; this.databaseTable.$refresh_table_list(true); return; } var _that = this; var type = database.getType(); var param = { table: 'databases', search: '' }; $('#bt_pgsql_table').empty(); this.databaseTable = bt_tools.table({ el: '#bt_pgsql_table', url: 'database/' + type + '/get_list', param: param, // 参数 minWidth: '1000px', load: true, autoHeight: true, default: 'The database list is empty', // 数据为空时的默认提示 pageName: 'database', beforeRequest:function(beforeData){ var db_type_val = $('input[name="db_type_filter_' + type + '"]').val(); switch(db_type_val){ case 'all': delete param['db_type'] delete param['sid'] break; case 0: param['db_type'] = 0; break; default: delete param['db_type']; param['sid'] = db_type_val } if (beforeData.hasOwnProperty('data') && typeof beforeData.data === 'string') { delete beforeData['data'] return { data: JSON.stringify($.extend(param,beforeData)) } } return {data:JSON.stringify(param)} }, sortParam: function (data) { return { 'order': data.name + ' ' + data.sort }; }, column:[ { type: 'checkbox', width: 20 }, { fid: 'name', title: lan.database.add_name }, { fid: 'username', title: lan.database.user, sort: true }, { fid: 'password', title: lan.database.add_pass, type: 'password', copy: true, eye_open: true }, { fid:'backup', title: lan.database.backup, width: 130, template: function (item) { var backup = lan.database.backup_empty; var _class = "bt_warning"; if (item.backup_count > 0) { backup = lan.database.backup_ok; _class = 'bt_success'; } var num = item.backup_count > 0 ? '(' + item.backup_count + ')' : ''; // 备份链接 var backupLink = '<a href="javascript:;" class="btlink ' + _class + '" onclick="database.showBackupList(' + item.id + ", '" + item.name + '\')">' + backup + num + '</a>'; // 导入链接 var importLink = '<a href="javascript:;" class="btlink" onclick="database.showImport(\'' + item.name + '\')">' + lan.database.input + '</a>'; return '<span>' + backupLink + ' | ' + importLink + '</span>'; } }, { fid: 'position', title: lan.database.position, type: 'text', width: 116, template: function (row) { var type_column = '-'; var host = row.conn_config.db_host; var port = row.conn_config.db_port; switch(row.db_type){ case 0: type_column = lan.database.add_auth_local; break; case 1: type_column = (lan.database.cloud_database + '(' + host + ':' + port + ')').toString(); break; case 2: var list = database.cloudDatabaseList; $.each(list, function(index, item) { var db_host = item.db_host; var db_port = item.db_port; if (row.sid == item.id) { // 默认显示备注 if (item.ps !== '') { type_column = item.ps } else { type_column = (lan.database.cloud_database + '(' + db_host + ':' + db_port + ')').toString(); } } }) break; } return '<span class="flex" title="' + type_column + '"><span class="text-overflow">' + type_column + '</span></span>'; } }, { fid: 'ps', title: lan.database.add_ps, type: 'input', blur: function (row, index, ev) { bt.pub.set_data_ps({ id: row.id, table: 'databases', ps: ev.target.value }, function (res) { layer.msg(res.msg, (res.status ? {} : { icon: 2 })); }); }, keyup: function (row, index, ev) { if (ev.keyCode === 13) { $(this).blur(); } } }, { type: 'group', title: lan.database.operation, width: 150, align: 'right', group: [{ title: lan.database.edit_pass, tips: lan.database.edit_pass_title, hide: function (rows) { return rows.db_type == 1 }, event: function (row) { database.set_data_pass(row.id, row.username, row.password); } }, { title: lan.database.del, tips: lan.database.del_title, event: function (row) { database.del_database(row.id, row.name, row); } }] } ], // 按钮组 tootls: [ { type: 'group', positon: ['left', 'top'], list: [ { title: lan.database.add_title, active: true, event: function () { database.getCloudServerList(function (list) { bt.database.add_database(list,function (res) { if (res.status) _that.getDatabaseList(); }); }); } }, { title: lan.database.edit_root, event: function () { bt.database.set_root('pgsql') } }, { title: lan.database.cloud_server, event: function () { database.open_cloud_server(); } }, { title: 'Sync all', style:{'margin-left':'30px'}, event: function () { bt.database.sync_to_database({type:0,data:[]},function(res){ if(res.status) _that.getDatabaseList(); }) } }, { title: 'Get DB from server', event: function () { database.getCloudServerList(function (list) { bt_tools.open({ title: lan.database.select_position, area: '450px', btn: [lan.public.confirm, lan.public.cancel], skin: 'databaseCloudServer', content: { 'class':'pd20', form:[{ label: lan.database.position, group:{ type: 'select', name: 'sid', width: '260px', list: list } }] }, success: function (layers) { $(layers).find('.layui-layer-content').css('overflow','inherit'); }, yes:function (form, layers, index){ bt.database.sync_database(form.sid, function (rdata) { if (rdata.status){ _that.getDatabaseList(); layer.close(layers) } }); } }); }); } } ] }, { type: 'batch', // batch_btn positon: ['left', 'bottom'], placeholder: 'Select batch operation', buttonValue: 'Execute', disabledSelectValue: 'Select the DB to execute!!', selectList: [ { title: 'Sync to Server', url: '/database/' + type + '/SyncToDatabases', paramName: 'data', // 列表参数名,可以为空 th: 'Database Name', beforeRequest: function(list) { var arry = []; $.each(list, function (index, item) { arry.push(item.id); }); return JSON.stringify({ids:JSON.stringify(arry),type:1}) }, success: function (res, list, that) { layer.closeAll(); var html = ''; $.each(list, function (index, item) { html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right"><span style="color:' + (res.status ? '#20a53a' : 'red') + '">' + res.msg + '</span></td>\ </tr>'; }); that.$batch_success_table({ title: 'Batch sync selected', th: 'Database Name', area: '450px', html: html }); } }, { title: 'Database Backup', url: type == 'mysql' ? 'database?action=ToBackup' : '/database/' + type + '/ToBackup', load: true, param: function (row) { return type == 'mysql' ? { id: row.id } : {data:JSON.stringify({id: row.id})} }, // 手动执行,data参数包含所有选中的站点 callback: function (that) { that.start_batch({}, function (list) { var html = ''; for(var i=0;i<list.length;i++){ var item = list[i]; html += '<tr><td>'+ item.name +'</td><td><div style="float:right;"><span style="color:'+ (item.request.status?'#20a53a':'red') +'">'+ item.request.msg +'</span></div></td></tr>'; } _that.databaseTable.$batch_success_table({ title: 'Batch backup database', th: 'Database Name', html: html, area: '480px', }); _that.getDatabaseList(); }); } }, { title: 'Delete database', url: '/database/' + type + '/DeleteDatabase', load: true, param: function (row) { return { data: JSON.stringify({ id: row.id, name: row.name }) } }, callback: function (that) { // 手动执行,data参数包含所有选中的站点 var ids = []; for (var i = 0; i < that.check_list.length; i++) { ids.push(that.check_list[i].id); } database.del_database(ids,function(param){ that.start_batch(param, function (list) { layer.closeAll() var html = ''; for (var i = 0; i < list.length; i++) { var item = list[i]; html += '\ <tr>\ <td>' + item.name + '</td>\ <td class="text-right">\ <span style="color:' + (item.request.status ? '#20a53a' : 'red') + '">' + item.request.msg + '</span>\ </td>\ </tr>'; } database_table.$batch_success_table({ title: 'Batch deletion', th: 'Database Name', html: html }); _that.getDatabaseList(); }); }) } } ] }, { type: 'search', positon: ['right', 'top'], placeholder: lan.database.database_search, searchParam: 'search', //搜索请求字段,默认为 search value: '',// 当前内容,默认为空 }, { type: 'page', // 分页显示 positon: ['right', 'bottom'], // 默认在右下角 pageParam: 'p', // 分页请求字段,默认为 : p page: 1, // 当前分页 默认:1 numberParam: 'limit', // 分页数量请求字段默认为 : limit number: 20, // 分页数量默认 : 20条 numberList: [10, 20, 50, 100, 200], // 分页显示数量列表 numberStatus: true, //是否支持分页数量选择,默认禁用 jump: true, // 是否支持跳转分页,默认禁用 } ] }); database.renderCloudServerSelect(); } } database.init();
Close