Browse Source

bug修复

wangtong 1 year ago
parent
commit
8ffd26d110

BIN
src/assets/images/noimage.png


+ 8 - 5
src/components/ConstructionDetails/index.vue

@@ -255,15 +255,15 @@
             </div>
             <div style="display: flex;width: 100%;height: 100%;" v-if="node==='下沟'">
               <h3 style="width: 95px;font-weight: 600;text-align: center;text-indent: 41px;">视频</h3>
-              <ObsImageUpload
+              <ObsVideoUpload
                 :class=" status == 'read-only' ? 'obsImageUploads' : '' "
                 ref="obsImageUpload"
                 :limit="11"
-                :fileType="['png', 'jpg', 'jpeg']"
+                :fileType="['mp4']"
                 @input="getVideoUrl(arguments,idx)"
-                :value="e.Video"
+                :value="e.video"
                 :disabled="status == 'read-only' "
-              ></ObsImageUpload>
+              ></ObsVideoUpload>
             </div>
             <div style="display: flex;width: 100%;height: 100%;" v-if="node==='回填'">
               <h3 style="width: 95px;font-weight: 600;text-align: center;text-indent: 41px;">石粉回填照片</h3>
@@ -400,6 +400,7 @@ import {
     getDictType,                                    // 腐蚀程度
 
 } from '@/api/zdsz/enginee'
+import ObsVideoUpload from "@/components/ObsVideoUpload/index.vue";
 export default {
   name: 'ConstructionDetails',
   dicts:[
@@ -407,6 +408,7 @@ export default {
       'self_closing_valve_type',
       'brand'
   ],
+  components:{ObsVideoUpload},
   props: ['currentCollapses','nodeDetailType','enginType','status','zEngineeringNodeBo'],
   data() {
     return {
@@ -636,7 +638,7 @@ export default {
     getductalEpitheliumUrl(_,idx) {
       this.currentCollapses[idx].ductalEpithelium = [...arguments][0][0].map(e=>e.url) || [];
     },
-    getrenchProspectUrl(_,idx) {
+    gettrenchProspectUrl(_,idx) {
       this.currentCollapses[idx].trenchProspect = [...arguments][0][0].map(e=>e.url) || [];
     },
     getstonePowderUrl(_,idx) {
@@ -659,6 +661,7 @@ export default {
     },
   getVideoUrl(_,idx) {
     this.currentCollapses[idx].Video = [...arguments][0][0].map(e=>e.url) || [];
+    console.log(this.currentCollapses[idx].Video)
   }
   }
 }

+ 4 - 2
src/components/EnginNodeInfo/index.vue

@@ -86,8 +86,8 @@
                         @input="getinferiorSulcusUrl"></ObsImageUpload>
       </el-form-item>
       <el-form-item label="视频" prop="Video" v-if="currentContain.includes('Video')" class="obsImage" :class=" enginType == '顶管工程' ? 'obsActiveImage' : enginType == '基建工程' ? 'obsActiveImageStructure' : '' ">
-        <ObsImageUpload ref="Video" :limit="9999" :fileType="['png', 'jpg', 'jpeg']" :value="nodeInfo.Video"
-                        @input="getVideoUrl"></ObsImageUpload>
+        <ObsVideoUpload ref="Video" :limit="9999" :fileType="['mp4']" :value="nodeInfo.Video"
+                        @input="getVideoUrl"></ObsVideoUpload>
       </el-form-item>
       <el-form-item label="备注" prop="remark" v-if="currentContain.includes('remark')">
         <el-input
@@ -305,6 +305,7 @@ import {
   getDictType,                                    // 腐蚀程度
 
 } from '@/api/zdsz/enginee'
+import ObsVideoUpload from "@/components/ObsVideoUpload/index.vue";
 export default {
   name:'EnginNodeInfo',
   props:['types','enginType','enginSort','enginNode','name','currentContain','updateOption','status'],
@@ -314,6 +315,7 @@ export default {
     'brand'
 
   ],
+  components:{ObsVideoUpload},
   data(){
 
     return {

+ 316 - 0
src/components/ObsVideoUpload/index.vue

@@ -0,0 +1,316 @@
+<template>
+  <el-form>
+    <el-upload ref="fileList"
+               :disabled="disabled"
+               :action="uploadImgUrl"
+               list-type="picture-card"
+               :on-success="handleUploadSuccess"
+               :before-upload="handleBeforeUpload"
+               :limit="limit"
+               :on-error="handleUploadError"
+               :on-exceed="handleExceed"
+               name="file"
+               :on-remove="handleRemove"
+               :show-file-list="true"
+               :headers="headers"
+               :file-list="fileList"
+               :on-preview="handlePictureCardPreview"
+               :class="{hide: this.fileList.length >= this.limit}"
+    >
+
+      <div slot="file" slot-scope="{file}" >
+        <img
+          style="width: 100%;
+           height: 147px;"
+          src="@/assets/images/noimage.png"
+          @click="handlePictureCardPreview(file)"
+        > <i class="el-icon-plus abs"></i>
+      </div>
+      <i class="el-icon-plus abs">
+      </i>
+    </el-upload>
+
+    <!-- 上传提示 -->
+    <div class="el-upload__tip" slot="tip" v-if="showTip">
+      请上传
+      <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
+      <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
+      的文件
+    </div>
+<!--          <video v-if="dialogVisible"-->
+<!--                 :src="dialogImageUrl"-->
+<!--                 style="display: block; max-width: 100%; margin: 0 auto" controls="controls"/>-->
+<!--    <el-image-viewer-->
+<!--      v-if="dialogVisible"-->
+<!--      zIndex="9999"-->
+<!--      :on-close="closeImgViewer"-->
+<!--      :url-list="fileList.map(t => t.url)"-->
+<!--      :initial-index="imgIndex"-->
+<!--    />-->
+        <el-dialog
+          :visible.sync="dialogVisible"
+          title="预览"
+          width="800px"
+          append-to-body
+        >
+          <video
+                 :src="dialogImageUrl"
+                 id="video"
+                 autoplay
+                 loop
+                 muted
+                 controls
+                 style="display: block; max-width: 800px; max-height: 600px; margin: 0 auto" controls="controls"/>
+<!--          <video v-else-->
+<!--               :src="dialogImageUrl"-->
+<!--               :preview-src-list="[dialogImageUrl]"-->
+<!--               style="display: block; max-width: 70%; margin: 0 auto"-->
+<!--          />-->
+
+        </el-dialog>
+  </el-form>
+</template>
+
+<script>
+import { getToken } from "@/utils/auth";
+import ElImageViewer from "element-ui/packages/image/src/image-viewer";
+export default {
+  components: {
+    ElImageViewer,
+  },
+  props: {
+    value: [String, Object, Array],
+    // 图片数量限制
+    limit: {
+      type: Number,
+      default: 5,
+    },
+    // 大小限制(MB)
+    fileSize: {
+      type: Number,
+      default: 5,
+    },
+    disabled:{
+      type:Boolean,
+      default: false
+    },
+    // 文件类型, 例如['png', 'jpg', 'jpeg']
+    fileType: {
+      type: Array,
+      default: () => ["png", "jpg", "jpeg","mp4"],
+    },
+    // 是否显示提示
+    isShowTip: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      dialogImageUrl: "",
+      dialogVisible: false,
+      hideUpload: false,
+      type:"",
+      baseUrl: process.env.VUE_APP_BASE_API,
+      uploadImgUrl: process.env.VUE_APP_BASE_API + "/obs", // 上传的图片服务器地址
+      headers: {
+        Authorization: "Bearer " + getToken(),
+      },
+      imgIndex:0,
+      fileList: []
+    };
+  },
+  watch: {
+    value: {
+      handler(val) {
+        if (val) {
+          // 首先将值转为数组
+          const list = Array.isArray(val) ? val : this.value.split(',');
+          // 然后将数组转为对象数组
+          this.fileList = list.map(item => {
+            if (typeof item === "string") {
+              item =this.getVideoCover({ name: item, url: item ,suffix:item.substring(item.lastIndexOf('.')+1)})
+            }
+            return item;
+          });
+        } else {
+          this.fileList = [];
+          return [];
+        }
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  computed: {
+    // 是否显示提示
+    showTip() {
+      return this.isShowTip && (this.fileType || this.fileSize);
+    },
+  },
+  methods: {
+    /**
+     * @description 关闭图片查看器
+     */
+    closeImgViewer() {
+      this.dialogVisible = false;
+    },
+    getVideoCover(file) {
+      const canvas = document.createElement('canvas');
+      const video = document.createElement('video');
+      document.body.appendChild(video);
+      video.setAttribute('crossOrigin', 'anonymous');
+      canvas.width = video.clientWidth ? video.clientWidth : 320;
+      canvas.height = video.clientHeight ? video.clientHeight : 320;
+      //video.style.height = '0';
+      video.addEventListener('loadeddata', () =>  {
+          canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
+          let b64 = canvas.toDataURL('image/png');
+          let videoUrl = file.url;
+          file.url = b64; // file的url储存封面图片
+          file.videoUrl = videoUrl; // file的videoUrl储存视频
+          document.body.removeChild(video);
+      });
+      video.setAttribute('src', file.url);
+      // video.oncanplay =function getVideoCover() {
+      //   canvas.width = video.clientWidth ? video.clientWidth : 320; // 获取视频宽度
+      //   canvas.height = video.clientHeight ? video.clientHeight : 320; //获取视频高度
+      //   // 利用canvas对象方法绘图
+      //   ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
+      //   // 转换成base64形式
+      //   let videoFirstimgsrc = canvas.toDataURL("image/png"); // 截取后的视频封面
+      //   let videoUrl = file.url;
+      //   file.url = videoFirstimgsrc; // file的url储存封面图片
+      //   file.videoUrl = videoUrl; // file的videoUrl储存视频
+      //
+      //   video.remove();
+      //   canvas.remove();
+      // };
+      console.log(video)
+      return file;
+    },
+    /**
+     * 查看详情时附件回显
+     **/
+    setFileList(_fileList) {
+      let _self = this;
+      if (_self.$utils.isNotEmpty(_fileList)) {
+        for (let obj of _fileList) {
+          //视频附件,获取第一帧画面作为 封面展示
+          let _fileName = obj.name;
+            //视频附件,获取第一帧画面作为 封面展示
+            this.getVideoCover(obj);
+
+        }
+      }
+      _self.fileList = _fileList;     //fileList 为 Element file-list 参数值
+    },
+    // 删除图片
+    handleRemove(file, fileList) {
+      const findex = this.fileList.map(f => f.url).indexOf(file.url);
+      if(findex > -1) {
+        if (file.url!=null){
+          // picDel({picUrl:file.url}).then(res=>{})
+          this.fileList.splice(findex, 1);
+        }
+      }
+      this.$emit("input", this.fileList);
+    },
+    // 上传成功回调
+    handleUploadSuccess(res) {
+      if (res.code == 200) {
+        this.fileList.push({ name: res.data.fileName, url: res.data.url });
+            //视频附件,获取第一帧画面作为 封面展示
+           // this.getVideoCover(file);
+        this.$emit("input", this.fileList);
+        this.loading.close();
+      } else {
+        this.$message.error(res.msg);
+        this.loading.close();
+      }
+    },
+    // 上传前loading加载
+    handleBeforeUpload(file) {
+      let isImg = false;
+      if (this.fileType.length) {
+        let fileExtension = "";
+        if (file.name.lastIndexOf(".") > -1) {
+          fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
+        }
+        isImg = this.fileType.some((type) => {
+          if (file.type.indexOf(type) > -1) return true;
+          if (fileExtension && fileExtension.indexOf(type) > -1) return true;
+          return false;
+        });
+      } else {
+        isImg = file.type.indexOf("image") > -1;
+      }
+
+      if (!isImg) {
+        this.$message.warning(
+          `文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`
+        );
+        return false;
+      }
+      if (this.fileSize) {
+        const isLt = file.size / 1024 / 1024 < this.fileSize;
+        if (!isLt) {
+          this.$message.warning(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
+          return false;
+        }
+      }
+      this.loading = this.$loading({
+        lock: true,
+        text: "上传中",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+    },
+    // 文件个数超出
+    handleExceed() {
+      this.$message.warning(`上传文件数量不能超过 ${this.limit} 个!`);
+    },
+    // 上传失败
+    handleUploadError(res) {
+      this.$message({
+        type: "error",
+        message: "上传失败",
+      });
+      this.loading.close();
+    },
+    // 预览
+    handlePictureCardPreview(file) {
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+      this.type=file.name.slice(file.name.lastIndexOf(".")+1);
+      this.getVideoCover(file);
+      console.log(this.type)
+    },
+    // 对象转成指定字符串分隔
+    listToString(list, separator) {
+      let strs = "";
+      separator = separator || ",";
+      for (let i in list) {
+        strs += list[i].url + separator;
+      }
+      return strs != '' ? strs.substr(0, strs.length - 1) : '';
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+// .el-upload--picture-card 控制加号部分
+::v-deep.hide .el-upload--picture-card {
+  display: none;
+}
+// 去掉动画效果
+::v-deep .el-list-enter-active,
+::v-deep .el-list-leave-active {
+  transition: all 0s;
+}
+
+::v-deep .el-list-enter, .el-list-leave-active {
+  opacity: 0;
+  transform: translateY(0);
+}
+</style>
+

+ 1 - 1
src/views/zdsz/house/index.vue

@@ -434,7 +434,7 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除房间管理编号为"' + ids + '"的数据项?').then(() => {
+      this.$modal.confirm('是否确认删除房间?').then(() => {
         this.loading = true;
         return delHouse(ids);
       }).then(() => {