fix: 修复detection列表和filter问题:1、搜索栏清除搜索,勾选未去除;2、filter选项包含大写,点击搜索时报错;3、搜索包含空格导致搜索失败;4、添加刷新保留状态

This commit is contained in:
刘洪洪
2023-10-24 16:02:25 +08:00
parent 46f1a880cd
commit 4d4d197a80
4 changed files with 103 additions and 23 deletions

View File

@@ -1173,7 +1173,9 @@ export default class Parser {
const arr = [] const arr = []
// 如果出现this.columnList中的字段如IP\Domain\App\Country等则不进行模糊搜索将str返回出去 // 如果出现this.columnList中的字段如IP\Domain\App\Country等则不进行模糊搜索将str返回出去
this.columnList.forEach(item => { this.columnList.forEach(item => {
arr.push(item.label.toLowerCase()) // todo 取消了大小写校验,后续观察是否出现问题
// arr.push(item.label.toLowerCase())
arr.push(item.label)
}) })
// 因为手动输入时可能会输入and所以将操作符的AND转换为and统一处理 // 因为手动输入时可能会输入and所以将操作符的AND转换为and统一处理
@@ -1183,7 +1185,9 @@ export default class Parser {
newStr = newStr.replace(new RegExp(arr[i], 'g'), arr[i]) newStr = newStr.replace(new RegExp(arr[i], 'g'), arr[i])
} }
// 检查str字段在arr中是否出现,true为出现过 // 检查str字段在arr中是否出现,true为出现过
const result = arr.some(item => newStr.toLowerCase().includes(item)) // todo 取消了大小写校验,后续观察是否出现问题
// const result = arr.some(item => newStr.toLowerCase().includes(item))
const result = arr.some(item => newStr.includes(item))
if (newStr.indexOf(' and ') > -1) { if (newStr.indexOf(' and ') > -1) {
// 将单引号包裹的and拿出来放到数组tempList里原来的单引号包裹内容用temp即'it is test keyword{键值}'代替 // 将单引号包裹的and拿出来放到数组tempList里原来的单引号包裹内容用temp即'it is test keyword{键值}'代替
// 再将字符串用and转换为数组遍历数组发现值为temp的获取键值根据键值获取tempList的值组合起来 // 再将字符串用and转换为数组遍历数组发现值为temp的获取键值根据键值获取tempList的值组合起来
@@ -1194,7 +1198,7 @@ export default class Parser {
// 将单引号包裹的and内容集合起来 // 将单引号包裹的and内容集合起来
while ((match = regex.exec(newStr)) !== null) { while ((match = regex.exec(newStr)) !== null) {
if (match[1].includes('and')) { if (match[1].includes(' and ')) {
tempList.push(match[1]) tempList.push(match[1])
} }
} }

View File

@@ -118,7 +118,7 @@ const user = {
localStorage.setItem(storageKey.linkInfo, res.page.list[0].cvalue) localStorage.setItem(storageKey.linkInfo, res.page.list[0].cvalue)
} }
}) })
axios.get(api.config, { params: { ckey: 'schema_entity_explore' } }).then(response => { axios.get(api.config, { params: { ckey: 'schema_explore' } }).then(response => {
const res = response.data const res = response.data
if (response.status === 200 && res.page.list && res.page.list.length > 0) { 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

@@ -69,14 +69,16 @@ export default {
this.myListData.push(this.$_.cloneDeep(item)) this.myListData.push(this.$_.cloneDeep(item))
if (item.eventInfoObj) { if (item.eventInfoObj) {
axios.get(`${api.detection.securityEvent.detail}/${item.eventInfoObj.ioc_type}?resource=${item.eventInfoObj.ioc_value}`).then(res => { axios.get(`${api.detection.securityEvent.detail}/${item.eventInfoObj.ioc_type}?resource=${item.eventInfoObj.ioc_value}`).then(res => {
if (res.status === 200) { if (res.status === 200 && this.myListData[i]) {
this.myListData[i].malwareName = (this.$_.get(res, 'data.data.malware.malwareName', '-')) || '-' this.myListData[i].malwareName = (this.$_.get(res, 'data.data.malware.malwareName', '-')) || '-'
} else { } else if (this.myListData[i]) {
this.myListData[i].malwareName = '-' this.myListData[i].malwareName = '-'
} }
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)
this.myListData[i].malwareName = '-' if (this.myListData[i]) {
this.myListData[i].malwareName = '-'
}
}) })
} }
}) })
@@ -116,7 +118,10 @@ export default {
} else { } else {
clearTimeout(this.timeout) clearTimeout(this.timeout)
this.noData = false this.noData = false
this.initData() const timer = setTimeout(() => {
this.initData()
clearTimeout(timer)
}, 200)
} }
} }
} }

View File

@@ -184,8 +184,8 @@ export default {
securityEvent: [ securityEvent: [
{ {
title: this.$t('overall.status'), title: this.$t('overall.status'),
column: '', column: 'status',
topColumn: '', // todo schema暂无标识 topColumn: 'status',
collapse: false, collapse: false,
value: [], // value之间是or的关系 value: [], // value之间是or的关系
data: [] // 从接口动态获取,本项在获得数据后需要特殊处理左边框颜色 data: [] // 从接口动态获取,本项在获得数据后需要特殊处理左边框颜色
@@ -303,6 +303,7 @@ export default {
} }
return { label, value: r.status, count: r.count } return { label, value: r.status, count: r.count }
}) })
this.isCheckFilterByQ(params, 0)
} }
}).catch(e => { }).catch(e => {
console.error(e) console.error(e)
@@ -390,6 +391,7 @@ export default {
this.statisticsSeverityData = data this.statisticsSeverityData = data
if (!this.$_.isEmpty(data)) { if (!this.$_.isEmpty(data)) {
this.filterData[this.pageType][1].data = data.map(r => ({ label: r.severity, value: r.severity, count: r.count })) this.filterData[this.pageType][1].data = data.map(r => ({ label: r.severity, value: r.severity, count: r.count }))
this.isCheckFilterByQ(params, 1)
const eventSeverityOption = this.$_.cloneDeep(pieForSeverity) const eventSeverityOption = this.$_.cloneDeep(pieForSeverity)
eventSeverityOption.series[0].data = data.map(d => { eventSeverityOption.series[0].data = data.map(d => {
return { value: d.count, name: d.severity, itemStyle: { color: getSeverityColor(d.severity) } } return { value: d.count, name: d.severity, itemStyle: { color: getSeverityColor(d.severity) } }
@@ -408,7 +410,7 @@ export default {
if (this.pageType === 'performanceEvent') { if (this.pageType === 'performanceEvent') {
vm.filterData.performanceEvent[0].value = vm.triggerFilterDataValue(vm.filterData.performanceEvent[0].value, e.data.name) vm.filterData.performanceEvent[0].value = vm.triggerFilterDataValue(vm.filterData.performanceEvent[0].value, e.data.name)
} else if (this.pageType === 'securityEvent') { } else if (this.pageType === 'securityEvent') {
vm.filterData.securityEvent[0].value = vm.triggerFilterDataValue(vm.filterData.securityEvent[0].value, e.data.name) vm.filterData.securityEvent[1].value = vm.triggerFilterDataValue(vm.filterData.securityEvent[1].value, e.data.name)
} }
}) })
} }
@@ -464,6 +466,7 @@ export default {
value: r.eventType, value: r.eventType,
count: r.count count: r.count
})) }))
this.isCheckFilterByQ(params, 2)
const chartDom = document.getElementById(`detectionCategoryPer${this.pageType}`) const chartDom = document.getElementById(`detectionCategoryPer${this.pageType}`)
let detectionChart = echarts.getInstanceByDom(chartDom) let detectionChart = echarts.getInstanceByDom(chartDom)
if (detectionChart) { if (detectionChart) {
@@ -500,6 +503,7 @@ export default {
value: r.offenderIp, value: r.offenderIp,
count: r.count count: r.count
})) }))
this.isCheckFilterByQ(params, 4)
const { showMore, showIndex } = this.computeFilterPage(this.filterData[this.pageType][4].data) const { showMore, showIndex } = this.computeFilterPage(this.filterData[this.pageType][4].data)
this.filterData[this.pageType][4].showMore = showMore this.filterData[this.pageType][4].showMore = showMore
this.filterData[this.pageType][4].showIndex = showIndex this.filterData[this.pageType][4].showIndex = showIndex
@@ -538,6 +542,7 @@ export default {
axios.get(api.detection[this.pageType].victimIpStatistics, { params }).then(res => { axios.get(api.detection[this.pageType].victimIpStatistics, { params }).then(res => {
const data = res.data.data.result const data = res.data.data.result
this.filterData[this.pageType][3].data = data.map(r => ({ label: r.victimIp, value: r.victimIp, count: r.count })) this.filterData[this.pageType][3].data = data.map(r => ({ label: r.victimIp, value: r.victimIp, count: r.count }))
this.isCheckFilterByQ(params, 3)
const { showMore, showIndex } = this.computeFilterPage(this.filterData[this.pageType][3].data) const { showMore, showIndex } = this.computeFilterPage(this.filterData[this.pageType][3].data)
this.filterData[this.pageType][3].showMore = showMore this.filterData[this.pageType][3].showMore = showMore
this.filterData[this.pageType][3].showIndex = showIndex this.filterData[this.pageType][3].showIndex = showIndex
@@ -719,10 +724,21 @@ export default {
// 参数q避免切换页码时地址栏参数q为空 // 参数q避免切换页码时地址栏参数q为空
let urlQ = '' let urlQ = ''
if (param && param.str) { if (param && param.str) {
urlQ = encodeURI(param.str) // urlQ = encodeURI(param.str)
urlQ = param.str
} else if (this.q) { } else if (this.q) {
urlQ = encodeURI(this.q) // urlQ = encodeURI(this.q)
urlQ = this.q
} }
const mode = this.$route.query.mode || 'text'
const newUrl = urlParamsHandler(window.location.href, this.$route.query, {
startTime: this.timeFilter.startTime,
endTime: this.timeFilter.endTime,
range: this.dateRangeValue,
q: urlQ,
mode: mode
})
overwriteUrl(newUrl)
this.queryFilter(urlQ) this.queryFilter(urlQ)
this.queryList(urlQ) this.queryList(urlQ)
}, },
@@ -749,8 +765,8 @@ export default {
this.initVictimIpData(params) this.initVictimIpData(params)
this.initSecurityTypeData(params) this.initSecurityTypeData(params)
} else if (this.pageType === detectionPageType.performanceEvent) { } else if (this.pageType === detectionPageType.performanceEvent) {
// this.initActiveEntity(params) this.initActiveEntity(params)
// this.initEventTypeData(params) this.initEventTypeData(params)
} }
}, },
pageSize (val) { pageSize (val) {
@@ -795,12 +811,43 @@ export default {
t: +new Date() t: +new Date()
} }
}) })
},
isCheckFilterByQ (params, index) {
if (params.resource) {
let obj
if (index === 0) {
obj = this.filterData[this.pageType][index].data.find(d => params.resource.indexOf(d.value) > -1 && params.resource.indexOf('status') > -1)
} else {
obj = this.filterData[this.pageType][index].data.find(d => params.resource.indexOf(d.value) > -1)
}
if (obj) {
this.filterData[this.pageType][index].value = [obj.value]
this.filterData[this.pageType][index].flag = true
}
} else {
this.filterData[this.pageType][index].value = []
this.filterData[this.pageType][index].flag = true
}
} }
}, },
mounted () { mounted () {
this.queryFilter() let { q } = this.$route.query
// 如果地址栏有listMode即列表页并非首页则开始搜索
if (q) {
// %位置为0是输入中文时能解码%2025%分别是空格和%的情况
if (q && (q.indexOf('%') === 0 || q.indexOf('%20') > -1 || q.indexOf('%25') > -1)) {
q = decodeURI(q)
}
// %位置不为0即内容包含非英文时
const str1 = q.substring(q.indexOf('%'), q.indexOf('%') + 3)
if (q && q.indexOf('%') > 0 && (str1 !== '%20' || str1 === '%25')) {
q = decodeURI(q)
}
}
this.queryFilter(q)
this.initFlag = false this.initFlag = false
this.queryList() this.queryList(q)
this.debounceFunc = this.$_.debounce(this.resize, 300) this.debounceFunc = this.$_.debounce(this.resize, 300)
window.addEventListener('resize', this.debounceFunc) window.addEventListener('resize', this.debounceFunc)
}, },
@@ -873,37 +920,61 @@ export default {
'filterData.securityEvent.0.value': { 'filterData.securityEvent.0.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[0].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[0].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[0].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[0].flag = false
}
} }
}, },
'filterData.securityEvent.1.value': { 'filterData.securityEvent.1.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[1].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[1].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[1].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[1].flag = false
}
} }
}, },
'filterData.securityEvent.2.value': { 'filterData.securityEvent.2.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[2].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[2].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[2].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[2].flag = false
}
} }
}, },
'filterData.securityEvent.3.value': { 'filterData.securityEvent.3.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[3].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[3].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[3].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[3].flag = false
}
} }
}, },
'filterData.securityEvent.4.value': { 'filterData.securityEvent.4.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[4].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[4].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[4].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[4].flag = false
}
} }
}, },
'filterData.securityEvent.5.value': { 'filterData.securityEvent.5.value': {
deep: true, deep: true,
handler (n, o) { handler (n, o) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[5].column, oldValue: o, newValue: n }) if (!this.filterData.securityEvent[5].flag) {
this.$refs.search.changeParams({ column: this.filterData.securityEvent[5].column, oldValue: o, newValue: n })
} else {
this.filterData.securityEvent[5].flag = false
}
} }
}, },
'filterData.performanceEvent.0.value': { 'filterData.performanceEvent.0.value': {