<template> 
 | 
    <div class="file"> 
 | 
        <div class="file_list"> 
 | 
            <div class="file_list_item" :style="{width: width, height: height}" v-for="(item, index) in list" :key="index"> 
 | 
                <div class="dele" @click="deleItem(index)"> 
 | 
                    <i class="el-icon-close"></i> 
 | 
                </div> 
 | 
                <img :src="item.url" v-if="fileType(item.url) === 'img'" /> 
 | 
                <video controls autoplay :src="item.url" v-else></video> 
 | 
            </div> 
 | 
          <div class="file_list_item" :style="{width: width, height: height, cursor: 'pointer'}" @click="$refs.file.click()"> 
 | 
            <i class="el-icon-plus" style="font-size: 18px;color: #8c939d;text-align: center;margin-top: 10px"></i> 
 | 
            <i style="font-size: 12px;color: #8c939d;font-style: normal;text-align: center">{{tips}}</i> 
 | 
          </div> 
 | 
          <input type="file" ref="file" :accept="accept" @change="getFile" /> 
 | 
        </div> 
 | 
    </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
import axios from 'axios' 
 | 
export default { 
 | 
  props: { 
 | 
    width: { 
 | 
      type: String, 
 | 
      default: '90px' 
 | 
    }, 
 | 
    height: { 
 | 
      type: String, 
 | 
      default: '90px' 
 | 
    }, 
 | 
    list: { 
 | 
      type: Array, 
 | 
      default: [] 
 | 
    }, 
 | 
    tips: { 
 | 
      type: String, 
 | 
      default: '0' 
 | 
    }, 
 | 
    accept: { 
 | 
      type: String, 
 | 
      default: '' 
 | 
    }, 
 | 
    folder: { 
 | 
      type: String, 
 | 
      default: '' 
 | 
    } 
 | 
  }, 
 | 
  data () { 
 | 
    return { 
 | 
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/upload' 
 | 
    } 
 | 
  }, 
 | 
  
 | 
  methods: { 
 | 
    fileType (url) { 
 | 
      if (url.indexOf('.mp4') !== -1) { 
 | 
        return 'video' 
 | 
      } else { 
 | 
        return 'img' 
 | 
      } 
 | 
    }, 
 | 
    getFile (e) { 
 | 
      if (e.target && e.target.files.length > 0) { 
 | 
        this.$emit('loading') 
 | 
        const formdate = new FormData() 
 | 
        formdate.append('file', e.target.files[0]) 
 | 
        formdate.append('folder', this.folder) 
 | 
        axios.post(this.uploadImgUrl, formdate) 
 | 
          .then(res => { 
 | 
            this.$emit('success', res.data.data) 
 | 
            console.log(res.data.data) 
 | 
          }) 
 | 
          .catch(e => { 
 | 
          }) 
 | 
          .finally(() => { 
 | 
            this.$refs.file.value = null 
 | 
          }) 
 | 
      } 
 | 
    }, 
 | 
    deleItem (index) { 
 | 
      this.$emit('dele', index) 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
    .file { 
 | 
        /*width: 100%;*/ 
 | 
        /*height: 90px;*/ 
 | 
        margin: 10px 0; 
 | 
        input { 
 | 
            opacity: 0; 
 | 
        } 
 | 
        .file_list { 
 | 
            width: 100%; 
 | 
            height: 100%; 
 | 
            display: flex; 
 | 
            align-items: center; 
 | 
            flex-wrap: wrap; 
 | 
            .file_list_item { 
 | 
                display: flex; 
 | 
                flex-direction: column; 
 | 
                align-items: center; 
 | 
                justify-content: center; 
 | 
                overflow: hidden; 
 | 
                border-radius: 5px; 
 | 
                border: 1px solid #d5d5d5; 
 | 
                margin: 5px; 
 | 
                position: relative; 
 | 
                &:first-child { 
 | 
                    margin: 0 !important; 
 | 
                } 
 | 
                .dele { 
 | 
                    position: absolute; 
 | 
                    right: 0; 
 | 
                    top: 0; 
 | 
                    width: 20px; 
 | 
                    height: 20px; 
 | 
                    background: red; 
 | 
                    display: flex; 
 | 
                    align-items: center; 
 | 
                    justify-content: center; 
 | 
                    z-index: 10000; 
 | 
                    cursor: pointer; 
 | 
                    .el-icon-close { 
 | 
                        color: #ffffff; 
 | 
                        font-size: 14px; 
 | 
                    } 
 | 
                } 
 | 
                .el-icon-plus { 
 | 
                    font-size: 30px; 
 | 
                    color: black; 
 | 
                } 
 | 
                img { 
 | 
                    width: 100%; 
 | 
                } 
 | 
                video { 
 | 
                    width: 100%; 
 | 
                    height: 100%; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</style> 
 |