This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git
The following commit(s) were added to refs/heads/master by this push: new b9dac479 feat(echarts): Build homepage dashboard using ECharts. new e39d7bbb Merge pull request #106 from Helltab/feature/ui/dashboard/echarts b9dac479 is described below commit b9dac479531a3a22ec79ef57af39b40e8554dafd Author: Helltab <hell...@163.com> AuthorDate: Tue Dec 12 02:56:27 2023 +0800 feat(echarts): Build homepage dashboard using ECharts. --- ui/package.json | 2 +- ui/src/components/Home.vue | 101 ++++++++++++------------ ui/src/components/dashboard/homeEcharts.vue | 117 ++++++++++++++++++++++++++++ ui/src/components/public/Drawer.vue | 2 +- ui/src/mock/mockCluster.js | 19 +++-- 5 files changed, 178 insertions(+), 63 deletions(-) diff --git a/ui/package.json b/ui/package.json index 3ddf3d69..c81915c4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,7 +15,7 @@ "axios": "^0.18.1", "brace": "^0.11.1", "core-js": "^3.33.3", - "echarts": "^4.2.1", + "echarts": "^5.4.3", "http-status": "^1.2.0", "js-yaml": "^3.12.0", "jsoneditor": "^9.1.5", diff --git a/ui/src/components/Home.vue b/ui/src/components/Home.vue index 06bcf7c7..b5b2698d 100644 --- a/ui/src/components/Home.vue +++ b/ui/src/components/Home.vue @@ -15,60 +15,59 @@ ~ limitations under the License. --> <template> - <v-container grid-list-xl fluid> - <v-layout row wrap> - <v-flex lg12> + <v-container grid-list-xl fluid> + <v-layout row wrap> + <v-flex lg12> <Breadcrumb title="homePage" :items="breads"></breadcrumb> - </v-flex> - </v-layout> - <v-container fluid grid-list-md> - <v-data-iterator - :items=clusterData - content-tag="v-layout" - hide-actions - row - wrap - > - <template v-slot:header> - <v-toolbar - class="mb-2" - color="indigo darken-5" - dark - flat - > - <v-toolbar-title>ClusterOverview</v-toolbar-title> - </v-toolbar> - </template> - <template v-slot:item="props"> - <v-flex - xs12 - sm6 - md4 - lg4 - > - <v-card> - <v-card-title class="subheading font-weight-bold">{{ props.item.name }}</v-card-title> + </v-flex> + </v-layout> + <v-container fluid grid-list-md> + <v-data-iterator + :items=clusterData + content-tag="v-layout" + hide-actions + row + wrap + > + <template v-slot:header> + <v-toolbar + class="mb-2" + color="indigo darken-5" + dark + flat + > + <v-toolbar-title>ClusterOverview</v-toolbar-title> + </v-toolbar> + </template> + <template v-slot:item="props"> + <v-flex + xs12 + sm6 + md4 + lg4 + > - <v-divider></v-divider> + <v-card> + <v-card-title class="subheading font-weight-bold">{{ props.item.name }}</v-card-title> - <v-list dense> - <v-list-tile> - <v-list-tile-content>Number:</v-list-tile-content> - <v-list-tile-content class="align-end">{{ props.item.number }}</v-list-tile-content> - </v-list-tile> - </v-list> - </v-card> - </v-flex> - </template> - </v-data-iterator> - </v-container> + <v-divider></v-divider> + <v-list dense> + <home-echarts style="width: 100%; height: 25vh" :value="props.item"></home-echarts> + </v-list> + </v-card> + </v-flex> + </template> + </v-data-iterator> </v-container> + </v-container> </template> <script> import Breadcrumb from './public/Breadcrumb.vue' +import HomeEcharts from "./dashboard/homeEcharts.vue"; + export default { name: 'ClusterOverview', - components: { Breadcrumb }, + components: {HomeEcharts, Breadcrumb}, data: () => ({ breads: [ { @@ -76,21 +75,21 @@ export default { href: '' } ], - clusterData:[], + clusterData: [], }), - methods:{ - getCluster () { + methods: { + getCluster() { this.$axios.get('/metrics/cluster').then(response => { console.log(response) - this.clusterData = Object.entries(response.data.data).map(([name, number]) => ({ name, number })); + this.clusterData = Object.entries(response.data.data).map(([name, number]) => ({name, number})); }) }, joinArray(arr) { return arr.join(', '); } }, - mounted(){ - this.getCluster(); + mounted() { + this.getCluster(); } } </script> diff --git a/ui/src/components/dashboard/homeEcharts.vue b/ui/src/components/dashboard/homeEcharts.vue new file mode 100644 index 00000000..fb500976 --- /dev/null +++ b/ui/src/components/dashboard/homeEcharts.vue @@ -0,0 +1,117 @@ +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to You under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. +--> +<template> + + <div class="__dashboard_echarts_container"> + <div class="__gauge_for_home" :id="`__gauge_for_home_${value.name}`"></div> + </div> +</template> + +<script> +import * as echarts from 'echarts'; + +export default { + name: 'home-echarts', + props: { + value: { + type: Object, + default: { + number: 0, + name: 'demo' + } + }, + + }, + data() { + return { + option: { + tooltip: { + trigger: 'item' + }, + // legend: { + // top: '5%', + // left: 'center' + // }, + series: [ + { + name: 'Cluster', + type: 'pie', + radius: ['40%', '70%'], + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 10, + borderColor: '#fff', + borderWidth: 2 + }, + label: { + //文本样式 + normal: { + textStyle: { + fontSize: 28, + fontWeight: 'bolder', + color: '#FC6679' + }, + formatter: "{c}", + position: "center", + show: true, + }, + }, + emphasis: { + label: { + show: true, + fontSize: 40, + fontWeight: 'bold' + } + }, + labelLine: { + show: false + }, + color:[ + new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: "#FC6679 " }, + { offset: 0.4, color: "#FCC581 " }, + { offset: 1, color: "#FDC581 " } + ]) + ], + data: [ + { value: 100, name: 'demo' }, + ] + } + ] + } + } + }, + mounted() { + const chartDom = document.getElementById(`__gauge_for_home_${this.value.name}`); + const myChart = echarts.init(chartDom); + this.option.series[0].data[0].value = this.value.number + this.option.series[0].data[0].name = this.value.name + console.log(this.option.series[0]) + myChart.setOption(this.option); + } +} +</script> + +<style lang="css"> + +.__dashboard_echarts_container .__gauge_for_home { + height: 100%; + width: 100%; + +} + +</style> diff --git a/ui/src/components/public/Drawer.vue b/ui/src/components/public/Drawer.vue index cd91935b..abfdcee1 100644 --- a/ui/src/components/public/Drawer.vue +++ b/ui/src/components/public/Drawer.vue @@ -85,7 +85,7 @@ export default { window.getApp.$on('DRAWER_TOGGLED', () => { this.drawer = (!this.drawer) }) - axios.get('/dubbo-admin-info.json').then(response => { + axios.get('/admin/dubbo-admin-info.json').then(response => { this.config = response.data }) }, diff --git a/ui/src/mock/mockCluster.js b/ui/src/mock/mockCluster.js index e4dd07a8..41a03e6a 100644 --- a/ui/src/mock/mockCluster.js +++ b/ui/src/mock/mockCluster.js @@ -1,4 +1,3 @@ - /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -25,13 +24,13 @@ console.log(random) // 简单使用就不操作了,需要操作的可以去看 // 3、基本用法 Mock.mock(url, type, data) // 参数文档 https://github.com/nuysoft/Mock/wiki Mock.mock('/mock/metrics/cluster', 'get', { - code: 200, - message: '成功', - data: { - all:0, - application:0, - consumers:0, - providers:0, - services:0 - } + code: 200, + message: '成功', + data: { + all: Mock.mock('@integer(100, 500)'), + application: Mock.mock('@integer(20, 39)'), + consumers: Mock.mock('@integer(20, 39)'), + providers: Mock.mock('@integer(20, 39)'), + services: Mock.mock('@integer(20, 39)'), + } })