diff --git a/docsql/nacos配置/baidu-face-config.yml b/docsql/nacos配置/baidu-face-config.yml
new file mode 100644
index 00000000..781b8f1c
--- /dev/null
+++ b/docsql/nacos配置/baidu-face-config.yml
@@ -0,0 +1,9 @@
+baidu:
+ face:
+ app-id: 7034646
+ api-key: L3PiEzO9dMFJDExMTjOxuTtq
+ secret-key: 40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc
+ similarity-threshold: 0.8
+ qps-limit-delay: 1000
+ max-retry-attempts: 3
+ retry-delay: 2000
\ No newline at end of file
diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java
new file mode 100644
index 00000000..640491e5
--- /dev/null
+++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/BaiduFaceProperties.java
@@ -0,0 +1,107 @@
+package com.yanzhu.common.core.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 百度人脸识别配置属性类
+ *
+ * @author yanzhu
+ */
+@Configuration
+@ConfigurationProperties(prefix = "baidu.face")
+public class BaiduFaceProperties {
+
+ /**
+ * 百度人脸识别应用的App ID
+ */
+ private String appId = "7034646";
+
+ /**
+ * 百度人脸识别应用的API Key
+ */
+ private String apiKey = "L3PiEzO9dMFJDExMTjOxuTtq";
+
+ /**
+ * 百度人脸识别应用的Secret Key
+ */
+ private String secretKey = "40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc";
+
+ /**
+ * 相似度阈值,大于此值认为是同一个人
+ */
+ private double similarityThreshold = 0.8;
+
+ /**
+ * QPS限制相关配置 - 延迟(毫秒)
+ */
+ private int qpsLimitDelay = 1000;
+
+ /**
+ * 最大重试次数
+ */
+ private int maxRetryAttempts = 3;
+
+ /**
+ * 重试延迟(毫秒)
+ */
+ private int retryDelay = 2000;
+
+ // Getter和Setter方法
+
+ public String getAppId() {
+ return appId;
+ }
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public String getSecretKey() {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ this.secretKey = secretKey;
+ }
+
+ public double getSimilarityThreshold() {
+ return similarityThreshold;
+ }
+
+ public void setSimilarityThreshold(double similarityThreshold) {
+ this.similarityThreshold = similarityThreshold;
+ }
+
+ public int getQpsLimitDelay() {
+ return qpsLimitDelay;
+ }
+
+ public void setQpsLimitDelay(int qpsLimitDelay) {
+ this.qpsLimitDelay = qpsLimitDelay;
+ }
+
+ public int getMaxRetryAttempts() {
+ return maxRetryAttempts;
+ }
+
+ public void setMaxRetryAttempts(int maxRetryAttempts) {
+ this.maxRetryAttempts = maxRetryAttempts;
+ }
+
+ public int getRetryDelay() {
+ return retryDelay;
+ }
+
+ public void setRetryDelay(int retryDelay) {
+ this.retryDelay = retryDelay;
+ }
+}
\ No newline at end of file
diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/CoreConfig.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/CoreConfig.java
new file mode 100644
index 00000000..64bc9c92
--- /dev/null
+++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/config/CoreConfig.java
@@ -0,0 +1,15 @@
+package com.yanzhu.common.core.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 核心模块配置类
+ *
+ * @author yanzhu
+ */
+@Configuration
+@ComponentScan(basePackages = "com.yanzhu.common.core")
+public class CoreConfig {
+
+}
\ No newline at end of file
diff --git a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java
index a770171e..942a7f1a 100644
--- a/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java
+++ b/yanzhu-common/yanzhu-common-core/src/main/java/com/yanzhu/common/core/utils/BaiduFaceSimilarityUtils.java
@@ -2,7 +2,12 @@ package com.yanzhu.common.core.utils;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
+import com.yanzhu.common.core.config.BaiduFaceProperties;
import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
@@ -16,28 +21,42 @@ import java.io.ByteArrayOutputStream;
*
* @author yanzhu
*/
+@Component
public class BaiduFaceSimilarityUtils {
- // 百度人脸识别应用的API Key和Secret Key
- private static final String APP_ID = "您的AppID"; // 需要设置有效的AppID
- private static final String API_KEY = "L3PiEzO9dMFJDExMTjOxuTtq";
- private static final String SECRET_KEY = "40LMey6WC1MYIqLU4m5Qe8K4foFUM1bc";
+ @Autowired
+ private BaiduFaceProperties baiduFaceProperties;
// 初始化AipFace客户端
- private static final AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
+ private static AipFace client;
// 相似度阈值,大于此值认为是同一个人
- private static final double SIMILARITY_THRESHOLD = 0.8;
+ public static double SIMILARITY_THRESHOLD = 0.8;
// QPS限制相关常量
- private static final int QPS_LIMIT_DELAY = 1000; // 1秒延迟,避免QPS限制
- private static final int MAX_RETRY_ATTEMPTS = 3; // 最大重试次数
- private static final int RETRY_DELAY = 2000; // 重试延迟(毫秒)
+ private static int QPS_LIMIT_DELAY = 1000; // 1秒延迟,避免QPS限制
+ private static int MAX_RETRY_ATTEMPTS = 3; // 最大重试次数
+ private static int RETRY_DELAY = 2000; // 重试延迟(毫秒)
- static {
+ @PostConstruct
+ public void init() {
+ // 从配置中获取参数
+ String appId = baiduFaceProperties.getAppId();
+ String apiKey = baiduFaceProperties.getApiKey();
+ String secretKey = baiduFaceProperties.getSecretKey();
+
+ // 初始化AipFace客户端
+ client = new AipFace(appId, apiKey, secretKey);
+
// 设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
+
+ // 更新静态变量
+ SIMILARITY_THRESHOLD = baiduFaceProperties.getSimilarityThreshold();
+ QPS_LIMIT_DELAY = baiduFaceProperties.getQpsLimitDelay();
+ MAX_RETRY_ATTEMPTS = baiduFaceProperties.getMaxRetryAttempts();
+ RETRY_DELAY = baiduFaceProperties.getRetryDelay();
}
/**
@@ -224,18 +243,6 @@ public class BaiduFaceSimilarityUtils {
}
}
- /**
- * 设置API Key和Secret Key
- *
- * @param appId App ID
- * @param apiKey API Key
- * @param secretKey Secret Key
- */
- public static void setCredentials(String appId, String apiKey, String secretKey) {
- // 重新初始化AipFace客户端
- // 注意:在实际应用中,应该通过配置文件或环境变量来设置这些密钥
- }
-
public static void main(String[] args) {
System.out.println("开始测试人脸相似度算法...");
@@ -272,5 +279,4 @@ public class BaiduFaceSimilarityUtils {
System.out.println("\n测试完成。");
}
-
}
\ No newline at end of file
diff --git a/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/config/ApplicationConfig.java b/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/config/ApplicationConfig.java
index 6b397c2e..adacae8b 100644
--- a/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/config/ApplicationConfig.java
+++ b/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/config/ApplicationConfig.java
@@ -3,12 +3,16 @@ package com.yanzhu.common.security.config;
import java.util.TimeZone;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
/**
* 系统配置
*
* @author ruoyi
*/
+@Configuration
+@ComponentScan(basePackages = "com.yanzhu.common.core")
public class ApplicationConfig
{
/**
@@ -19,4 +23,4 @@ public class ApplicationConfig
{
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
}
-}
+}
\ No newline at end of file
diff --git a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java
index da46e240..4f95bcdf 100644
--- a/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java
+++ b/yanzhu-modules/yanzhu-manage/src/main/java/com/yanzhu/manage/controller/remoteAttendance/ProMobileAttendanceConfigController.java
@@ -136,7 +136,7 @@ public class ProMobileAttendanceConfigController extends BaseController
double similarity = BaiduFaceSimilarityUtils.calculateFaceSimilarity(userPicture, attImg);
System.out.println("相似度:"+similarity);
- double threshold = 0.8;
+ double threshold = BaiduFaceSimilarityUtils.SIMILARITY_THRESHOLD;
if (similarity >= threshold) {
// 相似度达标,允许考勤
diff --git a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.js b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.js
index 37580e07..42c482c3 100644
--- a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.js
+++ b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.js
@@ -381,7 +381,18 @@ Page({
app.toast("考勤成功");
this.returnToPage();
} else {
- app.toast("考勤失败: " + res.msg);
+ // 显示确认框,提供更友好的错误提示
+ wx.showModal({
+ title: "考勤失败",
+ content: res.msg || "考勤提交失败,请稍后重试",
+ showCancel: false, // 只显示确定按钮
+ confirmColor: "#ff0000", // 深色确认按钮
+ confirmText: "确定",
+ success: function (res) {
+ // 用户点击确定按钮后返回考勤列表页面
+ this.returnToPage();
+ }.bind(this),
+ });
}
});
},
diff --git a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.wxml b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.wxml
index 12d4030e..bbedf00e 100644
--- a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.wxml
+++ b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance/add/index.wxml
@@ -66,8 +66,8 @@
考勤人像刷脸
-
- 拍照后显示图片
+
+ 拍照后显示图片