tool-single-img.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <div class="module-box single-img">
  3. <div class="single-img__box">
  4. <el-upload
  5. drag
  6. :action="fileUploadApi.fileUpload"
  7. :on-success="handleAvatarSuccess"
  8. :before-upload="beforeAvatarUpload"
  9. :show-file-list="false"
  10. >
  11. <img v-if="imageUrl" :src="imageUrl" class="single-img__img">
  12. <i v-else class="el-icon-upload">
  13. <div class="el-upload__text"><em>选择图片</em></div>
  14. <div class="el-upload__tip" slot="tip">{{tip}}</div>
  15. </i>
  16. </el-upload>
  17. <div class="overlay" v-if="imageUrl">
  18. <i class="iconfont icon-chakan" @click="showImage"></i>
  19. <i class="iconfont icon-shanchu1" @click="delImage"></i>
  20. </div>
  21. </div>
  22. <el-dialog title="图片展示" :visible.sync="dialogVisible">
  23. <img width="100%" :src="dialogImageUrl" alt="">
  24. </el-dialog>
  25. </div>
  26. </template>
  27. <script>
  28. import api from '@@/components/canvasShow/config/api'
  29. import {sendReqMixin} from '@@/components/canvasShow/config/mixin'
  30. export default {
  31. name: 'tool-single-img',
  32. mixins: [sendReqMixin],
  33. data () {
  34. return {
  35. dialogVisible: false,
  36. dialogImageUrl: '',
  37. fileUploadApi: {
  38. fileUpload: ''
  39. }
  40. }
  41. },
  42. props: {
  43. imageUrl: {
  44. type: String,
  45. default: ''
  46. },
  47. tip: {
  48. type: String,
  49. default: '建议尺寸: 1080*900px, 高度自适应'
  50. }
  51. },
  52. mounted () {
  53. console.log(api)
  54. this.fileUploadApi = api
  55. },
  56. methods: {
  57. handleAvatarSuccess (res, file) {
  58. this.$emit('update:imageUrl', res.data.url)
  59. },
  60. beforeAvatarUpload (file) {
  61. const isLt1M = file.size / 1024 / 1024 < 1
  62. if (!isLt1M) {
  63. this.$message.error('上传图片大小不能超过 1MB!')
  64. }
  65. return isLt1M
  66. },
  67. showImage () {
  68. this.dialogImageUrl = this.imageUrl
  69. this.dialogVisible = true
  70. },
  71. delImage () {
  72. this.$emit('update:imageUrl', '')
  73. }
  74. }
  75. }
  76. </script>
  77. <style lang="scss" scoped>
  78. .single-img{
  79. &__box{
  80. position: relative;
  81. ::v-deep .el-upload{
  82. width: 100%;
  83. }
  84. ::v-deep .el-upload-dragger{
  85. width: 100%;
  86. .el-upload__text{
  87. line-height: 40px;
  88. }
  89. .el-upload__tip{
  90. line-height: 1em;
  91. }
  92. }
  93. .overlay{
  94. display: none;
  95. }
  96. &:hover .overlay{
  97. position: absolute;
  98. top:0;
  99. left: 0;
  100. width: 100%;
  101. height: 100%;
  102. background-color: rgba(0,0,0,0.3);
  103. color: #fff;
  104. display: flex;
  105. justify-content: center;
  106. align-items: center;
  107. .iconfont{
  108. padding: 5px;
  109. margin: 0 5px;
  110. font-size: 20px;
  111. cursor: pointer;
  112. }
  113. }
  114. }
  115. &__img{
  116. position: absolute;
  117. max-width: 100%;
  118. height: 100%;
  119. max-height: 100%;
  120. margin: auto;
  121. top: 0;
  122. right: 0;
  123. bottom: 0;
  124. left: 0;
  125. }
  126. }
  127. </style>