fix: 请求成功的判断条件code改为status(部分)

This commit is contained in:
chenjinsong
2023-08-24 17:15:41 +08:00
parent 7b0ec06a05
commit 21f32dfdda
75 changed files with 422 additions and 5595 deletions

View File

@@ -6,7 +6,7 @@
<script> <script>
import { storageKey } from '@/utils/constants' import { storageKey } from '@/utils/constants'
import router from '@/router' import router from '@/router'
import { post } from '@/utils/http' import axios from 'axios'
import { api } from '@/utils/api' import { api } from '@/utils/api'
const dayjs = require('dayjs') const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc') const utc = require('dayjs/plugin/utc')
@@ -48,13 +48,11 @@ export default {
if (localStorage.getItem(storageKey.token) !== null) { if (localStorage.getItem(storageKey.token) !== null) {
// 刚进入会请求失败,故采用延时,请求成功清除延时器,避免内存泄漏 // 刚进入会请求失败,故采用延时,请求成功清除延时器,避免内存泄漏
const timer = setTimeout(() => { const timer = setTimeout(() => {
post(api.permissions, { token: localStorage.getItem(storageKey.token) }).then(res => { axios.post(api.permissions, { token: localStorage.getItem(storageKey.token) }).then(res => {
if (res.code === 200) { router.push({
router.push({ path: '/panel/networkOverview'
path: '/panel/networkOverview' })
}) clearTimeout(timer)
clearTimeout(timer)
}
}) })
}, 10) }, 10)
} }

View File

@@ -39,7 +39,6 @@
<script> <script>
import { mapActions } from 'vuex' import { mapActions } from 'vuex'
import { get } from '@/utils/http'
import axios from 'axios' import axios from 'axios'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { storageKey, defaultLang } from '@/utils/constants' import { storageKey, defaultLang } from '@/utils/constants'
@@ -72,7 +71,7 @@ export default {
this.loading = true this.loading = true
axios.post(api.login, { username: this.username, pin: this.pin }).then( axios.post(api.login, { username: this.username, pin: this.pin }).then(
res => { res => {
if (res.data.code === 200) { if (res.status === 200) {
if (!_.isEmpty(res.data.data.user.lang)) { if (!_.isEmpty(res.data.data.user.lang)) {
localStorage.setItem(storageKey.language, res.data.data.user.lang) localStorage.setItem(storageKey.language, res.data.data.user.lang)
} }
@@ -103,9 +102,9 @@ export default {
}) })
}, },
queryAppearance () { queryAppearance () {
get(api.appearance).then(res => { axios.get(api.appearance).then(res => {
if (res.code === 200) { if (res.status === 200) {
this.appearanceOut(res.data) this.appearanceOut(res.data.data)
} }
}) })
}, },

View File

@@ -188,7 +188,7 @@
</template> </template>
<script> <script>
import { get, put } from '@/utils/http' import axios from 'axios'
import { import {
curTabState, curTabState,
entityType, entityType,
@@ -494,7 +494,7 @@ export default {
logout () { logout () {
sessionStorage.removeItem(storageKey.tokenExpireCurrentPath) sessionStorage.removeItem(storageKey.tokenExpireCurrentPath)
localStorage.removeItem(storageKey.token) localStorage.removeItem(storageKey.token)
get(api.logout) axios.get(api.logout)
}, },
refreshLang () { refreshLang () {
this.language = localStorage.getItem(storageKey.language) this.language = localStorage.getItem(storageKey.language)
@@ -537,9 +537,9 @@ export default {
if (!curTableInCode.url.drilldownList) { if (!curTableInCode.url.drilldownList) {
return true return true
} }
get(curTableInCode.url.drilldownList, params).then(async response => { axios.get(curTableInCode.url.drilldownList, { params }).then(async response => {
if (response.code === 200) { if (response.status === 200) {
this.breadcrumbColumnValueListShow = response.data.result this.breadcrumbColumnValueListShow = response.data.data.result
if (this.$route.params.typeName === fromRoute.dnsServiceInsights) { if (this.$route.params.typeName === fromRoute.dnsServiceInsights) {
if (this.dnsQtypeMapData.size === 0) { if (this.dnsQtypeMapData.size === 0) {
this.dnsQtypeMapData = await getDnsMapData('dnsQtype') this.dnsQtypeMapData = await getDnsMapData('dnsQtype')
@@ -628,17 +628,17 @@ export default {
submit () { submit () {
this.$refs.changePassForm.validate((valid) => { this.$refs.changePassForm.validate((valid) => {
if (valid) { if (valid) {
put(api.pin, { axios.put(api.pin, {
oldPin: this.changePassForm.oldPwd, oldPin: this.changePassForm.oldPwd,
newPin: this.changePassForm.newPwd newPin: this.changePassForm.newPwd
}).then(res => { }).then(res => {
if (res.code === 200) { if (res.status === 200) {
this.$message.success('Success') this.$message.success(this.$t('tip.success'))
this.showChangePin = false this.showChangePin = false
} else if (res.code === 518005) { } else if (res.data.code === 518005) {
this.$message.error('密码错误') this.$message.error(this.$t('tip.incorrectPassword'))
} else { } else {
this.$message.error(res.message) this.$message.error(res.data.message)
} }
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)

View File

@@ -8,7 +8,7 @@
</div> </div>
<div class="right-box__container"> <div class="right-box__container">
<div class="container__form"> <div class="container__form">
<el-form ref="userForm" :model="editObject" :rules="rules" label-position="top" label-width="120px"> <el-form ref="form" :model="editObject" :rules="rules" label-position="top" label-width="120px">
<!--name--> <!--name-->
<el-form-item :label="$t('overall.name')" prop="name"> <el-form-item :label="$t('overall.name')" prop="name">
<el-input id="proxy-name" v-model="editObject.name" <el-input id="proxy-name" v-model="editObject.name"

View File

@@ -56,7 +56,7 @@
<script> <script>
import rightBoxMixin from '@/mixins/right-box' import rightBoxMixin from '@/mixins/right-box'
import { get, post, put } from '@/utils/http' import axios from 'axios'
import { storageKey } from '@/utils/constants' import { storageKey } from '@/utils/constants'
import { api } from '@/utils/api' import { api } from '@/utils/api'
@@ -84,8 +84,6 @@ export default {
langData: [] langData: []
} }
}, },
setup () {
},
mounted () { mounted () {
this.getLangData() this.getLangData()
}, },
@@ -106,23 +104,23 @@ export default {
this.$refs.i18nForm.validate((valid) => { this.$refs.i18nForm.validate((valid) => {
if (valid) { if (valid) {
if (this.editObject.id) { if (this.editObject.id) {
put(this.url, this.editObject).then(res => { axios.put(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.message)
} }
}) })
} else { } else {
post(this.url, this.editObject).then(res => { axios.post(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.message)
} }
}) })
} }
@@ -133,9 +131,9 @@ export default {
}) })
}, },
getLangData () { getLangData () {
get(api.dict, { type: 'lang', pageSize: -1 }).then(response => { axios.get(api.dict, { params: { type: 'lang', pageSize: -1 } }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.langData = response.data.list this.langData = response.data.data.list
} }
}) })
} }

View File

@@ -40,7 +40,7 @@
<button id="asset-edit-cancel" v-cancel="{object: editRole, func: esc}" class="footer__btn footer__btn--light"> <button id="asset-edit-cancel" v-cancel="{object: editRole, func: esc}" class="footer__btn footer__btn--light">
<span>{{$t('overall.cancel')}}</span> <span>{{$t('overall.cancel')}}</span>
</button> </button>
<button id="asset-edit-save" :class="{'footer__btn--disabled': prevent_opt.save}" :disabled="prevent_opt.save" class="footer__btn" @click="save"> <button id="asset-edit-save" :class="{'footer__btn--disabled': blockOperation.save}" :disabled="blockOperation.save" class="footer__btn" @click="save">
<span>{{$t('overall.save')}}</span> <span>{{$t('overall.save')}}</span>
</button> </button>
</div> </div>
@@ -49,8 +49,9 @@
<script> <script>
import rightBoxMixin from '@/mixins/right-box' import rightBoxMixin from '@/mixins/right-box'
import { get, post, put } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import axios from 'axios'
import _ from 'lodash'
export default { export default {
name: 'userBox', name: 'userBox',
@@ -117,7 +118,7 @@ export default {
}, },
/* 关闭弹框 */ /* 关闭弹框 */
esc (refresh) { esc (refresh) {
this.prevent_opt.save = false this.blockOperation.save = false
this.$emit('close', refresh) this.$emit('close', refresh)
}, },
getMenus: function () { getMenus: function () {
@@ -125,19 +126,19 @@ export default {
return new Promise(resolve => { return new Promise(resolve => {
self.menus = [] self.menus = []
if (self.editRole.id) { if (self.editRole.id) {
get(api.menu + self.editRole.id).then(response => { axios.get(api.menu + self.editRole.id).then(response => {
if (response.code === 200) { if (response.status === 200) {
self.menus = response.data.menus self.menus = _.get(response, 'data.data.menus', [])
self.selectedIds = response.data.selectedIds self.selectedIds = _.get(response, 'data.data.selectedIds', [])
} else { } else {
self.$message.error('load menu faild') self.$message.error('load menu failed')
} }
resolve() resolve()
}) })
} else { } else {
get(api.sysMenu).then(response => { axios.get(api.sysMenu).then(response => {
if (response.code === 200) { if (response.status === 200) {
self.menus = response.data.list self.menus = _.get(response, 'data.data.list', [])
} else { } else {
self.$message.error('load menu faild') self.$message.error('load menu faild')
} }
@@ -174,34 +175,34 @@ export default {
} }
}, },
save () { save () {
if (this.prevent_opt.save) { return } if (this.blockOperation.save) { return }
this.prevent_opt.save = true this.blockOperation.save = true
this.$refs.roleForm.validate((valid) => { this.$refs.roleForm.validate((valid) => {
if (valid) { if (valid) {
if (this.editRole.id) { if (this.editRole.id) {
put(this.url, this.editRole).then(res => { axios.put(this.url, this.editRole).then(res => {
this.prevent_opt.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} else { } else {
post(this.url, this.editRole).then(res => { axios.post(this.url, this.editRole).then(res => {
this.prevent_opt.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} }
} else { } else {
this.prevent_opt.save = false this.blockOperation.save = false
return false return false
} }
}) })

View File

@@ -115,7 +115,8 @@
<script> <script>
import rightBoxMixin from '@/mixins/right-box' import rightBoxMixin from '@/mixins/right-box'
import { get, post, put } from '@/utils/http' import axios from 'axios'
import _ from 'lodash'
import { themeData, langData, storageKey } from '@/utils/constants' import { themeData, langData, storageKey } from '@/utils/constants'
import { api } from '@/utils/api' import { api } from '@/utils/api'
@@ -194,7 +195,6 @@ export default {
], ],
pinChange: [ pinChange: [
{ validator: validatePin, trigger: 'blur' }, { validator: validatePin, trigger: 'blur' },
{ required: true, message: this.$t('validate.required') },
{ pattern: /^[a-zA-Z0-9]{5,64}$/, message: this.$t('validate.atLeastFive') } { pattern: /^[a-zA-Z0-9]{5,64}$/, message: this.$t('validate.atLeastFive') }
], ],
roleIds: [ roleIds: [
@@ -235,23 +235,23 @@ export default {
this.$refs.userForm.validate((valid) => { this.$refs.userForm.validate((valid) => {
if (valid) { if (valid) {
if (this.editObject.id) { if (this.editObject.id) {
put(this.url, this.editObject).then(res => { axios.put(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} else { } else {
post(this.url, this.editObject).then(res => { axios.post(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} }
@@ -262,9 +262,9 @@ export default {
}) })
}, },
getRoleData () { getRoleData () {
get(api.role, { pageSize: -1 }).then(response => { axios.get(api.role, { pageSize: -1 }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.roleData = response.data.list this.roleData = _.get(response, 'data.data.list', [])
} }
}) })
} }

View File

@@ -8,6 +8,7 @@ export default {
blockOperation: { blockOperation: {
save: false, save: false,
import: false, import: false,
duplicate: false,
delete: false, delete: false,
refresh: false, refresh: false,
query: false query: false

View File

@@ -1,6 +1,6 @@
import { tableSort } from '@/utils/tools' import { tableSort } from '@/utils/tools'
import { defaultPageSize, fromRoute, position, storageKey, dbTableColumnCustomizeConfigPre } from '@/utils/constants' import { defaultPageSize, fromRoute, position, storageKey, dbTableColumnCustomizeConfigPre } from '@/utils/constants'
import { get, del } from '@/utils/http' import _ from 'lodash'
import { ref } from 'vue' import { ref } from 'vue'
import pagination from '@/components/common/Pagination' import pagination from '@/components/common/Pagination'
import axios from 'axios' import axios from 'axios'
@@ -90,16 +90,8 @@ export default {
this.batchDeleteObjs.push(obj) this.batchDeleteObjs.push(obj)
} }
}) })
if (this.batchDeleteObjs.length == 1) { this.disableEdit = this.batchDeleteObjs.length !== 1
this.disableEdit = false this.disableDelete = this.batchDeleteObjs.length < 1
} else {
this.disableEdit = true
}
if (this.batchDeleteObjs.length >= 1) {
this.disableDelete = false
} else {
this.disableDelete = true
}
}, },
getTableData (params, isAll, isClearType) { getTableData (params, isAll, isClearType) {
if (isAll) { if (isAll) {
@@ -155,20 +147,16 @@ export default {
this.pageObj.total = list.length this.pageObj.total = list.length
this.loading = false this.loading = false
} else { } else {
get(listUrl, this.searchLabel).then(response => { axios.get(listUrl, { params: this.searchLabel }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.tableData = response.data.list this.tableData = _.get(response, 'data.data.list', [])
this.pageObj.total = response.data.total this.pageObj.total = _.get(response, 'data.data.total', 0)
if (!this.tableData || this.tableData.length === 0) { this.isNoData = !this.tableData || this.tableData.length === 0
this.isNoData = true
} else {
this.isNoData = false
}
} else { } else {
console.error(response) console.error(response)
this.isNoData = true this.isNoData = true
if (response.message) { if (response.data.message) {
this.$message.error(response.message) this.$message.error(response.data.message)
} else { } else {
this.$message.error(this.$t('tip.somethingWentWrong')) this.$message.error(this.$t('tip.somethingWentWrong'))
} }
@@ -187,19 +175,17 @@ export default {
cancelButtonText: this.$t('tip.no'), cancelButtonText: this.$t('tip.no'),
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
del(this.url + '?ids=' + row.id).then(response => { axios.delete(this.url + '?ids=' + row.id).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.delFlag = true this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
this.getTableData() this.getTableData()
} else { } else {
this.$message.error(response.msg) this.$message.error(response.data.message)
} }
}) })
}).catch(e => {}) }).catch(e => {})
}, },
delSelectionChange () {
},
delBatch () { delBatch () {
const ids = [] const ids = []
if (this.batchDeleteObjs && this.batchDeleteObjs.length > 0) { if (this.batchDeleteObjs && this.batchDeleteObjs.length > 0) {
@@ -220,7 +206,7 @@ export default {
}).then(() => { }).then(() => {
this.toggleLoading(true) this.toggleLoading(true)
axios.delete(this.url + '?ids=' + ids).then(response => { axios.delete(this.url + '?ids=' + ids).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.delFlag = true this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
this.getTableData() this.getTableData()
@@ -230,14 +216,13 @@ export default {
}).finally(() => { }).finally(() => {
this.toggleLoading(false) this.toggleLoading(false)
}) })
}).catch(() => {}) }).finally(() => {
.finally(() => { if (this.isSelectedStatus !== undefined) {
if (this.isSelectedStatus != undefined) { this.isSelectedStatus = false
this.isSelectedStatus = false this.disableDelete = true
this.disableDelete = true this.batchDeleteObjs = []
this.batchDeleteObjs = [] }
} })
})
} }
}, },
newObject () { newObject () {
@@ -272,9 +257,9 @@ export default {
} }
}, },
edit (u) { edit (u) {
get(`${this.url}/${u.id}`).then(response => { axios.get(`${this.url}/${u.id}`).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.object = response.data this.object = response.data.data
this.rightBox.show = true this.rightBox.show = true
} }
}) })
@@ -286,9 +271,9 @@ export default {
type: 'warning' type: 'warning'
}).catch(() => {}) }).catch(() => {})
} else { } else {
get(`${this.url}/${this.batchDeleteObjs[0].id}`).then(response => { axios.get(`${this.url}/${this.batchDeleteObjs[0].id}`).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.object = response.data this.object = response.data.data
this.rightBox.show = true this.rightBox.show = true
} }
}) })
@@ -328,8 +313,8 @@ export default {
if (!localStorage.getItem(storageKey.token)) { if (!localStorage.getItem(storageKey.token)) {
return window.location.replace('/') return window.location.replace('/')
} }
get(api.reportTemp).then(res => { axios.get(api.reportTemp).then(res => {
if (res.code === 200) { if (res.status === 200) {
axios.get(url, { responseType: 'blob', params: params }).then(res => { axios.get(url, { responseType: 'blob', params: params }).then(res => {
if (window.navigator.msSaveOrOpenBlob) { if (window.navigator.msSaveOrOpenBlob) {
// 兼容ie11 // 兼容ie11

View File

@@ -1,4 +1,4 @@
import { get } from '@/utils/http' import axios from 'axios'
import { getTextRect } from '@/utils/tools' import { getTextRect } from '@/utils/tools'
export default { export default {
data () { data () {
@@ -17,11 +17,11 @@ export default {
// 请求数据 relationshipUrlOne => 路由 refOne => ref // 请求数据 relationshipUrlOne => 路由 refOne => ref
getRelatedServerDataOne (relationshipUrlOne, refOne) { getRelatedServerDataOne (relationshipUrlOne, refOne) {
this.loadingRelationshipOne = true this.loadingRelationshipOne = true
get(relationshipUrlOne, this.getQueryParams()).then(response => { axios.get(relationshipUrlOne, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
const relationshipDataOne = [] const relationshipDataOne = []
if (response.data.result.length > 0) { if (response.data.data.result.length > 0) {
response.data.result.forEach(item => { response.data.data.result.forEach(item => {
relationshipDataOne.push({ value: item, show: true }) relationshipDataOne.push({ value: item, show: true })
}) })
} }
@@ -33,11 +33,11 @@ export default {
}, },
getRelatedServerDataTwo (relationshipUrlTow, refTow) { getRelatedServerDataTwo (relationshipUrlTow, refTow) {
this.loadingRelationshipTwo = true this.loadingRelationshipTwo = true
get(relationshipUrlTow, this.getQueryParams()).then(response => { axios.get(relationshipUrlTow, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
const relationshipDataTwo = [] const relationshipDataTwo = []
if (response.data.result.length > 0) { if (response.data.data.result.length > 0) {
response.data.result.forEach(item => { response.data.data.result.forEach(item => {
relationshipDataTwo.push({ value: item, show: true }) relationshipDataTwo.push({ value: item, show: true })
}) })
} }

View File

@@ -1,4 +1,4 @@
import { post, put } from '@/utils/http' import axios from 'axios'
export default { export default {
props: { props: {
@@ -24,26 +24,26 @@ export default {
if (this.blockOperation.save) { return } if (this.blockOperation.save) { return }
this.blockOperation.save = true this.blockOperation.save = true
this.$refs.userForm.validate((valid) => { this.$refs.form.validate((valid) => {
if (valid) { if (valid) {
if (this.editObject.id) { if (this.editObject.id) {
put(this.url, this.editObject).then(res => { axios.put(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} else { } else {
post(this.url, this.editObject).then(res => { axios.post(this.url, this.editObject).then(res => {
this.blockOperation.save = false this.blockOperation.save = false
if (res.code === 200) { if (res.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
this.esc(true) this.esc(true)
} else { } else {
this.$message.error(res.msg || res.message) this.$message.error(res.data.msg || res.data.message)
} }
}) })
} }

View File

@@ -1,7 +1,7 @@
import { chartTableOrderOptionsMapping, storageKey,knowledgeCategoryValue } from '@/utils/constants' import { chartTableOrderOptionsMapping, storageKey, knowledgeCategoryValue } from '@/utils/constants'
import { getWidthByLanguage } from '@/utils/tools' import { getWidthByLanguage } from '@/utils/tools'
import { put, patch } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import axios from 'axios'
export default { export default {
props: { props: {
tableData: { tableData: {
@@ -107,13 +107,14 @@ export default {
}, },
changeStatus (status, id) { changeStatus (status, id) {
if (id) { if (id) {
patch(api.knowledgeBaseEnable, { list: [{ knowledgeId: id, status: status }] }).then(response => { axios.patch(api.knowledgeBaseEnable, { list: [{ knowledgeId: id, status: status }] }).then(response => {
if (response.code === 200) { console.info(response)
if (response.status === 200) {
this.$message({ duration: 1000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 1000, type: 'success', message: this.$t('tip.saveSuccess') })
} else { } else {
console.error(response) console.error(response)
if (response.message) { if (response.data.message) {
this.$message.error(response.message) this.$message.error(response.data.message)
} else { } else {
this.$message.error(this.$t('tip.somethingWentWrong')) this.$message.error(this.$t('tip.somethingWentWrong'))
} }
@@ -123,11 +124,7 @@ export default {
} }
}, },
selectable (row, rowIndex) { selectable (row, rowIndex) {
if (row.isBuiltIn === 1) { return row.isBuiltIn !== 1
return false
} else {
return true
}
}, },
tableOperation ([command, row]) { tableOperation ([command, row]) {
switch (command) { switch (command) {

View File

@@ -1,10 +1,11 @@
import { get, post } from '@/utils/http' import {get} from '@/utils/http'
import axios from 'axios'
import router from '@/router' import router from '@/router'
import { sortByOrderNum, getWelcomeMenu } from '@/permission' import {getWelcomeMenu, sortByOrderNum} from '@/permission'
import { ElMessage } from 'element-plus' // dependent on utc plugin import {ElMessage} from 'element-plus' // dependent on utc plugin
import { storageKey, dbDrilldownTableConfig } from '@/utils/constants' import {dbDrilldownTableConfig, storageKey} from '@/utils/constants'
import { getConfigVersion } from '@/utils/tools' import {getConfigVersion} from '@/utils/tools'
import { api } from '@/utils/api' import {api} from '@/utils/api'
import indexedDBUtils from '@/indexedDB' import indexedDBUtils from '@/indexedDB'
const user = { const user = {
@@ -58,7 +59,8 @@ const user = {
}, },
actions: { actions: {
loginSuccess (store, res) { loginSuccess (store, res) {
post(api.permissions, { token: res.data.token }).then(res2 => { axios.post(api.permissions, { token: res.data.token }).then(response => {
const res2 = response.data
const menuList = sortByOrderNum(res2.data.menus) const menuList = sortByOrderNum(res2.data.menus)
store.commit('setMenuList', menuList) store.commit('setMenuList', menuList)
store.commit('setButtonList', res2.data.buttons) store.commit('setButtonList', res2.data.buttons)
@@ -73,8 +75,7 @@ const user = {
tempArr.forEach(t => { tempArr.forEach(t => {
const firstEqualIndex = t.indexOf('=') const firstEqualIndex = t.indexOf('=')
const key = t.substring(0, firstEqualIndex) const key = t.substring(0, firstEqualIndex)
const value = t.substring(firstEqualIndex + 1) query[key] = t.substring(firstEqualIndex + 1)
query[key] = value
}) })
} }
router.push({ router.push({
@@ -95,8 +96,9 @@ const user = {
} }
} }
}) })
get(api.config, { ckey: 'drill_down_table_config' }).then(async res => { axios.get(api.config, { params: { ckey: 'drill_down_table_config' } }).then(async response => {
if (res.code === 200 && res.page.list && res.page.list.length > 0) { const res = response.data
if (response.status === 200 && res.page.list && res.page.list.length > 0) {
// 从接口返回整体配置,再读取用户缓存,将对应条目覆盖,作为使用的配置 // 从接口返回整体配置,再读取用户缓存,将对应条目覆盖,作为使用的配置
const defaultConfigs = JSON.parse(res.page.list[0].cvalue) const defaultConfigs = JSON.parse(res.page.list[0].cvalue)
await indexedDBUtils.selectTable(dbDrilldownTableConfig).put({ await indexedDBUtils.selectTable(dbDrilldownTableConfig).put({
@@ -111,13 +113,15 @@ const user = {
} }
} }
}) })
get(api.config, { ckey: 'link_info' }).then(res => { axios.get(api.config, { params: { ckey: 'link_info' } }).then(response => {
if (res.code === 200 && res.page.list && res.page.list.length > 0) { const res = response.data
if (response.status === 200 && res.page.list && res.page.list.length > 0) {
localStorage.setItem(storageKey.linkInfo, res.page.list[0].cvalue) localStorage.setItem(storageKey.linkInfo, res.page.list[0].cvalue)
} }
}) })
get(api.config, { ckey: 'schema_entity_explore' }).then(res => { axios.get(api.config, { params: { ckey: 'schema_entity_explore' } }).then(response => {
if (res.code === 200 && res.page.list && res.page.list.length > 0) { const res = response.data
if (response.status === 200 && res.page.list && res.page.list.length > 0) {
localStorage.setItem(storageKey.schemaEntityExplore, res.page.list[0].cvalue) localStorage.setItem(storageKey.schemaEntityExplore, res.page.list[0].cvalue)
} }
}) })

View File

@@ -3,7 +3,6 @@
* @date 2021/6/11 * @date 2021/6/11
* @description 1.定义api2.定义通用查询方法,函数名应为 获取详情getItem、获取列表getItemList。例如getUser、getUserList * @description 1.定义api2.定义通用查询方法,函数名应为 获取详情getItem、获取列表getItemList。例如getUser、getUserList
*/ */
import { get, post } from '@/utils/http'
import axios from 'axios' import axios from 'axios'
import { sortByOrderNum } from '@/permission' import { sortByOrderNum } from '@/permission'
import { storageKey } from '@/utils/constants' import { storageKey } from '@/utils/constants'
@@ -36,12 +35,12 @@ export const api = {
// galaxyProxy // galaxyProxy
galaxyProxy: '/galaxy/setting', galaxyProxy: '/galaxy/setting',
// 知识库 // 知识库
knowledgeBase: BASE_CONFIG.apiVersion + '/knowledgeBase', knowledgeBase: apiVersion + '/knowledgeBase',
knowledgeBaseList: BASE_CONFIG.apiVersion + '/knowledgeBase/list', knowledgeBaseList: apiVersion + '/knowledgeBase/list',
knowledgeBaseEnable: BASE_CONFIG.apiVersion + '/knowledgeBase/status', knowledgeBaseEnable: apiVersion + '/knowledgeBase/status',
knowledgeBaseStatistics: BASE_CONFIG.apiVersion + '/knowledgeBase/statistics', knowledgeBaseStatistics: apiVersion + '/knowledgeBase/statistics',
updateKnowledgeUrl: BASE_CONFIG.apiVersion + '/knowledgeBase/items/batch', updateKnowledgeUrl: apiVersion + '/knowledgeBase/items/batch',
knowledgeBaseLog: BASE_CONFIG.apiVersion + '/knowledgeBase/audit/log', knowledgeBaseLog: apiVersion + '/knowledgeBase/audit/log',
// 报告相关 // 报告相关
reportJob: '/report/job', reportJob: '/report/job',
@@ -366,11 +365,11 @@ function handleResult (response) {
export async function getData (url, params = {}, isQueryList) { export async function getData (url, params = {}, isQueryList) {
const request = new Promise((resolve, reject) => { const request = new Promise((resolve, reject) => {
try { try {
get(url, params).then(response => { axios.get(url, { params }).then(response => {
if (response.code === 200) { if (response.status === 200) {
resolve(handleResult(response)) resolve(handleResult(response.data))
} else { } else {
reject(response) reject(response.data)
} }
}) })
} catch (e) { } catch (e) {
@@ -384,9 +383,9 @@ export async function getData (url, params = {}, isQueryList) {
export async function getPermission () { export async function getPermission () {
const request = new Promise(resolve => { const request = new Promise(resolve => {
post(api.permission, { token: localStorage.getItem(storageKey.token) }).then(response => { axios.post(api.permission, { token: localStorage.getItem(storageKey.token) }).then(response => {
resolve({ resolve({
menuList: sortByOrderNum(response.data.menus), menuList: sortByOrderNum(response.data.data.menus),
buttonList: response.data.buttons, buttonList: response.data.buttons,
roleList: response.data.roles roleList: response.data.roles
}) })
@@ -400,9 +399,9 @@ export async function getI18n () {
const langs = dictData.map(d => d.value).join(',') const langs = dictData.map(d => d.value).join(',')
localStorage.setItem(storageKey.languages, langs) localStorage.setItem(storageKey.languages, langs)
const request = new Promise(resolve => { const request = new Promise(resolve => {
get(api.i18nLang, { l: langs }).then(response => { axios.get(api.i18nLang, { params: { l: langs } }).then(response => {
response.data.cn = response.data.zh response.data.data.cn = response.data.data.zh
resolve(response.data) resolve(response.data.data)
}) })
}) })
return await request return await request

View File

@@ -116,7 +116,7 @@ export default {
}) })
axios.get(api.timezone).then(response => { axios.get(api.timezone).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.timezoneList = response.data.data this.timezoneList = response.data.data
if (this.timezoneList && this.timezoneList.length > 0) { if (this.timezoneList && this.timezoneList.length > 0) {
this.timezoneList.forEach(mapData => { this.timezoneList.forEach(mapData => {
@@ -153,7 +153,7 @@ export default {
}) })
axios.get(this.url, { pageSize: -1 }).then(response => { axios.get(this.url, { pageSize: -1 }).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.appearanceObject = response.data.data this.appearanceObject = response.data.data
} }
}) })
@@ -162,7 +162,7 @@ export default {
if (this.blockOperation.save) { return } if (this.blockOperation.save) { return }
this.blockOperation.save = true this.blockOperation.save = true
axios.put(this.url, this.appearanceObject).then(response => { axios.put(this.url, this.appearanceObject).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
if (this.appearanceObject.date_format !== localStorage.getItem(storageKey.dateFormat)) { if (this.appearanceObject.date_format !== localStorage.getItem(storageKey.dateFormat)) {
localStorage.setItem(storageKey.dateFormat, this.appearanceObject.date_format) localStorage.setItem(storageKey.dateFormat, this.appearanceObject.date_format)

View File

@@ -94,7 +94,7 @@ import galaxyProxyBox from '@/components/rightBox/settings/GalaxyProxyBox'
import galaxyProxyTable from '@/components/table/administration/GalaxyProxyTable' import galaxyProxyTable from '@/components/table/administration/GalaxyProxyTable'
import dataListMixin from '@/mixins/data-list' import dataListMixin from '@/mixins/data-list'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { get, put } from '@/utils/http' import axios from 'axios'
import TopToolMoreOptions from '@/components/common/popBox/TopToolMoreOptions' import TopToolMoreOptions from '@/components/common/popBox/TopToolMoreOptions'
import galaxyProxyDebug from '@/components/setting/GalaxyProxyDebug' import galaxyProxyDebug from '@/components/setting/GalaxyProxyDebug'
@@ -121,9 +121,9 @@ export default {
}, },
methods: { methods: {
edit (u) { edit (u) {
get(`${this.url}/${u.id}`).then(response => { axios.get(`${this.url}/${u.id}`).then(response => {
if (response.code === 200) { if (response.status === 200) {
const editObject = response.data const editObject = response.data.data
editObject.targetHeader || (editObject.targetHeader = '') editObject.targetHeader || (editObject.targetHeader = '')
editObject.preHandle || (editObject.preHandle = '') editObject.preHandle || (editObject.preHandle = '')
editObject.postHandle || (editObject.postHandle = '') editObject.postHandle || (editObject.postHandle = '')
@@ -143,11 +143,11 @@ export default {
this.debug(false, u) this.debug(false, u)
}, },
clearCache () { clearCache () {
put(`${this.url}/clearCache`).then(response => { axios.put(`${this.url}/clearCache`).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.success') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.success') })
} else { } else {
this.$message.error(response.msg || response.message) this.$message.error(response.data.message)
} }
}).catch(() => { }).catch(() => {
this.$message.error(this.$t('tip.unknownError')) this.$message.error(this.$t('tip.unknownError'))

View File

@@ -66,7 +66,7 @@ import dataListMixin from '@/mixins/data-list'
import rolesTable from '@/components/table/administration/RoleTable' import rolesTable from '@/components/table/administration/RoleTable'
import roleBox from '@/components/rightBox/settings/RoleBox' import roleBox from '@/components/rightBox/settings/RoleBox'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { get } from '@/utils/http' import axios from 'axios'
export default { export default {
name: 'roles', name: 'roles',
@@ -100,9 +100,9 @@ export default {
type: 'warning' type: 'warning'
}).catch(() => {}) }).catch(() => {})
} else { } else {
get(`${this.url}`, { ids: this.batchDeleteObjs[0].id }).then(response => { axios.get(`${this.url}`, { params: { ids: this.batchDeleteObjs[0].id } }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.object = response.data.list[0] this.object = response.data.data.list[0]
this.rightBox.show = true this.rightBox.show = true
} }
}) })

View File

@@ -66,7 +66,7 @@ import dataListMixin from '@/mixins/data-list'
import userTable from '@/components/table/administration/UserTable' import userTable from '@/components/table/administration/UserTable'
import userBox from '@/components/rightBox/settings/UserBox' import userBox from '@/components/rightBox/settings/UserBox'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { get } from '@/utils/http' import axios from 'axios'
export default { export default {
name: 'User', name: 'User',
@@ -113,18 +113,18 @@ export default {
if (this.listUrl) { if (this.listUrl) {
listUrl = this.listUrl listUrl = this.listUrl
} }
get(listUrl, this.searchLabel).then(response => { axios.get(listUrl, { params: this.searchLabel }).then(response => {
if (response.code === 200) { if (response.status === 200) {
for (let i = 0; i < response.data.list.length; i++) { for (let i = 0; i < response.data.data.list.length; i++) {
response.data.list[i].status = response.data.list[i].status + '' response.data.data.list[i].status = response.data.data.list[i].status + ''
} }
this.tableData = response.data.list this.tableData = response.data.data.list
this.pageObj.total = response.data.total this.pageObj.total = response.data.data.total
} else { } else {
console.error(response) console.error(response.data)
this.isNoData = true this.isNoData = true
if (response.message) { if (response.data.message) {
this.$message.error(response.message) this.$message.error(response.data.message)
} else { } else {
this.$message.error(this.$t('tip.somethingWentWrong')) this.$message.error(this.$t('tip.somethingWentWrong'))
} }

View File

@@ -3,17 +3,8 @@
<loading :loading="loading && !isTabs && !isBlock && !isGroup"></loading> <loading :loading="loading && !isTabs && !isBlock && !isGroup"></loading>
<chart-no-data v-if="isNoData" :active-tab="activeTab"></chart-no-data> <chart-no-data v-if="isNoData" :active-tab="activeTab"></chart-no-data>
<template v-else> <template v-else>
<chart-tabs
ref="chart"
v-if="isTabs"
:chart-info="chartInfo"
:time-filter="timeFilter"
:query-params="queryParams"
:entity="entity"
></chart-tabs>
<chart-map <chart-map
v-else-if="isMap && !isIpBasicInfo" v-if="isMap && !isIpBasicInfo"
:chart-info="chartInfo" :chart-info="chartInfo"
:chart-data="chartData" :chart-data="chartData"
:time-filter="timeFilter" :time-filter="timeFilter"
@@ -22,256 +13,6 @@
@getChartData="getChartData" @getChartData="getChartData"
@showLoading="showLoading" @showLoading="showLoading"
></chart-map> ></chart-map>
<chart-single-value
v-else-if="isSingleValue"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-single-value>
<chart-block
ref="chart"
v-else-if="isBlock"
:time-filter="timeFilter"
:query-params="queryParams"
:chart-info="chartInfo"
:chart-data="chartData"
:entity="entity"
></chart-block>
<chart-group
ref="chart"
v-else-if="isGroup"
:query-params="queryParams"
:time-filter="timeFilter"
:chart-info="chartInfo"
:chart-data="chartData"
:entity="entity"
></chart-group>
<ip-basic-info
v-else-if="isIpBasicInfo"
:time-filter="timeFilter"
:query-params="queryParams"
:chart-info="chartInfo"
:chart-data="chartData"
:entity="entity"
></ip-basic-info>
<chart-time-bar
v-else-if="isEchartsTimeBar"
:chart-info="chartInfo"
:chart-data="chartData"
:result-type="resultType"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-time-bar>
<chart-category-bar
v-else-if="isEchartsCategoryBar"
:chart-info="chartInfo"
:chart-data="chartData"
:result-type="resultType"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-category-bar>
<chart-ip-open-port-bar
v-else-if="isIpOpenPortBar"
:chart-info="chartInfo"
:chart-data="chartData"
:result-type="resultType"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-ip-open-port-bar>
<chart-table
v-else-if="isTable && isBasicTable"
:chart-info="chartInfo"
:chart-data="chartData"
:table="table"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-table>
<chart-active-ip-table
v-else-if="isActiveIpTable"
:chart-info="chartInfo"
:chart-data="chartData"
:table="table"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-active-ip-table>
<chart-app-basic-info
v-else-if="isAppBasicInfo"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-app-basic-info>
<chart-domain-whois
v-else-if="isDomainWhois"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-domain-whois>
<chart-domain-dns-record
v-else-if="isDomainDnsRecord"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-domain-dns-record>
<chart-cryptocurrency-event-list
v-else-if="isCryptocurrencyEventList"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-cryptocurrency-event-list>
<chart-relation-ship
v-else-if="isRelationShip"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
:entity="entity"
:need-timeout="needTimeout"
></chart-relation-ship>
<chart-san-key
v-else-if="isSankey"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
:entity="entity"
></chart-san-key>
<chart-echart
v-else-if="isEchartsLine || isEchartsPie"
:chart-info="chartInfo"
:chart-data="chartData"
:result-type="resultType"
:time-filter="timeFilter"
:need-timeout="needTimeout"
:query-params="queryParams"
@showLoading="showLoading"
></chart-echart>
<chart-echart-with-statistics
v-else-if="isEchartsWithStatistics"
:chart-info="chartInfo"
:chart-data="chartData"
:result-type="resultType"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
></chart-echart-with-statistics>
<chart-echart-with-table
v-else-if="isEchartsWithTable"
:chart-info="chartInfo"
:chart-data="chartData"
:query-params="queryParams"
:time-filter="timeFilter"
:result-type="resultType"
:order-pie-table="orderPieTable"
@showLoading="showLoading"
></chart-echart-with-table>
<chart-echart-ip-hosted-domain
v-else-if="isIpHostedDomain"
:chart-data="chartData"
:chart-info="chartInfo"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
:entity="entity"
></chart-echart-ip-hosted-domain>
<chart-echart-app-relate-domain
v-else-if="isAppRelatedDomain"
:chart-info="chartInfo"
:chart-data="chartData"
@showLoading="showLoading"
:entity="entity"
:time-filter="timeFilter"
:query-params="queryParams"
></chart-echart-app-relate-domain>
<chart-one-situation-statistics
v-else-if="isSingleSupportStatistics"
:chart-info="chartInfo"
:chart-data="chartData"
:query-params="queryParams"
:time-filter="timeFilter"
:entity="entity"
@showLoading="showLoading"
></chart-one-situation-statistics>
<chart-two-situation-statistics
v-else-if="isTwoSupportStatistics"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
:entity="entity"
></chart-two-situation-statistics>
<chart-alarm-info
v-else-if="isAlarmInfo"
:chart-info="chartInfo"
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
@showLoading="showLoading"
:tabHandleClickType="tabHandleClickType"
@getAlarmInfo="getAlarmInfo"
:entity="entity"
>
</chart-alarm-info>
<chart-domain-recursive-resolve
:chart-data="chartData"
:time-filter="timeFilter"
:query-params="queryParams"
v-else-if="isDomainRecursiveResolve"
></chart-domain-recursive-resolve>
<chart-detection-security
:chart-data="chartData"
:time-filter="timeFilter"
:chart-info="chartInfo"
:query-params="queryParams"
@chartDetection="chartDetection"
v-else-if="isDetectionSecurity"
@getDetectionData="getDetectionData"
></chart-detection-security>
<chart-detection-service
:chart-data="chartData"
:time-filter="timeFilter"
:chart-info="chartInfo"
:query-params="queryParams"
@chartDetection="chartDetection"
v-else-if="isDetectionService"
@getDetectionData="getDetectionData"
></chart-detection-service>
</template> </template>
</div> </div>
</template> </template>
@@ -279,34 +20,7 @@
<script> <script>
import Loading from '@/components/common/Loading' import Loading from '@/components/common/Loading'
import ChartNoData from '@/views/charts/charts/ChartNoData' import ChartNoData from '@/views/charts/charts/ChartNoData'
import ChartTabs from '@/views/charts/charts/ChartTabs'
import ChartMap from '@/views/charts/charts/ChartMap' import ChartMap from '@/views/charts/charts/ChartMap'
import ChartSingleValue from '@/views/charts/charts/ChartSingleValue'
import ChartBlock from '@/views/charts/charts/ChartBlock'
import ChartGroup from '@/views/charts/charts/ChartGroup'
import IpBasicInfo from '@/views/charts/charts/IpBasicInfo'
import ChartEchart from '@/views/charts/charts/ChartEchart'
import ChartEchartWithStatistics from '@/views/charts/charts/ChartEchartWithStatistics'
import ChartEchartWithTable from '@/views/charts/charts/ChartEchartWithTable'
import ChartEchartIpHostedDomain from '@/views/charts/charts/ChartEchartIpHostedDomain'
import ChartEchartAppRelateDomain from '@/views/charts/charts/ChartEchartAppRelateDomain'
import ChartActiveIpTable from '@/views/charts/charts/ChartActiveIpTable'
import ChartTimeBar from './charts/ChartTimeBar'
import ChartCategoryBar from './charts/ChartCategoryBar'
import ChartIpOpenPortBar from './charts/ChartIpOpenPortBar'
import ChartTable from './charts/ChartTable'
import ChartAppBasicInfo from '@/views/charts/charts/ChartAppBasicInfo'
import ChartDomainWhois from '@/views/charts/charts/ChartDomainWhois'
import ChartDomainDnsRecord from '@/views/charts/charts/ChartDomainDnsRecord'
import ChartCryptocurrencyEventList from '@/views/charts/charts/ChartCryptocurrencyEventList'
import ChartRelationShip from '@/views/charts/charts/ChartRelationShip'
import ChartSanKey from '@/views/charts/charts/ChartSanKey'
import ChartOneSituationStatistics from '@/views/charts/charts/ChartOneSituationStatistics'
import ChartTwoSituationStatistics from '@/views/charts/charts/ChartTwoSituationStatistics'
import ChartAlarmInfo from '@/views/charts/charts/ChartAlarmInfo'
import ChartDomainRecursiveResolve from '@/views/charts/charts/ChartDomainRecursiveResolve'
import chartDetectionSecurity from '@/views/charts/charts/chartDetectionSecurity'
import chartDetectionService from '@/views/charts/charts/chartDetectionService'
import { import {
isEcharts, isEcharts,
isEchartsLine, isEchartsLine,
@@ -352,36 +66,9 @@ import _ from 'lodash'
export default { export default {
name: 'chart', name: 'chart',
components: { components: {
ChartSanKey,
ChartCryptocurrencyEventList,
ChartDomainDnsRecord,
ChartDomainWhois,
ChartAppBasicInfo,
ChartActiveIpTable,
ChartTable,
IpBasicInfo,
ChartSingleValue,
Loading, Loading,
ChartNoData, ChartNoData,
ChartTabs, ChartMap
ChartMap,
ChartBlock,
ChartTimeBar,
ChartCategoryBar,
ChartIpOpenPortBar,
ChartRelationShip,
ChartGroup,
ChartEchartWithStatistics,
ChartEchart,
ChartEchartWithTable,
ChartEchartIpHostedDomain,
ChartEchartAppRelateDomain,
ChartOneSituationStatistics,
ChartTwoSituationStatistics,
ChartAlarmInfo,
ChartDomainRecursiveResolve,
chartDetectionSecurity,
chartDetectionService
}, },
data () { data () {
return { return {

View File

@@ -1,98 +0,0 @@
<template>
<div class="cn-chart__table active-ip">
<div class="cn-chart__body">
<el-table
style="width: 100%;height: 100%"
tooltip-effect="light"
:data="activeIpTable.tableData"
:show-header="false"
:cell-style="{padding:'7px 0'}"
>
<el-table-column>
<template #default="{ row }">
<div class="active-ip__icon"><i class="cn-icon cn-icon-ip ip-green"></i></div>
<div class="active-ip__content" >
{{row['name']}}
</div>
</template>
</el-table-column>
<el-table-column align="center">
<template #default="{ row }">
<span>
{{row['num']}}
</span>
</template>
</el-table-column>
<el-table-column
v-for="c in table.tableColumns"
show-overflow-tooltip
:key="c"
:label="c"
:prop="c"
>
<template #default="{ row }">
<span v-if="c === 'bytes'">
{{unitConvert(row[c], unitTypes.byte).join(' ')}}
</span>
<span v-else-if="c === 'packets' || c === 'sessions'">
{{unitConvert(row[c], unitTypes.number).join(' ')}}
</span>
<span v-else>
{{row[c]}}
</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { unitTypes } from '@/utils/constants'
import unitConvert from '@/utils/unit-convert'
export default {
name: 'ChartActiveIpTable',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object,
table: Object
},
data () {
return {
unitConvert,
unitTypes,
activeIpTable: {
orderBy: 'machine',
tableData: [
{
name: '192.168.20.21',
num: 111
}, {
name: '192.168.20.22',
num: 345
}, {
name: '192.168.20.23',
num: 111
}, {
name: '192.168.20.24',
num: 345
}, {
name: '192.168.20.25',
num: 111
}, {
name: '192.168.20.26',
num: 345
}
] // table的所有数据
}
}
},
mounted () {
}
}
</script>

View File

@@ -1,213 +0,0 @@
<template>
<div class="cn-chart__alarm-info">
<div class="no-data" v-if="isNoData">No data</div>
<template v-else>
<div class="alarm-info__box">
<div
class="box__body"
v-for="(value, index) in chartData ? chartData : []"
:key="index"
>
<div class="body__content">
<div class="content__icon-box">
<div
class="icon-box__icon"
:style="{
background: eventSeverityColor[value.eventSeverity], opacity: 0.1}"
></div>
<i
class="cn-icon cn-icon-alert"
:style="{
color: eventSeverityColor[value.eventSeverity], opacity: 1}"
></i>
</div>
<div class="content__text-box">
<div class="text-box__title">
<div v-if="value.entityType === 'domain'" :title="value.domain">
<span>{{ value.domain }}</span>
</div>
<div v-if="value.entityType === 'app'" :title="value.appName">
<span>{{ value.appName }}</span>
</div>
<div v-if="value.entityType === 'ip'" :title="value.serverIp">
<span>{{ value.serverIp }}</span>
</div>
</div>
<div class="text-box__text">
<div
class="text__type"
:style="{
color: eventSeverityColor[value.eventSeverity],
'border-color': eventSeverityColor[value.eventSeverity],
}"
:title="value.eventType"
>
{{ value.eventType }}
</div>
<div class="text__time-box">
<i class="cn-icon cn-icon-time2"></i>
<div class="time-box__start-time">
&nbsp; {{ $t(`dns.startTime`) }}:&nbsp;&nbsp;&nbsp;
</div>
<div style="flex: 1;">
{{value.startTime ? dateFormatByAppearance(value.startTime) : '-'}}
</div>
</div>
<div class="text__duration-box">
<i class="cn-icon cn-icon-time2"></i>
<div class="time-box__start-time">
&nbsp;{{ $t(`dns.duration`) }}:&nbsp;&nbsp;&nbsp;
</div>
<div
class="duration-box__circle"
:style="{
background: eventSeverityColor[value.eventSeverity],
}"
></div>
&nbsp;&nbsp;&nbsp;
<div>
{{unitConvert(value.endTime - value.startTime, 'time').join(' ')}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<chart-table-pagination
ref="tablePagination"
class="alarm-info__pagination"
:total="alarmInfoCount.result"
:pageSizeForAlarm="pageSizeForAlarm"
v-model:currentPage="pageNo"
@pageJump="pageJump"
></chart-table-pagination>
</template>
</div>
</template>
<script>
import { eventSeverityColor } from '@/utils/constants'
import unitConvert from '@/utils/unit-convert'
import ChartTablePagination from '@/views/charts/charts/ChartTablePagination'
import { get } from '@/utils/http'
import { api } from '@/utils/api'
export default {
name: 'isAlarmInfo',
props: {
chartInfo: Object,
chartData: [Array, Object],
tabHandleClickType: String,
queryParams: Object
},
data () {
return {
pageSizeForAlarm: 9,
eventSeverityColor: eventSeverityColor,
pageNo: 1,
alarmInfoCount: {},
fromChartData: '',
startTime: '',
endTime: ''
}
},
computed: {
isNoData () {
let isNoData = true
if (!this.$_.isEmpty(this.chartData)) {
isNoData = false
}
return isNoData
}
},
watch: {
tabHandleClickType: {
deep: true,
handler (n) {
this.$nextTick(() => {
this.getData(1, n)
})
}
},
queryParams: {
deep: true,
handler (n) {
if (n) {
this.startTime = n.startTime
this.endTime = n.endTime
this.getCount()
}
}
}
},
components: {
ChartTablePagination
},
methods: {
unitConvert,
getCount () {
const countQuery = {
startTime: this.startTime,
endTime: this.endTime,
eventSeverity:
this.tabHandleClickType === 'All' ? '' : this.tabHandleClickType
}
this.$nextTick(() => {
get(api.dashboard.DnsServiceInsights.alarmInfoCount, {
...countQuery
}).then((response) => {
if (response.code === 200) {
this.alarmInfoCount = response.data
}
})
})
},
getData (val, n) {
this.pageNo = val
const extraParams = {
pageNo: val,
pageSize: this.pageSizeForAlarm,
eventSeverity: n
? n === 'All'
? ''
: n
: this.tabHandleClickType === 'All'
? ''
: this.tabHandleClickType
}
const query = {
startTime: this.queryParams.startTime,
endTime: this.queryParams.endTime,
eventSeverity:
this.tabHandleClickType === 'All' ? '' : this.tabHandleClickType
}
this.$emit('getAlarmInfo', null, extraParams, false, {
startTime: query.startTime,
endTime: query.endTime
})
get(api.dashboard.DnsServiceInsights.alarmInfoCount, {
...query
}).then((response) => {
if (response.code === 200) {
this.alarmInfoCount = response.data
}
})
},
pageJump (val) {
this.getData(val)
}
},
mounted () {
const _this = this
this.emitter.on('chart-info', function (value) {
_this.getData(1, value)
})
this.getCount()
}
}
</script>

View File

@@ -1,77 +0,0 @@
<template>
<div class="cn-chart__app-basic">
<div class="cn-chart__body">
<div style="display: flex; justify-content: space-between; width: 100%;">
<el-descriptions :column="1" style="padding: 20px 30px;">
<el-descriptions-item :label="$t('overall.appName') + ':'">{{$_.get(chartData, "name") || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.appFullName') + ':'">{{$_.get(chartData, "appLongname") || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.technology') + ':'">{{$_.get(chartData, "appTechnology") || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.remark') + ':'">{{$_.get(chartData, "appDescription") || '-'}}</el-descriptions-item>
</el-descriptions>
<div class="cn-chart__body-single">
<div class="cn-chart__body-single-table">
<div class="single-value-icon__box">
<div class="single-value__icon"><i class="cn-icon cn-icon-category"></i></div>
</div>
<div class="single-value__content">
<div>
<span style="color: #666;">{{$t('entities.category')}}</span>
</div>
<div>
<span style="color: #333; font-weight: bold;">{{$_.get(chartData, "category") || '-'}}</span>
</div>
</div>
</div>
<div class="cn-chart__body-single-table">
<div class="single-value-icon__box">
<div class="single-value__icon single-value-color-g"><i class="cn-icon cn-icon-sub-category"></i></div>
</div>
<div class="single-value__content">
<div>
<span style="color: #666;">{{$t('entities.subcategory')}}</span>
</div>
<div>
<span style="color: #333; font-weight: bold;">{{$_.get(chartData, "subcategory") || '-'}}</span>
</div>
</div>
</div>
<div class="cn-chart__body-single-table">
<div class="single-value-icon__box">
<div class="single-value__icon single-value-color-y"><i class="cn-icon cn-icon-credit"></i></div>
</div>
<div class="single-value__content">
<div>
<span style="color: #666;">{{$t('entities.reputationLevel')}}</span>
</div>
<div>
<span style="color: #333; font-weight: bold;">{{$_.get(chartData, "risk") || '-'}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartAppBasicInfo',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object
},
data () {
return {
}
},
mounted () {
}
}
</script>
<style scoped>
</style>

View File

@@ -1,42 +0,0 @@
<template>
<panel-chart-list
:time-filter="timeFilter"
:data-list="dataList"
:panel-lock="true"
:entity="entity"
>
</panel-chart-list>
</template>
<script>
import chartMixin from '@/views/charts/charts/chart-mixin'
import _ from 'lodash'
import { ref } from 'vue'
export default {
name: 'ChartBlock',
mixins: [chartMixin],
methods: {
reload () {
const t = _.cloneDeep(this.dataList)
this.dataList = []
this.$nextTick(() => {
this.dataList = t
})
}
},
setup (props) {
const copyAndSort = dataList => {
const list = _.cloneDeep(dataList)
return list.sort((data1, data2) => {
return data1.x - data2.x
})
}
const dataList = ref(copyAndSort(props.chartInfo.children))
return {
copyAndSort,
dataList
}
}
}
</script>

View File

@@ -1,78 +0,0 @@
<template>
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
</template>
<script>
import * as echarts from 'echarts'
import {
categoryBar
} from '@/views/charts/charts/options/bar'
import { getCharBartColor, categoryBarTooltipFormatter } from '@/views/charts/charts/tools'
import chartEchartMixin from './chart-echart-mixin'
export default {
name: 'ChartCategoryBar',
mixins: [chartEchartMixin],
props: {
chartInfo: Object,
chartData: [Array, Object],
resultType: Object,
queryParams: Object
},
methods: {
initEcharts (id) {
const chartParams = this.chartInfo.params
const dom = document.getElementById(id)
!this.myChart && (this.myChart = echarts.init(dom))
this.chartOption = this.$_.cloneDeep(categoryBar)
this.chartOption.tooltip.trigger = 'item'
this.chartOption.tooltip.formatter = (params) => {
const str = categoryBarTooltipFormatter(params, chartParams.direction)
return str
}
if (!chartParams.itemColorAlternately) {
this.chartOption.series[0].itemStyle.color = function (params) {
return getCharBartColor(0)
}
}
if (chartParams.showLegend === false) {
this.chartOption.legend.show = false
}
const seriesTemplate = this.chartOption.series[0]
const obj = {
...seriesTemplate,
name: ' ',
data: []
}
this.chartData.forEach((r, index) => {
if (chartParams.direction === 'horizontal') {
obj.data.push([Number(r.events), r.clientCountry + ' ' + r.clientRegion, chartParams.unitType])
} else {
obj.data.push([r.clientCountry + ' ' + r.clientRegion, Number(r.events), chartParams.unitType])
}
return obj
})
this.chartOption.series = obj
const rows = (this.chartData.length - 1) / 4 + 1 // 根据legend个数动态预留legend空间
const gridTop = 10 + 27 * rows
this.chartOption.grid.top = gridTop
if (chartParams.direction === 'horizontal') {
const temp = this.chartOption.yAxis
this.chartOption.yAxis = { ...this.chartOption.xAxis }
this.chartOption.xAxis = temp
}
this.loadEchartBar()
},
loadEchartBar () {
this.$emit('showLoading', true)
try {
this.myChart.setOption(this.chartOption)
} finally {
setTimeout(() => {
this.$emit('showLoading', false)
}, 200)
}
}
}
}
</script>

View File

@@ -1,46 +0,0 @@
<template>
<div class="cn-chart__table eventList">
<div class="cn-chart__body">
<div class="crypto-eventList__record">
<div class="record__table">
<div style="height: 100%; overflow: hidden auto;">
<div class="record__table-row" v-for="(data, index) in chartDate" :key="index">
<div class="record__table-cell">
<div class="circle1" style=""></div>
</div>
<div class="record__table-cell">
{{$_.get(data, "message") || '-'}}{{$_.get(data, "serverIP") || '-'}}<br/>
<span class="record_second" > {{$_.get(data, "time") || '-'}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ $_.get(data, "clientIP") || '-'}}&nbsp;&nbsp;&nbsp; </span>
<div class="record_second arrow arrow-hor right"> </div>
<span class="record_second">&nbsp;&nbsp;&nbsp; {{$_.get(data, "serverIP") || '-'}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartCryptocurrencyEventList',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object
},
data () {
return {
chartDate: [
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' },
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' },
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' },
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' },
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' },
{ message: 'Traffic', serverIP: '1.3.2.2', clientIP: '1.3.2.2', time: '2022-01-19 20:06:25' }
]
}
}
}
</script>

View File

@@ -1,42 +0,0 @@
<template>
<div class="cn-chart__dns-record">
<div class="cn-chart__body">
<div class="entity-detail__dns-record">
<div class="dns-record__table">
<div style="height: 100%; overflow: hidden auto;">
<div class="dns-record__table-row dns-record__table-row--header">
<div class="dns-record__table-cell" style="min-width: 200px;">{{ $t('overall.type') }}</div>
<div class="dns-record__table-cell" style="min-width: 200px;">{{ $t('overall.value') }}</div>
<div class="dns-record__table-cell" style="width: 100%;">{{ $t('overall.country') }}</div>
</div>
<div class="dns-record__table-row" v-for="(data, index) in chartDate" :key="index">
<div class="dns-record__table-cell">{{$_.get(data, "type") || '-'}}</div>
<div class="dns-record__table-cell">{{$_.get(data, "value") || '-'}}</div>
<div class="dns-record__table-cell">{{$_.get(data, "country") || '-'}}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartDomainDnsRecord',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object
},
data () {
return {
chartDate: [
{ type: '1', value: '2', country: 'z' },
{ type: '1', value: '2', country: 'm' },
{ type: '1', value: '2', country: 'h' }
]
}
}
}
</script>

View File

@@ -1,205 +0,0 @@
<template>
<div style="overflow-y: auto; height: 100%; color: #555; white-space: pre;padding: 6px 0px 6px 6px;">
<el-table :data="linuxLineSymbolConvert"
:show-header="false"
:span-method="arraySpanMethod"
style="width: 100%;"
tooltip-effect="light"
:cell-style="setCellStyle">
<el-table-column prop="c1" class-name="domain-tooltip">
<template v-slot="scope" >
<el-tooltip ref='tooltip_c1'
popper-class="domain-recursive-resolve-popper"
effect="light"
placement="top"
hide-after="0"
show-after="50"
>
<template #content>{{scope.row['c1']}}</template>
<div class="short-content">{{scope.row['c1']}}</div>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="c2" show-overflow-tooltip width="80"/>
<el-table-column prop="c3" show-overflow-tooltip width="70"/>
<el-table-column prop="c4" show-overflow-tooltip width="80" />
<el-table-column prop="c5" class-name="domain-tooltip">
<template v-slot="scope" >
<el-tooltip ref='tooltip_c5'
popper-class="domain-recursive-resolve-popper"
effect="light"
placement="top"
hide-after="0"
show-after="50"
>
<template #content>{{scope.row['c5']}}</template>
<div class="short-content">{{scope.row['c5']}}</div>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import _ from 'lodash'
export default {
name: 'ChartDomainRecursiveResolve',
props: {
chartInfo: Object,
chartData: String,
resultType: Object,
queryParams: Object
},
data () {
return {
dnsRecordType: [
'A',
'AAAA',
'AFSDB',
'ALIAS',
'CAA',
'CERT',
'CNAME',
'DHCID',
'DNAME',
'DNSKEY',
'DS',
'HINFO',
'HTTPS',
'LOC',
'MX',
'NAPTR',
'NS',
'NSEC',
'NSEC3',
'NSEC3PARAM',
'PTR',
'RP',
'RRSIG',
'SOA',
'SRV',
'TLSA',
'TXT'
]
}
},
methods: {
setCellStyle ({ row, column, rowIndex, columnIndex }) {
const padding = '2px'
const border = '0px'
const background = '#F5F7FA'
if (columnIndex === 3) {
return {
color: '#598bd1',
background: background,
border: border,
padding: padding
}
} else if (columnIndex === 4) {
return {
'font-weight': 'bold',
background: background,
border: border,
padding: padding
}
} else {
return {
background: background,
border: border,
padding: padding
}
}
},
arraySpanMethod ({ row, column, rowIndex, columnIndex }) {
if (_.isEmpty(row.c2) && _.isEmpty(row.c3) &&
_.isEmpty(row.c4) && _.isEmpty(row.c5)) {
// [1,5]表示合并1行5列[0,0]表示改行不显示
if (columnIndex === 0) {
// 定位到6行0列的ID告诉该单元格合并1行2列
return [1, 5]
} else if (columnIndex > 0) {
// 定位到6行1列的姓名告诉该单元格不显示
return [0, 0]
}
}
}
/* isDnsRecordTypes(type){
if(_.indexOf(this.dnsRecordType, type)===-1){
return false
}else {
return true
}
} */
},
mounted () {
},
computed: {
linuxLineSymbolConvert () {
const dataArray = this.chartData ? this.chartData.split('\n') : []
const linuxArray = []
dataArray.forEach(item => {
const content = item.replace(/[\r\n]/g, '')
if (_.startsWith(content, ';')) {
const obj = {
c1: content,
c2: '',
c3: '',
c4: '',
c5: ''
}
linuxArray.push(obj)
} else if (content.length > 0) { // 忽略空白行
const separator = /\t+|\s+/
let rowArray = item.split(separator)
_.remove(rowArray, function (n) {
return _.isEmpty(n)
})
if (rowArray.length > 5) {
const specialArray = item.split(separator)
rowArray.forEach((i, index) => {
if (index >= 5) {
specialArray[4] = specialArray[4] + ' ' + i
}
})
const dnsTypes = specialArray[4].split(separator)
let isDnsTypeFinish = false
dnsTypes.forEach(item => {
if (!isDnsTypeFinish && this.dnsRecordType.indexOf(item) > -1) {
specialArray[3] = specialArray[3] + ' ' + item
specialArray[4] = specialArray[4].substring(specialArray[4].indexOf(item) + item.length)
} else {
isDnsTypeFinish = true
}
})
rowArray = specialArray
}
const obj = {
c1: rowArray[0] ? rowArray[0] : '',
c2: rowArray[1] ? rowArray[1] : '',
c3: rowArray[2] ? rowArray[2] : '',
c4: rowArray[3] ? rowArray[3] : '',
c5: rowArray[4] ? rowArray[4] : ''
}
linuxArray.push(obj)
}
})
return linuxArray
}
}
}
</script>
<style lang="scss">
.domain-recursive-resolve-popper{
max-width:550px;
}
.domain-tooltip {
.short-content{
cursor:default;
overflow:hidden;
white-space:nowrap;
-ms-text-overflow: ellipsis;
text-overflow: ellipsis;
}
}
</style>

View File

@@ -1,43 +0,0 @@
<template>
<div class="cn-chart__whois">
<div class="cn-chart__body">
<div class="domain-detail-list">
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.sponsor')}}</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "registrar") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.org')}}</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "org") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">Email</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "email") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('overall.country')}}</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "country") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.creationDate')}}</div>
<div class="domain-detail-list__content">{{ dateFormatByAppearance($_.get(chartData, "createTime") * 1) || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.expirationDate')}}</div>
<div class="domain-detail-list__content">{{ dateFormatByAppearance($_.get(chartData, "expirationTime") * 1) || '-'}}</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartDomainWhois',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object
}
}
</script>

View File

@@ -1,337 +0,0 @@
<template>
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
</template>
<script>
import unitConvert from '@/utils/unit-convert'
import { lineToSpace, reverseSortBy, humpToSpace } from '@/utils/tools'
import { unitTypes } from '@/utils/constants'
import chartEchartMixin from './chart-echart-mixin'
import { isEchartsLine, isEchartsPie } from './tools'
import { legendMapping } from '@/views/charts/charts/chart-table-title'
import _ from 'lodash'
export default {
name: 'ChartEchart',
mixins: [chartEchartMixin],
data () {
return {}
},
props: {
resultType: Object,
chartInfo: Object
},
setup (props) {
return {
isEchartsPie: isEchartsPie(props.chartInfo.type),
isEchartsLine: isEchartsLine(props.chartInfo.type)
}
},
methods: {
initEcharts (id) {
this.initDom(id)
const chartParams = this.chartInfo.params
if (chartParams.showLegend === false) {
this.chartOption.legend.show = false
}
this.handleYaxis()
if (this.isEchartsPie) {
if (chartParams.size && chartParams.size === 'small') {
this.chartOption.series[0] = {
...this.chartOption.series[0],
radius: ['30%', '45%'],
label: {
show: false
},
labelLine: {
show: false
}
}
this.chartOption.legend = {
...this.chartOption.legend,
left: '60%',
itemGap: 5,
itemWidth: 8,
itemHeight: 8,
formatter: function (name) {
return name.length > 9 ? name.substr(0, 9) + '...' : name
// return echarts.format.truncateText(name, 6, '…');
},
tooltip: {
show: true
},
textStyle: {
// 图例文字的样式
color: '#666666',
fontSize: 12,
fontWeight: 400
}
}
let chartDataTmp = []
let otherData = []
this.chartData.sort(reverseSortBy('num'))
if (this.chartData.length > 5) {
chartDataTmp = this.chartData.slice(0, 5)
chartDataTmp.forEach((data) => {
if (data.name === '') {
data.name = ' '
}
})
let otherSum = 0
otherData = this.chartData.slice(5)
otherData.forEach((data) => {
otherSum = otherSum + data.num
})
chartDataTmp.push({ num: otherSum, name: 'other' })
} else if (this.chartData.length <= 5) {
chartDataTmp = this.chartData.slice(0, this.chartData.length)
chartDataTmp.forEach((data) => {
if (data.name === '') {
data.name = ' '
}
})
}
this.chartOption.series[0].data = chartDataTmp.map((d) => {
return {
name: lineToSpace(d.name),
data: d,
value: parseInt(d.num),
unitType: chartParams.unitType ? chartParams.unitType : 'number'
}
})
} else {
this.chartOption.series[0].data = this.chartData.map((d) => {
return {
name: lineToSpace(d.name),
data: d,
value: parseInt(d.num),
unitType: chartParams.unitType ? chartParams.unitType : 'number'
}
})
}
} else {
const seriesTemplate = this.chartOption.series[0]
this.chartOption.series = this.chartData.map((r) => {
if (r.legend && legendMapping[`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`]) {
r.legend = this.$t(legendMapping[`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`])
}
const serie = {
...seriesTemplate,
name: legendMapping[
`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`
]
? legendMapping[
`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`
]
: (legendMapping[r.legend] ? legendMapping[r.legend] : humpToSpace(r.legend)),
data: r.values.map((v) => [
Number(v[0]) * 1000,
Number(v[1]),
chartParams.unitType
])
}
if (this.isEchartsLine) {
serie.data = serie.data.slice(1, serie.data.length - 2)
if (this.chartData.length === 1) { // 只有一条曲线
if (!_.isNaN(parseFloat(this.chartData[0].aggregation.p50)) && !_.isNaN(parseFloat(this.chartData[0].aggregation.p90))) {
serie.markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter (params) {
const arr = unitConvert(Number(params.value), chartParams.unitType).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
}
},
data: [
{
name: 'P50',
yAxis: this.chartData[0].aggregation.p50
},
{
name: 'P90',
yAxis: this.chartData[0].aggregation.p90
}
]
}
}
} else if (this.chartData.length > 1) { // 有多条曲线
this.myChart.on('legendselectchanged', this.handleLegendClick)
}
}
return serie
})
}
const gridTemplate = this.chartOption.grid
// option中默认单位是数字当单位是字节、百分比、时间时额外处理
if (chartParams.unitType === unitTypes.byte) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.byte).join('')
}
this.chartOption.grid = {
...gridTemplate,
left: 75
}
} else if (chartParams.unitType === unitTypes.percent) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.percent).join('')
}
} else if (chartParams.unitType === unitTypes.time) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.time).join('')
}
}
if (chartParams.showLegend) {
const rows = (this.chartData.length - 1) / 4 + 1 // 根据legend个数动态预留legend空间
this.chartOption.grid = {
...this.chartOption.grid,
top: 10 + 27 * rows
}
}
this.loadEchart()
},
// 点击前高亮legend个数
getSelectedNum (params) {
let selectedNum = 0
const legendItem = params.selected
for (const name in legendItem) {
if (name === params.name) {
if (!legendItem[name]) {
selectedNum = selectedNum + 1
}
} else {
if (legendItem[name]) {
selectedNum = selectedNum + 1
}
}
}
return selectedNum
},
// 点击后高亮legend个数
getAfterSelectedNum (params) {
let selectedNum = 0
const legendItem = params.selected
for (const name in legendItem) {
if (legendItem[name]) {
selectedNum = selectedNum + 1
}
}
return selectedNum
},
// 自定义legend的点击事件:此方法只处理多条曲线的情况单条曲线正常切换legend和曲线
handleLegendClick (params) {
// legend点击事件
const legendNum = Object.keys(params.selected).length
const selectedNum = this.getSelectedNum(params)
const legendItem = params.selected
if (selectedNum === legendNum) { // 点击前:全部曲线高亮
for (const name in legendItem) {
if (name === params.name) {
legendItem[name] = true
} else {
legendItem[name] = false
}
}
} else if (selectedNum === 1 && !params.selected[params.name]) { // 点击前:多条曲线,且只有一条曲线高亮时
for (const name in legendItem) {
legendItem[name] = true
}
}
this.myChart.setOption({
legend: {
selected: legendItem
}
})
if (this.getAfterSelectedNum(params) === 1) { // 点击后只有一条曲线高亮
const chartParams = this.chartInfo.params
// 多条曲线且只有一条曲线高亮时显示P50 P90 分位值,不止一个时隐藏标线
let selectedName = ''
for (const name in legendItem) {
if (legendItem[name]) {
selectedName = name
}
}
const serieArray = []
this.chartOption.series.forEach((item, i) => {
if (item.name === selectedName) {
if (!_.isNaN(parseFloat(this.chartData[i].aggregation.p50)) && !_.isNaN(parseFloat(this.chartData[i].aggregation.p90))) {
const markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter (params) {
const arr = unitConvert(Number(params.value), chartParams.unitType).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
}
},
data: [
{
name: 'P50',
yAxis: this.chartData[i].aggregation.p50
},
{
name: 'P90',
yAxis: this.chartData[i].aggregation.p90
}
]
}
item.markLine = markLine
}
}
serieArray.push(item)
})
this.myChart.setOption({
series: serieArray
})
} else { // 不止一条线高亮时隐藏标线
const serieArray = []
this.chartOption.series.forEach((item, i) => {
item.markLine = []
serieArray.push(item)
})
this.myChart.setOption({
series: serieArray
})
}
}
}
}
</script>

View File

@@ -1,94 +0,0 @@
<template>
<div class="app-detail__related-domain">
<div class="related-domain__list">
<div class="related-domain__list-title">{{$t('overall.domain')}}</div>
<div class="related-domain__list-body">
<div class="related-domain__list-row" v-for="(data, i) in chartData" :key="i"><i class="cn-icon cn-icon-domain"></i>&nbsp;{{data}}</div>
</div>
</div>
<div class="related-domain__chart">
<div>
<div class="related-domain__chart-title">{{$t('entities.byCategory')}}</div>
<div class="chart-drawing" :id="`chart${chartInfo.id}-0`"></div>
</div>
<div>
<div class="related-domain__chart-title">{{$t('entities.byCredit')}}</div>
<div class="chart-drawing" :id="`chart${chartInfo.id}-1`"></div>
</div>
</div>
</div>
</template>
<script>
import chartEchartMixin from './chart-echart-mixin'
import { get } from '@/utils/http'
import { reverseSortBy } from '@/utils/tools'
export default {
name: 'ChartEchartAppRelateDomain',
mixins: [chartEchartMixin],
methods: {
initEcharts (id) {
this.initDom(id, 2)
const chartParams = this.chartInfo.params
const domains = this.chartData.toString()
this.$emit('showLoading', true)
const typeUrl = chartParams.byCategoryUrl.slice(0, chartParams.byCategoryUrl.indexOf('?'))
const reputationUrlUrl = chartParams.byReputationUrl.slice(0, chartParams.byReputationUrl.indexOf('?'))
const byType = new Promise(resolve => {
get(typeUrl, { domains: domains }).then(response => {
// post(replaceUrlPlaceholder(chartParams.byCategoryUrl, { domains: domains })).then(response => {
if (response.code === 200) {
if (this.$_.isEmpty(response.data.result)) {
// this.noData0 = true
} else {
// this.noData0 = false
// const chartOption = this.$_.cloneDeep(this.chartOption)
const data = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
return {
data: d,
name: d.categoryName,
value: parseInt(d.uniqDomains),
unitType: chartParams.unitType
}
})
this.chartOption.series[0].data = data
}
}
}).finally(() => {
resolve()
})
})
const byReputation = new Promise(resolve => {
get(reputationUrlUrl, { domains: domains }).then(response => {
if (response.code === 200) {
if (this.$_.isEmpty(response.data.result)) {
// this.noData1 = true
} else {
// this.noData1 = false
// const chartOption = this.$_.cloneDeep(this.chartOption)
const data = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
return {
data: d,
name: d.reputationLevel,
value: parseInt(d.uniqDomains),
unitType: chartParams.unitType
}
})
this.chartOption2.series[0].data = data
// this.myChart2.setOption(chartOption)
}
}
}).finally(() => {
resolve()
})
})
Promise.all([byType, byReputation]).finally(response => {
this.loadEchart(2)
})
}
}
}
</script>

View File

@@ -1,94 +0,0 @@
<template>
<!-- IP详情 托管域名 -->
<div class="ip-detail__hosted-domain">
<div class="hosted-domain__list">
<div class="hosted-domain__list-title">{{$t('overall.domain')}}</div>
<div class="hosted-domain__list-body">
<div class="hosted-domain__list-row" v-for="(data, i) in chartData" :key="i">{{data.domain}}</div>
</div>
</div>
<div class="hosted-domain__chart">
<div>
<div class="hosted-domain__chart-title">{{$t('entities.byCategory')}}</div>
<div class="chart-drawing" :id="`chart${chartInfo.id}-0`"></div>
</div>
<div>
<div class="hosted-domain__chart-title">{{$t('entities.byCredit')}}</div>
<div class="chart-drawing" :id="`chart${chartInfo.id}-1`"></div>
</div>
</div>
</div>
</template>
<script>
import { replaceUrlPlaceholder, reverseSortBy } from '@/utils/tools'
import { get } from '@/utils/http'
import chartEchartMixin from './chart-echart-mixin'
export default {
name: 'ChartEchartIpHostedDomain',
mixins: [chartEchartMixin],
props: {
entity: Object
},
methods: {
initEcharts (id) {
this.initDom(id, 2)
const chartParams = this.chartInfo.params
const domains = this.chartData.map(function (item, i) {
return item.domain
}).join(',')
const byType = new Promise(resolve => {
get(replaceUrlPlaceholder(chartParams.byCategoryUrl, { domains: domains })).then(response => {
if (response.code === 200) {
if (this.$_.isEmpty(response.data.result)) {
// this.noData0 = true
} else {
// this.noData0 = false
// chartOption = this.$_.cloneDeep(this.chartOption)
const data = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
return {
data: d,
name: d.categoryName,
value: parseInt(d.uniqDomains),
unitType: chartParams.unitType
}
})
this.chartOption.series[0].data = data
}
}
resolve()
})
})
const byCredit = new Promise(resolve => {
get(replaceUrlPlaceholder(chartParams.byReputationUrl, { domains: domains })).then(response => {
if (response.code === 200) {
if (this.$_.isEmpty(response.data.result)) {
// this.noData1 = true
} else {
// this.noData1 = false
// this.chartOption2 = this.$_.cloneDeep(this.chartOption)
const data = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
return {
data: d,
name: d.reputationLevel,
value: parseInt(d.uniqDomains),
unitType: chartParams.unitType
}
})
this.chartOption2.series[0].data = data
// this.myChart2.setOption(this.chartOption2)
}
}
resolve()
})
})
Promise.all([byType, byCredit]).finally(response => {
this.loadEchart(2)
})
}
}
}
</script>

View File

@@ -1,300 +0,0 @@
<template>
<div class="chart-drawing" style="height: calc(100% - 17.5rem)" :id="`chart${chartInfo.id}`"></div>
<div class="cn-chart__footer">
<statistics-legend :data="statisticsData" :chart-info="chartInfo" @toggleLegend="toggleStatisticsLegend"></statistics-legend>
</div>
</template>
<script>
import StatisticsLegend from '@/views/charts/charts/StatisticsLegend'
import {
getChartColor
} from '@/views/charts/charts/tools'
import chartEchartMixin from './chart-echart-mixin'
import unitConvert from '@/utils/unit-convert'
import { unitTypes } from '@/utils/constants'
import { legendMapping } from '@/views/charts/charts/chart-table-title'
export default {
name: 'ChartEchartWithStatistics',
mixins: [chartEchartMixin],
data () {
return {
statisticsData: []
}
},
props: {
resultType: Object
},
components: {
StatisticsLegend
},
methods: {
initEcharts (id) {
this.initDom(id)
const chartParams = this.chartInfo.params
this.handleYaxis()
this.statisticsData = this.chartData.map(d => {
return {
...d,
active: true
}
})
const seriesTemplate = this.chartOption.series[0]
this.chartOption.series = this.chartData.map((r, i) => {
if (r.legend && legendMapping[r.legend]) {
r.legend = this.$t(legendMapping[r.legend])
}
return {
...seriesTemplate,
name: r.legend,
data: r.values.map(v => [Number(v[0]) * 1000, Number(v[1]), chartParams.unitType]),
lineStyle: {
color: getChartColor[i]
}
}
})
if (this.statisticsData.length === 1) {
const markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter (params) {
const arr = unitConvert(
Number(params.value),
chartParams.unitType
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
}
},
data: [
{
name: 'P50',
yAxis: this.chartData[0].aggregation.p50
? this.chartData[0].aggregation.p50
: 50
},
{
name: 'P90',
yAxis: this.chartData[0].aggregation.p90
? this.chartData[0].aggregation.p90
: 90
}
]
}
const serieTmp = this.chartOption.series[0]
this.chartOption.series[0] = {
...serieTmp,
markLine: markLine
}
}
const gridTemplate = this.chartOption.grid
// option中默认单位是数字当单位是字节、百分比、时间时额外处理
if (chartParams.unitType === unitTypes.byte) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.byte).join('')
}
this.chartOption.grid = {
...gridTemplate,
left: 75
}
} else if (chartParams.unitType === unitTypes.percent) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.percent).join('')
}
} else if (chartParams.unitType === unitTypes.time) {
this.chartOption.yAxis.axisLabel.formatter = function (value) {
return unitConvert(value, unitTypes.time).join('')
}
}
this.loadEchart(1, true)
},
dispatchLegendSelectAction (name) {
this.myChart.dispatchAction({
type: 'legendSelect',
name: name
})
},
dispatchLegendUnSelectAction (name) {
this.myChart.dispatchAction({
type: 'legendUnSelect',
name: name
})
},
toggleStatisticsLegend (index) {
const legendNum = this.statisticsData.length
const chartParams = this.chartInfo.params
if (legendNum > 1) {
const selectedNum = this.statisticsData.filter(item => { return item.active === true }).length // 点击前高亮legend个数
if (selectedNum === legendNum) { // 全部曲线高亮时
this.statisticsData.forEach((item, indexTmp) => {
if (indexTmp === index) {
item.active = true
this.dispatchLegendSelectAction(item.legend)
} else {
item.active = false
this.dispatchLegendUnSelectAction(item.legend)
}
})
} else if (selectedNum === 1 && this.statisticsData[index].active) { // 多条曲线,且只有一条曲线高亮, 且点击的曲线为高亮曲线时
this.statisticsData.forEach((item) => {
item.active = true
this.dispatchLegendSelectAction(item.legend)
})
} else {
this.statisticsData[index].active = !this.statisticsData[index].active
this.statisticsData.forEach((item, i) => {
if (item.active) {
this.dispatchLegendSelectAction(item.legend)
} else {
this.dispatchLegendUnSelectAction(item.legend)
}
})
}
const selectedAfterNum = this.statisticsData.filter((item, i) => { return item.active === true }).length // 点击后高亮legend个数
if (selectedAfterNum === 1) { // 点击后只有一条曲线高亮
const chartParams = this.chartInfo.params
// 多条曲线且只有一条曲线高亮时显示P50 P90 分位值,不止一个时隐藏标线
const selectedName = this.statisticsData.filter((item, i) => { return item.active === true })[0].legend
const serieArray = []
this.chartOption.series.forEach((item, i) => {
if (item.name === selectedName) {
const markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter (params) {
const arr = unitConvert(
Number(params.value),
chartParams.unitType
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
}
},
data: [
{
name: 'P50',
yAxis: this.chartData[i].aggregation.p50
? this.chartData[i].aggregation.p50
: 50
},
{
name: 'P90',
yAxis: this.chartData[i].aggregation.p90
? this.chartData[i].aggregation.p90
: 90
}
]
}
item.markLine = markLine
}
serieArray.push(item)
})
this.myChart.setOption({
series: serieArray
})
} else { // 不止一条线高亮时隐藏标线
const serieArray = []
this.chartOption.series.forEach((item, i) => {
item.markLine = []
serieArray.push(item)
})
this.myChart.setOption({
series: serieArray
})
}
} else {
this.statisticsData[index].active = !this.statisticsData[index].active
this.statisticsData.forEach((item, i) => {
if (item.active) {
this.dispatchLegendSelectAction(item.legend)
} else {
this.dispatchLegendUnSelectAction(item.legend)
}
})
const selectedAfterNum = this.statisticsData.filter((item, i) => { return item.active === true }).length // 点击后高亮legend个数
if (selectedAfterNum === 1) { // 点击后只有一条曲线高亮
const markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter (params) {
const arr = unitConvert(
Number(params.value),
chartParams.unitType
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
}
},
data: [
{
name: 'P50',
yAxis: this.chartData[0].aggregation.p50
? this.chartData[0].aggregation.p50
: 50
},
{
name: 'P90',
yAxis: this.chartData[0].aggregation.p90
? this.chartData[0].aggregation.p90
: 90
}
]
}
this.chartOption.series[0].markLine = markLine
} else {
this.chartOption.series[0].markLine = []
}
}
}
}
}
</script>

View File

@@ -1,149 +0,0 @@
<template>
<div class="cn-chart__echarts" >
<div class="cn-chart__body pie-with-table" >
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
</div>
<div class="cn-chart__footer pie-with-table" >
<pie-table :tableData="pieTableData" ref="pieTable" :chartInfo="chartInfo" :time-filter="handleQueryParams(queryParams)" :order="orderPieTable"/>
</div>
</div>
</template>
<script>
import PieTable from '@/views/charts/charts/PieTable'
import { getUnitType } from '@/utils/unit-convert'
import { replaceUrlPlaceholder } from '@/utils/tools'
import { get } from '@/utils/http'
import chartEchartMixin from './chart-echart-mixin'
import { riskLevelMapping } from '@/utils/constants'
export default {
name: 'ChartEchartWithTable',
mixins: [chartEchartMixin],
data () {
return {
pieTableData: [],
selectPieChartName: '',
allSelectPieChartName: []
}
},
props: {
resultType: Object,
queryParams: Object,
orderPieTable: String
},
components: {
PieTable
},
computed: {
appRisk () {
return function (level) {
const m = riskLevelMapping.find(mapping => {
return mapping.value == level
})
return (m && m.name) || level
}
}
},
methods: {
handleQueryParams (queryParams) {
this.timeFilter = {
startTime: Number(queryParams.startTime) * 1000,
endTime: Number(queryParams.endTime) * 1000
}
},
initEcharts (id) {
this.initDom(id)
const chartParams = this.chartInfo.params
chartParams.valueColumn = this.orderPieTable
const unitType = getUnitType(chartParams.valueColumn)
const tableQueryParams = this.$_.cloneDeep(this.queryParams)
tableQueryParams[chartParams.nameColumn] = [] // 处理两个图表不一样的地方)
this.handleYaxis()
const data = this.chartData.map(d => {
if (d[chartParams.nameColumn]) {
this.allSelectPieChartName.push(d[chartParams.nameColumn])
}
return {
data: d,
name: this.appRisk(d[chartParams.nameColumn]),
value: parseInt(d[chartParams.valueColumn]),
unitType: unitType
}
})
this.allSelectPieChartName = tableQueryParams[chartParams.nameColumn]
this.chartOption.series[0].data = data
if (this.chartOption.series[0].data && this.chartOption.series[0].data.length > 10) { // pieWithTable 图例超过10个改为滚动显示
this.chartOption.legend.type = 'scroll'
}
this.loadEchart()
if (!this.$_.isEmpty(data)) {
get(replaceUrlPlaceholder(chartParams.urlTable, tableQueryParams)).then(response => {
if (response.code === 200) {
this.pieTableData = response.data.result
} else {
// this.isError = true
this.noData = true
// this.errorInfo = response.msg || response.message || 'Unknown'
}
})
}
const self = this
// legend点击事件
this.myChart.off('legendselectchanged')
this.myChart.on('legendselectchanged', function (params) {
self.myChart.setOption({
legend: { selected: { [params.name]: true } }
})
const index = self.chartOption.series[0].data.findIndex(d => d.name === params.name)
if (self.selectPieChartName !== params.name) {
self.myChart.dispatchAction({
type: 'select',
seriesIndex: 0,
dataIndex: index
})
self.selectPieChartName = params.name
if (self.chartInfo.params.riskMapping) {
self.loadPieTableData(riskLevelMapping.find(m => params.name === m.name).value)
} else {
self.loadPieTableData(params.name)
}
} else {
self.myChart.dispatchAction({
type: 'unselect',
seriesIndex: 0,
dataIndex: index
})
self.selectPieChartName = ''
self.loadPieTableData(this.allSelectPieChartName)
}
})
// 饼图色块点击事件
this.myChart.off('click')
this.myChart.on('click', function (echartParams) {
// 若是已选,则点击后取消选择,并查询全部数据
if (echartParams.name === self.selectPieChartName) {
self.selectPieChartName = ''
self.loadPieTableData(this.allSelectPieChartName)
} else { // 否则查询当前name数据
self.selectPieChartName = echartParams.name
self.loadPieTableData(echartParams.data.data.appRisk || echartParams.name)
}
})
},
loadPieTableData (name = '') {
const childrenParams = this.$_.cloneDeep(this.queryParams)
childrenParams[this.chartInfo.params.nameColumn] = name
get(replaceUrlPlaceholder(this.chartInfo.params.urlTable, childrenParams)).then(response => {
if (response.code === 200) {
this.pieTableData = response.data.result
}
})
}
}
}
</script>

View File

@@ -1,41 +0,0 @@
<template>
<panel-chart-list
:time-filter="timeFilter"
:query-params="queryParams"
:data-list="dataList"
:panel-lock="true"
:entity="entity"
:need-timeout="true"
>
</panel-chart-list>
</template>
<script>
import chartMixin from '@/views/charts/charts/chart-mixin'
import _ from 'lodash'
import { ref } from 'vue'
export default {
name: 'ChartGroup',
mixins: [chartMixin],
props: {
timeFilter: Object,
queryParams: Object
},
methods: {
reload () {
const t = _.cloneDeep(this.dataList)
this.dataList = []
this.$nextTick(() => {
this.dataList = t
})
}
},
setup (props) {
const dataList = ref([...props.chartInfo.children])
return {
dataList
}
}
}
</script>

View File

@@ -1,100 +0,0 @@
<template>
<div class="chart-ip-open-port-bar">
<el-table
ref="table"
class="pie-table"
:data="tableData"
style="width: 70%;"
tooltip-effect="light"
empty-text=""
border="none"
:size="'mini'"
:height="'100%'">
<el-table-column
v-for="item in tableKey"
:key="item.prop"
:label="item.label"
:prop="item.prop"
:min-width="item.width"
>
<template v-slot="scope" :column="item">
<span v-if="item.prop === 'utime'">
{{ dateFormatByAppearance(scope.row[item.prop]) }}
</span>
<span v-else-if="scope.row[item.prop]">{{scope.row[item.prop]}}</span>
<template v-else>-</template>
</template>
</el-table-column>
</el-table>
<div class="chart-box">
<div class="title">
Protocols statistics
</div>
<div class="chart-drawing" :id="`chart${chartInfo.id}`">
</div>
</div>
</div>
</template>
<script>
import lodash from 'lodash'
import { ipOpenPortBar } from '@/views/charts/charts/options/bar'
import { getChartColor } from '@/views/charts/charts/tools'
import * as echarts from 'echarts'
import chartEchartMixin from './chart-echart-mixin'
export default {
name: 'ChartIpOpenPortBar',
mixins: [chartEchartMixin],
props: {
chartInfo: Object,
chartData: [Array, Object],
resultType: Object,
queryParams: Object
},
data () {
return {
tableData: [],
tableKey: [
{
label: 'Port',
prop: 'port',
width: '15%'
}, {
label: 'Protocol',
prop: 'protocol',
width: '20%'
}, {
label: 'Banner',
prop: 'banner',
width: '40%'
}, {
label: 'Updated at',
prop: 'utime',
width: '25%'
}
]
}
},
methods: {
initEcharts (id) {
const dom = document.getElementById(id)
!this.myChart && (this.myChart = echarts.init(dom))
this.tableData = lodash.cloneDeep(this.chartData)
this.chartOption = this.$_.cloneDeep(ipOpenPortBar)
const protocols = []
this.tableData.forEach((d, i) => {
const index = protocols.findIndex(p => p.name === d.protocol.toUpperCase())
if (index === -1) {
protocols.push({ name: d.protocol.toUpperCase(), value: 1, itemStyle: { color: getChartColor(i) } })
} else {
protocols[index].value++
}
})
this.chartOption.series[0].data = protocols
this.chartOption.xAxis.data = protocols.map(p => p.name)
this.myChart.setOption(this.chartOption)
}
}
}
</script>

View File

@@ -1,27 +0,0 @@
<template>
<div class="cn-chart__one-situation-statistics">
<div class="one-situation-statistics__box">
<div class="box__progress">
<el-progress
type="circle"
:color="chartInfo.params.color"
:percentage="Math.floor(($_.get(chartData, 'percent', '-') * 100) * 100) / 100"
/>
</div>
<div class="box__count">
<div> {{ $_.get(chartData, 'count', '-') }} </div>
<div>{{ $t(`dns.numberOfNodes`) }}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartOneSituationStatistics',
props: {
chartInfo: Object,
chartData: [Array, Object]
}
}
</script>

View File

@@ -1,319 +0,0 @@
<template>
<div class="chart-drawing chart-drawing-ship__width" :id="`chart${chartInfo.id}`"></div>
<div class="ship" :class="{'ship--show': showList}" v-ele-click-outside="shipChangeDown" id="ship">
<div class="ship-title">
<div class="ship-title-symbol" v-if="entityData.tableData.symbol"><img :src="entityData.tableData.symbol" /></div>
<div class="ship-title-name">{{ $_.get(entityData.tableData, 'name') || '-' }}</div>
</div>
<div class="ship-body">
<div class="ship-body-basicInfo" v-if="entityData.tableData.type === 'ip'">
<loading :loading="loadingIp"></loading>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('overall.location')}}</div>
<div class="ship-body-list-value">{{ipLocationRegion(entityData)}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">ASN</div>
<div class="ship-body-list-value">{{entityData.asn || '-'}}</div>
</div>
</div>
<div class="ship-body-basicInfo" v-if="entityData.tableData.type === 'app'">
<loading :loading="loadingApp"></loading>
<div class="ship-body-list">
<div class="ship-body-list-title">APP ID</div>
<div class="ship-body-list-value">{{entityData.appId|| '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.category')}}</div>
<div class="ship-body-list-value">{{entityData.category|| '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.subcategory')}}</div>
<div class="ship-body-list-value">{{entityData.subcategory || '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.riskLevel')}}</div>
<div class="ship-body-list-value">{{appRisk(entityData.appRisk) || '-'}}</div>
</div>
</div>
<div class="ship-body-basicInfo" v-if="entityData.tableData.type === 'domain'">
<loading :loading="loadingDomain"></loading>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.category')}}</div>
<div class="ship-body-list-value">{{entityData.domainCategory || '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.domainDetail.categoryGroup')}}</div>
<div class="ship-body-list-value">{{entityData.domainCategoryGroup || '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.reputationLevel')}}</div>
<div class="ship-body-list-value">{{entityData.domainReputationScore || '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.registration')}}</div>
<div class="ship-body-list-value">{{entityData.domainWhoisAddress || '-'}}</div>
</div>
<div class="ship-body-list">
<div class="ship-body-list-title">{{$t('entities.org')}}</div>
<div class="ship-body-list-value">{{entityData.domainWhoisOrg || '-'}}</div>
</div>
</div>
<div class="ship-body-list ship-body-child">
<div class="ship-body-list-title">{{$t('overall.traffic')}}</div>
<div class="ship-body-list-child">
<loading :loading="loadingTraffic"></loading>
<div class="ship-body-list-child-left">
<div class="ship-body-list-child-title">{{$t('overall.received')}}</div>
<div class="ship-body-list-child-value">
<div class="ship-body-list-child-msg">{{unitConvert(entityData.bytesReceivedRate, unitTypes.byte).join(' ')}}ps</div>
<div class="ship-body-list-child-loading">
<div class="ship-body-list-child-charts" id="entityDetailReceived"></div>
</div>
</div>
</div>
<div class="ship-body-list-child-left">
<div class="ship-body-list-child-title">{{$t('overall.sent')}}</div>
<div class="ship-body-list-child-value">
<div class="ship-body-list-child-msg">{{unitConvert(entityData.bytesSentRate, unitTypes.byte).join(' ')}}ps</div>
<div class="ship-body-list-child-loading">
<div class="ship-body-list-child-charts" id="entityDetailSend"></div>
</div>
</div>
</div>
</div>
</div>
<div class="ship-body-list ship-body-child">
<div class="ship-body-list-title">{{$t('relationShip.serviceQuality')}}</div>
<div class="ship-body-list-child">
<loading :loading="loadingServiceQuality"></loading>
<div class="ship-body-list-child-left">
<div class="ship-body-list-child-trip">{{$t('networkAppPerformance.tripTime')}}: </div><span>{{unitConvert(entityData.establishLatencyMs, unitTypes.time).join(' ')}}</span>
</div>
<div class="ship-body-list-child-left">
<div class="ship-body-list-child-trip">{{$t('overall.packetLoss')}}: </div><span>{{unitConvert(entityData.pktRetransPercent, unitTypes.percent).join(' ')}}</span>
</div>
</div>
</div>
<div class="ship-body-list">
<loading :loading="loadingAlert"></loading>
<div class="ship-body-list-title">{{$t('relationShip.alert')}}</div>
<div class="ship-body-list-value security">
<template v-if="shipSeverity.length > 0">
<span v-for="ship in shipSeverity" class="ship-severity" :key="ship">
<span class="ship-body-list-security-alert" :class="iconClass(ship)">{{ ship.eventSeverity }}</span>
<span class="ship-body-list-security-length">{{ ship.totalNumberOfEvents }}</span>
</span>
</template>
<span v-else-if="!loadingAlert && shipSeverity.length <= 0" class="no-recent-alerts"><i style="font-size: 14px;" class="el-icon-success"></i>{{$t('relationShip.noRecentAlerts')}}</span>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
import _ from 'lodash'
import { relationShip } from './options/sankey'
import ChartRelationShip from '@/views/charts/charts/chart-relation-ship'
import { api } from '@/utils/api'
import { getSecond } from '@/utils/date-util'
import { unitTypes } from '@/utils/constants'
import unitConvert from '@/utils/unit-convert'
import loading from '@/components/common/Loading'
export default {
name: 'ChartRelationShip',
data () {
return {
myChart: null,
chartOption: null,
showList: true,
timer: null,
relationShipIpUrl: {
entityType: 'ip',
trafficUrl: api.entityIpDetailTraffic,
performanceUrl: api.entityIpDetailPerformance,
securityUrl: api.entityIpDetailSecurity,
ServerOverviewUrl: api.entityIpRelatedServerIpOverview,
basicProperties: api.entityIpDetailBasic
},
relationShipDomainUrl: {
entityType: 'domain',
trafficUrl: api.entityDomainDetailTraffic,
performanceUrl: api.entityDomainDetailPerformance,
securityUrl: api.entityDomainDetailSecurity,
ServerOverviewUrl: api.entityDomainRelatedServerDomainOverview,
basicProperties: api.entityDomainDetailBasic
},
relationShipAppUrl: {
entityType: 'app',
trafficUrl: api.entityAppDetailTraffic,
performanceUrl: api.entityAppDetailPerformance,
securityUrl: api.entityAppDetailSecurity,
ServerOverviewUrl: api.entityAppRelatedServerAppOverview,
basicProperties: api.entityAppDetailBasic
},
loadingAlert: false,
loadingServiceQuality: false,
loadingTraffic: false,
loadingIp: false,
loadingDomain: false,
loadingApp: false,
tableName: '',
firstRender: true
}
},
components: {
loading
},
mixins: [ChartRelationShip],
props: {
chartInfo: Object,
chartData: [Array, Object],
resultType: Object,
queryParams: Object,
entity: Object,
needTimeout: Boolean
},
methods: {
init (id) {
const name = this.$route.query.name
const path = window.location.protocol + '//' + window.location.host
const dom = document.getElementById(id)
const div = document.getElementById('ship')
!this.myChart && (this.myChart = echarts.init(dom))
this.chartOption = this.$_.cloneDeep(relationShip)
const data = []
const links = []
handleData(data, links, this.chartData)
const _this = this
let queryParams = {}
this.myChart.on('click', function (params) {
this.tableName = params.data.name
setTimeout(() => {
div.style.left = params.event.event.offsetX + 'px'
if (dom.offsetHeight > (params.event.event.offsetY + div.offsetHeight)) {
div.style.top = params.event.event.offsetY + 'px'
div.style.bottom = ''
} else {
div.style.top = ''
div.style.bottom = '10px'
}
_this.showList = true
}, 300)
if (params.data.type === 'ip') {
queryParams = {
ip: params.data.name,
startTime: getSecond(_this.timeFilter.startTime),
endTime: getSecond(_this.timeFilter.endTime)
}
_this.queryEntityDetail(_this.relationShipIpUrl, params, queryParams)
} else if (params.data.type === 'app_name') {
queryParams = {
appName: params.data.name,
startTime: getSecond(_this.timeFilter.startTime),
endTime: getSecond(_this.timeFilter.endTime)
}
_this.queryEntityDetail(_this.relationShipAppUrl, params, queryParams)
} else if (params.data.type === 'domain') {
queryParams = {
domain: params.data.name,
startTime: getSecond(_this.timeFilter.startTime),
endTime: getSecond(_this.timeFilter.endTime)
}
_this.queryEntityDetail(_this.relationShipDomainUrl, params, queryParams)
}
})
this.chartOption.series[0].data = data
this.chartOption.series[0].links = links
this.myChart.setOption(this.chartOption)
function handleData (data, links, item) {
if (item && !data.some(d => d.name === item.name)) {
data.push({ name: item.name, ...handleStyle(item) })
}
if (item && !_.isEmpty(item.from) && !_.isEmpty(item.to)) {
links.push({ target: item.to, source: item.from })
}
if (item && !_.isEmpty(item.leaf)) {
item.leaf.forEach(i => {
handleData(data, links, i)
})
}
}
function handleStyle (item) {
const style = {}
style.label = {
position: 'top'
}
style.symbolSize = 50
style.label.color = '#999'
switch (item.type) {
case 'app_name': {
style.symbolSize = 55
style.type = item.type
if (name === item.name) {
style.label.color = '#333'
style.symbol = `image://${path}/images/entity-symbol/app-active.svg`
} else {
style.symbol = `image://${path}/images/entity-symbol/app.svg`
}
break
}
case 'domain': {
style.symbolSize = 55
style.type = item.type
if (name === item.name) {
style.label.color = '#333'
style.symbol = `image://${path}/images/entity-symbol/domain-active.svg`
} else {
style.symbol = `image://${path}/images/entity-symbol/domain.svg`
}
break
}
case 'ip': {
style.symbolSize = 40
style.type = item.type
if (name === item.name) {
style.label.color = '#333'
style.symbol = `image://${path}/images/entity-symbol/ip-active.svg`
} else {
style.symbol = `image://${path}/images/entity-symbol/ip.svg`
}
break
}
}
return style
}
},
shipChangeDown () {
this.showList = false
}
},
watch: {
chartData: {
deep: true,
handler (n) {
if (this.needTimeout && this.firstRender) {
this.firstRender = false
setTimeout(() => {
this.init(`chart${this.chartInfo.id}`)
}, 5000)
} else {
this.init(`chart${this.chartInfo.id}`)
}
}
}
},
setup () {
return {
unitConvert,
unitTypes
}
}
}
</script>

View File

@@ -1,112 +0,0 @@
<template>
<div class="sankey-box">
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
<div class="sankey__label" style="left: 5%;">{{$t('entities.inboundLinkId')}}</div>
<div class="sankey__label" style="left: 50%;">{{entity.ip || entity.domain || entity.app}}</div>
<div class="sankey__label" style="right: 5%; transform: translateX(50%)">{{$t('entities.outboundLinkId')}}</div>
</div>
</template>
<script>
import unitConvert, { valueToRangeValue } from '@/utils/unit-convert'
import { unitTypes } from '@/utils/constants'
import * as echarts from 'echarts'
import { sankey } from './options/sankey'
import chartEchartMixin from './chart-echart-mixin'
export default {
name: 'ChartSanKey',
mixins: [chartEchartMixin],
props: {
chartInfo: Object,
chartData: [Array, Object],
resultType: Object,
queryParams: Object,
entity: {
type: Object,
default: () => {}
}
},
methods: {
initEcharts (id) {
const vm = this
const entityName = this.entity.ip || this.entity.domain || this.entity.app || this.entity.appName
const dom = document.getElementById(id)
!this.myChart && (this.myChart = echarts.init(dom))
this.chartOption = this.$_.cloneDeep(sankey)
this.chartOption.tooltip.formatter = function (param) {
if (!param.data.latency || !param.data.convert || !param.data.lossPercent || !param.data.retransPercent) {
return false
}
return `
<div class="sankey__tooltip">
<div class="sankey__tooltip-row">
<div class="sankey__row-label">Via:</div>
<div class="sankey__row-value">${param.data.name}</div>
</div>
<div class="sankey__tooltip-row">
<div style="margin: 6px 0; height: 1px; width: 100%; background-color: #E7EAED;"></div>
</div>
<div class="sankey__tooltip-row">
<div class="sankey__row-label">Traffic:</div>
<div class="sankey__row-value">${param.data.convert[0]}${param.data.convert[1]}&nbsp;(${param.data.percent[0]}%)</div>
</div>
<div class="sankey__tooltip-row">
<div class="sankey__row-label">Performance:</div>
</div>
<div class="sankey__tooltip-table">
<div class="sankey__table-row">
<div class="sankey__table-cell">${vm.$t('networkAppPerformance.tripTime')}:</div>
<div class="sankey__table-cell">${param.data.latency[0]}&nbsp;${param.data.latency[1]}</div>
</div>
<div class="sankey__table-row">
<div class="sankey__table-cell">${vm.$t('overall.packetLoss')}:</div>
<div class="sankey__table-cell">${param.data.lossPercent[0]}&nbsp;%</div>
</div>
<div class="sankey__table-row">
<div class="sankey__table-cell">${vm.$t('overall.packetRetrans')}:</div>
<div class="sankey__table-cell">${param.data.retransPercent[0]}&nbsp;%</div>
</div>
</div>
</div>
`
}
let inTotalValue = 0
let outTotalValue = 0
this.chartData.forEach(item => {
if (item.direction === 'in') {
inTotalValue += parseInt(item.bytes)
} else if (item.direction === 'out') {
outTotalValue += parseInt(item.bytes)
}
})
const data = this.chartData.map(item => {
return {
...item,
name: item.linkID,
percent: valueToRangeValue(parseInt(item.bytes) / (item.direction === 'in' ? inTotalValue : outTotalValue) * 100, unitTypes.percent),
convert: unitConvert(item.bytes, unitTypes.byte),
latency: valueToRangeValue(item.latency, unitTypes.time),
lossPercent: valueToRangeValue(item.lossPercent, unitTypes.percent),
retransPercent: valueToRangeValue(item.retransPercent, unitTypes.percent),
bytes: parseFloat(item.bytes)
}
})
data.push({ name: entityName })
const link = data.map(item => {
const source = item.direction === 'in' ? item.linkID : entityName
const target = item.direction === 'in' ? entityName : item.linkID
return {
...item,
source,
target,
value: item.bytes
}
})
this.chartOption.series[0].data = data
this.chartOption.series[0].links = link
this.myChart.setOption(this.chartOption)
}
}
}
</script>

View File

@@ -1,403 +0,0 @@
<template>
<div
class="cn-chart__single-value chart-header-position"
:class="singleValueClass(type)"
:style="{ backgroundColor: color }"
>
<div class="single-value-icon__box" v-if="!isCommon3SingleValue(type) && !isDetectionsProtocol(type) ">
<div
class="single-value__icon"
:style="`background-color: ${
chartInfo.params.iconBackgroundColor || ''
}`"
>
<i
:class="icon"
:style="`color: ${chartInfo.params.iconColor || ''}`"
></i>
</div>
</div>
<div class="single-value__content" style="width: 200px;" v-if="isCommonSingleValue(type)">
<div class="content__data">
<span>{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span>
<span class="single-value__unit">{{ handleSingleValue[1] }}</span>
</div>
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
</div>
<div class="single-value__content" v-if="isSingleValueWithPercentileRight(type)">
<div class="data__title-in-one">
<div class="content__data">
<span style="white-space: nowrap;">{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span><span class="single-value__unit">{{handleSingleValue[1] }}</span>
</div>
<div class="content__title title-background-color">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
</div>
<div class="content__percentile">
<div class="circle__content">
<div class="circle circle-p50"></div>
<div><span class="percentile__title-color">P50: </span><span>
{{(handleSingleValue[2] || handleSingleValue[2] === 0)
?handleSingleValue[2]
:'-'}}
</span></div>
</div>
<div class="circle__content">
<div class="circle circle-p90"></div>
<div><span class="percentile__title-color">P90: </span><span>
{{(handleSingleValue[3]|| handleSingleValue[3] === 0)
?handleSingleValue[3]
:'-'}}
</span></div>
</div>
</div>
</div>
<div class="single-value__content" v-if="isSingleValueWithPercentileLeft(type)">
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
<div class="content__data">
<span>{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span>
<span class="single-value__unit">{{ handleSingleValue[1] }}</span>
</div>
<div class="content__percentile">
<div class="circle__content">
<div class="circle circle-p50"></div>
<div><span class="percentile__title-color">P50: </span><span>
{{(handleSingleValue[2]|| handleSingleValue[2] === 0)
?handleSingleValue[2]
:'-'}}
</span></div>
</div>
<div class="circle__content">
<div class="circle circle-p90"></div>
<div><span class="percentile__title-color">P90: </span><span>
{{(handleSingleValue[3]|| handleSingleValue[3] === 0)
?handleSingleValue[3]
:'-'}}
</span></div>
</div>
</div>
</div>
<div class="single-value__content single-value__content--with-chart" v-if="isSingleValueWithEcharts(type)">
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
<span
v-if="chartInfo.params && chartInfo.params.as"
class="ip-detail-as"
>
as&nbsp;<span style="text-transform: capitalize">{{
chartInfo.params.as
}}</span>
</span>
</div>
<div class="content__data">
<span>{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span>
<span class="single-value__unit">{{ handleSingleValue[1] }}</span>
</div>
<div class="content__chart">
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
</div>
</div>
<div class="single-value__content" v-if="isCommon2SingleValue(type)">
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
<div class="content__data">
<span>{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span>
<span class="single-value__unit">{{ handleSingleValue[1] }}</span>
</div>
</div>
<div class="single-value__content" v-if="isCommon3SingleValue(type)">
<div class="single-value-icon__box">
<div class="single-value__icon">
<!-- 使用图标-->
<svg class="cn-icon-svg" aria-hidden="true">
<use :xlink:href="icon"></use>
</svg>
</div>
</div>
<div class="single-value__data">
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
<div class="content__data">
<span>{{
handleSingleValue[0] || handleSingleValue[0] === 0
? handleSingleValue[0]
: '-'
}}</span>
<span class="single-value__unit">{{ handleSingleValue[1] }}</span>
</div>
</div>
</div>
<div class="single-value__content" v-if="isSingleValueWithPercent(type)">
<div>
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">{{
chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name
}}</span>
</div>
<div class="content__data">
<div class="content__data__doh">
<div class="content__data__doh__count">
{{ $_.get(chartData, 'count', '-') }}
</div>
<div class="content__data__doh__percent">
{{$t('protocol.proportion')}}<span>{{ $_.get(chartData, 'percent', '-') }}%</span>
</div>
</div>
</div>
</div>
</div>
<div class="single-value__content" v-if="isDetectionsProtocol(type)">
<div class="single-value__data">
<div class="content__title">
<span :title="chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name">
{{chartInfo.i18n ? $t(chartInfo.i18n) : chartInfo.name }}
</span>
</div>
</div>
<div class="content__data">
<div class="content__data-protocol">
<div class="content__data-protocol-all">
<div class="content__data-protocol-icon" :style="{backgroundColor: chartInfo.params.iconBackgroundColor[0]}">
<i :class="chartInfo.params.icon[0]" :style="{color: chartInfo.params.iconColor[0]}"></i>
</div>
</div>
<div class="content__data-protocol-value">
<div class="content__data-protocol-value-title">{{$t('protocol.requestVolume')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'bytes'), chartInfo.params.unitType).join('')}}</div>
</div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'bytesPercent'), unitTypes.percent).join('')}}</span></div>
</div>
<div class="content__data-protocol">
<div class="content__data-protocol-all">
<div class="content__data-protocol-icon" :style="{backgroundColor: chartInfo.params.iconBackgroundColor[1]}">
<i :class="chartInfo.params.icon[1]" :style="{color: chartInfo.params.iconColor[1]}"></i>
</div>
</div>
<div class="content__data-protocol-value">
<div class="content__data-protocol-value-title">{{$t('protocol.totalFlow')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'count'), chartInfo.params.unitType).join('')}}</div>
</div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'countPercent'), unitTypes.percent).join('')}}</span></div>
</div>
</div>
</div>
</div>
</template>
<script>
import unitConvert from '@/utils/unit-convert'
import { get } from '@/utils/http'
import { unitTypes } from '@/utils/constants'
import { replaceUrlPlaceholder } from '@/utils/tools'
import * as echarts from 'echarts'
import {
getOption,
getChartColor,
isCommonSingleValue,
isSingleValueWithEcharts,
isSingleValueWithPercentileLeft,
isSingleValueWithPercentileRight,
isCommon2SingleValue,
isSingleValueWithPercent,
isCommon3SingleValue,
isDetectionsProtocol
} from '@/views/charts/charts/tools'
import { legendMapping } from '@/views/charts/charts/chart-table-title'
export default {
name: 'chartSingleValue',
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object
},
data () {
return {
unitConvert,
unitTypes,
icon: '',
color: '',
type: 0,
chartOption: null,
timer: null,
myChart: ''
}
},
watch: {
chartInfo: {
deep: true,
immediate: true,
handler (n) {
this.icon = n.params.icon
this.color = n.params.color
this.type = n.type
}
}
},
computed: {
handleSingleValue () {
let value = null
if (this.isSingleValueWithPercentileLeft(this.chartInfo.type) || this.isSingleValueWithPercentileRight(this.chartInfo.type)) {
value = (this.chartData && (this.chartData.value || this.chartData.value === 0)) ? this.chartData.value : ''
} else {
value = (this.chartData || this.chartData === 0)
? this.chartData
: ''
}
const unitType = this.chartInfo.params.unitType
const result = unitConvert(value, unitType)
let p50 = ''
let p90 = ''
if (this.isSingleValueWithPercentileLeft(this.chartInfo.type) || this.isSingleValueWithPercentileRight(this.chartInfo.type)) {
p50 = this.chartData ? unitConvert(this.chartData.p50, unitType) : ''
p90 = this.chartData ? unitConvert(this.chartData.p90, unitType) : ''
}
switch (unitType) {
case unitTypes.percent: {
result[0] = result[0] < 0.01 ? '< 0.01' : result[0]
result[2] = (p50 && (p50[0] || Number(p50[0]) === 0)) ? p50[0] + p50[1] : ''
result[3] = (p90 && (p90[0] || Number(p90[0]) === 0)) ? p90[0] + p90[1] : ''
break
}
case unitTypes.time: {
result[0] = result[0] < 1 ? '< 1' : result[0]
result[2] = (p50 && (p50[0] || Number(p50[0]) === 0)) ? p50[0] + p50[1] : ''
result[3] = (p90 && (p90[0] || Number(p90[0]) === 0)) ? p90[0] + p90[1] : ''
break
}
default:
break
}
return result
},
singleValueClass () {
return function (type) {
let c
if (this.isCommonSingleValue(type)) {
c = 'cn-chart__single-value--icon-left'
} else if (this.isSingleValueWithEcharts(type)) {
c = 'cn-chart__single-value--chart'
} else if (this.isSingleValueWithPercentileLeft(type)) {
c = 'cn-chart__single-value--percentile-left'
} else if (this.isSingleValueWithPercentileRight(type)) {
c = 'cn-chart__single-value--percentile-right'
} else if (this.isCommon2SingleValue(type)) {
c = 'cn-chart__single-value--icon-right'
} else if (this.isCommon3SingleValue(type)) {
c = 'cn-chart__single-value--icon-right--color'
} else if (this.isSingleValueWithPercent(type)) {
c = 'cn-chart__single-value--icon-doh'
} else if (this.isDetectionsProtocol(type)) {
c = 'cn-chart__single-value--protocol'
}
return c
}
}
},
methods: {
isCommonSingleValue,
isSingleValueWithEcharts,
isSingleValueWithPercentileLeft,
isSingleValueWithPercentileRight,
isCommon2SingleValue,
isCommon3SingleValue,
isSingleValueWithPercent,
isDetectionsProtocol,
chartSingleValueTotal () {
const chartParams = this.$_.get(this.chartInfo, 'params') || {}
if (isSingleValueWithEcharts(this.type)) {
const dom = document.getElementById(`chart${this.chartInfo.id}`)
const myChart = echarts.init(dom)
this.chartOption = this.$_.cloneDeep(getOption(this.type))
get(replaceUrlPlaceholder(chartParams.urlChart, this.queryParams)).then(
(response) => {
const seriesTemplate = this.chartOption.series[0]
const result = response.data.result
this.chartOption.series = result.map((r, i) => {
if (r.legend && legendMapping[r.legend]) {
r.legend = this.$t(legendMapping[r.legend])
}
return {
...seriesTemplate,
name: r.legend,
data: r.values.map((v) => [
Number(v[0]) * 1000,
Number(v[1]),
chartParams.unitType
]),
lineStyle: {
color: getChartColor[i]
}
}
})
this.myChart = myChart
myChart.setOption(this.chartOption)
}
)
}
},
resize () {
if (this.myChart) this.myChart.resize()
}
},
mounted () {
this.debounceFunc = this.$_.debounce(this.resize, 500)
window.addEventListener('resize', this.debounceFunc)
this.$nextTick(
() =>
(this.timer = setTimeout(() => {
this.chartSingleValueTotal()
}, 200))
)
},
beforeUnmount () {
window.addEventListener('resize', this.debounceFunc)
},
deactivated () {
clearTimeout(this.timer)
}
}
</script>

View File

@@ -1,90 +0,0 @@
<template>
<div class="cn-chart__table">
<div class="cn-chart__body">
<el-table
style="width: 100%"
tooltip-effect="light"
:data="table.currentPageData"
>
<el-table-column :width="60" v-if="table.currentPageData.length" type="index" label="#">
</el-table-column>
<el-table-column
v-for="c in table.tableColumns.common"
show-overflow-tooltip
:key="c"
:label="$t(chartTableColumnMapping[c] || c)"
:prop="c"
>
</el-table-column>
<el-table-column
v-for="c in table.tableColumns.order"
show-overflow-tooltip
:key="c"
:label="$t(chartTableColumnMapping[c] || c)"
:prop="c"
>
<template #header>{{$t(chartTableColumnMapping[c] || c)}}</template>
<template #default="{ row }">
<span v-if="c === 'bytes'">
{{unitConvert(row[c], unitTypes.byte).join(' ')}}
</span>
<span v-else-if="c === 'packets' || c === 'sessions'">
{{unitConvert(row[c], unitTypes.number).join(' ')}}
</span>
<span v-else-if="c === 'responseFailRate'">
{{unitConvert(row[c], unitTypes.percent).join(' ')}}
</span>
<span v-else-if="c === 'dnsLatency'">
{{unitConvert(row[c], unitTypes.time).join(' ')}}
</span>
<span v-else>
{{row[c]}}
</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="cn-chart__footer" v-if="table.tableData.length > 10">
<chart-table-pagination
ref="tablePagination"
:total="table.tableData.length"
@pageJump="pageJump"
></chart-table-pagination>
</div>
</div>
</template>
<script>
import { unitTypes, chartTableColumnMapping } from '@/utils/constants'
import unitConvert from '@/utils/unit-convert'
import ChartTablePagination from '@/views/charts/charts/ChartTablePagination'
export default {
name: 'ChartTable',
components: {
ChartTablePagination
},
props: {
chartInfo: Object,
chartData: [Array, Object],
queryParams: Object,
table: Object
},
data () {
return {
chartTableColumnMapping,
unitConvert,
unitTypes
}
},
methods: {
pageJump (val) {
this.table.currentPageData = this.getTargetPageData(val, this.table.pageSize, this.table.tableData)
},
getTargetPageData (pageNum, pageSize, tableData) {
return this.$_.slice(tableData, (pageNum - 1) * pageSize, pageNum * pageSize)
}
},
mounted () {
}
}
</script>

View File

@@ -1,67 +0,0 @@
<template>
<el-pagination
small
ref="pagination"
layout="prev,jumper,slot,next"
class="chart-table-pagination"
:total="total"
:page-size="pageSize"
v-model:currentPage="pageNo"
@current-change="current"
>
<span>/&nbsp;{{totalPage}}</span>
</el-pagination>
</template>
<script>
import { chartTableDefaultPageSize } from '@/utils/constants'
export default {
name: 'ChartTablePagination',
props: {
total: Number,
pageSizeForAlarm: Number
},
data () {
return {
pageSize: this.pageSizeForAlarm ? this.pageSizeForAlarm : chartTableDefaultPageSize,
pageNo: 1
}
},
computed: {
totalPage () {
const remainder = this.total % this.pageSize
if (remainder) {
return parseInt(this.total / this.pageSize) + 1
} else {
return parseInt(this.total / this.pageSize)
}
}
},
watch: {
pageSizeForAlarm: {
deep: true
},
total: {
deep: true
}
},
methods: {
current (val) {
this.$emit('pageJump', val)
},
resetPageNo () {
this.pageNo = 1
}
},
mounted () {
const _this = this
this.emitter.on('chart-pageNo', function () {
_this.resetPageNo()
})
// console.log('this.$el==='+this.$el)
if (this.$el.querySelector) {
this.$el.querySelector('.el-pagination__jump').childNodes[0].nodeValue = ''
}
}
}
</script>

View File

@@ -1,68 +0,0 @@
<template>
<el-tabs
class="cn-chart cn-chart__tabs"
v-model="activeTab"
@tab-click="changeTab"
:ref="`chart-${chartInfo.id}`"
>
<el-tab-pane
v-for="tab in dataList"
:label="tab.i18n ? $t(tab.i18n) : tab.name" :name="`${tab.id}`"
:key="tab.id"
:ref="`chart-${chartInfo.id}`"
>
<panel-chart-list
v-if="activeTab == tab.id"
:time-filter="timeFilter"
:data-list="tab.children"
:active-tab="activeTab"
:panel-lock="true"
:need-timeout="true"
:entity="entity"
>
</panel-chart-list>
</el-tab-pane>
</el-tabs>
</template>
<script>
import _ from 'lodash'
import chartMixin from '@/views/charts/charts/chart-mixin'
export default {
name: 'ChartTabs',
mixins: [chartMixin],
methods: {
showFullscreen () {
},
changeTab (tab) {
this.activeTab = tab.paneName
},
reload () {
this.dataList = _.cloneDeep(this.dataList)
},
resize () {
this.$forceUpdate()
}
},
mounted () {
this.debounceFunc = this.$_.debounce(this.resize, 300)
window.addEventListener('resize', this.debounceFunc)
},
beforeUnmount () {
window.removeEventListener('resize', this.debounceFunc)
},
setup (props) {
let activeTab = ''
if (!_.isEmpty(props.chartInfo.children)) {
activeTab = `${props.chartInfo.children[0].id}`
}
const dataList = [...props.chartInfo.children]
return {
activeTab,
dataList
}
}
}
</script>

View File

@@ -1,108 +0,0 @@
<template>
<div class="chart-drawing" :id="`chart${chartInfo.id}`"></div>
</template>
<script>
import unitConvert from '@/utils/unit-convert'
import * as echarts from 'echarts'
import { lineToSpace } from '@/utils/tools'
import { unitTypes } from '@/utils/constants'
import { legendMapping } from '@/views/charts/charts/chart-table-title'
import {
timeBar
} from '@/views/charts/charts/options/bar'
import { getCharBartColor } from '@/views/charts/charts/tools'
import chartEchartMixin from '@/views/charts/charts/chart-echart-mixin'
export default {
name: 'ChaetTimeBar',
props: {
chartInfo: Object,
chartData: [Array, Object],
resultType: Object,
queryParams: Object
},
mixins: [chartEchartMixin],
methods: {
initEcharts (id) {
const chartParams = this.chartInfo.params
const dom = document.getElementById(id)
!this.myChart && (this.myChart = echarts.init(dom))
this.chartOption = this.$_.cloneDeep(timeBar)
if (!chartParams.itemColorAlternately) {
this.chartOption.series[0].itemStyle.color = function (params) {
return getCharBartColor(0)
}
}
if (chartParams.showLegend === false) {
this.chartOption.legend.show = false
}
const seriesTemplate = this.chartOption.series[0]
const allZero = this.timeBarIsAllZero(this.chartData)
if (allZero) {
this.chartOption.yAxis = {
...this.chartOption.yAxis,
min: 0,
max: 5,
interval: 1
}
}
this.chartOption.series = this.chartData.map(r => {
const obj = {
...seriesTemplate,
name: legendMapping[`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`] ? legendMapping[`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`] : lineToSpace(r.legend),
data: ''
}
// chartParams.direction === 'vertical' ? r.values.map(v => [Number(v[0]) * 1000, Number(v[1]), chartParams.unitType]) : r.values.map(v => [Number(v[1]), Number(v[0]) * 1000, chartParams.unitType])
if (chartParams.direction === 'horizontal') {
obj.data = r.values.map(v => [Number(v[1]), Number(v[0]) * 1000, chartParams.unitType])
} else {
obj.data = r.values.map(v => [Number(v[0]) * 1000, Number(v[1]), chartParams.unitType])
}
return obj
})
const rows = (this.chartData.length - 1) / 4 + 1 // 根据legend个数动态预留legend空间
const gridTop = 10 + 27 * rows
this.chartOption.grid.top = gridTop
if (chartParams.unitType === unitTypes.byte) {
this.chartOption.yAxis.axisLabel.formatter = function (value, index, a, b) {
return unitConvert(value, unitTypes.byte).join(' ')
}
this.chartOption.grid.left = 75
}
if (chartParams.direction === 'horizontal') {
const temp = this.chartOption.yAxis
this.chartOption.yAxis = { ...this.chartOption.xAxis }
this.chartOption.xAxis = temp
}
this.loadEchartBar()
},
loadEchartBar () {
this.$emit('showLoading', true)
try {
this.myChart.setOption(this.chartOption)
} finally {
setTimeout(() => {
this.$emit('showLoading', false)
}, 200)
}
},
timeBarIsAllZero (data) {
if (this.resultType === 'matrix') {
let allZero = true
try {
data.forEach(d => {
d.values.forEach(r => {
if (r[1] && r[1] !== '0') {
allZero = false
throw new Error('break')
}
})
})
} catch (e) {}
return allZero
}
}
}
}
</script>

View File

@@ -1,48 +0,0 @@
<template>
<div class="cn-chart__two-situation-statistics">
<div
class="two-situation-statistics__box"
v-for="(value, key,index) in result ? result : []"
:key="index"
>
<div class="box__body">
<div class="body__progress">
<el-progress
type="circle"
:color="chartInfo.params.color[index]"
width="76"
:percentage="value.percent ? value.percent : 0"
/>
</div>
<div class="body__count">
<div>{{ value.count ? value.count : '-' }}</div>
<div>{{ $t(`dns.numberOfNodesSupporting${key}Protocol`) }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChartTwoSituationStatistics',
props: {
chartInfo: Object,
chartData: [Array, Object]
},
data () {
return {
result: {
doh: {
count: 111,
percent: 0.85
},
dot: {
count: 111,
percent: 80.85
}
}
}
}
}
</script>

View File

@@ -1,87 +0,0 @@
<template>
<div class="cn-chart__ip-basic">
<div class="cn-chart__ip-basic-info">
<el-descriptions :column="1">
<el-descriptions-item label="ASN:">{{(chartData && chartData.asn) || '-'}}</el-descriptions-item>
<el-descriptions-item label="AS Org:">{{(chartData && chartData.asOrganization) || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('entities.asSubnet') + ':'">{{(chartData && chartData.asSubnet) || '-'}}</el-descriptions-item>
<el-descriptions-item label="ISP:">{{(chartData && chartData.isp) || '-'}}</el-descriptions-item>
<el-descriptions-item label="DNS PTR:">{{(chartData && chartData.dnsPtr) || '-'}}</el-descriptions-item>
</el-descriptions>
<el-descriptions :column="1" v-if="detectionsData.dnsServerRole">
<el-descriptions-item :label="$t('overall.dnsServerInfo.role') + ':'">{{$_.get(detectionsData, 'dnsServerRole') || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.dnsServerInfo.mechanism') + ':'">{{$_.get(detectionsData, 'dnsServerOrg') || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.dnsServerInfo.software') + ':'">{{$_.get(detectionsData, 'dnsServerSoftware') || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.dnsServerInfo.system') + ':'">{{$_.get(detectionsData, 'dnsServerOs') || '-'}}</el-descriptions-item>
<el-descriptions-item :label="$t('overall.dnsServerInfo.protocol') + ':'">{{detectionIpSupporting(detectionsData)}}</el-descriptions-item>
</el-descriptions>
</div>
</div>
</template>
<script>
import chartMixin from '@/views/charts/charts/chart-mixin'
import { get } from '@/utils/http'
import { api } from '@/utils/api'
export default {
name: 'IpBasicInfo',
mixins: [chartMixin],
data () {
return {
myChart: null,
entityDetectionsIpUrl: api.entityDetectionsIp,
detectionsData: {}
}
},
computed: {
location () {
let location = ''
if (this.chartInfo) {
if (this.chartInfo.city) {
location = this.chartInfo.city
}
if (this.chartInfo.province) {
location = location ? `${this.chartInfo.province}, ${location}` : this.chartInfo.province
}
if (this.chartInfo.country) {
location = location ? `${this.chartInfo.country}, ${location}` : this.chartInfo.country
}
}
return location
},
detectionIpSupporting () {
return function (detectionsData) {
let result = ''
if (detectionsData.dnssecSupport) {
result += 'DNSSec/'
}
if (detectionsData.dohSupport) {
result += 'DoH/'
}
if (detectionsData.dotSupport) {
result += 'Dot/'
}
result = result.substr(0, result.length - 1)
if (!result) {
result = '-'
}
return result
}
}
},
methods: {
queryDetection () {
get(this.entityDetectionsIpUrl, this.queryParams).then(response => {
if (response.code === 200) {
this.detectionsData = response.data.result
}
})
}
},
mounted () {
this.$nextTick(() => {
this.queryDetection()
})
}
}
</script>

View File

@@ -1,260 +0,0 @@
<template>
<el-table
ref="table"
class="pie-table"
:data="pieTableData"
style="width: 100%;border: 1px solid #E7EAED"
:row-key="getRowKey"
@expand-change="currentChange"
:current-row-key="tableNameColumn"
tooltip-effect="light"
:expand-row-keys="expandRowKeys"
size="mini"
height="100%">
<el-table-column type="expand" min-width="5%">
<template #default="props">
<div style="position: relative">
<loading :loading="loading"></loading>
<el-table
tooltip-effect="light"
class="expand-table"
:data="childrenTableData"
style="width: 100%;"
:show-header="false"
:size="'mini'"
:height="'100%'">
<el-table-column
width="48">
</el-table-column>
<el-table-column
v-for="item in tableTitlesOther"
:key="item.prop"
show-overflow-tooltip
:min-width="item.width"
:label="item.label"
:prop="item.prop"
#default="{row}">
<span v-if="item.prop === 'nameColumn'">
{{ nameColumn === 'domainCategoryName' ? row['categoryName'] :(nameColumn === 'domainReputationLevel'? row['reputationLevel']:(nameColumn==='appCategory'?row['appCategoryName']:appRisk(row['appRiskLevel'])))}}
</span>
<span v-else-if="item.prop === 'tableNameColumn'">
{{ tableNameColumn === 'appName' ? row['appName'] : row['domain']}}
</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>
</div>
</template>
</el-table-column>
<el-table-column
v-for="item in tableTitles"
:key="item.prop"
show-overflow-tooltip
:min-width="item.width"
:label="(tableNameColumn === 'appName'&& item.prop === 'tableNameColumn')? $t('overall.appName'):item.label"
:prop="item.prop"
#default="{row}">
<span v-if="item.prop === 'nameColumn'">
{{ nameColumn === 'domainCategoryName' ? row['categoryName'] :(nameColumn === 'domainReputationLevel'? row['reputationLevel']:(nameColumn==='appCategory'?row['appCategoryName']:appRisk(row['appRiskLevel'])))}}
</span>
<span v-else-if="item.prop === 'tableNameColumn'">
{{ tableNameColumn === 'appName' ? row['appName'] : row['domain']}}
</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>
<script>
import unitConvert from '@/utils/unit-convert'
import { get } from '@/utils/http'
import { replaceUrlPlaceholder } from '@/utils/tools'
import { unitTypes, riskLevelMapping } from '@/utils/constants'
import Loading from '@/components/common/Loading'
export default {
name: 'PieTable',
props: {
tableData: Array,
chartInfo: Object,
order: String,
timeFilter: Object
},
components: {
Loading
},
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) {
this.nameColumn = n.params.nameColumn
this.tableNameColumn = n.params.tableNameColumn
}
}
}
},
computed: {
appRisk () {
return function (level) {
const m = riskLevelMapping.find(mapping => {
return mapping.value == level
})
return (m && m.name) || level
}
}
},
data () {
return {
nameColumn: '',
tableNameColumn: '',
pieTableData: [],
childrenTableData: [],
expandRowKeys: [],
tableTitles: [
{
label: this.$t('overall.domain'),
prop: 'tableNameColumn', // 'domain'
width: '20%'
},
{
label: this.$t(this.chartInfo.params.tableTypeColumnLabel),
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%'
},
{
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%'
}
],
loading: true
}
},
methods: {
currentChange (row, expandedRows) {
this.loading = true
this.childrenTableData = []
if (this.tableNameColumn === 'appName') {
if (this.expandRowKeys[0] && (row.appName === this.expandRowKeys[0])) {
this.expandRowKeys = []
} else {
this.expandRowKeys = [row.appName]
}
} else {
if (this.expandRowKeys[0] && (row.domain === this.expandRowKeys[0])) {
this.expandRowKeys = []
} else {
this.expandRowKeys = [row.domain]
}
}
const url = this.chartInfo.params.urlChildrenTable
let queryParams = {
startTime: parseInt(this.timeFilter.startTime / 1000),
endTime: parseInt(this.timeFilter.endTime / 1000),
order: this.order,
domain: row.domain,
limit: 10
}
if (this.tableNameColumn === 'appName') {
queryParams = {
startTime: parseInt(this.timeFilter.startTime / 1000),
endTime: parseInt(this.timeFilter.endTime / 1000),
order: this.order,
appName: row.appName,
limit: 10
}
}
setTimeout(() => {
get(replaceUrlPlaceholder(url, queryParams)).then(response2 => {
if (response2.code === 200) {
this.childrenTableData = response2.data.result
}
}).finally(() => {
this.loading = false
})
}, 500)
},
getRowKey (row) {
if (this.tableNameColumn === 'appName') {
return row.appName
} else {
return row.domain
}
}
},
setup () {
return {
unitTypes,
unitConvert
}
}
}
</script>

View File

@@ -1,48 +0,0 @@
<template>
<div class="chart__legend">
<div class="chart__table-top table-below-box">
<div class="table__below-color"></div>
<div class="table__below-title">Name</div>
<div class="table__below-statistics">Avg</div>
<div class="table__below-statistics">Max</div>
<div class="table__below-statistics">P50</div>
<div class="table__below-statistics">P90</div>
</div>
<div class="chart__table-below">
<div v-for="(item, index) in data" :key="index" class="table-below-box" :class="{'table-below-box--inactivated': !item.active}" @click="toggleLegend(index)">
<div class="table__below-color"><div :style="{backgroundColor: getChartColor(index)}"></div></div>
<div class="table__below-title" :title="item.legend">{{item.legend}}</div>
<div class="table__below-statistics" :title="valueToRangeValue(item.aggregation.avg, chartInfo.params.unitType).join('')">{{valueToRangeValue(item.aggregation.avg, chartInfo.params.unitType).join('')}}</div>
<div class="table__below-statistics" :title="valueToRangeValue(item.aggregation.max, chartInfo.params.unitType).join('')">{{valueToRangeValue(item.aggregation.max, chartInfo.params.unitType).join('')}}</div>
<div class="table__below-statistics" :title="valueToRangeValue(item.aggregation.p50, chartInfo.params.unitType).join('')">{{valueToRangeValue(item.aggregation.p50, chartInfo.params.unitType).join('')}}</div>
<div class="table__below-statistics" :title="valueToRangeValue(item.aggregation.p90, chartInfo.params.unitType).join('')">{{valueToRangeValue(item.aggregation.p90, chartInfo.params.unitType).join('')}}</div>
</div>
</div>
</div>
</template>
<script>
import { getChartColor } from '@/views/charts/charts/tools'
import unitConvert, { valueToRangeValue } from '@/utils/unit-convert'
export default {
name: 'StatisticsLegend',
props: {
data: Array,
chartInfo: Object
},
methods: {
toggleLegend (index) {
this.$emit('toggleLegend', index)
}
},
setup () {
return {
getChartColor,
unitConvert,
valueToRangeValue
}
}
}
</script>

View File

@@ -1,265 +0,0 @@
import _ from 'lodash'
import { get } from '@/utils/http'
import * as echarts from 'echarts'
import { entityListLineOption } from '@/views/charts/charts/chart-options'
import { eventSeverity, riskLevelMapping, unitTypes } from '@/utils/constants'
import unitConvert from '@/utils/unit-convert'
import { shallowRef } from 'vue'
import { object } from '@amcharts/amcharts4/core'
export default {
props: {
entity: Object,
timeFilter: Object
},
data () {
return {
entityData: {
chartOptionSent: null,
chartOptionReceived: null,
chartOption: null,
sentChart: null,
receivedChart: null,
tableData: {}
},
chartOption: null,
echartsArray: [],
security: [],
performance: [],
shipSeverity: []
}
},
computed: {
iconClass () {
return function (entityData) {
let className
switch (entityData.eventSeverity) {
case ('critical'): {
className = 'critical'
break
}
case ('high'): {
className = 'high'
break
}
case ('info'): {
className = 'info'
break
}
case ('medium'): {
className = 'medium'
break
}
case ('low'): {
className = 'low'
break
}
default:
break
}
return className
}
},
appRisk () {
return function (level) {
const m = riskLevelMapping.find(mapping => {
return mapping.value == level
})
return (m && m.name) || level
}
},
ipLocationRegion () {
return function (entityData) {
let result = ''
if (entityData.country) {
result += `${entityData.country},`
}
if (entityData.province) {
result += `${entityData.province},`
}
if (entityData.city) {
result += `${entityData.city},`
}
result = result.substr(0, result.length - 1)
if (!result) {
result = '-'
}
return result
}
}
},
methods: {
queryEntityDetailTraffic (urlObj, params, queryParams) {
if (!echarts.init(document.getElementById('entityDetailSend')) && !echarts.init(document.getElementById('entityDetailReceived'))) return ''
this.chartOption = _.cloneDeep(entityListLineOption)
this.sentChart = echarts.init(document.getElementById('entityDetailSend'))
this.receivedChart = echarts.init(document.getElementById('entityDetailReceived'))
this.loadingTraffic = true
get(urlObj.trafficUrl, queryParams).then(response => {
if (response.code === 200 && response.data.result && response.data.result.length > 0) {
response.data.result.forEach(t => {
if (t.legend === 'bytesSentRate') {
this.entityData.bytesSentRate = _.nth(t.values, -3)[1]
this.chartOptionSent = {
...this.chartOption,
series: [
{
name: this.$t('entities.sentThroughput'),
type: 'line',
legendHoverLink: false,
itemStyle: {
lineStyle: {
width: 1
}
},
color: '#69b072',
data: _.dropRight(t.values, 2).map(v => [Number(v[0]) * 1000, Number(v[1]), unitTypes.byte]),
showSymbol: false
}
]
}
} else if (t.legend === 'bytesReceivedRate') {
this.entityData.bytesReceivedRate = t.aggregation.last
this.chartOptionReceived = {
...this.chartOption,
series: [
{
name: this.$t('entities.receivedThroughput'),
type: 'line',
legendHoverLink: false,
itemStyle: {
lineStyle: {
width: 1
}
},
color: '#7899c6',
data: t.values.map(v => [Number(v[0]) * 1000, Number(v[1]), unitTypes.byte]),
showSymbol: false
}
]
}
}
})
this.echartsArray.push(shallowRef(this.sentChart), shallowRef(this.receivedChart))
this.sentChart.setOption(this.chartOptionSent)
this.receivedChart.setOption(this.chartOptionReceived)
this.loadingTraffic = false
} else {
this.loadingTraffic = false
}
})
},
queryEntityDetaServerOverview (urlObj, params, queryParams) {
this.loadingServiceQuality = true
get(urlObj.ServerOverviewUrl, queryParams).then(response => {
if (response.code === 200) {
this.entityData.establishLatencyMs = response.data.result.establishLatencyMs
this.entityData.pktRetransPercent = response.data.result.pktRetransPercent
}
this.loadingServiceQuality = false
})
},
queryEntityDetailAll (urlObj, params, queryParams) {
this.loadingAlert = true
this.shipSeverity = []
const performance = get(urlObj.performanceUrl, queryParams)
const security = get(urlObj.securityUrl, queryParams)
Promise.all([performance, security]).then(res => {
// const alertEventSeverity = ['critical', 'high', 'medium', 'info', 'low']
const alertAll = [...res[0].data.result, ...res[1].data.result]
// alertEventSeverity.forEach(d => {
// const eventArray = alertAll.filter(p => d === p.eventSeverity)
// const eventArrayMap = eventArray.map(t => { return { eventSeverity: t.eventSeverity } })
// if (eventArrayMap) {
// const eventObject = eventArrayMap.find(e => e.eventSeverity === d)
// const eventObjectMap = object.keys(eventObject).map(m => {
// return {
// eventSeverity: eventObject[m],
// length: eventArray.length
// }
// })
// this.shipSeverity.push(...eventObjectMap)
// }
// })
alertAll.forEach(t => {
const hit = this.shipSeverity.find(e => e.eventSeverity === t.eventSeverity)
if (hit) {
this.shipSeverity.forEach(d => {
d.totalNumberOfEvents++
})
} else {
this.shipSeverity.push({ eventSeverity: t.eventSeverity, totalNumberOfEvents: 1 })
}
})
this.loadingAlert = false
})
},
getBasicProperties (urlObj, params, queryParams) {
this.loadingIp = true
this.loadingDomain = true
this.loadingApp = true
get(urlObj.basicProperties, queryParams).then(response => {
if (response.code === 200) {
if (urlObj.entityType === 'ip') {
this.entityData = {
...this.entityData,
asn: response.data.result.asn,
country: response.data.result.country,
province: response.data.result.province,
city: response.data.result.city
}
} else if (urlObj.entityType === 'domain') {
this.entityData = {
...this.entityData,
domainCategory: response.data.result.domainCategory,
domainCategoryGroup: response.data.result.domainCategoryGroup,
domainDescription: response.data.result.domainDescription,
domainReputationScore: response.data.result.domainReputationScore,
domainWhoisAddress: response.data.result.domainWhoisAddress,
domainWhoisOrg: response.data.result.domainWhoisOrg
}
} else if (urlObj.entityType === 'app') {
this.entityData = {
...this.entityData,
name: response.data.result.name,
appId: response.data.result.appId,
category: response.data.result.category,
subcategory: response.data.result.subcategory
}
}
}
this.loadingIp = false
this.loadingDomain = false
this.loadingApp = false
})
},
queryEntityDetail (urlObj, params, queryParams) {
this.entityData.tableData.name = params.data.name
this.entityData.tableData.symbol = params.data.symbol.slice(8)
this.entityData.tableData.type = urlObj.entityType
this.queryEntityDetailTraffic(urlObj, params, queryParams)
this.queryEntityDetailAll(urlObj, params, queryParams)
this.queryEntityDetaServerOverview(urlObj, params, queryParams)
this.getBasicProperties(urlObj, params, queryParams)
},
resize () {
this.echartsArray.forEach(item => { item.value.resize() })
}
},
setup () {
return {
unitTypes,
unitConvert
}
},
mounted () {
this.debounceFunc = this.$_.debounce(this.resize, 200)
window.addEventListener('resize', this.debounceFunc)
},
beforeUnmount () {
window.removeEventListener('resize', this.debounceFunc)
}
}

View File

@@ -1,86 +0,0 @@
<template>
<div class="security cn-detection--list">
<div class="cn-detection-table">
<chart-detections-table
v-for="(data, index) in chartData"
:detection="data"
:timeFilter="timeFilter"
:key="index"
:security="true"
:ref="`detectionRow${index}`"
:index="index"
></chart-detections-table>
</div>
<div class="cn-detection__footer">
<chart-detection-pagination
ref="pagination"
:page-obj="pageObj"
@pageJump="pageJump"
:pageSizeForAlarm="pageObj.pageSize"
></chart-detection-pagination>
</div>
</div>
</template>
<script>
import chartDetectionsTable from '@/views/charts/charts/chartDetectionsTable'
import chartDetectionPagination from '@/views/charts/charts/chartDetectionPagination'
import { get } from '@/utils/http'
import { replaceUrlPlaceholder } from '@/utils/tools'
export default {
name: 'chartDetectionSecurity',
props: {
chartInfo: Object,
chartData: Array,
resultType: Object,
queryParams: Object,
timeFilter: Object
},
components: {
chartDetectionPagination,
chartDetectionsTable
},
watch: {
},
data () {
return {
pageObj: {
pageNo: 1,
pageSize: 6,
total: 0,
resetPageNo: true
}
}
},
methods: {
securityCount () {
const requestUrl = this.chartInfo.params.countUrl
get(replaceUrlPlaceholder(requestUrl, this.queryParams)).then(response => {
this.pageObj.total = response.data.result
})
},
getDetectionData (val) {
this.pageObj.pageNo = val
const extraParams = {
pageNo: val,
pageSize: this.pageObj.pageSize
}
this.$emit('getDetectionData', this.chartInfo.params.url, extraParams, false, {
startTime: this.queryParams.startTime,
endTime: this.queryParams.endTime
})
const requestUrl = this.chartInfo.params.countUrl
get(replaceUrlPlaceholder(requestUrl, this.queryParams)).then(response => {
this.pageObj.total = response.data.result
})
},
pageJump (val) {
this.getDetectionData(val)
}
},
mounted () {
this.$emit('chartDetection', this.chartInfo.type)
this.securityCount()
}
}
</script>

View File

@@ -1,84 +0,0 @@
<template>
<div class="service cn-detection--list">
<div class="cn-detection-table">
<chart-detections-table
v-for="(data, index) in chartData"
:detection="data"
:timeFilter="timeFilter"
:key="index"
:service="true"
:ref="`detectionRow${index}`"
:index="index"
></chart-detections-table>
</div>
<div class="cn-detection__footer">
<chart-detection-pagination
ref="pagination"
:page-obj="pageObj"
@pageJump="pageJump"
:pageSizeForAlarm="pageObj.pageSize"
></chart-detection-pagination>
</div>
</div>
</template>
<script>
import chartDetectionPagination from '@/views/charts/charts/chartDetectionPagination'
import chartDetectionsTable from '@/views/charts/charts/chartDetectionsTable'
import { get } from '@/utils/http'
import { replaceUrlPlaceholder } from '@/utils/tools'
export default {
name: 'chartDetectionService',
props: {
chartInfo: Object,
chartData: Array,
resultType: Object,
queryParams: Object,
timeFilter: Object
},
components: {
chartDetectionPagination,
chartDetectionsTable
},
data () {
return {
pageObj: {
pageNo: 1,
pageSize: 6,
total: 0,
resetPageNo: true
}
}
},
methods: {
securityCount () {
const requestUrl = this.chartInfo.params.countUrl
get(replaceUrlPlaceholder(requestUrl, this.queryParams)).then(response => {
this.pageObj.total = response.data.result
})
},
getDetectionData (val) {
this.pageObj.pageNo = val
const extraParams = {
pageNo: val,
pageSize: this.pageObj.pageSize
}
this.$emit('getDetectionData', this.chartInfo.params.url, extraParams, false, {
startTime: this.queryParams.startTime,
endTime: this.queryParams.endTime
})
const requestUrl = this.chartInfo.params.countUrl
get(replaceUrlPlaceholder(requestUrl, this.queryParams)).then(response => {
this.pageObj.total = response.data.result
})
},
pageJump (val) {
this.getDetectionData(val)
}
},
mounted () {
this.$emit('chartDetection', this.chartInfo.type)
this.securityCount()
}
}
</script>

View File

@@ -1,150 +0,0 @@
<template>
<div class="cn-detection__case">
<div class="cn-detection__case-severity"><i :class="iconClass" class="cn-icon cn-icon-alert-level"></i></div>
<div class="cn-detection__row">
<div v-if="security" class="cn-detection__header">
<span>
<i :class="{ 'critical': detection.offenderIp === name}" class="cn-icon cn-icon-attacker"></i>
<span :class="{ 'critical': detection.offenderIp === name}">{{detection.offenderIp || '-'}}</span>
</span>
<div :class="{ 'critical': detection.offenderIp === name}" class="domain cn-detection-domain" v-if="detection.domain">{{detection.domain}}</div>
<span class="line">-------</span>
<span class="circle"></span>
<span>
<i :class="{ 'critical': detection.victimIp === name}" class="cn-icon cn-icon-attacked" ></i>
<soan :class="{ 'critical': detection.victimIp === name}">{{detection.victimIp || '-'}}</soan>
</span>
</div>
<div v-if="service" class="cn-detection__header">
<span v-if="detection.entityType === 'app'">
<i :class="{ 'critical': detection.appName === name}" class="cn-icon cn-icon-app2"></i>
<span :class="{ 'critical': detection.appName === name}">{{detection.appName || '-'}}</span>
</span>
<span v-else-if="detection.entityType === 'ip'">
<i :class="{ 'critical': detection.serverIp === name}" class="cn-icon cn-icon-ip2"></i>
<span :class="{ 'critical': detection.serverIp === name}">{{detection.serverIp || '-'}}</span>
</span>
<span v-else-if="detection.entityType === 'domain'">
<i :class="{ 'critical': detection.domain === name}" class="cn-icon cn-icon-domain2"></i>
<span :class="{ 'critical': detection.domain === name}">{{detection.domain || '-'}}</span>
</span>
</div>
<div class="cn-detection__body">
<div class="body__basic-info">
<div class="basic-info">
<div class="basic-info__item" v-if="detection.eventSecurity">
<i class="cn-icon cn-icon-severity-level"></i>
<span>{{$t('detection.list.eventSecurity')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{detection.eventSecurity || '-'}}</span>
</div>
<div class="basic-info__item" v-else-if="detection.eventSeverity">
<i class="cn-icon cn-icon-severity-level"></i>
<span>{{$t('detections.eventSeverity')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{detection.eventSeverity || '-'}}</span>
</div>
<div class="basic-info__item" v-if="security">
<i class="cn-icon cn-icon-event-type"></i>
<span>{{$t('detection.list.securityType')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{detection.securityType || '-'}}</span>
</div>
<div class="basic-info__item" v-else-if="service">
<i class="cn-icon cn-icon-event-type"></i>
<span>{{$t('detections.eventType')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{detection.eventType || '-'}}</span>
</div>
<div class="basic-info__item" v-if="security">
<i class="cn-icon cn-icon-trojan"></i>
<span>{{$t('detection.list.malwareName')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{detection.malwareName || '-'}}</span>
</div>
<!-- <div class="basic-info__item" v-if="security">-->
<!-- <i class="cn-icon cn-icon-mining-pool"></i>-->
<!-- <span>{{$t('detection.list.cryptominingPool')}}&nbsp;:&nbsp;&nbsp;</span>-->
<!-- <span>{{detection.cryptominingPool || '-'}}</span>-->
<!-- </div>-->
<div class="basic-info__item">
<i class="cn-icon cn-icon-time2"></i>
<span>{{$t('detection.list.startTime')}}&nbsp;:&nbsp;&nbsp;</span>
<span>{{dateFormatByAppearance(detection.startTime) || '-'}}</span>
</div>
<div class="basic-info__item">
<i class="cn-icon cn-icon-time2"></i>
<span>{{$t('overall.duration')}}&nbsp;:&nbsp;&nbsp;</span>
<span style="display: inline-block;height: 6px;width: 6px;border-radius: 50%;margin-right: 8px;" :style="pointColor(detection)"></span>
<span>{{unitConvert(detection.durationMs, 'time', null, null, 0).join(' ') || '-'}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { getMillisecond } from '@/utils/date-util'
import unitConvert from '@/utils/unit-convert'
export default {
name: 'detectionsTable',
props: {
index: Number,
timeFilter: Object,
detection: Object,
security: Boolean,
service: Boolean,
pageType: String // 安全事件、服务质量
},
data () {
return {
name: ''
}
},
computed: {
iconClass () {
let className
switch (this.detection.eventSecurity || this.detection.eventSeverity) {
case ('critical'): {
className = 'critical'
break
}
case ('high'): {
className = 'high'
break
}
case ('info'): {
className = 'info'
break
}
case ('medium'): {
className = 'medium'
break
}
case ('low'): {
className = 'low'
break
}
default: break
}
return className
},
pointColor () {
return function (detection) {
let color = '#8FA1BE'
if (detection.startTime && detection.endTime) {
if (getMillisecond(detection.endTime) - getMillisecond(detection.startTime) < 5 * 60 * 1000) {
color = '#D84C4C'
}
}
return { backgroundColor: color }
}
}
},
mounted () {
this.name = this.$route.query.name
},
methods: {
unitConvert,
getMillisecond
}
}
</script>

View File

@@ -1,50 +0,0 @@
<template>
<div class="chart-list chart-list--screen">
<div v-for="item in dnsScreenDataList"
:key="item.id"
:ref="'grid-item' + item.id"
class="dns-screen"
:style="'grid-area: '+(item.y+1+30) +'/ '+(item.x+1) +' / '+(item.y+item.h+1+30) +'/ '+(item.x+item.w+1)+';'"
>
<panel-chart
:ref="'chart' + item.id"
:chart-info="item"
:time-filter="timeFilter"
:entity="entity"
></panel-chart>
</div>
</div>
</template>
<script>
import PanelChart from '@/views/charts/PanelChart'
export default {
name: 'DnsScreen',
components: {
PanelChart
},
props: {
timeFilter: Object, // 时间范围
copyDataList: Array, // 图表信息
entity: Object
},
methods: {
reload () {
this.dnsScreenDataList.forEach(item => {
if (this.$refs['chart' + item.id] && this.$refs['chart' + item.id][0]) {
this.$refs['chart' + item.id][0].getChartData()
}
})
}
},
computed: {
dnsScreenDataList: function () {
return this.copyDataList.filter(function (item) {
return item.y < 0
})
}
}
}
</script>

View File

@@ -61,7 +61,7 @@
<script> <script>
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { getSecond } from '@/utils/date-util' import { getSecond } from '@/utils/date-util'
import { get } from '@/utils/http' import axios from 'axios'
import chartMixin from '@/views/charts2/chart-mixin' import chartMixin from '@/views/charts2/chart-mixin'
export default { export default {
@@ -121,8 +121,9 @@ export default {
endTime: getSecond(this.timeFilter.endTime) endTime: getSecond(this.timeFilter.endTime)
} }
this.toggleLoading(true) this.toggleLoading(true)
get(api.dnsInsight.activeMaliciousDomain, params).then(res => { axios.get(api.dnsInsight.activeMaliciousDomain, { params: params }).then(response => {
if (res.code === 200) { const res = response.data
if (response.status === 200) {
this.isNoData = res.data.result.length === 0 this.isNoData = res.data.result.length === 0
this.tableData = res.data.result this.tableData = res.data.result
} else { } else {

View File

@@ -94,7 +94,7 @@ export default {
axios.get(api.entity.performanceEvent, { params: params }).then(response => { axios.get(api.entity.performanceEvent, { params: params }).then(response => {
const res = response.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.isNoData = res.data.result.length === 0 this.isNoData = res.data.result.length === 0
this.showError = false this.showError = false
if (!this.isNoData) { if (!this.isNoData) {

View File

@@ -110,7 +110,7 @@ export default {
this.informationAggregationList = [] this.informationAggregationList = []
axios.get(`${api.entity.informationAggregation}/${this.entity.entityType}?resource=${this.entity.entityName}&pageSize=100&pageNo=1`).then(response => { axios.get(`${api.entity.informationAggregation}/${this.entity.entityType}?resource=${this.entity.entityName}&pageSize=100&pageNo=1`).then(response => {
const res = response.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
// this.isNoData = res.data.result.length === 0 // this.isNoData = res.data.result.length === 0
this.showError = false this.showError = false
if (res.data.result.length > 0) { if (res.data.result.length > 0) {

View File

@@ -74,7 +74,7 @@ export default {
this.chartOption = pieChartOption1 this.chartOption = pieChartOption1
this.loading1 = true this.loading1 = true
axios.get(api.netWorkOverview.eventSeverity, { params: params }).then(res => { axios.get(api.netWorkOverview.eventSeverity, { params: params }).then(res => {
if (res.data.code === 200) { if (res.status === 200) {
this.showError1 = false this.showError1 = false
if (res.data.data.result.length === 0) { if (res.data.data.result.length === 0) {
this.isNoData = true this.isNoData = true
@@ -115,7 +115,7 @@ export default {
this.chartOption2 = pieChartOption2 this.chartOption2 = pieChartOption2
this.loading2 = true this.loading2 = true
axios.get(api.netWorkOverview.eventType, { params: params }).then(res => { axios.get(api.netWorkOverview.eventType, { params: params }).then(res => {
if (res.data.code === 200) { if (res.status === 200) {
this.showError2 = false this.showError2 = false
if (res.data.data.result.length === 0) { if (res.data.data.result.length === 0) {

View File

@@ -109,9 +109,9 @@ export default {
endTime: getSecond(this.timeFilter.endTime) endTime: getSecond(this.timeFilter.endTime)
} }
this.toggleLoading(true) this.toggleLoading(true)
axios.get(api.npm.events.recentEvents, { params: params }).then(res => { axios.get(api.npm.events.recentEvents, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.showError = false this.showError = false
this.isNoData = res.data.result.length === 0 this.isNoData = res.data.result.length === 0
const arrData = [] const arrData = []

View File

@@ -46,9 +46,9 @@ export default {
type: this.type type: this.type
} }
this.toggleLoading(true) this.toggleLoading(true)
axios.get(api.npm.events.list, { params: params }).then(res => { axios.get(api.npm.events.list, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.showError = false this.showError = false
if (res.data.result.length === 0) { if (res.data.result.length === 0) {
this.chartData.forEach(d => { d.count = '-' }) this.chartData.forEach(d => { d.count = '-' })

View File

@@ -38,9 +38,7 @@ export default {
return { return {
myChart: null, myChart: null,
polygonSeries: null, polygonSeries: null,
countrySeries: null,
worldImageSeries: null, worldImageSeries: null,
countryImageSeries: null,
// Server | Client // Server | Client
trafficDirection: 'Server', trafficDirection: 'Server',
curTabState: curTabState, curTabState: curTabState,
@@ -104,7 +102,7 @@ export default {
if (res && res.length > 0) { if (res && res.length > 0) {
const subParams = { const subParams = {
...params, ...params,
params: res.map(r => `'${r.country}'`).join(',') params: res.map(r => `'${r.countryRegion}'`).join(',')
} }
// 计算分数 // 计算分数
const tcpRequest = get(api.npm.overview.mapTcp, subParams) const tcpRequest = get(api.npm.overview.mapTcp, subParams)
@@ -118,7 +116,7 @@ export default {
res2.forEach((r, i) => { res2.forEach((r, i) => {
if (r.code === 200) { if (r.code === 200) {
mapData.forEach(t => { mapData.forEach(t => {
t[keyPre[i] + 'Score'] = r.data.result.find(d => d.country === t.country && d.province === t.province) t[keyPre[i] + 'Score'] = r.data.result.find(d => d.countryRegion === t.countryRegion && d.superAdminArea === t.superAdminArea)
}) })
} else { } else {
this.showError = true this.showError = true
@@ -134,8 +132,8 @@ export default {
pktRetransPercent: t.packetRetransScore ? t.packetRetransScore.pktRetransPercent : null pktRetransPercent: t.packetRetransScore ? t.packetRetransScore.pktRetransPercent : null
} }
t.tooltip = {} t.tooltip = {}
t.tooltip.width = t.province ? 0 : 18 t.tooltip.width = t.superAdminArea ? 0 : 18
t.tooltip.marginRight = t.province ? 0 : 6 t.tooltip.marginRight = t.superAdminArea ? 0 : 6
t.tooltip.data = { t.tooltip.data = {
establishLatencyMs: valueToRangeValue(data.establishLatencyMs, unitTypes.time).join(' '), establishLatencyMs: valueToRangeValue(data.establishLatencyMs, unitTypes.time).join(' '),
httpResponseLatency: valueToRangeValue(data.httpResponseLatency, unitTypes.time).join(' '), httpResponseLatency: valueToRangeValue(data.httpResponseLatency, unitTypes.time).join(' '),
@@ -187,7 +185,7 @@ export default {
imageSeries.data = _data.map(r => ({ imageSeries.data = _data.map(r => ({
...r, ...r,
score: r.tooltip.data.score, score: r.tooltip.data.score,
name: r.province || r.country, name: r.superAdminArea || r.countryRegion,
id: r.serverId, id: r.serverId,
color: this.scoreColor(r.tooltip.data.score), color: this.scoreColor(r.tooltip.data.score),
border: this.scoreColor(r.tooltip.data.score) border: this.scoreColor(r.tooltip.data.score)
@@ -317,9 +315,7 @@ export default {
}, },
beforeUnmount () { beforeUnmount () {
this.polygonSeries = null this.polygonSeries = null
this.countrySeries = null
this.worldImageSeries = null this.worldImageSeries = null
this.countryImageSeries = null
this.myChart && this.myChart.dispose() this.myChart && this.myChart.dispose()
this.myChart = null this.myChart = null
} }

View File

@@ -134,9 +134,9 @@ export default {
url = this.switchUrl(this.chart.params.index) url = this.switchUrl(this.chart.params.index)
if (url) { if (url) {
axios.get(url, { params: params }).then(res => { axios.get(url, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.showError = false this.showError = false
this.isNoData = res.data.result.length === 0 this.isNoData = res.data.result.length === 0

View File

@@ -124,11 +124,11 @@ export default {
} }
axios.get(api.npm.location.map, { params: params }).then(response => { axios.get(api.npm.location.map, { params: params }).then(response => {
if (response.data.code === 200) { if (response.data.code === 200) {
const res = _.get(response, 'data.data.result', []).filter(r => r.country !== 'Unknown') const res = _.get(response, 'data.data.result', []).filter(r => r.countryRegion !== 'Unknown')
if (res.length > 0) { if (res.length > 0) {
// 计算分数 // 计算分数
this.showError = false this.showError = false
params.country = params.country ? `'${params.country}'` : '' params.countryRegion = params.countryRegion ? `'${params.countryRegion}'` : ''
const tcpRequest = get(api.npm.location.mapTcp, params) const tcpRequest = get(api.npm.location.mapTcp, params)
const httpRequest = get(api.npm.location.mapHttp, params) const httpRequest = get(api.npm.location.mapHttp, params)
const sslRequest = get(api.npm.location.mapSsl, params) const sslRequest = get(api.npm.location.mapSsl, params)
@@ -141,7 +141,7 @@ export default {
res2.forEach((r, i) => { res2.forEach((r, i) => {
if (r.code === 200) { if (r.code === 200) {
mapData.forEach(t => { mapData.forEach(t => {
const find = r.data.result.find(d => d.country === t.country && t.province === d.province) const find = r.data.result.find(d => d.countryRegion === t.countryRegion && t.superAdminArea === d.superAdminArea)
t[keyPre[i] + 'Score'] = find t[keyPre[i] + 'Score'] = find
}) })
} else { } else {
@@ -165,8 +165,8 @@ export default {
pktRetransPercent: t.packetRetransScore ? t.packetRetransScore.pktRetransPercent : null pktRetransPercent: t.packetRetransScore ? t.packetRetransScore.pktRetransPercent : null
} }
t.tooltip = {} t.tooltip = {}
t.tooltip.width = t.province ? 0 : 18 t.tooltip.width = t.superAdminArea ? 0 : 18
t.tooltip.marginRight = t.province ? 0 : 6 t.tooltip.marginRight = t.superAdminArea ? 0 : 6
t.tooltip.data = { t.tooltip.data = {
establishLatencyMs: valueToRangeValue(data.establishLatencyMs, unitTypes.time).join(' '), establishLatencyMs: valueToRangeValue(data.establishLatencyMs, unitTypes.time).join(' '),
httpResponseLatency: valueToRangeValue(data.httpResponseLatency, unitTypes.time).join(' '), httpResponseLatency: valueToRangeValue(data.httpResponseLatency, unitTypes.time).join(' '),
@@ -225,7 +225,7 @@ export default {
imageSeries.data = _data.map(r => ({ imageSeries.data = _data.map(r => ({
...r, ...r,
score: r.tooltip.data.score, score: r.tooltip.data.score,
name: r.province || r.country, name: r.superAdminArea || r.countryRegion,
id: r.serverId, id: r.serverId,
color: this.scoreColor(r.tooltip.data.score), color: this.scoreColor(r.tooltip.data.score),
border: this.scoreColor(r.tooltip.data.score) border: this.scoreColor(r.tooltip.data.score)

View File

@@ -156,9 +156,9 @@ export default {
if (condition || type) { if (condition || type) {
params.type = params.type || type params.type = params.type || type
this.toggleLoading(true) this.toggleLoading(true)
axios.get(url, { params: params }).then(res => { axios.get(url, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.npmNetworkCycleData = res.data.result this.npmNetworkCycleData = res.data.result
} }
this.npmNetworkLastCycleQuery(url, params) this.npmNetworkLastCycleQuery(url, params)
@@ -178,7 +178,7 @@ export default {
// 传给子组件SingleValue再进行error处理error处理不在此处处理 // 传给子组件SingleValue再进行error处理error处理不在此处处理
this.npmNetworkCycleData = [] this.npmNetworkCycleData = []
res.forEach(t => { res.forEach(t => {
if (t.data.code === 200) { if (t.status === 200) {
this.npmNetworkCycleData.push(t.data.data.result) this.npmNetworkCycleData.push(t.data.data.result)
} else { } else {
this.npmNetworkCycleData.push(t.data) this.npmNetworkCycleData.push(t.data)
@@ -211,9 +211,9 @@ export default {
if ((params.type && params.q) || (param && param.type)) { if ((params.type && params.q) || (param && param.type)) {
params.type = params.type || param.type params.type = params.type || param.type
this.toggleLoading(true) this.toggleLoading(true)
axios.get(url, { params: params }).then(res => { axios.get(url, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.npmNetworkLastCycleData = res.data.result this.npmNetworkLastCycleData = res.data.result
} else { } else {
this.npmNetworkLastCycleData = [res] this.npmNetworkLastCycleData = [res]
@@ -240,7 +240,7 @@ export default {
// 状态为200的赋值接口数据不为200的保留报错提示message // 状态为200的赋值接口数据不为200的保留报错提示message
// 传给子组件SingleValue再进行error处理error处理不在此处处理 // 传给子组件SingleValue再进行error处理error处理不在此处处理
res.forEach(t => { res.forEach(t => {
if (t.data.code === 200) { if (t.status === 200) {
this.npmNetworkLastCycleData.push(t.data.data.result) this.npmNetworkLastCycleData.push(t.data.data.result)
} else { } else {
this.npmNetworkLastCycleData.push(t.data) this.npmNetworkLastCycleData.push(t.data)

View File

@@ -18,8 +18,8 @@
<script> <script>
import chartMixin from '@/views/charts2/chart-mixin' import chartMixin from '@/views/charts2/chart-mixin'
import { getSecond } from '@/utils/date-util' import { getSecond } from '@/utils/date-util'
import { get } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import axios from 'axios'
import { drillDownPanelTypeMapping } from '@/utils/constants' import { drillDownPanelTypeMapping } from '@/utils/constants'
import { overwriteUrl, urlParamsHandler } from '@/utils/tools' import { overwriteUrl, urlParamsHandler } from '@/utils/tools'
import { ref } from 'vue' import { ref } from 'vue'
@@ -78,9 +78,9 @@ export default {
endTime: getSecond(this.timeFilter.endTime), endTime: getSecond(this.timeFilter.endTime),
ip: condition[1] ip: condition[1]
} }
get(api.npm.overview.relatedSessions, params).then(res => { axios.get(api.npm.overview.relatedSessions, { params: params }).then(res => {
if (res.code === 200) { if (res.status === 200) {
self.sessionData = res.data.result self.sessionData = res.data.data.result
self.clientSessions = self.sessionData.clientSessions / (self.sessionData.clientSessions * 1 + self.sessionData.serverSessions * 1) self.clientSessions = self.sessionData.clientSessions / (self.sessionData.clientSessions * 1 + self.sessionData.serverSessions * 1)
self.serverSessions = self.sessionData.serverSessions / (self.sessionData.clientSessions * 1 + self.sessionData.serverSessions * 1) self.serverSessions = self.sessionData.serverSessions / (self.sessionData.clientSessions * 1 + self.sessionData.serverSessions * 1)
} }

View File

@@ -156,9 +156,9 @@ export default {
this.toggleLoading(true) this.toggleLoading(true)
if (params.type && params.q) { if (params.type && params.q) {
axios.get(api.npm.overview.trafficGraph, { params: params }).then(res => { axios.get(api.npm.overview.trafficGraph, { params: params }).then(response => {
res = res.data const res = response.data
if (res.code === 200) { if (response.status === 200) {
this.showError = false this.showError = false
this.isNoData = res.data.result.length === 0 this.isNoData = res.data.result.length === 0
if (this.isNoData) { if (this.isNoData) {
@@ -185,7 +185,7 @@ export default {
const npmLineData = [] const npmLineData = []
Promise.all([totalNetworkAnalysis, totalTrafficAnalysis, totalHttpResponseDelay, totalSslConDelay]).then(res => { Promise.all([totalNetworkAnalysis, totalTrafficAnalysis, totalHttpResponseDelay, totalSslConDelay]).then(res => {
res.forEach(item => { res.forEach(item => {
if (item.data.code === 200) { if (item.status === 200) {
npmLineData.push(...item.data.data.result) npmLineData.push(...item.data.data.result)
} else { } else {
this.httpError(res) this.httpError(res)

View File

@@ -34,8 +34,8 @@
</template> </template>
<script> <script>
import { get } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import axios from 'axios'
import { getSecond } from '@/utils/date-util' import { getSecond } from '@/utils/date-util'
import unitConvert from '@/utils/unit-convert' import unitConvert from '@/utils/unit-convert'
import { unitTypes } from '@/utils/constants' import { unitTypes } from '@/utils/constants'
@@ -81,8 +81,9 @@ export default {
const divRed = document.getElementById('red') const divRed = document.getElementById('red')
const divGray = document.getElementById('gray') const divGray = document.getElementById('gray')
get(api.npm.overview.relatedSessions, params).then(res => { axios.get(api.npm.overview.relatedSessions, { params }).then(response => {
if (res.code === 200) { const res = response.data
if (response.status === 200) {
this.showError = false this.showError = false
this.isNoData = false this.isNoData = false

View File

@@ -99,8 +99,9 @@
<script> <script>
import GeneralSettings from '@/components/table/detection/GeneralSettings' import GeneralSettings from '@/components/table/detection/GeneralSettings'
import RuleDefinition from '@/components/table/detection/RuleDefinition' import RuleDefinition from '@/components/table/detection/RuleDefinition'
import { get } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import axios from 'axios'
import _ from 'lodash'
export default { export default {
name: 'DetectionForm', name: 'DetectionForm',
@@ -160,11 +161,11 @@ export default {
methods: { methods: {
/** 获取下拉列表数据 */ /** 获取下拉列表数据 */
getStatistics () { getStatistics () {
get(api.detection.statistics, { pageSize: -1 }).then(response => { axios.get(api.detection.statistics, { pageSize: -1 }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.intervalList = response.data.intervalList || [] this.intervalList = _.get(response, 'data.data.intervalList', [])
} else { } else {
console.error(response) console.error(response.data)
} }
}).finally(() => { }).finally(() => {
}) })

View File

@@ -1,154 +0,0 @@
<template>
<div class="cn-home entity-detail">
<div class="entity-detail__header">
<div class="cn-entity__icon"><i :class="iconClass"></i></div>
<div class="cn-entity__name">{{entityData.ip || entityData.domain || entityData.appName }}</div>
</div>
<main class="cn-body entity-detail__body">
<div class="entity-detail__menu">
<template v-for="(anchor,index) in anchorPoints" :key="anchor.id">
<div class="menu-item" :class="{'menu-item--active':anchor.isActive}" @click="jumpToAnchor(index,anchor)">
<span>{{anchor.label}}</span>
</div>
</template>
</div>
<div class="entity-detail__content" @scroll="scroll" id="detailWrapper">
<cn-panel
ref="cnPanel"
:entity="entityData"
:is-entity-detail="true"
@chartLoaded="chartLoaded"
></cn-panel>
</div>
</main>
</div>
</template>
<script>
import { useRoute } from 'vue-router'
import Panel from '@/views/charts/Panel'
export default {
name: 'EntityDetail',
components: {
cnPanel: Panel
},
data () {
return {
anchorPoints: [], // { id, label, top, height }
top: 0,
scrollHeight: 0,
clientHeight: 0,
currentAnchor: 0
}
},
setup (props, ctx) {
const { query } = useRoute()
let panelType
const entityData = { entityType: query.entityType }
switch (query.entityType) {
case 'ip': {
panelType = 4
entityData.ip = query.name
break
}
case 'domain': {
panelType = 5
entityData.domain = query.name
break
}
case 'app': {
panelType = 6
entityData.appName = query.name
break
}
default: {
panelType = 4
break
}
}
entityData.type = panelType
return {
entityData
}
},
methods: {
chartLoaded (chartList) {
this.chartList = chartList
this.anchorPoints = []
let anchorPoints = []
const panelDom = document.querySelector('#detailWrapper')
this.scrollHeight = panelDom.scrollHeight
this.clientHeight = panelDom.clientHeight
chartList.forEach((chart, index) => {
if (chart.params.anchorPoint) {
const dom = document.querySelector(`[id='${chart.params.anchorPoint}']`)
dom && anchorPoints.push({
id: chart.params.anchorPoint,
isActive: index === 0,
label: chart.i18n ? this.$t(chart.i18n) : chart.name,
top: dom.offsetTop + 10/* ,
height: document.querySelector(`#${chart.params.anchorPoint}}`).scrollHeight */
})
}
})
// 从小到大排序
anchorPoints = anchorPoints.sort((a, b) => {
return a.top - b.top
})
if (!this.$_.isEmpty(anchorPoints)) {
anchorPoints[0].top = 0
}
this.anchorPoints = anchorPoints
},
scroll (e) {
this.top = (e.target.scrollTop + 10) || 0
},
jumpToAnchor (index, anchor) {
const anchorEle = document.getElementById(anchor.id)
this.anchorPoints.forEach((anchor, i) => {
if (index === i) {
anchor.isActive = true
} else {
anchor.isActive = false
}
})
if (anchorEle) {
anchorEle.scrollIntoView()
document.documentElement.scrollTop = document.documentElement.scrollTop - 30
}
},
resize () {
this.chartLoaded(this.chartList)
}
},
mounted () {
this.debounceFunc = this.$_.debounce(this.resize, 400)
window.addEventListener('resize', this.debounceFunc)
},
beforeUnmount () {
window.removeEventListener('resize', this.debounceFunc)
},
computed: {
iconClass () {
let className
switch (this.entityData.entityType) {
case ('ip'): {
className = 'cn-icon cn-icon-ip2'
break
}
case ('domain'): {
className = 'cn-icon cn-icon-domain2'
break
}
case ('app'): {
className = 'cn-icon cn-icon-app2'
break
}
default: break
}
return className
}
}
}
</script>

View File

@@ -159,7 +159,7 @@ import ExplorerSearch from '@/views/entityExplorer/search/ExplorerSearch'
import EntityFilter from '@/views/entityExplorer/EntityFilter' import EntityFilter from '@/views/entityExplorer/EntityFilter'
import EntityList from '@/views/entityExplorer/entityList/EntityList' import EntityList from '@/views/entityExplorer/entityList/EntityList'
import { entityType, defaultPageSize, riskLevelMapping } from '@/utils/constants' import { entityType, defaultPageSize, riskLevelMapping } from '@/utils/constants'
import { get } from '@/utils/http' import axios from 'axios'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { getNowTime, getSecond } from '@/utils/date-util' import { getNowTime, getSecond } from '@/utils/date-util'
import { ref } from 'vue' import { ref } from 'vue'
@@ -675,8 +675,9 @@ export default {
endTime: getSecond(params.endTime) endTime: getSecond(params.endTime)
} }
this.loadingLeft = true this.loadingLeft = true
get(api.entityFilter, queryParams).then(response => { axios.get(api.entityFilter, { params: queryParams }).then(res => {
if (response.code === 200 && response.data && response.data.result) { const response = res.data
if (res.status === 200 && response.data && response.data.result) {
switch (params.entityType) { switch (params.entityType) {
case 'ip': { case 'ip': {
this.filterData[0].data.forEach(d => { this.filterData[0].data.forEach(d => {
@@ -738,20 +739,20 @@ export default {
resource: params.q || '' resource: params.q || ''
} }
this.loadingLeft = true this.loadingLeft = true
const aggCountry = get(api.entity.entityList.aggCountry, queryParams) const aggCountry = axios.get(api.entity.entityList.aggCountry, { params: queryParams })
const aggCity = get(api.entity.entityList.aggCity, queryParams) const aggCity = axios.get(api.entity.entityList.aggCity, { params: queryParams })
const aggIPAsn = get(api.entity.entityList.aggIPAsn, queryParams) const aggIPAsn = axios.get(api.entity.entityList.aggIPAsn, { params: queryParams })
const aggIPIsp = get(api.entity.entityList.aggIPIsp, queryParams) const aggIPIsp = axios.get(api.entity.entityList.aggIPIsp, { params: queryParams })
const aggPort = get(api.entity.entityList.aggPort, queryParams) const aggPort = axios.get(api.entity.entityList.aggPort, { params: queryParams })
const aggDomain = get(api.entity.entityList.aggDomain, queryParams) const aggDomain = axios.get(api.entity.entityList.aggDomain, { params: queryParams })
const aggAppCategory = get(api.entity.entityList.aggAppCategory, queryParams) const aggAppCategory = axios.get(api.entity.entityList.aggAppCategory, { params: queryParams })
const aggTag = get(api.entity.entityList.aggTag, queryParams) const aggTag = axios.get(api.entity.entityList.aggTag, { params: queryParams })
Promise.all([aggCountry, aggCity, aggIPAsn, aggIPIsp, aggPort, aggDomain, aggAppCategory, aggTag]).then(response => { Promise.all([aggCountry, aggCity, aggIPAsn, aggIPIsp, aggPort, aggDomain, aggAppCategory, aggTag]).then(response => {
response.forEach((item, index) => { response.forEach((item, index) => {
if (item.code === 200 && item.data.list) { if (item.status === 200 && item.data.data.list) {
this.newFilterData[index].data = [] this.newFilterData[index].data = []
item.data.list.forEach(item => { item.data.data.list.forEach(item => {
let obj = { let obj = {
label: item.value, label: item.value,
topColumn: this.newFilterData[index].topColumn, topColumn: this.newFilterData[index].topColumn,
@@ -789,15 +790,15 @@ export default {
// endTime: getSecond(params.endTime), // endTime: getSecond(params.endTime),
resource: params.q || '' resource: params.q || ''
} }
get(api.entity.entityList.list, queryParams).then(response => { axios.get(api.entity.entityList.list, { params: queryParams }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.listData = [] this.listData = []
this.$nextTick(() => { this.$nextTick(() => {
this.listData = response.data.list this.listData = response.data.data.list
this.pageObj.total = response.data.total this.pageObj.total = response.data.data.total
}) })
} else { } else {
this.$message.error(response.message) this.$message.error(response.data.message)
} }
}).finally(() => { }).finally(() => {
this.listLoading = false this.listLoading = false
@@ -811,9 +812,9 @@ export default {
// endTime: getSecond(params.endTime), // endTime: getSecond(params.endTime),
resource: params.q || '' // 目前版本搜索不支持实体名称搜索,下版本改进 resource: params.q || '' // 目前版本搜索不支持实体名称搜索,下版本改进
} }
get(api.entity.entityList.summaryCount, queryParams).then(response => { axios.get(api.entity.entityList.summaryCount, { params: queryParams }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.summaryCount = response.data this.summaryCount = response.data.data
} else { } else {
this.summaryCount = { total: 0, domainCount: 0, ipCount: 0, appCount: 0 } this.summaryCount = { total: 0, domainCount: 0, ipCount: 0, appCount: 0 }
} }
@@ -831,9 +832,9 @@ export default {
startTime: getSecond(params.startTime), startTime: getSecond(params.startTime),
endTime: getSecond(params.endTime) endTime: getSecond(params.endTime)
} }
get(api.entityListTotal, queryParams).then(response => { axios.get(api.entityListTotal, { params: queryParams }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.pageObj.total = response.data.result this.pageObj.total = response.data.data.result
} }
}) })
}, },
@@ -857,33 +858,33 @@ export default {
this.loadingDomainActive = true this.loadingDomainActive = true
this.loadingIpActive = true this.loadingIpActive = true
get(api.entity.entityList.entityActive).then(response => { axios.get(api.entity.entityList.entityActive).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityDomainTotal = response.data.domainCount this.entityDomainTotal = response.data.data.domainCount
this.entityIpTotal = response.data.ipCount this.entityIpTotal = response.data.data.ipCount
this.entityAppTotal = response.data.appCount this.entityAppTotal = response.data.data.appCount
} }
this.loadingDomain = false this.loadingDomain = false
this.loadingIp = false this.loadingIp = false
this.loadingApp = false this.loadingApp = false
}) })
// New // New
get(api.entity.entityList.entityNew).then(response => { axios.get(api.entity.entityList.entityNew).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityDomainNew = response.data.domainCount this.entityDomainNew = response.data.data.domainCount
this.entityIpNew = response.data.ipCount this.entityIpNew = response.data.data.ipCount
this.entityAppNew = response.data.appCount this.entityAppNew = response.data.data.appCount
} }
this.loadingDomainNew = false this.loadingDomainNew = false
this.loadingIpNew = false this.loadingIpNew = false
this.loadingAppNew = false this.loadingAppNew = false
}) })
// Active // Active
get(api.entity.entityList.entityActive).then(response => { axios.get(api.entity.entityList.entityActive).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityDomainActive = response.data.domainCount this.entityDomainActive = response.data.data.domainCount
this.entityIpActive = response.data.ipCount this.entityIpActive = response.data.data.ipCount
this.entityAppActive = response.data.appCount this.entityAppActive = response.data.data.appCount
} }
this.loadingDomainActive = false this.loadingDomainActive = false
this.loadingIpActive = false this.loadingIpActive = false

View File

@@ -1,150 +0,0 @@
<template >
<div class="entity-filter-case">
<div class="filter-case__header">{{$t('entities.filter')}}</div>
<div
class="entity-filter"
v-for="(filters, index) in filterData"
:key="index"
>
<div class="filter__header">{{filters.title}}</div>
<div class="filter__body">
<div class="filter__row" v-for="(item, i) in filters.data" :key="i">
<el-popover popper-class="filter__row-popover" placement="right-start" :width="440" v-model:visible="item.showTopTen">
<template #reference>
<div class="filter__row-popover" @click="showTopDialog(i, item, filters)">
<div class="row__label">
<i :class="item.icon"></i>
<span>{{item.label}}</span>
</div>
<div class="row__value">
<loading :loading="loadingLeft" size="small"></loading>
<span>{{item.value}}</span>
</div>
</div>
</template>
<entity-top
ref="entityTopTenPop"
:loading="loading"
:popover-data="popoverData"
:item-data="itemData"
:total-count="totalCount"
:top-column="item.topColumn"
@filter="filter"
></entity-top>
</el-popover>
</div>
</div>
</div>
</div>
</template>
<script>
import EntityTop from '@/views/entityExplorer/EntityTop'
import { get } from '@/utils/http'
import { api } from '@/utils/api'
import Loading from '@/components/common/Loading'
import { getSecond } from '@/utils/date-util'
export default {
name: 'EntityFilter',
components: {
Loading,
EntityTop
},
props: {
filterData: Array,
q: String,
timeFilter: Object,
loadingLeft: Boolean
},
data () {
return {
topList: 'list',
topData: [],
entityTopTenData: [],
currentColumn: {},
totalCount: 0,
loading: false,
popoverData: [],
itemData: {}
}
},
watch: {
currentColumn (n, o) {
if (n.column === 'dnsServerOrgCount') {
this.totalCount = this.filterData[3].orgTotalCount
} else if (n.column === 'dnsServerSoftwareCount') {
this.totalCount = this.filterData[3].softwareTotalCount
} else if (n.column === 'dnsServerOsCount') {
this.totalCount = this.filterData[3].osTotalCount
} else if (n.column === 'categoryDistinctCount' && n.type === 'app') {
this.totalCount = this.filterData[1].totalCount
} else {
let count = 0
this.filterData.forEach(f => {
const filter = f.data.some(d => d.column === n.column)
if (filter) {
count = f.totalCount
}
})
this.totalCount = count
}
}
},
methods: {
showTopDialog (i, item, filter) {
if (this.currentColumn.column === item.column && item.showTopTen) {
item.showTopTen = false
return
}
this.filterData.forEach(f => {
f.data.forEach(ff => {
ff.showTopTen = false
})
})
item.showTopTen = true
this.currentColumn = {
column: item.column,
type: filter.type
}
const queryParams = {
q: this.q,
entityType: filter.type,
column: item.topColumn,
top: 10,
startTime: getSecond(this.timeFilter.startTime),
endTime: getSecond(this.timeFilter.endTime)
}
this.loading = true
this.popoverData = []
this.itemData = {}
get(api.filterTop, queryParams).then(response => {
if (response.code === 200) {
if (this.currentColumn.column === item.column) {
if (filter.type === 'dns') {
this.popoverData = response.data.result.filter(f => {
return f.count > 0
})
} else {
this.popoverData = response.data.result
}
this.itemData = item
}
} else {
this.popoverData = []
this.itemData = item
}
this.loading = false
}).catch(e => {
this.popoverData = []
this.itemData = item
this.loading = false
})
},
filter (name, topData) {
this.showTopDialog('', topData)
this.$emit('filter', name, topData)
}
}
}
</script>

View File

@@ -108,7 +108,7 @@ export default class Node {
console.error(e) console.error(e)
throw e throw e
}) })
if (response.data && response.data.code === 200) { if (response.data && response.status === 200) {
return response.data.data return response.data.data
} else { } else {
console.error(response) console.error(response)
@@ -121,7 +121,7 @@ export default class Node {
console.error(e) console.error(e)
throw e throw e
}) })
if (response.data && response.data.code === 200) { if (response.data && response.status === 200) {
return response.data.data return response.data.data
} else { } else {
console.error(response) console.error(response)
@@ -134,7 +134,7 @@ export default class Node {
console.error(e) console.error(e)
throw e throw e
}) })
if (response.data && response.data.code === 200) { if (response.data && response.status === 200) {
return response.data.data return response.data.data
} else { } else {
console.error(response) console.error(response)
@@ -173,7 +173,7 @@ export async function queryRelatedEntity (node, targetEntityType) {
console.error(e) console.error(e)
throw e throw e
}) })
if (response.data && response.data.code === 200) { if (response.data && response.status === 200) {
return response.data.data return response.data.data
} else { } else {
console.error(response) console.error(response)

View File

@@ -1,5 +1,5 @@
import _ from 'lodash' import _ from 'lodash'
import { get } from '@/utils/http' import axios from 'axios'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { entityListLineOption } from '@/views/charts/charts/chart-options' import { entityListLineOption } from '@/views/charts/charts/chart-options'
import { riskLevelMapping, unitTypes } from '@/utils/constants' import { riskLevelMapping, unitTypes } from '@/utils/constants'
@@ -101,9 +101,9 @@ export default {
this.sentChart = echarts.init(document.getElementById(`entityDetailSend${this.entityName}`)) this.sentChart = echarts.init(document.getElementById(`entityDetailSend${this.entityName}`))
this.receivedChart = echarts.init(document.getElementById(`entityDetailReceived${this.entityName}`)) this.receivedChart = echarts.init(document.getElementById(`entityDetailReceived${this.entityName}`))
this.loadingTraffic = true this.loadingTraffic = true
get(this.trafficUrl, this.getQueryParams()).then(response => { axios.get(this.trafficUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200 && response.data.result && response.data.result.length > 0) { if (response.status === 200 && response.data.data.result && response.data.data.result.length > 0) {
response.data.result.forEach(t => { response.data.data.result.forEach(t => {
if (t.legend === 'bytesRate') { if (t.legend === 'bytesRate') {
this.entityData.max = t.aggregation.max this.entityData.max = t.aggregation.max
this.entityData.avg = t.aggregation.avg this.entityData.avg = t.aggregation.avg
@@ -190,14 +190,16 @@ export default {
} }
if (url) { if (url) {
get(url, { axios.get(url, {
...this.getPerformanceQueryParams(), params: {
startTime: searchStartTime, ...this.getPerformanceQueryParams(),
endTime: searchEndTime, startTime: searchStartTime,
eventType: item.eventType endTime: searchEndTime,
}).then((response) => { eventType: item.eventType
if (response.code === 200) { }
const metricDataList = response.data.result[0] && response.data.result[0].values }).then(response => {
if (response.status === 200) {
const metricDataList = response.data.data.result[0] && response.data.data.result[0].values
this.$nextTick(() => { this.$nextTick(() => {
if (metricDataList && metricDataList.length > 0) { if (metricDataList && metricDataList.length > 0) {
metricDataList.sort(reverseSortBy(0))// 将返回的数据按时间降序排序,方便找到实线和虚线的交点 metricDataList.sort(reverseSortBy(0))// 将返回的数据按时间降序排序,方便找到实线和虚线的交点
@@ -244,9 +246,9 @@ export default {
} }
}, },
queryEntityDetailRelation () { queryEntityDetailRelation () {
get(this.relationUrl, this.getQueryParams()).then(response => { axios.get(this.relationUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.handleRelationData(response.data.result) this.handleRelationData(response.data.data.result)
} }
}) })
}, },
@@ -254,35 +256,35 @@ export default {
queryEntityDetailNetworkQuantity () { queryEntityDetailNetworkQuantity () {
this.loadingNetworkQuality = true this.loadingNetworkQuality = true
if (this.networkQuantityUrl) { if (this.networkQuantityUrl) {
get(this.networkQuantityUrl, this.getQueryParams()).then(response => { axios.get(this.networkQuantityUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
const data = { const data = {
establishLatencyMs: response.data.result.establishLatencyValue || null, establishLatencyMs: response.data.data.result.establishLatencyValue || null,
httpResponseLatency: response.data.result.httpResponseLatencyValue || null, httpResponseLatency: response.data.data.result.httpResponseLatencyValue || null,
sslConLatency: response.data.result.sslConLatencyValue || null, sslConLatency: response.data.data.result.sslConLatencyValue || null,
tcpLostlenPercent: response.data.result.sequenceGapLossPercentValue || null, tcpLostlenPercent: response.data.data.result.sequenceGapLossPercentValue || null,
pktRetransPercent: response.data.result.pktRetransPercentValue || null pktRetransPercent: response.data.data.result.pktRetransPercentValue || null
} }
this.score = computeScore(data) this.score = computeScore(data)
this.entityData.establishLatencyValue = response.data.result.establishLatencyValue this.entityData.establishLatencyValue = response.data.data.result.establishLatencyValue
this.entityData.establishLatencyP50 = response.data.result.establishLatencyP50 this.entityData.establishLatencyP50 = response.data.data.result.establishLatencyP50
this.entityData.establishLatencyP90 = response.data.result.establishLatencyP90 this.entityData.establishLatencyP90 = response.data.data.result.establishLatencyP90
this.entityData.httpResponseLantencyValue = response.data.result.httpResponseLantencyValue this.entityData.httpResponseLantencyValue = response.data.data.result.httpResponseLantencyValue
this.entityData.httpResponseLantencyP50 = response.data.result.httpResponseLantencyP50 this.entityData.httpResponseLantencyP50 = response.data.data.result.httpResponseLantencyP50
this.entityData.httpResponseLantencyP90 = response.data.result.httpResponseLantencyP90 this.entityData.httpResponseLantencyP90 = response.data.data.result.httpResponseLantencyP90
this.entityData.sslConLatencyValue = response.data.result.sslConLatencyValue this.entityData.sslConLatencyValue = response.data.data.result.sslConLatencyValue
this.entityData.sslConLatencyP50 = response.data.result.sslConLatencyP50 this.entityData.sslConLatencyP50 = response.data.data.result.sslConLatencyP50
this.entityData.sslConLatencyP90 = response.data.result.sslConLatencyP90 this.entityData.sslConLatencyP90 = response.data.data.result.sslConLatencyP90
this.entityData.sequenceGapLossPercentValue = response.data.result.sequenceGapLossPercentValue this.entityData.sequenceGapLossPercentValue = response.data.data.result.sequenceGapLossPercentValue
this.entityData.sequenceGapLossPercentP50 = response.data.result.sequenceGapLossPercentP50 this.entityData.sequenceGapLossPercentP50 = response.data.data.result.sequenceGapLossPercentP50
this.entityData.sequenceGapLossPercentP90 = response.data.result.sequenceGapLossPercentP90 this.entityData.sequenceGapLossPercentP90 = response.data.data.result.sequenceGapLossPercentP90
this.entityData.pktRetransPercentValue = response.data.result.pktRetransPercentValue this.entityData.pktRetransPercentValue = response.data.data.result.pktRetransPercentValue
this.entityData.pktRetransPercentP50 = response.data.result.pktRetransPercentP50 this.entityData.pktRetransPercentP50 = response.data.data.result.pktRetransPercentP50
this.entityData.pktRetransPercentP90 = response.data.result.pktRetransPercentP90 this.entityData.pktRetransPercentP90 = response.data.data.result.pktRetransPercentP90
const establishLatency = { const establishLatency = {
value: this.entityData.establishLatencyValue, value: this.entityData.establishLatencyValue,
@@ -323,17 +325,17 @@ export default {
queryEntityDetailLinkInUrl () { queryEntityDetailLinkInUrl () {
this.loadingIn = true this.loadingIn = true
if (this.linkInUrl) { if (this.linkInUrl) {
get(this.linkInUrl, this.getQueryParams()).then(response => { axios.get(this.linkInUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
if (!this.$_.isEmpty(response.data.result)) { if (!this.$_.isEmpty(response.data.data.result)) {
let sum = 0 let sum = 0
response.data.result.forEach(r => { response.data.data.result.forEach(r => {
sum += parseFloat(r.bytes) sum += parseFloat(r.bytes)
}) })
const sorted = response.data.result.sort((r1, r2) => { const sorted = response.data.data.result.sort((r1, r2) => {
return parseFloat(r2.bytes) - parseFloat(r1.bytes) return parseFloat(r2.bytes) - parseFloat(r1.bytes)
}) })
const sortedId = response.data.result.sort((r1, r2) => { const sortedId = response.data.data.result.sort((r1, r2) => {
return parseFloat(r2.commonIngressLinkId) - parseFloat(r1.commonIngressLinkId) return parseFloat(r2.commonIngressLinkId) - parseFloat(r1.commonIngressLinkId)
}) })
const max = parseFloat(sorted[0].bytes) const max = parseFloat(sorted[0].bytes)
@@ -350,17 +352,17 @@ export default {
queryEntityDetailLinkOutUrl () { queryEntityDetailLinkOutUrl () {
this.loadingOut = true this.loadingOut = true
if (this.linkOutUrl) { if (this.linkOutUrl) {
get(this.linkOutUrl, this.getQueryParams()).then(response => { axios.get(this.linkOutUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
if (!this.$_.isEmpty(response.data.result)) { if (!this.$_.isEmpty(response.data.data.result)) {
let sum = 0 let sum = 0
response.data.result.forEach(r => { response.data.data.result.forEach(r => {
sum += parseFloat(r.bytes) sum += parseFloat(r.bytes)
}) })
const sorted = response.data.result.sort((r1, r2) => { const sorted = response.data.data.result.sort((r1, r2) => {
return parseFloat(r2.bytes) - parseFloat(r1.bytes) return parseFloat(r2.bytes) - parseFloat(r1.bytes)
}) })
const sortedId = response.data.result.sort((r1, r2) => { const sortedId = response.data.data.result.sort((r1, r2) => {
return parseFloat(r2.commonEgressLinkId) - parseFloat(r1.commonEgressLinkId) return parseFloat(r2.commonEgressLinkId) - parseFloat(r1.commonEgressLinkId)
}) })
const max = parseFloat(sorted[0].bytes) const max = parseFloat(sorted[0].bytes)
@@ -376,10 +378,10 @@ export default {
queryEntityDetailPerformance () { queryEntityDetailPerformance () {
this.loadingAlert = true this.loadingAlert = true
get(this.performanceUrl, this.getQueryParams()).then(response => { axios.get(this.performanceUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityData.performanceNum = response.data.result.length this.entityData.performanceNum = response.data.data.result.length
this.performanceData = response.data.result this.performanceData = response.data.data.result
this.entityData.performanceList = this.getTargetPageData(1, this.showMore.performancePageSize, this.performanceData) this.entityData.performanceList = this.getTargetPageData(1, this.showMore.performancePageSize, this.performanceData)
} }
this.loadingAlert = false this.loadingAlert = false
@@ -388,10 +390,10 @@ export default {
queryEntityDetailSecurity () { queryEntityDetailSecurity () {
this.loadingSecurityEvents = true this.loadingSecurityEvents = true
get(this.securityUrl, this.getQueryParams()).then(response => { axios.get(this.securityUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityData.securityNum = response.data.result.length this.entityData.securityNum = response.data.data.result.length
this.securityData = response.data.result this.securityData = response.data.data.result
this.entityData.securityList = this.getTargetPageData(1, this.showMore.securityPageSize, this.securityData) this.entityData.securityList = this.getTargetPageData(1, this.showMore.securityPageSize, this.securityData)
} }
this.loadingSecurityEvents = false this.loadingSecurityEvents = false
@@ -399,16 +401,8 @@ export default {
}, },
performanceShowMore (num) { performanceShowMore (num) {
// const startIndex = this.showMore.performancePageSize
this.showMore.performancePageSize += num this.showMore.performancePageSize += num
this.entityData.performanceList = this.getTargetPageData(this.showMore.pageNo, this.showMore.performancePageSize, this.performanceData) this.entityData.performanceList = this.getTargetPageData(this.showMore.pageNo, this.showMore.performancePageSize, this.performanceData)
// this.$nextTick(() => {
// setTimeout(() => lltext
// if (this.entityData.performanceList && this.entityData.performanceList.length > 0) {
// this.queryEntityDetailPerformanceChart(this.entityData.performanceList.slice(startIndex, this.entityData.performanceList.length), startIndex)
// }
// }, 200)
// })
}, },
securityShowMore (num) { securityShowMore (num) {
@@ -421,15 +415,15 @@ export default {
}, },
queryDnsServerInfo () { queryDnsServerInfo () {
get(this.entityDetectionsIpUrl, this.getQueryParams()).then(response => { axios.get(this.entityDetectionsIpUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityData.dnsServerRole = response.data.result.dnsServerRole this.entityData.dnsServerRole = response.data.data.result.dnsServerRole
this.entityData.dnsServerOrg = response.data.result.dnsServerOrg this.entityData.dnsServerOrg = response.data.data.result.dnsServerOrg
this.entityData.dnsServerSoftware = response.data.result.dnsServerSoftware this.entityData.dnsServerSoftware = response.data.data.result.dnsServerSoftware
this.entityData.dnsServerOs = response.data.result.dnsServerOs this.entityData.dnsServerOs = response.data.data.result.dnsServerOs
this.entityData.dohSupport = response.data.result.dohSupport this.entityData.dohSupport = response.data.data.result.dohSupport
this.entityData.dotSupport = response.data.result.dotSupport this.entityData.dotSupport = response.data.data.result.dotSupport
this.entityData.dnssecSupport = response.data.result.dnssecSupport this.entityData.dnssecSupport = response.data.data.result.dnssecSupport
} }
if (this.entityData.dnsServerRole) { if (this.entityData.dnsServerRole) {
this.loadingDns = false this.loadingDns = false
@@ -440,9 +434,9 @@ export default {
queryDnsServerInfoRate () { queryDnsServerInfoRate () {
this.loading = true this.loading = true
this.detectionChart = echarts.init(document.getElementById(`entityDnsServerInfo${this.entityName}`)) this.detectionChart = echarts.init(document.getElementById(`entityDnsServerInfo${this.entityName}`))
get(this.entityDetectionsIpQueryRateUrl, this.getQueryParams()).then(response => { axios.get(this.entityDetectionsIpQueryRateUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200 && response.data.result && response.data.result.length > 0) { if (response.status === 200 && response.data.data.result && response.data.data.result.length > 0) {
response.data.result.forEach(t => { response.data.data.result.forEach(t => {
this.entityData.queryRate = _.nth(t.values, -3)[1] this.entityData.queryRate = _.nth(t.values, -3)[1]
this.chartDetectionQueryRate = { this.chartDetectionQueryRate = {
...this.chartOption, ...this.chartOption,

View File

@@ -1,5 +1,5 @@
import _ from 'lodash' import _ from 'lodash'
import { get } from '@/utils/http' import axios from 'axios'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { entityListLineOption } from '@/views/charts/charts/chart-options' import { entityListLineOption } from '@/views/charts/charts/chart-options'
@@ -123,9 +123,9 @@ export default {
} }
default: break default: break
} }
get(url, queryParams).then(response => { axios.get(url, { params: queryParams }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityData.securityCount = response.data.result ? response.data.result.length : 0 this.entityData.securityCount = response.data.data.result ? response.data.data.result.length : 0
} }
}) })
}, },
@@ -153,9 +153,9 @@ export default {
} }
default: break default: break
} }
get(url, queryParams).then(response => { axios.get(url, { params: queryParams }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.entityData.performanceCount = response.data.result ? response.data.result.length : 0 this.entityData.performanceCount = response.data.data.result ? response.data.data.result.length : 0
} }
}) })
}, },
@@ -168,11 +168,11 @@ export default {
}, },
queryEntityDetailTraffic () { queryEntityDetailTraffic () {
this.loading = true this.loading = true
get(this.trafficUrl, this.getQueryParams()).then(response => { axios.get(this.trafficUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200 && response.data.result && response.data.result.length > 0) { if (response.status === 200 && response.data.data.result && response.data.data.result.length > 0) {
let sentSeries let sentSeries
let receivedSeries let receivedSeries
response.data.result.forEach(t => { response.data.data.result.forEach(t => {
if (t.legend === 'bytesRate') { if (t.legend === 'bytesRate') {
this.entityData.max = t.aggregation.max this.entityData.max = t.aggregation.max
this.entityData.avg = t.aggregation.avg this.entityData.avg = t.aggregation.avg
@@ -281,14 +281,14 @@ export default {
queryNetworkQuantity () { queryNetworkQuantity () {
this.loadingNetworkQuality = true this.loadingNetworkQuality = true
get(this.scoreUrl, this.getQueryParams()).then(response => { axios.get(this.scoreUrl, { params: this.getQueryParams() }).then(response => {
if (response.code === 200) { if (response.status === 200) {
const data = { const data = {
establishLatencyMs: response.data.result.establishLatencyValue || null, establishLatencyMs: response.data.data.result.establishLatencyValue || null,
httpResponseLatency: response.data.result.httpResponseLatencyValue || null, httpResponseLatency: response.data.data.result.httpResponseLatencyValue || null,
sslConLatency: response.data.result.sslConLatencyValue || null, sslConLatency: response.data.data.result.sslConLatencyValue || null,
tcpLostlenPercent: response.data.result.sequenceGapLossPercentValue || null, tcpLostlenPercent: response.data.data.result.sequenceGapLossPercentValue || null,
pktRetransPercent: response.data.result.pktRetransPercentValue || null pktRetransPercent: response.data.data.result.pktRetransPercentValue || null
} }
this.score = computeScore(data) this.score = computeScore(data)
} }
@@ -299,12 +299,12 @@ export default {
/** 获取事件数量 */ /** 获取事件数量 */
queryEventNum () { queryEventNum () {
this.loadingEvent = true this.loadingEvent = true
const performance = get(this.performanceEventUrl, this.getQueryParams()) const performance = axios.get(this.performanceEventUrl, { params: this.getQueryParams() })
const security = get(this.securityEventUrl, this.getQueryParams()) const security = axios.get(this.securityEventUrl, { params: this.getQueryParams() })
this.eventNum = 0 this.eventNum = 0
Promise.all([performance, security]).then(response => { Promise.all([performance, security]).then(response => {
this.eventNum = response[0].data.result.length + response[1].data.result.length this.eventNum = response[0].data.data.result.length + response[1].data.data.result.length
}).catch(e => { }).catch(e => {
this.eventNum = 0 this.eventNum = 0
}).finally(() => { }).finally(() => {

View File

@@ -126,7 +126,6 @@ import dataListMixin from '@/mixins/data-list'
import KnowledgeBaseTableForCard from '@/components/table/setting/knowledgeBaseTableForCard' import KnowledgeBaseTableForCard from '@/components/table/setting/knowledgeBaseTableForCard'
import KnowledgeBaseTableForRow from '@/components/table/setting/KnowledgeBaseTableForRow' import KnowledgeBaseTableForRow from '@/components/table/setting/KnowledgeBaseTableForRow'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { get } from '@/utils/http'
import { urlParamsHandler, overwriteUrl } from '@/utils/tools' import { urlParamsHandler, overwriteUrl } from '@/utils/tools'
import { knowledgeBaseCategory, knowledgeBaseSource, knowledgeCategoryValue } from '@/utils/constants' import { knowledgeBaseCategory, knowledgeBaseSource, knowledgeCategoryValue } from '@/utils/constants'
import axios from 'axios' import axios from 'axios'
@@ -264,7 +263,7 @@ export default {
} else { } else {
this.toggleLoading(true) this.toggleLoading(true)
axios.delete(this.url + '?knowledgeIds=' + ids).then(response => { axios.delete(this.url + '?knowledgeIds=' + ids).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.delFlag = true this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
this.secondBatchDeleteObjs.forEach((item) => { this.secondBatchDeleteObjs.forEach((item) => {
@@ -297,7 +296,7 @@ export default {
}, },
edit (u) { edit (u) {
axios.get(`${this.url}/${u.id}`).then(response => { axios.get(`${this.url}/${u.id}`).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.object = response.data.data.list[0] this.object = response.data.data.list[0]
console.info(this.object) console.info(this.object)
} }
@@ -389,7 +388,7 @@ export default {
}).then(() => { }).then(() => {
this.toggleLoading(true) this.toggleLoading(true)
axios.delete(this.url + '?knowledgeIds=' + row.id).then(response => { axios.delete(this.url + '?knowledgeIds=' + row.id).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.delFlag = true this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') }) this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
// delete this.searchLabel.category // delete this.searchLabel.category
@@ -439,19 +438,15 @@ export default {
category: knowledgeCategoryValue.aiTagging + ',' + knowledgeCategoryValue.webSketch, category: knowledgeCategoryValue.aiTagging + ',' + knowledgeCategoryValue.webSketch,
pageSize: -1 pageSize: -1
} }
get(this.listUrl, params).then(response => { axios.get(this.listUrl, { params }).then(response => {
if (response.code === 200) { if (response.status === 200) {
this.tableData = response.data.list this.tableData = response.data.data.list
if (!this.tableData || this.tableData.length === 0) { this.isNoData = !this.tableData || this.tableData.length === 0
this.isNoData = true
} else {
this.isNoData = false
}
} else { } else {
console.error(response) console.error(response.data)
this.isNoData = true this.isNoData = true
if (response.message) { if (response.data.message) {
this.$message.error(response.message) this.$message.error(response.data.message)
} else { } else {
this.$message.error(this.$t('tip.somethingWentWrong')) this.$message.error(this.$t('tip.somethingWentWrong'))
} }

View File

@@ -241,7 +241,7 @@ export default {
if (!this.editObject.knowledgeId) { if (!this.editObject.knowledgeId) {
this.$refs.form.clearValidate('type') this.$refs.form.clearValidate('type')
const response = await this.getKnowledgeBaseList() const response = await this.getKnowledgeBaseList()
if (response.data.code === 200) { if (response.status === 200) {
const find = response.data.data.list.find(d => d.name === value && d.source === this.editObject.source) const find = response.data.data.list.find(d => d.name === value && d.source === this.editObject.source)
if (find) { if (find) {
validate = false validate = false
@@ -256,7 +256,7 @@ export default {
if (!this.editObject.knowledgeId) { if (!this.editObject.knowledgeId) {
this.$refs.form.clearValidate('name') this.$refs.form.clearValidate('name')
const response = await this.getKnowledgeBaseList() const response = await this.getKnowledgeBaseList()
if (response.data.code === 200) { if (response.status === 200) {
const find = response.data.data.list.find(d => d.name === this.editObject.name && d.source === value) const find = response.data.data.list.find(d => d.name === this.editObject.name && d.source === value)
if (find) { if (find) {
validate = false validate = false
@@ -537,46 +537,46 @@ export default {
return originalImportedData return originalImportedData
}, },
uploadSuccess (response) { uploadSuccess (response) {
this.uploaded = response.code === 200 this.uploaded = true
if (response.code === 200) { // if (response.code === 200) {
// 上传成功后去掉upload和preview的错误提示 // 上传成功后去掉upload和preview的错误提示
this.uploadErrorTip = '' this.uploadErrorTip = ''
this.previewErrorTip = '' this.previewErrorTip = ''
this.importedType = this.editObject.source this.importedType = this.editObject.source
const originalImportedData = _.cloneDeep(response.data.data) const originalImportedData = _.cloneDeep(response.data.data)
this.importedDataNoData = originalImportedData.length === 0 this.importedDataNoData = originalImportedData.length === 0
if (originalImportedData.length > 0) { if (originalImportedData.length > 0) {
originalImportedData.forEach(data => { originalImportedData.forEach(data => {
if (data.isValid === 1) { if (data.isValid === 1) {
data.msg = this.$t('overall.success') data.msg = this.$t('overall.success')
} else if (data.isValid === 0) { } else if (data.isValid === 0) {
data.msg = this.$t('validate.wrongFormat') data.msg = this.$t('validate.wrongFormat')
} }
}) })
} }
this.originalImportInfo = { this.originalImportInfo = {
total: originalImportedData.length, total: originalImportedData.length,
succeeded: originalImportedData.filter(d => d.isValid === 1).length, succeeded: originalImportedData.filter(d => d.isValid === 1).length,
failed: originalImportedData.filter(d => d.isValid !== 1).length failed: originalImportedData.filter(d => d.isValid !== 1).length
} }
this.isLoad = false this.isLoad = false
originalImportedData.sort((a, b) => b.isValid - a.isValid) originalImportedData.sort((a, b) => b.isValid - a.isValid)
this.importedData = this.handleSpeticalTypeData(originalImportedData) this.importedData = this.handleSpeticalTypeData(originalImportedData)
this.addItemList = _.cloneDeep(this.importedData).filter(item => { return item.isValid === 1 }) this.addItemList = _.cloneDeep(this.importedData).filter(item => { return item.isValid === 1 })
this.updateItemList = [] this.updateItemList = []
this.deleteItemIds = this.oldItemIds this.deleteItemIds = this.oldItemIds
this.handleShowImportedData() this.handleShowImportedData()
this.addEditFlag = false this.addEditFlag = false
this.editTagErrorTip = '' this.editTagErrorTip = ''
this.editIndex = -1 this.editIndex = -1
this.isPreviewChange = true this.isPreviewChange = true
this.stepHeights[2] = itemListHeight.hasData this.stepHeights[2] = itemListHeight.hasData
this.stepHeightConstant.third = itemListHeight.hasData this.stepHeightConstant.third = itemListHeight.hasData
} else { /* } else {
this.uploadLoading = false this.uploadLoading = false
this.$message.error(this.$t('tip.uploadFailed', { msg: response.message })) this.$message.error(this.$t('tip.uploadFailed', { msg: response.message }))
} } */
}, },
onRemove (files) { onRemove (files) {
if (files && files.status === 'success') { if (files && files.status === 'success') {
@@ -842,7 +842,7 @@ export default {
if (!this.editObject.knowledgeId) { if (!this.editObject.knowledgeId) {
postData.addItemList = this.addItemList postData.addItemList = this.addItemList
axios.post(this.url, postData).then(response => { axios.post(this.url, postData).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.$message({ this.$message({
duration: 2000, duration: 2000,
type: 'success', type: 'success',
@@ -871,7 +871,7 @@ export default {
postData.deleteItemIds = this.deleteItemIds postData.deleteItemIds = this.deleteItemIds
postData.knowledgeId = this.editObject.knowledgeId postData.knowledgeId = this.editObject.knowledgeId
axios.put(this.url, postData).then(response => { axios.put(this.url, postData).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
this.$message({ this.$message({
duration: 2000, duration: 2000,
type: 'success', type: 'success',
@@ -1176,7 +1176,7 @@ export default {
this.stepHeightConstant.third = itemListHeight.hasData// 修改的时候一直是478 this.stepHeightConstant.third = itemListHeight.hasData// 修改的时候一直是478
this.isLoad = true this.isLoad = true
axios.get(`${api.knowledgeBase}/${this.knowledgeBaseId}`, { params: { pageSize: -1 } }).then(response => { axios.get(`${api.knowledgeBase}/${this.knowledgeBaseId}`, { params: { pageSize: -1 } }).then(response => {
if (response.data.code === 200) { if (response.status === 200) {
if (!response.data.data) { if (!response.data.data) {
throw new Error('No data found, id: ' + this.knowledgeBaseId) throw new Error('No data found, id: ' + this.knowledgeBaseId)
} }

View File

@@ -1,296 +0,0 @@
<template>
<div>
<div class="filter-title">
{{ $t('knowledge.filters') }}
</div>
<div class="knowledge-filter">
<div class="filter__header" @click="collapseCategory">
<span class="new-knowledge-filter-header-title">{{filterCategoryData.title}}</span>
<i class="el-icon-arrow-right new-knowledge-filter-icon" :class="{ 'arrow-rotate': !filterCategoryData.collapse }"></i>
</div>
<el-collapse-transition>
<div class="filter__body" v-if="!filterCategoryData.collapse">
<el-tree
ref="knowledgeTreeTypeFilter"
:data="filterCategoryData.data"
show-checkbox
node-key="id"
default-expand-all
:render-content="renderContent"
@check="(data,checkinfo)=>handleCheckedItemChange(data,checkinfo)"
>
</el-tree>
</div>
</el-collapse-transition>
</div>
<div class="knowledge-filter">
<div class="filter__header" @click="collapseStatus">
<span class="new-knowledge-filter-header-title">{{filterStatusData.title}}</span>
<i class="el-icon-arrow-right new-knowledge-filter-icon" :class="{ 'arrow-rotate': !filterStatusData.collapse }"></i>
</div>
<el-collapse-transition>
<div class="filter__body" v-if="!filterStatusData.collapse">
<el-tree
ref="knowledgeTreeStatusFilter"
:data="filterStatusData.data"
show-checkbox
node-key="id"
default-expand-all
:render-content="renderContent"
@check="(data,checkinfo)=>handleCheckedItemChange(data,checkinfo)"
>
</el-tree>
</div>
</el-collapse-transition>
</div>
</div>
</template>
<script>
import { api } from '@/utils/api'
import { get } from '@/utils/http'
import { knowledgeBaseCategory, knowledgeBaseSource } from '@/utils/constants'
export default {
name: 'KnowledgeFilter',
props: {
keyWord: String
},
data () {
return {
url: api.knowledgeBaseStatistics,
checkAll: true,
isIndeterminateModel: false,
filterCategoryData: {
id: 0,
title: this.$t('knowledge.type'),
collapse: false,
data: []
},
filterStatusData: {
id: 1,
title: this.$t('knowledge.status'),
collapse: false,
data: []
},
defaultProps: {
children: 'children',
label: 'label'
},
typeData: [],
statusData: [],
defaultCheckedCategory: [],
defaultCheckedStatus: [],
filterParams: {}
}
},
watch: {
},
methods: {
renderContent (h, { node, data, store }) {
return h('span', { class: 'custom-tree-node' }, [
h('span', {}, data.label),
h('span', { class: 'count-tree-node' }, data.count)
])
},
collapseCategory () {
this.filterCategoryData.collapse = !this.filterCategoryData.collapse
const self = this
if (!this.filterCategoryData.collapse) {
this.$nextTick(() => {
if (self.$refs.knowledgeTreeTypeFilter instanceof Array) {
self.$refs.knowledgeTreeTypeFilter[0].setCheckedKeys(this.defaultCheckedCategory)
} else {
self.$refs.knowledgeTreeTypeFilter.setCheckedKeys(this.defaultCheckedCategory)
}
})
}
},
collapseStatus () {
this.filterStatusData.collapse = !this.filterStatusData.collapse
const self = this
if (!this.filterStatusData.collapse) {
this.$nextTick(() => {
if (self.$refs.knowledgeTreeStatusFilter instanceof Array) {
self.$refs.knowledgeTreeStatusFilter[0].setCheckedKeys(this.defaultCheckedStatus)
} else {
self.$refs.knowledgeTreeStatusFilter.setCheckedKeys(this.defaultCheckedStatus)
}
})
}
},
handleCheckedItemChange (data, checkinfo) {
let typeCheckedNodes = []
let typeHalfCheckedNodes = []
if (this.$refs.knowledgeTreeTypeFilter) {
if (this.$refs.knowledgeTreeTypeFilter instanceof Array) {
typeCheckedNodes = this.$refs.knowledgeTreeTypeFilter[0].getCheckedNodes()
typeHalfCheckedNodes = this.$refs.knowledgeTreeTypeFilter[0].getHalfCheckedNodes()
} else {
typeCheckedNodes = this.$refs.knowledgeTreeTypeFilter.getCheckedNodes()
typeHalfCheckedNodes = this.$refs.knowledgeTreeTypeFilter.getHalfCheckedNodes()
}
const categoryIds = []
typeCheckedNodes.forEach(item => {
categoryIds.push(item.id)
})
this.defaultCheckedCategory = categoryIds
typeCheckedNodes = typeCheckedNodes.concat(typeHalfCheckedNodes)
}
let statusCheckedNodes = []
if (this.$refs.knowledgeTreeStatusFilter) {
if (this.$refs.knowledgeTreeStatusFilter instanceof Array) {
statusCheckedNodes = this.$refs.knowledgeTreeStatusFilter[0].getCheckedNodes()
} else {
statusCheckedNodes = this.$refs.knowledgeTreeStatusFilter.getCheckedNodes()
}
const sourceIds = []
statusCheckedNodes.forEach(item => {
sourceIds.push(item.id)
})
this.defaultCheckedStatus = sourceIds
}
const typeCheckedLen = typeCheckedNodes.length
const statusCheckedLen = statusCheckedNodes.length
let params = {}
let allSourceNum = 0
this.filterCategoryData.data.forEach(item => {
allSourceNum = allSourceNum + item.children.length
})
if (this.defaultCheckedCategory.length === 0 || this.defaultCheckedStatus.length === 0) {
this.$emit('clearList')
} else {
const categorys = []
const sources = []
typeCheckedNodes.forEach(val => {
if (val.type === 0) {
categorys.push(val.value)
} else if (val.type === 1) {
sources.push(val.value)
}
})
if (!(categorys.length === this.filterCategoryData.data.length && sources.length === allSourceNum)) {
if (this.filterCategoryData.collapse) {
params = {
category: categorys.toString() ? categorys.toString() : this.filterParams.category,
source: sources.toString() ? sources.toString() : this.filterParams.source
}
} else {
params = {
category: categorys.toString(),
source: sources.toString()
}
}
}
if (this.defaultCheckedStatus.length === 1) {
if (this.filterStatusData.collapse) {
params = {
...params,
status: statusCheckedNodes[0].value ? statusCheckedNodes[0].value : this.filterParams.status
}
} else {
params = {
...params,
status: statusCheckedNodes[0].value
}
}
}
this.filterParams = params
this.$emit('reload', params, true, false, this.defaultCheckedCategory, this.defaultCheckedStatus)
}
},
getAllTableData (params) {
let searchParams = { pageSize: -1 }
if (params) {
searchParams = { ...searchParams, ...params }
}
get(this.url, searchParams).then(response => {
if (response.code === 200) {
this.typeData = response.data.categoryList
this.statusData = response.data.statusList
} else {
console.error(response)
}
}).finally(() => {
this.initTypeData()
this.initStatusData()
const self = this
this.$nextTick(() => {
if (self.$refs.knowledgeTreeTypeFilter) {
self.$refs.knowledgeTreeTypeFilter.setCheckedKeys(this.defaultCheckedCategory)
}
if (self.$refs.knowledgeTreeStatusFilter) {
self.$refs.knowledgeTreeStatusFilter.setCheckedKeys(this.defaultCheckedStatus)
}
})
})
},
initTypeData () {
this.filterCategoryData.data = []
let categoryIds = []
this.typeData.forEach((type, typeIndex) => {
const categoryLabel = knowledgeBaseCategory.find(t => t.value === type.name)
const categoryId = typeIndex
const category = {
id: categoryId,
label: categoryLabel ? categoryLabel.name : type.name,
value: type.name,
count: type.count,
type: 0,
children: []
}
categoryIds.push(categoryId)
this.filterCategoryData.data.push(category)
const sourceList = type.sourceList
sourceList.forEach((item, sourceIndex) => {
const sourceLabel = knowledgeBaseSource.find(t => t.value === item.name)
const source = {
id: typeIndex + '' + sourceIndex,
label: sourceLabel ? sourceLabel.name : item.name,
value: item.name,
count: item.count,
type: 1
}
category.children.push(source)
})
})
if (this.defaultCheckedCategory.length === 0) {
this.defaultCheckedCategory = categoryIds
}
},
initStatusData () {
const enableCount = 0
const disableCount = 0
this.filterStatusData.data = []
let statusIds = []
this.statusData.forEach((data, index) => {
this.filterStatusData.data.push({
id: index,
label: data.status === 1 ? 'enabled' : 'disable',
value: data.status,
count: data.count,
type: 0
})
statusIds.push(index)
})
if (this.defaultCheckedStatus.length === 0) {
this.defaultCheckedStatus = statusIds
}
},
reloadFilter (checkedCategoryIds, checkedStatusIds) {
if (checkedCategoryIds && checkedCategoryIds.length > 0) {
this.defaultCheckedCategory = checkedCategoryIds
}
if (checkedStatusIds && checkedStatusIds.length > 0) {
this.defaultCheckedStatus = checkedStatusIds
}
this.getAllTableData()
}
},
mounted () {
this.getAllTableData()
},
computed: {
}
}
</script>