knowledge-import.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" width="50%" draggable title="知识导入" destroy-on-close append-to-body @close="close">
  3. <p class="flex-center-align">步骤一:点击 <el-link type="primary" @click="onDownload">下载模板</el-link>,并按格式填写</p>
  4. <p class="flex-center-align mt20">步骤二:上传编辑好的文件</p>
  5. <el-upload
  6. v-model:file-list="fileList"
  7. action="#"
  8. :multiple="false"
  9. ref="uploadListRef"
  10. name="file"
  11. :http-request="onImport"
  12. :show-file-list="false"
  13. class="mt10"
  14. :disabled="state.loading"
  15. >
  16. <el-button type="primary" :loading="state.loading"> <SvgIcon name="ele-Upload" class="mr5" /> 导入知识 </el-button>
  17. </el-upload>
  18. <vxe-tip title="注意" status="error" class="mt10">
  19. <p>1、如需导入分类,请先在分类管理中创建好分类再导入;</p>
  20. <p>2、导入可能需要一段时间,请耐心等待(数据越多越久);</p>
  21. <!-- <p>3、文件大小不超过xxM,导入知识内容不超过xx条</p>-->
  22. </vxe-tip>
  23. </el-dialog>
  24. </template>
  25. <script setup lang="ts">
  26. import { reactive, ref } from 'vue';
  27. import { ElNotification } from 'element-plus';
  28. import { downloadFileByStream } from '@/utils/tools';
  29. import { knowledgeImport, knowledgeTemplate } from '@/api/knowledge';
  30. // 定义子组件向父组件传值/事件
  31. const emit = defineEmits(['updateList']);
  32. // 定义变量内容
  33. const state = reactive<any>({
  34. dialogVisible: false,
  35. ruleForm: {
  36. systemAreaId: null, // 所属区域
  37. systemAreaName: null, // 所属区域名称
  38. street: null, // 所属镇/街
  39. name: null, // 姓名
  40. phoneNumber: null, // 联系方式
  41. gender: 1, // 性别
  42. },
  43. loading: false,
  44. });
  45. // 打开弹窗
  46. const ruleFormRef = ref<RefType>();
  47. const openDialog = () => {
  48. state.dialogVisible = true;
  49. };
  50. // 关闭弹窗
  51. const closeDialog = () => {
  52. state.dialogVisible = false;
  53. };
  54. const close = () => {
  55. ruleFormRef.value?.resetFields();
  56. ruleFormRef.value?.resetFields();
  57. };
  58. // 模板下载
  59. const onDownload = () => {
  60. state.loading = true;
  61. knowledgeTemplate()
  62. .then((res: any) => {
  63. state.loading = false;
  64. downloadFileByStream(res);
  65. })
  66. .catch(() => {
  67. state.loading = false;
  68. });
  69. };
  70. // 导入
  71. const fileList = ref<EmptyArrayType>([]);
  72. const uploadListRef = ref<RefType>(); // 上传组件ref
  73. const onImport = async (file: any) => {
  74. state.loading = true;
  75. let fileObj = file.file; // 相当于input里取得的files
  76. let fd = new FormData(); // FormData 对象
  77. fd.append('file', fileObj); // 文件对象
  78. try {
  79. const { result } = await knowledgeImport(fd);
  80. ElNotification({
  81. title: '导入完成',
  82. message: result,
  83. type: 'success',
  84. });
  85. closeDialog();
  86. emit('updateList');
  87. state.loading = false;
  88. } catch (e) {
  89. console.log(e);
  90. state.loading = false;
  91. }
  92. };
  93. defineExpose({
  94. openDialog,
  95. closeDialog,
  96. });
  97. </script>