| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 | <template>	<view>		<u--form :model="inputForm" labelWidth="100px" class="u-form" labelPosition="left" ref="inputForm">			<u-form-item label="旧签名" borderBottom prop="signPic">				<u--image :showLoading="true" :src="BASE_URL + inputForm.signPic " width="100px"					height="40px"></u--image>			</u-form-item>			<u-form-item label="上传签字图片" borderBottom prop="signPic">				<u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" :maxCount="1"></u-upload>			</u-form-item>			<u--text size="10" type="warning" text="有签名图片,请上传,无,请点击下面签字生成"></u--text>			<u-form-item label="签字" borderBottom prop="signPic">				<signInput ref="sign" canvasId="twoDrowCanvas" canvasIds="twoRotateCanvas" :header="header"					:action="action" @signToUrl="signToUrl">				</signInput>			</u-form-item>			<view class="padding-xl">				<u-button type="primary" @click="formSubmit" text="提交"></u-button>			</view>		</u--form>	</view></template><script>	import userService from "@/api/sys/userService"	import * as $auth from "@/common/auth.js"	import BASE_URL from '@/config.js'	import signInput from "@/components/am-sign-input/am-sign-input.vue"	export default {		components: {			signInput		},		data() {			return {				action: this.BASE_URL + '/gwfile/upload?uploadPath=sign', //上传服务器的地址				header: {					"token": this.$auth.getUserToken()				}, //图片上传携带头部信息				loading: false,				inputForm: this.$auth.getUserInfo(),				fileList: [],			}		},		methods: {			/**			 * @param {Object} e			 * 签名完成回调			 */			signToUrl(e) {				this.inputForm.signPic = e.data				if (e.error_code && e.error_code === '201') {					uni.showToast({						title: e.msg,						icon: 'none'					})					return				}			},			// 删除图片			deletePic(event) {				this.fileList.splice(event.index, 1)			},			// 图片压缩			compressH5(urlData, targetSizeKB, initialQuality = 1.0) {				const maxQuality = 1.0;				const minQuality = 0.0;				const tolerance = 0.01; // 根据需要调整公差				let that = this				return new Promise((resolve, reject) => {					let binarySearch = (min, max) => {						const midQuality = (min + max) / 2;						uni.getImageInfo({							src: urlData.url,							success(res) {								let img = new Image()								img.src = res.path								img.onload = function() {									const canvas = document.createElement('canvas');									const ctx = canvas.getContext('2d');												canvas.width = img.width;									canvas.height = img.height;												ctx.clearRect(0, 0, canvas.width, canvas.height);									ctx.drawImage(img, 0, 0, canvas.width, canvas.height);												// 使用异步的 toBlob 方法									canvas.toBlob(async (blob) => {										const fileSizeKB = blob.size / 1024;										if (Math.abs(fileSizeKB - targetSizeKB) <											tolerance || max - min < tolerance) {											// 当前质量足够接近目标大小,使用当前质量解析											const dataUrl = canvas.toDataURL(urlData.type, midQuality);											let result = that												.uploadFilePromise(dataUrl)											setTimeout(() => {												resolve(													result)											}, 1000)													} else if (fileSizeKB > targetSizeKB) {											// 如果文件大小太大,降低质量,继续二分查找											binarySearch(min, midQuality);										} else {											// 如果文件大小太小,增加质量,继续二分查找											binarySearch(midQuality, max);										}									}, urlData.type, midQuality);								};							},							fail() {								uni.showModal({									title: '提示',									content: '图片压缩失败',									showCancel: false								});							}						})					}					// 开始二分查找					binarySearch(minQuality, maxQuality);				})			},			// 新增图片			async afterRead(event) {								// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式				let lists = [].concat(event.file)								let fileListLen = this.fileList.length				lists.map((item) => {					this.fileList.push({						...item,						status: 'uploading',						message: '上传中'					})				})				for (let i = 0; i < lists.length; i++) {										let result = ""					if (lists[i].size > (200 * 1024)) {						result = await this.compressH5(lists[i], 150);											} else {						result = await this.uploadFilePromise(lists[i].url)					}										let item = this.fileList[fileListLen]					this.fileList.splice(fileListLen, 1, Object.assign(item, {						status: 'success',						message: '',						url: result					}))					console.log("result", result);					fileListLen++				}			},			uploadFilePromise(url) {				return new Promise((resolve, reject) => {					let a = uni.uploadFile({						url: this.BASE_URL + '/gwfile/upload?uploadPath=signature',						filePath: url,						name: 'file',						header: {							"token": $auth.getUserToken()						},						success: (res) => {							setTimeout(() => {								resolve(res.data)							}, 1000)						}					});				})			},			formSubmit: function(e) {				//定义表单规则				// this.$refs.inputForm.validate().then(res => {				uni.showLoading()				let files = []				if (this.fileList.length > 0) {					this.fileList.forEach(item => {						files.push(item.url)					})					this.inputForm.signPic = files.join(",");				}				userService.saveInfo(this.inputForm).then((data) => {					$auth.setUserInfo(this.inputForm)					uni.showToast({						title: data,						icon: "success",						complete: function(res) {							uni.redirectTo({								url: '/pages/index/index'							})						}					});				})			}		}	}</script><style>	.btn-logout {		margin-top: 100upx;		width: 80%;		border-radius: 50upx;		font-size: 16px;		color: #fff;		background: linear-gradient(to right, #365fff, #36bbff);	}	.btn-logout-hover {		background: linear-gradient(to right, #365fdd, #36bbfa);	}	.cu-form-group .title {		min-width: calc(4em + 40px);	}</style>
 |