Skip to content

增加展示数据库和用户信息 #1398

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion archery/settings.py
Original file line number Diff line number Diff line change
@@ -311,4 +311,4 @@

PKEY_ROOT = os.path.join(MEDIA_ROOT, 'keys')
if not os.path.exists(PKEY_ROOT):
os.mkdir(PKEY_ROOT)
os.mkdir(PKEY_ROOT)
35 changes: 32 additions & 3 deletions sql/instance_account.py
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@
def users(request):
"""获取实例用户列表"""
instance_id = request.POST.get('instance_id')
saved = True if request.POST.get('saved') == 'true' else False # 平台是否保存
saved = request.POST.get('saved')

if not instance_id:
return JsonResponse({'status': 0, 'msg': '', 'data': []})
@@ -28,7 +28,7 @@ def users(request):

# 获取已录入用户
cnf_users = dict()
for user in InstanceAccount.objects.filter(instance=instance).values('id', 'user', 'host', 'remark'):
for user in InstanceAccount.objects.filter(instance=instance).values('id', 'user', 'host' , 'password', 'remark'):
user['saved'] = True
cnf_users[f"`{user['user']}`@`{user['host']}`"] = user
# 获取所有用户
@@ -61,7 +61,12 @@ def users(request):
rows.append(row)
# 过滤参数
if saved:
rows = [row for row in rows if row['saved']]
#request.POST.get传来的是str,list中保存的是布尔
if saved == 'True':
saved = bool(saved)
else:
saved = bool("")
rows = [row for row in rows if row['saved'] == saved]

result = {'status': 0, 'msg': 'ok', 'rows': rows}
else:
@@ -72,6 +77,30 @@ def users(request):
return HttpResponse(json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True),
content_type='application/json')

@permission_required('sql.instance_account_manage', raise_exception=True)
def requ_password(request):
"""获取数据库用户密码"""
instance_id = request.POST.get('instance_id', 0)
user = request.POST.get('user')
host = request.POST.get('host')

if not instance_id:
return JsonResponse({'status': 0, 'msg': '', 'data': []})
try:
instance = user_instances(request.user, db_type=['mysql']).get(id=instance_id)
except Instance.DoesNotExist:
return JsonResponse({'status': 1, 'msg': '你所在组未关联该实例', 'data': []})

# 获取已录入用户

cnf_users = dict()
for user_password in InstanceAccount.objects.filter(instance=instance,user = user, host = host).values('id', 'user','host','password' ):
cnf_users = user_password

result = {'status': 0, 'msg': 'ok', 'rows': cnf_users}

return HttpResponse(json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True),
content_type='application/json')

@permission_required('sql.instance_account_manage', raise_exception=True)
def create(request):
20 changes: 13 additions & 7 deletions sql/instance_database.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: UTF-8 -*-
"""
"""
@author: hhyo
@license: Apache Licence
@file: instance_database.py
@@ -24,7 +24,7 @@
def databases(request):
"""获取实例数据库列表"""
instance_id = request.POST.get('instance_id')
saved = True if request.POST.get('saved') == 'true' else False # 平台是否保存
saved = request.POST.get('saved')

if not instance_id:
return JsonResponse({'status': 0, 'msg': '', 'data': []})
@@ -37,12 +37,12 @@ def databases(request):
# 获取已录入数据库
cnf_dbs = dict()
for db in InstanceDatabase.objects.filter(
instance=instance).values('id', 'db_name', 'owner', 'owner_display', 'remark'):
instance=instance).values('id', 'db_name', 'owner', 'owner_display', 'remark','in_use'):
db['saved'] = True
cnf_dbs[f"{db['db_name']}"] = db

# 获取所有数据库
sql_get_db = """SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
sql_get_db = """SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'test', 'sys');"""
query_engine = get_engine(instance=instance)
@@ -71,7 +71,11 @@ def databases(request):
rows.append(row)
# 过滤参数
if saved:
rows = [row for row in rows if row['saved']]
if saved == 'True':
saved = bool(saved)
else:
saved = bool("")
rows = [row for row in rows if row['saved'] == saved ]

result = {'status': 0, 'msg': 'ok', 'rows': rows}
else:
@@ -90,6 +94,7 @@ def create(request):
db_name = request.POST.get('db_name')
owner = request.POST.get('owner', '')
remark = request.POST.get('remark', '')
in_use = request.POST.get('in_use', '')

if not all([db_name]):
return JsonResponse({'status': 1, 'msg': '参数不完整,请确认后提交', 'data': []})
@@ -114,7 +119,7 @@ def create(request):
# 保存到数据库
else:
InstanceDatabase.objects.create(
instance=instance, db_name=db_name, owner=owner, owner_display=owner_display, remark=remark)
instance=instance, db_name=db_name, owner=owner, owner_display=owner_display, remark=remark,in_use = in_use )
# 清空实例资源缓存
r = get_redis_connection("default")
for key in r.scan_iter(match='*insRes*', count=2000):
@@ -129,6 +134,7 @@ def edit(request):
db_name = request.POST.get('db_name')
owner = request.POST.get('owner', '')
remark = request.POST.get('remark', '')
in_use = request.POST.get('in_use', '')

if not all([db_name]):
return JsonResponse({'status': 1, 'msg': '参数不完整,请确认后提交', 'data': []})
@@ -147,5 +153,5 @@ def edit(request):
InstanceDatabase.objects.update_or_create(
instance=instance,
db_name=db_name,
defaults={"owner": owner, "owner_display": owner_display, "remark": remark})
defaults={"owner": owner, "owner_display": owner_display, "remark": remark,"in_use" : in_use})
return JsonResponse({'status': 0, 'msg': '', 'data': []})
1 change: 1 addition & 0 deletions sql/models.py
Original file line number Diff line number Diff line change
@@ -514,6 +514,7 @@ class InstanceDatabase(models.Model):
owner = models.CharField('负责人', max_length=50, default='', blank=True)
owner_display = models.CharField('负责人中文名', max_length=50, default='', blank=True)
remark = models.CharField('备注', max_length=255, default='', blank=True)
in_use = models.CharField('在用状态', max_length=1, default='', blank=True)
sys_time = models.DateTimeField('系统修改时间', auto_now=True)

class Meta:
34 changes: 32 additions & 2 deletions sql/templates/database.html
Original file line number Diff line number Diff line change
@@ -13,7 +13,8 @@
<select id="saved" class="form-control selectpicker"
title="全部">
<option value="" selected="selected">全部</option>
<option value="true">已录入</option>
<option value="True">已录入</option>
<option value="False">未录入</option>
</select>
</div>
<div class="form-group ">
@@ -75,7 +76,17 @@ <h4 class="modal-title">创建数据库</h4>
placeholder="请输入备注">
</div>
</div>
<div class="form-group row">
<label for="in_use" class="col-sm-3 col-form-label">备注</label>
<div class="col-sm-9">
<select id="in_use" class="form-control selectpicker"
title="在用状态">
<option value="Y" selected="selected">在用</option>
<option value="N">停用</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="btnCreateDb" onclick="create_database()">创建
@@ -126,6 +137,17 @@ <h4 class="modal-title">编辑/录入数据库信息</h4>
placeholder="请输入备注">
</div>
</div>
<div class="form-group row">
<label for="edit_in_use" class="col-sm-3 col-form-label">备注</label>
<div class="col-sm-9">
<select id="edit_in_use" class="form-control selectpicker"
title="在用状态">
<option value="Y" selected="selected">在用</option>
<option value="N">停用</option>
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
@@ -217,6 +239,10 @@ <h4 class="modal-title">编辑/录入数据库信息</h4>
title: '备注',
field: 'remark'
}, {
},{
title: '在用状态',
field: 'in_use'
},{
title: '操作',
field: '',
formatter: function (value, row, index) {
@@ -270,7 +296,8 @@ <h4 class="modal-title">编辑/录入数据库信息</h4>
instance_id: $("#instance").val(),
db_name: $("#db_name").val(),
owner: $("#owner").val(),
remark: $("#remark").val()
remark: $("#remark").val(),
in_use: $("#in_use").val()
},
complete: function () {
},
@@ -297,10 +324,12 @@ <h4 class="modal-title">编辑/录入数据库信息</h4>
let row_data = $('#database-list').bootstrapTable('getRowByUniqueId', db_name);
let owner = row_data['owner'];
let remark = row_data['remark'];
let in_use = row_data['in_use'];
$("#edit_db_name").val(db_name);
$("#edit_owner").val(owner);
$("#edit_owner").selectpicker('refresh');
$("#edit_remark").val(remark);
$("#in_use").val(in_use);
$('#modal-edit-database').modal('show');

//变更用户权限
@@ -314,6 +343,7 @@ <h4 class="modal-title">编辑/录入数据库信息</h4>
db_name: db_name,
owner: $("#edit_owner").val(),
remark: $("#edit_remark").val(),
in_use: $("#edit_in_use").val(),
},
complete: function () {
},
75 changes: 73 additions & 2 deletions sql/templates/instanceaccount.html
Original file line number Diff line number Diff line change
@@ -15,7 +15,8 @@
<select id="saved" class="form-control selectpicker"
title="全部">
<option value="" selected="selected">全部</option>
<option value="true">已录入</option>
<option value="True">已录入</option>
<option value="False">未录入</option>
</select>
</div>
<div class="form-group ">
@@ -985,6 +986,31 @@ <h4 class="modal-title">删除账号
</div>
</div>
</div>

<!-- 显示密码模态框 -->
<div class="modal fade" id="show-pwd" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">&times;</span></button>
<h4 class="modal-title">查看密码
实例: <span id="show-instance" style="color: red"></span>
账号: <span id="show-user" style="color: red"></span></h4>
</div>
<div>
<h4 class="modal-title">
密码: <span id="show-password" style="color: red"></span></h4>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-danger" id="lockBtn">确定</button>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block js %}
{% load static %}
@@ -1161,13 +1187,20 @@ <h4 class="modal-title">删除账号
let btn_modify_grants = "<button class=\"btn btn-primary btn-xs\" user_host=\"" + row.user_host + "\" onclick=\"show_grants_modal(this)" + "\">授权</button>\n";
let btn_reset_passwd = "<button class=\"btn btn-warning btn-xs\" user_host=\"" + row.user_host + "\" onclick=\"show_reset_modal(this)" + "\">改密</button>\n";
let btn_del_account = "<button class=\"btn btn-danger btn-xs\" user_host=\"" + row.user_host + "\" onclick=\"show_delete_modal(this)" + "\">删除</button>\n";

let btn_lock_account = "";
if (row.is_locked === 'N') {
btn_lock_account = "<button class=\"btn btn-danger btn-xs\" user_host=\"" + row.user_host + "\" is_locked=\"" + row.is_locked + "\" onclick=\"show_lock_modal(this)" + "\">锁定</button>\n";
} else if (row.is_locked === 'Y') {
btn_lock_account = "<button class=\"btn btn-success btn-xs\" user_host=\"" + row.user_host + "\" is_locked=\"" + row.is_locked + "\" onclick=\"show_lock_modal(this)" + "\">解锁</button>\n";
}
return btn_edit + btn_modify_grants + btn_reset_passwd + btn_lock_account + btn_del_account

if ($("#saved").val() == 'True') {
let btn_show_password = "<button class=\"btn btn-danger btn-xs\" user_host=\"" + row.user_host + "\" onclick=\"show_password_modal(this)" + "\">显密</button>\n";
return btn_edit + btn_modify_grants + btn_reset_passwd + btn_lock_account + btn_del_account + btn_show_password
}else{
return btn_edit + btn_modify_grants + btn_reset_passwd + btn_lock_account + btn_del_account
}
}
}],
onLoadSuccess: function (data) {
@@ -1190,6 +1223,7 @@ <h4 class="modal-title">删除账号

}


//获取实例数据库
function db_list() {
$.ajax({
@@ -1507,6 +1541,7 @@ <h4 class="modal-title">删除账号
let row_data = $('#user-list').bootstrapTable('getRowByUniqueId', user_host);
let user = row_data['user'];
let host = row_data['host'];
let password = row_data['password'];
$("#reset-user").text(user_host);
$("#reset-pwd").modal('show');

@@ -1542,6 +1577,42 @@ <h4 class="modal-title">删除账号
});
}

//显示密码
function show_password_modal (obj) {
let user_host = $(obj).attr("user_host");
let row_data = $('#user-list').bootstrapTable('getRowByUniqueId', user_host);

$.ajax({
type: "post",
url: "/instance/user/requ_password",
dataType: "json",
data: {
instance_id: $("#instance").val(),
user: row_data['user'],
host: row_data['host']
},
complete: function () {
},
success: function (data) {
//console.log(data);
if (data.status === 0) {
let result = data.rows;
let password = result.password;
//console.log(result);
$("#show-user").text(user_host);
$("#show-password").text(password);
$("#show-pwd").modal('show');
} else {
alert(data.msg);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});

}

//锁定or解锁账号
function show_lock_modal(obj) {
let user_host = $(obj).attr("user_host");
1 change: 1 addition & 0 deletions sql/urls.py
Original file line number Diff line number Diff line change
@@ -96,6 +96,7 @@
path('instance/list/', instance.lists),

path('instance/user/list', instance_account.users),
path('instance/user/requ_password', instance_account.requ_password),
path('instance/user/create/', instance_account.create),
path('instance/user/edit/', instance_account.edit),
path('instance/user/grant/', instance_account.grant),
3 changes: 3 additions & 0 deletions src/init_sql/v1.8.3.sql
Original file line number Diff line number Diff line change
@@ -33,3 +33,6 @@ insert IGNORE INTO auth_permission (name, content_type_id, codename) VALUES
-- 实例配置表新增mode字段,用于redis实例;为历史数据设置默认值
alter table sql_instance add column `mode` varchar(10) DEFAULT '' after `db_type`;
update sql_instance set mode='standalone' where db_type='redis';

-- 已录入数据库新增in_use字段,用于标识数据库还是否在用,Y是在用,N是停用
alter table instance_database add in_use varchar(1) COMMENT '在用状态';