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