+element-ui大文件的分片上传和断点续传js-spark-md5和browser-md5-file

1.参考

https://www.cnblogs.com/kelelipeng/p/10158599.html (js-spark-md5和browser-md5-file) 和 https://blog.csdn.net/u011574420/article/details/80840621 (网上的案例代码)
http://www.javascriptcn.com/post/35682
https://github.com/satazor/js-spark-md5

2.大致思路:

1》 首先判断上传的大文件是否已经上传过,调接口1,根据大文件的id和大文件的md5;如果上传过,则后台做秒传;如果上传过一部分或者未上传过,则进入分片上传
注意:做大文件是否上传过的判断,计算大文件的md5时间会非常久;但不判断就没法做秒传

2》 分片上传:将大文件分片成多个小片段;判断当前分片是否上传,调接口2(根据传入的当前分片的 md5和大文件的id判断)
若上传过该片段,则跳过;上传下一个片段
如果未上传就上传该片段;成功则,下一个;未成功重新传此分片

3》 所有分分片上传完后,后台拼接成完整文件即可

3.MD5依赖包的下载,如果是发送http协议,里面的this需要用self替换
在这里插入图片描述
4.原博主的链接代码片段

<template>
  <div>
    <!-- 上传文件 -->
    <div class="upload">
      <input type="file" id="fileupload" style="background:white border-radius:5px" />
      <Button type="info" @click="uploadf">上传</Button>
      <p>{{status}}</p>
      <Progress :percent="percent" status="active" v-show="percentShow" style="width:36%"></Progress>
    </div>
  </div>
</template>


<script>
export default {
  data() {
    return {
      sizes: 10 * 1024 * 1024,
      url: "http://172.20.3.20:9002",
      percent: 0,
      percentShow: false,
      fileSize: 0,
      status: ""
    }
  },
  methods: {
    getMd5List(index, shardCount, file, size, name, uuid, date, filemd5) {
      const bmf = new BMF()
      let self = this
      if (index < shardCount) {
        let shardSize = self.sizes
        // 计算每一片的起始与结束位置
        var start = index * shardSize
        var end = Math.min(size, start + shardSize)
        //  生成 Md5 , 将文件切割后 , 将 切割后的 文件 读入内存中
        var singleFile = file.slice(start, end)
        //  计算出 md5 值
        bmf.md5(singleFile, function(err, md5) {
          //  验证并上传
          self.checkUploadFile(
            md5,
            uuid,
            name,
            size,
            shardCount,
            filemd5,
            date,
            index,
            singleFile
          )
          //  索引加一
          index = index + 1
          //  递归执行
          self.getMd5List(
            index,
            shardCount,
            file,
            size,
            name,
            uuid,
            date,
            filemd5
          )
        })
        //  计算进度
        var progress = parseInt(((index + 1) / shardCount) * 100)
        self.percent = progress
        console.log(self.percent)
        if (self.percent === 100) {
          self.status = "准备完毕,提交中..."
        }
      }


      if (index === shardCount) {
        console.log("计算结束 ")
        console.log("总片数" + shardCount)
      }
    },
    //  检查该文件以前是否上传过
    isUpload(file) {
      const bmf = new BMF()
      let self = this
      function getUploadDataInfo(file, uuid, filemd5, date) {
        let shardSize = self.sizes
        let name = file.name // 文件名
        let size = file.size // 总大小
        self.fileSize = size
        let shardCount = Math.ceil(size / shardSize) // 总片数
        //  获取 md5 列表
        self.getMd5List(0, shardCount, file, size, name, uuid, date, filemd5)
      }
      // // 构造一个表单,FormData是HTML5新增的
      // var form = new FormData()
      //  计算 整个 上传文件 的 Md5 码的 值
      self.status = "准备中..."

      bmf.md5(file, function(err, md5) {
        console.log("大文件的md5", md5)
        //  计算后的 md5 的 结果
        const uri1 = `/upload/checkMd5`
        const formData = {
          id: file.uid,
          md5: md5
        }
        console.log("检验大文件有无传入的参数", formData)
        self.$http
          .post(uri1, formData)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  console.log("大文件检查结果", data)
                  //  获得返回结果
                  var dataObj = data
                  //  拿到上传文件 的 文件 ID
                  var uuid = dataObj.id
                  var date = dataObj.date
                  if (dataObj.state === 1) {
                    console.log("没有上传过大文件,开始分片上传文件")
                    // 没有上传过文件,开始分片上传文件
                    getUploadDataInfo(file, uuid, md5, date)
                    self.percentShow = true
                  } else if (dataObj.state === 2) {
                    // 已经上传部分
                    console.log("已经上传")
                    getUploadDataInfo(file, uuid, md5, date)
                  } else if (dataObj.state === 3) {
                    // 文件已经上传过
                    console.log("文件已经上传过!!")
                    self.status = ""
                  }
                }
                // this.$message.success(`设置成功`)
              },
              error => {
                self.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            self.$message.error("设置失败,原因:" + error.message)
          })
      })
    },
    //  检查分片是否上传
    checkUploadFile(
      singleFileMd5,
      uuid,
      name,
      size,
      shardCount,
      fileMd5,
      date,
      i,
      singleFile
    ) {
      let self = this
      const uri1 = `/upload/checkMd5`
      const formData = {
        md5: singleFileMd5,
        id: uuid
      }
      let Num = i + 1
      console.log("检查" + "第" + Num + "分片传入的信息", formData)
      // var formData = new FormData()
      // // check 参数 表示 这个 请求作用 是  检测分片是否上传
      // formData.append('action', 'check')
      // formData.append('uuid', uuid)
      // formData.append('filemd5', fileMd5)
      // formData.append('date', date)
      // formData.append('name', name)
      // formData.append('size', size)
      // formData.append('total', shardCount) // 总片数
      // formData.append('index', i + 1) // 当前是第几片
      // formData.append('md5', singleFileMd5)
      self.$http
        .post(uri1, formData)
        .then(res => {
          ResponseHandler(
            res,
            data => {
              if (res.status === 200) {
                let num = i + 1
                console.log("第" + num + "分片检查结果--", data)
                var dataObj = data
                var flag = dataObj.state
                // 服务器返回该分片是否上传过 1 表示 未上传过 , 2 表示上传过
                if (flag === 1) {
                  // 未上传
                  self.uploadSingleFile(
                    singleFile,
                    fileMd5,
                    name,
                    singleFileMd5,
                    uuid,
                    date,
                    size,
                    shardCount,
                    i
                  )
                } else if (flag === 2) {
                  // 已上传
                  console.log("该分片已上传!")
                }
              }
              // this.$message.success(`设置成功`)
            },
            error => {
              self.$message.error(`设置失败,原因:${error.message}`)
            }
          )
        })
        .catch(error => {
          self.$message.error("设置失败,原因:" + error.message)
        })
    },
    //  开始上传单个分片
    uploadSingleFile(
      singleFile,
      fileMd5,
      name,
      md5,
      uuid,
      date,
      size,
      shardCount,
      i
    ) {
      let self = this
      const uri1 = `/appcloudfile/upload`
      var formData = new FormData()
      // upload 参数 表示 这个 请求作用 是  直接上传分片
      formData.append("action", "upload")
      formData.append("data", singleFile) // slice方法用于切出文件的一部分
      formData.append("uuid", uuid)
      formData.append("filemd5", fileMd5)
      formData.append("date", date)
      formData.append("name", name)
      formData.append("size", size)
      formData.append("total", shardCount) // 总片数
      formData.append("index", i + 1) // 当前是第几片
      //  计算出 md5 值
      formData.append("md5", md5)
      self.$http
        .post(uri1, formData)
        .then(res => {
          ResponseHandler(
            res,
            data => {
              if (res.status === 200) {
                console.log(data)
                data.uploadStatus
                //  计算进度
                console.log("上传成功" + data.uploadStatus)
                self.percent = parseInt((data.size / self.fileSize) * 100)
                console.log(data.size)
                console.log("成功ID" + data.saveFileId)
                if (data.uploadStatus) {
                  self.status = "上传成功"
                }
              }
              // this.$message.success(`设置成功`)
            },
            error => {
              self.$message.error(`设置失败,原因:${error.message}`)
            }
          )
        })
        .catch(error => {
          self.$message.error("设置失败,原因:" + error.message)
        })
    },
    uploadf() {
      let file = $("#fileupload")[0].files[0] //文件对象
      this.isUpload(file)
    }
  }
}
</script>


<style>
</style>

5.自己写的代码片段和步骤解释
在这里插入图片描述

<template>
  <div class="upload">
    <!-- {{msg}} -->
    <div class="left">
      <el-row class="tac">
        <el-col>
          <el-menu
            default-active="2"
            class="el-menu-vertical-demo"
            @open="handleOpen"
            @close="handleClose"
            router
          >
            <el-menu-item index="upload" class="uploadLeft">
              <span slot="title">新建上传</span>
            </el-menu-item>
            <el-menu-item index="uploade" class="uploadeLeft">
              <span slot="title">上传历史</span>
            </el-menu-item>
            <el-menu-item index="uploadf" class="uploadfLeft">
              <span slot="title">草稿箱</span>
            </el-menu-item>
          </el-menu>
        </el-col>
      </el-row>
    </div>
    <div class="right">
      <el-card class="box-card">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请选择上传类型</span>
            <span class="s2">(必填)</span>
            <span class="s3">*</span>
          </div>
        </div>
        <!-- 选择器 -->
        <div class="select1">
          <el-select popper-class='selectStyle' @change="selectTrigger1(value1)" v-model="value1" :disabled="isshow" placeholder="请选择" clearable>
            <el-option
              v-for="item in options1"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            ></el-option>
          </el-select>
        </div>
      </el-card>


      <el-card class="box-card box-card-title">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请输入标题</span>
            <span class="s2">(建议15字以内,必填)</span>
            <span class="s3">*</span>
          </div>
          <el-input
          v-if="isshowSpanVIDEO"
            class="content"
            maxlength="30"
            show-word-limit
            v-model="input"
            placeholder="请输入内容"
          ></el-input>
          <el-input
          v-if="!isshowSpanVIDEO"
            class="content"
            maxlength="50"
            show-word-limit
            v-model="input"
            placeholder="请输入内容"
          ></el-input>
        </div>
      </el-card>


      <el-card class="box-card" v-if="!isshowSpanVIDEO">
        <div class="dec">
          <div class="dec-box">
            <span class="s1" v-if="isshowFILEPhotoTags">请添加资源头图</span>
            <span class="s1" v-if="isshowARTICLEPhotoTags">请添加文章头图</span>
            <span class="s1" v-if="isshowTOOLPhotoTags">请添加工具头图</span>
            <!-- <span class="s2">(如未添加,系统自动加载默认头图)</span> -->
            <span class="s3" v-if="isshowFILEPhotoTags">*</span>
            <span class="s3" v-if="isshowARTICLEPhotoTags">*</span>
            <span class="s3" v-if="isshowTOOLPhotoTags">*</span>
          </div>
        </div>
        <div class="ml-20">
          <!-- 自定义上传图片按钮 -->
          <div class="addBtn-box">
            <el-upload
              :action="`/api/upload/image`"
              name="image"
              :headers="headers"
              list-type="picture-card"
              :show-file-list="false"
              :on-preview="handlePictureCardPreview"
              :on-remove="handleRemove1"
              :file-list="headPhotoLists"
              :on-exceed="handleExceed"
              :before-upload="beforeAvatarUpload"
              :on-success="handleAvatarSuccess1"
            >
              <img v-if="imageUrl" :src="imageUrl" class="avatar" />
              <div v-else>
                <i class="el-icon-plus avatar-uploader-icon"></i>
                <p class="imgDec">请选用一张长宽比16:9的图片,格式为</p>
                <p class="imgDec2">JPG,BMP,PNG,容量限制为1MB</p>
              </div>
            </el-upload>
            <el-dialog :visible.sync="dialogVisible">
              <img width="100%" :src="dialogImageUrl" alt />
            </el-dialog>
          </div>
        </div>
      </el-card>
      <!-- 三张头图 -->
      <el-card class="box-card" v-if="isshowSpanVIDEO">
        <div class="dec">
          <div class="dec-box">
            <span class="s1" v-if="isshowSpanVIDEO">请添视频头图</span>
            <span class="s3" v-if="isshowSpanVIDEO">*</span>
          </div>
        </div>
        <div class="ml-20-ptobox">
          <span class="videoPto" v-if="!videoPtoUrl">
            <i class="videoPtoDec1">请选用一张长宽比16:9的图片,格式为</i>
            <i class="videoPtoDec2">JPG,BMP,PNG,容量限制为1MB</i>
          </span>
          <span class="videoPto2" v-if="videoPtoUrl">
            <img :src="`/image/${videoPtoUrl}`" alt="">
          </span>
          <span class="videoPto1" :class="{borColor: videoPtoArrIndex === 0}" @click="setPtoIndex(0)">
            <img :src="`/image/${videoPtoArr[0]}`" alt="">
          </span>
          <span class="videoPto11" :class="{borColor: videoPtoArrIndex === 1}" @click="setPtoIndex(1)">
            <img :src="`/image/${videoPtoArr[1]}`" alt="">
          </span>
          <span class="videoPto111" :class="{borColor: videoPtoArrIndex === 2}" @click="setPtoIndex(2)">
            <img :src="`/image/${videoPtoArr[2]}`" alt="">
          </span>
         <span
            @click="changePto"
            class="changePto"
            type="primary"
            plain
          >换一换</span>
          <el-button class="btnPto" @click="setPto">设为头图</el-button>
          <!-- {{videoPtoArr}} -->
        </div>
      </el-card>


      <!-- 上传图片或附件 -->
      <el-card class="box-card">
        <div class="p3">
          <div class="dec">
            <div class="dec-box">
              <span class="s1" v-if="!isshowSpanVIDEO">上传图片或附件</span>
              <span class="s2" v-if="!isshowSpanVIDEO">(支持JPG,BMP,PNG,PDF等高清图片,,建议多个文件时上传RAR压缩包,文件大小建议不超过600MB.)</span>
              <span class="s1" v-if="isshowSpanVIDEO">上传视频</span>
              <span class="s2" v-if="isshowSpanVIDEO">(支持mp4/avi/wmv格式,建议文件不大于600MB)</span>
              <span class="s3" v-if="isshowSpanVIDEO">*</span>
            </div>
          </div>
        </div>
        <div class="ml-20 up4">
          <!-- `/api/upload/file` :file-list="fileList4"  -->
          <el-upload
            class="upload-demo"
            action=""
            :on-change="handleChange4"


            :before-upload="beforeAvatarUpload4"
            :on-success="handleAvatarSuccess4"
            :on-remove="handleRemove4"
            :on-progress="uploadProcess"
          >
            <!-- :on-progress="uploadProcess" -->
            <el-button class="fujianBtn" size="small" type="primary">上传附件</el-button>
            <!-- <el-progress v-show="showProcess" :percentage="processLength" :stoke-width="2"></el-progress> -->
          </el-upload>
          <div class="boxFileList4" v-for="item in fileList4" :key="item.id">
            <el-progress v-if="fileListForProgress[item.name]&&fileListForProgress[item.name].showProgress" type="line"
                         :percentage="fileListForProgress[item.name]&&fileListForProgress[item.name].percent"
                         style="margin-top: 20px"></el-progress>
            <span class="boxImg">
              <img class="img" :src="`/image/${item.sourceUrl}`" alt />
            </span>
            <span class="boxName">{{item.name}}</span>
            <span class="boxBtn" @click="delImg(item.name)">删除</span>
          </div>
          <!-- <div
            slot="tip"
            class="el-upload__tip"
          >(支持JPG,BMP,PNG,PDF等高清图片,,建议多个文件时上传RAR压缩包,文件大小建议不超过600MB.)</div>-->
        </div>
      </el-card>


      <!-- 简介 -->
      <el-card class="box-card" v-if="!isshowSpanVIDEO">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请输入简介</span>
            <span class="s2">(限制在200字以内)</span>
          </div>
        </div>
        <div class="ml-20">
          <el-input
            class="textarea"
            type="textarea"
            placeholder="请输入内容"
            v-model="textarea"
            maxlength="200"
            show-word-limit
          ></el-input>
        </div>
      </el-card>
      <el-card class="box-card" v-if="isshowSpanVIDEO">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请输入简介</span>
            <span class="s2">(限制在1000字以内)</span>
          </div>
        </div>
        <div class="ml-20">
          <el-input
            class="textarea"
            type="textarea"
            placeholder="请输入内容"
            v-model="textarea"
            maxlength="1000"
            show-word-limit
          ></el-input>
        </div>
      </el-card>


      <!-- 正文  -->
      <el-card class="box-card" v-if="!isshowSpanVIDEO">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请输入正文</span>
            <span class="s2">(限制在50000字以内,单张图片大小不得超过2M)</span>
            <span class="s3">*</span>
          </div>
        </div>
        <div class="ml-20">
          <quill-editor ref="richEditor"></quill-editor>
        </div>
      </el-card>


      <!-- 部门 -->
      <el-card class="box-card">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请设置您所属部门及资源的机密级别</span>
            <span class="s2">(必选)</span>
            <span class="s3">*</span>
          </div>
        </div>
        <!-- 选择器@mouseover="mouseover($event)" :style="{minHeight:minheight}"-->
        <div class="selectbox" >
          <div class="select2" >
            <el-select popper-class='selectStyle' v-model="value2" placeholder="请选择" clearable>
              <el-option
                v-for="item in options2"
                :key="item.tagId"
                :label="item.tagName"
                :value="item.tagId"
              ></el-option>
            </el-select>
          </div>
          <div class="select3">
            <el-select popper-class='selectStyle' @change="selectTrigger3(value3)" v-model="value3" placeholder="请选择" clearable>
              <el-option
                v-for="item in options3"
                :key="item.id"
                :label="item.name"
                :value="item.id"
              ></el-option>
            </el-select>
          </div>
          <!-- 产品名称下拉框 -->
          <div class="select3" v-if="isshowProduct">
            <el-select popper-class='selectStyle' @change="selectTrigger4(value4)" v-model="value4" placeholder="请选择" clearable>
              <el-option
                v-for="item in options4"
                :key="item.tagId"
                :label="item.tagName"
                :value="item.tagId"
              ></el-option>
            </el-select>
          </div>
        </div>
         <div class="product" v-if="isshowProduct">
          <el-input
            class="product"
            maxlength="15"
            show-word-limit
            v-model="product"
            placeholder="请输入产品名称(必填)"
          ></el-input>
          <span v-if="isshowRed">*</span>
        </div>
      </el-card>


      <!-- 标签 -->
      <el-card class="box-card">
        <div class="dec">
          <div class="dec-box">
            <span class="s1">请选择分类标签</span>
            <span class="s2" v-if="isshowTagsNum3">(请至少选择3个标签以确定资源分类)</span>
            <span class="s2" v-if="isshowTagsNum1">(请至少选择1个文章标签以确定资源分类)</span>
            <span class="s3" v-if="isshowTagsNum3">*</span>
            <span class="s3" v-if="isshowTagsNum1">*</span>
          </div>
        </div>
        <uploadlabel ref="uploadlabel" :key="label.tagId" :obj="label" v-for="label in laberArray"></uploadlabel>
        <!-- 保存上传 -->
        <div class="baocun">
          <!-- <el-button @click="updateBtn" v-if="isshow" type="primary" plain class="uploadBtn">更新上传</el-button>
          <el-button @click="uploadBtn" v-if="!isshow" type="primary" plain class="uploadBtn">上传</el-button>
          <span @click="baocunBtn" v-if="!isshow" type="primary" plain class="baocunBtn">保存草稿</span>-->


          <el-button @click="isshowBtnClick1" v-if="isshowBtn1" class="uploadBtn" v-loading="loading">上传</el-button>
          <span
            @click="isshowBtnClick2"
            v-if="isshowBtn2"
            type="primary"
            plain
            class="baocunBtn"
            v-loading="loading"
          >保存草稿</span>


          <el-button @click="isshowBtnClick3" v-if="isshowBtn3" class="uploadBtn" v-loading="loading">更新上传</el-button>


          <el-button @click="isshowBtnClick4" v-if="isshowBtn4" class="uploadBtn" v-loading="loading">更新上传</el-button>
          <span
            @click="isshowBtnClick5"
            v-if="isshowBtn5"
            type="primary"
            plain
            class="baocunBtn"
            v-loading="loading"
          >保存草稿</span>
        </div>
      </el-card>
    </div>
  </div>
</template>


<script>
  import BMF from 'browser-md5-file'
  import uploadlabel from './UploadLabel'
  // import router from 'vue-router'


  import {ResponseHandler} from '@/constant/index.js'


  import quill from '@/components/rich-editor/quill.vue' // quill调用编辑器


  export default {
    props: ['uploadlabel'],
    data () {
      return {
        allloading: '',
        mergeObj: {
          uuid: '',
          name: '',
          date: '',
          index: '',
          shardCount: '',
          oneFenpianFile: '',
          oneMd5: '',
          size: '',
          chunksPath: ''
        },
        length: 0,
        allNum: 0,
        num: 0,
        oneMd5: '', // 获取任意一个md5用于最后合并分片传给后台
        oneFenpianFile: '', // 获取任意一个分片文件用于最后合并分片传给后台
        chunksPath: [],
        sizes: 10 * 1024 * 1024,
        url: 'http://172.20.3.20:9002',
        percent: 0,
        percentShow: false,
        fileSize: 0,
        status: '',
        checkisUploadMD5: '',
        checkisUploadFILE: '',
        eachSize: 10 * 1024 * 1024, // 每块文件大小
        videoPtoUrl: '', // 视频头图的显示路径
        videoPtoArrIndex: '',
        videoUrl: '', // 视频附件的路径
        videoPtoArr: [], // 存三张头图
        isshowFILEPhotoTags: true,
        isshowARTICLEPhotoTags: false,
        isshowVIDEOPhotoTags: false,
        isshowTOOLPhotoTags: false,
        isshowTagsNum1: false,
        isshowTagsNum3: false,
        isshowRed: true,
        product: '',
        isshowProduct: false,
        isshowARTICLE: false,
        minWidth: '',
        isshowSpanVIDEO: false,
        loading: '',
        imgFlag: false,
        biaoqianArr: [],
        isshowBtn1: false,
        isshowBtn2: false,
        isshowBtn3: false,
        isshowBtn4: false,
        isshowBtn5: false,
        isupload: '',
        // quill参数
        contentQuill: ``,
        headPhotoUrl: require('../assets/img/upload_bgc/web_floor_03.png'),
        imgHeader: require('../assets/img/label_bgc/background_icon_11.png'),
        headPhotoLists: [],
        isshow: false,
        islink: false,
        msg: '上传作品',
        options1: [],
        value1: '', // 上传方式
        options2: [],
        value2: '', // 部门
        options3: [],
        value3: '', // 类别
        options4: [],
        value4: '', // 产品名称
        dialogImageUrl: '', // 图片预览
        dialogVisible: false, // 图片墙的上传
        headers: {
          Authorization: localStorage.getItem('token')
        },
        fileList2: [], // 上传附件
        input: '', // 输入框
        textarea: '', // 文本域
        laberArray: [],
        uploadArr1: [], // 上传的对象1
        uploadArr2: [], // 上传的对象2
        uploadArr3: [], // 上传的对象3
        uploadArr4: [], // 上传的对象4
        fileList3: [], // 第三个文件上传的
        fileList4: [],
        fileListForProgress: {},
        // 最后上传的对象
        lastObj: {
          attachs: [],
          tagIds: [],
          id: '',
          name: '',
          title: '',
          uploadType: '',
          headPhoto: '',
          synopsis: '',
          content: '',
          departmentId: '',
          confidentialityLevelId: '',
          contentImage: [],
          saveType: '' //  上传和保存
        },
        serverIP: '',
        imageUrl: ''
      }
    },
    components: {
      uploadlabel,
      quillEditor: quill // quill
    },
    computed: {
      editor () {
        return this.$refs.myQuillEditor.quill // quill
      }
    },
    mounted () {
      let content = '' // quill请求后台返回的内容字符串
      this.str = this.escapeStringHTML(content) // quill
      this.getServerIP()
      // 请求第一个选择器1
      this.fetchSelect1()
      // // 请求第一个选择器2
      this.fetchSelect2()


      // 请求第一个选择器3
      this.fetchSelect3()
      // console.log(localStorage.getItem('value11'))
      // localStorage.setItem('product4', '')
    },
    created () {
      if (this.$route.query.id) {
        this.isshow = !this.isshow
        // 根据id获取会显得参数
        const urirouter = `/resource/${this.$route.query.id}`
        this.$http
          .get(urirouter)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.lastObj = data
                  // 回显
                  this.input = this.lastObj.title
                  this.value1 = this.lastObj.uploadType
                  this.textarea = this.lastObj.synopsis
                  if (this.lastObj.uploadType !== 'VIDEO') {
                    this.$refs.richEditor.setContent(this.lastObj.content)
                  }
                  // this.value2 = this.lastObj.departmentId
                  this.value2 = this.lastObj.departmentId
                  this.value3 = this.lastObj.confidentialityLevelId
                  // this.fileList4 = this.lastObj.attachs.map(item => {
                  //   for (const key in this.lastObj.nameMapper) {
                  //     if (item.indexOf(key) >= 0) {
                  //       this.$set(this.fileListForProgress, this.lastObj.nameMapper[key], {
                  //         name: this.lastObj.nameMapper[key],
                  //         sourceUrl: item
                  //       })
                  //       return {
                  //         name: this.lastObj.nameMapper[key],
                  //         url: `/file/` + item,
                  //         sourceUrl: item
                  //       }
                  //     }
                  //   }
                  // })
                  let arr1 = this.lastObj.attachs.map(item => {
                    return item.split('.')[0]
                  })
                  let arr2 = []
                  arr1.forEach(item => {
                    if (arr1.indexOf(item) !== arr1.lastIndexOf(item)) {
                      // console.log('重复的部分', item)
                      this.lastObj.attachs.map(item2 => {
                        if (item2.indexOf(item) >= 0) {
                          if (item2.indexOf('jpg') >= 0) {
                            // console.log('需要删除的', item2)
                            arr2.push(item2)
                          }
                        }
                      })
                    }
                  })
                  let arr3 = [...new Set(arr2)]
                  // console.log('arr3是需要删除的多余图片数组', arr3, this.lastObj.attachs)
                  let arr4 = this.lastObj.attachs.filter(v => !arr3.includes(v))
                  // console.log('arr4是删除多余图片后的数组', arr4)


                  this.fileList4 = arr4.map(item => {
                    for (const key in this.lastObj.nameMapper) {
                      // if (item.indexOf(key) >= 0) {
                      if (item.indexOf(key.split('/')[key.split('/').length - 1]) >= 0) {
                        if (item.indexOf('mp4') >= 0) {
                          item = item.substring(0, item.length - 3) + 'jpg'
                          this.$set(this.fileListForProgress, this.lastObj.nameMapper[key], {
                            name: this.lastObj.nameMapper[key],
                            sourceUrl: item,
                            jpgOrMp4: 'mp4'
                          })
                          return {
                            name: this.lastObj.nameMapper[key],
                            url: `/file/` + item,
                            sourceUrl: item,
                            jpgOrMp4: 'mp4',
                            response: item.substring(0, item.length - 3) + 'mp4' // 这里需要注意如果是avi和wmn需要更改
                          }
                        } else if (item.indexOf('wmv') >= 0) {
                          item = item.substring(0, item.length - 3) + 'jpg'
                          this.$set(this.fileListForProgress, this.lastObj.nameMapper[key], {
                            name: this.lastObj.nameMapper[key],
                            sourceUrl: item,
                            jpgOrMp4: 'mp4'
                          })
                          return {
                            name: this.lastObj.nameMapper[key],
                            url: `/file/` + item,
                            sourceUrl: item,
                            jpgOrMp4: 'mp4',
                            response: item.substring(0, item.length - 3) + 'wmv' // 这里需要注意如果是avi和wmn需要更改
                          }
                        } else if (item.indexOf('avi') >= 0) {
                          item = item.substring(0, item.length - 3) + 'jpg'
                          this.$set(this.fileListForProgress, this.lastObj.nameMapper[key], {
                            name: this.lastObj.nameMapper[key],
                            sourceUrl: item,
                            jpgOrMp4: 'mp4'
                          })
                          return {
                            name: this.lastObj.nameMapper[key],
                            url: `/file/` + item,
                            sourceUrl: item,
                            jpgOrMp4: 'mp4',
                            response: item.substring(0, item.length - 3) + 'avi' // 这里需要注意如果是avi和wmn需要更改
                          }
                        } else {
                          this.$set(this.fileListForProgress, this.lastObj.nameMapper[key], {
                            name: this.lastObj.nameMapper[key],
                            sourceUrl: item
                          })
                          return {
                            name: this.lastObj.nameMapper[key],
                            url: `/file/` + item,
                            sourceUrl: item
                          }
                        }
                      }
                    }
                  })
                  // console.log(this.fileList4, this.fileListForProgress)
                  this.imageUrl = this.calcImageUrl(this.lastObj.headPhoto)


                  // 会显示后视频头条图的显示和换一换
                  if (this.lastObj.uploadType === 'VIDEO') {
                    this.videoPtoUrl = this.lastObj.headPhoto
                    // let houzhui = ''
                    // for (const key in this.lastObj.nameMapper) {
                    //   if (key.indexOf('mp4') >= 0) {
                    //     houzhui = this.lastObj.nameMapper[key]
                    //   }
                    // }
                    // this.videoUrl = 'temp/' + this.lastObj.attachs[0].substring(0, this.lastObj.attachs[0].length - 4) + '/' + houzhui
                    this.videoUrl = this.lastObj.attachs
                    this.changePto()
                  }


                  if (this.lastObj.uploadType === 'FILE') {
                    this.isshowFILEPhotoTags = true
                    this.isshowARTICLEPhotoTags = false
                    this.isshowVIDEOPhotoTags = false
                    this.isshowTOOLPhotoTags = false
                    this.isshowTagsNum3 = true
                    this.isshowTagsNum1 = false
                    this.fetchLabel(data)
                  }
                  if (this.lastObj.uploadType === 'ARTICLE') {
                    this.isshowFILEPhotoTags = false
                    this.isshowARTICLEPhotoTags = true
                    this.isshowVIDEOPhotoTags = false
                    this.isshowTOOLPhotoTags = false
                    this.isshowTagsNum3 = false
                    this.isshowTagsNum1 = true
                    this.fetchLabelAll(data)
                  }
                  if (this.lastObj.uploadType === 'VIDEO') {
                    this.isshowFILEPhotoTags = false
                    this.isshowARTICLEPhotoTags = false
                    this.isshowVIDEOPhotoTags = true
                    this.isshowTOOLPhotoTags = false
                    this.isshowTagsNum3 = true
                    this.isshowTagsNum1 = false
                    this.fetchLabel(data)
                  }
                  if (this.lastObj.uploadType === 'TOOL') {
                    this.isshowFILEPhotoTags = false
                    this.isshowARTICLEPhotoTags = false
                    this.isshowVIDEOPhotoTags = false
                    this.isshowTOOLPhotoTags = true
                    this.isshowTagsNum3 = false
                    this.isshowTagsNum1 = false
                    this.fetchLabel(data)
                  }
                  // this.fetchLabelAll(data)
                  if (this.lastObj.uploadType === 'VIDEO') {
                    this.isshowSpanVIDEO = true
                  }
                  var num = this.lastObj.confidentialityLevelId - 4
                  if (num === -3) {
                    this.isshowProduct = true
                    this.product = this.lastObj.productName
                    this.isshowRed = false
                  }
                  if (num === 0) {
                    this.isshowProduct = true
                    this.product = this.lastObj.productName
                    this.isshowRed = false
                  }
                  if (num === 1) {
                    this.isshowProduct = true
                    this.product = this.lastObj.productName
                    this.isshowRed = false
                  }
                  // this.product = this.lastObj.productName
                }
              },
              error => {
                this.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('设置失败,原因:' + error.message)
          })
        return
      }
      if (localStorage.getItem('value11') === null) {
        this.fetchLabelAll()
      }
      if (localStorage.getItem('value11') === 'FILE') {
        // this.isshowSpanVIDEO = false
        this.fetchLabel()
      }
      if (localStorage.getItem('value11') === 'ARTICLE') {
        // this.isshowSpanVIDEO = false
        this.fetchLabelAll()
      }
      if (localStorage.getItem('value11') === 'VIDEO') {
        // this.isshowSpanVIDEO = false
        this.fetchLabel()
      }
      if (localStorage.getItem('value11') === 'TOOL') {
        // this.isshowSpanVIDEO = false
        this.fetchLabel()
      }
    },
    beforeRouteEnter (to, from, next) {
      next(vm => {
        //  这里的vm指的就是vue实例,可以用来当做this使用
        // console.log(to.fullPath)
        // console.log(from.path)
        if (to.fullPath.length >= 10) {
          var pathName = 1
          if (from.path === '/uploade') {
            vm.isshowBtn1 = false
            vm.isshowBtn2 = false
            vm.isshowBtn3 = true
            vm.isshowBtn4 = false
            vm.isshowBtn5 = false
            pathName = '/uploade'
            localStorage.setItem('qianduanPathName', pathName)
          } else if (from.path === '/uploadf') {
            vm.isshowBtn1 = false
            vm.isshowBtn2 = false
            vm.isshowBtn3 = false
            vm.isshowBtn4 = true
            vm.isshowBtn5 = true
            pathName = '/uploadf'
            localStorage.setItem('qianduanPathName', pathName)
          } else if (from.path === '/') {
            if (localStorage.getItem('qianduanPathName') === '/uploade') {
              vm.isshowBtn1 = false
              vm.isshowBtn2 = false
              vm.isshowBtn3 = true
              vm.isshowBtn4 = false
              vm.isshowBtn5 = false
            }
            if (localStorage.getItem('qianduanPathName') === '/uploadf') {
              vm.isshowBtn1 = false
              vm.isshowBtn2 = false
              vm.isshowBtn3 = false
              vm.isshowBtn4 = true
              vm.isshowBtn5 = true
            }
          }
        } else {
          vm.isshowBtn1 = true
          vm.isshowBtn2 = true
          vm.isshowBtn3 = false
          vm.isshowBtn4 = false
          vm.isshowBtn5 = false
        }
        if (from.path === '/resources') {
          vm.value1 = 'FILE'
        }
        if (from.path === '/Article') {
          vm.value1 = 'ARTICLE'
        }
        if (from.path === '/video') {
          vm.value1 = 'VIDEO'
          vm.isshowSpanVIDEO = true
        }
        if (from.path === '/tool') {
          vm.value1 = 'TOOL'
        }
      })
    },
    methods: {
      setPto () {
        // console.log(this.videoPtoArrIndex, this.videoPtoArr, this.lastObj.attachs)
        if (this.lastObj.attachs.length > 1) {
          return this.$message('请删除多余附件,保留一个视频附件!')
        }
        if (this.videoPtoArrIndex === '') {
          return this.$message('请选择一张图片做为头图')
        }
        if (this.videoPtoArr[this.videoPtoArrIndex] === undefined) {
          return this.$message('请上传视频附件后再设置头图')
        }
        this.videoPtoUrl = ''
        setTimeout(() => {
          this.videoPtoUrl = this.videoPtoArr[this.videoPtoArrIndex]
          // this.lastObj.headPhoto = this.videoPtoUrl
          let zanshiUrl = this.videoPtoUrl
          const index = zanshiUrl.lastIndexOf('/')
          const str1 = zanshiUrl.substring(0, index + 1)
          const str2 = zanshiUrl.substring(index + 1)
          this.lastObj.headPhoto = str1 + decodeURIComponent(str2)
        }, 0)
      },
      setPtoIndex (index) {
        this.videoPtoArrIndex = ''
        this.videoPtoArrIndex = index
      },
      changePto () {
        this.videoPtoArrIndex = ''
        if (this.lastObj.attachs.length > 1) {
          return this.$message('请删除多余附件,保留一个视频附件!')
        }
        if (this.lastObj.attachs.length === 0) {
          return this.$message('请上传一个视频附件!')
        }
        if (this.videoUrl === '') {
          return this.$message('请删除多余附件,保留一个视频附件!')
        }
        const loading = this.$loading({
          lock: true,
          text: '视频头图获取中...',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })
        this.videoPtoArr = []
        const uploadUrl3 = `/upload/videoCover3`
        var formData = new FormData()
        formData.append('videoPath', this.videoUrl)
        this.$http
          .post(uploadUrl3, formData)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.videoPtoArr = data.map(item => {
                    const index = item.lastIndexOf('/')
                    const str1 = item.substring(0, index + 1)
                    const str2 = item.substring(index + 1)
                    data = str1 + encodeURIComponent(str2)
                    return data
                  })
                }
              },
              error => {
                this.$message.error(`上传失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('上传失败,原因:' + error.message)
          })
      },
      mouseover (event) {
        this.options2.forEach(item => {
          if (item.tagId === this.value2) {
          }
        })
      },
      selectTrigger1 (val) {
        if (val === 'FILE') {
          this.isshowFILEPhotoTags = true
          this.isshowARTICLEPhotoTags = false
          this.isshowVIDEOPhotoTags = false
          this.isshowTOOLPhotoTags = false
          this.isshowTagsNum3 = true
          this.isshowTagsNum1 = false
          this.isshowSpanVIDEO = false
          this.input = ''
          this.textarea = ''
          localStorage.setItem('value11', 'FILE')
          if (this.$refs.uploadlabel.length === 5) {
            this.$refs.uploadlabel[4].isshowBoxFalse()
          }
          this.isshowARTICLE = true
        }
        if (val === 'ARTICLE') {
          this.isshowFILEPhotoTags = false
          this.isshowARTICLEPhotoTags = true
          this.isshowVIDEOPhotoTags = false
          this.isshowTOOLPhotoTags = false
          this.isshowTagsNum3 = false
          this.isshowTagsNum1 = true
          this.isshowSpanVIDEO = false
          this.input = ''
          this.textarea = ''
          localStorage.setItem('value11', 'ARTICLE')
          if (this.$refs.uploadlabel.length === 5) {
            this.$refs.uploadlabel[4].isshowBoxTrue()
          }
          // this.$refs.uploadlabel[4].isshowBoxTrue()
          this.isshowARTICLE = false
          this.fetchLabelAll()
        }
        if (val === 'VIDEO') {
          if (this.lastObj.attachs.length > 1) {
            this.$message('请删除多余附件,保留一个视频附件!')
          }
          if (this.lastObj.attachs.length === 1) {
            if ((this.lastObj.attachs[0].indexOf('mp4') >= 0 || this.lastObj.attachs[0].indexOf('avi') >= 0 || this.lastObj.attachs[0].indexOf('wmv') >= 0)) {
              // console.log('可以调用获取', this.lastObj.attachs)
              this.videoUrl = this.lastObj.attachs[0]
              this.changePto()
            }
          }
          this.isshowFILEPhotoTags = false
          this.isshowARTICLEPhotoTags = false
          this.isshowVIDEOPhotoTags = true
          this.isshowTOOLPhotoTags = false
          this.isshowTagsNum3 = true
          this.isshowTagsNum1 = false
          this.isshowSpanVIDEO = true
          this.videoPtoUrl = ''
          this.lastObj.headPhoto = ''
          this.input = ''
          this.textarea = ''
          localStorage.setItem('value11', 'VIDEO')
          if (this.$refs.uploadlabel.length === 5) {
            this.$refs.uploadlabel[4].isshowBoxFalse()
          }
          this.isshowARTICLE = true
        }
        if (val === 'TOOL') {
          this.isshowFILEPhotoTags = false
          this.isshowARTICLEPhotoTags = false
          this.isshowVIDEOPhotoTags = false
          this.isshowTOOLPhotoTags = true
          this.isshowTagsNum3 = false
          this.isshowTagsNum1 = false
          this.isshowSpanVIDEO = false
          this.input = ''
          this.textarea = ''
          localStorage.setItem('value11', 'TOOL')
          if (this.$refs.uploadlabel.length === 5) {
            this.$refs.uploadlabel[4].isshowBoxFalse()
          }
          this.isshowARTICLE = true
        }
        if (val === '') {
          this.isshowFILEPhotoTags = true
          this.isshowARTICLEPhotoTags = false
          this.isshowVIDEOPhotoTags = false
          this.isshowTOOLPhotoTags = false
          this.isshowTagsNum3 = false
          this.isshowTagsNum1 = false
          this.isshowSpanVIDEO = false
          this.input = ''
          this.textarea = ''
          // this.$refs.uploadlabel[4].isshowBoxFalse()
          this.isshowARTICLE = true
        }
      },
      selectTrigger3 (val) {
        if (val === 1) {
          this.isshowProduct = true
        } else if (val === 4) {
          this.isshowProduct = true
        } else if (val === 5) {
          this.isshowProduct = true
        } else {
          this.isshowProduct = false
          this.product = ''
        }
      },
      selectTrigger4 (val) {
        if (val) {
          this.options4.forEach(item => {
            if (item.tagId === val) {
              this.product = item.tagName
            }
          })
        } else {
          this.product = ''
        }
      },
      onEditorReady (editor) {
        // quill准备编辑器
      },
      onEditorBlur () {
      }, // quill失去焦点事件
      onEditorFocus () {
      }, // quill获得焦点事件
      onEditorChange () {
      }, // quill内容改变事件
      // 转码
      escapeStringHTML (str) {
        str = str.replace(/&lt;/g, '<')
        str = str.replace(/&gt;/g, '>')
        return str
      },
      getServerIP () {
        const uri = `/getServerIp`
        this.$http
          .get(uri)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                this.serverIP = data
              },
              error => {
                this.$message.error(`获取ip失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('获取ip失败,原因:' + error.message)
          })
      },
      fetchSelect1 () {
        const uri1 = `/resource/getUploadEnum`
        // const params = {
        //   type: 'type',
        //   time: 'day'
        // }
        this.$http
          .get(uri1)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.options1 = data
                }
              },
              error => {
                this.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('设置失败,原因:' + error.message)
          })
      },
      fetchSelect2 () {
        // 请求第一个选择器2
        const uri2 = `/resource/getDepartments`
        this.$http
          .get(uri2)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.options2 = data
                }
              },
              error => {
                this.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('设置失败,原因:' + error.message)
          })
      },
      fetchSelect3 () {
        const uri3 = `/resource/getConfidentialityLevel`
        this.$http
          .get(uri3)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.options3 = data
                }
              },
              error => {
                this.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('设置失败,原因:' + error.message)
          })
      },
      fetchSelect4 () {
        const uri4 = `/resource/getProductName`
        this.$http
          .get(uri4)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.options4 = data
                }
              },
              error => {
                this.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('设置失败,原因:' + error.message)
          })
      },
      fetchLabel (resourceData) {
        this.laberArray = []
        const uritags = `/resource/getTags`
        this.$http.get(uritags).then(res => {
          ResponseHandler(
            res,
            data => {
              const laberArray = {}
              if (res.status === 200) {
                data.forEach(item => {
                  if (item.parentId === 0) {
                    laberArray[item.tagId] = {
                      buttonType: {},
                      labelArr: [],
                      ...item
                    }
                  }
                })
                data.forEach(item => {
                  if (item.parentId !== 0) {
                    laberArray[item.parentId].labelArr.push(item)
                    if (
                      resourceData &&
                      resourceData.tagIds &&
                      resourceData.tagIds.indexOf(item.tagId) >= 0
                    ) {
                      this.$set(
                        laberArray[item.parentId].buttonType,
                        item.tagId,
                        true
                      )
                    }
                  }
                })
                delete laberArray[6]
                _.forEach(laberArray, item => {
                  this.laberArray.push(item)
                })
                this.biaoqianArr = data
              }
            },
            error => {
              this.$message.error(`设置失败,原因:${error.message}`)
            }
          )
        })
      },
      fetchLabelAll (resourceData) {
        this.laberArray = []
        const uritags = `/resource/getTags`
        this.$http.get(uritags).then(res => {
          ResponseHandler(
            res,
            data => {
              const laberArray = {}
              if (res.status === 200) {
                data.forEach(item => {
                  if (item.parentId === 0) {
                    laberArray[item.tagId] = {
                      buttonType: {},
                      labelArr: [],
                      ...item
                    }
                  }
                })
                data.forEach(item => {
                  if (item.parentId !== 0) {
                    laberArray[item.parentId].labelArr.push(item)
                    if (
                      resourceData &&
                      resourceData.tagIds &&
                      resourceData.tagIds.indexOf(item.tagId) >= 0
                    ) {
                      this.$set(
                        laberArray[item.parentId].buttonType,
                        item.tagId,
                        true
                      )
                    }
                  }
                })
                _.forEach(laberArray, item => {
                  this.laberArray.push(item)
                })
                this.biaoqianArr = data
              }
            },
            error => {
              this.$message.error(`设置失败,原因:${error.message}`)
            }
          )
        })
      },
      // 导航的两个方法
      handleOpen (key, keyPath) {
      },
      handleClose (key, keyPath) {
      },


      // 照片墙的上传方法(移除与预览)
      handleRemove1 (file, fileList) {
        this.lastObj.headPhoto = ''
      },
      handlePictureCardPreview (file) {
        this.dialogImageUrl = file.url
        this.dialogVisible = true
      },
      handleExceed (files, fileList) {
        this.$message.warning(
          `只可选择上传 1 张图片,本次选择了 ${
            files.length
            } 个图片,共选择了 ${files.length + fileList.length} 个图片`
        )
      },
      // 限制图片上传大小和格式
      beforeAvatarUpload (file) {
        const isJPG = file.type === 'image/jpeg'
        const isPNG = file.type === 'image/png'
        const isBPM = file.type === 'image/bpm'
        const isLt2M = file.size / 1024 / 1024 < 1


        if (!isJPG && !isPNG && !isBPM) {
          this.$message.error('上传头像图片只能是 JPG/PNG/BPM 格式!')
        }
        if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过1M!')
        }
        return (isJPG || isPNG) && isLt2M
      },
      // 图片上传成功函数
      handleAvatarSuccess1 (res, file, fileList) {
        this.imageUrl = this.calcImageUrl(res)
        fileList.slice(1)
        this.lastObj.headPhoto = res
      },
      // 以下是第四种提交附件
      handleChange4 (file, fileList) {
        // this.fileList4 = fileList
      },
      handleAvatarSuccess4 (res, file, fileList) {
        this.lastObj.attachs.push(res)
        if (res.indexOf('mp4') >= 0 || res.indexOf('avi') >= 0 || res.indexOf('wmv') >= 0) {
          const uploadUrl1 = `/upload/videoCover`
          const mp4Arr = []
          mp4Arr.push(res)
          this.$http
            .post(uploadUrl1, mp4Arr)
            .then(res => {
              ResponseHandler(
                res,
                data => {
                  if (res.status === 200) {
                    const index = data.lastIndexOf('/')
                    const str1 = data.substring(0, index + 1)
                    const str2 = data.substring(index + 1)
                    data = str1 + encodeURIComponent(str2)
                    this.$set(this.fileListForProgress[file.name], 'sourceUrl', data)
                    this.$set(this.fileListForProgress[file.name], 'jpgOrMp4', 'mp4')
                    this.fileListForProgress[file.name].showProgress = false
                    //  以下是为图片上传添加显示sourceUrl这个路径属性
                    this.$set(this.fileList4[this.fileList4.length - 1], 'sourceUrl', data)
                    this.$set(this.fileList4[this.fileList4.length - 1], 'jpgOrMp4', 'mp4')
                    // console.log(res, file, fileList, this.fileListForProgress, this.fileList4)
                  }
                },
                error => {
                  this.$message.error(`上传失败,原因:${error.message}`)
                }
              )
            })
            .catch(error => {
              this.$message.error('上传失败,原因:' + error.message)
            })
          //  三张头图获取
          if (this.value1 === 'VIDEO') {
            this.videoUrl = res
            this.changePto()
          }
        } else {
          this.$set(this.fileListForProgress[file.name], 'sourceUrl', res)
          this.fileListForProgress[file.name].showProgress = false
          //  以下是为图片上传添加显示sourceUrl这个路径属性
          // console.log(res, file, fileList, this.fileListForProgress, this.fileList4)
          this.$set(this.fileList4[this.fileList4.length - 1], 'sourceUrl', res)
        }
      },
      handleRemove4 (file, fileList) {
        // this.fileList4 = fileList
      },
      uploadProcess (event, file, fileList) {
        this.$set(this.fileListForProgress[file.name], 'percent', Math.floor(event.percent))
      },
      beforeAvatarUpload4 (file) {
        // if (this.value1 === '') {
        //   this.$message('请先选则上传类型')
        //   return false
        // }
        var fileName = file.name || ''
        var ext = fileName.split('.')[fileName.split('.').length - 1]
        // 判断选择视频
        if (this.value1 === 'VIDEO') {
          if (ext !== 'mp4' && ext !== 'avi' && ext !== 'wmv') {
            this.$message.error(
              '视频上传一次只允许上传一个视频,格式为:mp4/avi/wmv,大小不超过600MB'
            )
            return false
          }
          if (ext === 'mp4' || ext === 'avi' || ext === 'wmv') {
            if (parseInt(file.size) > parseInt('629145600')) {
              this.$message.error('上传附件大小不能超过 600MB!')
              return false
            }
          }
          // if (ext !== 'mp4') {
          //   this.$message.error(
          //     '视频上传一次只允许上传一个视频,格式为:mp4大小不超过600MB'
          //   )
          //   return false
          // }
          // if (ext === 'mp4') {
          //   if (parseInt(file.size) > parseInt('629145600')) {
          //     this.$message.error('上传附件大小不能超过 600MB!')
          //     return false
          //   }
          // }
          if (this.fileList4.length > 1) {
            this.$message.error(
              '视频上传一次只允许上传一个视频,格式为:mp4大小不超过600MB'
            )
            return false
          }
        }
        if (
          ext !== 'jpg' &&
          ext !== 'png' &&
          ext !== 'pdf' &&
          ext !== 'bmp' &&
          ext !== 'rar' &&
          ext !== 'word' &&
          ext !== 'excel' &&
          ext !== 'zip' &&
          ext !== 'doc' &&
          ext !== 'docx' &&
          ext !== 'xls' &&
          ext !== 'xlsx' &&
          ext !== 'ppt' &&
          ext !== 'pptx' &&
          ext !== 'avi' &&
          ext !== 'wmv' &&
          ext !== 'mp4'
        ) {
          this.$message.error(
            '上传资源只能是 jpg/png/bmp/rar/word/excel/zip/doc/docx/xls/xlsx/ppt/pptx/pdf/mp4/avi/wmv 格式!'
          )
          return false
        }
        // if (ext === 'doc' || ext === 'docx' || ext === 'ppt' || ext === 'pptx') {
        //   if (parseInt(file.size) > parseInt('629145600')) {
        //     this.$message.error('上传附件大小不能超过 600MB!')
        //     return false
        //   }
        // }
        if (ext === 'jpg' || ext === 'png' || ext === 'pdf' || ext === 'bmp' || ext === 'rar' || ext === 'word' || ext === 'excel' || ext === 'zip' || ext === 'doc' || ext === 'docx' || ext === 'xls' || ext === 'xlsx' || ext === 'ppt' || ext === 'pptx' || ext === 'avi' || ext === 'wmv' || ext === 'mp4') {
          if (parseInt(file.size) > parseInt('629145600')) {
            this.$message.error('上传附件大小不能超过 600MB!')
            return false
          }
        }
        // 检查该文件以前是否上传过
        this.isUpload(file)


        this.$set(this.fileListForProgress, file.name, {
          name: file.name,
          showProgress: true,
          percent: 0,
          id: +new Date()
        })
        return true
      },
      getMd5List (index, shardCount, file, size, name, uuid, date) {
        const bmf = new BMF()
        let self = this
        if (index < shardCount) {
          let shardSize = self.sizes
          // 计算每一片的起始与结束位置
          var start = index * shardSize
          var end = Math.min(size, start + shardSize)
          //  生成 Md5 , 将文件切割后 , 将 切割后的 文件 读入内存中
          var singleFile = file.slice(start, end)
          //  计算出 md5 值
          bmf.md5(singleFile, function (err, md5) {
            self.mergeObj.uuid = uuid
            self.mergeObj.name = name
            self.mergeObj.date = date
            self.mergeObj.index = index
            self.mergeObj.shardCount = shardCount
            self.mergeObj.oneFenpianFile = self.oneFenpianFile
            self.mergeObj.oneMd5 = self.oneMd5
            self.mergeObj.size = size
            self.mergeObj.chunksPath = self.chunksPath


            self.oneMd5 = md5
            self.oneFenpianFile = singleFile
            //  验证并上传
            self.checkUploadFile(md5, uuid, name, size, shardCount, date, index, singleFile, file)
            //  索引加一
            index = index + 1
            //  递归执行
            self.getMd5List(index, shardCount, file, size, name, uuid, date)
          })
          //  计算进度
          var progress = parseInt(((index + 1) / shardCount) * 100)
          self.percent = progress
          // console.log(self.percent)
          if (self.percent === 100) {
            self.status = '准备完毕,提交中...'
          }
        }
      },
      //  检查该文件以前是否上传过
      isUpload (file) {
        this.allloading = this.$loading({
          lock: true,
          text: '附件检验中',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        })
        let self = this
        function getUploadDataInfo (file, uuid, date) {
          let shardSize = self.sizes
          let name = file.name // 文件名
          let size = file.size // 总大小
          self.fileSize = size
          let shardCount = Math.ceil(size / shardSize) // 总片数
          self.allNum = shardCount
          //  获取 md5 列表
          self.getMd5List(0, shardCount, file, size, name, uuid, date)
        }
        // // 构造一个表单,FormData是HTML5新增的
        // var form = new FormData()
        //  计算 整个 上传文件 的 Md5 码的 值
        // const bmf = new BMF()
        // bmf.md5(file, function (err, md5) {
        //   console.log('大文件的MD5', md5)
        // })


        self.status = '准备中...'
        self.percentpercentShow = true
        getUploadDataInfo(file, file.uid, file.lastModified)
      },
      //  检查分片是否上传
      checkUploadFile (singleFileMd5, uuid, name, size, shardCount, date, i, singleFile, file) {
        let self = this
        const uri1 = `/upload/checkMd5`
        const formData = {
          md5: singleFileMd5,
          id: uuid
        }
        self.$http
          .post(uri1, formData)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  // let num = i + 1
                  // console.log('第' + num + '分片检查结果--', data)
                  var dataObj = data
                  var flag = dataObj.state
                  // 服务器返回该分片是否上传过 1 表示 未上传过 , 3 表示上传过
                  // self.uploadSingleFile(singleFile, name, singleFileMd5, uuid, date, size, shardCount, i, file)
                  if (flag === '1') {
                    // 未上传
                    self.uploadSingleFile(
                      singleFile,
                      name,
                      singleFileMd5,
                      uuid,
                      date,
                      size,
                      shardCount,
                      i,
                      file
                    )
                  } else if (flag === '3') {
                    this.chunksPath.push(data.path)
                    // 已上传
                    // console.log('该分片已上传!')
                  }
                }
              },
              error => {
                self.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            self.$message.error('设置失败,原因:' + error.message)
          })
      },
      //  开始上传单个分片
      uploadSingleFile (singleFile, name, md5, uuid, date, size, shardCount, i, file) {
        let self = this
        const uri1 = `/upload/uploadFile`
        let fenpianfile = new window.File([singleFile], file.name, {type: file.type})
        var formData = new FormData()
        formData.append('id', uuid)
        formData.append('name', name)
        formData.append('lastModified', date)
        formData.append('chunk', i + 1)
        formData.append('chunks', shardCount)
        formData.append('size', size)
        // formData.append('chunkFileInfo', fenpianfile)
        formData.append('chunkSize', self.sizes)
        formData.append('md5', md5)
        // formData.append('file', file)
        formData.append('file', fenpianfile)


        self.$http
          .post(uri1, formData)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.chunksPath.push(data.path)
                  // let num = i + 1
                  // console.log('第' + num + '个单片上传的结果', res, data)
                  data.uploadStatus
                  //  计算进度
                  // console.log('上传成功' + data.uploadStatus)
                  self.percent = parseInt((data.size / self.fileSize) * 100)
                  if (data.uploadStatus) {
                    self.status = '上传成功'
                  }
                }
              },
              error => {
                // uploadSingleFile (singleFile, name, md5, uuid, date, size, shardCount, i, file)
                self.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            self.$message.error('设置失败,原因:' + error.message)
          })
      },
      // 合并分片
      mergeChunks (uuid, name, date, index, shardCount, fenpianfile, md5, size, chunksPath) {
        const formData2 = {
          id: uuid,
          fileName: name,
          // lastModified: date,
          // chunk: index + 1,
          chunks: shardCount,
          size: size,
          // chunkFileInfo: fenpianfile,
          md5: md5,
          chunksPath: chunksPath
        }
        // 每次上传吧分片成功后开始合并次分片
        const uri2 = `/upload/mergeChunks`
        // console.log('开始合并上传')
        this.$http
          .post(uri2, formData2)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.allloading.close()
                  // console.log('单片合并的结果+++++++++', res)
                  let successFileUrl = res.data.response
                  let successFileName = {
                    name: res.data.name
                  }
                  this.fileList4.push(
                    {
                      name: res.data.name,
                      percentage: +res.data.percentage,
                      response: res.data.response,
                      state: res.data.state,
                      status: res.data.status,
                      uid: +res.data.id,
                      size: +res.data.size
                    }
                  )
                  this.chunkSuccess(successFileUrl, successFileName)
                }
              },
              error => {
                self.$message.error(`设置失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            // self.$message.error('设置失败,原因:' + error.message)
          })
      },
      // 分片合并成功后也就是附件上传成功后调用的函数,类似于handleAvatarSuccess4
      chunkSuccess (res, file) {
        this.lastObj.attachs.push(res)
        if (res.indexOf('mp4') >= 0 || res.indexOf('avi') >= 0 || res.indexOf('wmv') >= 0) {
          const uploadUrl1 = `/upload/videoCover`
          const mp4Arr = []
          mp4Arr.push(res)
          this.$http
            .post(uploadUrl1, mp4Arr)
            .then(res => {
              ResponseHandler(
                res,
                data => {
                  if (res.status === 200) {
                    const index = data.lastIndexOf('/')
                    const str1 = data.substring(0, index + 1)
                    const str2 = data.substring(index + 1)
                    data = str1 + encodeURIComponent(str2)
                    this.$set(this.fileListForProgress[file.name], 'sourceUrl', data)
                    this.$set(this.fileListForProgress[file.name], 'jpgOrMp4', 'mp4')
                    this.fileListForProgress[file.name].showProgress = false
                    //  以下是为图片上传添加显示sourceUrl这个路径属性
                    this.$set(this.fileList4[this.fileList4.length - 1], 'sourceUrl', data)
                    this.$set(this.fileList4[this.fileList4.length - 1], 'jpgOrMp4', 'mp4')
                  }
                },
                error => {
                  this.$message.error(`上传失败,原因:${error.message}`)
                }
              )
            })
            .catch(error => {
              this.$message.error('上传失败,原因:' + error.message)
            })
          //  三张头图获取
          if (this.value1 === 'VIDEO') {
            this.videoUrl = res
            this.changePto()
          }
        } else {
          this.$set(this.fileListForProgress[file.name], 'sourceUrl', res)
          this.fileListForProgress[file.name].showProgress = false
          //  以下是为图片上传添加显示sourceUrl这个路径属性
          // console.log(res, file, fileList, this.fileListForProgress, this.fileList4)
          this.$set(this.fileList4[this.fileList4.length - 1], 'sourceUrl', res)
        }
      },
      calcImageUrl (url) {
        return '/image/' + url
      },
      getParams () {
        const clickArr = []
        this.laberArray.forEach(item => {
          for (var k in item.buttonType) {
            if (item.buttonType[k] === true) {
              clickArr.push(+k)
            }
          }
        })
        this.lastObj.tagIds = clickArr
        // 将最后上传的对象各项进行赋值
        this.lastObj.title = this.input
        this.lastObj.uploadType = this.value1
        this.lastObj.synopsis = this.textarea
        if (this.lastObj.uploadType !== 'VIDEO') {
          this.lastObj.content = this.$refs.richEditor.getContent()
          this.lastObj.contentImage = this.$refs.richEditor.getImagePath()
        }
        this.lastObj.saveType = 0
        this.lastObj.departmentId = this.value2
        this.lastObj.confidentialityLevelId = this.value3
        // this.lastObj.attachs = this.fileList4.map(item => {
        //   // console.log(item)
        //   return this.fileListForProgress[item.name].sourceUrl
        //   // return item.response
        // })
        this.lastObj.attachs = this.fileList4.map(item => {
          if (item.jpgOrMp4) {
            return item.response
          } else {
            return this.fileListForProgress[item.name].sourceUrl
          }
          // return item.response
        })
        this.lastObj.productName = this.product
      },
      validParams () {
        if (this.lastObj.uploadType === 'FILE' || this.lastObj.uploadType === 'VIDEO') {
          if (this.lastObj.tagIds.length < 3) {
            this.$message('请至少选择三个标签')
            return true
          }
        }
        if (this.lastObj.departmentId === '') {
          this.$message('请选择所属部门')
          return true
        }
        if (this.lastObj.confidentialityLevelId === '') {
          this.$message('请选择机密级别')
          return true
        }
        if (this.lastObj.uploadType === '') {
          this.$message('请选择上传类型')
          return true
        }
        if (this.lastObj.title.trim() === '') {
          this.$message('请输入标题')
          return true
        }
        // 产品名称的检验  上面需要赋值 需要回显
        if (this.lastObj.confidentialityLevelId === 1) {
          if (this.product === '') {
            this.$message('请添加产品名称')
            return true
          }
        }
        if (this.lastObj.confidentialityLevelId === 4) {
          if (this.product === '') {
            this.$message('请添加产品名称')
            return true
          }
        }
        if (this.lastObj.confidentialityLevelId === 5) {
          if (this.product === '') {
            this.$message('请添加产品名称')
            return true
          }
        }
        // if (this.product === '') {
        //   this.$message('请添加产品名称')
        //   return true
        // }
        // if (this.lastObj.uploadType !== 'VIDEO') {
        //   if (this.lastObj.headPhoto === '') {
        //     this.$message('请添加头图')
        //     return true
        //   }
        // }
        if (this.lastObj.uploadType !== 'VIDEO') {
          if (this.lastObj.content === '') {
            this.$message('请添加正文内容')
            return true
          }
        }
        // if (this.lastObj.content === '') {
          //   this.$message('请添加正文内容')
        //   return true
        // }
        if (this.lastObj.uploadType === 'VIDEO') {
          if (this.lastObj.attachs.length === 0) {
            this.$message('视频资源需上传一条视频附件!')
            return true
          }
          if (this.lastObj.attachs.length > 1) {
            this.$message.error('视频上传一次只允许上传一个视频,格式为:mp4/avi/wmv大小不超过600MB')
            return true
          }
          if (this.lastObj.attachs[0].indexOf('mp4') < 0 && this.lastObj.attachs[0].indexOf('wmv') < 0 && this.lastObj.attachs[0].indexOf('avi') < 0) {
            this.$message.error('视频上传一次只允许上传一个视频,格式为:mp4/avi/wmv大小不超过600MB')
            return true
          }
        }
        if (this.lastObj.headPhoto === '') {
          this.$message('请添加头图')
          return true
        }
        if (this.value1 === 'ARTICLE') {
          const arr6 = []
          for (var item in this.laberArray) {
            for (var k in this.laberArray[item].buttonType) {
              if (k) {
                arr6.push(this.laberArray[item])
              }
            }
          }
          for (const e in arr6) {
            for (var key in arr6[e].buttonType) {
              if (arr6[e].buttonType[key]) {
                if (arr6[e].tagId === 6) {
                  return false
                }
              }
            }
          }
          this.$message('文章资源须选择文章分类标签')
          return true
        }
        return false
      },
      isshowBtnClick1 () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        this.islink = !this.islink
        // loading
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })
        const uploadUrl1 = `/resource/upload`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.$router.push('/uploade')
                }
                this.$message.success(`上传成功`)
              },
              error => {
                loading.close()
                this.$message.error(`上传失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('上传失败,原因:' + error.message)
          })
      },
      isshowBtnClick2 () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        this.lastObj.saveType = 1
        // loading
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })
        const uploadUrl1 = `/resource/upload`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.$router.push('/uploadf')
                }
                this.$message.success(`保存成功`)
              },
              error => {
                this.$message.error(`保存失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('保存失败,原因:' + error.message)
          })
      },
      isshowBtnClick3 () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        // loading
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })
        const uploadUrl1 = `/resource/update`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.$router.push('/uploade')
                  this.$message.success(`更新成功`)
                }
              },
              error => {
                this.$message.error(`更新失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('更新失败,原因:' + error.message)
          })
      },
      isshowBtnClick4 () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        // loading
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })
        const uploadUrl1 = `/resource/update`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.$router.push('/uploade')
                  this.$message.success(`更新成功`)
                }
              },
              error => {
                this.$message.error(`更新失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('更新失败,原因:' + error.message)
          })
      },
      isshowBtnClick5 () {
        this.getParams()
        this.lastObj.saveType = 1
        if (this.validParams()) {
          return
        }
        // loading
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.5)'
        })


        const uploadUrl1 = `/resource/update`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  loading.close()
                  this.$router.push('/uploadf')
                }
                this.$message.success(`保存成功`)
              },
              error => {
                this.$message.error(`保存失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('保存失败,原因:' + error.message)
          })
      },
      // 上传按钮
      uploadBtn () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        this.islink = !this.islink
        const uploadUrl1 = `/resource/upload`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.$router.push('/uploade')
                }
                this.$message.success(`上传成功`)
              },
              error => {
                this.$message.error(`上传失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('上传失败,原因:' + error.message)
          })
      },
      // 更新按钮
      updateBtn () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        const uploadUrl1 = `/resource/update`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.$router.push('/uploade')
                  this.$message.success(`更新成功`)
                }
              },
              error => {
                this.$message.error(`更新失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('更新失败,原因:' + error.message)
          })
      },
      // 保存按钮
      baocunBtn () {
        this.getParams()
        if (this.validParams()) {
          return
        }
        this.lastObj.saveType = 1
        const uploadUrl1 = `/resource/upload`
        this.$http
          .post(uploadUrl1, this.lastObj)
          .then(res => {
            ResponseHandler(
              res,
              data => {
                if (res.status === 200) {
                  this.$router.push('/uploadf')
                }
                this.$message.success(`保存成功`)
              },
              error => {
                this.$message.error(`保存失败,原因:${error.message}`)
              }
            )
          })
          .catch(error => {
            this.$message.error('保存失败,原因:' + error.message)
          })
      },


      // 删除图片
      delImg (name) {
        // 删除显示
        this.fileList4 = this.fileList4.filter(item => {
          return item.name !== name
        })
        // console.log(this.fileList4)
        // 真正删除图片
        this.lastObj.attachs = this.fileList4.map(item => {
          if (item.jpgOrMp4) {
            return item.response
          } else {
            return this.fileListForProgress[item.name].sourceUrl
          }
        })
        if (this.value1 === 'VIDEO') {
          this.videoUrl = ''
          this.videoPtoArr = []
          this.videoPtoUrl = ''
          this.lastObj.headPhoto = ''
        }
        if (this.value1 === 'VIDEO' && this.lastObj.attachs.length === 1) {
          if ((this.lastObj.attachs[0].indexOf('mp4') >= 0 || this.lastObj.attachs[0].indexOf('avi') >= 0 || this.lastObj.attachs[0].indexOf('wmv') >= 0)) {
            this.videoUrl = this.lastObj.attachs[0]
            this.changePto()
          }
        }
      }
    },
    watch: {
      fileList4: function (v1, v2) {
      },
      product: function (val1, val2) {
        if (val1) {
          this.isshowRed = false
          this.options4.forEach(item => {
            if (item.tagName === val1) {
              this.value4 = val1
            } else {
              this.value4 = val1
            }
          })
        } else {
          this.isshowRed = true
          this.value4 = ''
        }
      },
      isshowProduct: function (val1, val2) {
        if (val1) {
          this.fetchSelect4()
        }
      },
      // 根据切片数组的路径的长度和总片数判断,进行合并分片
      chunksPath: function (v1, v2) {
        if (v1.length === this.mergeObj.shardCount) {
          this.mergeChunks(this.mergeObj.uuid, this.mergeObj.name, this.mergeObj.date, this.mergeObj.index, this.mergeObj.shardCount, this.mergeObj.oneFenpianFile, this.mergeObj.oneMd5, this.mergeObj.size, this.mergeObj.chunksPath)
          this.mergeObj = {}
          this.chunksPath = []
          this.oneFenpianFile = ''
          this.oneMd5 = ''
          this.num = 0
        }
      }
    }
  }
</script>


<style scoped lang='less'>
  .upload {
    padding-top: 20px;
    font-family: "Microsoft YaHei UI";
    font-weight: 400;
    font-style: normal;
    font-size: 22px;
    color: #303133;
    overflow: hidden;
    width: 1300px;
    margin: 0 auto;


    .a12 {
      color: #999;
      text-decoration: none;
    }


    .box-card {
      margin-bottom: 10px;
      /deep/ .el-card__body {
        padding: 0 0 20px !important;
      }
      // width: 480px;
    }
    .box-card-title {
      height: 130px;
    }


    .left {
      float: left;
      width: 260px;
      // border: 1px solid #eee;
      border-right: none;


      .el-menu-vertical-demo {
        border-right: none;


        .data-v-23c90d5b {
          font-size: 16px;
        }


        .el-menu-item {
          color: #242222;
          font-size: 16px;
          font-family: "Microsoft YaHei", "微软雅黑";
        }


        .uploadLeft {
          background-color: #fff;
          background-image: url("../assets/img/upload_bgc/web_title.png");
          background-repeat: no-repeat;
          background-position: left center;
        }
      }
    }


    .right {
      margin-left: 19px;
      float: left;
      // position: absolute;
      // top: 0px;
      width: 1020px;
      left: 200px;
      // border: 1px solid #eee;
      // padding: 20px 100px;
      margin-bottom: 20px;


      .box-card {
        /deep/ .el-card__body {
          padding: 0 0 20px 0 !important;
        }
        // width: 480px;
      }


      .ml-20 {
        margin-left: 20px;
        margin-right: 20px;
        .boxImg {
            margin-top: 42px;
            float: left;
            width: 120px;
            height: 70px;
            background-color: #f3f3f3;
            margin-left: 0;


            img {
            float: left;
            width: 120px;
            height: 70px;
            }
          }




      }
      .ml-20-ptobox {
        margin-left: 20px;
        margin-right: 20px;
        position: relative;
        width: 978px;
        height: 160px;


        .videoPto {
          position: absolute;
          display: inline-block;
          width: 280px;
          height: 160px;
          background-color: rgba(243, 243, 243, 1);
          border-radius: 5px;
          border: 1px dashed #ccc;
          text-align: center;
          cursor: pointer;
          img {
            float: left;
            width: 280px;
            height: 160px;
          }


          .videoPtoDec1 {
            position: relative;
            top: 80px;
            font-size: 12px;
            font-style: normal;
          }
          .videoPtoDec2 {
            position: relative;
            top: 90px;
            font-size: 12px;
            font-style: normal;
          }
        }
        .videoPto2 {
          position: absolute;
          left: 0px;
          top: 3px;
          width: 280px;
          height: 160px;
           background-color: rgba(243, 243, 243, 1);
          border-radius: 5px;
          border: 1px dashed #ccc;
          text-align: center;
          cursor: pointer;


          img {
            width: 280px;
            height: 160px;
          }
        }
        .videoPto1 {
          cursor: pointer;
          position: absolute;
          left: 300px;
          top: 3px;
          display: inline-block;
          width: 160px;
          height: 90px;
          background-color: rgba(243, 243, 243, 1);


          img {
            float: left;
            width: 160px;
            height: 90px;
          }
        }
        .videoPto11 {
          cursor: pointer;
          position: absolute;
          left: 480px;
          top: 3px;
          display: inline-block;
          width: 160px;
          height: 90px;
          background-color: rgba(243, 243, 243, 1);


          img {
            float: left;
            width: 160px;
            height: 90px;
          }
        }
        .videoPto111 {
          cursor: pointer;
          position: absolute;
          left: 660px;
          top: 3px;
          display: inline-block;
          width: 160px;
          height: 90px;
          background-color: rgba(243, 243, 243, 1);


          img {
            float: left;
            width: 160px;
            height: 90px;
          }
        }
        .changePto {
          background-color: #fff;
          border: 1px solid #409eff;
          display: inline-block;
          position: absolute;
          top: 123px;
          right: 120px;
          width: 120px;
          height: 40px;
          color: #409eff;
          box-sizing: border-box;
          border-radius: 3px;
          text-align: center;
          line-height: 40px;
          margin-right: 20px;
          font-size: 14px;
          cursor: pointer;
        }
        .btnPto {
          position: absolute;
          left: 857px;
          top: 123px;
          width: 120px;
          height: 40px;
          background-color: #195fff;
          border: none;
          color: #fff;
        }
      }
      .up4 {
        padding-bottom: 0px;
        position: relative;
        top: -42px;


        .upload-demo {
          /deep/ .el-upload-list__item {
            background-color: pink;
            display: none;
            height: 70px;
            line-height: 70px;


            .el-icon-document {
              font-size: 40px;
            }
          }
        }


        // 遍历自定义的图片
        .boxFileList4 {
          height: 155px;
          overflow: hidden;
          border-bottom: 1px solid #f8f8f8;


          .boxImg {
            margin-top: 42px;
            float: left;
            width: 120px;
            height: 70px;
            background-color: #f3f3f3;
            margin-left: 0;


            img {
            float: left;
            width: 120px;
            height: 70px;
            }
          }
          .boxName {
            margin-top: 42px;
            float: left;
            height: 70px;
            line-height: 70px;
            margin-left: 0;
            font-size: 16px;
            margin-left: 20px;
          }
          .boxBtn {
            text-align: center;
            margin-top: 57px;
            float: right;
            width: 80px;
            height: 40px;
            line-height: 40px;
            margin-left: 0;
            font-size: 16px;
            margin-right: 20px;
            background-image: url("../assets/img/upload_bgc/web_button_07.png");
            color: red;
          }
        }
      }


      .dec {
        // margin-top: 30px;
        margin-bottom: 15px;
        height: 55px;
        line-height: 55px;


      .dec-box {
        padding-left: 20px;
        border-bottom: 1px solid #f8f8f8;
        .s1 {
          display: inline-block;
          height: 30px;
          line-height: 30px;
          margin-top: 16px;
          font-family: "Microsoft YaHei UI";
          font-weight: 400;
          font-style: normal;
          font-size: 14px;
          color: #303133;
        }
        .s2 {
          display: inline-block;
          height: 30px;
          line-height: 30px;
          color: #bbb !important;
          font-family: "Simsun";
          font-weight: 400;
          font-size: 12px;
          font-style: normal;
          color: #303133;
        }
        .s3 {
          margin-left: 5px;
          display: inline-block;
          height: 30px;
          line-height: 30px;
          color: red !important;
          font-family: 'Simsun';
          font-weight: 400;
          font-size: 16px;
          font-style: normal;
        }
      }
    }


      /deep/ .el-upload--picture-card {
        position: relative;
        background-color: #f3f3f3;
        width: 280px;
        height: 160px;
      }


      .fujianBtn {
        width: 120px;
        height: 40px;
        // margin-left: 860px;
        position: absolute;
        top: -20px;
        right: 0px;
        background-color: rgba(25, 95, 255, 1);
        border: none;
      }


      .select1 {
        margin-left: 20px;
        margin-top: 10px;
        width: 142px;
        height: 42px;


        /deep/ .el-input--suffix {
          width: 142px;
          /deep/ .el-input__inner {
            border: none;
            width: 142px;
            height: 42px;
            background-image: url("../assets/img/upload_bgc/web_button_05.png");
          }
          .el-icon-arrow-up {
            display: none;
          }
          .el-icon-circle-close {
            margin-right: 23px;
          }
        }
      }


      .el-select {
        width: 160px;
      }


      .content {
        margin: 0 20px;
        display: block;
        height: 30px;
        width: 980px;
      }


      .textarea {
        /deep/ textarea {
          min-height: 100px !important;
        }
      }


      .s1 {
        float: left;
      }
      .clickbtn {
        float: right;
        margin-left: 558px;
      }
      .quill-editor {
        margin-top: 20px;
        /deep/ .ql-editor {
          min-height: 200px;
        }
      }


      .selectbox {
        overflow: hidden;
        .select2,
        .select3 {
          float: left;
          margin-left: 20px;
          // width: 142px;
            // background-color: skyblue;


          /deep/ .el-input--suffix {
            // width: 100%!important;
            // background-color: pink;
            width: 142px;
            /deep/ .el-input__inner {
            // background-color: pink!important;
              border: none;
              // width: 100%!important;
              // min-width: 142px;
              height: 42px;
              background-image: url("../assets/img/upload_bgc/web_button_05.png");
            }
            .el-icon-arrow-up {
              display: none;
            }
            .el-icon-circle-close {
              margin-right: 23px;
            }
          }


        }
      }


      .product {
        // margin-top: 20px;
        margin: 10px 30px 0 10px;


        span {
          position: relative;
          top: -35px;
          left: 180px;
          color: red !important;
          font-family: 'Simsun';
          font-weight: 400;
          font-size: 16px;
          font-style: normal;
        }
      }


      .baocun {
        margin-top: 20px;
        .el-button {
          // display: inline-block;
          width: 120px;
          height: 40px;
          float: right;
          margin-right: 20px;
          margin-bottom: 40px;
        }


        .uploadBtn {
          background: rgba(26, 96, 255, 1);
          color: #fff;
          // background-color: pink;
        }
        .baocunBtn {
          background-color: #fff;
          //
          border: 1px solid #409eff;
          float: right;
          width: 120px;
          height: 40px;
          color: #409eff;
          box-sizing: border-box;
          border-radius: 3px;
          text-align: center;
          line-height: 40px;
          margin-right: 20px;
          font-size: 14px;
          cursor: pointer;
        }
        .baocunBtn :hover {
          color: #409eff;
        }
      }
    }


    // 图片样式
    .avatar-uploader .el-upload {
      border: 1px dashed #d9d9d9;
      border-radius: 6px;
      cursor: pointer;
      position: relative;
      overflow: hidden;
    }
    .avatar-uploader .el-upload:hover {
      border-color: #409eff;
    }
    .avatar-uploader-icon {
      font-size: 28px;
      // color: #8c939d;
      width: 146px;
      height: 146px;
      line-height: 146px;
      text-align: center;
      color: rgba(26, 96, 255, 1);
      font-weight: 900;
    }
    .imgDec {
      font-size: 12px;
      position: absolute;
      top: 20px;
      left: 0;
      width: 280px;
      height: 50px;
    }
    .imgDec2 {
      font-size: 12px;
      position: absolute;
      top: 40px;
      left: 0;
      width: 280px;
      height: 50px;
    }
    .avatar {
      width: 277px;
      height: 157px;
      display: block;
    }


    // 自定义添加图片
    .addBtn-box {
      width: 100%;
      // background-color: cyan;
      // position: relative;
    }
  }
  .borColor {
    border: 1px dashed rgba(26, 96, 255, 1);
  }
</style>
<style lang='less'>
  body {
    .el-select-dropdown {
      min-width: 142px !important;
      .el-scrollbar {
        min-width: 140px!important;
        padding-right: 0;
        .el-select-dropdown__wrap {
          min-width: 140px!important;
          .el-select-dropdown__list {
            .el-select-dropdown__item:hover {
              height: 40px;
              color: #fff;
              // background-image: url("../assets/img/upload_bgc/web_button_06.png") !important;
              background-color: rgba(25, 95, 255, 1);
              border-radius: 5px;
            }
            span {
              font-size: 14px;
            }
          }
        }


        .is-vertical {
          display: none;
        }
      }
    }
  }
</style>
<style lang="less">
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐