This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
cyber-narrator-cn-ui/src/components/charts/PieTable.vue

246 lines
6.1 KiB
Vue
Raw Normal View History

2021-06-23 15:57:34 +08:00
<template>
<el-table
v-loading="loading"
ref="table"
class="pie-table"
:data="pieTableData"
style="width: 100%;border: 1px solid #E7EAED"
:row-key="getRowKey"
@expand-change="currentChange"
current-row-key="domain"
tooltip-effect="light"
:expand-row-keys="expandRowKeys"
:size="'mini'"
:height="'100%'">
<el-table-column type="expand" :min-width="'5%'">
<template #default="props" style="height: auto">
<el-table
tooltip-effect="light"
class="expand-table"
:data="childrenTableData"
style="width: 100%;"
:show-header="false"
2021-06-23 15:57:34 +08:00
:size="'mini'"
2021-08-15 18:53:27 +08:00
v-loading="subLoading"
2021-06-23 15:57:34 +08:00
:height="'100%'">
<el-table-column
width="48">
</el-table-column>
<el-table-column
v-for="(item, index) in tableTitlesOther"
:key="index"
show-overflow-tooltip
:min-width="item.width"
:label="item.label"
:prop="item.prop"
#default="{row}">
<span v-if="item.prop === 'nameColumn'">
{{ nameColumn === 'fqdnCategoryName' ? row['fqdnCategoryName'] : row['reputationLevel'] }}
</span>
<span v-else-if="item.prop === 'bytes'">
{{unitConvert(row[item.prop], unitTypes.byte).join(' ')}}
</span>
<span v-else-if="item.prop === 'packets' || item.prop === 'sessions'">
{{unitConvert(row[item.prop], unitTypes.number).join(' ')}}
</span>
<span v-else>
{{ row[item.prop] }}
</span>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column
v-for="(item, index) in tableTitles"
:key="index"
show-overflow-tooltip
:min-width="item.width"
:label="item.label"
:prop="item.prop"
#default="{row}">
<span v-if="item.prop === 'nameColumn'">
{{ nameColumn === 'fqdnCategoryName' ? row['categoryName'] : row['reputationLevel'] }}
</span>
<span v-else-if="item.prop === 'bytes'">
{{unitConvert(row[item.prop], unitTypes.byte).join(' ')}}
</span>
<span v-else-if="item.prop === 'packets' || item.prop === 'sessions'">
{{unitConvert(row[item.prop], unitTypes.number).join(' ')}}
</span>
<span v-else>
{{ row[item.prop] }}
</span>
</el-table-column>
</el-table>
2021-06-23 15:57:34 +08:00
</template>
<script>
import unitConvert from '@/utils/unit-convert'
import { get } from '@/utils/http'
import { replaceUrlPlaceholder } from '@/utils/tools'
import { unitTypes } from '@/utils/constants'
2021-06-23 15:57:34 +08:00
export default {
name: 'PieTable',
props: {
tableData: Array,
chartInfo: Object,
order: String,
timeFilter: Object
2021-06-23 15:57:34 +08:00
},
watch: {
tableData: {
deep: true,
immediate: true,
handler (n) {
this.pieTableData = JSON.parse((JSON.stringify(n)))
this.pieTableData.forEach(item => {
item.children = []
})
}
},
chartInfo: {
deep: true,
immediate: true,
handler (n) {
if (n && n.params) {
2021-07-13 18:43:40 +08:00
this.nameColumn = n.params.nameColumn
}
2021-06-23 15:57:34 +08:00
}
}
},
data () {
return {
loading: false,
nameColumn: '',
pieTableData: [],
2021-07-07 17:34:19 +08:00
childrenTableData: [],
expandRowKeys: [],
2021-06-23 15:57:34 +08:00
tableTitles: [
{
label: this.$t('overall.domain'),
2021-06-23 15:57:34 +08:00
prop: 'domain',
width: '20%'
},
{
label: this.$t('entities.category'),
prop: 'nameColumn',
width: '22%'
},
{
label: this.$t('overall.sessions'),
prop: 'sessions',
width: '18%'
},
{
label: this.$t('overall.packets'),
prop: 'packets',
width: '18%'
},
{
label: this.$t('overall.bytes'),
prop: 'bytes',
width: '18%'
}
],
tableTitlesOther: [
{
label: this.$t('overall.serverIp'),
prop: 'serverIp',
width: '20%'
},
{
label: this.$t('overall.reputation'),
prop: 'nameColumn',
width: '22%'
},
2021-06-23 15:57:34 +08:00
{
label: this.$t('overall.sessions'),
2021-06-23 15:57:34 +08:00
prop: 'sessions',
width: '18%'
2021-06-23 15:57:34 +08:00
},
{
label: this.$t('overall.packets'),
2021-06-23 15:57:34 +08:00
prop: 'packets',
width: '18%'
2021-06-23 15:57:34 +08:00
},
{
label: this.$t('overall.bytes'),
2021-06-23 15:57:34 +08:00
prop: 'bytes',
width: '18%'
2021-06-23 15:57:34 +08:00
}
2021-08-15 18:53:27 +08:00
],
subLoading: true
2021-06-23 15:57:34 +08:00
}
},
methods: {
2021-07-07 17:34:19 +08:00
currentChange (row, expandedRows) {
2021-08-15 18:53:27 +08:00
this.subLoading = true
this.childrenTableData = []
2021-08-15 18:53:27 +08:00
if (this.expandRowKeys[0] && (row.domain === this.expandRowKeys[0])) {
this.expandRowKeys = []
} else {
this.expandRowKeys = [row.domain]
}
const url = this.chartInfo.params.urlChildrenTable
const queryParams = {
startTime: parseInt(this.timeFilter.startTime / 1000),
endTime: parseInt(this.timeFilter.endTime / 1000),
order: this.order,
domain: row.domain,
limit: 10
}
2021-08-15 18:53:27 +08:00
setTimeout(() => {
get(replaceUrlPlaceholder(url, queryParams)).then(response2 => {
if (response2.code === 200) {
this.childrenTableData = response2.data.result
}
}).finally(() => {
this.subLoading = false
})
}, 500)
2021-07-07 17:34:19 +08:00
},
getRowKey (row) {
return row.domain
}
},
setup () {
return {
unitTypes,
unitConvert
}
2021-06-23 15:57:34 +08:00
}
}
</script>
2021-07-07 17:34:19 +08:00
<style scoped lang="scss">
/deep/ .el-table__expanded-cell[class*=cell] {
padding: 0;
}
.expand-table /deep/ .el-table__body .el-table__row:last-of-type td {
border: none;
}
.pie-table {
font-size: 14px;
color: #333333;
font-weight: 500;
/deep/ .el-table__header-wrapper {
.cell {
color: #333;
2021-06-23 15:57:34 +08:00
}
}
}
.expand-table {
font-weight: 400;
color: #606266;
/deep/ .el-table__body-wrapper {
height: auto !important;
}
}
2021-06-23 15:57:34 +08:00
</style>