From 369eceed6d3ed85cce3c345a84650db652dd7846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E6=A2=A6?= Date: Wed, 27 May 2026 20:02:10 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=BB=E6=9D=BF?= =?UTF-8?q?=E5=86=8D=E6=AC=A1=E7=BC=96=E8=BE=91=E6=97=A0=E6=B3=95=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.test | 2 +- src/components/SignaturePad/index.vue | 29 ++++++++++++++------ src/components/question/answer/HandDrawn.vue | 9 +++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.env.test b/.env.test index 2c2a62d..9f413ec 100644 --- a/.env.test +++ b/.env.test @@ -4,6 +4,6 @@ VITE_OSS_URL = https://lxx-web-1313840333.cos.ap-chengdu.myqcloud.com VITE_CDN_URL = https://dmgcdn-1313840333.cos.ap-guangzhou.myqcloud.com VITE_SERVER_URL = http://127.0.0.1:9053/api/main # VITE_SERVER_URL = http://test.web.xuexiaole.com/api/main -VITE_XXL_VERSION=2.13.6 +VITE_XXL_VERSION=2.13.7 VITE_INIT_VCONSOLE = 0 VITE_TEACHER_ADMIN_URL = https://test.edu.xuexiaole.com diff --git a/src/components/SignaturePad/index.vue b/src/components/SignaturePad/index.vue index dbb00a2..19fda9d 100644 --- a/src/components/SignaturePad/index.vue +++ b/src/components/SignaturePad/index.vue @@ -37,6 +37,9 @@ async function drawBackground(src: string, taskId = paintTaskId) { const draw = async (imgSrc: string) => { const img = new Image() + if (/^https?:\/\//i.test(imgSrc)) { + img.crossOrigin = 'anonymous' + } img.src = imgSrc await new Promise((resolve, reject) => { img.onload = () => resolve() @@ -114,15 +117,25 @@ function handleSaveAsync(): Promise<{ blob: Blob | null; data: string | null }> const canvas = canvasRef.value as HTMLCanvasElement const pointData = JSON.stringify(signaturePad.toData()) const resolveWithFallback = (blob: Blob | null) => { - resolve({ - blob: blob || dataUrlToBlob(canvas.toDataURL('image/jpeg', 0.85)), - data: pointData, - }) + try { + resolve({ + blob: blob || dataUrlToBlob(canvas.toDataURL('image/jpeg', 0.85)), + data: pointData, + }) + } catch (error) { + console.error('canvas export error', error) + resolve({ blob: null, data: pointData }) + } } - if (typeof canvas.toBlob === 'function') { - canvas.toBlob(resolveWithFallback, 'image/jpeg', 0.85) - } else { - resolveWithFallback(null) + try { + if (typeof canvas.toBlob === 'function') { + canvas.toBlob(resolveWithFallback, 'image/jpeg', 0.85) + } else { + resolveWithFallback(null) + } + } catch (error) { + console.error('canvas export error', error) + resolve({ blob: null, data: pointData }) } }) } diff --git a/src/components/question/answer/HandDrawn.vue b/src/components/question/answer/HandDrawn.vue index 93ca602..9209359 100644 --- a/src/components/question/answer/HandDrawn.vue +++ b/src/components/question/answer/HandDrawn.vue @@ -59,7 +59,7 @@ async function save() { const { blob, data } = await signaturePadRef.value.handleSaveAsync() if (!blob) { - return XMessage.error('内容为空,无法保存') + return XMessage.error(data ? '画板图片导出失败,请重试' : '内容为空,无法保存') } if (typeof props.uploadFile !== 'function') { @@ -192,13 +192,12 @@ watch(showCanvas, async (nv: boolean) => { pen() const bg = viewPic.value const data = props.isAndroid ? '' : props.submitAnswerPicOriginal || '' - if (bg) { + if (data) { + signaturePadRef.value?.handleLoad?.(data) + } else if (bg) { await signaturePadRef.value?.setBackgroundImage?.(bg) } if (!showCanvas.value || currentSessionId !== canvasSessionId) return - if (data) { - signaturePadRef.value?.handleLoad?.(data) - } })