同城拼车项目
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下载到本地。
会持续更新哦~