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