imgFile.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <div class="oImgUpload controller" :class="[preview ? '' : 'o-unit']" v-if="widget.type == 'imgupload'">
  3. <van-field
  4. :name="widget.model"
  5. :label="widget.name || '图片'"
  6. :required="fileCheck ? false : options.required || false"
  7. :rules="rule"
  8. v-if="!preview"
  9. >
  10. <template #input>
  11. <van-uploader
  12. v-model="dataModel"
  13. :before-read="beforeRead"
  14. :before-delete="beforeDelete"
  15. :after-read="afterRead"
  16. :max-count="options.length"
  17. preview-size="0.6rem">
  18. </van-uploader>
  19. </template>
  20. </van-field>
  21. <van-field
  22. v-else
  23. :name="widget.model"
  24. :label="widget.name || '图片'"
  25. class="preview"
  26. >
  27. <template #input>
  28. <van-uploader
  29. v-model="dataModel"
  30. :disabled="true"
  31. :deletable="false"
  32. :max-count="dataModel.length || 0"
  33. preview-size="0.5rem">
  34. </van-uploader>
  35. </template>
  36. </van-field>
  37. </div>
  38. </template>
  39. <script>
  40. import setLoading from '@/common/loading'
  41. import { uploadFile } from '@/views/message/api'
  42. export default {
  43. name: 'oImgUpload',
  44. props: ['widget', 'preview', 'value', 'fileCheck'],
  45. data() {
  46. return {
  47. dataModel: this.widget.options?.defaultValue || [],
  48. }
  49. },
  50. mounted() {
  51. // 初始化参数
  52. if(this.value) {
  53. const widget = this.widget
  54. const model = widget.originModel || widget.model
  55. for(let v in this.value) {
  56. if(v == model) {
  57. this.dataModel = this.value[v]
  58. }
  59. }
  60. }
  61. },
  62. methods: {
  63. beforeRead(file) {
  64. const isLt2M = file.size / 1024 / 1024 < 5
  65. if (!isLt2M) {
  66. this.$toast('上传图片大小不能超过 5MB')
  67. return false
  68. }
  69. return true
  70. },
  71. beforeDelete(file, detail) {
  72. this.dataModel.splice(detail.index, 1)
  73. return true
  74. },
  75. async afterRead(file, detail) { // 上传头像
  76. try {
  77. setLoading(true)
  78. file.status = 'uploading'
  79. file.message = '上传中...'
  80. let formData = new FormData()
  81. formData.append('file', file.file)
  82. let res = await uploadFile(formData)
  83. let result = res.data
  84. if(result.code == 200) {
  85. file.status = 'done'
  86. this.dataModel[detail.index] = {
  87. url: result.data.url
  88. }
  89. } else {
  90. file.status = 'failed'
  91. file.message = '上传失败'
  92. this.$toast(result.msg)
  93. return false
  94. }
  95. setLoading(false)
  96. } catch (err) {
  97. setLoading(false)
  98. return false
  99. }
  100. },
  101. },
  102. computed: {
  103. options() {
  104. return this.widget.options || {}
  105. },
  106. rule() {
  107. let rules = this.widget.rules || []
  108. if(rules && rules.length > 0) {
  109. rules.forEach(item => {
  110. if(item.pattern) {
  111. item.pattern = eval(item.pattern)
  112. }
  113. // 判断是否上传文件
  114. if(this.fileCheck) {
  115. item.required = false
  116. }
  117. });
  118. }
  119. return rules
  120. }
  121. },
  122. watch: {
  123. // dataModel: {
  124. // deep: true,
  125. // handler(newValue) {
  126. // if (newValue !== undefined && newValue !== null) {
  127. // }
  128. // }
  129. // },
  130. }
  131. }
  132. </script>
  133. <style lang='less' scoped>
  134. @import url('./controlCommon.less');
  135. /deep/.van-uploader__wrapper--disabled {
  136. opacity: 0.9;
  137. }
  138. </style>