From 064128dfb784d9780aa4ac5dbd897c29d46a2666 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期五, 01 十一月 2024 15:22:47 +0800
Subject: [PATCH] ll

---
 admin/src/components/business/OperaMemberWindow.vue |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 159 insertions(+), 1 deletions(-)

diff --git a/admin/src/components/business/OperaMemberWindow.vue b/admin/src/components/business/OperaMemberWindow.vue
index c4b80a8..e371f39 100644
--- a/admin/src/components/business/OperaMemberWindow.vue
+++ b/admin/src/components/business/OperaMemberWindow.vue
@@ -54,7 +54,37 @@
           </div>
         </div>
       </el-form-item>
+      <el-form-item>
+        <div><el-button type="primary" @click="openCamera">閲囬泦</el-button></div>
+      </el-form-item>
     </el-form>
+    <!--  -->
+    <el-dialog title="鎷嶆憚" :visible.sync="paisheModal" width="760px" :close-on-click-modal="false"
+      :close-on-press-escape="false" append-to-body @close="closeCamera">
+      <video v-show="isShowCamera" id="videoCamera" :width="videoWidth" :height="videoHeight" />
+      <canvas v-show="!isShowCamera" id="canvasCamera" style="display: none" :width="videoWidth"
+        :height="videoHeight" />
+      <span slot="footer">
+        <div>
+          <el-button @click="closeCamera">鍙栨秷</el-button>
+          <el-button v-show="blobFileCamera" type="primary" @click="resetCamera">閲嶆媿</el-button>
+          <el-button v-show="blobFileCamera" :loading="cameraLoading" type="primary"
+            @click="enterCamera">寮�濮嬭鍓�</el-button>
+          <el-button v-show="!blobFileCamera" type="primary" @click="setImage">鎷嶆憚</el-button>
+        </div>
+      </span>
+    </el-dialog>
+    <!--  -->
+    <el-dialog append-to-body :close-on-click-modal="false" title="涓婁紶鍥剧墖" :visible.sync="isShowCropper" width="1000px"
+      class="icon-dialog-wrapper dialong-com-style">
+      <ImageCropper ref="iconShot" v-if="isShowCropper" :imgSrc="blobFileCamera">
+      </ImageCropper>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="loading">鍙� 娑�</el-button>
+        <el-button v-else @click="isShowCropper = false">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="uploadIcon">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
   </GlobalWindow>
 </template>
 
@@ -63,14 +93,26 @@
 import GlobalWindow from '@/components/common/GlobalWindow'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 import UploadFaceImg from '@/components/common/UploadFaceImg'
+import ImageCropper from '@/components/common/ImageCropper'
 import { checkMobile, validIdCardNo, validIdCardNoNew } from '@/utils/form'
 import { allList } from '@/api/business/position'
+import { upload } from '@/api/system/common'
 export default {
   name: 'OperaCompanyWindow',
   extends: BaseOpera,
-  components: { GlobalWindow, UploadAvatarImage, UploadFaceImg },
+  components: { GlobalWindow, UploadAvatarImage, UploadFaceImg, ImageCropper },
   data() {
     return {
+      isShowCamera: false,
+      paisheModal: false,
+      cameraLoading: false,
+      videoWidth: 700,
+      videoHeight: 525,
+      mediaStreamCamera: '',
+      blobFileCamera: '',
+      isShowCropper: false,
+      loading: false,
+      // 浠ヤ笂鏄媿鎽�
       uploadData: {
         folder: 'member'
       },
@@ -119,6 +161,122 @@
     })
   },
   methods: {
+    openCamera() {
+      this.paisheModal = true
+      this.isShowCamera = true
+      const that = this
+      this.$nextTick(() => {
+        var mediaOpts = { audio: false, video: true }
+        navigator.mediaDevices
+          .getUserMedia(mediaOpts)
+          .then(function (stream) {
+            that.mediaStreamCamera = stream
+            const video = document.querySelector('#videoCamera')
+            if ('srcObject' in video) {
+              video.srcObject = stream
+            } else {
+              video.src =
+                (window.URL && window.URL.createObjectURL(stream)) || stream
+            }
+            video.play()
+          })
+          .catch(function (err) {
+            console.log(err)
+          })
+      })
+    },
+    // 閲嶆媿
+    resetCamera() {
+      this.isShowCamera = true
+      this.blobFileCamera = ''
+      this.openCamera()
+    },
+    // 鍏抽棴鐩告満
+    closeCamera() {
+      this.mediaStreamCamera.getVideoTracks().forEach(function (track) {
+        track.stop()
+      })
+      this.paisheModal = false
+    },
+    // 鐐瑰嚮鎷嶆憚
+    setImage() {
+      const that = this
+      that.isShowCamera = false
+      const video = document.querySelector('#videoCamera')
+      const canvas = document.querySelector('#canvasCamera')
+      canvas
+        .getContext('2d')
+        .drawImage(video, 0, 0, that.videoWidth, that.videoHeight)
+      this.mediaStreamCamera.getVideoTracks().forEach(function (track) {
+        track.stop()
+      })
+      const dataurl = canvas.toDataURL('image/jpg')
+      // this.blobFileCamera = that.base64ToFile(dataurl, 'camera')
+      this.blobFileCamera = dataurl
+    },
+    // 纭鎷嶆憚
+    enterCamera() {
+      this.isShowCropper = true
+      this.paisheModal = false
+      this.isShowCamera = true
+    },
+    uploadIcon () {
+      // 鑾峰彇瑁佸壀鍚庣殑鍥剧墖
+      this.$refs.iconShot.getImagecropper().getCropBlob((fileData) => { // 鑾峰彇褰撳墠瑁佸壀濂界殑鏁版嵁
+        // 娉ㄦ鏃剁殑data鏄竴涓狟lob鏁版嵁锛岄儴鍒嗘帴鍙f帴鏀剁殑鏄疐ile杞寲鐨凢ormData鏁版嵁
+        console.log(fileData)
+        const formData = new FormData()
+
+        formData.append('folder', 'member')
+        formData.append(
+            'file',
+            fileData
+        )
+        this.loading = true
+        upload(formData).then(res => {
+          this.loading = false
+          console.log(res)
+          // this.file.imgurl = res.imgaddr
+          // this.file.imgurlfull = res.url
+          this.$message.success('涓婁紶鎴愬姛')
+          // this.imageSrc = res.url
+          // this.updateImg = false
+          this.form.faceImg = res.imgaddr
+          this.form.faceImgFull = res.url
+          // this.$emit('uploadSuccess', { imgurl: res.imgaddr, imgurlfull: res.url, name: res.originname })
+          // this.$emit('uploadEnd')
+        }, () => {
+          this.loading = false
+        })
+      })
+    },
+    base64ToFile(base64, fileName) {
+      // 灏哹ase64鎸夌収 , 杩涜鍒嗗壊 灏嗗墠缂�  涓庡悗缁唴瀹瑰垎闅斿紑
+      const data = base64.split(',')
+      // 鍒╃敤姝e垯琛ㄨ揪寮� 浠庡墠缂�涓幏鍙栧浘鐗囩殑绫诲瀷淇℃伅锛坕mage/png銆乮mage/jpeg銆乮mage/webp绛夛級
+      const type = data[0].match(/:(.*?);/)[1]
+      // 浠庡浘鐗囩殑绫诲瀷淇℃伅涓� 鑾峰彇鍏蜂綋鐨勬枃浠舵牸寮忓悗缂�锛坧ng銆乯peg銆亀ebp锛�
+      const suffix = type.split('/')[1]
+      // 浣跨敤atob()瀵筨ase64鏁版嵁杩涜瑙g爜  缁撴灉鏄竴涓枃浠舵暟鎹祦 浠ュ瓧绗︿覆鐨勬牸寮忚緭鍑�
+      const bstr = window.atob(data[1])
+      // 鑾峰彇瑙g爜缁撴灉瀛楃涓茬殑闀垮害
+      let n = bstr.length
+      // 鏍规嵁瑙g爜缁撴灉瀛楃涓茬殑闀垮害鍒涘缓涓�涓瓑闀跨殑鏁村舰鏁板瓧鏁扮粍
+      // 浣嗗湪鍒涘缓鏃� 鎵�鏈夊厓绱犲垵濮嬪�奸兘涓� 0
+      const u8arr = new Uint8Array(n)
+      // 灏嗘暣褰㈡暟缁勭殑姣忎釜鍏冪礌濉厖涓鸿В鐮佺粨鏋滃瓧绗︿覆瀵瑰簲浣嶇疆瀛楃鐨刄TF-16 缂栫爜鍗曞厓
+      while (n--) {
+        // charCodeAt()锛氳幏鍙栫粰瀹氱储寮曞瀛楃瀵瑰簲鐨� UTF-16 浠g爜鍗曞厓
+        u8arr[n] = bstr.charCodeAt(n)
+      }
+      // 鍒╃敤鏋勯�犲嚱鏁板垱寤篎ile鏂囦欢瀵硅薄
+      // new File(bits, name, options)
+      const file = new File([u8arr], `${fileName}.${suffix}`, {
+        type: type
+      })
+      // 灏咶ile鏂囦欢瀵硅薄杩斿洖缁欐柟娉曠殑璋冪敤鑰�
+      return file
+    },
     handleChangeCompany(value) {
       if (this.form.company && this.form.company.length > 1) {
         this.form.companyId = this.form.company[this.form.company.length - 1]

--
Gitblit v1.9.3