feat: 搜索框(部分内容,缺全文搜索处理)

This commit is contained in:
chenjinsong
2022-01-25 19:47:08 +08:00
parent f22a1f30eb
commit fe285adfa9
8 changed files with 112 additions and 40 deletions

View File

@@ -61,7 +61,7 @@ export default {
}, },
methods: { methods: {
search (metaList, formatSql) { search (metaList, formatSql) {
this.$emit('search', formatSql) this.$emit('search', metaList, formatSql)
}, },
changeMode (mode, data) { changeMode (mode, data) {
this.searchMode = mode this.searchMode = mode
@@ -77,8 +77,8 @@ export default {
} }
}, },
setup (props) { setup (props) {
// 默认为文本模式 TODO 改回text // 默认为文本模式
let searchMode = ref('tag') let searchMode = ref('text')
if (props.defaultMode) { if (props.defaultMode) {
switch (props.defaultMode) { switch (props.defaultMode) {
case 'tag': { case 'tag': {

View File

@@ -107,6 +107,7 @@ export default {
// 新增条件 // 新增条件
addCondition (meta) { addCondition (meta) {
this.metaList.forEach(m => { this.metaList.forEach(m => {
console.info(m)
m.cancelEditing() m.cancelEditing()
}) })
// 先判断上一个condition是否已填写完整没有则删除之后将当前所有meta的内容的isEditing置为false // 先判断上一个condition是否已填写完整没有则删除之后将当前所有meta的内容的isEditing置为false
@@ -132,7 +133,6 @@ export default {
this.$refs.columnSelect.focus() this.$refs.columnSelect.focus()
}) })
} }
console.info(this.metaList)
}, },
addConnection () { addConnection () {
this.metaList.push(new Meta(connection)) this.metaList.push(new Meta(connection))
@@ -161,16 +161,16 @@ export default {
}) })
meta.column.label = selectedColumn.label meta.column.label = selectedColumn.label
meta.column.type = selectedColumn.type meta.column.type = selectedColumn.type
} setTimeout(() => {
setTimeout(() => { meta.column.isEditing = false
meta.column.isEditing = false
// 处理操作符 // 处理操作符
if (!meta.operator.value) { if (!meta.operator.value) {
meta.operator.isEditing = true meta.operator.isEditing = true
meta.operator.show = true meta.operator.show = true
} }
}, 200) }, 200)
}
}, },
selectConnection (value, meta) { selectConnection (value, meta) {
meta.isEditing = false meta.isEditing = false
@@ -185,7 +185,11 @@ export default {
setTimeout(() => { setTimeout(() => {
meta.column.isEditing = false meta.column.isEditing = false
if (meta.isEmpty()) { if (meta.isEmpty()) {
this.metaList.splice(index, 1) if (this.metaList.length > 1) {
this.metaList.splice(index - 1, 2)
} else {
this.metaList.splice(index, 1)
}
} }
}, 200) }, 200)
}, },
@@ -231,6 +235,7 @@ export default {
changeMode () { changeMode () {
const parser = new SqlParser(this.metaList, this.columnList) const parser = new SqlParser(this.metaList, this.columnList)
const { metaList, formatSql } = parser.formatMetaList() const { metaList, formatSql } = parser.formatMetaList()
console.info(formatSql)
this.metaList = metaList this.metaList = metaList
this.$emit('changeMode', 'text', formatSql) this.$emit('changeMode', 'text', formatSql)
}, },

View File

@@ -88,3 +88,17 @@ export default class Meta {
} }
} }
} }
export function cloneMeta (source) {
if (source instanceof Meta) {
const m = new Meta(source.meta)
Object.keys(source).forEach(s => {
m[s] = _.cloneDeep(source[s])
})
return m
} else if (_.isArray(source)) {
return source.map(s => {
return cloneMeta(s)
})
}
}

View File

@@ -71,7 +71,6 @@ export default {
this.$emit('close') this.$emit('close')
}, },
filter (row) { filter (row) {
console.info(row.name, this.item)
this.$emit('filter', row.name, this.item) this.$emit('filter', row.name, this.item)
}, },
initEntityTop (leftVal, itemVal, data, totalCount) { initEntityTop (leftVal, itemVal, data, totalCount) {

View File

@@ -1,5 +1,5 @@
import { GenericSQL, SqlParserVisitor } from 'dt-sql-parser' import { GenericSQL, SqlParserVisitor } from 'dt-sql-parser'
import Meta, { connection, condition, columnType } from '@/components/advancedSearch/meta/meta' import Meta, { connection, condition, columnType, cloneMeta } from '@/components/advancedSearch/meta/meta'
import _ from 'lodash' import _ from 'lodash'
// 补全语句,用于解析 // 补全语句,用于解析
const sqlPrev = 'select a from b where ' const sqlPrev = 'select a from b where '
@@ -34,7 +34,7 @@ export default class SqlParser extends SqlParserVisitor {
this.tempMeta.column.type = columnType.fullText this.tempMeta.column.type = columnType.fullText
this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name) this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name)
this.tempMeta.column.label = this.tempMeta.column.name this.tempMeta.column.label = this.tempMeta.column.name
this.metaList.push(_.cloneDeep(this.tempMeta)) this.metaList.push(cloneMeta(this.tempMeta))
} }
this.tempMeta = null this.tempMeta = null
return { return {
@@ -44,12 +44,15 @@ export default class SqlParser extends SqlParserVisitor {
} }
formatMetaList () { formatMetaList () {
const tempMetaList = _.cloneDeep(this.metaList) const tempMetaList = cloneMeta(this.metaList)
this.metaList = [] this.metaList = []
tempMetaList.forEach(meta => { tempMetaList.forEach(meta => {
if (meta.meta === condition) { if (meta.meta === condition) {
if (meta.column.type === columnType.fullText) { if (meta.column.type === columnType.fullText) {
this.metaList.push({ ...meta, name: stringInQuot(meta.name), label: stringInQuot(meta.name) }) const m = cloneMeta(meta)
m.column.name = stringInQuot(meta.column.name)
m.column.label = m.column.name
this.metaList.push(m)
} else if (meta.column.type === columnType.string) { } else if (meta.column.type === columnType.string) {
if (_.isArray(meta.value.value)) { if (_.isArray(meta.value.value)) {
meta.value.value = meta.value.value.map(v => { meta.value.value = meta.value.value.map(v => {
@@ -69,6 +72,8 @@ export default class SqlParser extends SqlParserVisitor {
} }
this.metaList.push(meta) this.metaList.push(meta)
} }
} else {
this.metaList.push(meta)
} }
}) })
return { return {
@@ -81,9 +86,11 @@ export default class SqlParser extends SqlParserVisitor {
let sql = '' let sql = ''
metaList.forEach(meta => { metaList.forEach(meta => {
if (meta.meta === condition) { if (meta.meta === condition) {
sql += meta.column.name sql += (meta.column.name)
if (meta.column.type !== columnType.fullText) { if (meta.column.type !== columnType.fullText) {
sql += `${meta.operator.value}${meta.value.value} ` sql += `${meta.operator.value}${meta.value.value} `
} else {
sql += ' '
} }
} }
if (meta.meta === connection) { if (meta.meta === connection) {
@@ -133,7 +140,7 @@ export default class SqlParser extends SqlParserVisitor {
} }
} }
this.tempMeta.value.show = true this.tempMeta.value.show = true
this.metaList.push(_.cloneDeep(this.tempMeta)) this.metaList.push(cloneMeta(this.tempMeta))
} }
break break
} }
@@ -158,7 +165,7 @@ export default class SqlParser extends SqlParserVisitor {
this.tempMeta.column.type = columnType.fullText this.tempMeta.column.type = columnType.fullText
this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name) this.tempMeta.column.name = stringInQuot(this.tempMeta.column.name)
this.tempMeta.column.label = this.tempMeta.column.name this.tempMeta.column.label = this.tempMeta.column.name
this.metaList.push(_.cloneDeep(this.tempMeta)) this.metaList.push(cloneMeta(this.tempMeta))
this.tempMeta = null this.tempMeta = null
} }
const meta = new Meta(connection) const meta = new Meta(connection)

View File

@@ -23,7 +23,7 @@
<div style="display: flex; height: 100%;"> <div style="display: flex; height: 100%;">
<entity-filter <entity-filter
:filter-data="filterData" :filter-data="filterData"
:search-params="searchParams" :q="q"
:time-filter="timeFilter" :time-filter="timeFilter"
@filter="filter" @filter="filter"
></entity-filter> ></entity-filter>
@@ -124,7 +124,7 @@ import EntityList from '@/views/entityExplorer/entityList/EntityList'
import { entityType, entityFilterType, defaultPageSize } from '@/utils/constants' import { entityType, entityFilterType, defaultPageSize } from '@/utils/constants'
import { get } from '@/utils/http' import { get } from '@/utils/http'
import { api } from '@/utils/api' import { api } from '@/utils/api'
import { getNowTime } from '@/utils/date-util' import { getNowTime, getSecond } from '@/utils/date-util'
import { ref } from 'vue' import { ref } from 'vue'
import pagination from '@/components/common/Pagination' import pagination from '@/components/common/Pagination'
@@ -155,7 +155,6 @@ export default {
entityIpNew: '-', entityIpNew: '-',
entityIpActive: '-', entityIpActive: '-',
searchParams: {},
showFilter: ['ip', 'app', 'domain'], // ip,domain,app showFilter: ['ip', 'app', 'domain'], // ip,domain,app
pageObj: { pageObj: {
pageNo: 1, pageNo: 1,
@@ -256,6 +255,8 @@ export default {
} }
], ],
listData: [], listData: [],
q: '',
limitFilterType: true, // 是否限定了filter的类型
listLoading: false/*, listLoading: false/*,
listData: JSON.parse(`[ listData: JSON.parse(`[
{ {
@@ -435,21 +436,49 @@ export default {
dateTimeRangeChange (s, e, v) { dateTimeRangeChange (s, e, v) {
this.timeFilter = { startTime: s, endTime: e, dateRangeValue: v } this.timeFilter = { startTime: s, endTime: e, dateRangeValue: v }
}, },
search (params) { search (metaList, formatSql) {
if (params) { if (formatSql) {
this.searchParams = params this.q = formatSql
} else {
this.q = ''
} }
if (!this.showList) { if (!this.showList) {
this.showList = true this.showList = true
} }
// 带参数时只查询对应类型的entity不带参数时3种entity都查 // 带参数时只查询对应类型的entity不带参数时3种entity都查
if (this.searchParams && Object.keys(this.searchParams).length > 0) { if (formatSql) {
this.queryFilter({ entityType: 'ip', q: this.searchParams.q, ...this.timeFilter }) const entityTypeMeta = metaList.find(meta => {
this.queryFilter({ entityType: 'app', q: this.searchParams.q, ...this.timeFilter }) return meta.column && meta.column === 'entity_type'
this.queryFilter({ entityType: 'domain', q: this.searchParams.q, ...this.timeFilter }) })
this.queryList({ q: this.searchParams.q, ...this.timeFilter, ...this.pageObj }) if (entityTypeMeta) {
this.queryListTotal({ q: this.searchParams.q, ...this.timeFilter }) let entityType = ''
this.limitFilterType = false
if (entityTypeMeta.value.value === "'ip'") {
this.limitFilterType = true
entityType = 'ip'
} else if (entityTypeMeta.value.value === "'domain'") {
this.limitFilterType = true
entityType = 'domain'
} else if (entityTypeMeta.value.value === "'app'") {
this.limitFilterType = true
entityType = 'app'
} else {
this.limitFilterType = false
}
this.queryFilter({ entityType: entityType, q: formatSql, ...this.timeFilter })
this.queryList({ q: formatSql, ...this.timeFilter, ...this.pageObj })
this.queryListTotal({ q: formatSql, ...this.timeFilter })
} else {
this.limitFilterType = false
this.queryFilter({ entityType: 'ip', q: formatSql, ...this.timeFilter })
this.queryFilter({ entityType: 'domain', q: formatSql, ...this.timeFilter })
this.queryFilter({ entityType: 'app', q: formatSql, ...this.timeFilter })
this.queryList({ q: formatSql, ...this.timeFilter, ...this.pageObj })
this.queryListTotal({ q: formatSql, ...this.timeFilter })
}
} else { } else {
this.limitFilterType = false
this.queryFilter({ entityType: 'ip', ...this.timeFilter }) this.queryFilter({ entityType: 'ip', ...this.timeFilter })
this.queryFilter({ entityType: 'app', ...this.timeFilter }) this.queryFilter({ entityType: 'app', ...this.timeFilter })
this.queryFilter({ entityType: 'domain', ...this.timeFilter }) this.queryFilter({ entityType: 'domain', ...this.timeFilter })
@@ -494,8 +523,8 @@ export default {
queryFilter (params) { queryFilter (params) {
const queryParams = { const queryParams = {
...params, ...params,
startTime: parseInt(params.startTime / 1000), startTime: getSecond(params.startTime),
endTime: parseInt(params.endTime / 1000) endTime: getSecond(params.endTime)
} }
get(api.entityFilter, queryParams).then(response => { get(api.entityFilter, queryParams).then(response => {
if (response.data.result) { if (response.data.result) {
@@ -505,6 +534,10 @@ export default {
d.value = response.data.result[d.column] d.value = response.data.result[d.column]
}) })
this.filterData[0].totalCount = response.data.result.count this.filterData[0].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(1)
this.cleanFilterData(2)
}
break break
} }
case 'app': { case 'app': {
@@ -512,6 +545,10 @@ export default {
d.value = response.data.result[d.column] d.value = response.data.result[d.column]
}) })
this.filterData[1].totalCount = response.data.result.count this.filterData[1].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(0)
this.cleanFilterData(2)
}
break break
} }
case 'domain': { case 'domain': {
@@ -519,6 +556,10 @@ export default {
d.value = response.data.result[d.column] d.value = response.data.result[d.column]
}) })
this.filterData[2].totalCount = response.data.result.count this.filterData[2].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(0)
this.cleanFilterData(1)
}
break break
} }
} }
@@ -616,6 +657,12 @@ export default {
this.entityIpActive = response.data.result this.entityIpActive = response.data.result
} }
}) })
},
cleanFilterData (index) {
this.filterData[index].data.forEach(d => {
d.value = 0
})
this.filterData[index].totalCount = 0
} }
}, },
mounted () { mounted () {

View File

@@ -44,7 +44,7 @@ export default {
}, },
props: { props: {
filterData: Array, filterData: Array,
searchParams: Object, q: String,
timeFilter: Object timeFilter: Object
}, },
data () { data () {
@@ -63,7 +63,7 @@ export default {
const offsetLeft = this.$refs['entityTopTen' + i].offsetLeft const offsetLeft = this.$refs['entityTopTen' + i].offsetLeft
const leftVal = offsetLeft + width const leftVal = offsetLeft + width
const queryParams = { const queryParams = {
q: this.searchParams.q, q: this.q,
entityType: type, entityType: type,
column: item.topColumn, column: item.topColumn,
top: 10, top: 10,

View File

@@ -177,8 +177,8 @@ export default {
} }
}, },
methods: { methods: {
search (q) { search (metaList, formatSql) {
this.$emit('search', { q: q }) this.$emit('search', metaList, formatSql)
}, },
addParams (params) { addParams (params) {
this.$refs.search.addParams(params) this.$refs.search.addParams(params)