综合设计——多源异构数据采集与融合应用综合实践

综合设计——多源异构数据采集与融合应用综合实践

这个项目属于哪个课程 综合设计——多源异构数据采集与融合应用综合实践
组名 数据"融合炖" 异构 "大杂绘"队
项目简介 项目名称:味谱魔方
项目介绍:智能购物菜谱助手是一款结合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 数据库存储用户数据,以及菜品,名称,价格等。

流程:

  1. 用户选择食材:用户在安卓应用中选择食材并添加到购物车。
  2. 生成推荐食谱:前端通过 RESTful API 向后端发送请求,传递购物车中的食材数据。
  3. 后端请求 ChatGLM-6B 模型:后端接收食材数据后,将其通过 HTTP 请求传递给部署的 ChatGLM-6B 模型接口。使用 HttpURLConnection 发起 HTTP 请求。
  4. ChatGLM-6B 模型生成菜谱:模型根据传入的食材数据,生成详细的食谱内容(包括菜名、食材等)。
  5. 返回生成的食谱:后端收到模型返回的菜谱数据后,将其以 JSON 格式 返回给前端。
  6. 展示菜谱:前端接收到菜谱数据后,展示生成的菜谱内容,弹窗显示展示详细信息。

2.2 ChatGLM-6B 模型集成

目标:生成个性化的菜谱。

技术方案:

  • 后端与模型通信
    • ChatGLM-6B 模型暴露 API 接口供后端调用。
    • 使用 JSON 格式在前后端和模型之间传递数据,保证数据结构一致性。
  • 模型训练与调优
    • 使用爬取的食谱数据,对 ChatGLM-6B 进行了微调训练
  • 集成方式
    • 后端调用 API:后端通过 Java 代码发送 HTTP 请求,将用户购物车数据传给模型。
    • 模型生成菜谱:模型处理请求并生成菜谱后,返回包含菜谱内容的 JSON 数据,后端将该数据转发给前端展示。

流程:

  1. 生成请求:后端将用户的购物车数据转换为模型所需的输入格式(如食材名称、数量、价格等)。
  2. 调用模型接口:后端发起 HTTP 请求,传递数据到 ChatGLM-6B 模型接口,模型根据输入生成菜谱。
  3. 返回生成结果:模型返回的菜谱信息包含菜名、食材、步骤等内容,后端将这些数据包装为 JSON 格式 并传递给前端。
  4. 前端展示菜谱:前端接收到菜谱数据后,展示在界面中。

2.3 异步处理与生成过程

目标:保证菜谱生成过程不阻塞主线程,提升用户体验。

技术方案:

  • 前端异步请求
    • 使用 Coroutines处理后台请求,确保 UI 线程不被阻塞。
    • 使用 OkHttp 发起网络请求,结合协程来处理请求,避免 UI 界面卡顿。
  • 后端异步处理
    • 后端通过 Spring Boot 提供的 @Async 注解实现异步调用,避免请求阻塞。

流程:

  1. 异步请求:前端触发请求后,后台执行异步任务生成菜谱。
  2. 后台生成:后端异步调用 ChatGLM-6B 模型进行菜谱生成。
  3. 结果返回:生成完毕后,后端将菜谱数据通过回调或轮询返回前端,前端更新界面。

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的文章,想要独立完成,还有很多路要走,但我会继续学习的。

posted @ 2024-12-15 18:31  王贺雯  阅读(11)  评论(0编辑  收藏  举报