Upload.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <el-dialog v-model="state.dialogVisible" width="50%" draggable title="录音上传">
  3. <el-upload
  4. class="upload-demo"
  5. v-model:file-list="fileList"
  6. :action="action"
  7. :multiple="true"
  8. :accept="fileTypeAccept"
  9. :on-exceed="handleExceed"
  10. ref="uploadListRef"
  11. name="fileData"
  12. :on-change="handleChangeFile"
  13. :on-success="updateSuccess"
  14. :disabled="uploadingDisabled"
  15. :on-error="onUploadError"
  16. :limit="fileLimit"
  17. :on-remove="handRemove"
  18. :before-upload="beforeUpload"
  19. drag
  20. >
  21. <SvgIcon name="ele-UploadFilled" size="42px" />
  22. <div class="el-upload__text">点击或将文件拖拽到这里上传</div>
  23. <template #tip>
  24. <div class="el-upload__tip">大小限制:20M</div>
  25. </template>
  26. </el-upload>
  27. <template #footer>
  28. <span class="dialog-footer">
  29. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  30. <el-button type="primary" @click="onSave" :loading="loading">保 存</el-button>
  31. </span>
  32. </template>
  33. </el-dialog>
  34. </template>
  35. <script setup lang="ts" name="parameterAdd">
  36. import { computed, reactive, ref } from 'vue';
  37. import { useAppConfig } from '@/stores/appConfig';
  38. import { storeToRefs } from 'pinia';
  39. import { ElMessage, UploadFile, UploadFiles, UploadUserFile } from 'element-plus';
  40. import Other from '@/utils/other';
  41. import { uploadRecordSave } from '@/api/tels/uploadRecord';
  42. // 定义子组件向父组件传值/事件
  43. const emit = defineEmits(['updateList']);
  44. // 定义变量内容
  45. const state = reactive<any>({
  46. dialogVisible: false,
  47. ruleForm: {
  48. settingName: '', // 参数名称
  49. code: '', // 参数
  50. settingValue: '', // 参数值
  51. sort: 1, // 排序
  52. remark: '', // 参数说明
  53. },
  54. });
  55. const appConfigStore = useAppConfig();
  56. const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
  57. const fileTypeAccept = AppConfigInfo.value?.fileExt;
  58. const action = computed(() => {
  59. return import.meta.env.VITE_API_UPLOAD_URL + '/file/upload?source=hotline';
  60. // return 'http://171.94.154.2:50105/hlfs/file/upload?source=hotline';
  61. });
  62. const fileList = ref<EmptyArrayType>([]);
  63. const uploadListRef = ref<RefType>(); // 上传组件ref
  64. // 格式化数据
  65. const formatData = (data: any) => {
  66. return data.map((v: any) => {
  67. return {
  68. name: v.name,
  69. fileName: v.name,
  70. additions: v?.response?.result.id,
  71. path: v?.response?.result?.path,
  72. publicity: v?.publicity ? 1 : 0,
  73. classify: '录音上传',
  74. url: import.meta.env.VITE_API_UPLOAD_URL + v?.response?.result?.path,
  75. allPath: import.meta.env.VITE_API_UPLOAD_URL + v?.response?.result?.path,
  76. };
  77. });
  78. };
  79. // 更新数据
  80. const transformData = ref<EmptyArrayType>([]);
  81. const updateData = () => {
  82. transformData.value = formatData(Other.deepClone(fileList.value));
  83. };
  84. //文件限制
  85. const fileLimit = ref(10);
  86. const handleExceed = (files: any, uploadFiles: UploadUserFile[]) => {
  87. ElMessage.warning(`当前限制最多上传 ${fileLimit.value} 个文件,已经上传了${uploadFiles.length}个文件,本次选择了 ${files.length} 个文件。`);
  88. setTimeout(() => {
  89. uploadLoading.value = false; // 模拟上传过程
  90. uploadingDisabled.value = false;
  91. }, 100);
  92. };
  93. //限制文件大小
  94. const handleChangeFile = (file: any, fileList: any) => {
  95. //限制上传文件大小
  96. setTimeout(() => {
  97. updateData();
  98. }, 100);
  99. if (!file) return;
  100. const isLt2M = file.size / 1024 / 1024 < 20;
  101. if (!isLt2M) {
  102. const currIdx = fileList.indexOf(file);
  103. fileList.splice(currIdx, 1);
  104. ElMessage.warning(`文件超过了最大限度 20MB!`);
  105. setTimeout(() => {
  106. uploadLoading.value = false; // 模拟上传过程
  107. uploadingDisabled.value = false;
  108. }, 100);
  109. return false;
  110. }
  111. };
  112. // 删除文件
  113. const handRemove = () => {
  114. setTimeout(() => {
  115. updateData();
  116. }, 100);
  117. };
  118. // 上传失败
  119. const onUploadError = (error: Error, uploadFile: UploadFile) => {
  120. try {
  121. const errMessage = JSON.parse(error.message)?.message ?? `文件 ${uploadFile.name} 上传失败`;
  122. // 从文件列表中移除失败的文件
  123. fileList.value = fileList.value.filter((item) => item.response);
  124. console.error(`文件 ${uploadFile.name} 上传失败`);
  125. ElMessage.error(errMessage);
  126. } catch (e) {
  127. ElMessage.error(`文件 ${uploadFile.name} 上传失败`);
  128. }
  129. setTimeout(() => {
  130. updateData();
  131. uploadLoading.value = false; // 模拟上传过程
  132. uploadingDisabled.value = false;
  133. }, 100);
  134. };
  135. const uploadLoading = ref(false);
  136. const uploadingDisabled = ref(false);
  137. const beforeUpload = () => {
  138. uploadLoading.value = true; // 模拟上传过程
  139. uploadingDisabled.value = true;
  140. };
  141. // 上传成功
  142. const updateSuccess = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
  143. if (response.result.path) {
  144. fileList.value = uploadFiles;
  145. setTimeout(() => {
  146. updateData();
  147. uploadLoading.value = false;
  148. uploadingDisabled.value = false;
  149. }, 100);
  150. } else {
  151. uploadListRef.value.handleRemove(uploadFile);
  152. ElMessage.error('上传失败');
  153. }
  154. };
  155. let loading = ref<boolean>(false); // 加载状态
  156. // 打开弹窗
  157. const ruleFormRef = ref<RefType>();
  158. const openDialog = async () => {
  159. ruleFormRef.value?.resetFields();
  160. try {
  161. state.dialogVisible = true;
  162. } catch (error) {
  163. console.log(error);
  164. }
  165. };
  166. // 关闭弹窗
  167. const closeDialog = () => {
  168. state.dialogVisible = false;
  169. };
  170. // 保存
  171. const onSave = () => {
  172. uploadRecordSave(transformData.value)
  173. .then(() => {
  174. ElMessage.success('保存成功');
  175. closeDialog();
  176. emit('updateList');
  177. })
  178. .catch((err: any) => {
  179. console.log(err, 'err');
  180. closeDialog();
  181. });
  182. };
  183. // 暴露变量
  184. defineExpose({
  185. openDialog,
  186. closeDialog,
  187. });
  188. </script>