黑马同城拼车系统项目代码和总结合集!用户登录+百度AI

同城拼车项目

1.搭建环境

1.1面试

技术框架:Mysql,Javaweb,SpringCloud,Mongodb,MiniO,RabiitMq,

MiniO:人工智能数据基础设施的对象存储,http://192.168.64.100:9006。项目中用于存储图片

Openresty:直接提供静态页面的访问,同时将页面上动态数据有关的请求转发给微服务gateway,做到动静分离。

1.2实操

(1)打开虚拟机,虚拟机账号密码root,root,每次做完要关闭虚拟机,否则时间不一样,ip:192.168.64.100,

Bug:不要改动拼车项目的文件地址,里面包含虚拟机,会导致找不到虚拟机

(2)打开虚拟机图形化工具

(3)进入openresty的安装目录的cmd界面,输入nginx启动

(4)连接MySQL(root,root)和MongoDB数据库。MQ:guest,guest。

2.修改密码

用户密码修改代码

用户密码修改:

public ResponseVO<AccountVO> modifyPassword(AccountVO accountVO) {
        //获取当前登录用户的id
        String userid = accountVO.getCurrentUserId();
        //TODO:任务1-修改密码-1day
        //获取当前用户在数据库里的信息,得到真正的密码
        AccountPO accountPO = accountAPIService.getAccountByID(userid);
        String password = accountPO.getPassword();
        //旧密码加密,对比数据库,防止输入错误,通过前端传来的vo得到密码,再调用md5加密
        String oldPassword = CommonsUtils.encodeMD5(accountVO.getPassword());
        if (password.equals(oldPassword)) {
            return ResponseVO.error("密码输入错误");
        }
        //新密码加密,对比旧密码,不允许相同
        String newPassword = CommonsUtils.encodeMD5(accountVO.getNewPassword());
        if (oldPassword.equals(newPassword)) {
            return ResponseVO.error("新密码不允许与旧密码相同!");
        }
        //校验通过,将新密码写入数据库,修改成功
        accountVO.setPassword(newPassword);
        accountPO.setPassword(newPassword);
        accountAPIService.update(accountPO);
        return ResponseVO.success(null, "修改密码成功");
    }

用md5加密算法加密存入数据库

3.百度AI接入

3.1笔记

AI选型可以看是否有官方文档,详细的文档便于开发,我们在做项目时也要多写文档,此外还要有代码。

3.2代码和java类

3.2.1创建百度AI账号,创建应用,获取API Key和Secret Key

3.2.2获取车牌识别和行驶证识别的API接口文档,保存请求方式和请求路径

3.2.3编写代码

(1)总体流程:从minio得到照片的url,下载到本地,调用API返回车牌号结果对比
public String getLicense(VehiclePO vehiclePO) throws IOException {
        //TODO:任务2.1-车辆信息验证代码编写-2day
        //1.获取车辆照片url和行驶证url
        String carUrl = vehiclePO.getCarFrontPhoto();
        String licenseUrl=vehiclePO.getCarBackPhoto();
        //2.下载车辆照片,返回文件名字
        String carFileName = downloadFileFromUrl(carUrl,"D:\\IdeaProjects\\1");
        //3.下载行驶证照片
        String lisenseUrlName=downloadFileFromUrl(licenseUrl,"D:\\IdeaProjects\\2");
        //4.调用百度AI接口,result的是API请求返回的结果
        String reslut1=licensePlate(carFileName);
        //5.调用百度接口,返回驾驶证照片
        String reslut2=vehicleLicense(lisenseUrlName);
        //6.对比:行驶证车牌 和 车辆车牌是否一致
        String plateForCar = getPlateForCar(reslut1);//车牌
        String plateForLicense=getPlateForLicense(reslut2);//行驶证车牌
        if (plateForLicense.equals(plateForCar)) {
            return reslut1;
        }
        return "00000";
}
(2)类downloadFileFromUrl方法从minio下载的url车辆照片到本地路径folderPath
private String downloadFileFromUrl(String url, String folderPath) throws IOException {
        //检查URL是否为空
        if (url==null || url.isEmpty()){
            throw new IllegalArgumentException("URL can not be null or empty");
        }
        //根据文件路径创建一个文件对象
        File folder = new File(folderPath);
        // 检查文件夹是否存在,如果不存在则创建
        if (!folder.exists()){
            //创建文件夹
            folder.mkdirs();
        }
        //生成文件名,SimpleDateFormat 是 Java 中用于格式化和解析日期的类。它允许将 Date 对象转换为特定格式的字符串,或者将符合特定格式的字符串解析为 Date 对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        //new Date()生成现在的时间,SimpleDateFormat可以格式化Date对象
        String timestamp = sdf.format(new Date());
        String fileName = "temp_" + timestamp + ".jpg";
        //通过文件目录+文件名在folder目录下创建文件
        File tempFile=new File(folder,fileName);
        //下载文件到本地
        FileUtils.copyURLToFile(new URL(url),tempFile);
        //对文件进行Base64编码
        //Base64.getEncoder():获取一个 Base64.Encoder 实例,用于执行 Base64 编码操作。
        //将字节流文件通过encodeToString编码为Base64文件
        Base64.getEncoder().encodeToString(Files.readAllBytes(tempFile.toPath()));
        return fileName;
}

File和FileUtils.copyURLToFile:

File 类用于表示文件和目录,但它本身并不会在磁盘上创建实际的文件或目录。

FileUtils.copyURLToFile(new URL(url),tempFile);

new URL(url):创建一个 URL 对象,表示要下载的文件的网络地址。

tempFile:这是一个 File 对象,表示本地磁盘上的目标文件。如果该文件不存在,FileUtils.copyURLToFile 方法会自动创建它。

FileUtils.copyURLToFile(URL source, File destination):这是 Apache Commons IO 库中的一个方法,用于将指定 URL 的内容复制到本地文件。

该方法会自动处理输入流和输出流的关闭,简化了文件下载的操作。

(3)调用百度API接口,返回车辆车牌号,行驶证也同理,

Param:name参数为文件名字

return:百度API调用的结果

private String licensePlate(String name) {
        //向百度API的请求路径发送请求
        String url="https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";
        try {
            //本地文件路径
            String filePath="D:\\IdeaProjects\\1\\"+name;
            // 读取图片文件的字节数据
            // Paths.get(filePath) 将文件路径字符串转换成 Path 对象,Files.readAllBytes() 方法读取整个文件的字节流
            // 返回一个 byte[] 数组,表示文件的内容
            //从本地得到了图片的byte[]数据
            byte[] imgData= Files.readAllBytes(Paths.get(filePath));
            // 将字节数据编码为base64字符串
            // Base64Util.encode(imgData) 将读取的文件字节数组 imgData 编码为 Base64 字符串
            // Base64 编码通常用于传输二进制数据,比如图片文件,因为 Base64 可以把二进制数据转成可打印的 ASCII 字符串
            //从字节流数组得到了图片的Base64编码
            String imgStr= Base64Util.encode(imgData);
            //在发送 HTTP 请求时,特别是在 URL 参数中,任何特殊字符都可能引发问题。
            // 因此,需要使用 URLEncoder.encode() 对参数进行编码,使其变成 URL 安全的格式。
            // imgStr 是你 Base64 编码后的图片数据,经过 URL 编码后,它就可以安全地作为请求的一部分传输给服务器了。
            String imgParam=URLEncoder.encode(imgStr,"UTF-8");
            String param="image="+imgParam;
            String accessToken="24.c4a6796184efef88d51c244caf012f7b.2592000.1742720278.282335-117658992";
            //这里需要引入依赖
            String result= HttpUtil.post(url+"?access_token="+accessToken,param);
            return result;
        }catch (Exception e){
            System.out.println("百度地图AI识别异常"+e.getMessage());
            e.printStackTrace();
        }
        return null;
}
(4)通过API接口的返回的JSON字符串得到车牌号(行驶证同理)

Param:API返回的json字符串

Return:车牌号字符串

//根据车辆照片获取车牌号
    private String getPlateForCar(String json) {
        //将传入的json字符串解析为JSONObject对象
        JSONObject jsonObject = JSON.parseObject(json);
        //从 jsonObject 中获取键名为 "words_result" 的值,该值是一个嵌套的 JSON 对象。
        //getJSONObject 方法用于获取嵌套的 JSON 对象
        //getJSONObject 方法用于获取字符串类型的值
        System.out.println(jsonObject.getJSONObject("words_result"));
        System.out.println(jsonObject.getString("number"));
        return jsonObject.getJSONObject("words_result").
                getString("number");
}

3.2.4bug通过google的前端控制台F1查看请求是否发送

3.3总结与面试准备

通过调用百度AI的文字识别接口,实现智能识别车辆照片和行驶证照片的车牌号,完成车主验证的功能。

我们使用MiniO来存储图片,把MiniO上面的图片下载到本地,把文件进行base64编码,最后再调用百度AI的接口返回JSON字符串,解析JSON字符串得到车牌号。

Base64 编码通常用于传输二进制数据,比如图片文件,因为 Base64 可以把二进制数据转成可打印的 ASCII 字符串

minio的URL是虚拟机里的,不是公网,直接给它它访问不通,所以要从虚拟机的minio下载到本地。

会持续更新哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值