feat: 配置数据导出成表格,多语言翻译
This commit is contained in:
@@ -39,6 +39,21 @@ export function ptContrastAsDefault(params: Record<string, any>) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置数据导出Excel
|
||||||
|
* @param student 仅教师 student
|
||||||
|
* @returns object
|
||||||
|
*/
|
||||||
|
export function ptExport(student: string|undefined) {
|
||||||
|
return request({
|
||||||
|
url: `/pt/neConfigData/export`,
|
||||||
|
method: 'get',
|
||||||
|
params: { student },
|
||||||
|
responseType: 'blob',
|
||||||
|
timeout: 180_000,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 网元参数配置信息
|
* 网元参数配置信息
|
||||||
* @param params 数据 {neType,paramName}
|
* @param params 数据 {neType,paramName}
|
||||||
|
|||||||
@@ -502,6 +502,23 @@ export default {
|
|||||||
updateItemTip: "Confirm updating the data item with Index [{num}]?",
|
updateItemTip: "Confirm updating the data item with Index [{num}]?",
|
||||||
delItemTip: "Confirm deleting the data item with Index [{num}]?",
|
delItemTip: "Confirm deleting the data item with Index [{num}]?",
|
||||||
arrayMore: "Expand",
|
arrayMore: "Expand",
|
||||||
|
ptDiff: 'Comparison Example',
|
||||||
|
ptDiffExample: 'Example Configuration',
|
||||||
|
ptDiffSelf: 'Current Individuals',
|
||||||
|
ptDiffLoad: 'Load More',
|
||||||
|
ptDiffMerge: 'Comparative Differences',
|
||||||
|
ptDiffRest: 'Restore this version',
|
||||||
|
ptHistory: 'History',
|
||||||
|
ptReset: 'Reset To Example',
|
||||||
|
ptLoad: 'Load Current Configuration',
|
||||||
|
ptExport: "Export Excel",
|
||||||
|
ptExportTip: "Exporting NE Configuration Data to an Excel file",
|
||||||
|
ptApplyShow: 'View Student',
|
||||||
|
ptApply: 'request',
|
||||||
|
ptApplyNE: 'Application To NE',
|
||||||
|
ptApplyStu: 'Application To {ne}',
|
||||||
|
ptApplyStuRack: 'Return Request',
|
||||||
|
ptApplyStuNE: 'Application Request',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
|
|||||||
@@ -502,6 +502,23 @@ export default {
|
|||||||
updateItemTip: "确认更新Index为 【{num}】 的数据项?",
|
updateItemTip: "确认更新Index为 【{num}】 的数据项?",
|
||||||
delItemTip: "确认删除Index为 【{num}】 的数据项?",
|
delItemTip: "确认删除Index为 【{num}】 的数据项?",
|
||||||
arrayMore: "展开",
|
arrayMore: "展开",
|
||||||
|
ptDiff: '对比示例',
|
||||||
|
ptDiffExample: '示例配置',
|
||||||
|
ptDiffSelf: '当前个人',
|
||||||
|
ptDiffLoad: '加载更多',
|
||||||
|
ptDiffMerge: '差异对比',
|
||||||
|
ptDiffRest: '还原此版本',
|
||||||
|
ptHistory: '历史记录',
|
||||||
|
ptReset: '重置为示例',
|
||||||
|
ptLoad: '载入当前网元配置',
|
||||||
|
ptExport: "导出Excel",
|
||||||
|
ptExportTip: "导出网元配置数据到Excel文件中",
|
||||||
|
ptApplyShow: '查看学生',
|
||||||
|
ptApply: '申请',
|
||||||
|
ptApplyNE: '应用配置到网元',
|
||||||
|
ptApplyStu: '申请配置应用到 {ne}',
|
||||||
|
ptApplyStuRack: '退回该学生配置',
|
||||||
|
ptApplyStuNE: '应用该学生配置',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ onMounted(() => {
|
|||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<a-button @click="fnGetList()" :loading="state.loading">
|
<a-button @click="fnGetList()" :loading="state.loading">
|
||||||
加载更多
|
{{ t('views.configManage.configParamForm.ptDiffLoad') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -239,7 +239,9 @@ onMounted(() => {
|
|||||||
<a-list-item>
|
<a-list-item>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template #title>差异对比</template>
|
<template #title>
|
||||||
|
{{ t('views.configManage.configParamForm.ptDiffMerge') }}
|
||||||
|
</template>
|
||||||
<a-button type="primary" @click.prevent="fnMergeCellOpen(item)">
|
<a-button type="primary" @click.prevent="fnMergeCellOpen(item)">
|
||||||
<template #icon><MergeCellsOutlined /></template>
|
<template #icon><MergeCellsOutlined /></template>
|
||||||
</a-button>
|
</a-button>
|
||||||
@@ -286,7 +288,7 @@ onMounted(() => {
|
|||||||
@click.prevent="fnMergeCellRestore('old')"
|
@click.prevent="fnMergeCellRestore('old')"
|
||||||
>
|
>
|
||||||
<template #icon><MergeCellsOutlined /></template>
|
<template #icon><MergeCellsOutlined /></template>
|
||||||
还原此版本
|
{{ t('views.configManage.configParamForm.ptDiffRest') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -296,7 +298,7 @@ onMounted(() => {
|
|||||||
@click.prevent="fnMergeCellRestore('new')"
|
@click.prevent="fnMergeCellRestore('new')"
|
||||||
>
|
>
|
||||||
<template #icon><MergeCellsOutlined /></template>
|
<template #icon><MergeCellsOutlined /></template>
|
||||||
还原此版本
|
{{ t('views.configManage.configParamForm.ptDiffRest') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
defineAsyncComponent,
|
defineAsyncComponent,
|
||||||
} from 'vue';
|
} from 'vue';
|
||||||
import { PageContainer } from 'antdv-pro-layout';
|
import { PageContainer } from 'antdv-pro-layout';
|
||||||
import { message } from 'ant-design-vue/lib';
|
import { message, Modal } from 'ant-design-vue/lib';
|
||||||
import { DataNode } from 'ant-design-vue/lib/tree';
|
import { DataNode } from 'ant-design-vue/lib/tree';
|
||||||
import useI18n from '@/hooks/useI18n';
|
import useI18n from '@/hooks/useI18n';
|
||||||
import TableColumnsDnd from '@/components/TableColumnsDnd/index.vue';
|
import TableColumnsDnd from '@/components/TableColumnsDnd/index.vue';
|
||||||
@@ -20,8 +20,13 @@ import useConfigList from './hooks/useConfigList';
|
|||||||
import useConfigArray from './hooks/useConfigArray';
|
import useConfigArray from './hooks/useConfigArray';
|
||||||
import useConfigArrayChild from './hooks/useConfigArrayChild';
|
import useConfigArrayChild from './hooks/useConfigArrayChild';
|
||||||
import { getAllNeConfig } from '@/api/ne/neConfig';
|
import { getAllNeConfig } from '@/api/ne/neConfig';
|
||||||
import { getPtNeConfigData, ptContrastAsDefault } from '@/api/pt/neConfig';
|
import {
|
||||||
|
getPtNeConfigData,
|
||||||
|
ptContrastAsDefault,
|
||||||
|
ptExport,
|
||||||
|
} from '@/api/pt/neConfig';
|
||||||
import { isSystemAdmin, hasRoles } from '@/plugins/auth-user';
|
import { isSystemAdmin, hasRoles } from '@/plugins/auth-user';
|
||||||
|
import saveAs from 'file-saver';
|
||||||
const neInfoStore = useNeInfoStore();
|
const neInfoStore = useNeInfoStore();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { ruleVerification, getConfigSMFByUPFIds, SMFByUPFIdOptions } =
|
const { ruleVerification, getConfigSMFByUPFIds, SMFByUPFIdOptions } =
|
||||||
@@ -401,7 +406,7 @@ function openOpeateDrawer() {
|
|||||||
// 数据与示例比较
|
// 数据与示例比较
|
||||||
const dataDiffState = reactive({
|
const dataDiffState = reactive({
|
||||||
visible: false,
|
visible: false,
|
||||||
title: '对比示例',
|
title: t('views.configManage.configParamForm.ptDiff'),
|
||||||
exampleData: '',
|
exampleData: '',
|
||||||
data: '',
|
data: '',
|
||||||
});
|
});
|
||||||
@@ -421,6 +426,35 @@ function fnDataDiff() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 数据导出Excel
|
||||||
|
function fnDataExport() {
|
||||||
|
Modal.confirm({
|
||||||
|
title: t('common.tipTitle'),
|
||||||
|
content: t('views.configManage.configParamForm.ptExportTip'),
|
||||||
|
onOk() {
|
||||||
|
const hide = message.loading(t('common.loading'), 0);
|
||||||
|
ptExport(classState.student)
|
||||||
|
.then(res => {
|
||||||
|
if (res.code === RESULT_CODE_SUCCESS) {
|
||||||
|
message.success({
|
||||||
|
content: t('common.operateOk'),
|
||||||
|
duration: 2,
|
||||||
|
});
|
||||||
|
saveAs(res.data, `config_data_${Date.now()}.xlsx`);
|
||||||
|
} else {
|
||||||
|
message.error({
|
||||||
|
content: `${res.msg}`,
|
||||||
|
duration: 2,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
hide();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 获取网元网元列表
|
// 获取网元网元列表
|
||||||
neInfoStore.fnNelist().then(res => {
|
neInfoStore.fnNelist().then(res => {
|
||||||
@@ -469,7 +503,10 @@ onMounted(() => {
|
|||||||
>
|
>
|
||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="8" :md="12" :xs="24" v-roles:has="['teacher']">
|
<a-col :lg="8" :md="12" :xs="24" v-roles:has="['teacher']">
|
||||||
<a-form-item label="(教师)查看学生" name="neType ">
|
<a-form-item
|
||||||
|
:label="t('views.configManage.configParamForm.ptApplyShow')"
|
||||||
|
name="neType "
|
||||||
|
>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="classState.student"
|
v-model:value="classState.student"
|
||||||
show-search
|
show-search
|
||||||
@@ -488,9 +525,12 @@ onMounted(() => {
|
|||||||
<a-tag
|
<a-tag
|
||||||
v-if="applyStatus === '0'"
|
v-if="applyStatus === '0'"
|
||||||
color="processing"
|
color="processing"
|
||||||
style="position: absolute; right: 0;}"
|
style="position: absolute; right: 0"
|
||||||
>
|
>
|
||||||
{{ applyStatus && '申请' }}
|
{{
|
||||||
|
applyStatus &&
|
||||||
|
t('views.configManage.configParamForm.ptApply')
|
||||||
|
}}
|
||||||
</a-tag>
|
</a-tag>
|
||||||
</template>
|
</template>
|
||||||
</a-select>
|
</a-select>
|
||||||
@@ -499,6 +539,7 @@ onMounted(() => {
|
|||||||
<a-col :lg="6" :md="12" :xs="24">
|
<a-col :lg="6" :md="12" :xs="24">
|
||||||
<a-form-item>
|
<a-form-item>
|
||||||
<a-space :size="8">
|
<a-space :size="8">
|
||||||
|
<!-- 教师查看学生 -->
|
||||||
<template
|
<template
|
||||||
v-if="
|
v-if="
|
||||||
hasRoles(['teacher']) &&
|
hasRoles(['teacher']) &&
|
||||||
@@ -512,7 +553,7 @@ onMounted(() => {
|
|||||||
"
|
"
|
||||||
:loading="ptConfigState.applyLoading"
|
:loading="ptConfigState.applyLoading"
|
||||||
>
|
>
|
||||||
应用该学生配置
|
{{ t('views.configManage.configParamForm.ptApplyStuNE') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
<a-button
|
<a-button
|
||||||
@click="
|
@click="
|
||||||
@@ -520,7 +561,7 @@ onMounted(() => {
|
|||||||
"
|
"
|
||||||
:loading="ptConfigState.applyLoading"
|
:loading="ptConfigState.applyLoading"
|
||||||
>
|
>
|
||||||
退回该学生配置
|
{{ t('views.configManage.configParamForm.ptApplyStuRack') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -530,14 +571,14 @@ onMounted(() => {
|
|||||||
@click="ptConfigApply(treeState.neType, '2')"
|
@click="ptConfigApply(treeState.neType, '2')"
|
||||||
:loading="ptConfigState.applyLoading"
|
:loading="ptConfigState.applyLoading"
|
||||||
>
|
>
|
||||||
应用配置到网元
|
{{ t('views.configManage.configParamForm.ptApplyNE') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
<a-button
|
<a-button
|
||||||
@click="ptConfigSave(treeState.neType)"
|
@click="ptConfigSave(treeState.neType)"
|
||||||
:loading="ptConfigState.saveLoading"
|
:loading="ptConfigState.saveLoading"
|
||||||
v-roles:has="['admin']"
|
v-roles:has="['admin']"
|
||||||
>
|
>
|
||||||
载入当前网元配置
|
{{ t('views.configManage.configParamForm.ptLoad') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
<a-button
|
<a-button
|
||||||
@click="ptConfigReset(treeState.neType)"
|
@click="ptConfigReset(treeState.neType)"
|
||||||
@@ -545,21 +586,33 @@ onMounted(() => {
|
|||||||
:loading="ptConfigState.restLoading"
|
:loading="ptConfigState.restLoading"
|
||||||
v-roles:has="['teacher']"
|
v-roles:has="['teacher']"
|
||||||
>
|
>
|
||||||
重置为示例
|
{{ t('views.configManage.configParamForm.ptReset') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
|
<a-button @click="fnDataExport()" v-roles:has="['teacher']">
|
||||||
|
{{ t('views.configManage.configParamForm.ptExport') }}
|
||||||
|
</a-button>
|
||||||
|
|
||||||
|
<!-- 学生 -->
|
||||||
<a-button
|
<a-button
|
||||||
@click="ptConfigReset(treeState.neType)"
|
@click="ptConfigReset(treeState.neType)"
|
||||||
:loading="ptConfigState.restLoading"
|
:loading="ptConfigState.restLoading"
|
||||||
v-roles:has="['student']"
|
v-roles:has="['student']"
|
||||||
>
|
>
|
||||||
重置为示例
|
{{ t('views.configManage.configParamForm.ptReset') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
<a-button
|
<a-button
|
||||||
@click="ptConfigApply(treeState.neType, '0')"
|
@click="ptConfigApply(treeState.neType, '0')"
|
||||||
:loading="ptConfigState.applyLoading"
|
:loading="ptConfigState.applyLoading"
|
||||||
v-roles:has="['student']"
|
v-roles:has="['student']"
|
||||||
>
|
>
|
||||||
申请配置应用到 {{ treeState.neType }}
|
{{
|
||||||
|
t('views.configManage.configParamForm.ptApplyStu', {
|
||||||
|
ne: treeState.neType,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
</a-button>
|
||||||
|
<a-button @click="fnDataExport()" v-roles:has="['student']">
|
||||||
|
{{ t('views.configManage.configParamForm.ptExport') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</a-space>
|
</a-space>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
@@ -634,7 +687,9 @@ onMounted(() => {
|
|||||||
<a-space :size="8" align="center" v-show="!treeState.selectLoading">
|
<a-space :size="8" align="center" v-show="!treeState.selectLoading">
|
||||||
<span v-roles:has="['teacher', 'student']">
|
<span v-roles:has="['teacher', 'student']">
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template #title>与示例比较</template>
|
<template #title>
|
||||||
|
{{ t('views.configManage.configParamForm.ptDiff') }}
|
||||||
|
</template>
|
||||||
<a-button
|
<a-button
|
||||||
type="default"
|
type="default"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -647,7 +702,9 @@ onMounted(() => {
|
|||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
</span>
|
</span>
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template #title>历史记录</template>
|
<template #title>
|
||||||
|
{{ t('views.configManage.configParamForm.ptHistory') }}
|
||||||
|
</template>
|
||||||
<a-button
|
<a-button
|
||||||
type="default"
|
type="default"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -1133,8 +1190,12 @@ onMounted(() => {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div style="flex: 1; text-align: center">示例配置</div>
|
<div style="flex: 1; text-align: center">
|
||||||
<div style="flex: 1; text-align: center">当前个人</div>
|
{{ t('views.configManage.configParamForm.ptDiffExample') }}
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1; text-align: center">
|
||||||
|
{{ t('views.configManage.configParamForm.ptDiffSelf') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<CodemirrorEditeDiff
|
<CodemirrorEditeDiff
|
||||||
:old-area="dataDiffState.exampleData"
|
:old-area="dataDiffState.exampleData"
|
||||||
|
|||||||
Reference in New Issue
Block a user