From 57c469bcd6166980c6e87add52932845149d026c Mon Sep 17 00:00:00 2001 From: Paidax Date: Fri, 19 Dec 2025 14:54:26 +0800 Subject: [PATCH] =?UTF-8?q?pref#hmc=5F=E7=AD=BE=E5=AD=97=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E3=80=81=E7=A6=8F=E5=88=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/v/nutz/base/utils/MsgApi.java | 4 +- .../controller/SignatureController.java | 10 +- .../v/nutz/zhgh/mobile/common/updateSign.java | 90 ++++- src/main/resources/application.properties | 8 +- .../plugins/smooth-signature/index.umd.min.js | 1 + .../static/components/sign/index.vue | 192 ++++++++++ .../static/components/sign/mobileSign.vue | 263 ++++++------- .../resources/static/components/sign/sign.vue | 346 +++++++++--------- .../resources/views/layouts/platform.html | 3 + src/main/resources/views/mobile/platform.html | 2 + .../views/platform/common/signature.html | 213 +++++------ .../views/platform/sys/log/index.html | 11 +- .../platform/welfare/list/ListMange.html | 10 +- .../views/platform/welfare/userChoose.html | 18 +- 14 files changed, 698 insertions(+), 473 deletions(-) create mode 100644 src/main/resources/static/assets/platform/plugins/smooth-signature/index.umd.min.js create mode 100644 src/main/resources/static/components/sign/index.vue diff --git a/src/main/java/io/v/nutz/base/utils/MsgApi.java b/src/main/java/io/v/nutz/base/utils/MsgApi.java index 7fd73c5..c28dc78 100644 --- a/src/main/java/io/v/nutz/base/utils/MsgApi.java +++ b/src/main/java/io/v/nutz/base/utils/MsgApi.java @@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonObject; import io.v.nutz.base.enums.Env; import io.v.nutz.web.commons.base.Globals; +import io.v.nutz.web.commons.slog.annotation.SLog; import lombok.extern.slf4j.Slf4j; import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.Inject; @@ -60,6 +61,7 @@ public class MsgApi { * @author zhf * @description */ + @SLog(type = "api", tag = "消息发送", msg = "推送钉钉消息", param = true, result = true) public void sendMsg(List channels, String loginNameStr, Integer mtype, String title, String content, String imageUrl,String link) { try { if (!Globals.MyConfig.getBoolean("SendMsg")) { @@ -82,7 +84,6 @@ public class MsgApi { if (Lang.isNotEmpty(loginNamesList)) { List> splitList = ListUtil.split(loginNamesList, 100); - for (List sublist : splitList) { // 获取token String msgToken = getMsgToken(); @@ -118,6 +119,7 @@ public class MsgApi { * @author zhf * @description */ + @SLog(type = "api", tag = "消息发送", msg = "推送钉钉消息", param = true, result = true) public void sendMsg(List channels, List loginNameList, Integer mtype, String title, String content, String imageUrl,String link) { try { if (!Globals.MyConfig.getBoolean("SendMsg")) { diff --git a/src/main/java/io/v/nutz/web/commons/controller/SignatureController.java b/src/main/java/io/v/nutz/web/commons/controller/SignatureController.java index 6210831..0493b2f 100644 --- a/src/main/java/io/v/nutz/web/commons/controller/SignatureController.java +++ b/src/main/java/io/v/nutz/web/commons/controller/SignatureController.java @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import cn.hutool.core.date.DateUtil; import cn.wizzer.framework.base.Result; import io.v.nutz.sys.models.Sys_file; +import io.v.nutz.web.commons.utils.ShiroUtil; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.nutz.boot.starter.ftp.FtpService; import org.nutz.dao.Dao; @@ -84,15 +85,18 @@ public class SignatureController { /** * 获取base64 * - * @param prefix 前缀 + * @param user_id 前缀 * @param id 唯一id * @return */ @At @Ok("json") @RequiresAuthentication - public Object getBase64(String prefix, String id) { - return redisService.get(prefix + ":" + id); + public Object getBase64(String user_id, String id) { + if (user_id == null) { + user_id = ShiroUtil.getUserId(); + } + return redisService.get(user_id + ":" + id); } diff --git a/src/main/java/io/v/nutz/zhgh/mobile/common/updateSign.java b/src/main/java/io/v/nutz/zhgh/mobile/common/updateSign.java index 6c03911..d8443bf 100644 --- a/src/main/java/io/v/nutz/zhgh/mobile/common/updateSign.java +++ b/src/main/java/io/v/nutz/zhgh/mobile/common/updateSign.java @@ -1,17 +1,27 @@ package io.v.nutz.zhgh.mobile.common; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import io.v.nutz.base.result.Result; import io.v.nutz.base.service.ViService; +import io.v.nutz.sys.models.Sys_file; import io.v.nutz.web.commons.utils.ShiroUtil; import io.v.nutz.zhgh.zgfw.model.UserSign; +import org.nutz.boot.starter.ftp.FtpService; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.integration.jedis.RedisService; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; +import org.nutz.lang.random.R; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.List; /** @@ -24,38 +34,96 @@ import java.util.List; @Ok("json:full") public class updateSign { + @Inject + private Dao dao; @Inject("UserSign") private ViService userSignService; - + @Inject + private FtpService ftpService; + @Inject + private RedisService redisService; @At - public void update(String sign, String user_id) { + public Result update(String sign, String user_id) { if (StrUtil.isBlank(user_id)) { - user_id = (String) ShiroUtil.getPrincipalProperty("id"); + user_id = ShiroUtil.getUserId(); } + String filePath = this.uploadSignData(sign); if (Strings.isNotBlank(getMySign(null))) { - userSignService.update(Chain.make("data", sign), Cnd.where("user_id", "=", user_id)); + userSignService.update(Chain.make("data", filePath), Cnd.where("user_id", "=", user_id)); } else { - userSignService.insert(new UserSign(user_id, sign)); + userSignService.insert(new UserSign(user_id, filePath)); } + return Result.success(); } + @At - public void update(String sign, String user_id, String prefix) { + public Result pcUpdate(String sign, String user_id, String id) { if (StrUtil.isBlank(user_id)) { - user_id = (String) ShiroUtil.getPrincipalProperty("id"); + user_id = ShiroUtil.getUserId(); } - if (Strings.isNotBlank(getMySign(prefix))) { - userSignService.update(Chain.make("data", sign), Cnd.where("user_id", "=", user_id)); + String filePath = this.uploadSignData(sign); + if (Strings.isNotBlank(getMySign(null))) { + userSignService.update(Chain.make("data", filePath), Cnd.where("user_id", "=", user_id)); } else { - userSignService.insert(new UserSign(user_id, sign, prefix)); + userSignService.insert(new UserSign(user_id, filePath)); } + redisService.setex(user_id + ":" + id, 60 * 10, filePath); + return Result.success(); + } + + + @At + public Result update(String sign, String user_id, String prefix) { + if (StrUtil.isBlank(user_id)) { + user_id = ShiroUtil.getUserId(); + } + + String filePath = this.uploadSignData(sign); + if (Strings.isNotBlank(getMySign(prefix))) { + userSignService.update(Chain.make("data", filePath), Cnd.where("user_id", "=", user_id)); + } else { + userSignService.insert(new UserSign(user_id, filePath, prefix)); + } + return Result.success(); } @At public String getMySign(String prefix) { - List userSigns = userSignService.query(Cnd.NEW().and("user_id", "=", ShiroUtil.getPrincipalProperty("id")) + List userSigns = userSignService.query(Cnd.NEW().and("user_id", "=", ShiroUtil.getUserId()) .andEX("prefix", "=", prefix)); return userSigns.isEmpty() ? null : userSigns.get(0).getData(); } + + + + public String uploadSignData(String data){ + String today = DateUtil.today(); + String[] split = today.split("-"); + String todayPath = "/signature/" + split[0] + "/" + split[1] + "/" + split[2]; + String fileName = R.UU32() + ".png"; + String fullPath = todayPath + "/" + fileName; + + String replaceData = data.replaceAll("data:image/png;base64,", ""); + + try (InputStream is = new ByteArrayInputStream(Base64.decode(replaceData))) { + boolean uploadRes = ftpService.upload(todayPath, fileName, is); + if (uploadRes) { + //上传成功记录到文件表 + Sys_file sys_file = new Sys_file(); + sys_file.setFilename(fileName); + sys_file.setFilepath(fullPath); + sys_file.setSource(null); + dao.insert(sys_file); + } else { + throw new RuntimeException("上传文件失败"); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("签字数据上传失败"); + } + return fullPath; + } + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 932faa1..2a6b269 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,7 +11,7 @@ jetty.page.500=/error/500.html #结合ftp使用,或用nginx代理ftp路径 jetty.staticPath=D://files #开发模式静态资源 -jetty.staticPathLocal=E:/project/company/zhgh_hmc/src/main/resources/static +jetty.staticPathLocal=G:/zhgh/zhgh_hmc/src/main/resources/static nutz.mvc.ignore=^(.+[.])(jsp|png|gif|jpg|js|css|jspx|jpeg|html|mp3|mp4|ico|svg)$ nutz.mvc.exclusions=/favicon/*,/assets/*,/druid/*,/upload/* ftp.enabled=true @@ -35,10 +35,12 @@ redis.pool.minIdle=10 redis.mode=normal #redis.nodes=192.168.6.31:6377,192.168.6.31:6378,192.168.6.28:6377,192.168.6.28:6378,192.168.6.34:6377,192.168.6.34:6378 jdbc.url=jdbc:mysql://192.168.21.204:3306/zhgh_hmc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +#jdbc.url=jdbc:mysql://10.112.101.15:3306/zhgh_hmc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true #jdbc.driver=dm.jdbc.driver.DmDriver #jdbc.url=jdbc:dm://127.0.0.1:5236?databaseProductName=dm mysql&compatibleMode=mysql jdbc.username=root -jdbc.password=123456 +jdbc.password=wqnmd2331 +#jdbc.password=mysql_Cb5XrP jdbc.validationQuery=select 1 jdbc.maxActive=500 jdbc.testWhileIdle=true @@ -75,7 +77,7 @@ shiro.url.login=/platform shiro.url.logout_redirect=/platform shiro.url.unauth=/platform #开发时设置本地路径,便于调试 -beetl.RESOURCE.rootLocal=E:/project/company/zhgh_hmc/src/main/resources/views/ +beetl.RESOURCE.rootLocal=G:/zhgh/zhgh_hmc/src/main/resources/views/ beetl.RESOURCE_LOADER=io.v.nutz.web.commons.ext.beetl.BeetlCustomResourceLoader beetl.RESOURCE.root=views/ beetl.DELIMITER_STATEMENT_START= + + + diff --git a/src/main/resources/views/mobile/platform.html b/src/main/resources/views/mobile/platform.html index 71511db..54aca2f 100644 --- a/src/main/resources/views/mobile/platform.html +++ b/src/main/resources/views/mobile/platform.html @@ -68,6 +68,8 @@ + + diff --git a/src/main/resources/views/platform/common/signature.html b/src/main/resources/views/platform/common/signature.html index 87ff150..2e325ed 100644 --- a/src/main/resources/views/platform/common/signature.html +++ b/src/main/resources/views/platform/common/signature.html @@ -1,55 +1,22 @@ - + - - - - 签字 - - - - - - - - - + + + + + + + + - - -
- -

提示:请在下方区域签字!

-
- - - - - - - - 清 空 - - - 提 交 - - - - - + +
+
- + - diff --git a/src/main/resources/views/platform/sys/log/index.html b/src/main/resources/views/platform/sys/log/index.html index 73b7729..eb84162 100644 --- a/src/main/resources/views/platform/sys/log/index.html +++ b/src/main/resources/views/platform/sys/log/index.html @@ -88,11 +88,18 @@ layout("/layouts/platform.html"){ prop="tag" width="120"> + + \ No newline at end of file +#--> diff --git a/src/main/resources/views/platform/welfare/list/ListMange.html b/src/main/resources/views/platform/welfare/list/ListMange.html index 4c8b671..4691a39 100644 --- a/src/main/resources/views/platform/welfare/list/ListMange.html +++ b/src/main/resources/views/platform/welfare/list/ListMange.html @@ -1043,6 +1043,12 @@ layout("/layouts/platform.html"){ r.name = "收货地址:" + r.province + r.city + r.county + r.addressDetail + ",收件人:" + r.userName + ",联系方式:" + r.tel }) this.addressOptions = resp.data + // 回显默认地址 + if (this.addressOptions) { + const address = this.addressOptions.find(a => a.isDefault) + this.$set(this.formData, "addressId", address.id) + this.$set(this.editWelfareData, "receiveAddress", address.name) + } }, addressChange(val) { const address = this.addressOptions.find(a => a.id === val) @@ -1123,6 +1129,8 @@ layout("/layouts/platform.html"){ } }) + // 把地址给置空然后重新复制 + this.formData.addressId = null this.exportWelfareListDialog = true const data = await searchUser(row.loginname, null, null, null, null) @@ -1165,7 +1173,7 @@ layout("/layouts/platform.html"){ for (const option of options) { // 检查是否有 specs - if (option.specs) { + if (option.specs && option.specs.length > 0) { // 检查 selectSpecs 是否为空或未定义 if (!option.selectSpecs) { this.$message.warning('请选择' + option.optionName + '的规格') diff --git a/src/main/resources/views/platform/welfare/userChoose.html b/src/main/resources/views/platform/welfare/userChoose.html index 722776d..62fa885 100644 --- a/src/main/resources/views/platform/welfare/userChoose.html +++ b/src/main/resources/views/platform/welfare/userChoose.html @@ -763,10 +763,26 @@ layout("/layouts/platform.html"){ //如果已选择 if (row.isChoose > 0) { + const data = this.addressOptions.map(r => { + const data = r.name = "收货地址:" + r.province + r.city + r.county + r.addressDetail + ",收件人:" + r.userName + ",联系方式:" + r.tel + const resultData = data.replace(/[,,::]/g, '') + return {id: r.id, name: resultData} + }) + + + const replace = this.userSelection[0].receiveAddress.replace(/[,,::]/g, '') + + let findData = data.find(v => v.name === replace) + + if (findData && Array.isArray(findData)) { + findData = findData[0] + } + this.$set(this.formData, "receiveAddress", this.userSelection[0].receiveAddress) - this.$set(this.formData, "addressId", null) + this.$set(this.formData, "addressId", findData.id) this.$set(this.formData, "sign", this.userSelection[0].userSign) } else { + debugger const address = this.addressOptions.find(a => a.isDefault) if (address) { this.$set(this.formData, "receiveAddress", address.name)