style: 信令分析多语言

This commit is contained in:
TsMask
2023-09-26 10:14:34 +08:00
parent 1d1ec7e1e9
commit ac3a4f2d0e
4 changed files with 98 additions and 33 deletions

View File

@@ -16,6 +16,9 @@ export async function listTraceData(query: Record<string, any>) {
if (query.imsi) { if (query.imsi) {
querySQL += ` and imsi = '${query.imsi}' `; querySQL += ` and imsi = '${query.imsi}' `;
} }
if (query.msisdn) {
querySQL += ` and msisdn = '${query.msisdn}' `;
}
// 分页 // 分页
const pageNum = query.pageNum - 1; const pageNum = query.pageNum - 1;

View File

@@ -162,6 +162,25 @@ export default {
}, },
}, },
trace: { trace: {
analysis: {
imsi: 'IMSI',
imsiPlease: 'Please enter IMSI',
msisdn: 'MSISDN',
msisdnPlease: 'Please enter MSISDN',
trackTaskId: 'Tracking task tag',
srcIp: 'Source IP address',
dstIp: 'Destination IP address',
signalType: 'Signaling type',
msgDirect: 'Message direct',
msgType: 'Message type',
rowTime: 'Record time',
signalData: 'Signaling data',
signalDetail: 'Signaling details',
noData: 'No information content',
taskTitle: "Task {num}",
taskDownText: "Download HTML",
taskDownTip: "Confirm downloading the signaling details HTML file?",
},
pcap: { pcap: {
cardTitle: 'PCAP capture', cardTitle: 'PCAP capture',
neType: 'Type', neType: 'Type',

View File

@@ -131,7 +131,8 @@ export default {
import: '导入', import: '导入',
loadDataConfirm: '确认要重新加载数据吗?', loadDataConfirm: '确认要重新加载数据吗?',
loadData: '更新数据', loadData: '更新数据',
loadDataTip: '成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!', loadDataTip:
'成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!',
num: '放号数', num: '放号数',
batchAddText: '批量新增', batchAddText: '批量新增',
batchDelText: '批量删除', batchDelText: '批量删除',
@@ -144,9 +145,10 @@ export default {
import: '导入', import: '导入',
loadDataConfirm: '确认要重新加载数据吗?', loadDataConfirm: '确认要重新加载数据吗?',
loadData: '更新数据', loadData: '更新数据',
loadDataTip: '成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!', loadDataTip:
num:'删除个数', '成功获取更新数据:{num}条,系统内部进行数据更新,请勿重复点击获取更新!!!',
startIMSI:'起始IMSI', num: '删除个数',
startIMSI: '起始IMSI',
}, },
base5G: { base5G: {
neTypePlease: '查询网元类型', neTypePlease: '查询网元类型',
@@ -162,14 +164,33 @@ export default {
}, },
}, },
trace: { trace: {
analysis: {
imsi: 'IMSI',
imsiPlease: '请输入IMSI',
msisdn: 'MSISDN',
msisdnPlease: '请输入MSISDN',
trackTaskId: '跟踪任务标记',
srcIp: '源IP地址',
dstIp: '目标IP地址',
signalType: '信令类型',
msgDirect: '消息元',
msgType: '消息类型',
rowTime: '记录时间',
signalData: '信令数据',
signalDetail: '信令详情',
noData: '无信息内容',
taskTitle: '任务 {num}',
taskDownText: '下载HTML',
taskDownTip: '确认下载信令详情HTML文件?',
},
pcap: { pcap: {
cardTitle: 'PCAP捕获', cardTitle: 'PCAP捕获',
neType: '网元类型', neType: '网元类型',
neIp: '网元IP地址', neIp: '网元IP地址',
capArg: '抓包参数', capArg: '抓包参数',
capTime: "时长(秒's", capTime: "时长(秒's",
capLog: "执行日志", capLog: '执行日志',
capDownText: "下载PCAP文件", capDownText: '下载PCAP文件',
runText: '执行', runText: '执行',
runTimeText: '执行 {s} 秒', runTimeText: '执行 {s} 秒',
stopText: '中断', stopText: '中断',
@@ -206,12 +227,12 @@ export default {
rangePickerPlease: '请选择任务时间开始结束时间', rangePickerPlease: '请选择任务时间开始结束时间',
comment: '任务说明', comment: '任务说明',
commentPlease: '可输入任务说明', commentPlease: '可输入任务说明',
addTask: "添加任务", addTask: '添加任务',
editTask: "修改任务", editTask: '修改任务',
viewTask: "查看任务", viewTask: '查看任务',
errorTaskInfo: "获取任务信息失败", errorTaskInfo: '获取任务信息失败',
delTask: "成功删除任务 {num}", delTask: '成功删除任务 {num}',
delTaskTip: "确认删除记录编号为 {num} 的数据项?", delTaskTip: '确认删除记录编号为 {num} 的数据项?',
}, },
}, },
}, },

View File

@@ -22,6 +22,8 @@ let title = ref<string>((route.meta.title as string) ?? '标题');
let queryParams = reactive({ let queryParams = reactive({
/**移动号 */ /**移动号 */
imsi: '', imsi: '',
/**移动号 */
msisdn: '',
/**当前页数 */ /**当前页数 */
pageNum: 1, pageNum: 1,
/**每页条数 */ /**每页条数 */
@@ -63,47 +65,47 @@ let tableState: TabeStateType = reactive({
/**表格字段列 */ /**表格字段列 */
let tableColumns: ColumnsType = [ let tableColumns: ColumnsType = [
{ {
title: '跟踪任务标记', title: t('views.trace.analysis.trackTaskId'),
dataIndex: 'taskId', dataIndex: 'taskId',
align: 'center', align: 'center',
}, },
{ {
title: 'IMSI', title: t('views.trace.analysis.imsi'),
dataIndex: 'imsi', dataIndex: 'imsi',
align: 'center', align: 'center',
}, },
{ {
title: 'MSISDN', title: t('views.trace.analysis.msisdn'),
dataIndex: 'msisdn', dataIndex: 'msisdn',
align: 'center', align: 'center',
}, },
{ {
title: '源地址', title: t('views.trace.analysis.srcIp'),
dataIndex: 'srcAddr', dataIndex: 'srcAddr',
align: 'center', align: 'center',
}, },
{ {
title: '目标地址', title: t('views.trace.analysis.dstIp'),
dataIndex: 'dstAddr', dataIndex: 'dstAddr',
align: 'center', align: 'center',
}, },
{ {
title: '信令类型', title: t('views.trace.analysis.signalType'),
dataIndex: 'ifType', dataIndex: 'ifType',
align: 'center', align: 'center',
}, },
{ {
title: '消息类型', title: t('views.trace.analysis.msgType'),
dataIndex: 'msgType', dataIndex: 'msgType',
align: 'center', align: 'center',
}, },
{ {
title: '消息元', title: t('views.trace.analysis.msgDirect'),
dataIndex: 'msgDirect', dataIndex: 'msgDirect',
align: 'center', align: 'center',
}, },
{ {
title: '记录时间', title: t('views.trace.analysis.rowTime'),
dataIndex: 'timestamp', dataIndex: 'timestamp',
align: 'center', align: 'center',
customRender(opt) { customRender(opt) {
@@ -178,10 +180,11 @@ type ModalStateType = {
/**抽屉对象信息状态 */ /**抽屉对象信息状态 */
let modalState: ModalStateType = reactive({ let modalState: ModalStateType = reactive({
visible: false, visible: false,
title: '信令信息', title: '',
from: { from: {
rawData: '', rawData: '',
rawDataHTML: '', rawDataHTML: '',
downBtn: false,
}, },
}); });
@@ -211,11 +214,12 @@ function fnModalVisible(row: Record<string, any>) {
'style="background:#ffffff"' 'style="background:#ffffff"'
); );
modalState.from.rawDataHTML = withoutHiddenElements; modalState.from.rawDataHTML = withoutHiddenElements;
modalState.from.downBtn = true;
} else { } else {
modalState.from.rawDataHTML = '无信息'; modalState.from.rawDataHTML = t('views.trace.analysis.noData');
} }
}); });
modalState.title = `任务 ${row.imsi}`; modalState.title = t('views.trace.analysis.taskTitle', { num: row.imsi });
modalState.visible = true; modalState.visible = true;
} }
@@ -224,6 +228,9 @@ function fnModalVisible(row: Record<string, any>) {
*/ */
function fnModalVisibleClose() { function fnModalVisibleClose() {
modalState.visible = false; modalState.visible = false;
modalState.from.downBtn = false;
modalState.from.rawDataHTML = '';
modalState.from.rawData = '';
} }
// 将Base64编码解码为字节数组 // 将Base64编码解码为字节数组
@@ -286,8 +293,8 @@ function convertToReadableFormat(hexString: string) {
/**信息文件下载 */ /**信息文件下载 */
function fnDownloadFile() { function fnDownloadFile() {
Modal.confirm({ Modal.confirm({
title: '提示', title: t('common.tipTitle'),
content: `确认下载信令详情HTML文件?`, content: t('views.trace.analysis.taskDownTip'),
onOk() { onOk() {
const blob = new Blob([modalState.from.rawDataHTML], { const blob = new Blob([modalState.from.rawDataHTML], {
type: 'text/plain', type: 'text/plain',
@@ -314,11 +321,26 @@ onMounted(() => {
<a-form :model="queryParams" name="queryParams" layout="horizontal"> <a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
<a-form-item label="IMSI" name="imsi"> <a-form-item
:placeholder="t('views.trace.analysis.imsi')"
name="imsi"
>
<a-input <a-input
v-model:value="queryParams.imsi" v-model:value="queryParams.imsi"
:allow-clear="true" :allow-clear="true"
placeholder="查询IMSI" :placeholder="t('views.trace.analysis.imsiPlease')"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item
:placeholder="t('views.trace.analysis.msisdn')"
name="imsi"
>
<a-input
v-model:value="queryParams.msisdn"
:allow-clear="true"
:placeholder="t('views.trace.analysis.msisdnPlease')"
></a-input> ></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
@@ -415,14 +437,14 @@ onMounted(() => {
</a-table> </a-table>
</a-card> </a-card>
<!-- 新增框或修改 --> <!-- 详情 -->
<a-modal <a-modal
width="800px" width="800px"
:title="modalState.title" :title="modalState.title"
:visible="modalState.visible" :visible="modalState.visible"
@cancel="fnModalVisibleClose" @cancel="fnModalVisibleClose"
> >
<div class="raw-title">信令数据</div> <div class="raw-title">{{ t('views.trace.analysis.signalData') }}</div>
<a-row <a-row
class="raw" class="raw"
:gutter="16" :gutter="16"
@@ -435,17 +457,17 @@ onMounted(() => {
</a-row> </a-row>
<a-divider /> <a-divider />
<div class="raw-title"> <div class="raw-title">
信令详情 {{ t('views.trace.analysis.signalDetail') }}
<a-button <a-button
type="dashed" type="dashed"
size="small" size="small"
@click.prevent="fnDownloadFile" @click.prevent="fnDownloadFile"
v-if="modalState.from.rawDataHTML !== '无信息'" v-if="modalState.from.downBtn"
> >
<template #icon> <template #icon>
<DownloadOutlined /> <DownloadOutlined />
</template> </template>
下载HTML {{ t('views.trace.analysis.taskDownText') }}
</a-button> </a-button>
</div> </div>
<div class="raw-html" v-html="modalState.from.rawDataHTML"></div> <div class="raw-html" v-html="modalState.from.rawDataHTML"></div>