综合设计——多源异构数据采集与融合应用综合实践
综合设计——多源异构数据采集与融合应用综合实践
这个项目属于哪个课程 | 综合设计——多源异构数据采集与融合应用综合实践 |
---|---|
组名 | 数据"融合炖" 异构 "大杂绘"队 |
项目简介 | 项目名称:味谱魔方 项目介绍:智能购物菜谱助手是一款结合AI技术的智能化应用,旨在为用户提供从食材购买到菜肴烹饪的一站式服务。通过该平台,用户不仅可以完成食材的在线选购,还能根据选购的食材生成个性化菜谱。 |
项目logo | ![]() |
团队成员学号 | 102202156 王贺雯 102202156 高涛 102202157 王党兵 102202119 吴佳辉 032004126 曾祥宝 |
项目目标 | “味谱” 突出了软件专注于各种味道的食谱集合,就像魔方一样,通过不同食材搭配组合,变幻出多样美味,吸引用户探索丰富的烹饪可能性。能够实现用户将食品加入购物车,生成对应的食谱核心功能,为解决做饭烦恼和解决剩菜难题。 |
gitee链接 | https://gitee.com/jyppx000/data-collection-and-fusion |
其他参考文献 | https://www.spkx.net.cn/CN/abstract/abstract58653.shtml |
系统总体技术概述
1.系统架构概述
系统分为后端管理系统、安卓、模型训练及其搭建、爬取数据、调用模型算法接口,部署等多层。
后端管理系统:管理员对安卓端的商家、客户进行管理。
安卓:
- 用户可以在安卓手机端浏览生鲜品类
- 商家可以在安卓手机端发布商品
模型训练及搭建
- 使用开源模型——ChatGLM-6B
爬取数据:核心涉及到js逆向
2 各模块技术实现
2.1 一键生成菜谱功能
目标:根据用户购物车中的食材信息,通过自己部署的 ChatGLM-6B 模型生成个性化的菜谱并展示给用户。
技术方案:
- 前端技术(安卓):
- 编程语言:使用 Java 进行安卓应用开发。
- UI 设计:采用 XML 布局来设计用户界面。
- 弹框显示:使用 AlertDialog 弹框来展示生成菜谱的过程,以增强用户体验。
- 接口请求:前端通过 RESTful API 向后端发送请求,传递购物车中的食材数据,并等待生成的菜谱内容。
- 后端技术:
- 编程语言:后端使用Java和 Spring Boot 构建 RESTful API。
- 与 ChatGLM-6B 模型集成
- API 接口:后端通过 HTTP 请求将食材数据传递给部署的 ChatGLM-6B 模型,模型返回生成的菜谱内容。
- MySQL 数据存储:使用 MySQL 数据库存储用户数据,以及菜品,名称,价格等。
流程:
- 用户选择食材:用户在安卓应用中选择食材并添加到购物车。
- 生成推荐食谱:前端通过 RESTful API 向后端发送请求,传递购物车中的食材数据。
- 后端请求 ChatGLM-6B 模型:后端接收食材数据后,将其通过 HTTP 请求传递给部署的 ChatGLM-6B 模型接口。使用 HttpURLConnection 发起 HTTP 请求。
- ChatGLM-6B 模型生成菜谱:模型根据传入的食材数据,生成详细的食谱内容(包括菜名、食材等)。
- 返回生成的食谱:后端收到模型返回的菜谱数据后,将其以 JSON 格式 返回给前端。
- 展示菜谱:前端接收到菜谱数据后,展示生成的菜谱内容,弹窗显示展示详细信息。
2.2 ChatGLM-6B 模型集成
目标:生成个性化的菜谱。
技术方案:
- 后端与模型通信
- ChatGLM-6B 模型暴露 API 接口供后端调用。
- 使用 JSON 格式在前后端和模型之间传递数据,保证数据结构一致性。
- 模型训练与调优
- 使用爬取的食谱数据,对 ChatGLM-6B 进行了微调训练
- 集成方式
- 后端调用 API:后端通过 Java 代码发送 HTTP 请求,将用户购物车数据传给模型。
- 模型生成菜谱:模型处理请求并生成菜谱后,返回包含菜谱内容的 JSON 数据,后端将该数据转发给前端展示。
流程:
- 生成请求:后端将用户的购物车数据转换为模型所需的输入格式(如食材名称、数量、价格等)。
- 调用模型接口:后端发起 HTTP 请求,传递数据到 ChatGLM-6B 模型接口,模型根据输入生成菜谱。
- 返回生成结果:模型返回的菜谱信息包含菜名、食材、步骤等内容,后端将这些数据包装为 JSON 格式 并传递给前端。
- 前端展示菜谱:前端接收到菜谱数据后,展示在界面中。
2.3 异步处理与生成过程
目标:保证菜谱生成过程不阻塞主线程,提升用户体验。
技术方案:
- 前端异步请求
- 使用 Coroutines处理后台请求,确保 UI 线程不被阻塞。
- 使用 OkHttp 发起网络请求,结合协程来处理请求,避免 UI 界面卡顿。
- 后端异步处理
- 后端通过 Spring Boot 提供的 @Async 注解实现异步调用,避免请求阻塞。
流程:
- 异步请求:前端触发请求后,后台执行异步任务生成菜谱。
- 后台生成:后端异步调用 ChatGLM-6B 模型进行菜谱生成。
- 结果返回:生成完毕后,后端将菜谱数据通过回调或轮询返回前端,前端更新界面。
3.个人分工及体现
我主要负责后台管理系统,主要功能是对用户进行管理、订单管理功能
1.用户管理
管理员可以通过后端管理系统对安卓端的商家和客户进行管理。
这包括用户的注册信息维护、权限设置、用户状态更新等操作。
2. 订单管理
订单管理模块使管理员能够监控和处理所有与购买相关的活动。
它提供了订单详情查看、订单状态跟踪(如待支付、已支付、已完成)此外,还支持通过系统接口与安卓客户端交互,实现订单数据的实时同步。
3. 安卓访问接口(组长帮助完成)
为了方便安卓应用与后端服务器之间的通信,
提供了一套RESTful API接口。该接口允许安卓应用程序执行各种任务,比如查询商品列表、提交购物车中的商品以生成推荐食谱、接收个性化菜谱建议等。同时,也实现了异步处理机制来保证用户体验不被长时间的操作所阻塞,比如在生成推荐食谱时不会影响到用户的其他操作。
部分代码展示(详细请看码云仓库)
"""这段代码实现了通过HTTP请求来创建、查询和删除订单的功能,包括处理订单信息的接收、文件上传、数据库操作以及向客户端响应JSON格式的操作结果。"""
创建订单为例
private void addOrderMessage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从请求中获取订单相关信息
String orderName = request.getParameter("orderName");
String orderPhone = request.getParameter("orderPhone");
String orderTime = request.getParameter("orderTime");
String orderMessage = request.getParameter("orderMessage");
String orderLongitude = request.getParameter("orderLongitude");
String orderLatitude = request.getParameter("orderLatitude");
String orderAddress = request.getParameter("orderAddress");
String orderImage = request.getParameter("orderImage");
String orderUserId = request.getParameter("orderUserId");
String orderUserName = request.getParameter("orderUserName");
String imagePath = null;
if (orderUserName == null) {
try {
List<FileItem> items = this.upload.parseRequest(request);
if (items != null && !items.isEmpty()) {
for (FileItem fileItem : items) {
String filename = fileItem.getName();
System.out.println("文件保存路径为:" + Consts.imgPath + "/" + filename);
File real_path = new File(Consts.imgPath + "/" + filename);
InputStream inputStream = fileItem.getInputStream();
BufferedInputStream fis = new BufferedInputStream(inputStream);
FileOutputStream fos = new FileOutputStream(real_path);
int f;
while ((f = fis.read()) != -1) {
fos.write(f);
}
fos.flush();
fos.close();
fis.close();
inputStream.close();
System.out.println("文件:" + filename + "上传成功!");
imagePath = filename;
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
} else {
List<Object> params = new ArrayList<Object>();
params.add(orderName + "");
params.add(orderPhone + "");
params.add(orderTime + "");
params.add(orderMessage + "");
params.add(orderLongitude);
params.add(orderLatitude);
params.add(orderAddress);
params.add(orderImage);
params.add(orderUserId);
params.add(orderUserName);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
params.add(df.format(new Date()));
boolean flag = orderDao.addOrderMessage(params); //
System.out.println(flag + "");
if (flag) {
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "订单创建成功");
jsonmsg.put("repCode", "666");
response.getWriter().print(jsonmsg); //
} else {
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "上传文件失败");
jsonmsg.put("repCode", "111");
response.getWriter().print(jsonmsg); // }
}
}
订单查询相关
private void getOrderMessages(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Map<String, Object>> list = orderDao.getOrderMessages();
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "请求成功");
jsonmsg.put("repCode", "666");
jsonmsg.put("data", list);
System.out.println(jsonmsg);
response.getWriter().print(jsonmsg);
}
订单删除或更新相关
private void deleteOrderMessage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String orderId = request.getParameter("orderId");
boolean flag = orderDao.deleteOrderMessage(orderId);
if (flag) {
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "订单删除成功");
jsonmsg.put("repCode", "666");
response.getWriter().print(jsonmsg);
} else {
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "订单删除失败");
jsonmsg.put("repCode", "111");
response.getWriter().print(jsonmsg);
}
}
成效:
心得体会:
在参与此次智能食谱推荐系统的开发过程中,我对开发又有了新的理解,还积累了宝贵的项目实践经验。特别是在订单管理模块的实现上,从最初的需求分析到最后的完成,我学习到了如何有效地处理HTTP请求、解析用户数据、进行文件上传操作以及与数据库交互来完成订单的创建、查询和删除等功能。遇到问题时,组长总是耐心指导,无论是代码逻辑的优化还是疑难杂症的排查,都给予了我极大的帮助和支持,让我能够快速成长并顺利完成任务。感谢组长在这次项目中提供的指导。在做实践时,也是参考教学视频和CSDN的文章,想要独立完成,还有很多路要走,但我会继续学习的。