index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <div class="upload">
  3. <el-upload v-model:file-list="fileList" :class="{ hide: fileList.length >= limit }" :accept="accept" list-type="picture-card" :limit="limit" :data="{ source }" :multiple="multiple" :headers="headers" :before-upload="beforeAvatarUpload" :action="uploadUrl"
  4. :on-success="updateImg" :on-preview="handlePictureCardPreview" :on-remove="updateImg">
  5. <el-icon>
  6. <ele-Plus />
  7. </el-icon>
  8. </el-upload>
  9. <el-dialog v-model="dialogVisible">
  10. <el-image class="preview" :src="dialogImageUrl" alt="Preview Image" />
  11. </el-dialog>
  12. <!-- 上传单张图片 -->
  13. <!-- <uploadVue @set-img="youImg=$event" ></uploadVue> -->
  14. <!-- 上传多长图片 需增加limit属性,设定图片最多张数 -->
  15. <!-- <uploadVue @set-imgs="youImgs=$event" :limit="2"></uploadVue> -->
  16. <!-- 上传单张图片,img属性可以恢复表单图片显示 -->
  17. <!-- <uploadVue img="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" @set-img="youImg=$event"></uploadVue> -->
  18. <!-- 上传多张图片,imgs属性可以恢复表单图片多图显示 需增加limit属性,设定图片最多张数 -->
  19. <!-- <uploadVue :imgs="['https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png']" @set-imgs="youImgs=$event" :limit="2"></uploadVue> -->
  20. </div>
  21. </template>
  22. <script lang="ts" setup>
  23. import { ref, PropType, watch } from 'vue'
  24. import { ElMessage } from 'element-plus'
  25. import type { UploadProps } from 'element-plus'
  26. import getOrigin from '/@/utils/origin'
  27. import { getToken } from "/@/utils/auth";
  28. const uploadUrl: string = getOrigin(import.meta.env.VITE_API_URL + '/common/singleImg')
  29. const headers = {
  30. Authorization: 'Bearer ' + getToken(),
  31. }
  32. const emit = defineEmits(['setImg', 'setImgs'])
  33. const source = localStorage.uploadFileWay
  34. const props = defineProps({
  35. multiple: {
  36. type: Boolean,
  37. default: false,
  38. },
  39. widthHost: {
  40. type: Boolean,
  41. default: true,
  42. },
  43. accept: {
  44. type: String,
  45. default: '.jpg,.png,.jpeg,.gif',
  46. },
  47. limit: {
  48. type: Number,
  49. default: 1,
  50. },
  51. imgs: {
  52. type: Array as PropType<string[]>,
  53. default: () => [],
  54. },
  55. img: {
  56. type: String,
  57. default: '',
  58. },
  59. // keyName: {
  60. // type: String,
  61. // default: '',
  62. // },
  63. })
  64. const fileList = ref<any[]>([
  65. // {
  66. // name: '',
  67. // url: '',
  68. // },
  69. ])
  70. const updateImg = (res?: any) => {
  71. if (res && res.code !== undefined && res.code !== 0) {
  72. return ElMessage.error(res.message)
  73. }
  74. const list = fileList.value.map((item) => {
  75. if (item.response) {
  76. return item.response?.data?.full_path
  77. } else {
  78. return item.url
  79. }
  80. })
  81. if (props.limit === 1) {
  82. const img = list[0]
  83. if (!img) {
  84. emit('setImg', '');
  85. return;
  86. }
  87. emit('setImg', img);
  88. } else {
  89. emit('setImgs', list)
  90. // if(props.keyName) {
  91. // emit('setImgs', { list: list, keyName: props.keyName})
  92. // }else {
  93. // emit('setImgs', list)
  94. // }
  95. }
  96. }
  97. // 如果传入图片输入,设置图片显示
  98. watch(
  99. () => props.imgs,
  100. (imgs) => {
  101. if (imgs.length) {
  102. fileList.value = imgs.map((url) => ({ name: url, url }))
  103. updateImg()
  104. } else {
  105. fileList.value = []
  106. }
  107. },
  108. { immediate: true }
  109. )
  110. // 传入单独图片,设置图片显示
  111. watch(
  112. () => props.img,
  113. (img) => {
  114. if (img) {
  115. fileList.value = [{ name: img, url: img }]
  116. updateImg()
  117. } else {
  118. fileList.value = []
  119. }
  120. },
  121. { immediate: true }
  122. )
  123. const dialogImageUrl = ref('')
  124. const dialogVisible = ref(false)
  125. const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
  126. dialogImageUrl.value = uploadFile.url!
  127. dialogVisible.value = true
  128. }
  129. const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  130. if (rawFile.size / 1024 / 1024 > 2) {
  131. ElMessage.error('图片不能超过2MB!')
  132. return false
  133. }
  134. return true
  135. }
  136. </script>
  137. <style scoped>
  138. .hide :deep(.el-upload--picture-card) {
  139. display: none;
  140. }
  141. .preview {
  142. max-width: 100%;
  143. max-height: 60vh;
  144. display: block;
  145. margin: 0 auto;
  146. }
  147. </style>