mobile.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <div class="basic-file">
  3. <el-upload action="uploadUrl"
  4. :http-request="uploadFile"
  5. :show-file-list="false"
  6. :file-list="fileList"
  7. :before-upload="beforeUpload"
  8. :multiple="multiple"
  9. :accept="accept"
  10. :disabled="disabled">
  11. <el-button type="primary" :disabled="disabled">上传</el-button>
  12. <el-button v-if="formwork.length>0" @click="downloadFormwork">下载模板</el-button>
  13. <template #tip>
  14. <div class="basic-file__tip">{{limitTip}}</div>
  15. </template>
  16. </el-upload>
  17. <template v-for="(file,index) in fileList" :key="index">
  18. <file-row :file="file"
  19. :config="securityConfig"
  20. :depend-on-values="dependOnValues"
  21. :remove-code="securityConfig.removeCode"
  22. :removable="securityConfig.removable ?? true"
  23. @after-remove="removeFile"></file-row>
  24. </template>
  25. </div>
  26. </template>
  27. <script>
  28. import { ElUpload, ElButton } from 'element-plus'
  29. import FileRow from './file-row'
  30. import { formInputProps, fromInputEmits } from '../../form-input-props'
  31. import { useFormInput } from '@cip/components/hooks/form-input'
  32. import { uploadProps, download, fileTypeList } from './upload'
  33. import { computed } from 'vue'
  34. import CipMessage from '@cip/components/cip-message'
  35. export default {
  36. props: formInputProps,
  37. emits: [...fromInputEmits],
  38. components: { FileRow, ElUpload, ElButton },
  39. setup (props, context) {
  40. const { securityConfig } = useFormInput(props, context)
  41. const { fileList, mainMessage, countLimit, typeLimit, sizeLimit, ...uploadUtils } = uploadProps(props, context)
  42. const multiple = computed(() => {
  43. return securityConfig.value.multiple ?? true
  44. })
  45. // 限制提示语
  46. const limitTip = computed(() => {
  47. const { fileType, size } = securityConfig.value
  48. if (!!fileType && !!size) return `只能上传${fileType}文件,且不超过${size}MB`
  49. if (!!fileType && !size) return `只能上传${fileType}文件`
  50. if (!fileType && !!size) return `只能上传不超过${size}MB的文件`
  51. return ''
  52. })
  53. // 验证文件是否可以上传
  54. const beforeUpload = (file) => {
  55. const errorMessage = securityConfig.value.customLimit && securityConfig.value.customLimit(file)
  56. if (errorMessage) {
  57. CipMessage.error(errorMessage)
  58. return false
  59. }
  60. if (mainMessage(typeLimit(file), '文件上传类型超出限制') ||
  61. mainMessage(countLimit(file), '文件上传数量超出限制') ||
  62. mainMessage(sizeLimit(file), '文件上传大小超出限制')
  63. ) {
  64. return false
  65. }
  66. }
  67. // 根据数量控制新增按钮
  68. const isAppend = computed(() => {
  69. return (securityConfig.value.limit ?? Infinity) > fileList.value.length
  70. })
  71. const formwork = computed(() => {
  72. return securityConfig.value.formwork ?? []
  73. })
  74. const accept = computed(() => {
  75. if (securityConfig.value.ignoreFileType) {
  76. return '*/*'
  77. }
  78. const fileType = securityConfig.value.fileType || fileTypeList.join(',')
  79. return '.' + fileType.replace(/,\s?/g, ',.')
  80. })
  81. const downloadFormwork = (e) => {
  82. e.stopPropagation()
  83. download(formwork.value[0])
  84. }
  85. return { ...uploadUtils, accept, fileList, beforeUpload, multiple, isAppend, limitTip, formwork, downloadFormwork, securityConfig }
  86. }
  87. }
  88. </script>
  89. <style lang="less">
  90. // 不加width 100%会导致宽度坍塌
  91. .basic-file{
  92. width: 100%;
  93. &__tip{
  94. word-break: break-all;
  95. line-height: 20px;
  96. }
  97. }
  98. </style>