> 技术文档 > 黑马同城拼车系统项目代码和总结合集!用户登录+百度AI_黑马顺风车项目

黑马同城拼车系统项目代码和总结合集!用户登录+百度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 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下载到本地。

会持续更新哦~