From 5ec39da24153336f77cf75db73e312ebb98a4b39 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Thu, 11 Sep 2025 13:56:15 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bonus/business/controller/ProductScreenController.java | 5 +++--
.../src/main/resources/mapper/business/TbProductMapper.xml | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/bonus-business/src/main/java/com/bonus/business/controller/ProductScreenController.java b/bonus-business/src/main/java/com/bonus/business/controller/ProductScreenController.java
index b58f874..351b814 100644
--- a/bonus-business/src/main/java/com/bonus/business/controller/ProductScreenController.java
+++ b/bonus-business/src/main/java/com/bonus/business/controller/ProductScreenController.java
@@ -6,6 +6,7 @@ import com.bonus.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -25,11 +26,11 @@ public class ProductScreenController {
*/
@PostMapping("/getProductList")
- public AjaxResult getProductList(TbProduct product ){
+ public AjaxResult getProductList(@RequestBody TbProduct product ){
return service.getProductList(product) ;
}
@PostMapping("/getProductDetails")
- public AjaxResult getProductDetails(TbProduct product ){
+ public AjaxResult getProductDetails(@RequestBody TbProduct product ){
return service.getProductDetails(product) ;
}
diff --git a/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml b/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
index d027a84..7cdb22e 100644
--- a/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
+++ b/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
@@ -14,7 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join sys_user su on su.user_id=tpt.create_user
where tpt.del_flag=0
and tpt.name like concat('%',#{name},'%')
- and tpt.type_id = #{typeId}
+ and tpt.type_id = #{typeId}
and sdd.dict_label like concat('%', #{typeName}, '%')
and tpt.is_access = #{isAccess}
and tpt.introduction like concat('%', #{typeName},'%')
From e4effd6b3c41c04cd6ef05d713c4edb0480d0a56 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Thu, 11 Sep 2025 15:11:17 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/system/SysLoginController.java | 7 +-
bonus-business/pom.xml | 12 +-
.../controller/VideoToMp4Converter.java | 61 +++++++++
.../bonus/business/mapper/ProductMapper.java | 7 +
.../service/impl/ProductScreenImpl.java | 9 +-
.../service/impl/ProductServiceImpl.java | 8 ++
.../mapper/business/ProductScreenMapper.xml | 14 +-
.../mapper/business/TbProductMapper.xml | 11 +-
bonus-common/pom.xml | 5 +
.../bonus/common/encryption/AesCbcUtils.java | 120 ++++++++++++++++++
.../com/bonus/common/encryption/Sm2Util.java | 68 ++++++++++
.../com/bonus/common/encryption/Sm3Util.java | 31 +++++
.../com/bonus/common/encryption/Sm4Utils.java | 67 ++++++++++
.../web/service/SysLoginService.java | 4 +
14 files changed, 411 insertions(+), 13 deletions(-)
create mode 100644 bonus-business/src/main/java/com/bonus/business/controller/VideoToMp4Converter.java
create mode 100644 bonus-common/src/main/java/com/bonus/common/encryption/AesCbcUtils.java
create mode 100644 bonus-common/src/main/java/com/bonus/common/encryption/Sm2Util.java
create mode 100644 bonus-common/src/main/java/com/bonus/common/encryption/Sm3Util.java
create mode 100644 bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
diff --git a/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java b/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
index be2b112..76cc6fd 100644
--- a/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
+++ b/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
@@ -3,6 +3,7 @@ package com.bonus.base.controller.system;
import java.util.List;
import java.util.Set;
+import com.bonus.common.encryption.Sm4Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -45,7 +46,6 @@ public class SysLoginController
public AjaxResult sendPhone(@RequestBody String phone) {
// 下发短信
AjaxResult ajax= loginService.sendPhone(phone);
-
return ajax;
}
@@ -58,17 +58,18 @@ public class SysLoginController
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) {
+
String token;
AjaxResult ajax = AjaxResult.success();
if("2".equals(loginBody.getLoginType())){
+
+
token = loginService.login(loginBody.getUsername(), loginBody.getCode());
}else{
token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
}
-
// 生成令牌
-
ajax.put(Constants.TOKEN, token);
return ajax;
}
diff --git a/bonus-business/pom.xml b/bonus-business/pom.xml
index 497182b..2118cf1 100644
--- a/bonus-business/pom.xml
+++ b/bonus-business/pom.xml
@@ -13,7 +13,17 @@
-
+
+
+ org.bytedeco
+ javacv
+ 1.5.10
+
+
+ org.bytedeco
+ javacv-platform
+ 1.5.10
+
com.bonus
diff --git a/bonus-business/src/main/java/com/bonus/business/controller/VideoToMp4Converter.java b/bonus-business/src/main/java/com/bonus/business/controller/VideoToMp4Converter.java
new file mode 100644
index 0000000..9aea8e4
--- /dev/null
+++ b/bonus-business/src/main/java/com/bonus/business/controller/VideoToMp4Converter.java
@@ -0,0 +1,61 @@
+package com.bonus.business.controller;
+
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.FFmpegFrameRecorder;
+import org.bytedeco.javacv.Frame;
+
+public class VideoToMp4Converter {
+
+ /**
+ * 将视频文件转换为MP4格式
+ * @param inputPath 输入视频文件路径
+ * @param outputPath 输出MP4文件路径
+ * @throws Exception 转换过程中的异常
+ */
+ public static void convertToMp4(String inputPath, String outputPath) throws Exception {
+ // 创建FFmpegFrameGrabber对象,读取输入视频
+ FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputPath);
+ grabber.start();
+
+ // 创建FFmpegFrameRecorder对象,设置输出视频参数
+ FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputPath,
+ grabber.getImageWidth(),
+ grabber.getImageHeight());
+
+ // 设置视频编码为H.264
+ recorder.setVideoCodec(org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_H264);
+ // 设置输出格式为MP4
+ recorder.setFormat("mp4");
+ // 设置帧率与原视频保持一致
+ recorder.setFrameRate(grabber.getFrameRate());
+ // 设置音频通道数
+ recorder.setAudioChannels(grabber.getAudioChannels());
+ // 设置音频编码
+ recorder.setAudioCodec(org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_AAC);
+
+ recorder.start();
+
+ // 循环读取视频帧并进行录制
+ Frame frame;
+ while ((frame = grabber.grabFrame()) != null) {
+ recorder.record(frame);
+ }
+
+ // 关闭抓取器和录制器
+ recorder.stop();
+ grabber.stop();
+
+ System.out.println("视频转换完成!输出文件:" + outputPath);
+ }
+
+ // 测试方法
+ public static void main(String[] args) {
+ try {
+ String inputVideo = "input_video.flv"; // 输入视频文件,可以是任何格式
+ String outputMp4 = "output_video.mp4"; // 输出MP4文件
+ convertToMp4(inputVideo, outputMp4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/bonus-business/src/main/java/com/bonus/business/mapper/ProductMapper.java b/bonus-business/src/main/java/com/bonus/business/mapper/ProductMapper.java
index 1e1acb2..e9460dc 100644
--- a/bonus-business/src/main/java/com/bonus/business/mapper/ProductMapper.java
+++ b/bonus-business/src/main/java/com/bonus/business/mapper/ProductMapper.java
@@ -107,4 +107,11 @@ public interface ProductMapper {
* @return
*/
int delProduct(TbProduct product);
+
+ /**
+ * 判断名称是否存在
+ * @param product
+ * @return
+ */
+ Integer getProductByName(TbProduct product);
}
diff --git a/bonus-business/src/main/java/com/bonus/business/service/impl/ProductScreenImpl.java b/bonus-business/src/main/java/com/bonus/business/service/impl/ProductScreenImpl.java
index b12211a..a75f3e5 100644
--- a/bonus-business/src/main/java/com/bonus/business/service/impl/ProductScreenImpl.java
+++ b/bonus-business/src/main/java/com/bonus/business/service/impl/ProductScreenImpl.java
@@ -56,10 +56,14 @@ public class ProductScreenImpl implements ProductScreenService {
@Override
public AjaxResult getProductDetails(TbProduct product) {
try{
+ //详情
TbProduct vo=mapper.getProductDetails(product);
if(vo!=null){
+ //封面图
+ vo.setLinkImage(minioConfig.getUrl()+"/"+minioConfig.getBucketName()+vo.getLinkImage());
List productCases=productMapper.getProductCaseList(product.getId());
for (TbProductCase productCase:productCases) {
+ //产品案例
List caseImages=productMapper.getCaseImageByTable(productCase.getId(),"tb_product_case");
if(StringUtils.isNotEmpty(caseImages)){
caseImages.forEach(image->{
@@ -68,12 +72,14 @@ public class ProductScreenImpl implements ProductScreenService {
productCase.setImageList(caseImages);
}
}
+ vo.setList(productCases);
//查询 宣传手册和宣传视频
List list=mapper.getMaterialList(vo);
List videoList=new ArrayList<>();
List fileList=new ArrayList<>();
if(StringUtils.isNotEmpty(list)){
list.forEach(vo1->{
+ vo1.setImage(minioConfig.getUrl()+"/"+minioConfig.getBucketName()+vo1.getImage());
vo1.setUrl(minioConfig.getUrl()+"/"+minioConfig.getBucketName()+vo1.getFilePath());
if("0".equals(vo1.getFileType())){
videoList.add(vo1);
@@ -85,9 +91,10 @@ public class ProductScreenImpl implements ProductScreenService {
vo.setFileList(fileList);
}
}
+ return AjaxResult.success(vo);
}catch (Exception e){
log.error(e.toString());
}
- return null;
+ return AjaxResult.success(product);
}
}
diff --git a/bonus-business/src/main/java/com/bonus/business/service/impl/ProductServiceImpl.java b/bonus-business/src/main/java/com/bonus/business/service/impl/ProductServiceImpl.java
index 44c3ef3..3d2417f 100644
--- a/bonus-business/src/main/java/com/bonus/business/service/impl/ProductServiceImpl.java
+++ b/bonus-business/src/main/java/com/bonus/business/service/impl/ProductServiceImpl.java
@@ -98,6 +98,10 @@ public class ProductServiceImpl implements ProductService {
product.setCreateUser(SecurityUtils.getUserId().toString());
product.setUpdateUser(SecurityUtils.getUserId().toString());
//新增产品及产品文件
+ Integer isName=mapper.getProductByName(product);
+ if(isName!=null && isName>0){
+ return AjaxResult.error("产品名称已存在");
+ }
int num=mapper.addProduct(product);
List prFile=map.get("s");
AjaxResult ajaxResult1=uploadFile(prFile,"tb_product",product.getId(),"产品封面");
@@ -157,6 +161,10 @@ public class ProductServiceImpl implements ProductService {
//修改产品
List proList=map.get("s");
product.setUpdateUser(SecurityUtils.getUserId().toString());
+ Integer isName=mapper.getProductByName(product);
+ if(isName!=null && isName>0){
+ return AjaxResult.error("产品名称已存在");
+ }
int isSuccess=mapper.updateProduct(product);
//未跟新文件
if(StringUtils.isNotEmpty(proList)){
diff --git a/bonus-business/src/main/resources/mapper/business/ProductScreenMapper.xml b/bonus-business/src/main/resources/mapper/business/ProductScreenMapper.xml
index 818a16f..20099b4 100644
--- a/bonus-business/src/main/resources/mapper/business/ProductScreenMapper.xml
+++ b/bonus-business/src/main/resources/mapper/business/ProductScreenMapper.xml
@@ -26,14 +26,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where tpt.id=#{id}
\ No newline at end of file
diff --git a/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml b/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
index 7cdb22e..73a2bd0 100644
--- a/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
+++ b/bonus-business/src/main/resources/mapper/business/TbProductMapper.xml
@@ -59,6 +59,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from tb_product_case
where product_id=#{id} and del_flag=0
+
insert into tb_product
@@ -120,7 +129,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
is_link = #{isLink},
introduction = #{introduction},
del_flag = #{delFlag},
- isAccess = #{isAccess},
+ is_access = #{isAccess},
update_time =now(), update_user=#{updateUser}
where id = #{id}
diff --git a/bonus-common/pom.xml b/bonus-common/pom.xml
index 2df71b3..a3bf8e8 100644
--- a/bonus-common/pom.xml
+++ b/bonus-common/pom.xml
@@ -16,6 +16,11 @@
+
+ org.bouncycastle
+ bcprov-jdk15on
+ 1.70
+
cn.hutool
hutool-all
diff --git a/bonus-common/src/main/java/com/bonus/common/encryption/AesCbcUtils.java b/bonus-common/src/main/java/com/bonus/common/encryption/AesCbcUtils.java
new file mode 100644
index 0000000..2429b9a
--- /dev/null
+++ b/bonus-common/src/main/java/com/bonus/common/encryption/AesCbcUtils.java
@@ -0,0 +1,120 @@
+package com.bonus.common.encryption;
+
+import com.bonus.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.Security;
+
+/**
+ * AES加密工具类
+ *
+ * @author HeiZi
+ */
+@Slf4j
+public class AesCbcUtils {
+ //使用AES-256-CBC加密模式,key需要为16位,key和iv可以相同!
+
+ /**
+ * 密钥算法
+ */
+ private static final String KEY_ALGORITHM = "AES";
+
+ /**
+ * 加密/解密算法 / 工作模式 / 填充方式
+ * Java 6支持PKCS5Padding填充方式
+ * Bouncy Castle支持PKCS7Padding填充方式
+ */
+ private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
+
+ /**
+ * 偏移量,只有CBC模式才需要
+ */
+ private final static String IV_PARAMETER = "1234567812345678";
+
+
+ /**
+ * AES要求密钥长度为128位或192位或256位,java默认限制AES密钥长度最多128位
+ */
+ public static String sKey = "zhgd@bonus@zhgd@bonus@1234567890";
+
+ /**
+ * 编码格式导出
+ */
+ public static final String ENCODING = "utf-8";
+
+ static {
+ //如果是PKCS7Padding填充方式,则必须加上下面这行
+ Security.addProvider(new BouncyCastleProvider());
+ }
+
+ /**
+ * AES加密
+ * (CBC模式)
+ *
+ * @param source 源字符串
+ * @param
+ * @return 加密后的密文
+ * @throws Exception
+ */
+ public static String encrypt(String source, String key, String encoding, String ivParameter, String cipherAlgorithm, String keyAlgorithm) {
+ try {
+ byte[] sourceBytes = source.getBytes(encoding);
+ byte[] keyBytes = key.getBytes(encoding);
+ Cipher cipher = Cipher.getInstance(cipherAlgorithm, "BC");
+ IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(encoding));
+ cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, keyAlgorithm), iv);
+ byte[] decrypted = cipher.doFinal(sourceBytes);
+ return Base64.encodeBase64String(decrypted);
+ } catch (Exception e) {
+ log.error(e.toString(), e);
+ }
+ return null;
+ }
+
+// public static void main(String[] args) {
+// // String json="";
+//
+// String json="{\"username\":\"guest\",\"password\":\"admin@123\"}";
+// String data=encrypt(json);
+// System.err.println(data);
+// String jm=decrypt("\"yeCxaGhmdDt+zDsKPr1prukR15BfIMLMOYIFKdgffGpMV76qVD8ANU4zsLiRZ87+7hd1Yje182nHhUOp/TeYCRuuUPQzmuXH7ikYVEWR1Rmc8uLq3G/BTMU6wFMSRFDBXARRl+dvnpyfX+MleF0KB1OAeuOIKv1gQPskmvDiFAniUlowf/96ZzMl7Bokqc/Lse8lMV92IQB14yQNa0+u/2kvdirzrcq+HCt9K8Ot3C59mjDqg49WoM65LEmaHmZqzdmmjbQlGH7ZOAFTLvF5kPzUsMz5Uim1uNvByB3eLFohc1UgB28DWoTyh43sRMPpq3S1BB20gcrBf3uVra/4qehBr3z98CGhGRyKHbjsCKl0Ri6YO1rp5aMRd9Y3wbOJFrZXFag5iifQx+ooDBeu6h1KCb5JfCjyAmw9+pgEL6X3eELPzK13XjblDyEikjx2Edv45MGsC0DUcjvz/Sb4E/8rn3o1Ep7W31xNCdn5mzZ8VO9POhE3DMK6woeN2C7TW+7YO/Zs9e4zKLS4vThvk5urCn2Ff2HkVBzoPtP2imuqQrY8898sbLllyaJEG0DPSrCf985ZgVa03JsO/EkMr3KAiHV5SHBZS1XEXqjdpL+YEdOnlfBXUk83kJhLj9rhUrTFza7ednQSzjq4XpIJJVy2aJhhj1chsmIM1Xl//0Dbak9Lb6VUq5Xr2IFAjNTgyxwtcFCdEvp4YZCSP6kqWgEpeAVlejyYOcNckUnWkjeHjtfgwvVsvUjWzyIRFCa7m/oY28xBV16RmW/r4XXquqKVdbPtATzrmf7pJCynXZ3IPd9ZGc1OTLnss9Ln9XNTH0E/I4Ma95fn9uxA+sOQkQ==\"");
+// String jiemi=decrypt(data);
+// System.err.println(jm);
+// System.err.println(jiemi);
+// }
+
+ /**
+ * AES解密
+ * (CBC模式)
+ *
+ * @param data 加密后的密文
+ * @param
+ * @return 源字符串
+ * @throws Exception
+ */
+ public static String decrypt(String data, String key, String encoding, String ivParameter, String cipherAlgorithm, String keyAlgorithm) {
+ try {
+ String encryptStr = "";
+ if (StringUtils.isNotEmpty(data)) {
+ encryptStr = data.replace(" ", "+");
+ }
+ byte[] sourceBytes = Base64.decodeBase64(encryptStr);
+ byte[] keyBytes = key.getBytes(encoding);
+ Cipher cipher = Cipher.getInstance(cipherAlgorithm, "BC");
+ IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(encoding));
+ cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, keyAlgorithm), iv);
+ byte[] decoded = cipher.doFinal(sourceBytes);
+ return new String(decoded, encoding);
+ } catch (Exception e) {
+ log.info("------------------->请求加密参数不正确");
+ log.error(e.toString(), e);
+ }
+ return null;
+ }
+
+}
diff --git a/bonus-common/src/main/java/com/bonus/common/encryption/Sm2Util.java b/bonus-common/src/main/java/com/bonus/common/encryption/Sm2Util.java
new file mode 100644
index 0000000..caee594
--- /dev/null
+++ b/bonus-common/src/main/java/com/bonus/common/encryption/Sm2Util.java
@@ -0,0 +1,68 @@
+package com.bonus.common.encryption;
+
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.BCUtil;
+import cn.hutool.crypto.SmUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.SM2;
+import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
+
+
+/**
+ * @author 黑子
+ * SM2加解密
+ */
+public class Sm2Util {
+
+ static SM2 sm2 = SmUtil.sm2();
+ /**
+ * 获取公钥
+ * @return
+ */
+ public static String getPublicKey(){
+ return HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
+ }
+
+ /**
+ * 获取私钥
+ * @return
+ */
+ public static String getPrivateKey(){
+ return HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
+ }
+
+// public static void main(String[] args) {
+// String privateKey = getPrivateKey();
+// String publicKey = getPublicKey();
+// String msg= encrypt(publicKey,"1234567890");
+//// String msg2= decrypt(privateKey,msg);
+// System.err.println(msg);
+//// System.err.println(msg2);
+// }
+ /**
+ * 加密
+ *公钥加密
+ * @param publicKey 公钥
+ * @param data 明文
+ * @return 密文
+ */
+ public static String encrypt(String publicKey, String data) {
+ return SmUtil.sm2(null, publicKey)
+ .encryptHex(data.getBytes(), KeyType.PublicKey)
+ // 加密后,密文前面会有04,需要去掉
+ .substring(2);
+ }
+ /**
+ * 解密
+ * 私钥解密
+ * @param privateKey 私钥
+ * @param data 密文
+ * @return 明文
+ */
+ public static String decrypt(String privateKey, String data) {
+ // 前端加密是没有04的,所以解析的时候要加04
+ data = "04" + data;
+ return SmUtil.sm2(privateKey, null)
+ .decryptStr(data, KeyType.PrivateKey);
+ }
+}
\ No newline at end of file
diff --git a/bonus-common/src/main/java/com/bonus/common/encryption/Sm3Util.java b/bonus-common/src/main/java/com/bonus/common/encryption/Sm3Util.java
new file mode 100644
index 0000000..4a129c0
--- /dev/null
+++ b/bonus-common/src/main/java/com/bonus/common/encryption/Sm3Util.java
@@ -0,0 +1,31 @@
+package com.bonus.common.encryption;
+
+import cn.hutool.crypto.SmUtil;
+import cn.hutool.crypto.digest.SM3;
+
+import java.io.File;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+
+/**
+ * @author weiweiw
+ * SM3加解密
+ */
+public class Sm3Util {
+
+ static SM3 sm3 = SmUtil.sm3WithSalt("2cc0c5f9f1749f1632efa9f63e902323".getBytes(StandardCharsets.UTF_8));
+
+
+ public static String encrypt(String data) {
+ return Sm3Util.sm3.digestHex(data);
+ }
+
+ public static String encrypt(InputStream data) {
+ return Sm3Util.sm3.digestHex(data);
+ }
+
+ public static String encrypt(File dataFile) {
+ return Sm3Util.sm3.digestHex(dataFile);
+ }
+}
\ No newline at end of file
diff --git a/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java b/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
new file mode 100644
index 0000000..b8e0107
--- /dev/null
+++ b/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
@@ -0,0 +1,67 @@
+package com.bonus.common.encryption;
+
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.crypto.Mode;
+import cn.hutool.crypto.Padding;
+import cn.hutool.crypto.symmetric.SM4;
+
+/**
+ * @author bonus
+ */
+public class Sm4Utils {
+ /**
+ * 必须是16字节
+ */
+ private static final String KEY = "78d1295afa99449b99d6f83820e6965c";
+
+ private static final String IV = "f555adf6c01d0ab0761e626a2dae34a2";
+ /**
+ * 加密数据,使用固定盐
+ *
+ * @param plainText 明文,待加密的字符串
+ * @return 加密后的密文(包含盐),Hex 编码格式,如果加密异常就返回传入的字符串
+ */
+ public static String encrypt(String plainText) {
+ try {
+ SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex(KEY),HexUtil.decodeHex(IV));
+ // 加密带盐的明文
+ byte[] encryptedData = sm4.encrypt(plainText);
+ // 返回带盐的加密结果(Hex编码)
+ return HexUtil.encodeHexStr(encryptedData);
+ } catch (Exception e) {
+ return plainText; // 发生异常时返回传入字符串
+ }
+ }
+
+ /**
+ * 解密数据,使用固定盐
+ *
+ * @param cipherText 密文(包含盐),Hex 编码格式的字符串
+ * @return 解密后的明文字符串,如果解密异常就返回传入的字符串
+ */
+ public static String decrypt(String cipherText) {
+ try {
+ // 初始化SM4解密工具
+ SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex(KEY),HexUtil.decodeHex(IV));
+ // 解密数据
+ byte[] decryptedData = sm4.decrypt(cipherText);
+ return new String(decryptedData);
+ } catch (Exception e) {
+ return cipherText; // 发生异常时返回传入字符串
+ }
+ }
+
+ // 测试方法,演示加密和解密过程
+ public static void main(String[] args) {
+ String plainText = "15398187429";
+ System.out.println("原文: " + plainText);
+
+ // 加密明文
+ String encryptedText = Sm4Utils.encrypt(plainText);
+ System.out.println("加密后: " + encryptedText);
+
+ // 解密密文
+ String decryptedText = Sm4Utils.decrypt(plainText);
+ System.out.println("解密后: " + decryptedText);
+ }
+}
diff --git a/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java b/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
index 44b2708..efe5da3 100644
--- a/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
+++ b/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
@@ -3,6 +3,7 @@ package com.bonus.framework.web.service;
import javax.annotation.Resource;
import com.bonus.common.core.domain.AjaxResult;
+import com.bonus.common.encryption.Sm4Utils;
import com.bonus.common.utils.PhoneUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
@@ -76,6 +77,8 @@ public class SysLoginService
*/
public String login(String username, String password, String code, String uuid)
{
+ username= Sm4Utils.decrypt(username);
+ password= Sm4Utils.decrypt(password);
// 验证码校验
validateCaptcha(username, code, uuid);
// 登录前置校验
@@ -226,6 +229,7 @@ public class SysLoginService
* @return
*/
public AjaxResult sendPhone(String phone) {
+ phone= Sm4Utils.decrypt(phone);
//验证手机手机号是否存在
String thisUser=userService.getUserInfo(phone);
if(!phone.equals(thisUser)){
From 08e61e33182bed86d0be3b31ecbd6119e33cbd34 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Thu, 11 Sep 2025 16:45:39 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bonus-base/pom.xml | 10 +++++-----
.../base/controller/system/SysLoginController.java | 7 ++-----
.../com/bonus/common/constant/CacheConstants.java | 2 ++
.../java/com/bonus/common/encryption/Sm4Utils.java | 8 ++++++--
.../bonus/framework/web/service/SysLoginService.java | 11 +++++++++++
5 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/bonus-base/pom.xml b/bonus-base/pom.xml
index a3e9206..2e2d4b9 100644
--- a/bonus-base/pom.xml
+++ b/bonus-base/pom.xml
@@ -17,11 +17,11 @@
-
- org.springframework.boot
- spring-boot-devtools
- true
-
+
+
+
+
+
diff --git a/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java b/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
index 76cc6fd..0a5c1c7 100644
--- a/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
+++ b/bonus-base/src/main/java/com/bonus/base/controller/system/SysLoginController.java
@@ -43,10 +43,9 @@ public class SysLoginController
@PostMapping("/sendPhone")
- public AjaxResult sendPhone(@RequestBody String phone) {
+ public AjaxResult sendPhone(@RequestBody LoginBody loginBody) {
// 下发短信
- AjaxResult ajax= loginService.sendPhone(phone);
- return ajax;
+ return loginService.sendPhone(loginBody.getUsername());
}
@@ -62,8 +61,6 @@ public class SysLoginController
String token;
AjaxResult ajax = AjaxResult.success();
if("2".equals(loginBody.getLoginType())){
-
-
token = loginService.login(loginBody.getUsername(), loginBody.getCode());
}else{
token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
diff --git a/bonus-common/src/main/java/com/bonus/common/constant/CacheConstants.java b/bonus-common/src/main/java/com/bonus/common/constant/CacheConstants.java
index ea70c59..fbf47f1 100644
--- a/bonus-common/src/main/java/com/bonus/common/constant/CacheConstants.java
+++ b/bonus-common/src/main/java/com/bonus/common/constant/CacheConstants.java
@@ -43,4 +43,6 @@ public class CacheConstants
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
public static final String PHONE_CODE = "phone_code:";
+
+ public static final String PHONE_NUM = "phone_num:";
}
diff --git a/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java b/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
index b8e0107..7bdf2c2 100644
--- a/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
+++ b/bonus-common/src/main/java/com/bonus/common/encryption/Sm4Utils.java
@@ -4,10 +4,12 @@ import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
+import lombok.extern.slf4j.Slf4j;
/**
* @author bonus
*/
+@Slf4j
public class Sm4Utils {
/**
* 必须是16字节
@@ -29,6 +31,7 @@ public class Sm4Utils {
// 返回带盐的加密结果(Hex编码)
return HexUtil.encodeHexStr(encryptedData);
} catch (Exception e) {
+ log.error(e.toString(),e);
return plainText; // 发生异常时返回传入字符串
}
}
@@ -47,13 +50,14 @@ public class Sm4Utils {
byte[] decryptedData = sm4.decrypt(cipherText);
return new String(decryptedData);
} catch (Exception e) {
- return cipherText; // 发生异常时返回传入字符串
+ log.error(e.toString(),e);
+ return null; // 发生异常时返回传入字符串
}
}
// 测试方法,演示加密和解密过程
public static void main(String[] args) {
- String plainText = "15398187429";
+ String plainText = "18226653236";
System.out.println("原文: " + plainText);
// 加密明文
diff --git a/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java b/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
index efe5da3..7298089 100644
--- a/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
+++ b/bonus-framework/src/main/java/com/bonus/framework/web/service/SysLoginService.java
@@ -123,6 +123,7 @@ public class SysLoginService
* @return
*/
public String login(String phone, String code) {
+ phone= Sm4Utils.decrypt(phone);
if(StringUtils.isEmpty(phone)){
throw new ServiceException("请输入正确的手机号!");
}
@@ -237,6 +238,15 @@ public class SysLoginService
ajax.put("msg", "手机号不存在或手机号不正确");
return ajax;
}
+ Integer num=redisCache.getCacheObject(CacheConstants.PHONE_NUM+phone);
+ if(num==null){
+ num=1;
+ }else{
+ num++;
+ }
+ if(num>10){
+ return AjaxResult.error("请勿频繁发送验证码!");
+ }
StringBuilder sb=new StringBuilder();
String code=getSixBitCode();
sb.append("【博诺思】验证码:").append(code).append(",验证码有效期").append(TIMES).append("分钟,切勿将验证码泄漏于他人。");
@@ -246,6 +256,7 @@ public class SysLoginService
if ("200".equals(map.get("code"))){
AjaxResult ajax = AjaxResult.success();
redisCache.setCacheObject(CacheConstants.PHONE_CODE+phone,code,TIMES, TimeUnit.MINUTES);
+ redisCache.setCacheObject(CacheConstants.PHONE_NUM+phone,num,5, TimeUnit.MINUTES);
ajax.put("times", TIMES);
ajax.put("msg", "发送成功");
return ajax;
From e427529beba7761aea79367c425684e192aff6a2 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Thu, 11 Sep 2025 16:53:43 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bonus-base/src/main/resources/application-druid.yml | 2 +-
bonus-base/src/main/resources/application.yml | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/bonus-base/src/main/resources/application-druid.yml b/bonus-base/src/main/resources/application-druid.yml
index 6e59d6e..71de72b 100644
--- a/bonus-base/src/main/resources/application-druid.yml
+++ b/bonus-base/src/main/resources/application-druid.yml
@@ -6,7 +6,7 @@ spring:
druid:
# 主库数据源
master:
- url: jdbc:mysql://192.168.0.14:4417/bonus_cloud_service?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ url: jdbc:mysql://192.168.0.7:13308/bonus_cloud_service?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Bonus@admin123!
# 从库数据源
diff --git a/bonus-base/src/main/resources/application.yml b/bonus-base/src/main/resources/application.yml
index bad913f..bc466f1 100644
--- a/bonus-base/src/main/resources/application.yml
+++ b/bonus-base/src/main/resources/application.yml
@@ -68,13 +68,13 @@ spring:
# redis 配置
redis:
# 地址
- host: localhost
+ host: 192.168.0.7
# 端口,默认为6379
- port: 6379
+ port: 16379
# 数据库索引
- database: 0
+ database: 5
# 密码
- password:
+ password: Bonus@admin123!
# 连接超时时间
timeout: 10s
lettuce:
@@ -130,8 +130,8 @@ xss:
minio:
- url: http://192.168.0.14:9090
- endpoint: http://192.168.0.14:9090
+ url: http://192.168.0.7:9090
+ endpoint: http://192.168.0.7:9090
accessKey: minio
secretKey: bonus@admin123
bucketName: product