乐(智)尚代驾~~--------Day5----司机认证篇~

news2024/12/23 15:47:54

前言:

Hello亲爱的uu们,在读过了一个愉快的周末后(摸鱼了一会),我又回来更新啦,感谢uu们的阅读,话不多说~

司机认证

当司机点击开始接单的时候,会先判断该司机有没有通过认证,如果没有认证,会先跳转到认证界面进行认证。
司机认证模块需要集成腾讯云存储COS、腾讯云OCR证件识别及腾讯云人脸模型库创建。

开通腾讯云对象存储COS

进入官网直接搜索对象存储,进入之后点击立即使用,如果第一次使用的话需要认证

 

认证完成之后开通COS服务 

开通之后界面 点击创建存储桶,创建完成之后可以在存储桶列表查看创建的桶。


如果要使用java代码进行操作,需要获取腾讯云账号的id和key,点击右上角的账户 ->访问管理 

在API秘钥管理的创建秘钥,记得保存好SecretId和SecretKey(很重要,后续代码编写都用到他)

远程调用编写,web-driver下的CosController

	@Autowired
    private CosService cosService;

    // 文件上传接口
    @Operation(summary = "上传")
    @GuiGuLogin
    @PostMapping("/upload")
    public Result<CosUploadVo> upload(@RequestPart("file")MultipartFile file,
                                      @RequestParam(name = "path", defaultValue = "auth") String path){
        CosUploadVo cosUploadVo = cosService.uploadFile(file, path);
        return Result.ok(cosUploadVo);
    }

CosServiceImpl

	@Autowired
    private CosFeignClient cosFeignClient;

    // 文件上传接口
    @Override
    public CosUploadVo uploadFile(MultipartFile file, String path) {
        // 远程调用
        Result<CosUploadVo> cosUploadVoResult = cosFeignClient.upload(file, path);
        CosUploadVo cosUploadVo = cosUploadVoResult.getData();
        return cosUploadVo;
    }

CosFeignClient,MediaType.MULTIPART_FORM_DATA_VALUE表示传的类型是文件

	//文件上传
    @PostMapping(value = "/cos/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result<CosUploadVo> upload(@RequestPart("file") MultipartFile file, @RequestParam("path") String path);

在service-driver里引入依赖

<dependency>
     <groupId>com.qcloud</groupId>
     <artifactId>cos_api</artifactId>
</dependency>

把腾讯云需要的值放到相关配置文件中,在common-account.yaml中进行修改,修改其中的值

在service-driver的config包下创建类读取相关信息配置

@Data
@Component
@ConfigurationProperties(prefix = "tencent.cloud")
public class TencentCloudProperties {

    private String secretId;
    private String secretKey;
    private String region;
    private String bucketPrivate;
}

CosServiceImpl

	@Autowired
    private TencentCloudProperties tencentCloudProperties;

    // 文件上传
    @Override
    public CosUploadVo upload(MultipartFile file, String path) {
        // 1.初始化用户身份信息(secretId, secretKey)
        String secretId = tencentCloudProperties.getSecretId();
        String secretKey = tencentCloudProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // 2.设置bucket的地域,COS地域
        Region region = new Region(tencentCloudProperties.getRegion());
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用https协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3.生成cos客户端
        COSClient cosClient = new COSClient(cred, clientConfig);

        // 文件上传
        // 元数据信息
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentLength(file.getSize());
        meta.setContentEncoding("UTF-8");
        meta.setContentType(file.getContentType());

        // 向存储桶中保存文件
        String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); //文件后缀名
        String uploadPath = "/driver/" + path + "/" + UUID.randomUUID().toString().replaceAll("-", "") + fileType;
        // 01.jpg
        // /driver/auth/0o98754.jpg
        PutObjectRequest putObjectRequest = null;
        try {
            //1 bucket名称
            //2
            putObjectRequest = new PutObjectRequest(tencentCloudProperties.getBucketPrivate(),
                    uploadPath,
                    file.getInputStream(),
                    meta);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        putObjectRequest.setStorageClass(StorageClass.Standard);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); //上传文件
        cosClient.shutdown();

        //返回vo对象
        CosUploadVo cosUploadVo = new CosUploadVo();
        cosUploadVo.setUrl(uploadPath);
        //TODO 图片临时访问url,回显使用
        cosUploadVo.setShowUrl("");
        return cosUploadVo;
    }

启动相关服务进行测试

在地址栏输入路径http://localhost:8602/doc.html#/home打开接口文档进行测试
注意:这里需要把CosController接口的@GuiguLogin注解注释了,不然会提示未登录

上传接口完善,回显图片,可以参考官方文档->生成预签名URL
对CosServiceImpl的upload方法中的代码进行封装

	public COSClient getCosClient(){
        // 1.初始化用户身份信息(secretId, secretKey)
        String secretId = tencentCloudProperties.getSecretId();
        String secretKey = tencentCloudProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // 2.设置bucket的地域,COS地域
        Region region = new Region(tencentCloudProperties.getRegion());
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用https协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3.生成cos客户端
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

CosServiceImpl

//获取临时签名URL
    @Override
    public String getImageUrl(String path) {
        if(!StringUtils.hasText(path)) return "";
        //获取cosclient对象
        COSClient cosClient = this.getCosClient();
        //GeneratePresignedUrlRequest
        GeneratePresignedUrlRequest request =
                new GeneratePresignedUrlRequest(tencentCloudProperties.getBucketPrivate(),
                        path, HttpMethodName.GET);
        //设置临时URL有效期为15分钟
        Date date = new DateTime().plusMinutes(15).toDate();
        request.setExpiration(date);
        //调用方法获取
        URL url = cosClient.generatePresignedUrl(request);
        cosClient.shutdown();
        return url.toString();
    }

将upload的中TODO进行完善

腾讯云身份证认证接口

司机注册成功之后,应该引导他去做实名认证,这就需要用到腾讯云身份证识别和云存储功能了

在service-driver引入ocr依赖

<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java</artifactId>
    <version>${tencentcloud.version}</version>
</dependency>

OcrController

	@Autowired
    private OcrService ocrService;

    @Operation(summary = "身份证识别")
    @PostMapping("/idCardOcr")
    public Result<IdCardOcrVo> idCardOcr(@RequestPart("file") MultipartFile file) {
        IdCardOcrVo idCardOcrVo = ocrService.idCardOcr(file);
        return Result.ok(idCardOcrVo);
    }

OcrServiceImpl

	@Autowired
    private TencentCloudProperties tencentCloudProperties;

    @Autowired
    private CosService cosService;
    //身份证识别
    @Override
    public IdCardOcrVo idCardOcr(MultipartFile file) {
        try{
            //图片转换base64格式字符串
            byte[] base64 = Base64.encodeBase64(file.getBytes());
            String fileBase64 = new String(base64);

            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            Credential cred = new Credential(tencentCloudProperties.getSecretId(),
                    tencentCloudProperties.getSecretKey());
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred,tencentCloudProperties.getRegion(), clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            IDCardOCRRequest req = new IDCardOCRRequest();
            //设置文件
            req.setImageBase64(fileBase64);

            // 返回的resp是一个IDCardOCRResponse的实例,与请求对象对应
            IDCardOCRResponse resp = client.IDCardOCR(req);

            //转换为IdCardOcrVo对象
            IdCardOcrVo idCardOcrVo = new IdCardOcrVo();
            if (StringUtils.hasText(resp.getName())) {
                //身份证正面
                idCardOcrVo.setName(resp.getName());
                idCardOcrVo.setGender("男".equals(resp.getSex()) ? "1" : "2");
                idCardOcrVo.setBirthday(DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime(resp.getBirth()).toDate());
                idCardOcrVo.setIdcardNo(resp.getIdNum());
                idCardOcrVo.setIdcardAddress(resp.getAddress());

                //上传身份证正面图片到腾讯云cos
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardFrontUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardFrontShowUrl(cosUploadVo.getShowUrl());
            } else {
                //身份证反面
                //证件有效期:"2010.07.21-2020.07.21"
                String idcardExpireString = resp.getValidDate().split("-")[1];
                idCardOcrVo.setIdcardExpire(DateTimeFormat.forPattern("yyyy.MM.dd").parseDateTime(idcardExpireString).toDate());
                //上传身份证反面图片到腾讯云cos
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardBackUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardBackShowUrl(cosUploadVo.getShowUrl());
            }
            return idCardOcrVo;
        } catch (Exception e) {
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }

service-client定义接口
OcrFeignClient

	/**
     * 身份证识别
     * @param file
     * @return
     */
    @PostMapping(value = "/ocr/idCardOcr", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result<IdCardOcrVo> idCardOcr(@RequestPart("file") MultipartFile file);

在web-driver中
OcrController

	@Autowired
    private OcrService ocrService;
    
    @Operation(summary = "身份证识别")
    @GuiguLogin
    @PostMapping("/idCardOcr")
    public Result<IdCardOcrVo> uploadDriverLicenseOcr(@RequestPart("file") MultipartFile file) {
        return Result.ok(ocrService.idCardOcr(file));
    }

OcrServiceImpl

	@Autowired
    private OcrFeignClient ocrFeignClient;

    //身份证识别
    @Override
    public IdCardOcrVo idCardOcr(MultipartFile file) {
        Result<IdCardOcrVo> ocrVoResult = ocrFeignClient.idCardOcr(file);
        IdCardOcrVo idCardOcrVo = ocrVoResult.getData();
        return idCardOcrVo;
    }

腾讯云驾驶证识别接口

在service-driver中
OcrController

	@Operation(summary = "驾驶证识别")
    @PostMapping("/driverLicenseOcr")
    public Result<DriverLicenseOcrVo> driverLicenseOcr(@RequestPart("file") MultipartFile file) {
        return Result.ok(ocrService.driverLicenseOcr(file));
    }

OcrServiceImpl

	// 驾驶证识别
    @Override
    public DriverLicenseOcrVo driverLicenseOcr(MultipartFile file) {
        try{
            //图片转换base64格式字符串
            byte[] base64 = Base64.encodeBase64(file.getBytes());
            String fileBase64 = new String(base64);
            
            // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
            Credential cred = new Credential(tencentCloudProperties.getSecretId(),
                    tencentCloudProperties.getSecretKey());
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("ocr.tencentcloudapi.com");
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, tencentCloudProperties.getRegion(),
                                                clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DriverLicenseOCRRequest req = new DriverLicenseOCRRequest();
            req.setImageBase64(fileBase64);
            
            // 返回的resp是一个DriverLicenseOCRResponse的实例,与请求对象对应
            DriverLicenseOCRResponse resp = client.DriverLicenseOCR(req);

            //封装到vo对象里面
            DriverLicenseOcrVo driverLicenseOcrVo = new DriverLicenseOcrVo();
            if (StringUtils.hasText(resp.getName())) {
                //驾驶证正面
                //驾驶证名称要与身份证名称一致
                driverLicenseOcrVo.setName(resp.getName());
                driverLicenseOcrVo.setDriverLicenseClazz(resp.getClass_());
                driverLicenseOcrVo.setDriverLicenseNo(resp.getCardCode());
                driverLicenseOcrVo.setDriverLicenseIssueDate(DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime(resp.getDateOfFirstIssue()).toDate());
                driverLicenseOcrVo.setDriverLicenseExpire(DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime(resp.getEndDate()).toDate());

                //上传驾驶证反面图片到腾讯云cos
                CosUploadVo cosUploadVo = cosService.upload(file, "driverLicense");
                driverLicenseOcrVo.setDriverLicenseFrontUrl(cosUploadVo.getUrl());
                driverLicenseOcrVo.setDriverLicenseFrontShowUrl(cosUploadVo.getShowUrl());
            } else {
                //驾驶证反面
                //上传驾驶证反面图片到腾讯云cos
                CosUploadVo cosUploadVo =  cosService.upload(file, "driverLicense");
                driverLicenseOcrVo.setDriverLicenseBackUrl(cosUploadVo.getUrl());
                driverLicenseOcrVo.setDriverLicenseBackShowUrl(cosUploadVo.getShowUrl());
            }

            return driverLicenseOcrVo;
        } catch (Exception e) {
            e.printStackTrace();
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }

service-client中
OcrFeignClient

	/**
     * 驾驶证识别
     * @param file
     * @return
     */
    @PostMapping(value = "/ocr/driverLicenseOcr", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result<DriverLicenseOcrVo> driverLicenseOcr(@RequestPart("file") MultipartFile file);

web-driver中
OcrController

	@Operation(summary = "驾驶证识别")
    @GuiGuLogin
    @PostMapping("/driverLicenseOcr")
    public Result<DriverLicenseOcrVo> driverLicenseOcr(@RequestPart("file") MultipartFile file) {
        return Result.ok(ocrService.driverLicenseOcr(file));
    }

OcrServiceImpl

	//驾驶证识别
    @Override
    public DriverLicenseOcrVo driverLicenseOcr(MultipartFile file) {
        Result<DriverLicenseOcrVo> driverLicenseOcrVoResult = ocrFeignClient.driverLicenseOcr(file);
        DriverLicenseOcrVo driverLicenseOcrVo = driverLicenseOcrVoResult.getData();
        return driverLicenseOcrVo;
    }

启动相关服务进行测试接口,点击开始接单会进入认证界面,这段我就不认证了,没有示例图片。

先到这里哈~接下来的下篇继续,有点多了看着审美疲劳,谢谢你的观赏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨平台数据库工具DataGrip v2024.2全新发布——增加智能刷新功能

DataGrip 是一个跨平台的数据库工具可在Windows&#xff0c;OS X 和 Linux上使用。同时支持多种数据库&#xff0c;包含了SQL Server&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;MySQL&#xff0c;DB2&#xff0c;Sybase&#xff0c;SQLite&#xff0c;Derby&#xf…

DQL学习

一、基础查询 1.查询多个字段 select 字段列表 from 表名; select * from 表名;-- 查询所有数据 但不建议使用&#xff01;&#xff01;&#xff01;&#xff01; 2.去除重复记录 select DISTINCT 字段列表 from 表名; 3.起别名 as&#xff1b;as也可以省略但中间要加空…

导入时,文档模板不被下载

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 这是个SSM项目&#xff0c;以前经常遇到这个问题&#xff0c;今天有幸记录下来 [ERROR][o.a.s.r.StreamResult] Can not find a java.io.InputStream with the name [downLoadFile] in the invocation stack…

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务&#xff1a; 分类&#xff08;Classification&#xff09;&#xff1a;解决“是什么&…

【Linux 报错】“userdel: user xxxx is currently used by process xxx”

问题产生的原因&#xff1a; 多个用户后嵌套登陆导致删除某用户时&#xff0c;这个用户还没退出导致无法删除的问题。 例如&#xff1a;你在普通用户 A 的账户下&#xff0c;切换超级用户 root 执行删除普通用户 A 的账户&#xff0c;此时普通用户 A还在当前进程中运行&#…

管理员工绩效的 7 个最佳策略

管理员工绩效的 7 个最佳策略 您可以为您的公司做很多事情——伟大的想法、创新的产品和尖端技术。但归根结底&#xff0c;如果你想让你的组织取得成功&#xff0c;你需要一个高绩效的文化&#xff0c;拥有高绩效的员工。 赋予员工高水平绩效的最佳方式之一是通过员工绩效管理…

计算机的错误计算(一百零二)

摘要 探讨 的计算精度问题。 从计算机的错误计算&#xff08;九十九&#xff09;可知&#xff0c; 在IEEE 754-2019的列表中。因此&#xff0c;有必要分析其计算准确度。 例1. 已知 计算 若利用 Python的SciPy库中函数计算&#xff0c;则有&#xff1a; 若用Java的pow函…

Java设计模式全面解析

23大设计模式&#xff08;即软件设计中的24种常用设计模式&#xff09;源自《设计模式&#xff1a;可复用面向对象软件的基础》一书&#xff0c;由四位作者&#xff08;Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides&#xff09;提出&#xff0c;通常也被称为“Go…

Java — LeetCode 面试经典150题(一)

双指针 125.验证回文串 题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回…

代码随想录算法day39 | 动态规划算法part12 | 115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离

115.不同的子序列 相对于 392.判断子序列&#xff0c;本题有难度了&#xff0c;感受一下本题和 392.判断子序列 的区别。 力扣题目链接(opens new window) 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff…

企业如何选择合适的可观测产品

数字化进程的推进&#xff0c;使得不同企业对于数字化可观测产品提出了各种差异化的需求。本文先是具体分析了不同类型的企业对于可观测产品的直接需求和痛点&#xff0c;描述了可观测产品的所能提供的更丰富的实际应用场景。紧接着从开源产品&#xff0c;国外商业产品&#xf…

E33.【C语言】数据在内存中的存储练习集(未完)

1. 求下列代码的打印结果 #include <stdio.h> int main() {char a -1;signed char b -1;unsigned char c -1;printf("a%d,b%d,c%d", a, b, c);return 0; } 答案速查 分析 之前讲过,char在VS中默认为signed char,则a和b的打印结果应该是一样的 存储范围…

专属文生图助手——SD3+ComfyUI文生图部署步骤

SD3ComfyUI文生图部署步骤 我们使用DAMODEL来实现文生图的部署。 根据提供的操作步骤与代码段落&#xff0c;本文旨在介绍如何下载并部署 Stable Diffusion 3 模型&#xff0c;并通过 ComfyUI 架构实现基于 Web 界面的图像生成应用。本文将剖析各个步骤&#xff0c;并详细解释…

无人机之编程基础原理

无人机编程基础原理涉及多个方面&#xff0c;主要包括无人机的基本原理、飞行控制算法、编程语言及算法应用等。以下是对这些方面的详细阐述&#xff1a; 一、无人机基本原理 无人机的基本原理是理解其结构、飞行原理、传感器和控制系统等的基础。无人机通常由机身、动力系统&…

Linux网络之UDP与TCP协议详解

文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…

基于51单片机的自动清洗系统(自动洗衣机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C52单片机&#xff0c;采用DS18B20温度传感器检测温度&#xff0c;通过LCD1602显示屏显示&#xff0c;并且按键 可以加减温度的上限&#xff1b; 点击清洗按键后&#xff0c;倒计时1分钟&…

61.【C语言】数据在内存中的存储

1.前置知识 整数在内存中以补码形式存储 有符号整数三种码均有符号位,数值位 正整数:原码反码补码 负整数:原码≠反码≠补码 2.解释 int arr[] {1,2,3,4,5}; VSx86Debug环境下,内存窗口输入&arr VSx64Debug环境下,内存窗口输入&arr 存放的顺序都一样,均是小端序…

探索组合模式:构建灵活的层次结构

组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户可以以一致的方式处理单个对象和组合对象。 一&#xff0c;组合模式的结构 组合模式主要包含以下几个部分&#xff1a; 组件&#xff08;Component&a…

Java练习-----时间工具类(JDK8之后)

目录 LocalDate/LocalTime/LocalDateTime类 ZoneDateTime和ZoneId Instant类 DateTimeFormatter类 &#xff1a;解析格式化时间 LocalDate/LocalTime/LocalDateTime类 package crrc.studytest1;import java.time.Duration; import java.time.LocalDateTime;public class Du…

虚拟机屏幕分辨率自适应VMWare窗口大小

文章目录 环境问题解决办法其它虚拟机和主机间复制粘贴 参考 环境 Windows 11 家庭中文版VMWare Workstation 17 ProUbuntu 24.04.1 问题 虚拟机的屏幕大小&#xff0c;是固定的。如下图&#xff0c;设置的分辨率是800*600&#xff0c;效果如下&#xff1a; 可见&#xff0c…