pull/156/head
midoks 3 years ago
parent 5c3840ee63
commit 8daa136bc8
  1. 2
      plugins/postgresql/class/pg.py
  2. 6
      plugins/postgresql/index.html
  3. 200
      plugins/postgresql/index.py
  4. 284
      plugins/postgresql/js/postgresql.js

@ -39,7 +39,9 @@ class ORM:
self.__DB_CONN = psycopg2.connect(database='postgres', user=self.__DB_USER, password=self.__DB_PASS,
host=self.__DB_HOST, port=int(self.__DB_PORT))
self.__DB_CONN.autocommit = True
self.__DB_CUR = self.__DB_CONN.cursor()
return True
except Exception as e:
self.__DB_ERR = e

@ -2,15 +2,15 @@
<div class='plugin_version'></div>
<div class="bt-w-main">
<div class="bt-w-menu">
<!-- <script type="text/javascript">console.log($('.plugin_version').attr('version'));</script> -->
<p class="bgw" onclick="pluginService('postgresql', $('.plugin_version').attr('version'));">服务</p>
<p onclick="pluginInitD('postgresql', $('.plugin_version').attr('version'));">自启动</p>
<p onclick="pluginConfigTpl('postgresql');">配置文件</p>
<!--<p onclick="myDbPos();">存储位置</p> -->
<p onclick="pluginConfigTpl('postgresql');">配置文件</p>
<p onclick="pluginConfig('postgresql','','pg_hba_conf');">客服端认证</p>
<p onclick="pgPort();">端口</p>
<p onclick="runInfo();">当前状态</p>
<p onclick="pgPerfOpt();">性能优化</p>
<p onclick="pluginLogs('postgresql',$('.plugin_version').attr('version'),'run_log');">日志</p>
<p onclick="pluginLogs('postgresql',$('.plugin_version').attr('version'),'slow_log');">慢日志</p>
<!--<p onclick="pluginLogs('postgresql',$('.plugin_version').attr('version'),'show_log');">慢日志</p>-->
<p onclick="dbList()">管理列表</p>
<!--<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p> -->

@ -87,6 +87,10 @@ def configTpl():
return mw.getJson(clist)
def pgHbaConf():
return getServerDir() + "/data/pg_hba.conf"
def readConfigTpl():
args = getArgs()
data = checkArgs(args, ['file'])
@ -174,7 +178,7 @@ def initDreplace(version=''):
init_pl = conf_dir + "/init.pl"
if not os.path.exists(init_pl):
# mw.writeFile(init_pl, 'ok')
mw.writeFile(init_pl, 'ok')
pg_conf = conf_dir + '/data/postgresql.conf'
tpl = getPluginDir() + '/conf/postgresql.conf'
content = mw.readFile(tpl)
@ -221,50 +225,6 @@ def status(version=''):
return 'start'
def getDataDir():
file = getConf()
content = mw.readFile(file)
rep = 'datadir\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getPidFile():
file = getConf()
content = mw.readFile(file)
rep = 'pid-file\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def getErrorLog():
args = getArgs()
path = getDataDir()
filename = ''
for n in os.listdir(path):
if len(n) < 5:
continue
if n == 'error.log':
filename = path + '/' + n
break
# print filename
if not os.path.exists(filename):
return mw.returnJson(False, '指定文件不存在!')
if 'close' in args:
mw.writeFile(filename, '')
return mw.returnJson(False, '日志已清空')
info = mw.getNumLines(filename, 18)
return mw.returnJson(True, 'OK', info)
def getShowLogFile():
file = getConf()
content = mw.readFile(file)
rep = 'slow-query-log-file\s*=\s*(.*)'
tmp = re.search(rep, content)
return tmp.groups()[0].strip()
def pGetDbUser():
if mw.isAppleSystem():
user = mw.execShell(
@ -398,7 +358,7 @@ def getMyDbPos():
return tmp.groups()[0].strip()
def setMyDbPos():
def setPgDbPos():
args = getArgs()
data = checkArgs(args, ['datadir'])
if not data[0]:
@ -522,6 +482,11 @@ def runLog():
return getServerDir() + "/logs/server.log"
def getSlowLog():
# pgsql慢日志查询
return getServerDir() + "/logs/" + time.strftime("postgresql-%Y-%m-%d.log")
def getUnit(args):
unit = ''
if "GB" in args:
@ -550,7 +515,7 @@ def pgDbStatus():
shared_buffers_num = re.match(
r'\d+', shared_buffers.strip()).group() if re.match(r'\d+', shared_buffers.strip()) else ""
data['shared_buffers'] = [shared_buffers_num, "MB",
"PG通过shared_buffers和内核和磁盘打交道,通常设置为实际内存的10%"]
"PG通过shared_buffers和内核和磁盘打交道,通常设置为实际内存的10%."]
if i.strip().startswith("work_mem"):
work_mem = i.split("=")[1]
@ -560,7 +525,7 @@ def pgDbStatus():
work_mem_num = re.match(
r'\d+', work_mem.strip()).group() if re.match(r'\d+', work_mem.strip()) else ""
data['work_mem'] = [work_mem_num, "MB",
"增加work_mem有助于提高排序的速度。通常设置为实际RAM的2% -4%"]
"增加work_mem有助于提高排序的速度。通常设置为实际RAM的2% -4%."]
if i.strip().startswith("effective_cache_size"):
effective_cache_size = i.split("=")[1]
@ -570,7 +535,7 @@ def pgDbStatus():
effective_cache_size_num = re.match(r'\d+', effective_cache_size.strip(
)).group() if re.match(r'\d+', effective_cache_size.strip()) else ""
data['effective_cache_size'] = [effective_cache_size_num,
"GB", "pgsql能够使用的最大缓存,比如4G的内存,可以设置为3GB."]
"GB", "PG能够使用的最大缓存,比如4G的内存,可以设置为3GB."]
if i.strip().startswith("temp_buffers "):
temp_buffers = i.split("=")[1]
@ -647,28 +612,34 @@ def pgDbStatus():
return mw.getJson(data)
def setDbStatus():
gets = ['key_buffer_size', 'tmp_table_size', 'max_heap_table_size', 'innodb_buffer_pool_size', 'innodb_log_buffer_size', 'max_connections',
'table_open_cache', 'thread_cache_size', 'sort_buffer_size', 'read_buffer_size', 'read_rnd_buffer_size', 'join_buffer_size', 'thread_stack', 'binlog_cache_size']
emptys = ['max_connections', 'thread_cache_size', 'table_open_cache']
def sedConf(name, val):
path = getServerDir() + "/data/postgresql.conf"
content = ''
with open(path) as f:
for i in f:
if i.strip().startswith(name):
i = "{} = {} \n".format(name, val)
content += i
mw.writeFile(path, content)
return True
def pgSetDbStatus():
'''
保存pgsql性能调整信息
'''
args = getArgs()
conFile = getConf()
content = mw.readFile(conFile)
n = 0
for g in gets:
s = 'M'
if n > 5:
s = 'K'
if g in emptys:
s = ''
rep = '\s*' + g + '\s*=\s*\d+(M|K|k|m|G)?\n'
c = g + ' = ' + args[g] + s + '\n'
if content.find(g) != -1:
content = re.sub(rep, '\n' + c, content, 1)
else:
content = content.replace('[mysqld]\n', '[mysqld]\n' + c)
n += 1
mw.writeFile(conFile, content)
data = checkArgs(args, ['shared_buffers', 'work_mem', 'effective_cache_size',
'temp_buffers', 'max_connections', 'max_prepared_transactions',
'max_stack_depth', 'bgwriter_lru_maxpages', 'max_worker_processes'])
if not data[0]:
return data[1]
for k, v in args.items():
sedConf(k, v)
restart()
return mw.returnJson(True, '设置成功!')
@ -868,28 +839,35 @@ def syncGetDatabases():
def addDb():
args = getArgs()
data = checkArgs(
args, ['password', 'name', 'codeing', 'db_user', 'dataAccess', 'ps'])
data = checkArgs(args, ['password', 'name', 'db_user', 'dataAccess'])
if not data[0]:
return data[1]
if not 'address' in args:
address = ''
else:
address = ''
if 'address' in args:
address = args['address'].strip()
dbname = args['name'].strip()
dbuser = args['db_user'].strip()
codeing = args['codeing'].strip()
password = args['password'].strip()
dataAccess = args['dataAccess'].strip()
ps = args['ps'].strip()
listen_ip = "127.0.0.1/32"
if 'listen_ip' in args:
listen_ip = args['listen_ip'].strip()
if not re.match(r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}/\d+", listen_ip):
return mw.returnJson(False, "你输入的权限不合法,添加失败!")
# # 修改监听所有地址
# if listen_ip not in ["127.0.0.1/32", "localhost", "127.0.0.1"]:
# sedConf("listen_addresses", "'*'")
reg = "^[\w\.-]+$"
if not re.match(reg, args['name']):
return mw.returnJson(False, '数据库名称不能带有特殊符号!')
checks = ['root', 'mysql', 'test', 'sys', 'panel_logs']
checks = ['root', 'mysql', 'test', 'sys', 'postgres', 'postgresql']
if dbuser in checks or len(dbuser) < 1:
return mw.returnJson(False, '数据库用户名不合法!')
if dbname in checks or len(dbname) < 1:
@ -898,37 +876,57 @@ def addDb():
if len(password) < 1:
password = mw.md5(time.time())[0:8]
wheres = {
'utf8': 'utf8_general_ci',
'utf8mb4': 'utf8mb4_general_ci',
'gbk': 'gbk_chinese_ci',
'big5': 'big5_chinese_ci'
}
codeStr = wheres[codeing]
pdb = pgDb()
psdb = pSqliteDb('databases')
if psdb.where("name=? or username=?", (dbname, dbuser)).count():
return mw.returnJson(False, '数据库已存在!')
result = pdb.execute("create database " + dbname)
return mw.returnJson(False, '数据库或用户已存在!')
print(result)
return
r = pdb.execute("create database " + dbname)
r = pdb.execute("create user " + dbuser)
pdb.execute("alter user {} with password '{}'".format(dbuser, password,))
pdb.execute(
"GRANT ALL PRIVILEGES ON DATABASE {} TO {}".format(dbname, dbuser,))
# pdb.execute("drop user '" + dbuser + "'@'localhost'")
# for a in address.split(','):
# pdb.execute("drop user '" + dbuser + "'@'" + a + "'")
pg_hba = getServerDir() + "/data/pg_hba.conf"
# __createUser(dbname, dbuser, password, address)
content = mw.readFile(pg_hba)
content += "\nhost {} {} {} md5".format(
dbname, dbuser, listen_ip)
mw.writeFile(pg_hba, content)
addTime = time.strftime('%Y-%m-%d %X', time.localtime())
psdb.add('pid,name,username,password,accept,ps,addtime',
(0, dbname, dbuser, password, address, ps, addTime))
(0, dbname, dbuser, password, address, dbname, addTime))
restart()
return mw.returnJson(True, '添加成功!')
def delDb():
args = getArgs()
data = checkArgs(args, ['id', 'name'])
if not data[0]:
return data[1]
did = args['id']
name = args['name']
pdb = pgDb()
psdb = pSqliteDb('databases')
pdb.execute("drop database " + name)
username = psdb.where('id=?', (did,)).getField('username')
pdb.execute("drop user " + username)
pg_hba = getServerDir() + "/data/pg_hba.conf"
old_config = mw.readFile(pg_hba)
new_config = re.sub(r'host\s*{}.*'.format(name), '', old_config).strip()
mw.writeFile(pg_hba, new_config)
psdb.where("id=?", (did,)).delete()
return mw.returnJson(True, '删除成功!')
def installPreInspection(version):
return 'ok'
@ -966,6 +964,8 @@ if __name__ == "__main__":
print(uninstallPreInspection(version))
elif func == 'conf':
print(getConf())
elif func == 'pg_hba_conf':
print(pgHbaConf())
elif func == 'config_tpl':
print(configTpl())
elif func == 'read_config_tpl':
@ -974,8 +974,12 @@ if __name__ == "__main__":
print(runInfo())
elif func == 'run_log':
print(runLog())
elif func == 'slow_log':
print(getSlowLog())
elif func == 'db_status':
print(pgDbStatus())
elif func == 'set_db_status':
print(pgSetDbStatus())
elif func == 'pg_port':
print(getPgPort())
elif func == 'set_pg_port':
@ -984,6 +988,8 @@ if __name__ == "__main__":
print(getDbList())
elif func == 'add_db':
print(addDb())
elif func == 'del_db':
print(delDb())
elif func == 'sync_get_databases':
print(syncGetDatabases())
else:

@ -103,26 +103,6 @@ function runInfo(){
}
function myDbPos(){
myPost('my_db_pos','',function(data){
var con = '<div class="line ">\
<div class="info-r ml0">\
<input id="datadir" name="datadir" class="bt-input-text mr5 port" type="text" style="width:330px" value="'+data.data+'">\
<span class="glyphicon cursor mr5 glyphicon-folder-open icon_datadir" onclick="changePath(\'datadir\')"></span>\
<button id="btn_change_path" name="btn_change_path" class="btn btn-success btn-sm mr5 ml5 btn_change_port">迁移</button>\
</div></div>';
$(".soft-man-con").html(con);
$('#btn_change_path').click(function(){
var datadir = $("input[name='datadir']").val();
myPost('set_db_pos','datadir='+datadir,function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg,{icon:rdata.status ? 1 : 5,time:2000,shade: [0.3, '#000']});
});
});
});
}
function pgPort(){
myPost('pg_port','',function(data){
var con = '<div class="line ">\
@ -148,7 +128,7 @@ function pgPort(){
//数据库存储信置
function changeMySQLDataPath(act) {
function changePgDataPath(act) {
if (act != undefined) {
layer.confirm(lan.soft.mysql_to_msg, { closeBtn: 2, icon: 3 }, function() {
var datadir = $("#datadir").val();
@ -176,155 +156,48 @@ function pgPerfOpt() {
//获取MySQL配置
myPost('db_status','',function(data){
var rdata = $.parseJSON(data.data);
console.log(rdata);
var html_p = '';
for (i in rdata){
if (i!='status'){
if (i != 'status' ){
var v = rdata[i];
html_p += '<p><span>'+i+'</span><input style="width: 70px;" class="bt-input-text mr5" name="'+i+'" value="' + v[0] + '" type="number" >'+v[1] +', <font>' + v[2] + '</font></p>'
html_p += '<p><span>'+i+'</span><input style="width: 70px;" class="bt-input-text mr5" unit="'+v[1]+'" name="'+i+'" value="' + v[0] + '" type="number" >'+v[1] +', <font>' + v[2] + '</font></p>'
}
}
var memCon = '<div class="conf_p" style="margin-bottom:0">\
<div style="border-bottom:#ccc 1px solid;padding-bottom:10px;margin-bottom:10px"><span><b>最大使用内存: </b></span>\
<select class="bt-input-text" name="pg_set" style="margin-left:-4px">\
<option value="0">请选择</option>\
<option value="1">1-2GB</option>\
<option value="2">2-4GB</option>\
<option value="3">4-8GB</option>\
<option value="4">8-16GB</option>\
<option value="5">16-32GB</option>\
</select>\
<span>最大使用内存: </span><input style="width:70px;background-color:#eee;" class="bt-input-text mr5" name="memSize" type="text" value="' + "10" + '" readonly>MB\
</div>\
'+html_p+'\
</div>'
var memCon = '<form class="bt-form" id="pg_conf"><div class="conf_p" style="margin-bottom:0">'+html_p
+'<div style="margin-top:10px; padding-right:15px" class="text-right">\
<div>\
<button class="btn btn-success btn-sm mr5" onclick="reBootMySqld()">重启数据库</button>\
<button class="btn btn-success btn-sm" onclick="setPgConf()">保存</button></div>\
</div>'
+'</div></form>'
$(".soft-man-con").html(memCon);
$(".conf_p input[name*='size'],.conf_p input[name='max_connections'],.conf_p input[name='thread_stack']").change(function() {
comMySqlMem();
});
$(".conf_p select[name='pg_set']").change(function() {
pgSQLMemOpt($(this).val());
comMySqlMem();
$("#pg_conf").change(function (e) {
  e.preventDefault();
var data = {};
$('#pg_conf p input').each(function (index, element) {
data[$(this).attr('name')] = $(this).val() + ($(this).attr('unit') || '');
})
// console.log(data);
myPost('set_db_status', data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
},{ icon: rdata.status ? 1 : 2 });
});
return false;
});
});
}
function reBootMySqld(){
pluginOpService('mysql','restart','');
}
//设置MySQL配置参数
function setMySQLConf() {
$.post('/system/system_total', '', function(memInfo) {
var memSize = memInfo['memTotal'];
var setSize = parseInt($("input[name='memSize']").val());
if(memSize < setSize){
var errMsg = "错误,内存分配过高!<p style='color:red;'>物理内存: {1}MB<br>最大使用内存: {2}MB<br>可能造成的后果: 导致数据库不稳定,甚至无法启动MySQLd服务!";
var msg = errMsg.replace('{1}',memSize).replace('{2}',setSize);
layer.msg(msg,{icon:2,time:5000});
return;
}
var query_cache_size = parseInt($("input[name='query_cache_size']").val());
var query_cache_type = 0;
if (query_cache_size > 0) {
query_cache_type = 1;
}
var data = {
key_buffer_size: parseInt($("input[name='key_buffer_size']").val()),
query_cache_size: query_cache_size,
query_cache_type: query_cache_type,
tmp_table_size: parseInt($("input[name='tmp_table_size']").val()),
max_heap_table_size: parseInt($("input[name='tmp_table_size']").val()),
innodb_buffer_pool_size: parseInt($("input[name='innodb_buffer_pool_size']").val()),
innodb_log_buffer_size: parseInt($("input[name='innodb_log_buffer_size']").val()),
sort_buffer_size: parseInt($("input[name='sort_buffer_size']").val()),
read_buffer_size: parseInt($("input[name='read_buffer_size']").val()),
read_rnd_buffer_size: parseInt($("input[name='read_rnd_buffer_size']").val()),
join_buffer_size: parseInt($("input[name='join_buffer_size']").val()),
thread_stack: parseInt($("input[name='thread_stack']").val()),
binlog_cache_size: parseInt($("input[name='binlog_cache_size']").val()),
thread_cache_size: parseInt($("input[name='thread_cache_size']").val()),
table_open_cache: parseInt($("input[name='table_open_cache']").val()),
max_connections: parseInt($("input[name='max_connections']").val())
};
myPost('set_db_status', data, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
reBootMySqld();
},{ icon: rdata.status ? 1 : 2 });
});
},'json');
}
//MySQL内存优化方案
function pgSQLMemOpt(opt) {
var query_size = parseInt($("input[name='query_cache_size']").val());
switch (opt) {
case '0':
$("input[name='key_buffer_size']").val(8);
if (query_size) $("input[name='query_cache_size']").val(4);
$("input[name='tmp_table_size']").val(8);
$("input[name='innodb_buffer_pool_size']").val(16);
$("input[name='sort_buffer_size']").val(256);
$("input[name='read_buffer_size']").val(256);
$("input[name='read_rnd_buffer_size']").val(128);
$("input[name='join_buffer_size']").val(128);
$("input[name='thread_stack']").val(256);
$("input[name='binlog_cache_size']").val(32);
$("input[name='thread_cache_size']").val(4);
$("input[name='table_open_cache']").val(32);
$("input[name='max_connections']").val(500);
break;
case '1':
$("input[name='key_buffer_size']").val(128);
if (query_size) $("input[name='query_cache_size']").val(64);
$("input[name='tmp_table_size']").val(64);
$("input[name='innodb_buffer_pool_size']").val(256);
$("input[name='sort_buffer_size']").val(768);
$("input[name='read_buffer_size']").val(768);
$("input[name='read_rnd_buffer_size']").val(512);
$("input[name='join_buffer_size']").val(1024);
$("input[name='thread_stack']").val(256);
$("input[name='binlog_cache_size']").val(64);
$("input[name='thread_cache_size']").val(64);
$("input[name='table_open_cache']").val(128);
$("input[name='max_connections']").val(100);
break;
}
function reBootPgSqld(){
pluginOpService('postgresql','restart','');
}
//计算MySQL内存开销
function comMySqlMem() {
var key_buffer_size = parseInt($("input[name='key_buffer_size']").val());
var query_cache_size = parseInt($("input[name='query_cache_size']").val());
var tmp_table_size = parseInt($("input[name='tmp_table_size']").val());
var innodb_buffer_pool_size = parseInt($("input[name='innodb_buffer_pool_size']").val());
var innodb_additional_mem_pool_size = parseInt($("input[name='innodb_additional_mem_pool_size']").val());
var innodb_log_buffer_size = parseInt($("input[name='innodb_log_buffer_size']").val());
var sort_buffer_size = $("input[name='sort_buffer_size']").val() / 1024;
var read_buffer_size = $("input[name='read_buffer_size']").val() / 1024;
var read_rnd_buffer_size = $("input[name='read_rnd_buffer_size']").val() / 1024;
var join_buffer_size = $("input[name='join_buffer_size']").val() / 1024;
var thread_stack = $("input[name='thread_stack']").val() / 1024;
var binlog_cache_size = $("input[name='binlog_cache_size']").val() / 1024;
var max_connections = $("input[name='max_connections']").val();
var a = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size
var b = sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size
var memSize = a + max_connections * b
$("input[name='memSize']").val(memSize.toFixed(2));
//设置PG配置参数
function setPgConf() {
return false;
}
function syncGetDatabase(){
@ -360,33 +233,28 @@ function setRootPwd(type, pwd){
showMsg(rdata.msg,function(){
dbList();
$('.layui-layer-close1').click();
},{icon: rdata.status ? 1 : 2});
},{icon: rdata.status ? 1 : 2});
});
return;
}
var index = layer.open({
type: 1,
skin: 'demo-class',
area: '500px',
title: '修改数据库密码',
closeBtn: 1,
shift: 5,
shadeClose: true,
content: "<form class='bt-form pd20 pb70' id='mod_pwd'>\
btn:["取消","提交"],
content: "<form class='bt-form pd20' id='mod_pwd'>\
<div class='line'>\
<span class='tname'>root密码</span>\
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+pwd+"' /><span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\
</div>\
<div class='bt-form-submit-btn'>\
<button id='my_mod_close' type='button' class='btn btn-danger btn-sm btn-title'>关闭</button>\
<button type='button' class='btn btn-success btn-sm btn-title' onclick=\"setRootPwd(1)\" >提交</button>\
</div>\
</form>",
});
$('#my_mod_close').click(function(){
$('.layui-layer-close1').click();
</form>",
yes:function(){
setRootPwd(1);
}
});
}
@ -557,85 +425,86 @@ function setDbPass(id, username, password){
});
}
function addDatabase(type){
if (type==1){
function addDatabase(type,layer_index){
if (type == 1){
var data = $("#add_db").serialize();
data = decodeURIComponent(data);
var dataObj = str2Obj(data);
if(!dataObj['address']){
dataObj['address'] = dataObj['dataAccess'];
}
var ip_segment = $('[name="dataAccess"]').val();
if ($('[name="dataAccess"]').val() == 'ip'){
dataObj['listen_ip'] = ip_segment;
}
myPost('add_db', dataObj, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg,function(){
layer.close(layer_index);
if (rdata.status){
dbList();
}
$('.layui-layer-close1').click();
},{icon: rdata.status ? 1 : 2},600);
},{icon: rdata.status ? 1 : 2},2000);
});
return;
}
var index = layer.open({
layer.open({
type: 1,
skin: 'demo-class',
area: '500px',
area: '450px',
title: '添加数据库',
closeBtn: 1,
shift: 5,
shadeClose: true,
content: "<form class='bt-form pd20 pb70' id='add_db'>\
btn:["提交","取消"],
content: "<form class='bt-form pd20' id='add_db'>\
<div class='line'>\
<span class='tname'>数据库名</span>\
<div class='info-r'><input name='name' class='bt-input-text mr5' placeholder='新的数据库名称' type='text' style='width:65%' value=''>\
<select class='bt-input-text mr5 codeing_a5nGsm' name='codeing' style='width:27%'>\
<option value='utf8'>utf-8</option>\
<option value='utf8mb4'>utf8mb4</option>\
<option value='gbk'>gbk</option>\
<option value='big5'>big5</option>\
</select>\
<div class='info-r'>\
<input name='name' class='bt-input-text mr5' placeholder='新的数据库名称' type='text' style='width:270px' value=''>\
</div>\
</div>\
<div class='line'><span class='tname'>用户名</span><div class='info-r'><input name='db_user' class='bt-input-text mr5' placeholder='' type='text' style='width:65%' value=''></div></div>\
<div class='line'><span class='tname'>用户名</span><div class='info-r'><input name='db_user' class='bt-input-text mr5' placeholder='' type='text' style='width:270px' value=''></div></div>\
<div class='line'>\
<span class='tname'>密码</span>\
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:330px' value='"+(randomStrPwd(16))+"' /><span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\
<div class='info-r'><input class='bt-input-text mr5' type='text' name='password' id='MyPassword' style='width:270px' value='"+(randomStrPwd(16))+"' />\
<span title='随机密码' class='glyphicon glyphicon-repeat cursor' onclick='repeatPwd(16)'></span></div>\
</div>\
<div class='line'>\
<span class='tname'>访问权限</span>\
<div class='info-r '>\
<div class='info-r'>\
<select class='bt-input-text mr5' name='dataAccess' style='width:100px'>\
<option value='127.0.0.1'>本地服务器</option>\
<option value=\"%\">所有人</option>\
<option value='ip'>指定IP</option>\
<option value='ip'>指定网段</option>\
</select>\
<input class='bt-input-text' style='width: 162px;display:none;' placeholder='如: 192.168.1.0/24' name='ip_segment' value='' />\
</div>\
</div>\
<input type='hidden' name='ps' value='' />\
<div class='bt-form-submit-btn'>\
<button id='my_mod_close' type='button' class='btn btn-danger btn-sm btn-title'>关闭</button>\
<button type='button' class='btn btn-success btn-sm btn-title' onclick=\"addDatabase(1)\" >提交</button>\
</div>\
</form>",
});
success:function(){
$("input[name='name']").keyup(function(){
var v = $(this).val();
$("input[name='db_user']").val(v);
$("input[name='ps']").val(v);
});
$("input[name='name']").keyup(function(){
var v = $(this).val();
$("input[name='db_user']").val(v);
});
$('#my_mod_close').click(function(){
$('.layui-layer-close1').click();
});
$('select[name="dataAccess"]').change(function(){
var v = $(this).val();
if (v == 'ip'){
$(this).after("<input id='dataAccess_subid' class='bt-input-text mr5' type='text' name='address' placeholder='多个IP使用逗号(,)分隔' style='width: 230px; display: inline-block;'>");
} else {
$('#dataAccess_subid').remove();
$('select[name="dataAccess"]').change(function(){
var v = $(this).val();
if (v == 'ip'){
$('input[name="ip_segment"]').show();
} else {
$('input[name="ip_segment"]').hide();
}
});
},
yes:function(index){
addDatabase(1,index);
}
});
}
function delDb(id, name){
@ -886,8 +755,7 @@ function dbList(page, search){
}
list += '<a href="javascript:;" class="btlink" onclick="repTools(\''+rdata.data[i]['name']+'\')" title="MySQL优化修复工具">工具</a> | ' +
'<a href="javascript:;" class="btlink" onclick="setDbAccess(\''+rdata.data[i]['username']+'\')" title="设置数据库权限">权限</a> | ' +
list += '<a href="javascript:;" class="btlink" onclick="setDbAccess(\''+rdata.data[i]['username']+'\')" title="设置数据库权限">权限</a> | ' +
rw +
'<a href="javascript:;" class="btlink" onclick="setDbPass('+rdata.data[i]['id']+',\''+ rdata.data[i]['username'] +'\',\'' + rdata.data[i]['password'] + '\')">改密</a> | ' +
'<a href="javascript:;" class="btlink" onclick="delDb(\''+rdata.data[i]['id']+'\',\''+rdata.data[i]['name']+'\')" title="删除数据库">删除</a>' +

Loading…
Cancel
Save