|
@@ -0,0 +1,122 @@
|
|
|
+<template>
|
|
|
+ <div id="upload">
|
|
|
+ <el-upload
|
|
|
+ v-if="url"
|
|
|
+ ref="upload"
|
|
|
+ :action="url"
|
|
|
+ :list-type="listType"
|
|
|
+ :file-list="fileList"
|
|
|
+ :limit="limit"
|
|
|
+ :on-exceed="outLimit"
|
|
|
+ :on-preview="handlePictureCardPreview"
|
|
|
+ :before-remove="handleRemove"
|
|
|
+ :on-success="onSuccess"
|
|
|
+ :before-upload="beforeUpload"
|
|
|
+ :show-file-list="showList"
|
|
|
+ :accept="accept"
|
|
|
+ >
|
|
|
+ <el-button size="small" type="primary" v-if="isBtn">点击上传</el-button>
|
|
|
+ <template v-else-if="uploadBtn">
|
|
|
+ <el-button type="danger">选择文件</el-button>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <el-button type="primary" size="mini">选择文件</el-button>
|
|
|
+ </template>
|
|
|
+ <template #tip v-if="tip">
|
|
|
+ {{ tip }}
|
|
|
+ </template>
|
|
|
+ </el-upload>
|
|
|
+ <el-dialog :visible.sync="dialogVisible">
|
|
|
+ <img width="100%" :src="dialogImageUrl" alt="" />
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import _ from 'lodash';
|
|
|
+export default {
|
|
|
+ name: 'upload',
|
|
|
+ props: {
|
|
|
+ url: { type: null },
|
|
|
+ limit: { type: Number },
|
|
|
+ data: { type: null },
|
|
|
+ type: { type: String },
|
|
|
+ isBtn: { type: Boolean, default: false },
|
|
|
+ uploadBtn: { type: Boolean, default: false },
|
|
|
+ showList: { type: Boolean, default: true },
|
|
|
+ accept: { type: String, default: '' },
|
|
|
+ tip: { type: String, default: undefined },
|
|
|
+ listType: { type: String, default: 'picture-card' },
|
|
|
+ },
|
|
|
+ components: {},
|
|
|
+ data: () => ({
|
|
|
+ dialogVisible: false,
|
|
|
+ dialogImageUrl: '',
|
|
|
+ fileList: [],
|
|
|
+ }),
|
|
|
+ created() {
|
|
|
+ if (this.data) {
|
|
|
+ this.defalutProcess(this.data);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ data: {
|
|
|
+ handler(val) {
|
|
|
+ this.defalutProcess(val);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ computed: {},
|
|
|
+ methods: {
|
|
|
+ handlePictureCardPreview(file) {
|
|
|
+ this.dialogImageUrl = file.url;
|
|
|
+ this.dialogVisible = false;
|
|
|
+ },
|
|
|
+ handleRemove(file, fileList) {
|
|
|
+ console.log(file.url, fileList);
|
|
|
+ // let index = fileList.findIndex(f => _.isEqual(f, file));
|
|
|
+ this.$emit('delete', file.url);
|
|
|
+ // return true;
|
|
|
+ },
|
|
|
+ outLimit() {
|
|
|
+ this.$message.error(`只允许上传${this.limit}个文件`);
|
|
|
+ },
|
|
|
+ onSuccess(response, file, fileList) {
|
|
|
+ //将文件整理好传回父组件
|
|
|
+ this.$emit('upload', { type: this.type, data: { ...response, name: file.name } });
|
|
|
+ },
|
|
|
+ beforeUpload(file) {
|
|
|
+ const sizeLimit = file.size / 1024 / 1024 < 100;
|
|
|
+ if (sizeLimit) return true;
|
|
|
+ else {
|
|
|
+ this.$message.error('文件超出10M!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ defalutProcess(val) {
|
|
|
+ if (_.isArray(val)) {
|
|
|
+ console.log('1');
|
|
|
+ let newArr = val.map(item => {
|
|
|
+ let object = {};
|
|
|
+ object.name = item.name;
|
|
|
+ object.url = item.url;
|
|
|
+ return object;
|
|
|
+ });
|
|
|
+ this.$set(this, `fileList`, newArr);
|
|
|
+ } else if (_.isObject(val)) {
|
|
|
+ console.log('2');
|
|
|
+ let object = {};
|
|
|
+ if (_.get(val, `url`)) {
|
|
|
+ object.name = val.name;
|
|
|
+ object.url = val.url;
|
|
|
+ this.$set(this, `fileList`, [object]);
|
|
|
+ }
|
|
|
+ } else if (typeof val === 'string') {
|
|
|
+ this.$set(this, `fileList`, [{ name: '附件', url: val }]);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped></style>
|