浏览代码

金聪提交

jc 1 周之前
父节点
当前提交
fac98d85f5

+ 1 - 0
ArcFace64.dat

@@ -0,0 +1 @@
+EWEPEPEOGMGTELIZJUGECKIUJDBCJTCNISGPBNHLJTJUBHEWGNAKGEGAIOHJDQAJGNCFDRFZJEDMJTGHHLAFIHEWHPFTIIEGIVGMBIBZGAJNCTEAIFIPCYFNIJGTCFDYJCDLJDJQFOFNCJDCGMBWEGJQDKIXDNAIJPBWJJBEDFAUJIHNFEBUFVDZHYBJJVDUDHDXAQDFDAEJBZAMHVCIJFGCFOHEGMISJPIIIVILJCFLEZCKCPESAFIPBWGDAXENGKJFGHECGNBIGXAQGEIMFJHHHZILGFCOIPCEADDGGXDTCTJNAGCXBSATFPFMEBGBAJDUIVCTEBANDHHFDCJLFJJMFCIEJGJUFSDGHUDIEAJCEKAGBLERFAHBJRHSCRBKBGAZCBIHDGFUFQGCGWGRITCRIDCQGFGIEMJHIWEYHPGKARGQEXHSCRDBBTDMCEIOJFBPHXIICBGPADAJIMCWJLJCCEBYJRHFEVCJIYCWGKHKASDNAHFMFWEYCKHYHAFDATHREDCCFTJBGZCTHIBCBKDGACBOEDIIIRDAANEZAECQJKCOFGGAAOGYENANEPEAINIHIPIQFVAMACJUHZIZFXBHGHFFAUEKGGJOJOIGJJFLEUJOHQDJJRIOBBAEBJDSGUGZGSATHHAPADJGEJDTDBAUIBGJFVBHBXIIJQAKIFAFBCJVIDEGBHHDJSIDIBGUIBHOIRCTIOFQFLCEDNCCFGDZIPAJGGCSAWCFBLGFGOFFFYHKHMIODEJPEAJIFRBABAJLGJDGEYADJSGCGFFEFDIDIJDWEDGUBYGBHUCLGDJABLCMIKHFHDJCERAXDCASJHGIDJFKBOBPDIAIHYBNHSAJCVIPBEFBJBIODAGPHUFRHBCIBTDEGMBKHQIXGWJPGWJGFNFLIKAYAXJKIGBQCBAQEEFZIBIXHEJTJHGVJJICBWDCCCBHALHPHCHLJCANHQIFJHJIDRANGUEAFVJLDLAHFJICFNETCQANCEAXAZBWGKHVFDHKBSCVGHIAEMHFELEIIBEJCLIMIWBAFEFNGBIXEEEDCKCWBLFPHPERGOGUBLJTGDBGCPJTCHDNGDJRHDGDGIIQDABVEYDGAMACJNFMJSFQJHFRBRIIEVIZCJIEFOAYIPDNIRIBFQBFASEWBTEHITCEJOAFAGETFLHBINJJBVFPAKAMCFIDGSDOBEGOJL

二进制
images/guolinarenlian.jpg


二进制
images/jincongrenlian.jpg


二进制
images/peixiuyurenlian.jpg


+ 13 - 2
src/main/java/com/neko/controller/MessageController.java

@@ -1,7 +1,9 @@
 package com.neko.controller;
 
 import com.neko.domain.dto.messageDto.SendMessageContentDto;
+import com.neko.domain.dto.messageDto.SendMessageVoidDto;
 import com.neko.service.MessageService;
+import com.neko.utils.ApiServiceExceptionEnum;
 import com.neko.utils.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -19,13 +21,22 @@ public class MessageController {
     MessageService messageService;
 
     /**
-     * 消息发送
+     * 消息发送(文本消息)
      * @param dto
      * @return
      **/
-    @RequestMapping("sendMessage")
+    @RequestMapping("sendMessageWen")
     public ResultVo sendMessage(@RequestBody SendMessageContentDto dto){
         return messageService.sendMessage(dto);
     }
 
+    @RequestMapping("sendMessageFile")
+    public ResultVo sendMessageFile(SendMessageVoidDto dto){
+        try {
+            return messageService.sendMessageFile(dto);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultVo.error(ApiServiceExceptionEnum.CAN_SHU_YICHANG);
+        }
+    }
 }

+ 6 - 1
src/main/java/com/neko/controller/UserController.java

@@ -1,7 +1,7 @@
 package com.neko.controller;
 
 import com.alibaba.fastjson2.JSON;
-import com.neko.domain.dto.WxLoginDto;
+import com.neko.domain.dto.userDto.WxLoginDto;
 import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
@@ -157,4 +157,9 @@ public class UserController {
     public ResultVo wxLogin(@RequestBody WxLoginDto dto){
         return userService.wxLogin(dto);
     }
+
+    @RequestMapping("rlsb")
+    public ResultVo rlsb(@RequestParam("image") MultipartFile filePath){
+        return userService.rlsb(filePath);
+    }
 }

+ 15 - 0
src/main/java/com/neko/domain/dto/messageDto/SendMessageVoidDto.java

@@ -0,0 +1,15 @@
+package com.neko.domain.dto.messageDto;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @Date 2025/5/26 8:44
+ * @Author neko
+ **/
+@Data
+public class SendMessageVoidDto {
+    private String senderId;//发送者
+    private String receiverId;//接受者
+    private MultipartFile multipartFile;
+}

+ 1 - 1
src/main/java/com/neko/domain/dto/WxLoginDto.java → src/main/java/com/neko/domain/dto/userDto/WxLoginDto.java

@@ -1,4 +1,4 @@
-package com.neko.domain.dto;
+package com.neko.domain.dto.userDto;
 
 import lombok.Data;
 

+ 19 - 0
src/main/java/com/neko/domain/pojo/Testdd.java

@@ -0,0 +1,19 @@
+package com.neko.domain.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Date 2025/5/24 10:29
+ * @Author neko
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Testdd {
+    private String id;
+    private String name;
+    private String pwd;
+
+}

+ 8 - 0
src/main/java/com/neko/domain/pojo/User.java

@@ -81,8 +81,16 @@ public class User implements Serializable {
      */
     private Date lastLoginTime;
 
+    /**
+     * 创建时间
+     */
     private Date createTime;
 
+    /**
+     * 人脸
+     */
+    private String rlUrl;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 

+ 134 - 86
src/main/java/com/neko/face/FaceTestMd.java

@@ -66,7 +66,7 @@ public class FaceTestMd {
 
 
         //人脸检测
-        ImageInfo imageInfo = getRGBData(new File("D:\\计算机\\b9e4b8a58d3db22741714f8ad24d175.jpg"));
+        ImageInfo imageInfo = getRGBData(new File("D:\\javatext\\Zg5\\week1\\nekomimi\\images\\jincongrenlian.jpg"));
         List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
         errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
         System.out.println(faceInfoList);
@@ -77,91 +77,139 @@ public class FaceTestMd {
         System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
 
         //人脸检测2
-        ImageInfo imageInfo2 = getRGBData(new File("D:\\计算机\\030ab513d80c49522cbe28062ba5b7e.jpg"));
-//        ImageInfo imageInfo2 = getRGBData(new File("D:\\计算机\\536d6c8a02947d1128642d34c009d06.jpg"));
-        List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
-        errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
-        System.out.println(faceInfoList2);
-
-        //特征提取2
-        FaceFeature faceFeature2 = new FaceFeature();
-        errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
-        System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
-
-        //特征比对
-        FaceFeature targetFaceFeature = new FaceFeature();
-        targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
-        FaceFeature sourceFaceFeature = new FaceFeature();
-        sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
-        FaceSimilar faceSimilar = new FaceSimilar();
-
-        errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
-
-        System.out.println("相似度:" + faceSimilar.getScore());
-
-        //设置活体测试
-        errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
-        //人脸属性检测
-        FunctionConfiguration configuration = new FunctionConfiguration();
-        configuration.setSupportAge(true);
-        configuration.setSupportFace3dAngle(true);
-        configuration.setSupportGender(true);
-        configuration.setSupportLiveness(true);
-        errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
-
-
-        //性别检测
-        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
-        errorCode = faceEngine.getGender(genderInfoList);
-        System.out.println("性别:" + genderInfoList.get(0).getGender());
-
-        //年龄检测
-        List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
-        errorCode = faceEngine.getAge(ageInfoList);
-        System.out.println("年龄:" + ageInfoList.get(0).getAge());
-
-        //3D信息检测
-        List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
-        errorCode = faceEngine.getFace3DAngle(face3DAngleList);
-        System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
-
-        //活体检测
-        List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
-        errorCode = faceEngine.getLiveness(livenessInfoList);
-        System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
-
-
-        //IR属性处理
-        ImageInfo imageInfoGray = getGrayData(new File("D:\\计算机\\b9e4b8a58d3db22741714f8ad24d175.jpg"));
-        List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();
-        errorCode = faceEngine.detectFaces(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);
-
-        FunctionConfiguration configuration2 = new FunctionConfiguration();
-        configuration2.setSupportIRLiveness(true);
-        errorCode = faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);
-        //IR活体检测
-        List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
-        errorCode = faceEngine.getLivenessIr(irLivenessInfo);
-        System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());
-
-        ImageInfoEx imageInfoEx = new ImageInfoEx();
-        imageInfoEx.setHeight(imageInfo.getHeight());
-        imageInfoEx.setWidth(imageInfo.getWidth());
-        imageInfoEx.setImageFormat(imageInfo.getImageFormat());
-        imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
-        imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});
-        List<FaceInfo> faceInfoList1 = new ArrayList<>();
-        errorCode = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);
-
-        FunctionConfiguration fun = new FunctionConfiguration();
-        fun.setSupportAge(true);
-        errorCode = faceEngine.process(imageInfoEx, faceInfoList1, functionConfiguration);
-        List<AgeInfo> ageInfoList1 = new ArrayList<>();
-        int age = faceEngine.getAge(ageInfoList1);
-        System.out.println("年龄:" + ageInfoList1.get(0).getAge());
-
-        FaceFeature feature = new FaceFeature();
-        errorCode = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), feature);
+        List<String> list = new ArrayList<>();
+//        for(User u : userList){
+//            try {
+//                Field[] fields = u.getClass().getDeclaredFields();
+//                if (fields.length > 0) {
+//                    Field lastField = fields[fields.length - 1];
+//                    lastField.setAccessible(true);
+//                    list.add((String) lastField.get(u));
+//                }
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//        }
+
+        list.add("D:\\javatext\\Zg5\\week1\\nekomimi\\images\\peixiuyurenlian.jpg");
+        list.add("D:\\javatext\\Zg5\\week1\\nekomimi\\images\\jincongrenlian.jpg");
+
+        Double ddd = 0.0;
+        for(String s:list){
+            ImageInfo imageInfo2 = getRGBData(new File(s));
+            List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
+            errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
+            System.out.println(faceInfoList2);
+
+            //特征提取2
+            FaceFeature faceFeature2 = new FaceFeature();
+            errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
+            System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
+
+            //特征比对
+            FaceFeature targetFaceFeature = new FaceFeature();
+            targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
+            FaceFeature sourceFaceFeature = new FaceFeature();
+            sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
+            FaceSimilar faceSimilar = new FaceSimilar();
+
+            errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
+
+            System.out.println("相似度:" + faceSimilar.getScore());
+            if(faceSimilar.getScore()>=0.8){
+                ddd= Double.valueOf(faceSimilar.getScore());
+                break;
+            }
+
+        }
+        System.err.println(ddd);
+
+//        //人脸检测2
+//        ImageInfo imageInfo2 = getRGBData(new File("D:\\javatext\\Zg5\\week1\\nekomimi\\images\\peixiuyurenlian.jpg"));
+////        ImageInfo imageInfo2 = getRGBData(new File("D:\\计算机\\536d6c8a02947d1128642d34c009d06.jpg"));
+//        List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
+//        errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
+//        System.out.println(faceInfoList2);
+//
+//        //特征提取2
+//        FaceFeature faceFeature2 = new FaceFeature();
+//        errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
+//        System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
+//
+//        //特征比对
+//        FaceFeature targetFaceFeature = new FaceFeature();
+//        targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
+//        FaceFeature sourceFaceFeature = new FaceFeature();
+//        sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
+//        FaceSimilar faceSimilar = new FaceSimilar();
+//
+//        errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
+//
+//        System.out.println("相似度:" + faceSimilar.getScore());
+
+//        //设置活体测试
+//        errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
+//        //人脸属性检测
+//        FunctionConfiguration configuration = new FunctionConfiguration();
+//        configuration.setSupportAge(true);
+//        configuration.setSupportFace3dAngle(true);
+//        configuration.setSupportGender(true);
+//        configuration.setSupportLiveness(true);
+//        errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
+//
+//
+//        //性别检测
+//        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
+//        errorCode = faceEngine.getGender(genderInfoList);
+//        System.out.println("性别:" + genderInfoList.get(0).getGender());
+//
+//        //年龄检测
+//        List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
+//        errorCode = faceEngine.getAge(ageInfoList);
+//        System.out.println("年龄:" + ageInfoList.get(0).getAge());
+//
+//        //3D信息检测
+//        List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
+//        errorCode = faceEngine.getFace3DAngle(face3DAngleList);
+//        System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
+//
+//        //活体检测
+//        List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
+//        errorCode = faceEngine.getLiveness(livenessInfoList);
+//        System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
+//
+//
+//        //IR属性处理
+//        ImageInfo imageInfoGray = getGrayData(new File("D:\\计算机\\b9e4b8a58d3db22741714f8ad24d175.jpg"));
+//        List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();
+//        errorCode = faceEngine.detectFaces(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);
+//
+//        FunctionConfiguration configuration2 = new FunctionConfiguration();
+//        configuration2.setSupportIRLiveness(true);
+//        errorCode = faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);
+//        //IR活体检测
+//        List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
+//        errorCode = faceEngine.getLivenessIr(irLivenessInfo);
+//        System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());
+//
+//        ImageInfoEx imageInfoEx = new ImageInfoEx();
+//        imageInfoEx.setHeight(imageInfo.getHeight());
+//        imageInfoEx.setWidth(imageInfo.getWidth());
+//        imageInfoEx.setImageFormat(imageInfo.getImageFormat());
+//        imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
+//        imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});
+//        List<FaceInfo> faceInfoList1 = new ArrayList<>();
+//        errorCode = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);
+//
+//        FunctionConfiguration fun = new FunctionConfiguration();
+//        fun.setSupportAge(true);
+//        errorCode = faceEngine.process(imageInfoEx, faceInfoList1, functionConfiguration);
+//        List<AgeInfo> ageInfoList1 = new ArrayList<>();
+//        int age = faceEngine.getAge(ageInfoList1);
+//        System.out.println("年龄:" + ageInfoList1.get(0).getAge());
+//
+//        FaceFeature feature = new FaceFeature();
+//        errorCode = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), feature);
 
 
         //引擎卸载

+ 137 - 0
src/main/java/com/neko/face/FaceUtil.java

@@ -0,0 +1,137 @@
+package com.neko.face;
+
+import com.arcsoft.face.*;
+import com.arcsoft.face.enums.DetectMode;
+import com.arcsoft.face.enums.DetectOrient;
+import com.arcsoft.face.enums.ErrorInfo;
+import com.arcsoft.face.toolkit.ImageInfo;
+import com.neko.domain.pojo.User;
+import com.neko.mapper.UserMapper;
+import org.simpleframework.xml.Text;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.jws.soap.SOAPBinding;
+import javax.management.ObjectName;
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
+
+/**
+ * @Date 2025/5/24 10:01
+ * @Author neko
+ **/
+//@Component
+public class FaceUtil {
+
+    public static Map<String,Object> shibie(String fileUrl, List<String> userList){
+        //从官网获取
+        String appId = "7QqJ1iFejXvwgt2UqVGM7aSMknu5SpXJEoixwVjUMJNn";
+        String sdkKey = "Bs5JhkCG7NDRSakHoQkmk2Ys7LbpvJ7X9VvMLEVSrMgi";
+
+
+        // 加载引擎
+        String baseDir = System.getProperty("user.dir");
+        String escapedPath = baseDir.replace("\\", "\\\\");
+        String relativePath = "\\\\"+"libs"+"\\\\"+"WIN64";
+//        FaceEngine faceEngine = new FaceEngine("D:\\javatext\\Zg5\\week1\\nekomimi\\libs\\WIN64");
+        FaceEngine faceEngine = new FaceEngine(escapedPath+relativePath);
+        //激活引擎
+        int errorCode = faceEngine.activeOnline(appId, sdkKey);
+
+        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            System.out.println("引擎激活失败");
+        }
+
+
+        ActiveFileInfo activeFileInfo=new ActiveFileInfo();
+        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
+        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+            System.out.println("获取激活文件信息失败");
+        }
+
+        //引擎配置
+        EngineConfiguration engineConfiguration = new EngineConfiguration();
+        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
+        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
+        engineConfiguration.setDetectFaceMaxNum(10);
+        engineConfiguration.setDetectFaceScaleVal(16);
+        //功能配置
+        FunctionConfiguration functionConfiguration = new FunctionConfiguration();
+        functionConfiguration.setSupportAge(true);
+        functionConfiguration.setSupportFace3dAngle(true);
+        functionConfiguration.setSupportFaceDetect(true);
+        functionConfiguration.setSupportFaceRecognition(true);
+        functionConfiguration.setSupportGender(true);
+        functionConfiguration.setSupportLiveness(true);
+        functionConfiguration.setSupportIRLiveness(true);
+        engineConfiguration.setFunctionConfiguration(functionConfiguration);
+
+
+        //初始化引擎
+        errorCode = faceEngine.init(engineConfiguration);
+
+        if (errorCode != ErrorInfo.MOK.getValue()) {
+            System.out.println("初始化引擎失败");
+        }
+
+
+        //人脸检测
+        ImageInfo imageInfo = getRGBData(new File(fileUrl));
+        List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
+        errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+//        System.out.println(faceInfoList);
+
+        //特征提取
+        FaceFeature faceFeature = new FaceFeature();
+        errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
+//        System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
+
+
+        //人脸检测2
+
+        System.err.println(userList);
+
+        Double ddd = 0.0;
+        String lj = "";
+        for(String s:userList){
+            ImageInfo imageInfo2 = getRGBData(new File(s));
+            List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
+            errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
+//            System.out.println(faceInfoList2);
+
+            //特征提取2
+            FaceFeature faceFeature2 = new FaceFeature();
+            errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
+//            System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
+
+            //特征比对
+            FaceFeature targetFaceFeature = new FaceFeature();
+            targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
+            FaceFeature sourceFaceFeature = new FaceFeature();
+            sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
+            FaceSimilar faceSimilar = new FaceSimilar();
+
+            errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
+
+//            System.out.println("相似度:" + faceSimilar.getScore());
+            if(faceSimilar.getScore()>=0.8){
+                ddd= Double.valueOf(faceSimilar.getScore());
+                lj=s;
+                break;
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("du",ddd);
+        map.put("lj",lj);
+
+        return map;
+    }
+}

+ 3 - 0
src/main/java/com/neko/mapper/UserMapper.java

@@ -3,6 +3,8 @@ package com.neko.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.neko.domain.pojo.User;
 
+import java.util.List;
+
 /**
 * @author 金聪
 * @description 针对表【user(用户表)】的数据库操作Mapper
@@ -11,6 +13,7 @@ import com.neko.domain.pojo.User;
 */
 public interface UserMapper extends BaseMapper<User> {
 
+    List<String> selectRlUrl();
 }
 
 

+ 6 - 2
src/main/java/com/neko/miniofile/service/FileService.java

@@ -13,7 +13,7 @@ import java.security.NoSuchAlgorithmException;
  **/
 public interface FileService {
     //上传
-    public String uploadHtml(String fileName, InputStream inputStream);
+    public String uploadHtml(String fileName, InputStream inputStream,String hou);
     public String uploadImage(String fileName,InputStream inputStream) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;
 
     //删除
@@ -21,7 +21,11 @@ public interface FileService {
 
     String downloadFile(String fileName, InputStream filePath) throws ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;
 
-    //下载
+    //视频
+    public String uploadvoide(String fileName, InputStream inputStream);
+
+    //音频
+    public String uploadAudio(String fileName, InputStream inputStream,String hou);
 
 
 }

+ 40 - 2
src/main/java/com/neko/miniofile/service/impl/FileServiceImpl.java

@@ -34,10 +34,10 @@ public class FileServiceImpl implements FileService {
 
     @SneakyThrows
     @Override
-    public String uploadHtml(String fileName, InputStream inputStream) {
+    public String uploadHtml(String fileName, InputStream inputStream,String hou) {
         PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                 .bucket(configProperties.getBucketName())
-                .contentType("text/html")
+                .contentType("text/"+hou)
                 .object(fileName)
                 .stream(inputStream, inputStream.available(), -1)
                 .build();
@@ -84,5 +84,43 @@ public class FileServiceImpl implements FileService {
         return "下载成功保存至:"+filePath;
     }
 
+    @Override
+    public String uploadvoide(String fileName, InputStream inputStream) {
+        try {
+            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
+                    .bucket(configProperties.getBucketName())
+                    .contentType("voide/mp4")
+                    .object(fileName)
+                    .stream(inputStream,inputStream.available(),-1)
+                    .build();
+            ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+            //生成路径
+            String path = minioClient.getObjectUrl(putObjectArgs.bucket(),putObjectArgs.object());
+            return path;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "上传失败";
+        }
+    }
+
+    @Override
+    public String uploadAudio(String fileName, InputStream inputStream,String hou) {
+        try {
+            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
+                    .bucket(configProperties.getBucketName())
+                    .contentType("audio/"+hou)
+                    .object(fileName)
+                    .stream(inputStream,inputStream.available(),-1)
+                    .build();
+            ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+            //生成路径
+            String path = minioClient.getObjectUrl(putObjectArgs.bucket(),putObjectArgs.object());
+            return path;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "上传失败";
+        }
+    }
+
 
 }

+ 3 - 0
src/main/java/com/neko/service/MessageService.java

@@ -2,6 +2,7 @@ package com.neko.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.neko.domain.dto.messageDto.SendMessageContentDto;
+import com.neko.domain.dto.messageDto.SendMessageVoidDto;
 import com.neko.domain.pojo.Message;
 import com.neko.utils.ResultVo;
 
@@ -13,4 +14,6 @@ import com.neko.utils.ResultVo;
 public interface MessageService extends IService<Message> {
 
     ResultVo sendMessage(SendMessageContentDto dto);
+
+    ResultVo sendMessageFile(SendMessageVoidDto dto);
 }

+ 3 - 3
src/main/java/com/neko/service/UserService.java

@@ -1,7 +1,7 @@
 package com.neko.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.neko.domain.dto.WxLoginDto;
+import com.neko.domain.dto.userDto.WxLoginDto;
 import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
@@ -9,8 +9,6 @@ import com.neko.domain.pojo.User;
 import com.neko.utils.ResultVo;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.net.UnknownHostException;
-
 /**
 * @author 金聪
 * @description 针对表【user(用户表)】的数据库操作Service
@@ -56,4 +54,6 @@ public interface UserService extends IService<User> {
     ResultVo updateArata(String token, MultipartFile multipartFile);
 
     ResultVo wxLogin(WxLoginDto dto);
+
+    ResultVo rlsb(MultipartFile filePath);
 }

+ 86 - 1
src/main/java/com/neko/service/impl/MessageServiceImpl.java

@@ -4,15 +4,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.neko.domain.dto.messageDto.SendMessageContentDto;
+import com.neko.domain.dto.messageDto.SendMessageVoidDto;
 import com.neko.domain.pojo.Message;
+import com.neko.domain.pojo.MessageContentMedia;
 import com.neko.domain.pojo.MessageContentText;
 import com.neko.domain.pojo.User;
+import com.neko.mapper.MessageContentMediaMapper;
 import com.neko.mapper.MessageContentTextMapper;
 import com.neko.mapper.UserMapper;
+import com.neko.miniofile.service.FileService;
+import com.neko.service.MessageContentMediaService;
 import com.neko.service.MessageService;
 import com.neko.mapper.MessageMapper;
+import com.neko.utils.ApiServiceExceptionEnum;
 import com.neko.utils.ResultVo;
 import com.neko.utils.SnowflakeUtil;
+import com.sun.org.apache.regexp.internal.RE;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -33,9 +40,14 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message>
     MessageMapper messageMapper;
     @Autowired
     MessageContentTextMapper messageContentTextMapper;
+    @Autowired
+    FileService fileService;
+    @Autowired
+    MessageContentMediaMapper messageContentMediaMapper;
 
     @Override
     public ResultVo sendMessage(SendMessageContentDto dto) {
+        //消息主表
         Message message = new Message();
         message.setId(String.valueOf(SnowflakeUtil.nextId()));
         String uuid = UUID.randomUUID().toString().replaceAll("-","");
@@ -48,7 +60,7 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message>
         if(user!=null){
             message.setReceiverType(1);
         }else{
-            message.setMessageType(2);
+            message.setReceiverType(2);
         }
         message.setMessageType(1);
         //文本内容
@@ -66,6 +78,79 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message>
 
         return ResultVo.success("发送成功");
     }
+
+    @Override
+    public ResultVo sendMessageFile(SendMessageVoidDto dto) {
+        try{
+            //消息主表
+            Message message = new Message();
+            message.setId(String.valueOf(SnowflakeUtil.nextId()));
+            //设置消息唯一标识
+            String uuid = UUID.randomUUID().toString().replaceAll("-","");
+            message.setMessageId("WJNR"+uuid);
+            message.setSenderId(dto.getSenderId());//发送者id
+            message.setReceiverId(dto.getReceiverId());//接收者id
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(User::getId,dto.getReceiverId());
+            User user = userMapper.selectOne(queryWrapper);
+            if(user!=null){//判断消息接收者类型
+                message.setReceiverType(1);
+            }else{
+                message.setReceiverType(2);
+            }
+            //创建MessageContentMedi对象
+            MessageContentMedia messageContentMedia = new MessageContentMedia();
+            //获取文件后缀
+            String fileName = dto.getMultipartFile().getOriginalFilename();
+            //获取.jpg。。。
+            String shui = UUID.randomUUID().toString().replaceAll("-","");
+            String s = fileName.substring(fileName.lastIndexOf("."));
+            //获取jpg。。。
+            int lastDotIndex = fileName.lastIndexOf('.');
+            String extension = fileName.substring(lastDotIndex + 1);
+
+            //添加内容信息
+            messageContentMedia.setId(String.valueOf(SnowflakeUtil.nextId()));
+            String llUrl="";
+            if(extension.equals("jpg") || extension.equals("png")){
+                message.setMessageType(2);//图片
+                llUrl=fileService.uploadImage(shui+s,dto.getMultipartFile().getInputStream());
+            }else if(extension.equals("mp4")){
+                message.setMessageType(4);//视频
+                llUrl=fileService.uploadvoide(shui+s,dto.getMultipartFile().getInputStream());
+            }else if(extension.equals("mp3")){
+                message.setMessageType(3);//语音
+                llUrl=fileService.uploadAudio(shui+s,dto.getMultipartFile().getInputStream(),extension);
+            }else if(extension.equals("html")){
+                message.setMessageType(5);//文件
+                llUrl=fileService.uploadHtml(shui+s,dto.getMultipartFile().getInputStream(),extension);
+            }else{
+                message.setMessageType(8);
+            }
+            messageContentMedia.setFileUrl(llUrl);
+            //获取文件名
+            String jk = dto.getMultipartFile().getOriginalFilename();
+            int kk = jk.lastIndexOf(".");
+            String fileNameWithoutExtension = jk.substring(0,kk);
+            messageContentMedia.setFileName(fileNameWithoutExtension);
+            messageContentMedia.setFileSize(String.valueOf(dto.getMultipartFile().getSize()));
+            messageContentMedia.setFileType(extension);
+            messageContentMedia.setCreateTime(new Date());
+
+            //
+            message.setContentId(messageContentMedia.getId());
+            message.setSendTime(new Date());
+            message.setCreateTime(new Date());
+            messageMapper.insert(message);
+            messageContentMediaMapper.insert(messageContentMedia);
+
+            return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultVo.error(ApiServiceExceptionEnum.CAN_SHU_YICHANG);
+        }
+
+    }
 }
 
 

+ 2 - 1
src/main/java/com/neko/service/impl/MusicNekoServiceImpl.java

@@ -7,6 +7,7 @@ import com.neko.domain.pojo.OfflineMessage;
 import com.neko.mapper.MusicNekoMapper;
 import com.neko.mapper.OfflineMessageMapper;
 import com.neko.service.MusicNekoService;
+import com.neko.utils.ApiServiceExceptionEnum;
 import com.neko.utils.ResultVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.auth.AUTH;
@@ -31,6 +32,6 @@ public class MusicNekoServiceImpl extends ServiceImpl<MusicNekoMapper, Music>
         log.info("听,这就是neko畅听");
         List<Music> music = musicNekoMapper.selectList(null);
 
-        return ResultVo.success(music);
+        return ResultVo.success(ApiServiceExceptionEnum.RESULT_SUCCES,music);
     }
 }

+ 60 - 9
src/main/java/com/neko/service/impl/UserServiceImpl.java

@@ -3,18 +3,17 @@ package com.neko.service.impl;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.repository.AbstractRepository;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.neko.config.GiteeProperties;
 import com.neko.config.ThirdlyLoginTypeConstant;
-import com.neko.domain.dto.WxLoginDto;
+import com.neko.domain.dto.userDto.WxLoginDto;
 import com.neko.domain.dto.friendDto.UserPwdDto;
 import com.neko.domain.dto.userDto.PhoneLoginDto;
 import com.neko.domain.dto.userDto.YanDto;
 import com.neko.domain.pojo.User;
-import com.neko.domain.pojo.UserDevice;
 import com.neko.domain.pojo.UserLog;
 import com.neko.domain.pojo.UserProfile;
+import com.neko.face.FaceUtil;
 import com.neko.mapper.UserLogMapper;
 import com.neko.mapper.UserProfileMapper;
 import com.neko.miniofile.service.FileService;
@@ -22,7 +21,6 @@ import com.neko.service.UserService;
 import com.neko.mapper.UserMapper;
 import com.neko.utils.*;
 import io.jsonwebtoken.Claims;
-import io.minio.errors.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpResponse;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,12 +31,10 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.nio.charset.StandardCharsets;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
@@ -370,6 +366,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
         try {
             String fileName = multipartFile.getOriginalFilename();
             fileName = UUID.randomUUID().toString().replaceAll("-","")+fileName.substring(fileName.lastIndexOf("."));
+//            String h = fileName.substring(fileName.lastIndexOf("."));
             String path = fileService.uploadImage(fileName,multipartFile.getInputStream());
 
             return ResultVo.success(path);
@@ -394,6 +391,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
         try {
             String path = fileService.uploadImage(fileName,multipartFile.getInputStream());
             userProfile.setAvatar(path);
+            userProfileMapper.updateById(userProfile);
             return ResultVo.success("修改成功");
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -401,13 +399,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
     }
 
     // 微信小程序appid
-    private static final String APPID = "wx77774b595672cf88";
+    private static final String APPID = "wxbad190e564a24ca9";
     // 微信小程序 secret
-    private static final String SECRET = "4f6dab9312b5ac652ef87d9263416dcb";
+    private static final String SECRET = "bfb947d001df3b157976d937195af992";
     // 微信解析登录凭证接口
     private static final String URL = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APPID + "&secret=" + SECRET + "&js_code=";
     @Override
     public ResultVo wxLogin(WxLoginDto dto) {
+        if(dto.getCode()==null){
+            return ResultVo.error(ApiServiceExceptionEnum.RESULT_ERROR);
+        }
         InetAddress localHost = null;
         RestTemplate restTemplate = new RestTemplate();
         try{
@@ -484,6 +485,56 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
             return ResultVo.error(ApiServiceExceptionEnum.WX_CODE_ERROR);
         }
     }
+
+    @Override
+    public ResultVo rlsb(MultipartFile filePath) {
+        log.info("人脸识别");
+
+        String fileName = filePath.getOriginalFilename();
+        System.err.println(fileName);
+        //
+        String baseDir = System.getProperty("user.dir");
+        String relativePath = "\\\\"+"images"+"\\\\"+"fuben"+"\\\\";
+        String www = "\\\\"+"images"+"\\\\"+"fuben";
+        String escapedPath = baseDir.replace("\\", "\\\\");
+        String llljjj = escapedPath+relativePath;
+        System.out.println(llljjj+fileName);
+        //
+        File savePath = new File(llljjj + fileName);
+        List<String> list = userMapper.selectRlUrl();
+
+        try {
+            filePath.transferTo(savePath);
+            Map<String,Object> map = FaceUtil.shibie(llljjj+fileName,list);
+            Double b = (Double) map.get("du");
+            System.err.println("相似度:"+b);
+            if(b<0.8){
+                return ResultVo.error(ApiServiceExceptionEnum.RESULT_ERROR);
+            }
+            String jj = (String) map.get("lj");
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(User::getRlUrl,jj);
+            User user = userMapper.selectOne(queryWrapper);
+            if(user==null){
+                log.info("错误请求");
+                return ResultVo.error(ApiServiceExceptionEnum.YONGHU_NOT_NULL);
+            }
+
+            String token = AppJwtUtil.getToken(Long.valueOf(user.getId()));
+            String folderPath = escapedPath+www;
+            File folder = new File(folderPath);
+            File[] files = folder.listFiles();
+            for (File file : files) {
+                file.delete();
+            }
+
+            return ResultVo.success(ApiServiceExceptionEnum.LOGIN_OK,token);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("人脸识别失败");
+            return ResultVo.error(ApiServiceExceptionEnum.LOGIN_ERROR);
+        }
+    }
 }
 
 

+ 1 - 0
src/main/java/com/neko/utils/ApiServiceExceptionEnum.java

@@ -18,6 +18,7 @@ public enum ApiServiceExceptionEnum implements BaseExceptionEnum{
 	ZHUXIAO_USER(1008,"用户已被注销"),
 	BAN_USER(1009,"用户已被封禁"),
 	WX_CODE_ERROR(1010,"微信code获取失败"),
+	CAN_SHU_YICHANG(1011,"系统参数异常"),
     ;
 
 

+ 3 - 0
src/main/resources/mapper/UserMapper.xml

@@ -24,4 +24,7 @@
         status,registerTime,registerIp,
         is_auth_sf,last_login_time
     </sql>
+    <select id="selectRlUrl" resultType="java.lang.String">
+        select rl_url from user where rl_url is not null
+    </select>
 </mapper>

+ 13 - 6
src/test/java/com/neko/NekomimiApplicationTests.java

@@ -1,7 +1,10 @@
 package com.neko;
 
+import com.neko.domain.pojo.Testdd;
+import com.neko.domain.pojo.User;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -11,12 +14,16 @@ import java.util.Random;
 class NekomimiApplicationTests {
 
     public static void main(String[] args) {
-        String s = "1234,";
-        List<String> l = Arrays.asList(s.split(","));
-        for(String ss:l){
-            System.out.println(ss);
-        }
-        System.out.println(l.size());
+        String s = "fghjhsdjkgh.png";
+        int lastDotIndex = s.lastIndexOf('.');
+        String extension = s.substring(lastDotIndex + 1);
+        System.out.println(extension);
+//        String v = s.substring(s.lastIndexOf("."));
+//        if(extension.contains("jpg") || extension.contains("png")){
+//            System.out.println(111);
+//        }else{
+//            System.out.println(222);
+//        }
     }
 
 }