web
2025-03-18 8bd42ffbca0bcb0dc18ab17fa8858cd4b333104e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<template>
  <el-upload
    v-model:file-list="fileList"
    list-type="picture-card"
    :on-preview="handlePictureCardPreview"
    :on-remove="handleRemove"
    :on-exceed="handleExceed"
    :http-request="uploadImg"
    :limit="props.limit"
    :disabled="props.disabled"
  >
    <el-icon><Plus /></el-icon>
  </el-upload>
 
  <el-dialog v-model="dialogVisible">
    <img w-full :src="dialogImageUrl" alt="Preview Image" />
  </el-dialog>
</template>
 
<script  setup>
  import { ref } from 'vue'
  import { Plus } from '@element-plus/icons-vue'
  
  import { ElMessage } from 'element-plus'
  import { upload } from '@/api/basicApi/index'
 
  // import type { UploadProps } from 'element-plus'
  import { getImage, setImage } from '@/utils/validate.js'
  const props = defineProps({
      imageList: {
          type: String,
          default: '',
      },
      limit: {
          type: Number,
      },
      disabled:{
          type: Boolean,
          default:false,
      },
  })
  const fileList = ref([])
  const file = ref([])
 
  const emit = defineEmits(['uploadData'])
  //   const imageUrl = ref('')
 
  const dialogImageUrl = ref('')
  const dialogVisible = ref(false)
 
  const handleRemove = (_, uploadFiles) => {
    file.value = uploadFiles.map((item)=>{return item.url})
    emit('uploadData', file.value)
  }
 
  const handlePictureCardPreview  = (uploadFile) => {
    dialogImageUrl.value = uploadFile.url
    dialogVisible.value = true
  }
  //超出限制
  const handleExceed = () => {
    ElMessage({ message: `只能上传${props.limit}张图片`, type: 'error' })
  }
  //上传图片调用接口
  const uploadImg = async (params) => {
      //建立表单,请求参数传表单形式
      let form = new FormData();
      form.append("file1", params.file);
      form.append("fileId", params.file.lastModified);
      form.append("path", 'hydropower');
        //发出上传文件请求
      let res = await upload().uploadFile(form)
      if(res.code == 200){
          //返回的图片网络地址传给form
          ElMessage({ message: '上传图片成功', type: 'success' })
          file.value.push(res.data.newFileName)
          emit('uploadData', setImage(file.value))
      }
  }
  //监听props.image
  watch(props, (newvalue)=>{
    let newList = ''
    if(newvalue.imageList!='' && newvalue.imageList != null){
      newList = getImage(newvalue.imageList).join(',')
    }
    if( newList != ''){
      //判断是否加上PREURL前缀
      if(file.value.join(',') != newList){
        let list = []
        newList.split(',').forEach((item)=>{
          list.push({
            url: item
          })
        })
        fileList.value = list
          
        file.value = newList.split(',')
      }
    }else{
      fileList.value = [] //父组件image从有值到空变化,也要清空一遍组件中的值
      file.value = []
    }
  },{immediate:true})
</script>