blob: 5ba4a80e4075374da3cf3c9f1f76d472109f7918 [file] [log] [blame]
<!--
~ 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="__container_services_tabs_distribution">
<a-flex vertical>
<a-flex class="service-filter">
<a-radio-group v-model:value="type" button-style="solid" @click="debounceSearch">
<a-radio-button value="producer">生产者</a-radio-button>
<a-radio-button value="consumer">消费者</a-radio-button>
</a-radio-group>
<a-input-search
v-model:value="searchValue"
placeholder="搜索应用,ip,支持前缀搜索"
class="service-filter-input"
@search="debounceSearch"
enter-button
/>
</a-flex>
<a-table
:columns="tableColumns"
:data-source="tableData"
:scroll="{ y: '45vh' }"
:pagination="pagination"
>
<template #bodyCell="{ column, text }">
<template v-if="column.dataIndex === 'applicationName'">
<span class="link" @click="router.push('/resources/applications/detail/' + text)">
<b>
<Icon
style="margin-bottom: -2px"
icon="material-symbols:attach-file-rounded"
></Icon>
{{ text }}
</b>
</span>
</template>
<template v-if="column.dataIndex === 'instanceName'">
<span class="link" @click="router.push('/resources/instances/detail/' + text)">
<b>
<Icon
style="margin-bottom: -2px"
icon="material-symbols:attach-file-rounded"
></Icon>
{{ text }}
</b>
</span>
</template>
<template v-if="column.dataIndex === 'label'">
<a-tag :color="PRIMARY_COLOR">{{ text }}</a-tag>
</template>
</template>
</a-table>
</a-flex>
</div>
</template>
<script setup lang="ts">
import type { ComponentInternalInstance } from 'vue'
import { ref, reactive, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { getServiceDistribution } from '@/api/service/service'
import { debounce } from 'lodash'
import { PRIMARY_COLOR } from '@/base/constants'
import { Icon } from '@iconify/vue'
let __null = PRIMARY_COLOR
const router = useRouter();
const {
appContext: {
config: { globalProperties }
}
} = <ComponentInternalInstance>getCurrentInstance()
const searchValue = ref('')
const versionAndGroupOptions = reactive([
{
label: '不指定',
value: ''
},
{
label: 'version=1.0.0',
value: 'version=1.0.0'
},
{
label: 'group=group1',
value: 'group=group1'
},
{
label: 'version=1.0.0,group=group1',
value: 'version=1.0.0,group=group1'
}
])
const versionAndGroup = ref(versionAndGroupOptions[0].value)
const type = ref('producer')
const tableColumns = [
{
title: '应用名',
dataIndex: 'applicationName',
width: '20%',
customCell: (_, index) => {
if (index === 0) {
return { rowSpan: tableData.value.length }
} else {
return { rowSpan: 0 }
}
}
},
{
title: '实例数',
dataIndex: 'instanceNum',
width: '15%',
customCell: (_, index) => {
if (index === 0) {
return { rowSpan: tableData.value.length }
} else {
return { rowSpan: 0 }
}
}
},
{
title: '实例名',
dataIndex: 'instanceName',
width: '15%'
},
{
title: 'RPC端口',
dataIndex: 'rpcPort',
width: '15%'
},
{
title: '超时时间',
dataIndex: 'timeout',
width: '10%'
},
{
title: '重试次数',
dataIndex: 'retryNum',
width: '10%'
},
{
title: '标签',
dataIndex: 'label',
width: '15%'
}
]
const tableData = ref([])
const onSearch = async () => {
let { data } = await getServiceDistribution({})
tableData.value = data.data
}
onSearch()
const debounceSearch = debounce(onSearch, 300)
const pagination = {
showTotal: (v: any) =>
globalProperties.$t('searchDomain.total') +
': ' +
v +
' ' +
globalProperties.$t('searchDomain.unit')
}
</script>
<style lang="less" scoped>
.__container_services_tabs_distribution {
.service-filter {
margin-bottom: 20px;
.service-filter-select {
margin-left: 10px;
width: 250px;
}
.service-filter-input {
margin-left: 30px;
width: 300px;
}
}
.link {
padding: 4px 10px 4px 4px;
border-radius: 4px;
color: v-bind('PRIMARY_COLOR');
&:hover {
cursor: pointer;
background: rgba(133, 131, 131, 0.13);
}
}
}
</style>