车车 il y a 8 mois
Parent
commit
13b4372441

+ 34 - 0
ktg-admin/src/main/java/com/ktg/web/controller/system/SysLoginController.java

@@ -1,15 +1,21 @@
 package com.ktg.web.controller.system;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.FingerprintLoginBody;
 import com.ktg.common.core.domain.model.LoginBody;
+import com.ktg.common.utils.FingerprintComparisonByImg;
 import com.ktg.common.utils.SecurityUtils;
+import com.ktg.common.vo.VerificationVO;
 import com.ktg.framework.web.service.SysLoginService;
 import com.ktg.framework.web.service.SysPermissionService;
+import com.ktg.system.domain.SysUserCharacteristic;
 import com.ktg.system.service.ISysMenuService;
+import com.ktg.system.service.ISysUserCharacteristicService;
 import com.ktg.system.service.ISysUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -19,8 +25,10 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 登录验证
@@ -41,6 +49,8 @@ public class SysLoginController {
 
     @Autowired
     private ISysUserService iSysUserService;
+    @Autowired
+    private ISysUserCharacteristicService iSysUserCharacteristicService;
 
     /**
      * 登录方法
@@ -108,4 +118,28 @@ public class SysLoginController {
         List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
         return AjaxResult.success(menuService.buildMenus(menus));
     }
+
+    @ApiOperation("系统用户登录-指纹验证登录")
+    @PostMapping("/loginByFingerprint")
+    public AjaxResult loginByFingerprint(@RequestBody FingerprintLoginBody loginBody) {
+        Assert.notBlank(loginBody.getInputImg(), "输入的指纹不能为空!");
+        // 获取所有的用户指纹
+        List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getType, "0"));
+        Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
+        List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
+        // 通过指纹获取最相似的用户
+        VerificationVO verificationVO = FingerprintComparisonByImg.completableFutureComparison(loginBody.getInputImg(), new HashSet<>(collect));
+        Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
+        String fingerprintImg = verificationVO.getFingerprintImg();
+        SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getContent, fingerprintImg));
+        SysUser sysUser = iSysUserService.getById(one.getUserId());
+        // 生成令牌
+        AjaxResult ajax = AjaxResult.success();
+        String token = loginService.loginWithoutPassword(sysUser);
+        ajax.put(Constants.TOKEN, token);
+        ajax.put("nickName", sysUser.getNickName());
+        return ajax;
+    }
 }

+ 106 - 0
ktg-admin/src/main/java/com/ktg/web/controller/system/SysUserCharacteristicController.java

@@ -0,0 +1,106 @@
+package com.ktg.web.controller.system;
+
+import cn.hutool.core.convert.Convert;
+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.core.controller.BaseController;
+import com.ktg.common.enums.BusinessType;
+import com.ktg.common.pojo.CommonResult;
+import com.ktg.common.utils.poi.ExcelUtil;
+import com.ktg.system.domain.SysUserCharacteristic;
+import com.ktg.system.service.ISysUserCharacteristicService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 用户特征(指纹、面部)Controller
+ *
+ * @author cgj
+ * @date 2025-03-10
+ */
+@Api(tags = "用户特征(指纹、面部)")
+@RestController
+@RequestMapping("/system/user/characteristic")
+public class SysUserCharacteristicController extends BaseController
+{
+    @Autowired
+    private ISysUserCharacteristicService sysUserCharacteristicService;
+
+    @ApiOperation("查询用户特征(指纹、面部)-分页")
+    @Parameters({
+            @Parameter(name = "page", description = "Page"),
+            @Parameter(name = "sysUserCharacteristic", description = "实体参数")
+    })
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:list')")
+    @GetMapping("/getSysUserCharacteristicPage")
+    public CommonResult<Page<SysUserCharacteristic>> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic)
+    {
+        Page<SysUserCharacteristic> result = sysUserCharacteristicService.getSysUserCharacteristicPage(page, sysUserCharacteristic);
+        return CommonResult.success(result);
+    }
+
+    @ApiOperation("导出用户特征(指纹、面部)列表")
+    @Parameter(name = "sysUserCharacteristic", description = "实体参数")
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:export')")
+    @Log(title = "用户特征(指纹、面部)", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportSysUserCharacteristic")
+    public void exportSysUserCharacteristic(HttpServletResponse response, SysUserCharacteristic sysUserCharacteristic)
+    {
+        Page<SysUserCharacteristic> page = new Page<>();
+        page.setSize(-1);
+        page.setCurrent(1);
+        List<SysUserCharacteristic> list = sysUserCharacteristicService.page(page, Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .orderByDesc(SysUserCharacteristic::getRecordId)).getRecords();
+        ExcelUtil<SysUserCharacteristic> util = new ExcelUtil<SysUserCharacteristic>(SysUserCharacteristic.class);
+        util.exportExcel(response, list, "用户特征(指纹、面部)数据");
+    }
+
+    @ApiOperation("获取用户特征(指纹、面部)详细信息")
+    @Parameter(name = "recordId", description = "recordId")
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:query')")
+    @GetMapping(value = "/selectSysUserCharacteristicById")
+    public CommonResult<SysUserCharacteristic> selectSysUserCharacteristicById(Long recordId)
+    {
+        return CommonResult.success(sysUserCharacteristicService.getById(recordId));
+    }
+
+    @ApiOperation("新增用户特征(指纹、面部)")
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:add')")
+    @Log(title = "用户特征(指纹、面部)", businessType = BusinessType.INSERT)
+    @PostMapping("/insertSysUserCharacteristic")
+    public CommonResult<Boolean> insertSysUserCharacteristic(@RequestBody @Parameter(name = "sysUserCharacteristic", description = "新增数据类,放到body") SysUserCharacteristic sysUserCharacteristic)
+    {
+        return CommonResult.success(sysUserCharacteristicService.save(sysUserCharacteristic));
+    }
+
+    @ApiOperation("修改用户特征(指纹、面部)")
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:edit')")
+    @Log(title = "用户特征(指纹、面部)", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateSysUserCharacteristic")
+    public CommonResult<Boolean> updateSysUserCharacteristic(@RequestBody @Parameter(name = "sysUserCharacteristic", description = "修改数据类,放到body") SysUserCharacteristic sysUserCharacteristic)
+    {
+        return CommonResult.success(sysUserCharacteristicService.updateById(sysUserCharacteristic));
+    }
+
+    @ApiOperation("删除用户特征(指纹、面部)")
+    @PreAuthorize("@ss.hasPermi('iscs:characteristic:remove')")
+    @Log(title = "用户特征(指纹、面部)", businessType = BusinessType.DELETE)
+	@PostMapping("/deleteSysUserCharacteristicByRecordIds")
+    public CommonResult<Boolean> deleteSysUserCharacteristicByRecordIds(String recordIds)
+    {
+        Assert.notBlank(recordIds, "请选择需要删除的数据!");
+        Long[] longIds = Convert.toLongArray(recordIds);
+        return CommonResult.success(sysUserCharacteristicService.removeBatchByIds(Arrays.asList(longIds)));
+    }
+}

+ 7 - 0
ktg-common/pom.xml

@@ -200,6 +200,13 @@
             <version>2.0.24</version>
         </dependency>
 
+        <!-- 指纹 -->
+        <dependency>
+            <groupId>com.machinezoo.sourceafis</groupId>
+            <artifactId>sourceafis</artifactId>
+            <version>3.13.0</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 19 - 0
ktg-common/src/main/java/com/ktg/common/core/domain/model/FingerprintLoginBody.java

@@ -0,0 +1,19 @@
+package com.ktg.common.core.domain.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 指纹登录参数
+ *
+ * @author cgj
+ * @date 2025-01-14
+ */
+@Data
+public class FingerprintLoginBody
+{
+
+    @ApiModelProperty(value = "输入的指纹地址")
+    private String inputImg;
+
+}

+ 2 - 2
ktg-iscs/src/main/java/com/ktg/iscs/config/FingerprintComparisonByImg.java → ktg-common/src/main/java/com/ktg/common/utils/FingerprintComparisonByImg.java

@@ -1,9 +1,9 @@
-package com.ktg.iscs.config;
+package com.ktg.common.utils;
 
 
 import cn.hutool.core.util.ObjectUtil;
 import com.google.common.collect.Lists;
-import com.ktg.iscs.domain.vo.cabinet.VerificationVO;
+import com.ktg.common.vo.VerificationVO;
 import com.machinezoo.sourceafis.FingerprintImage;
 import com.machinezoo.sourceafis.FingerprintImageOptions;
 import com.machinezoo.sourceafis.FingerprintMatcher;

+ 1 - 1
ktg-iscs/src/main/java/com/ktg/iscs/domain/vo/cabinet/VerificationVO.java → ktg-common/src/main/java/com/ktg/common/vo/VerificationVO.java

@@ -1,4 +1,4 @@
-package com.ktg.iscs.domain.vo.cabinet;
+package com.ktg.common.vo;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java

@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage", "/cabinetLogin").anonymous()
+                .antMatchers("/login", "/register", "/captchaImage", "/cabinetLogin", "/loginByFingerprint").anonymous()
                 .antMatchers("/mobile/login/**").permitAll()
                 .antMatchers("/iscs/card/login").permitAll()
                 .antMatchers("/iscs/key/selectIsKeyByNfcWithoutAuth").permitAll()

+ 0 - 6
ktg-iscs/pom.xml

@@ -55,12 +55,6 @@
             <version>1.4.0</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.machinezoo.sourceafis</groupId>
-            <artifactId>sourceafis</artifactId>
-            <version>3.13.0</version>
-        </dependency>
-
     </dependencies>
 
 </project>

+ 2 - 2
ktg-iscs/src/main/java/com/ktg/iscs/controller/TestIscsController.java

@@ -9,9 +9,9 @@ import com.ktg.common.core.controller.BaseController;
 import com.ktg.common.enums.BusinessType;
 import com.ktg.common.pojo.CommonResult;
 import com.ktg.common.utils.poi.ExcelUtil;
-import com.ktg.iscs.config.FingerprintComparisonByImg;
+import com.ktg.common.utils.FingerprintComparisonByImg;
 import com.ktg.iscs.domain.TestIscs;
-import com.ktg.iscs.domain.vo.cabinet.VerificationVO;
+import com.ktg.common.vo.VerificationVO;
 import com.ktg.iscs.service.ITestIscsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 47 - 0
ktg-system/src/main/java/com/ktg/system/domain/SysUserCharacteristic.java

@@ -0,0 +1,47 @@
+package com.ktg.system.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.ktg.common.annotation.Excel;
+import com.ktg.common.core.domain.model.BaseBean;
+
+/**
+ * 用户特征(指纹、面部)对象 sys_user_characteristic
+ *
+ * @author cgj
+ * @date 2025-03-10
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class SysUserCharacteristic extends BaseBean
+{
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "记录ID")
+    @TableId(type = IdType.AUTO)
+    private Long recordId;
+
+    @ApiModelProperty(value = "用户id")
+    @Excel(name = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "类型(0-指纹图片 1-指纹特征值 2-面部图片 3-面部特征值 4-面部视频)")
+    @Excel(name = "类型(0-指纹图片 1-指纹特征值 2-面部图片 3-面部特征值 4-面部视频)")
+    private String type;
+
+    @ApiModelProperty(value = "内容")
+    @Excel(name = "内容")
+    private String content;
+
+    @ApiModelProperty(value = "排序")
+    @Excel(name = "排序")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
+    private String delFlag;
+
+
+}

+ 16 - 0
ktg-system/src/main/java/com/ktg/system/mapper/SysUserCharacteristicMapper.java

@@ -0,0 +1,16 @@
+package com.ktg.system.mapper;
+
+import com.ktg.common.mapper.BaseMapperX;
+import com.ktg.system.domain.SysUserCharacteristic;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户特征(指纹、面部)Mapper接口
+ *
+ * @author cgj
+ * @date 2025-03-10
+ */
+@Mapper
+public interface SysUserCharacteristicMapper extends BaseMapperX<SysUserCharacteristic> {
+
+}

+ 18 - 0
ktg-system/src/main/java/com/ktg/system/service/ISysUserCharacteristicService.java

@@ -0,0 +1,18 @@
+package com.ktg.system.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ktg.system.domain.SysUserCharacteristic;
+
+/**
+ * 用户特征(指纹、面部)Service接口
+ *
+ * @author cgj
+ * @date 2025-03-10
+ */
+public interface ISysUserCharacteristicService extends IService<SysUserCharacteristic> {
+
+    Page<SysUserCharacteristic> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic);
+
+}

+ 31 - 0
ktg-system/src/main/java/com/ktg/system/service/impl/SysUserCharacteristicServiceImpl.java

@@ -0,0 +1,31 @@
+package com.ktg.system.service.impl;
+
+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.system.domain.SysUserCharacteristic;
+import com.ktg.system.mapper.SysUserCharacteristicMapper;
+import com.ktg.system.service.ISysUserCharacteristicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户特征(指纹、面部)Service业务层处理
+ *
+ * @author cgj
+ * @date 2025-03-10
+ */
+@Service
+public class SysUserCharacteristicServiceImpl extends ServiceImpl<SysUserCharacteristicMapper, SysUserCharacteristic> implements ISysUserCharacteristicService {
+
+    @Autowired
+    private SysUserCharacteristicMapper sysUserCharacteristicMapper;
+
+    @Override
+    public Page<SysUserCharacteristic> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic) {
+        Page<SysUserCharacteristic> result = page(page, Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .orderByDesc(SysUserCharacteristic::getRecordId));
+        return result;
+    }
+
+}

+ 7 - 0
ktg-system/src/main/resources/mapper/system/SysUserCharacteristicMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ktg.system.mapper.SysUserCharacteristicMapper">
+
+</mapper>