Bladeren bron

修改OBS上传

JX.Li 1 jaar geleden
bovenliggende
commit
5e74a47c8e
3 gewijzigde bestanden met toevoegingen van 243 en 12 verwijderingen
  1. 224 0
      src/components/ObsImageUpload/index.vue
  2. 2 0
      src/main.js
  3. 17 12
      src/views/zdsz/openbolt/index.vue

+ 224 - 0
src/components/ObsImageUpload/index.vue

@@ -0,0 +1,224 @@
+<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}"
+    >
+      <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>
+
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="预览"
+      width="800"
+      append-to-body
+    >
+      <video v-if="type==='mp4'"
+             :src="dialogImageUrl"
+             style="display: block; max-width: 100%; margin: 0 auto" controls="controls"/>
+      <img v-else
+           :src="dialogImageUrl"
+           style="display: block; max-width: 100%; margin: 0 auto"
+      />
+    </el-dialog>
+  </el-form>
+</template>
+
+<script>
+  import { getToken } from "@/utils/auth";
+
+  export default {
+    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(),
+        },
+        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 = { 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: {
+      // 删除图片
+      handleRemove(file, fileList) {
+        const findex = this.fileList.map(f => f.name).indexOf(file.name);
+        if(findex > -1) {
+          this.fileList.splice(findex, 1);
+          this.$emit("input", this.listToString(this.fileList));
+        }
+      },
+      // 上传成功回调
+      handleUploadSuccess(res) {
+        if (res.code == 200) {
+          this.fileList.push({ name: res.data.fileName, url: res.data.url });
+          this.$emit("input", this.listToString(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.error(
+            `文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`
+          );
+          return false;
+        }
+        if (this.fileSize) {
+          const isLt = file.size / 1024 / 1024 < this.fileSize;
+          if (!isLt) {
+            this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
+            return false;
+          }
+        }
+        this.loading = this.$loading({
+          lock: true,
+          text: "上传中",
+          background: "rgba(0, 0, 0, 0.7)",
+        });
+      },
+      // 文件个数超出
+      handleExceed() {
+        this.$message.error(`上传文件数量不能超过 ${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);
+        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>
+

+ 2 - 0
src/main.js

@@ -29,6 +29,7 @@ import Editor from "@/components/Editor"
 import FileUpload from "@/components/FileUpload"
 // 图片上传组件
 import ImageUpload from "@/components/ImageUpload"
+import ObsImageUpload from "@/components/ObsImageUpload"
 // 图片预览组件
 import ImagePreview from "@/components/ImagePreview"
 // 字典标签组件
@@ -57,6 +58,7 @@ Vue.component('RightToolbar', RightToolbar)
 Vue.component('Editor', Editor)
 Vue.component('FileUpload', FileUpload)
 Vue.component('ImageUpload', ImageUpload)
+Vue.component('ObsImageUpload', ObsImageUpload)
 Vue.component('ImagePreview', ImagePreview)
 
 Vue.use(directive)

+ 17 - 12
src/views/zdsz/openbolt/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="110px">
-      <el-form-item label="小区" prop="areaId">
+      <el-form-item label="小区名称" prop="areaId">
         <el-select v-model="queryParams.areaId" placeholder="请选择小区" filterable @change="getBuildings">
           <el-option
             v-for="obj in areas"
@@ -11,7 +11,7 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="楼栋" prop="buildingId">
+      <el-form-item label="楼栋名称" prop="buildingId">
         <el-select v-model="queryParams.buildingId" placeholder="请选择楼栋" filterable @change="getUnits">
           <el-option
             v-for="obj in builds"
@@ -21,7 +21,7 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="单元" prop="unitId">
+      <el-form-item label="单元名称" prop="unitId">
         <el-select v-model="queryParams.unitId" placeholder="请选择单元" filterable @change="getHouses">
           <el-option
             v-for="obj in units"
@@ -31,7 +31,7 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="房间" prop="houseId">
+      <el-form-item label="房间名称" prop="houseId">
         <el-select v-model="queryParams.houseId" placeholder="请选择房间号" filterable>
           <el-option
             v-for="obj in houses"
@@ -143,7 +143,7 @@
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="110px">
         <el-form-item label="小区" prop="areaId">
-          <el-select v-model="form.areaId" placeholder="请选择小区" filterable @change="getBuildings1">
+          <el-select v-model="form.areaId" placeholder="请选择小区" filterable @change="getBuildings1" style="width: 100%">
             <el-option
               v-for="obj in areas"
               :key="obj.id"
@@ -153,7 +153,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="楼栋" prop="buildingId">
-          <el-select v-model="form.buildingId" placeholder="请选择楼栋" filterable @change="getUnits1">
+          <el-select v-model="form.buildingId" placeholder="请选择楼栋" filterable @change="getUnits1" style="width: 100%">
             <el-option
               v-for="obj in builds"
               :key="obj.id"
@@ -163,7 +163,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="单元" prop="unitId">
-          <el-select v-model="form.unitId" placeholder="请选择单元" filterable @change="getHouses1">
+          <el-select v-model="form.unitId" placeholder="请选择单元" filterable @change="getHouses1" style="width: 100%">
             <el-option
               v-for="obj in units"
               :key="obj.id"
@@ -173,7 +173,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="房间号" prop="houseId">
-          <el-select v-model="form.houseId" placeholder="请选择房间号" filterable>
+          <el-select v-model="form.houseId" placeholder="请选择房间号" filterable style="width: 100%">
             <el-option
               v-for="obj in houses"
               :key="obj.id"
@@ -183,8 +183,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="安检是否合格" prop="isQualified">
-          <!--          <el-input v-model="form.isQualified" placeholder="请输入安检是否合格" />-->
-          <el-select v-model="form.isQualified" placeholder="请选择安检是否合格" filterable>
+          <el-select v-model="form.isQualified" placeholder="请选择安检是否合格" filterable style="width: 100%">
             <el-option
               v-for="obj in dict.type.pass_check"
               :key="obj.value"
@@ -194,8 +193,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="是否维修" prop="isMaintenance">
-          <!--          <el-input v-model="form.isMaintenance" placeholder="请输入是否维修" />-->
-          <el-select v-model="form.isMaintenance" placeholder="请选择是否维修" filterable>
+          <el-select v-model="form.isMaintenance" placeholder="请选择是否维修" filterable style="width: 100%">
             <el-option
               v-for="obj in dict.type.is_repair"
               :key="obj.value"
@@ -204,6 +202,9 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item label="照片" prop="photo">
+          <obs-image-upload v-model="form.photo"/>
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
         </el-form-item>
@@ -290,6 +291,9 @@ export default {
         isMaintenance: [
           { required: true, message: "是否维修不能为空", trigger: "blur" }
         ],
+        photo: [
+          { required: true, message: "照片不能为空", trigger: "blur" }
+        ],
         remark: [
           { required: false, message: "备注不能为空", trigger: "blur" }
         ],
@@ -393,6 +397,7 @@ export default {
         type: 1,
         isQualified: undefined,
         isMaintenance: undefined,
+        photo: undefined,
         remark: undefined,
         delFlag: 0,
         createBy: undefined,