upload.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <div>
  3. <div class="flex">
  4. <!-- <div v-if="acceptType =='.jpg, .jpeg, .png'">
  5. <div v-for="(item, index) in fileList" :key="index" class="file-list">
  6. <img :src="item.url"/>
  7. <div class="mask" v-if="!disabled">
  8. <i class="el-icon-zoom-in" @click="view(index)"></i>
  9. <i class="el-icon-delete" @click="del(index)"></i>
  10. </div>
  11. </div>
  12. </div> -->
  13. <el-upload
  14. class="avatar-uploader"
  15. list-type="picture-card"
  16. :action="action"
  17. :on-remove="handleRemove"
  18. :accept="acceptType"
  19. :headers="myHeaders"
  20. :multiple="limitNum == 1?false:true"
  21. :limit='limitNum'
  22. :on-exceed="handleExceed"
  23. :on-change='handleChangeUpload'
  24. :on-success="handleSuccess"
  25. :on-preview="handlePictureCardPreview"
  26. :file-list="fileList"
  27. :show-file-list="acceptType =='.jpg, .jpeg, .png'?false:true"
  28. :disabled="disabled"
  29. :auto-upload="autoUpload"
  30. >
  31. <i class="el-icon-plus avatar-uploader-icon"></i>
  32. </el-upload>
  33. </div>
  34. <span class="tip" v-if="warning">{{warning}}</span>
  35. <el-dialog
  36. title="查看"
  37. :visible.sync="dialogVisible"
  38. width="500px"
  39. :close-on-click-modal="false"
  40. >
  41. <img :src="dialogImageUrl" style="width:100%;"/>
  42. <span slot="footer" class="dialog-footer">
  43. <el-button type="info" @click="dialogVisible = false">关闭</el-button>
  44. </span>
  45. </el-dialog>
  46. </div>
  47. </template>
  48. <script>
  49. import store from '@/store'
  50. export default {
  51. name: "index",
  52. components: {
  53. },
  54. props: {
  55. warning: {
  56. type: String,
  57. default: ''
  58. },
  59. file: {
  60. type: Array,
  61. default: () => []
  62. },
  63. disabled: {
  64. type: Boolean,
  65. default: false
  66. },
  67. acceptType: {
  68. type: String,
  69. default: ''
  70. },
  71. limitNum: {
  72. type: Number,
  73. default: 3
  74. },
  75. uploadUrl: {
  76. type: String,
  77. default: '/file/img/upload'
  78. },
  79. autoUpload: {
  80. type: Boolean,
  81. default: true
  82. }
  83. },
  84. data() {
  85. return {
  86. fileList: [],
  87. dialogVisible: false,
  88. imgUrl: '',
  89. baseUrl: '',
  90. dialogImageUrl:''
  91. };
  92. },
  93. computed: {
  94. action(){
  95. return global_config.BASE_URL + this.uploadUrl;
  96. },
  97. myHeaders(){
  98. return {Authorization: 'Bearer ' + store.getters.getToken, 'X-Token':store.getters.getToken};
  99. }
  100. },
  101. created() {
  102. this.fileList = this.file;
  103. },
  104. methods: {
  105. // 手动上传
  106. handleChangeUpload(fileData){
  107. if(!this.autoUpload){
  108. let event = event || window.event;
  109. let file = event.target.files[0];
  110. let reader = new FileReader();
  111. let that = this;
  112. reader.onload = function(e) {
  113. that.baseUrl = e.target.result;
  114. that.$emit('changeUpload', fileData, that.baseUrl);
  115. }
  116. reader.readAsDataURL(file);
  117. }
  118. },
  119. // 上传成功
  120. handleSuccess(response, file, fileList){
  121. this.fileList.push({
  122. name: response.fileName,
  123. url: response.message
  124. });
  125. },
  126. // 删除
  127. handleRemove(file, fileList) {
  128. this.fileList = fileList;
  129. },
  130. // 上传超过限制
  131. handleExceed(files, fileList) {
  132. if(fileList.length >= this.limitNum){
  133. this.$message.closeAll();
  134. this.$message.warning(`当前限制选择${this.limitNum}个文件`);
  135. }
  136. },
  137. handlePictureCardPreview(file){
  138. this.dialogImageUrl = file.url;
  139. this.dialogVisible = true;
  140. },
  141. view(index){
  142. this.dialogVisible = true;
  143. this.imgUrl = this.fileList[index].url;
  144. },
  145. del(index){
  146. this.fileList.splice(index, 1);
  147. }
  148. }
  149. };
  150. </script>
  151. <style lang="less" scoped>
  152. .file-list{
  153. margin-right: 5px;
  154. position: relative;
  155. width: 150px;
  156. height: 150px;
  157. display: flex;
  158. justify-content: center;
  159. align-items: center;
  160. border: 1px dashed #d9d9d9;
  161. border-radius: 6px;
  162. &:hover{
  163. .mask{
  164. opacity: 1;
  165. }
  166. }
  167. .mask{
  168. opacity: 0;
  169. position: absolute;
  170. top: 0;
  171. bottom: 0;
  172. width: 100%;
  173. background: rgba(0, 0, 0, 0.4);
  174. border-radius: 6px;
  175. color: #fff;
  176. display: flex;
  177. align-items: center;
  178. justify-content: center;
  179. font-size: 18px;
  180. i{
  181. cursor:pointer;
  182. margin: 0 10px;
  183. }
  184. }
  185. img{
  186. max-width: 150px;
  187. max-height: 150px;
  188. display: block;
  189. }
  190. }
  191. // .avatar-uploader{
  192. // line-height: initial;
  193. // width: 150px;
  194. // }
  195. .avatar-uploader /deep/.el-upload {
  196. border: 1px dashed #d9d9d9;
  197. border-radius: 6px;
  198. cursor: pointer;
  199. position: relative;
  200. overflow: hidden;
  201. }
  202. .avatar-uploader /deep/.el-upload:hover {
  203. border-color: #409EFF;
  204. }
  205. .avatar-uploader-icon {
  206. font-size: 28px;
  207. color: #8c939d;
  208. width: 148px;
  209. height: 148px;
  210. line-height: 148px;
  211. text-align: center;
  212. }
  213. .avatar {
  214. width: 148px;
  215. height: 148px;
  216. display: block;
  217. }
  218. .tip{
  219. color:#f56c6c;
  220. font-size:14px;
  221. }
  222. </style>