车车 8 ヶ月 前
コミット
39099be7b2

+ 6 - 9
ktg-admin/src/main/java/com/ktg/web/controller/system/SysLoginController.java

@@ -1,13 +1,11 @@
 package com.ktg.web.controller.system;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.ktg.common.annotation.Log;
 import com.ktg.common.constant.Constants;
 import com.ktg.common.core.domain.AjaxResult;
 import com.ktg.common.core.domain.entity.SysMenu;
 import com.ktg.common.core.domain.entity.SysUser;
 import com.ktg.common.core.domain.model.LoginBody;
-import com.ktg.common.enums.BusinessType;
 import com.ktg.common.utils.SecurityUtils;
 import com.ktg.framework.web.service.SysLoginService;
 import com.ktg.framework.web.service.SysPermissionService;
@@ -22,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
@@ -54,11 +53,9 @@ public class SysLoginController {
     public AjaxResult login(@RequestBody LoginBody loginBody) {
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid());
         ajax.put(Constants.TOKEN, token);
-        SysUser user = iSysUserService.getOne(Wrappers.<SysUser>lambdaQuery()
-                .eq(SysUser::getUserName, loginBody.getUsername()));
+        SysUser user = iSysUserService.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, loginBody.getUsername()));
         ajax.put("nickName", user.getNickName());
         return ajax;
     }
@@ -118,9 +115,9 @@ public class SysLoginController {
     }*/
 
     @ApiOperation("系统用户登录-指纹验证登录dat")
-    @Log(title = "导入-物资", businessType = BusinessType.IMPORT)
     @PostMapping("/loginByFingerprintDat")
-    public AjaxResult loginByFingerprintDat(MultipartFile file) {
-        return loginService.loginByFingerprintDat(file);
+    public AjaxResult loginByFingerprintDat(MultipartFile file) throws IOException {
+        AjaxResult ajaxResult = loginService.loginByFingerprintDat(file);
+        return ajaxResult;
     }
 }

+ 3 - 50
ktg-admin/src/main/java/com/ktg/web/controller/system/SysUserCharacteristicController.java

@@ -5,19 +5,11 @@ import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ktg.common.annotation.Log;
-import com.ktg.common.config.RuoYiConfig;
 import com.ktg.common.core.controller.BaseController;
-import com.ktg.common.core.domain.AjaxResult;
 import com.ktg.common.enums.BusinessType;
 import com.ktg.common.pojo.CommonResult;
-import com.ktg.common.utils.StringUtils;
-import com.ktg.common.utils.file.FileUploadUtils;
-import com.ktg.common.utils.file.FileUtils;
 import com.ktg.common.utils.poi.ExcelUtil;
-import com.ktg.framework.config.ServerConfig;
-import com.ktg.system.domain.SysUploadFile;
 import com.ktg.system.domain.SysUserCharacteristic;
-import com.ktg.system.service.ISysUploadFileService;
 import com.ktg.system.service.ISysUserCharacteristicService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -25,13 +17,13 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 
@@ -49,12 +41,6 @@ public class SysUserCharacteristicController extends BaseController
 {
     @Autowired
     private ISysUserCharacteristicService sysUserCharacteristicService;
-    @Autowired
-    private ServerConfig serverConfig;
-    @Autowired
-    private ISysUploadFileService iSysUploadFileService;
-    @Value("${ktg-mes.prod}")
-    private String prodApi;
 
     @ApiOperation("查询用户特征(指纹、面部)-分页")
     @Parameters({
@@ -99,41 +85,8 @@ public class SysUserCharacteristicController extends BaseController
     @PreAuthorize("@ss.hasPermi('iscs:characteristic:add')")
     @Log(title = "新增指纹录入-指纹图片转成dat存储", businessType = BusinessType.INSERT)
     @PostMapping("/insertUserFingerprintDat")
-    public CommonResult<Boolean> insertUserFingerprintDat(MultipartFile file, Long userId)
-    {
-        try {
-            // 上传文件路径
-            String filePath = RuoYiConfig.getUploadPath();
-            // 上传并返回新文件名称
-            String fileName = FileUploadUtils.upload(filePath, file);
-            String url;
-            String absolutePath;
-            if (StringUtils.isNotBlank(prodApi)) {
-                url = serverConfig.getUrl() + prodApi + fileName;
-                absolutePath = fileName.replace("/profile/upload", filePath);
-            } else {
-                url = serverConfig.getUrl() + fileName;
-                absolutePath = "C:" + fileName.replace("/profile/upload", filePath);
-            }
-
-            AjaxResult ajax = AjaxResult.success();
-            ajax.put("url", url);
-            ajax.put("fileName", fileName);
-            ajax.put("newFileName", FileUtils.getName(fileName));
-            ajax.put("originalFilename", file.getOriginalFilename());
-
-            // 2.开始新增文件上传信息
-            SysUploadFile sysFile = new SysUploadFile();
-            sysFile.setName(file.getOriginalFilename());
-            sysFile.setPath(absolutePath);
-            sysFile.setUrl(url);
-            sysFile.setType(file.getContentType());
-            sysFile.setSize(file.getSize());
-            iSysUploadFileService.insertSysUploadFile(sysFile);
-        } catch (Exception e) {
-            log.error("上传指纹失败:" + e);
-        }
-        return CommonResult.success(sysUserCharacteristicService.insertUserFingerprintDat(file, userId));
+    public CommonResult<Boolean> insertUserFingerprintDat(MultipartFile file, String userName) throws IOException {
+        return CommonResult.success(sysUserCharacteristicService.insertUserFingerprintDat(file, userName));
     }
 
     @ApiOperation("修改用户特征(指纹、面部)")

+ 12 - 66
ktg-common/src/main/java/com/ktg/common/utils/FingerprintComparisonByDat.java

@@ -16,7 +16,6 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -25,7 +24,7 @@ import java.util.concurrent.Executors;
 /**
  * <p>
  * FingerprintComparison<br>
- * 指纹比对算法(图片)
+ * 指纹比对算法(dat)
  * </p>
  *
  * @author CGJ
@@ -39,7 +38,7 @@ public class FingerprintComparisonByDat {
     private static final double THRESHOLD = 40; // 相当于错误率是0.01%,THRESHOLD越高,错误率越低
     private static final ExecutorService THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(4); // 线程池
 
-    public static VerificationVO completableFutureComparison(final MultipartFile file, final Set<String> matcherDat) {
+    public static VerificationVO completableFutureComparison(final MultipartFile file, final List<String> matcherDat) throws IOException {
         // 转成list
         List<String> matcherImgList = new ArrayList<>(matcherDat);
         // 切分四等份
@@ -48,10 +47,18 @@ public class FingerprintComparisonByDat {
             denominator = 4;
         }
         List<List<String>> averageMatcherImgList = Lists.partition(matcherImgList, matcherImgList.size() / denominator);
+        // 开始解析输入的指纹到指纹模板
+        byte[] bytes = file.getBytes();
+        // 创建FingerprintImage对象
+        FingerprintImage fingerprintImage = new FingerprintImage()
+                .dpi(500) // 设置DPI,具体值取决于你的图像分辨率
+                .decode(bytes);
+        // 提取指纹特征值
+        FingerprintTemplate fingerprintTemplate = new FingerprintTemplate(fingerprintImage);
         // 构建四个线程进行处理,防止人员过多对比速度太慢
         CompletableFuture<VerificationVO>[] completableFutureArray = averageMatcherImgList.stream().map(
                 partitionFingerprint -> CompletableFuture.supplyAsync(
-                        () -> comparison(file, new ArrayList<>(partitionFingerprint)), THREAD_POOL_EXECUTOR)
+                        () -> comparison(fingerprintTemplate, new ArrayList<>(partitionFingerprint)), THREAD_POOL_EXECUTOR)
         ).toArray(CompletableFuture[]::new);
         // 等待所有任务执行完
         CompletableFuture.allOf(completableFutureArray).join();
@@ -75,16 +82,8 @@ public class FingerprintComparisonByDat {
         return null;
     }
 
-    public static VerificationVO comparison(final MultipartFile file, final List<String> matcherDatList) {
+    public static VerificationVO comparison(final FingerprintTemplate fingerprintTemplate, final List<String> matcherDatList) {
         try {
-            // 开始解析输入的指纹到指纹模板
-            byte[] bytes = file.getBytes();
-            // 创建FingerprintImage对象
-            FingerprintImage fingerprintImage = new FingerprintImage()
-                    .dpi(500) // 设置DPI,具体值取决于你的图像分辨率
-                    .decode(bytes);
-            // 提取指纹特征值
-            FingerprintTemplate fingerprintTemplate = new FingerprintTemplate(fingerprintImage);
             if (!matcherDatList.isEmpty()) {
                 // 输入的被验证指纹
                 FingerprintMatcher matcher = new FingerprintMatcher(fingerprintTemplate);
@@ -109,59 +108,6 @@ public class FingerprintComparisonByDat {
         return null;
     }
 
-
-
-    public static void main(String[] args) throws IOException {
-        /*try {
-            String imagePath = "C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\image_2.bmp"; // 替换为你的指纹图片路径
-            byte[] fingerprintData = extractFingerprintTemplate(imagePath);
-
-            // 保存到文件
-            Files.write(Paths.get("C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\fingerprint_2.dat"), fingerprintData);
-            System.out.println("指纹特征值已保存!");
-        } catch (IOException e) {
-            e.printStackTrace();
-        }*/
-
-        String aa = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
-        String bb = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
-        // 加载模板1(数据库或文件中加载)
-        byte[] templateData1 = Files.readAllBytes(Paths.get(aa));
-        String jsonString = new String(templateData1);
-        FingerprintTemplate template1 = new FingerprintTemplate().deserialize(jsonString);
-
-        // 加载模板2(待比对指纹)
-        byte[] templateData2 = Files.readAllBytes(Paths.get(bb));
-        String jsonString2 = new String(templateData2);
-        FingerprintTemplate template2 = new FingerprintTemplate().deserialize(jsonString2);
-
-        // 匹配
-        double score = new FingerprintMatcher().index(template1).match(template2);
-
-        System.out.println("匹配得分: " + score);
-        if (score >= 40) { // 经验阈值,一般为 40 分
-            System.out.println("指纹匹配!");
-        } else {
-            System.out.println("指纹不匹配!");
-        }
-
-
-
-    }
-
-    public static byte[] extractFingerprintTemplate(String imagePath) throws IOException {
-        // 读取图像文件(灰度图像 PNG, BMP, JPEG 等)
-        byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
-
-        // 提取特征值
-        FingerprintTemplate template = new FingerprintTemplate()
-                .dpi(500) // 指定 DPI (重要,通常为 500)
-                .create(imageBytes);
-
-        // 导出为 byte[] 保存特征值
-        return template.serialize().getBytes();
-    }
-
 }
 
 

+ 6 - 3
ktg-framework/src/main/java/com/ktg/framework/web/service/SysLoginService.java

@@ -38,6 +38,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -221,7 +222,7 @@ public class SysLoginService {
         return ajax;
     }
 
-    public AjaxResult loginByFingerprintDat(MultipartFile file) {
+    public AjaxResult loginByFingerprintDat(MultipartFile file) throws IOException {
         Assert.isTrue(file.getSize() > 0, "输入的指纹不能为空!");
         // 获取所有的用户指纹
         List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
@@ -229,11 +230,13 @@ public class SysLoginService {
         Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
         List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
         // 通过指纹获取最相似的用户
-        VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, new HashSet<>(collect));
+        // VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, new HashSet<>(collect));
+        VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, collect);
         Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
         String fingerprint = verificationVO.getFingerprint();
         SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
-                .eq(SysUserCharacteristic::getContent, fingerprint));
+                .eq(SysUserCharacteristic::getContent, fingerprint)
+                .last("limit 1"));
         SysUser sysUser = iSysUserService.getById(one.getUserId());
         // 生成令牌
         AjaxResult ajax = AjaxResult.success();

+ 3 - 1
ktg-system/src/main/java/com/ktg/system/service/ISysUserCharacteristicService.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ktg.system.domain.SysUserCharacteristic;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+
 /**
  * 用户特征(指纹、面部)Service接口
  *
@@ -16,6 +18,6 @@ public interface ISysUserCharacteristicService extends IService<SysUserCharacter
 
     Page<SysUserCharacteristic> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic);
 
-    Boolean insertUserFingerprintDat(MultipartFile file, Long userId);
+    Boolean insertUserFingerprintDat(MultipartFile file, String userName) throws IOException;
 
 }

+ 69 - 3
ktg-system/src/main/java/com/ktg/system/service/impl/SysUserCharacteristicServiceImpl.java

@@ -4,13 +4,23 @@ import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ktg.common.core.domain.entity.SysUser;
+import com.ktg.common.utils.StringUtils;
 import com.ktg.system.domain.SysUserCharacteristic;
 import com.ktg.system.mapper.SysUserCharacteristicMapper;
 import com.ktg.system.service.ISysUserCharacteristicService;
+import com.ktg.system.service.ISysUserService;
+import com.machinezoo.sourceafis.FingerprintTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
 /**
  * 用户特征(指纹、面部)Service业务层处理
  *
@@ -22,6 +32,10 @@ public class SysUserCharacteristicServiceImpl extends ServiceImpl<SysUserCharact
 
     @Autowired
     private SysUserCharacteristicMapper sysUserCharacteristicMapper;
+    @Value("${ktg-mes.prod}")
+    private String prodApi;
+    @Autowired
+    private ISysUserService iSysUserService;
 
     @Override
     public Page<SysUserCharacteristic> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic) {
@@ -31,11 +45,63 @@ public class SysUserCharacteristicServiceImpl extends ServiceImpl<SysUserCharact
     }
 
     @Override
-    public Boolean insertUserFingerprintDat(MultipartFile file, Long userId) {
-        Assert.notNull(userId, "请告知我这是哪个用户的指纹!");
+    public Boolean insertUserFingerprintDat(MultipartFile file, String userName) throws IOException {
+        Assert.notBlank(userName, "请告知我这是哪个用户的指纹!");
         Assert.isTrue(file.getSize() > 0, "指纹信息不能为空!");
+        SysUser user = iSysUserService.getOne(Wrappers.<SysUser>lambdaQuery()
+                .eq(SysUser::getUserName, userName));
+        Assert.isFalse(user == null, "系统中无该用户!");
+        Long userId = user.getUserId();
+        // 时间戳
+        long currentTimestamp = System.currentTimeMillis();
+        // 设置文件路径
+        String filePath = "/home/iscs/finger/" + userId +"/";
+        if (StringUtils.isBlank(prodApi)) {
+            filePath = "C:" + filePath;
+        }
+        // 确保目录存在
+        Path uploadPath = Paths.get(filePath);
+        if (!Files.exists(uploadPath)) {
+            Files.createDirectories(uploadPath);
+        }
+
+        // 获取文件名并构建目标路径
+        String fileName = userId + "_" + currentTimestamp + file.getOriginalFilename();
+        Path targetLocation = uploadPath.resolve(fileName);
+        // 将文件写入目标路径
+        file.transferTo(targetLocation.toFile());
+
+        // 开始生成dat文件
+        try {
+            String imagePath = filePath + fileName; // 替换为你的指纹图片路径
+            byte[] fingerprintData = extractFingerprintTemplate(imagePath);
+
+            // 保存到文件
+            Files.write(Paths.get(filePath + userId + "_" + currentTimestamp + ".dat"), fingerprintData);
+            System.out.println("指纹特征值已保存!");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        SysUserCharacteristic sysUserCharacteristic = new SysUserCharacteristic();
+        sysUserCharacteristic.setUserId(userId);
+        sysUserCharacteristic.setType("1");
+        sysUserCharacteristic.setContent(filePath + userId + "_" + currentTimestamp + ".dat");
+        sysUserCharacteristic.setOrderNum(0);
+        save(sysUserCharacteristic);
+        return true;
+    }
+
+    public static byte[] extractFingerprintTemplate(String imagePath) throws IOException {
+        // 读取图像文件(灰度图像 PNG, BMP, JPEG 等)
+        byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
+
+        // 提取特征值
+        FingerprintTemplate template = new FingerprintTemplate()
+                .dpi(500) // 指定 DPI (重要,通常为 500)
+                .create(imageBytes);
 
-        return null;
+        // 导出为 byte[] 保存特征值
+        return template.serialize().getBytes();
     }
 
 }