mirror of https://github.com/openspug/spug
A 功能 添加配置关系图
parent
461fe0ca0a
commit
51168e50ef
|
@ -2,6 +2,7 @@ from apps.configuration import environment
|
||||||
from apps.configuration import service
|
from apps.configuration import service
|
||||||
from apps.configuration import config
|
from apps.configuration import config
|
||||||
from apps.configuration import app as app_page
|
from apps.configuration import app as app_page
|
||||||
|
from apps.configuration import relationship
|
||||||
|
|
||||||
|
|
||||||
def register_blueprint(app):
|
def register_blueprint(app):
|
||||||
|
@ -9,3 +10,4 @@ def register_blueprint(app):
|
||||||
app.register_blueprint(service.blueprint, url_prefix='/configuration/services')
|
app.register_blueprint(service.blueprint, url_prefix='/configuration/services')
|
||||||
app.register_blueprint(config.blueprint, url_prefix='/configuration/configs')
|
app.register_blueprint(config.blueprint, url_prefix='/configuration/configs')
|
||||||
app.register_blueprint(app_page.blueprint, url_prefix='/configuration/apps')
|
app.register_blueprint(app_page.blueprint, url_prefix='/configuration/apps')
|
||||||
|
app.register_blueprint(relationship.blueprint, url_prefix='/configuration/relationship')
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
from flask import Blueprint
|
||||||
|
from apps.deploy.models import App
|
||||||
|
from apps.configuration.models import Service
|
||||||
|
from libs.tools import json_response
|
||||||
|
from apps.configuration.models import AppConfigRel
|
||||||
|
from libs.decorators import require_permission
|
||||||
|
|
||||||
|
blueprint = Blueprint(__name__, __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@blueprint.route('/', methods=['GET'])
|
||||||
|
@require_permission('config_app_rel_view')
|
||||||
|
def get():
|
||||||
|
apps = App.query.all()
|
||||||
|
services = Service.query.all()
|
||||||
|
relations = AppConfigRel.query.all()
|
||||||
|
return json_response({
|
||||||
|
'apps': [x.to_json() for x in apps],
|
||||||
|
'services': [x.to_json() for x in services],
|
||||||
|
'relations': [x.to_json() for x in relations]
|
||||||
|
})
|
|
@ -0,0 +1,107 @@
|
||||||
|
<template>
|
||||||
|
<div id="configuration_relation_chart" style="width: 100%; height: 100%">
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import echarts from 'echarts';
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
nodes_map: {},
|
||||||
|
colors: ['#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83', '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
let chart = echarts.init(document.getElementById('configuration_relation_chart'));
|
||||||
|
let nodes = [];
|
||||||
|
let links = [];
|
||||||
|
chart.showLoading();
|
||||||
|
this.$http.get('/api/configuration/relationship/').then(res => {
|
||||||
|
res.result.services.map(item => {
|
||||||
|
this.nodes_map[item.id + '_s'] = item;
|
||||||
|
nodes.push({
|
||||||
|
id: item.id + '_s',
|
||||||
|
name: item.name,
|
||||||
|
symbolSize: 16,
|
||||||
|
itemStyle: {
|
||||||
|
color: '#66bdff'
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: true
|
||||||
|
},
|
||||||
|
})
|
||||||
|
});
|
||||||
|
res.result.apps.map((item, index) => {
|
||||||
|
this.nodes_map[item.id + '_a'] = item;
|
||||||
|
nodes.push({
|
||||||
|
id: item.id + '_a',
|
||||||
|
name: item.name,
|
||||||
|
symbolSize: 20,
|
||||||
|
itemStyle: {
|
||||||
|
color: this.colors[index % this.colors.length]
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
show: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
res.result.relations.map(item => {
|
||||||
|
let suffix = (item.d_type === 'app') ? '_a' : '_s';
|
||||||
|
links.push({
|
||||||
|
source: item.s_id + '_a',
|
||||||
|
target: item.d_id + suffix
|
||||||
|
})
|
||||||
|
});
|
||||||
|
chart.setOption({
|
||||||
|
title: {
|
||||||
|
text: '应用配置关系图',
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
show: true,
|
||||||
|
formatter: (params) => {
|
||||||
|
let des_body = '';
|
||||||
|
let src_body = '';
|
||||||
|
links.map(item => {
|
||||||
|
if (params.data.id === item.source) {
|
||||||
|
src_body += `<tr><td>${this.nodes_map[item.target].name}</td><td>${this.nodes_map[item.target].desc}</td></tr>`
|
||||||
|
}else if (params.data.id === item.target) {
|
||||||
|
des_body += `<tr><td>${this.nodes_map[item.source].name}</td><td>${this.nodes_map[item.source].desc}</td></tr>`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return `依赖的应用:</br><table>${src_body}</table> </br>被依赖的应用:</br><table>${des_body}</table>`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
animationDurationUpdate: 1500,
|
||||||
|
animationEasingUpdate: 'quinticInOut',
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '应用配置关系图',
|
||||||
|
type: 'graph',
|
||||||
|
layout: 'circular',
|
||||||
|
circular: {
|
||||||
|
rotateLabel: true
|
||||||
|
},
|
||||||
|
focusNodeAdjacency: true,
|
||||||
|
data: nodes,
|
||||||
|
links: links,
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: 'right',
|
||||||
|
formatter: '{b}'
|
||||||
|
},
|
||||||
|
edgeLabel: {
|
||||||
|
show: true,
|
||||||
|
formatter: ''
|
||||||
|
},
|
||||||
|
lineStyle: {
|
||||||
|
color: 'source',
|
||||||
|
curveness: 0.3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}, res => this.$layer_message(res.result)).finally(() => chart.hideLoading())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -4,6 +4,7 @@
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import Service from './Service.vue'
|
import Service from './Service.vue'
|
||||||
import Environment from './Environment.vue'
|
import Environment from './Environment.vue'
|
||||||
|
import RelationChart from './RelationChart.vue'
|
||||||
|
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
|
@ -26,5 +27,12 @@ export default [
|
||||||
meta: {
|
meta: {
|
||||||
permission: 'config_environment_view'
|
permission: 'config_environment_view'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'relationship',
|
||||||
|
component: RelationChart,
|
||||||
|
meta: {
|
||||||
|
permission: 'config_app_view'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
|
@ -24,7 +24,8 @@ let menu = {
|
||||||
key: '4', desc: '配置管理', icon: 'fa fa-cogs', permission: 'config_environment_view|config_service_view|config_app_view', subs: [
|
key: '4', desc: '配置管理', icon: 'fa fa-cogs', permission: 'config_environment_view|config_service_view|config_app_view', subs: [
|
||||||
{key: '/configuration/environment', permission: 'config_environment_view', desc: '环境管理'},
|
{key: '/configuration/environment', permission: 'config_environment_view', desc: '环境管理'},
|
||||||
{key: '/configuration/service', permission: 'config_service_view', desc: '服务配置'},
|
{key: '/configuration/service', permission: 'config_service_view', desc: '服务配置'},
|
||||||
{key: '/configuration/app', permission: 'config_app_view', desc: '应用配置'}
|
{key: '/configuration/app', permission: 'config_app_view', desc: '应用配置'},
|
||||||
|
{key: '/configuration/relationship', permission: 'config_app_view', desc: '配置关系'}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
key: '5', desc: '任务管理', icon: 'fa fa-calendar', permission: 'job_task_view', subs: [
|
key: '5', desc: '任务管理', icon: 'fa fa-calendar', permission: 'job_task_view', subs: [
|
||||||
|
|
Loading…
Reference in New Issue