diff --git a/src/api/trace/analysis.ts b/src/api/trace/analysis.ts deleted file mode 100644 index 592340ac..00000000 --- a/src/api/trace/analysis.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; -import { request } from '@/plugins/http-fetch'; -import { parseObjLineToHump } from '@/utils/parse-utils'; - -/** - * 查询信令列表 - * @param query 查询参数 - * @returns object - */ -export async function listTraceData(query: Record) { - let totalSQL = 'select count(*) as total from trace_data where 1=1 '; - let rowsSQL = 'select * from trace_data where 1=1 '; - - // 查询 - let querySQL = ''; - if (query.imsi) { - querySQL += ` and imsi like '%${query.imsi}%' `; - } - if (query.msisdn) { - querySQL += ` and msisdn like '%${query.msisdn}%' `; - } - - // 分页 - const pageNum = (query.pageNum - 1) * query.pageSize; - const limtSql = ` limit ${pageNum},${query.pageSize} `; - - // 发起请求 - const result = await request({ - url: `/api/rest/databaseManagement/v1/omc_db/trace_data`, - method: 'get', - params: { - totalSQL: totalSQL + querySQL, - rowsSQL: rowsSQL + querySQL + limtSql, - }, - }); - - // 解析数据 - if (result.code === RESULT_CODE_SUCCESS) { - const data: DataList = { - total: 0, - rows: [], - code: result.code, - msg: result.msg, - }; - result.data.data.forEach((item: any) => { - const itemData = item['trace_data']; - if (Array.isArray(itemData)) { - if (itemData.length === 1 && itemData[0]['total'] >= 0) { - data.total = itemData[0]['total']; - } else { - data.rows = itemData.map(v => parseObjLineToHump(v)); - } - } - }); - return data; - } - return result; -} - -/** - * 信令数据解析HTML - * @param id 任务ID - * @returns - */ -export function getTraceRawInfo(id: Record) { - return request({ - url: `/api/rest/traceManagement/v1/decMessage/${id}`, - method: 'get', - responseType: 'text', - }); -} diff --git a/src/api/trace/packet.ts b/src/api/trace/packet.ts index dd6c2535..66aea213 100644 --- a/src/api/trace/packet.ts +++ b/src/api/trace/packet.ts @@ -62,3 +62,18 @@ export function packetKeep(taskNo: string, duration: number = 120) { data: { taskNo, duration }, }); } + +/** + * 信令跟踪文件 + * @param taskNo 对象 + * @returns object + */ +export function packetPCAPFile(taskNo: string) { + return request({ + url: '/trace/packet/filePull', + method: 'get', + params: { taskNo }, + responseType: 'blob', + timeout: 680_000, + }); +} diff --git a/src/api/trace/task.ts b/src/api/trace/task.ts index 089a3567..6d4a6235 100644 --- a/src/api/trace/task.ts +++ b/src/api/trace/task.ts @@ -1,6 +1,4 @@ -import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { request } from '@/plugins/http-fetch'; -import { parseObjLineToHump } from '@/utils/parse-utils'; /** * 查询跟踪任务列表 @@ -81,24 +79,26 @@ export function filePullTask(traceId: string) { } /** - * 获取网元跟踪接口列表 + * 跟踪任务数据列表 + * @param query 查询参数 * @returns object */ -export async function getNeTraceInterfaceAll() { - // 发起请求 - const result = await request({ - url: `/api/rest/databaseManagement/v1/elementType/omc_db/objectType/ne_info`, +export async function listTraceData(query: Record) { + return request({ + url: '/trace/data/list', + method: 'get', + params: query, + }); +} + +/** + * 查询跟踪任务数据信息 + * @param id ID + * @returns object + */ +export async function getTraceData(id: string | number) { + return request({ + url: `/trace/data/${id}`, method: 'get', - params: { - SQL: `SELECT ne_type,interface FROM trace_info GROUP BY ne_type,interface`, - }, }); - // 解析数据 - if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) { - let data = result.data.data[0]; - return Object.assign(result, { - data: parseObjLineToHump(data['trace_info']), - }); - } - return result; } diff --git a/src/store/modules/neinfo.ts b/src/store/modules/neinfo.ts index ebe158ee..13bab5ee 100644 --- a/src/store/modules/neinfo.ts +++ b/src/store/modules/neinfo.ts @@ -2,7 +2,6 @@ import { defineStore } from 'pinia'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { listAllNeInfo } from '@/api/ne/neInfo'; import { parseDataToOptions } from '@/utils/parse-tree-utils'; -import { getNeTraceInterfaceAll } from '@/api/trace/task'; import { getNePerformanceList } from '@/api/perfManage/taskManage'; /**网元信息类型 */ @@ -13,8 +12,6 @@ type NeInfo = { neCascaderOptions: Record[]; /**选择器单级父类型 */ neSelectOtions: Record[]; - /**跟踪接口列表 */ - traceInterfaceList: Record[]; /**性能测量数据集 */ perMeasurementList: Record[]; }; @@ -24,7 +21,6 @@ const useNeInfoStore = defineStore('neinfo', { neList: [], neCascaderOptions: [], neSelectOtions: [], - traceInterfaceList: [], perMeasurementList: [], }), getters: { @@ -61,7 +57,7 @@ const useNeInfoStore = defineStore('neinfo', { const res = await listAllNeInfo({ bandStatus: false, }); - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { + if (res.code === RESULT_CODE_SUCCESS) { // 原始列表 this.neList = JSON.parse(JSON.stringify(res.data)); @@ -79,24 +75,6 @@ const useNeInfoStore = defineStore('neinfo', { } return res; }, - // 刷新跟踪接口列表 - async fnRefreshNeTraceInterface() { - this.traceInterfaceList = []; - const res = await this.fnNeTraceInterface(); - return res; - }, - // 获取跟踪接口列表 - async fnNeTraceInterface() { - // 有数据不请求 - if (this.traceInterfaceList.length > 0) { - return { code: 1, data: this.traceInterfaceList, msg: 'success' }; - } - const res = await getNeTraceInterfaceAll(); - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { - this.traceInterfaceList = res.data; - } - return res; - }, // 获取性能测量数据集列表 async fnNeTaskPerformance() { // 有数据不请求 @@ -104,7 +82,7 @@ const useNeInfoStore = defineStore('neinfo', { return { code: 1, data: this.perMeasurementList, msg: 'success' }; } const res = await getNePerformanceList(); - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { + if (res.code === RESULT_CODE_SUCCESS) { this.perMeasurementList = res.data; } return res; diff --git a/src/views/traceManage/pcap/file.vue b/src/views/traceManage/pcap/file.vue index 8a627141..45ad526e 100644 --- a/src/views/traceManage/pcap/file.vue +++ b/src/views/traceManage/pcap/file.vue @@ -334,7 +334,7 @@ function fnDrawerOpen(row: Record) { onMounted(() => { // 获取网元网元列表 neInfoStore.fnNelist().then(res => { - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { + if (res.code === RESULT_CODE_SUCCESS) { if (res.data.length === 0) { message.warning({ content: t('common.noData'), @@ -424,16 +424,6 @@ onMounted(() => { diff --git a/src/views/traceManage/task-hlr/index.vue b/src/views/traceManage/task-hlr/index.vue index c986e840..581e618e 100644 --- a/src/views/traceManage/task-hlr/index.vue +++ b/src/views/traceManage/task-hlr/index.vue @@ -212,13 +212,14 @@ function fnGetList(pageNum?: number) { queryParams.startTime = queryRangePicker.value[0]; queryParams.endTime = queryRangePicker.value[1]; listTaskHLR(toRaw(queryParams)).then(res => { - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) { + if (res.code === RESULT_CODE_SUCCESS) { // 取消勾选 if (tableState.selectedRowKeys.length > 0) { tableState.selectedRowKeys = []; } - tablePagination.total = res.total; - tableState.data = res.rows; + const { total, rows } = res.data; + tablePagination.total = total; + tableState.data = rows; if ( tablePagination.total <= (queryParams.pageNum - 1) * tablePagination.pageSize && @@ -729,7 +730,7 @@ onMounted(() => { - + @@ -749,7 +750,7 @@ onMounted(() => { - + diff --git a/src/views/traceManage/task/analyze.vue b/src/views/traceManage/task/analyze.vue index 1cee75c4..16aae17c 100644 --- a/src/views/traceManage/task/analyze.vue +++ b/src/views/traceManage/task/analyze.vue @@ -1,35 +1,32 @@ @@ -154,8 +567,9 @@ onBeforeUnmount(() => { :loading="!state.initialized" :body-style="{ padding: '12px' }" > -
- + + -
- - {{ state.currentFilter }} - - Matched Frame: {{ state.totalFrames }} -
- - - - - - -
- - - - - - - - Filter - - - + + - - - + + + + + @@ -268,15 +658,15 @@ onBeforeUnmount(() => { @@ -289,24 +679,20 @@ onBeforeUnmount(() => { diff --git a/src/views/traceManage/task/index.vue b/src/views/traceManage/task/index.vue index 9ce96c24..43ae3eda 100644 --- a/src/views/traceManage/task/index.vue +++ b/src/views/traceManage/task/index.vue @@ -20,7 +20,7 @@ import { updateTraceTask, } from '@/api/trace/task'; import useDictStore from '@/store/modules/dict'; -import { regExpIPv4, regExpPort } from '@/utils/regular-utils'; +import { regExpIPv4 } from '@/utils/regular-utils'; import dayjs, { Dayjs } from 'dayjs'; import { parseObjHumpToLine } from '@/utils/parse-utils'; const neInfoStore = useNeInfoStore(); @@ -33,8 +33,11 @@ const route = useRoute(); let dict: { /**跟踪类型 */ traceType: DictType[]; + /**跟踪接口 */ + traceInterfaces: DictType[]; } = reactive({ traceType: [], + traceInterfaces: [], }); /**网元类型_多neId */ @@ -98,40 +101,28 @@ let tableState: TabeStateType = reactive({ /**表格字段列 */ let tableColumns: ColumnsType = [ - { - title: t('views.ne.common.neType'), - dataIndex: 'neType', - align: 'left', - sorter: { - compare: (a, b) => 1, - multiple: 1, - }, - }, - { - title: t('views.ne.common.neId'), - dataIndex: 'neId', - align: 'left', - }, { title: t('views.traceManage.task.traceId'), dataIndex: 'traceId', align: 'left', + width: 150, }, { title: t('views.traceManage.task.trackType'), dataIndex: 'traceType', key: 'traceType', align: 'left', + width: 150, }, { title: t('views.traceManage.task.startTime'), dataIndex: 'startTime', align: 'left', + width: 200, customRender(opt) { if (!opt.value) return ''; return parseDateToStr(opt.value); }, - sorter: true, }, { title: t('views.traceManage.task.endTime'), @@ -141,6 +132,7 @@ let tableColumns: ColumnsType = [ if (!opt.value) return ''; return parseDateToStr(opt.value); }, + width: 200, }, { title: t('common.operate'), @@ -246,13 +238,14 @@ function fnGetList(pageNum?: number) { queryParams.pageNum = pageNum; } listTraceTask(toRaw(queryParams)).then(res => { - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) { + if (res.code === RESULT_CODE_SUCCESS) { // 取消勾选 if (tableState.selectedRowKeys.length > 0) { tableState.selectedRowKeys = []; } - tablePagination.total = res.total; - tableState.data = res.rows; + const { total, rows } = res.data; + tablePagination.total = total; + tableState.data = rows; if ( tablePagination.total <= (queryParams.pageNum - 1) * tablePagination.pageSize && @@ -273,18 +266,15 @@ type ModalStateType = { /**标题 */ title: string; /**网元类型设备对象 */ - neType: string[]; + neType: any[] | undefined; /**网元类型设备对象接口 */ - neTypeInterface: Record[]; - /**网元类型设备对象接口选择 */ - neTypeInterfaceSelect: string[]; + neTypeInterface: string[]; /**任务开始结束时间 */ - timeRangePicker: [string, string]; + timeRangePicker: [Dayjs, Dayjs] | undefined; /**表单数据 */ from: { id?: string; - neType: string; - neId: string; + neList: string; // 网元列表 neType_neId 例如 UDM_001,AMF_001 /**1-Interface,2-Device,3-User */ traceType: string; startTime?: number; @@ -311,13 +301,11 @@ let modalState: ModalStateType = reactive({ title: '', neType: [], neTypeInterface: [], - neTypeInterfaceSelect: [], - timeRangePicker: ['', ''], + timeRangePicker: undefined, from: { - id: '', - neType: '', - neId: '', - traceId: '', + id: undefined, + neList: '', + traceId: undefined, traceType: '3', startTime: undefined, endTime: undefined, @@ -329,8 +317,8 @@ let modalState: ModalStateType = reactive({ dstIp: '', signalPort: undefined, /**3用户跟踪 */ - imsi: '', - msisdn: '', + imsi: undefined, + // msisdn: undefined, }, confirmLoading: false, }); @@ -345,7 +333,7 @@ const modalStateFrom = Form.useForm( message: t('views.traceManage.task.trackTypePlease'), }, ], - neId: [ + neList: [ { required: true, message: t('views.ne.common.neTypePlease'), @@ -392,43 +380,48 @@ const modalStateFrom = Form.useForm( message: t('views.traceManage.task.dstIpPlease'), }, ], - signalPort: [ - { - required: false, - pattern: regExpPort, - message: t('views.traceManage.task.signalPortPlease'), - }, - ], }) ); /**网元类型选择对应修改 */ -function fnNeChange(_: any, item: any) { - modalState.from.neType = item[1].neType; - modalState.from.neId = item[1].neId; - // 网元信令接口可选列表 - modalState.from.interfaces = ''; - modalState.neTypeInterfaceSelect = []; - fnSelectInterfaceInit(item[1].neType); -} - -/**跟踪类型选择对应修改 */ -function fnTraceTypeChange(v: any, _: any) { - // 网元信令接口可选列表 - if (v === '1' && modalState.from.neType) { - modalState.from.interfaces = ''; - modalState.neTypeInterfaceSelect = []; - fnSelectInterfaceInit(modalState.from.neType); +function fnNeChange(p: any, c: any) { + let neList: string[] = []; + for (let i = 0; i < p.length; i++) { + const v = p[i]; + if (v.length === 1) { + c[i][0].children.forEach((item: any) => { + neList.push(`${item.neType}_${item.neId}`); + }); + } else if (v.length === 2) { + neList.push(`${v[0]}_${v[1]}`); + } + } + if (neList.length > 0) { + modalState.from.neList = neList.join(','); + } else { + modalState.from.neList = ''; } } /**开始结束时间选择对应修改 */ function fnRangePickerChange(item: any, _: any) { - modalState.from.startTime = +item[0]; - modalState.from.endTime = +item[1]; + if (!item || item.length !== 2) { + modalState.from.startTime = undefined; + modalState.from.endTime = undefined; + return; + } + // 获取当前时间 + const now = dayjs(); + // 如果开始时间小于当前时间,则设置为当前时间 + const startTime = item[0].isBefore(now) ? now : item[0]; + const endTime = item[1].isBefore(now) ? now : item[1]; + modalState.timeRangePicker = [startTime, endTime]; + + modalState.from.startTime = startTime.valueOf(); + modalState.from.endTime = endTime.valueOf(); } function fnRangePickerDisabledDate(current: Dayjs) { - return current && current < dayjs().subtract(1, 'day').endOf('day'); + return current && current < dayjs().startOf('day'); } /**信令接口选择对应修改 */ @@ -436,19 +429,6 @@ function fnSelectInterface(s: any, _: any) { modalState.from.interfaces = s.join(','); } -/**信令接口选择初始 */ -function fnSelectInterfaceInit(neType: string) { - const interfaces = neInfoStore.traceInterfaceList; - modalState.neTypeInterface = interfaces - .filter(i => i.neType === neType) - .map(i => { - return { - value: i.interface, - label: i.interface, - }; - }); -} - /** * 对话框弹出显示为 新增或者修改 * @param noticeId 网元id, 不传为新增 @@ -466,20 +446,45 @@ function fnModalOpenByEdit(id?: string) { modalState.confirmLoading = false; hide(); if (res.code === RESULT_CODE_SUCCESS && res.data) { - modalState.neType = [res.data.neType, res.data.neId]; - modalState.timeRangePicker = [res.data.startTime, res.data.endTime]; - modalState.from = Object.assign(modalState.from, res.data); - // 接口 - if (res.data.traceType === 'Interface') { - if ( - res.data.interfaces.length > 4 && - res.data.interfaces.includes('[') - ) { - modalState.neTypeInterfaceSelect = JSON.parse(res.data.interfaces); + // 回显网元类型 + const neType: any[] = []; + const neList = res.data.neList.split(','); + const neListMap: any = {}; + for (const v of neList) { + const item: string[] = v.split('_'); + if (!neListMap[item[0]]) { + neListMap[item[0]] = []; } - fnSelectInterfaceInit(res.data.neType); + neListMap[item[0]].push(item[1]); } - modalState.title = t('views.traceManage.task.editTask'); + for (const op of neCascaderOptions.value) { + const arr = neListMap[op.value]; + if (!arr) { + continue; + } + const all = op.children.every((c: any) => { + return arr.includes(c.neId); + }); + if (all) { + neType.push([op.value]); + } else { + arr.forEach((v: string) => { + neType.push([op.value, v]); + }); + } + } + modalState.neType = neType; + // 回显时间 + modalState.timeRangePicker = [ + dayjs(res.data.startTime), + dayjs(res.data.endTime), + ]; + // 回显接口 + if (res.data.traceType === '1') { + modalState.neTypeInterface = res.data.interfaces.split(','); + } + modalState.from = Object.assign(modalState.from, res.data); + modalState.title = t('views.traceManage.task.viewTask'); modalState.openByEdit = true; } else { message.error(t('views.traceManage.task.errorTaskInfo'), 3); @@ -494,15 +499,15 @@ function fnModalOpenByEdit(id?: string) { */ function fnModalOk() { const from = toRaw(modalState.from); - let valids = ['traceType', 'neId', 'endTime']; + let valids = ['traceType', 'neList', 'endTime']; if (from.traceType === '1') { valids = valids.concat(['interfaces']); } if (from.traceType === '2') { - valids = valids.concat(['srcIp', 'dstIp', 'signalPort']); + valids = valids.concat(['srcIp', 'dstIp']); } if (from.traceType === '3') { - valids = valids.concat(['imsi', 'msisdn']); + valids = valids.concat(['imsi']); } modalStateFrom @@ -545,46 +550,48 @@ function fnModalCancel() { modalState.openByEdit = false; modalState.confirmLoading = false; modalStateFrom.resetFields(); - modalState.timeRangePicker = ['', '']; - modalState.neTypeInterfaceSelect = []; modalState.neType = []; modalState.neTypeInterface = []; + modalState.timeRangePicker = undefined; } -/**跳转PCAP文件详情页面 */ -function fnRecordPCAPView(row: Record) { +/**跳转内嵌详情页面 */ +function fnRecordView(traceId: any, type: 'analyze' | 'data') { router.push({ - path: `${route.path}${MENU_PATH_INLINE}/analyze`, - query: { - traceId: row.traceId, - }, + path: `${route.path}${MENU_PATH_INLINE}/${type}`, + query: { traceId }, }); } onMounted(() => { // 初始字典数据 - Promise.allSettled([getDict('trace_type')]).then(resArr => { - if (resArr[0].status === 'fulfilled') { - dict.traceType = resArr[0].value; + Promise.allSettled([getDict('trace_type'), getDict('trace_interfaces')]).then( + resArr => { + if (resArr[0].status === 'fulfilled') { + dict.traceType = resArr[0].value; + } + if (resArr[1].status === 'fulfilled') { + dict.traceInterfaces = resArr[1].value; + } } - }); + ); // 获取网元网元列表 useNeInfoStore() .fnNelist() .then(res => { - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { + if (res.code === RESULT_CODE_SUCCESS) { if (res.data.length > 0) { // 过滤不可用的网元 neCascaderOptions.value = neInfoStore.getNeSelectOtions.filter( (item: any) => { - return ['UDM'].includes(item.value); + return ['AMF', 'AUSF', 'SMF', 'UDM', 'PCF'].includes(item.value); } ); if (neCascaderOptions.value.length === 0) { message.warning({ content: t('common.noData'), - duration: 2, + duration: 3, }); return; } @@ -592,13 +599,11 @@ onMounted(() => { } else { message.warning({ content: t('common.noData'), - duration: 2, + duration: 3, }); } }) .finally(() => { - // 获取跟踪接口列表 - neInfoStore.fnNeTraceInterface(); // 获取列表数据 fnGetList(); }); @@ -764,21 +769,40 @@ onMounted(() => { @@ -990,12 +998,12 @@ onMounted(() => { - + - { - + - + --> diff --git a/src/views/traceManage/tshark/hooks/usePCAP.ts b/src/views/traceManage/tshark/hooks/usePCAP.ts index 36eeb0a1..d9c16e0a 100644 --- a/src/views/traceManage/tshark/hooks/usePCAP.ts +++ b/src/views/traceManage/tshark/hooks/usePCAP.ts @@ -31,11 +31,11 @@ type StateType = { /**当前选中的帧编号 */ selectedFrame: number; /**当前选中的帧数据 */ - selectedPacket: { tree: any[]; data_sources: any[] }; + packetFrame: { tree: any[]; data_sources: any[] }; /**pcap包帧数据 */ - packetFrameData: Map | null; - /**当前选中的帧数据-空占位 */ - selectedTreeEntry: typeof NO_SELECTION; + packetFrameTreeMap: Map | null; + /**当前选中的帧数据 */ + selectedTree: typeof NO_SELECTION; /**选择帧的Dump数据标签 */ selectedDataSourceIndex: number; /**处理完成状态 */ @@ -69,11 +69,11 @@ export function usePCAP() { filter: '', filterError: null, currentFilter: '', - selectedFrame: 1, + selectedFrame: 0, /**当前选中的帧数据 */ - selectedPacket: { tree: [], data_sources: [] }, - packetFrameData: null, // 注意:Map 需要额外处理 - selectedTreeEntry: NO_SELECTION, // NO_SELECTION 需要定义 + packetFrame: { tree: [], data_sources: [] }, + packetFrameTreeMap: null, // 注意:Map 需要额外处理 + selectedTree: NO_SELECTION, // NO_SELECTION 需要定义 /**选择帧的Dump数据标签 */ selectedDataSourceIndex: 0, /**处理完成状态 */ @@ -91,9 +91,9 @@ export function usePCAP() { state.nextPageNum = 1; // 选择帧的数据 state.selectedFrame = 0; - state.selectedPacket = { tree: [], data_sources: [] }; - state.packetFrameData = null; - state.selectedTreeEntry = NO_SELECTION; + state.packetFrame = { tree: [], data_sources: [] }; + state.packetFrameTreeMap = null; + state.selectedTree = NO_SELECTION; state.selectedDataSourceIndex = 0; } @@ -121,23 +121,23 @@ export function usePCAP() { } /**帧数据点击选中 */ - function handleSelectedTreeEntry(e: any) { - console.log('fnSelectedTreeEntry', e); - state.selectedTreeEntry = e; + function handleSelectedTree(e: any) { + // console.log('fnSelectedTree', e); + state.selectedTree = e; } /**报文数据点击选中 */ function handleSelectedFindSelection(src_idx: number, pos: number) { - console.log('fnSelectedFindSelection', pos); - if (state.packetFrameData == null) return; + // console.log('fnSelectedFindSelection', pos); + if (state.packetFrameTreeMap == null) return; // find the smallest one let current = null; - for (let [k, pp] of state.packetFrameData) { + for (let [k, pp] of state.packetFrameTreeMap) { if (pp.idx !== src_idx) continue; if (pos >= pp.start && pos <= pp.start + pp.length) { if ( current != null && - state.packetFrameData.get(current).length > pp.length + state.packetFrameTreeMap.get(current).length > pp.length ) { current = k; } else { @@ -146,19 +146,19 @@ export function usePCAP() { } } if (current != null) { - state.selectedTreeEntry = state.packetFrameData.get(current); + state.selectedTree = state.packetFrameTreeMap.get(current); } } /**包数据表点击选中 */ function handleSelectedFrame(no: number) { - console.log('fnSelectedFrame', no, state.totalFrames); + // console.log('fnSelectedFrame', no, state.totalFrames); state.selectedFrame = no; wk.send({ type: 'select', number: state.selectedFrame }); } /**包数据表滚动底部加载 */ function handleScrollBottom() { const totalFetched = state.packetFrames.length; - console.log('fnScrollBottom', totalFetched); + // console.log('fnScrollBottom', totalFetched); if (!state.nextPageLoad && totalFetched < state.totalFrames) { state.nextPageLoad = true; state.nextPageNum++; @@ -167,7 +167,7 @@ export function usePCAP() { } /**包数据表过滤 */ function handleFilterFrames() { - console.log('fnFilterFinish', state.filter); + // console.log('fnFilterFinish', state.filter); wk.send({ type: 'check-filter', filter: state.filter }); } /**包数据表加载 */ @@ -254,9 +254,9 @@ export function usePCAP() { } break; case 'selected': - state.selectedPacket = res.data; - state.packetFrameData = parseFrameData('root', res.data); - state.selectedTreeEntry = NO_SELECTION; + state.packetFrame = res.data; + state.packetFrameTreeMap = parseFrameData('root', res.data); + state.selectedTree = NO_SELECTION; state.selectedDataSourceIndex = 0; break; case 'processed': @@ -306,7 +306,7 @@ export function usePCAP() { return { state, - handleSelectedTreeEntry, + handleSelectedTree, handleSelectedFindSelection, handleSelectedFrame, handleScrollBottom, diff --git a/src/views/traceManage/tshark/index.vue b/src/views/traceManage/tshark/index.vue index cc3b78dc..a888fb71 100644 --- a/src/views/traceManage/tshark/index.vue +++ b/src/views/traceManage/tshark/index.vue @@ -8,11 +8,12 @@ import DissectionDump from './components/DissectionDump.vue'; import PacketTable from './components/PacketTable.vue'; import { usePCAP, NO_SELECTION } from './hooks/usePCAP'; import { parseSizeFromFile } from '@/utils/parse-utils'; +import { parseDateToStr } from '@/utils/date-utils'; import useI18n from '@/hooks/useI18n'; const { t } = useI18n(); const { state, - handleSelectedTreeEntry, + handleSelectedTree, handleSelectedFindSelection, handleSelectedFrame, handleScrollBottom, @@ -49,8 +50,9 @@ function fnUpload(up: UploadRequestOption) { :loading="!state.initialized" :body-style="{ padding: '12px' }" > -
- + + + + - - - + + + + - + @@ -163,15 +202,15 @@ function fnUpload(up: UploadRequestOption) { @@ -184,17 +223,6 @@ function fnUpload(up: UploadRequestOption) {