This commit is contained in:
2023-11-28 19:42:50 +08:00
23 changed files with 411 additions and 125 deletions

View File

@@ -1330,11 +1330,7 @@ onMounted(() => {
<!-- 多列数据渲染 -->
<template #bodyCell="{ column, text, record }">
<template v-if="column?.key === 'index'">
<a-space
:size="16"
align="center"
v-if="!['read-only', 'ro'].includes(text.access)"
>
<a-space :size="16" align="center">
<a-tooltip>
<template #title>{{ t('common.editText') }}</template>
<a-button type="link" @click.prevent="arrayEdit(text)">
@@ -1423,11 +1419,7 @@ onMounted(() => {
</template>
<template #bodyCell="{ column, text, record }">
<template v-if="column?.key === 'index'">
<a-space
:size="8"
align="center"
v-if="!['read-only', 'ro'].includes(text.access)"
>
<a-space :size="8" align="center">
<a-tooltip>
<template #title>{{ t('common.editText') }}</template>
<a-button
@@ -1519,6 +1511,7 @@ onMounted(() => {
<template #title v-if="item.comment">
{{ item.comment }}
</template>
<div>
<div
v-if="
@@ -1529,7 +1522,7 @@ onMounted(() => {
<a-input-number
v-if="item['type'] === 'int'"
v-model:value="modalState.from[item.name]['value']"
:disabled="item.name === 'index'"
:disabled="['read-only', 'ro'].includes(item.access)"
style="width: 100%"
></a-input-number>
<a-switch
@@ -1537,10 +1530,12 @@ onMounted(() => {
v-model:checked="modalState.from[item.name]['value']"
:checked-children="t('common.switch.open')"
:un-checked-children="t('common.switch.shut')"
:disabled="['read-only', 'ro'].includes(item.access)"
></a-switch>
<a-select
v-else-if="item['type'] === 'enum'"
v-model:value="modalState.from[item.name]['value']"
:disabled="['read-only', 'ro'].includes(item.access)"
:allow-clear="true"
style="width: 100%"
>
@@ -1555,7 +1550,7 @@ onMounted(() => {
<a-input
v-else
v-model:value="modalState.from[item.name]['value']"
:disabled="item.name === 'index'"
:disabled="['read-only', 'ro'].includes(item.access)"
></a-input>
</div>
<div v-else>

View File

@@ -1,13 +1,16 @@
<script setup lang="ts">
import { reactive, ref, onMounted, toRaw } from 'vue';
import { PageContainer } from '@ant-design-vue/pro-layout';
import { message } from 'ant-design-vue/lib';
import { Modal, message } from 'ant-design-vue/lib';
import CodemirrorEdite from '@/components/CodemirrorEdite/index.vue';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeInfoStore from '@/store/modules/neinfo';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import useI18n from '@/hooks/useI18n';
import { getMMLByNE, sendMMlByNE } from '@/api/mmlManage/neOperate';
import { transferToNeFile } from '@/api/mmlManage/neOperate';
import { uploadFileChunk } from '@/api/tool/file';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
const { t } = useI18n();
/**网元参数 */
@@ -48,6 +51,7 @@ let state: StateType = reactive({
param: [],
},
from: {
uploadLoading: false,
sendLoading: false,
},
autoCompleteValue: '',
@@ -88,7 +92,7 @@ function fnSendMML() {
return;
}
let cmdStr = '';
let cmdArr: string[] = [];
const operation = state.mmlSelect.operation;
const object = state.mmlSelect.object;
// 根据参数取值
@@ -126,6 +130,7 @@ function fnSendMML() {
// 拼装命令
const argsStr = argsArr.join(',');
let cmdStr = '';
if (object && argsStr) {
cmdStr = `${operation} ${object} ${argsStr}`;
} else if (object) {
@@ -133,35 +138,76 @@ function fnSendMML() {
} else {
cmdStr = `${operation} ${argsStr}`;
}
cmdStr = cmdStr.trim();
cmdArr = [cmdStr.trim()];
}
if (cmdStr) {
state.autoCompleteValue = cmdStr;
if (cmdArr.length > 0) {
state.autoCompleteValue = cmdArr[0];
} else {
let value = state.autoCompleteValue;
if (value.indexOf('\n') !== -1) {
value = value.replace(/(\r\n|\n)/g, ';');
}
cmdStr = value;
cmdArr = value.split(';');
}
// 发送
state.mmlCmdLog += `${cmdStr}\n`;
state.mmlCmdLog += `${cmdArr.join('\n')}\n`;
state.from.sendLoading = true;
const [neType, neId] = state.neType;
sendMMlByNE(neType, neId, cmdStr).then(res => {
sendMMlByNE(neType, neId, cmdArr).then(res => {
state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) {
let resultStr = res.data;
resultStr = resultStr.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${resultStr}\n`;
let resultArr = res.data;
for (const str of resultArr) {
const logStr = str.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${logStr}\n`;
}
} else {
state.mmlCmdLog += `${res.msg}\n`;
}
});
}
/**上传变更 */
function fnUpload(up: UploadRequestOption, name: string) {
Modal.confirm({
title: t('common.tipTitle'),
content: t('views.mmlManage.uploadFileTip'),
onOk() {
const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true;
uploadFileChunk(up.file as File, 5, 'import')
.then(res => {
// 文件上传
if (res.code === RESULT_CODE_SUCCESS) {
const [neType, neId] = state.neType;
return transferToNeFile({
uploadPath: res.data.fileName,
neType: neType,
neId: neId,
});
} else {
return res;
}
})
.then(res => {
// 文件转存
if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('views.mmlManage.uploadFileOk'), 3);
state.from[name] = res.data;
} else {
message.error(res.msg, 3);
}
})
.finally(() => {
state.from.uploadLoading = false;
hide();
});
},
});
}
/**规则校验 */
function ruleVerification(
row: Record<string, any>,
@@ -588,6 +634,29 @@ onMounted(() => {
{{ k }}
</a-select-option>
</a-select>
<a-input-group compact v-else-if="item.type === 'file'">
<a-input
v-model:value="state.from[item.name]"
style="width: calc(100% - 32px)"
/>
<a-upload
name="file"
list-type="text"
:accept="item.filter"
:max-count="1"
:show-upload-list="false"
:custom-request="v => fnUpload(v, item.name)"
>
<a-button
type="primary"
:loading="state.from.uploadLoading"
>
<template #icon>
<UploadOutlined />
</template>
</a-button>
</a-upload>
</a-input-group>
<a-input
v-else
v-model:value="state.from[item.name]"

View File

@@ -1,13 +1,16 @@
<script setup lang="ts">
import { reactive, ref, onMounted, toRaw } from 'vue';
import { PageContainer } from '@ant-design-vue/pro-layout';
import { message } from 'ant-design-vue/lib';
import { Modal, message } from 'ant-design-vue/lib';
import CodemirrorEdite from '@/components/CodemirrorEdite/index.vue';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeInfoStore from '@/store/modules/neinfo';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import useI18n from '@/hooks/useI18n';
import { getMMLByOMC, sendMMlByOMC } from '@/api/mmlManage/omcOperate';
import { transferToNeFile } from '@/api/mmlManage/neOperate';
import { uploadFileChunk } from '@/api/tool/file';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
const { t } = useI18n();
/**网元参数 */
@@ -45,6 +48,7 @@ let state: StateType = reactive({
param: [],
},
from: {
uploadLoading: false,
sendLoading: false,
},
autoCompleteValue: '',
@@ -85,7 +89,7 @@ function fnSendMML() {
return;
}
let cmdStr = '';
let cmdArr: string[] = [];
const operation = state.mmlSelect.operation;
const object = state.mmlSelect.object;
// 根据参数取值
@@ -123,6 +127,7 @@ function fnSendMML() {
// 拼装命令
const argsStr = argsArr.join(',');
let cmdStr = '';
if (object && argsStr) {
cmdStr = `${operation} ${object}:${argsStr}`;
} else if (object) {
@@ -130,34 +135,74 @@ function fnSendMML() {
} else {
cmdStr = `${operation} ${argsStr}`;
}
cmdStr = cmdStr.trim();
cmdArr = [cmdStr.trim()];
}
if (cmdStr) {
state.autoCompleteValue = cmdStr;
if (cmdArr.length > 0) {
state.autoCompleteValue = cmdArr[0];
} else {
let value = state.autoCompleteValue;
if (value.indexOf('\n') !== -1) {
value = value.replace(/(\r\n|\n)/g, ';');
}
cmdStr = value;
cmdArr = value.split(';');
}
// 发送
state.mmlCmdLog += `${cmdStr}\n`;
state.mmlCmdLog += `${cmdArr.join('\n')}\n`;
state.from.sendLoading = true;
sendMMlByOMC(state.neId, cmdStr).then(res => {
sendMMlByOMC(state.neId, cmdArr).then(res => {
state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) {
let resultStr = res.data;
resultStr = resultStr.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${resultStr}\n`;
let resultArr = res.data;
for (const str of resultArr) {
const logStr = str.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${logStr}\n`;
}
} else {
state.mmlCmdLog += `${res.msg}\n`;
}
});
}
/**上传变更 */
function fnUpload(up: UploadRequestOption, name: string) {
Modal.confirm({
title: t('common.tipTitle'),
content: t('views.mmlManage.uploadFileTip'),
onOk() {
const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true;
uploadFileChunk(up.file as File, 5, 'import')
.then(res => {
// 文件上传
if (res.code === RESULT_CODE_SUCCESS) {
return transferToNeFile({
uploadPath: res.data.fileName,
neType: 'OMC',
neId: state.neId,
});
} else {
return res;
}
})
.then(res => {
// 文件转存
if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('views.mmlManage.uploadFileOk'), 3);
state.from[name] = res.data;
} else {
message.error(res.msg, 3);
}
})
.finally(() => {
state.from.uploadLoading = false;
hide();
});
},
});
}
/**规则校验 */
function ruleVerification(
row: Record<string, any>,
@@ -563,6 +608,29 @@ onMounted(() => {
{{ k }}
</a-select-option>
</a-select>
<a-input-group compact v-else-if="item.type === 'file'">
<a-input
v-model:value="state.from[item.name]"
style="width: calc(100% - 32px)"
/>
<a-upload
name="file"
list-type="text"
:accept="item.filter"
:max-count="1"
:show-upload-list="false"
:custom-request="v => fnUpload(v, item.name)"
>
<a-button
type="primary"
:loading="state.from.uploadLoading"
>
<template #icon>
<UploadOutlined />
</template>
</a-button>
</a-upload>
</a-input-group>
<a-input
v-else
v-model:value="state.from[item.name]"

View File

@@ -1,13 +1,16 @@
<script setup lang="ts">
import { reactive, ref, onMounted, toRaw } from 'vue';
import { PageContainer } from '@ant-design-vue/pro-layout';
import { message } from 'ant-design-vue/lib';
import { Modal, message } from 'ant-design-vue/lib';
import CodemirrorEdite from '@/components/CodemirrorEdite/index.vue';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeInfoStore from '@/store/modules/neinfo';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import useI18n from '@/hooks/useI18n';
import { getMMLByUDM, sendMMlByUDM } from '@/api/mmlManage/udmOperate';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import { uploadFileChunk } from '@/api/tool/file';
import { transferToNeFile } from '@/api/mmlManage/neOperate';
const { t } = useI18n();
/**网元参数 */
@@ -45,6 +48,7 @@ let state: StateType = reactive({
param: [],
},
from: {
uploadLoading: false,
sendLoading: false,
},
autoCompleteValue: '',
@@ -85,7 +89,7 @@ function fnSendMML() {
return;
}
let cmdStr = '';
let cmdArr: string[] = [];
const operation = state.mmlSelect.operation;
const object = state.mmlSelect.object;
// 根据参数取值
@@ -123,6 +127,7 @@ function fnSendMML() {
// 拼装命令
const argsStr = argsArr.join(',');
let cmdStr = '';
if (object && argsStr) {
cmdStr = `${operation} ${object}:${argsStr}`;
} else if (object) {
@@ -130,34 +135,74 @@ function fnSendMML() {
} else {
cmdStr = `${operation} ${argsStr}`;
}
cmdStr = cmdStr.trim();
cmdArr = [cmdStr.trim()];
}
if (cmdStr) {
state.autoCompleteValue = cmdStr;
if (cmdArr.length > 0) {
state.autoCompleteValue = cmdArr[0];
} else {
let value = state.autoCompleteValue;
if (value.indexOf('\n') !== -1) {
value = value.replace(/(\r\n|\n)/g, ';');
}
cmdStr = value;
cmdArr = value.split(';');
}
// 发送
state.mmlCmdLog += `${cmdStr}\n`;
state.mmlCmdLog += `${cmdArr.join('\n')}\n`;
state.from.sendLoading = true;
sendMMlByUDM(state.neId, cmdStr).then(res => {
sendMMlByUDM(state.neId, cmdArr).then(res => {
state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) {
let resultStr = res.data;
resultStr = resultStr.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${resultStr}\n`;
let resultArr = res.data;
for (const str of resultArr) {
const logStr = str.replace(/(\r\n|\n)/g, '\n');
state.mmlCmdLog += `${logStr}\n`;
}
} else {
state.mmlCmdLog += `${res.msg}\n`;
}
});
}
/**上传变更 */
function fnUpload(up: UploadRequestOption, name: string) {
Modal.confirm({
title: t('common.tipTitle'),
content: t('views.mmlManage.uploadFileTip'),
onOk() {
const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true;
uploadFileChunk(up.file as File, 5, 'import')
.then(res => {
// 文件上传
if (res.code === RESULT_CODE_SUCCESS) {
return transferToNeFile({
uploadPath: res.data.fileName,
neType: 'UDM',
neId: state.neId,
});
} else {
return res;
}
})
.then(res => {
// 文件转存
if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('views.mmlManage.uploadFileOk'), 3);
state.from[name] = res.data;
} else {
message.error(res.msg, 3);
}
})
.finally(() => {
state.from.uploadLoading = false;
hide();
});
},
});
}
/**规则校验 */
function ruleVerification(
row: Record<string, any>,
@@ -563,6 +608,29 @@ onMounted(() => {
{{ k }}
</a-select-option>
</a-select>
<a-input-group compact v-else-if="item.type === 'file'">
<a-input
v-model:value="state.from[item.name]"
style="width: calc(100% - 32px)"
/>
<a-upload
name="file"
list-type="text"
:accept="item.filter"
:max-count="1"
:show-upload-list="false"
:custom-request="v => fnUpload(v, item.name)"
>
<a-button
type="primary"
:loading="state.from.uploadLoading"
>
<template #icon>
<UploadOutlined />
</template>
</a-button>
</a-upload>
</a-input-group>
<a-input
v-else
v-model:value="state.from[item.name]"

View File

@@ -75,7 +75,7 @@ type TabeStateType = {
/**表格状态 */
let tableState: TabeStateType = reactive({
loading: false,
size: 'middle',
size: 'small',
striped: false,
seached: true,
data: [],
@@ -88,19 +88,19 @@ let tableColumns: ColumnsType = [
dataIndex: 'imsi',
align: 'left',
sorter: true,
width: 200,
width: 150,
},
{
title: 'AMF',
dataIndex: 'amf',
align: 'center',
minWidth: 100,
align: 'left',
width: 100,
},
{
title: 'Status',
dataIndex: 'status',
align: 'center',
minWidth: 100,
align: 'left',
width: 100,
},
// {
// title: 'KI',
@@ -117,14 +117,13 @@ let tableColumns: ColumnsType = [
{
title: 'Algo Index',
dataIndex: 'algoIndex',
align: 'center',
minWidth: 100,
align: 'left',
width: 100,
},
{
title: t('common.operate'),
key: 'imsi',
align: 'center',
width: 100,
align: 'left',
},
];
@@ -1275,6 +1274,7 @@ onMounted(() => {
:hidden="!uploadImportState.msg"
:value="uploadImportState.msg"
:auto-size="{ minRows: 2, maxRows: 8 }"
style="background-color: transparent; color: rgba(0, 0, 0, 0.85)"
/>
</template>
</UploadModal>

View File

@@ -57,7 +57,7 @@ type TabeStateType = {
/**表格状态 */
let tableState: TabeStateType = reactive({
loading: false,
size: 'middle',
size: 'small',
striped: false,
seached: true,
data: [],
@@ -81,7 +81,7 @@ let tableColumns: ColumnsType = [
{
title: 'NodeB Name',
dataIndex: 'name',
align: 'center',
align: 'left',
width: 2,
},
{
@@ -292,7 +292,7 @@ onMounted(() => {
:size="tableState.size"
:row-class-name="fnTableStriped"
:pagination="tablePagination"
:scroll="{ x: 1000, y: 400 }"
:scroll="{ y: 450 }"
>
</a-table>
</a-card>

View File

@@ -78,7 +78,7 @@ type TabeStateType = {
/**表格状态 */
let tableState: TabeStateType = reactive({
loading: false,
size: 'middle',
size: 'small',
striped: false,
seached: true,
data: [],
@@ -111,55 +111,54 @@ let tableColumns: ColumnsType = [
{
title: 'Subscribed AMBR Temp',
dataIndex: 'ambr',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'Subscribed SNSSAIs Temp',
dataIndex: 'sar',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'RAT Restriction',
dataIndex: 'rat',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'Forbidden Areas Temp',
dataIndex: 'arfb',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'Service Area Restrict Temp',
dataIndex: 'nssai',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'CN Type Restriction',
dataIndex: 'cn',
align: 'center',
minWidth: 100,
},
{
title: 'Subscribed Data',
dataIndex: 'smData',
align: 'center',
minWidth: 100,
align: 'left',
width: 200,
},
{
title: 'EPS Flag',
dataIndex: 'epsFlag',
align: 'center',
minWidth: 100,
align: 'left',
width: 100,
},
{
title: 'Subscribed Data',
dataIndex: 'smData',
align: 'left',
},
{
title: t('common.operate'),
key: 'imsi',
align: 'center',
align: 'left',
fixed: 'right',
width: 100,
},
@@ -2067,6 +2066,7 @@ onMounted(() => {
:hidden="!uploadImportState.msg"
:value="uploadImportState.msg"
:auto-size="{ minRows: 2, maxRows: 8 }"
style="background-color: transparent; color: rgba(0, 0, 0, 0.85)"
/>
</template>
</UploadModal>

View File

@@ -30,6 +30,12 @@ let queryParams = reactive({
neType: '',
/**记录时间 */
beginTime: '',
/**任务ID */
taskId: '',
/**排序字段 */
sortField: 'value',
/**排序方式 */
sortOrder: 'asc',
endTime: '',
/**当前页数 */
pageNum: 1,
@@ -43,6 +49,8 @@ function fnQueryReset() {
neType: '',
beginTime: '',
endTime: '',
sortField: 'value',
sortOrder: 'asc',
pageNum: 1,
pageSize: 20,
});
@@ -108,34 +116,31 @@ let tableColumns: ColumnsType = [
{
title: t('views.perfManage.perfData.value'),
dataIndex: 'value',
key: 'value',
align: 'center',
sorter: (a: any, b: any) => {
return 1;
},
sorter: true,
},
{
title: t('views.perfManage.perfData.startTime'),
dataIndex: 'startTime',
key: 'start_time',
align: 'center',
customRender(opt) {
if (!opt.value) return '';
return parseDateToStr(opt.value);
},
sorter: (a: any, b: any) => {
return 1;
},
sorter: true,
},
{
title: t('views.perfManage.perfData.endTime'),
dataIndex: 'endTime',
align: 'center',
key: 'end_time',
customRender(opt) {
if (!opt.value) return '';
return parseDateToStr(opt.value);
},
sorter: (a: any, b: any) => {
return 1;
},
sorter: true,
},
];
@@ -176,7 +181,7 @@ function fnTableSize({ key }: MenuInfo) {
function fnGetList(pageNum?: number) {
if (tableState.loading) return;
tableState.loading = true;
if(pageNum){
if (pageNum) {
queryParams.pageNum = pageNum;
}
if (!queryRangePicker.value) {
@@ -193,6 +198,18 @@ function fnGetList(pageNum?: number) {
});
}
/**表格分页、排序、筛选变化时触发操作, 排序方式,取值为 ascend descend */
function fnTableChange(pagination: any, filters: any, sorter: any, extra: any) {
const { columnKey, order } = sorter;
if (order) {
queryParams.sortField = columnKey;
queryParams.sortOrder = order.replace('end', '');
} else {
queryParams.sortOrder = 'asc';
}
fnGetList(1);
}
onMounted(() => {
// 初始字典数据
Promise.allSettled([getDict('alarm_status')]).then(resArr => {
@@ -217,8 +234,11 @@ onMounted(() => {
<!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24">
<a-form-item :label="t('views.perfManage.perfData.type')" name="neType">
<a-col :lg="4" :md="12" :xs="24">
<a-form-item
:label="t('views.perfManage.perfData.type')"
name="neType"
>
<a-auto-complete
v-model:value="queryParams.neType"
:options="useNeInfoStore().getNeSelectOtions"
@@ -226,8 +246,21 @@ onMounted(() => {
/>
</a-form-item>
</a-col>
<a-col :lg="8" :md="12" :xs="24">
<a-form-item :label="t('views.perfManage.perfData.startTime')" name="queryRangePicker">
<a-col :lg="4" :md="12" :xs="24">
<a-form-item
:label="t('views.perfManage.perfData.taskId')"
name="taskId"
>
<a-input v-model:value="queryParams.taskId" allow-clear></a-input>
</a-form-item>
</a-col>
<a-col :lg="10" :md="12" :xs="24">
<a-form-item
:label="t('views.perfManage.perfData.startTime')"
name="queryRangePicker"
>
<a-range-picker
v-model:value="queryRangePicker"
allow-clear
@@ -316,6 +349,7 @@ onMounted(() => {
:data-source="tableState.data"
:size="tableState.size"
:pagination="tablePagination"
@change="fnTableChange"
:scroll="{ x: true }"
>
<template #bodyCell="{ column, record }">

View File

@@ -1,16 +1,13 @@
<script lang="ts" setup>
import { Modal, message } from 'ant-design-vue/lib';
import { onMounted, reactive } from 'vue';
import useAppStore from '@/store/modules/app';
import useI18n from '@/hooks/useI18n';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { transferHelpDoc } from '@/api/index';
import { uploadFileChunk } from '@/api/tool/file';
import { FileType } from 'ant-design-vue/lib/upload/interface';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import { sessionGet } from '@/utils/cache-session-utils';
import { useRouter } from 'vue-router';
const appStore = useAppStore();
const router = useRouter();
const { t, currentLocale, optionsLocale } = useI18n();
@@ -99,6 +96,16 @@ function fnSave() {
});
}
/**系统使用手册跳转 */
function fnClickHelpDoc(language?: string) {
const routeData = router.resolve({ name: 'HelpDoc' });
let href = routeData.href;
if (language) {
href = `${routeData.href}?language=${language}`;
}
window.open(href, '_blank');
}
onMounted(() => {
state.language = currentLocale.value;
});
@@ -168,11 +175,7 @@ onMounted(() => {
{{ opt.label }}
</a-select-option>
</a-select>
<a-button
type="link"
:href="'/help?language=' + state.language"
target="_blank"
>
<a-button type="link" @click="fnClickHelpDoc(state.language)">
<template #icon>
<QuestionCircleOutlined />
{{ t('views.system.setting.sysHelpDocOpen') }}

View File

@@ -1501,6 +1501,7 @@ onMounted(() => {
:hidden="!uploadImportState.msg"
:value="uploadImportState.msg"
:auto-size="{ minRows: 2, maxRows: 8 }"
style="background-color: transparent; color: rgba(0, 0, 0, 0.85)"
/>
</template>
</UploadModal>