From a20c6320930aaf752ac9c55c476e4fbdf76bc300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=AD=A6=E6=88=90?= <1274337408@qq.com> Date: Mon, 26 Oct 2026 16:40:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=85=B0=E9=97=AE=E7=94=B3=E8=AF=B7-=E6=A0=A1?= =?UTF-8?q?=E5=B7=A5=E4=BC=9A=E5=8A=9E=E5=85=AC=E5=AE=A4=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=EF=BC=9APC=20=E8=BF=9B=E5=85=A5=E5=AE=A1=E6=A0=B8=E6=97=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=AF=86=E5=88=AB=E5=B9=B6=E6=B8=85=E9=99=A4?= =?UTF-8?q?=20[object=20Object]=20=E7=AD=89=E5=BC=82=E5=B8=B8=E7=AD=BE?= =?UTF-8?q?=E5=AD=97=E7=BC=93=E5=AD=98(localStorage.getItem('signature'))?= =?UTF-8?q?=EF=BC=8C=E9=87=8D=E6=96=B0=E7=94=9F=E6=88=90=E7=AD=BE=E5=AD=97?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/condolence/CondolenceVcrCon.java | 5 +++++ .../views/platform/zgfw/condolence/vcr.html | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/v/nutz/zgfw/controller/condolence/CondolenceVcrCon.java b/src/main/java/io/v/nutz/zgfw/controller/condolence/CondolenceVcrCon.java index 7dd3e5b..8c88862 100644 --- a/src/main/java/io/v/nutz/zgfw/controller/condolence/CondolenceVcrCon.java +++ b/src/main/java/io/v/nutz/zgfw/controller/condolence/CondolenceVcrCon.java @@ -18,6 +18,7 @@ import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; @@ -117,6 +118,10 @@ public class CondolenceVcrCon { && !Integer.valueOf(3).equals(pass)) { return Result.error("请选择审批意见!"); } + String sign = review == null ? null : review.getSign(); + if (Strings.isBlank(sign) || !sign.startsWith("data:image/") || !sign.contains(";base64,")) { + return Result.error("签字数据异常,请重新签字!"); + } review.setLoginname(ShiroUtil.getPrincipalProperty("loginname").toString()); review.setUsername(ShiroUtil.getPrincipalProperty("username").toString()); review.setTime(DateUtil.getDate()); diff --git a/src/main/resources/views/platform/zgfw/condolence/vcr.html b/src/main/resources/views/platform/zgfw/condolence/vcr.html index 14551c8..1fd2c29 100644 --- a/src/main/resources/views/platform/zgfw/condolence/vcr.html +++ b/src/main/resources/views/platform/zgfw/condolence/vcr.html @@ -237,6 +237,9 @@ layout("/layouts/platform.html"){ 'info': httpVueLoader('/components/condolence/Info.vue?v=1.0.2'), }, methods: { + isValidSign(sign) { + return typeof sign === 'string' && /^data:image\/(png|jpeg|jpg);base64,/i.test(sign) + }, dropdownCommand(command) { const {type, data} = command if (type == 'view') { @@ -247,12 +250,18 @@ layout("/layouts/platform.html"){ }, async openReview(row) { const {id} = row + const cachedSign = localStorage.getItem('signature') + if (cachedSign && !this.isValidSign(cachedSign)) { + // 仅清理当前浏览器中的异常签字缓存,避免 [object Object] 再次提交。 + localStorage.removeItem('signature') + } this.formData = { id, username: "${@shiro.getPrincipalProperty('username')}", time: moment().format('YYYY-MM-DD'), pass: null, + sign: '', } this.subLoading1 = false this.subLoading2 = false @@ -268,8 +277,10 @@ layout("/layouts/platform.html"){ this.formData.pass = pass } // 签字由自定义组件回写,审核提交前单独判断,避免 Element 表单漏过空签字。 - if (!this.formData.sign) { - this.$message.warning('请签字') + if (!this.isValidSign(this.formData.sign)) { + localStorage.removeItem('signature') + this.$set(this.formData, 'sign', '') + this.$message.warning('签字数据异常,请重新签字') return } this.$refs["form"].validate(async (valid) => {