hc-form-upload.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <el-upload v-loading="isLoading" :accept="accept" :action="action" :class="isFocus?'is-focus':''"
  3. :disabled="isLoading" :headers="getTokenHeader()" :keyname="isKeyName"
  4. :on-error="formUploadError"
  5. :on-progress="uploadprogress" :placeholder="placeholder" :show-file-list="false"
  6. class="hc-upload-table-form"
  7. element-loading-text="上传中..." @exceed="formUploadExceed" @success="formUploadSuccess">
  8. <img v-if="isSrc" :src="isSrc" alt="" class="hc-table-form-img">
  9. <div v-else class="hc-table-form-icon">点此选择文件并上传</div>
  10. <div v-if="isSrc" class="hc-table-form-del">
  11. <el-button plain type="danger" @click.stop="delTableFormFile">删除当前文件</el-button>
  12. </div>
  13. <input :id="isKeyName" v-model="isSrc" class="hc-upload-input-src" @blur="handleBlur" @focus="handleFocus"/>
  14. </el-upload>
  15. </template>
  16. <script setup>
  17. import {ref, watch} from 'vue'
  18. import {getTokenHeader} from '~src/api/request/header';
  19. const props = defineProps({
  20. src: {
  21. type: [Number, String],
  22. default: ''
  23. },
  24. keyname: {
  25. type: [Number, String],
  26. default: ''
  27. },
  28. placeholder: {
  29. type: [Number, String],
  30. default: '相片'
  31. },
  32. })
  33. //变量
  34. const isLoading = ref(false)
  35. const isSrc = ref(props.src)
  36. const isKeyName = ref(props.keyname)
  37. const action = '/api/blade-manager/exceltab/add-buss-imginfo';
  38. const accept = 'image/png,image/jpg,image/jpeg';
  39. //监听
  40. watch(() => [
  41. props.src,
  42. props.keyname,
  43. ], ([src, keyname]) => {
  44. isSrc.value = src
  45. isKeyName.value = keyname
  46. })
  47. //事件
  48. const emit = defineEmits(['success', 'del'])
  49. //上传进度
  50. const uploadprogress = () => {
  51. isLoading.value = true
  52. }
  53. //上传完成
  54. const formUploadSuccess = (res) => {
  55. isLoading.value = false
  56. if (res.code === 200) {
  57. const link = res.data?.link || ''
  58. emit('success', {
  59. res,
  60. src: link,
  61. key: isKeyName.value,
  62. })
  63. }
  64. }
  65. //上传失败
  66. const formUploadError = () => {
  67. isLoading.value = false
  68. }
  69. //格式错误
  70. const formUploadExceed = () => {
  71. isLoading.value = false
  72. }
  73. //删除上传的文件
  74. const delTableFormFile = () => {
  75. emit('del', isKeyName.value)
  76. }
  77. const isFocus = ref(false)
  78. //获得焦点
  79. const handleFocus = () => {
  80. isFocus.value = true
  81. }
  82. //失去焦点
  83. const handleBlur = () => {
  84. isFocus.value = false
  85. }
  86. </script>
  87. <style lang="scss" scoped>
  88. .hc-upload-table-form {
  89. border-radius: 3px;
  90. transition: box-shadow 0.3s, background-color 0.3s;
  91. &.is-focus, &:hover {
  92. background-color: #eddac4;
  93. box-shadow: 0 0 0 1.5px var(--el-color-primary) inset;
  94. }
  95. .hc-upload-input-src {
  96. position: absolute;
  97. z-index: -1;
  98. right: 10px;
  99. width: 10px;
  100. }
  101. }
  102. </style>