index.vue 4.0 KB

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