Files
yakpanel-core/YakPanel/static/js/database.js

3351 lines
103 KiB
JavaScript
Raw Normal View History

2026-04-07 02:04:22 +05:30
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">YakPanel 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 + '&amp;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:\'YakPanel 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, '\&quot;')+'"><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("&quot;", "\""));
}
}
},
{ 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();