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

321 lines
8.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="explorer-search">
<div class="explorer-search__title" v-show="!showList">{{$t('search.title')}}</div>
<div class="explorer-search__input-case" :class="{'explorer-search__input-case--question-mark-in-line': showList}">
<div class="explorer-search__input">
<advanced-search
ref="search"
:column-list="columnList"
:operator-list="operatorList"
:connection-list="connectionList"
:full-text="true"
:class="{'advanced-search--show-list': showList}"
@search="search"
></advanced-search>
</div>
<div class="search-symbol-inline" v-if="showList">
<i class="cn-icon cn-icon-help"></i>
</div>
<div v-else class="explorer-search__foot" v-ele-click-outside="esc">
<div class="foot__item" @click="triggerHistory">
<i class="el-icon-arrow-right" :class="{ 'arrow-rotate': showHistory }" style="padding-right: 5px;"></i>
<span>{{$t('search.searchHistory')}}</span>
</div>
<div class="foot__item">
<span @click="search">{{$t('overall.explore')}}</span>
<el-divider direction="vertical"></el-divider>
<span>{{$t('overall.help')}}</span>
</div>
<transition name="el-zoom-in-top">
<div class="search__history" v-show="showHistory">
<div class="history__items">
<div class="history__item" v-for="(h, i) in history" :key="i" @click="selectHistory(h.sql)">
<span class="item-date">{{h.date}}</span>
<div class="item-value" :title="h.sql">{{h.sql}}</div>
</div>
</div>
<div class="clear-all">
<span @click="clearHistory" v-if="!$_.isEmpty(history)">{{$t('overall.clear')}}</span>
<div v-else>暂无记录</div>
</div>
</div>
</transition>
</div>
</div>
</div>
</template>
<script>
import AdvancedSearch from '@/components/advancedSearch/Index'
import { columnType } from '@/components/advancedSearch/meta/meta'
import SqlParser from '@/components/advancedSearch/meta/sql-parser'
import { storageKey } from '@/utils/constants'
export default {
name: 'CnSearch',
components: {
AdvancedSearch
},
props: {
showList: {
type: Boolean,
default: true
}
},
data () {
return {
columnList: [
{
name: 'entity_type',
type: 'string',
label: 'Entity type'
},
{
name: 'ip_addr',
type: 'string',
label: 'IP.Address'
},
{
name: 'ip_location_country',
type: 'string',
label: 'IP.Country'
},
{
name: 'ip_location_province',
type: 'string',
label: 'IP.Province'
},
{
name: 'ip_location_city',
type: 'string',
label: 'IP.City'
},
{
name: 'ip_asn',
type: 'string',
label: 'IP.ASN'
},
{
name: 'dns_server_role',
type: 'string',
label: 'IP.DNS server role'
},
{
name: 'dns_server_org',
type: 'string',
label: 'IP.DNS server organization'
},
{
name: 'dns_server_os',
type: 'string',
label: 'IP.Operating system'
},
{
name: 'dns_server_software',
type: 'string',
label: 'IP.DNS server software'
},
{
name: 'domain_name',
type: 'string',
label: 'Domain.Name'
},
{
name: 'domain_category',
type: 'string',
label: 'Domain.Category'
},
{
name: 'domain_category_group',
type: 'string',
label: 'Domain.Category group'
},
{
name: 'domain_reputation_level',
type: 'string',
label: 'Domain.Reputation'
},
{
name: 'domain_whois_email',
type: 'string',
label: 'Domain.Whois email'
},
{
name: 'domain_whois_name_servers',
type: 'string',
label: 'Domain.Whois nameserver'
},
{
name: 'domain_whois_registrar',
type: 'string',
label: 'Domain.Whois registrar'
},
{
name: 'domain_whois_org',
type: 'string',
label: 'Domain.Whois organization'
},
{
name: 'domain_whois_address',
type: 'string',
label: 'Domain.Whois address'
},
{
name: 'domain_whois_city',
type: 'string',
label: 'Domain.Whois city'
},
{
name: 'domain_whois_state',
type: 'string',
label: 'Domain.Whois state'
},
{
name: 'domain_whois_country',
type: 'string',
label: 'Domain.Whois country'
},
{
name: 'domain_icp_owner',
type: 'string',
label: 'Domain.ICP owner'
},
{
name: 'domain_icp_company_name',
type: 'string',
label: 'Domain.ICP company'
},
{
name: 'domain_icp_company_type',
type: 'string',
label: 'Domain.ICP company type'
},
{
name: 'domain_icp_site_license',
type: 'string',
label: 'Domain.ICP site license'
},
{
name: 'domain_icp_site_name',
type: 'string',
label: 'Domain.ICP site'
},
{
name: 'app_name',
type: 'string',
label: 'APP.Name'
},
{
name: 'app_id',
type: 'string',
label: 'APP.ID'
},
{
name: 'app_category',
type: 'string',
label: 'APP.Category'
},
{
name: 'app_subcategory',
type: 'string',
label: 'APP.Subcategory'
},
{
name: 'app_risk',
type: 'string',
label: 'APP.Risk'
},
{
name: 'app_description',
type: 'string',
label: 'APP.Description'
},
{
name: 'app_longname',
type: 'string',
label: 'APP.Long name'
},
{
name: 'app_technology',
type: 'string',
label: 'APP.Technology'
}
],
operatorList: ['=', '!=', '>', '<', '>=', '<=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE'],
connectionList: [
{
value: 'AND',
label: 'AND'
},
{
value: 'OR',
label: 'OR'
}
],
showHistory: false,
history: []
}
},
methods: {
search (metaList, formatSql) {
let sql = formatSql
// 加入搜索记录将记录数量控制在30以内
if (sql) {
const oldHistory = localStorage.getItem(storageKey.entitySearchHistory)
let arr = []
const newItem = { sql, date: this.dateFormatByAppearance(new Date()) }
if (!this.$_.isEmpty(oldHistory)) {
const oldArr = JSON.parse(oldHistory)
oldArr.unshift(newItem)
arr = [...oldArr]
if (arr.length > 30) {
arr = arr.slice(0, 30)
}
} else {
arr.push(newItem)
}
localStorage.setItem(storageKey.entitySearchHistory, JSON.stringify(arr))
}
// 全文搜索处理
if (metaList && this.$_.isArray(metaList)) {
const hasFullText = metaList.some(meta => {
return meta.column && meta.column.type === columnType.fullText
})
if (hasFullText) {
const parser = new SqlParser(metaList, this.columnList)
sql = parser.parseMetaToSql(metaList, true)
}
}
this.$emit('search', metaList, sql)
},
addParams (params) {
this.$refs.search.addParams(params)
},
selectHistory (sql) {
this.$refs.search.setSql(sql)
this.showHistory = false
this.$nextTick(() => {
if (this.$refs.search.$refs.textMode) {
this.$refs.search.$refs.textMode.focus()
}
})
},
clearHistory () {
localStorage.setItem(storageKey.entitySearchHistory, '')
this.history = []
},
triggerHistory () {
this.showHistory = !this.showHistory
if (this.showHistory) {
const history = localStorage.getItem(storageKey.entitySearchHistory)
if (!this.$_.isEmpty(history)) {
this.history = JSON.parse(history)
}
}
},
esc () {
this.showHistory = false
}
}
}
</script>