2022-05-13

<template>
  <XqFormItem :key="theRowKey" :wrapper="tableLabel?newItem['wrapper']:null">
  <div style="    display: flex;
    flex-wrap: wrap;">
 <draggable
      class="draggable"
      v-model="fileList"
      chosenClass="chosen"
       filter=".forbid"  
      forceFallback="true"
      group="people"
      animation="1000"
      @start="onStart"
      @end="onEnd"
    >
      <div v-for="(item, index) in fileList" :key="index" class="Uploading_img_warps">
        <div class="Uploading_img_warp">
          <div class="Uploading_imgs">
            <div v-if="item.url && limit !== 0" class="masking">
              <div class="maskings">
                <a-icon
               
                  type="eye"
                  class="icon forbid"
                  style="color: #fdfdfd"
                  @click="handlePreview(item)"
                />
               
                <a-icon
                  style="color: #fdfdfd"
                  type="delete"
                  class="icon forbid"
                  @click="ondelete(index)"
                />
              </div>
            </div>
            <img
             
              :src="item.url"
              alt=""
              class="Uploading_img"
            />
          

         
          </div>
        </div>
        <p style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
          {{ item.name }}
        </p>
      </div> 

      <XqUpload
      class="forbid"
    :showUploadList="false"
      v-decorator="[
        theRowKey,
        {
          ...newItem['decorator'],
          valuePropName: 'fileList',
          getValueFromEvent: getValue
        }
      ]"
      name="files"
      :form="form"
      :customize="newItem['customize']"
      :defaultFileList="newValue"
      :fileList="fileList"
      :decorator="[
        theRowKey,
        {
          ...newItem['decorator'],
          valuePropName: 'fileList',
          getValueFromEvent: getValue
        }
      ]"
      @change="handleChange"
    >
      <template v-if="showUploadBtn">
        <a-button v-if="listType === 'text' || listType === 'picture'">
          <a-icon type="upload" />
          选择文件
        </a-button>
        <a-icon v-else type="plus" style="font-size: 32px; color: #999" />
      </template>
    </XqUpload>
    </draggable>
   
  </div>
      
    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
      <img alt="example" style="width: 100%" :src="previewImage" />
    </a-modal>
  </XqFormItem>

</template>
<script>
//导入draggable组件
import draggable from "vuedraggable";
import XqFormItem from "./XqFormItem";
import XqUpload from "./XqUpload";
import { message } from "ant-design-vue";
export default {
  name: "",
  components: {
    XqFormItem,
    XqUpload,
    draggable
  },
  props: {
    form: {
      type: Object,
      default: () => {}
    },
    item: {
      type: Object,
      default: () => {}
    },
    dataSource: {
      type: Object,
      default: () => {}
    },
    editable: {
      type: Boolean,
      default: false
    },
    rowKey: {
      type: String,
      default: ""
    },
    tableLabel: {
      type: Boolean,
      default: () => {
        return false
      }
    }
  },
  data() {
    return {
      previewVisible: false,
      previewImage: "",
      fileList: [],
      defined: false
    };
  },
  computed: {
    newItem() {
      const tempItem = JSON.parse(JSON.stringify(this.item));
      return tempItem;
    },
    theRowKey() {
      return `${this.newItem['model']}${!!this.rowKey ? '_' + this.rowKey : ''}`;
    },
    newValue() {
      if (this.item && this.dataSource) {
        const value = this.dataSource[this.item["model"]];
        const list = this.initList(value);
        return list;
      }
      return [];
    },
    extendConfig() {
      return this.item["extend"];
    },
    size() {
      if(this.extendConfig && this.extendConfig.size) {
        return this.extendConfig.size;
      }
      return false;
    },
    limit() {
      if(this.extendConfig && this.extendConfig.limit) {
        return this.extendConfig.limit;
      }
      return false;
    },
    listType() {
      if(this.item && this.item["customize"] && this.item["customize"]["listType"]) {
        return this.item["customize"]["listType"];
      }
      return "text";
    },
    showUploadBtn() {
      if (this.limit && this.fileList && this.fileList.length >= this.limit) {
        return false;
      }
      return true;
    }
  },
  watch: {
    newValue: {
      handler(newVal) {
        if (newVal && !this.defined) {
          this.fileList = newVal;
          this.defined = true;
        }
      },
      immediate: true
    }
  },
  created() {},
  mounted() {},
  methods: {
    handleCancel() {
      this.previewVisible = false;
    },
     //开始拖拽事件
    onStart() {
      this.drag = true;
    },
    //拖拽结束事件
    onEnd() {
      this.drag = false;
    
      this.dataSource[this.item["model"]]=this.fileList
      this.$emit("change", this.fileList);
     
    },
       ondelete(index) {
      this.fileList.splice(index, 1);
           this.dataSource[this.item["model"]]=this.fileList
           this.$emit("change", this.fileList);
       
    },

     async handlePreview(file) {
      if (!file.url && !file.preview) {
        file.preview = await getBase64(file.originFileObj);
      }
      this.previewImage = file.url || file.preview;
      this.previewVisible = true;
    },
    getValue(e) {
      if(Array.isArray(e)) {
        return e;
      }
      return e && e.fileList;
    },
    handleChange({file, fileList, event}) {
      if(this.size){
        if(file.size / 1024 / 1024 > this.size){
          message.warning("文件体积超出限制,无法上传!")
          return false;
        }
      }
      let tempList = [...fileList];
      if(this.limit){
        tempList = tempList.slice(-this.limit);
      }
      tempList = tempList.map(li => {
        if(li.response && li.response.code === 200) {
          li.url = li.response.data[0]
        }
        return li;
      })   
      this.fileList = tempList;
      this.$emit("change", this.fileList);
     
    },
    initList(values) {
      if(values) {
        const urls = Array.isArray(values) ? values : values.split(",");
        if(urls.length > 0) {
          const tempList = [];
          for(let i = 0; i < urls.length; i++) {
            const url = urls[i];
            if (Object.prototype.toString.call(url) === '[object Object]') {
              tempList.push(url)
            } else {
              const nameArr = url.split("/");
              tempList.push({
                uid: -1 - i,
                name: nameArr[nameArr.length - 1],
                status: "done",
                url: url
              });
            }
          }
          return tempList;
        }
        return [];
      }
      return [];
    }
  }
}
</script>
<style lang="scss">
.uploading {
  width: 104px;
  display: inline-block;
}
.ant-upload-select-picture-card i {
  font-size: 32px;
  color: #999;
}
.clearfix {
  display: flex;
  flex-wrap: wrap;
}
 
.ant-upload-select-picture-card .ant-upload-text {
  margin-top: 8px;
  color: #666;
}
.Uploading_img_warp {
  width: 104px;
  height: 104px;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.Uploading_imgs {
  position: relative;
  width: 90px;
  height: 90px;
  overflow: hidden;
}
.Uploading_img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.masking {
  background-color: rgba(0, 0, 0, 0.5);
  display: none;
  width: 90px;
  height: 90px;
  position: absolute;
  left: 0;
  right: 0;
}
.maskings {
  width: 100%;
  height: 90px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.Uploading_imgs:hover .masking {
  display: block;
}
.Uploading_file {
  display: inline-block;
  font-size: 90px;
  line-height: 90px;
}
.icon {
  cursor: pointer;
  margin: 0 2px;
  color: #fff;
}
.Uploading_img_warps {
  width: 114px;
  margin: 0 8px 8px 0;
}
.Uploading_loading {
  width: 100%;
  height: 90px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.forbid {
  display: inline-block;width: 0%;
}
/*被拖拽对象的样式*/
.item {
  padding: 6px;
  background-color: #fdfdfd;
  border: solid 1px #eee;
  margin-bottom: 10px;
  cursor: move;
}
.draggable {
     display: flex;
    flex-wrap: wrap;
}
/*选中样式*/
.chosen {
  border: solid 1px #3089dc !important;
}</style>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 收获满满的升学季。今年Bobby在Faith老师的指导和帮助下收到8所大学的Offer,给我们带了太多的惊喜和鼓舞...
    舒凡soulife阅读 341评论 0 1
  • 任城区天气,小雨转阴,22~12度,空气良,指数65,东北风3~4级。 虽然昨天没有午休,但晚间睡得还是不够好,快...
    竹影起舞正听风阅读 148评论 0 3
  • 心得: 对于孩子来说,爸爸和妈妈良好的夫妻关系,是送给孩子一份最好的礼物。因为爸爸妈妈是孩子的整个世界,是...
    柚子坚强阅读 72评论 0 0
  • 所有不开心都是未来惊喜的铺垫
    漓陌阅读 43评论 0 0
  • 5.12功课 经由三个案例自己的访问发现自己好多傲慢、焦虑、担心、指责、评判,缺乏好奇心。 在是训练正念的个案时,...
    ce3d4d1b3a64阅读 117评论 0 0