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
  | <template> 
 |    <el-image 
 |      :src="`${realSrc}`" 
 |      fit="cover" 
 |      :style="`width:${realWidth};height:${realHeight};`" 
 |      :preview-src-list="realSrcList" 
 |    > 
 |      <div slot="error" class="image-slot"> 
 |        <i class="el-icon-picture-outline"></i> 
 |      </div> 
 |    </el-image> 
 |  </template> 
 |    
 |  <script> 
 |  import { isExternal } from "@/utils/validate"; 
 |    
 |  export default { 
 |    name: "ImagePreview", 
 |    props: { 
 |      src: { 
 |        type: String, 
 |        default: "" 
 |      }, 
 |      width: { 
 |        type: [Number, String], 
 |        default: "" 
 |      }, 
 |      height: { 
 |        type: [Number, String], 
 |        default: "" 
 |      } 
 |    }, 
 |    computed: { 
 |      realSrc() { 
 |        if (!this.src) { 
 |          return; 
 |        } 
 |        let real_src = this.src.split(",")[0]; 
 |        if (isExternal(real_src)) { 
 |          return real_src; 
 |        } 
 |        return process.env.VUE_APP_BASE_API + real_src; 
 |      }, 
 |      realSrcList() { 
 |        if (!this.src) { 
 |          return; 
 |        } 
 |        let real_src_list = this.src.split(","); 
 |        let srcList = []; 
 |        real_src_list.forEach(item => { 
 |          if (isExternal(item)) { 
 |            return srcList.push(item); 
 |          } 
 |          return srcList.push(process.env.VUE_APP_BASE_API + item); 
 |        }); 
 |        return srcList; 
 |      }, 
 |      realWidth() { 
 |        return typeof this.width == "string" ? this.width : `${this.width}px`; 
 |      }, 
 |      realHeight() { 
 |        return typeof this.height == "string" ? this.height : `${this.height}px`; 
 |      } 
 |    }, 
 |  }; 
 |  </script> 
 |    
 |  <style lang="scss" scoped> 
 |  .el-image { 
 |    border-radius: 5px; 
 |    background-color: #ebeef5; 
 |    box-shadow: 0 0 5px 1px #ccc; 
 |    ::v-deep .el-image__inner { 
 |      transition: all 0.3s; 
 |      cursor: pointer; 
 |      &:hover { 
 |        transform: scale(1.2); 
 |      } 
 |    } 
 |    ::v-deep .image-slot { 
 |      display: flex; 
 |      justify-content: center; 
 |      align-items: center; 
 |      width: 100%; 
 |      height: 100%; 
 |      color: #909399; 
 |      font-size: 30px; 
 |    } 
 |  } 
 |  </style> 
 |  
  |