From 95fd6aa42ed3d74e8a40f22f360f7392c618f155 Mon Sep 17 00:00:00 2001 From: jjLv <1981429112@qq.com> Date: Fri, 25 Jul 2025 15:34:59 +0800 Subject: [PATCH] 0725 --- app/build.gradle | 1 + .../activity/InitializationActivity.java | 3 - .../bonus/canteen/activity/LoginActivity.java | 5 +- .../bonus/canteen/activity/MainActivity.java | 3 + .../bonus/canteen/face/util/FaceServer.java | 21 ++++-- .../fragment/OfflineCheckoutFragment.java | 10 +-- .../canteen/fragment/OperationFragment.java | 13 ++-- .../fragment/SupermarketCashierFragment.java | 10 +-- .../com/bonus/canteen/upgrade/UpdateDown.java | 3 +- .../bonus/canteen/utils/SM4EncryptUtils.java | 13 +++- .../com/bonus/canteen/utils/Sm4Utils.java | 64 +++++++++++++++++++ .../utils/rabbitmq/RabbitMqMqttHelper.java | 2 +- 12 files changed, 116 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/bonus/canteen/utils/Sm4Utils.java diff --git a/app/build.gradle b/app/build.gradle index 9e6b0dd..3eff9f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -160,6 +160,7 @@ dependencies { implementation 'com.google.guava:guava:31.1-android' // Android 专用版本 implementation 'com.github.NewHuLe:AppUpdate:v1.7' + implementation 'org.bouncycastle:bcprov-jdk15to18:1.77' } //自动添加X-Library依赖 apply from: 'x-library.gradle' diff --git a/app/src/main/java/com/bonus/canteen/activity/InitializationActivity.java b/app/src/main/java/com/bonus/canteen/activity/InitializationActivity.java index b33c666..10f101c 100644 --- a/app/src/main/java/com/bonus/canteen/activity/InitializationActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/InitializationActivity.java @@ -32,7 +32,6 @@ import com.bonus.canteen.adapter.initialization.entity.ListBean; import com.bonus.canteen.core.BaseActivity; import com.bonus.canteen.db.AppDatabase; import com.bonus.canteen.db.entity.base.DeviceInfo; -import com.bonus.canteen.face.util.FaceServer; import com.bonus.canteen.service.data.DownLoadDataService; import com.bonus.canteen.service.data.entity.ResponseVo; import com.bonus.canteen.utils.MemoryUtils; @@ -125,8 +124,6 @@ public class InitializationActivity extends BaseActivity { try { String url = WorkConfig.getPrefixesUrl() + UrlConfig.LOGIN_URL; org.json.JSONObject json = new org.json.JSONObject(); - json.put("username", userName); - json.put("password", password); + json.put("username", SM4EncryptUtils.sm4Encrypt(userName)); + json.put("password", SM4EncryptUtils.sm4Encrypt(password)); json.put("verificationCode", ""); json.put("code", ""); json.put("phoneUuid", ""); diff --git a/app/src/main/java/com/bonus/canteen/activity/MainActivity.java b/app/src/main/java/com/bonus/canteen/activity/MainActivity.java index ae04ede..32ae1e4 100644 --- a/app/src/main/java/com/bonus/canteen/activity/MainActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/MainActivity.java @@ -39,6 +39,7 @@ import com.bonus.canteen.core.BaseActivity; import com.bonus.canteen.db.AppDatabase; import com.bonus.canteen.db.entity.base.DeviceInfo; import com.bonus.canteen.db.entity.base.LoginInfo; +import com.bonus.canteen.face.util.FaceServer; import com.bonus.canteen.fragment.BusinessDataFragment; import com.bonus.canteen.fragment.MachineSaleFragment; import com.bonus.canteen.fragment.OfflineCheckoutFragment; @@ -86,6 +87,8 @@ public class MainActivity extends BaseActivity implements C registerReceiver(shutdownReceiver, new android.content.IntentFilter(Intent.ACTION_SHUTDOWN)); initView(); initTab(); + //初始化人脸库 + FaceServer.getInstance().loadFace(MainActivity.this); } protected void initView() { //开启时间显示 diff --git a/app/src/main/java/com/bonus/canteen/face/util/FaceServer.java b/app/src/main/java/com/bonus/canteen/face/util/FaceServer.java index 2d1e790..7408cf6 100644 --- a/app/src/main/java/com/bonus/canteen/face/util/FaceServer.java +++ b/app/src/main/java/com/bonus/canteen/face/util/FaceServer.java @@ -296,13 +296,22 @@ public class FaceServer { float maxSimilar = 0; isProcessing = true; FaceRegisterInfo bestMatch = null; - for (FaceRegisterInfo registerInfo : faceRegisterInfoList) { - tempFaceFeature.setFeatureData(registerInfo.getFeatureData()); + + // 使用并行流加快比对进程 + bestMatch = faceRegisterInfoList.parallelStream() + .map(registerInfo -> { + tempFaceFeature.setFeatureData(registerInfo.getFeatureData()); + faceEngine.compareFaceFeature(faceFeature, tempFaceFeature, faceSimilar); + return new Object[]{registerInfo, faceSimilar.getScore()}; + }) + .max((a, b) -> Float.compare((float)a[1], (float)b[1])) + .map(maxObj -> (FaceRegisterInfo)maxObj[0]) + .orElse(null); + + if (bestMatch != null) { + tempFaceFeature.setFeatureData(bestMatch.getFeatureData()); faceEngine.compareFaceFeature(faceFeature, tempFaceFeature, faceSimilar); - if (faceSimilar.getScore() > maxSimilar) { - maxSimilar = faceSimilar.getScore(); - bestMatch = registerInfo; - } + maxSimilar = faceSimilar.getScore(); } isProcessing = false; if (bestMatch != null) { diff --git a/app/src/main/java/com/bonus/canteen/fragment/OfflineCheckoutFragment.java b/app/src/main/java/com/bonus/canteen/fragment/OfflineCheckoutFragment.java index e4c031a..d6f193d 100644 --- a/app/src/main/java/com/bonus/canteen/fragment/OfflineCheckoutFragment.java +++ b/app/src/main/java/com/bonus/canteen/fragment/OfflineCheckoutFragment.java @@ -182,7 +182,7 @@ public class OfflineCheckoutFragment extends BaseFragment { - FaceScanUtil.stopReadMealCard(requireActivity()); + ThreadPoolManager.getExecutor().execute(()->FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); balanceDialog.dismiss(); balanceDialog = null; @@ -458,7 +458,7 @@ public class OfflineCheckoutFragment extends BaseFragmentopenReadMealCard(type)); myPresentation.openScan(type); } @@ -490,7 +490,7 @@ public class OfflineCheckoutFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); new Handler().postDelayed(() -> openBalanceResultDialog(userInfo, custPhotoFulInfo), 500); @@ -520,7 +520,7 @@ public class OfflineCheckoutFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); if (alertDialog != null && alertDialog.isShowing()) { alertDialog.dismiss(); @@ -950,7 +950,7 @@ public class OfflineCheckoutFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); ThreadPoolManager.getExecutor().execute(() -> { UserInfo userInfo = AppDatabase.getDatabase(context).userDao().getUserInfoById(finalUserId1); diff --git a/app/src/main/java/com/bonus/canteen/fragment/OperationFragment.java b/app/src/main/java/com/bonus/canteen/fragment/OperationFragment.java index acb2db4..dbae79f 100644 --- a/app/src/main/java/com/bonus/canteen/fragment/OperationFragment.java +++ b/app/src/main/java/com/bonus/canteen/fragment/OperationFragment.java @@ -252,7 +252,7 @@ public class OperationFragment extends BaseFragment { - FaceScanUtil.stopReadMealCard(requireActivity()); + ThreadPoolManager.getExecutor().execute(() -> FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); balanceDialog.dismiss(); balanceDialog = null; @@ -771,8 +771,9 @@ public class OperationFragment extends BaseFragment openReadMealCard(type)); + requireActivity().runOnUiThread(() -> myPresentation.openScan(type)); } public void openReadMealCard(String type) { @@ -803,7 +804,7 @@ public class OperationFragment extends BaseFragment FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); new Handler().postDelayed(() -> openBalanceResultDialog(userInfo, custPhotoFulInfo), 500); @@ -833,7 +834,7 @@ public class OperationFragment extends BaseFragment FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); alertDialog.dismiss(); alertDialog = null; @@ -1358,7 +1359,7 @@ public class OperationFragment extends BaseFragment FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); ThreadPoolManager.getExecutor().execute(() -> { UserInfo userInfo = AppDatabase.getDatabase(context).userDao().getUserInfoById(finalUserId1); diff --git a/app/src/main/java/com/bonus/canteen/fragment/SupermarketCashierFragment.java b/app/src/main/java/com/bonus/canteen/fragment/SupermarketCashierFragment.java index b7c42ef..e1318e7 100644 --- a/app/src/main/java/com/bonus/canteen/fragment/SupermarketCashierFragment.java +++ b/app/src/main/java/com/bonus/canteen/fragment/SupermarketCashierFragment.java @@ -186,7 +186,7 @@ public class SupermarketCashierFragment extends BaseFragment { - FaceScanUtil.stopReadMealCard(requireActivity()); + ThreadPoolManager.getExecutor().execute(()->FaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); balanceDialog.dismiss(); balanceDialog = null; @@ -462,7 +462,7 @@ public class SupermarketCashierFragment extends BaseFragmentopenReadMealCard(type)); myPresentation.openScan(type); } @@ -494,7 +494,7 @@ public class SupermarketCashierFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); new Handler().postDelayed(() -> openBalanceResultDialog(userInfo, custPhotoFulInfo), 500); @@ -524,7 +524,7 @@ public class SupermarketCashierFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); if (alertDialog != null && alertDialog.isShowing()) { alertDialog.dismiss(); @@ -932,7 +932,7 @@ public class SupermarketCashierFragment extends BaseFragmentFaceScanUtil.stopReadMealCard(requireActivity())); myPresentation.closeScan(); ThreadPoolManager.getExecutor().execute(() -> { UserInfo userInfo = AppDatabase.getDatabase(context).userDao().getUserInfoById(finalUserId1); diff --git a/app/src/main/java/com/bonus/canteen/upgrade/UpdateDown.java b/app/src/main/java/com/bonus/canteen/upgrade/UpdateDown.java index ae4afec..1251772 100644 --- a/app/src/main/java/com/bonus/canteen/upgrade/UpdateDown.java +++ b/app/src/main/java/com/bonus/canteen/upgrade/UpdateDown.java @@ -128,7 +128,8 @@ public class UpdateDown { String path = url + UrlConfig.GET_APP_VERSION; JSONObject json = new JSONObject(); json.put("id", versionCode + ""); - json.put("type", "1"); + json.put("type", "20"); + json.put("deviceType", "20"); String jsonString = json.toString(); Log.i("getPersonMessage jsonString", jsonString); // 定义 JSON 的 MediaType diff --git a/app/src/main/java/com/bonus/canteen/utils/SM4EncryptUtils.java b/app/src/main/java/com/bonus/canteen/utils/SM4EncryptUtils.java index 44d7d59..49204c3 100644 --- a/app/src/main/java/com/bonus/canteen/utils/SM4EncryptUtils.java +++ b/app/src/main/java/com/bonus/canteen/utils/SM4EncryptUtils.java @@ -20,6 +20,10 @@ package com.bonus.canteen.utils; import android.util.Log; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import java.security.Security; + import cn.hutool.core.codec.Base64Decoder; import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.PrimitiveArrayUtil; @@ -31,7 +35,11 @@ import cn.hutool.crypto.symmetric.SM4; public class SM4EncryptUtils { private static final DataEncDecProperties properties = getProperties(); public static final String SUFFIX = "##encrypted"; - + static { + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { + Security.addProvider(new BouncyCastleProvider()); + } + } public static DataEncDecProperties getProperties() { DataEncDecProperties dataEncDecProperties = new DataEncDecProperties(); dataEncDecProperties.setSm4Key("jY7bZz6Pjml+H/WZYfNSNA=="); @@ -42,13 +50,12 @@ public class SM4EncryptUtils { public static String sm4Encrypt(String data) { try { - return SmUtil.sm4(SecureUtil.decode(properties.getSm4Key())).encryptBase64(data) + "##encrypted"; + return data = Sm4Utils.encrypt(data); } catch (Exception var2) { Log.e("SM4加密异常:{}", var2.getMessage()); return data; } } - public static String sm4Encryptbyconfig(String data) { try { return properties.isEncrypted() ? SmUtil.sm4(SecureUtil.decode(properties.getSm4Key())).encryptBase64(data) + "##encrypted" : data; diff --git a/app/src/main/java/com/bonus/canteen/utils/Sm4Utils.java b/app/src/main/java/com/bonus/canteen/utils/Sm4Utils.java new file mode 100644 index 0000000..0ac9aec --- /dev/null +++ b/app/src/main/java/com/bonus/canteen/utils/Sm4Utils.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2025 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.bonus.canteen.utils; + + +import android.util.Log; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.SM4; + +public class Sm4Utils { + private static final String KEY = "78d1295afa99449b99d6f83820e6965c"; + private static final String IV = "f555adf6c01d0ab0761e626a2dae34a2"; + + public Sm4Utils() { + } + + public static String encrypt(String plainText) { + try { + SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex("78d1295afa99449b99d6f83820e6965c"), HexUtil.decodeHex("f555adf6c01d0ab0761e626a2dae34a2")); + byte[] encryptedData = sm4.encrypt(plainText); + return HexUtil.encodeHexStr(encryptedData); + } catch (Exception var3) { + Log.e("Sm4Utils", "加密失败", var3); + return plainText; + } + } + + public static String decrypt(String cipherText) { + try { + SM4 sm4 = new SM4(Mode.CBC, Padding.PKCS5Padding, HexUtil.decodeHex("78d1295afa99449b99d6f83820e6965c"), HexUtil.decodeHex("f555adf6c01d0ab0761e626a2dae34a2")); + byte[] decryptedData = sm4.decrypt(cipherText); + return new String(decryptedData); + } catch (Exception var3) { + return cipherText; + } + } + + public static void main(String[] args) { + String plainText = "admin"; + System.out.println("原文: " + plainText); + String encryptedText = encrypt(plainText); + System.out.println("加密后: " + encryptedText); + String decryptedText = decrypt(plainText); + System.out.println("解密后: " + decryptedText); + } +} diff --git a/app/src/main/java/com/bonus/canteen/utils/rabbitmq/RabbitMqMqttHelper.java b/app/src/main/java/com/bonus/canteen/utils/rabbitmq/RabbitMqMqttHelper.java index 7029f7d..b4bce12 100644 --- a/app/src/main/java/com/bonus/canteen/utils/rabbitmq/RabbitMqMqttHelper.java +++ b/app/src/main/java/com/bonus/canteen/utils/rabbitmq/RabbitMqMqttHelper.java @@ -260,8 +260,8 @@ public class RabbitMqMqttHelper { } else { GetBasicDataService service = new GetBasicDataServiceImp(); service.getFacePhoto(json.getString("currentTime"), json.getIntValue(UPDATE_PERSON)); - runOnUiThread(() -> FaceServer.getInstance().loadFace(context)); } + runOnUiThread(() -> FaceServer.getInstance().loadFace(context)); }); } else if (json.getIntValue(field) > 0 && desc.equals("人员信息")) { ThreadPoolManager.getExecutor().execute(() -> {