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 @@ 考勤人像刷脸 - - 拍照后显示图片 + + 拍照后显示图片