瑞吉外卖项目——修改套餐功能

需求分析

  • 用户点击修改按钮,跳转到修改界面(和新增界面相仿),当用户填入相应信息后,点击保存按钮,会把这条套餐信息进行更改。

代码开发

后端主要处理两个请求:

  • 当点击修改按钮时,前端发送ajax请求,请求服务端以进行套餐数据的回显。
    controller层
  /**
   * 根据id查询套餐信息
   *(套餐信息的回显)
   * @param id
   * @return
   */
  @GetMapping("/{id}")
  public R<SetmealDto> getById(@PathVariable Long id) {
    log.info("根据id查询套餐信息:{}", id);
    // 调用service执行查询。、
    SetmealDto setmealDto = setmealService.getByIdWithDish(id);
    return R.success(setmealDto);
  }

service层

  /**
   * 通过id查询套餐信息, 同时还要查询关联表setmeal_dish的菜品信息进行回显。
   *
   * @param id 待查询的id
   */
  @Override
  public SetmealDto getByIdWithDish(Long id) {
    // 根据id查询setmeal表中的基本信息
    Setmeal setmeal = this.getById(id);
    SetmealDto setmealDto = new SetmealDto();
    // 对象拷贝。
    BeanUtils.copyProperties(setmeal, setmealDto);
    // 查询关联表setmeal_dish的菜品信息
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, id);
    List<SetmealDish> setmealDishList = setmealDishService.list(queryWrapper);
    //设置套餐菜品属性
    setmealDto.setSetmealDishes(setmealDishList);
    return setmealDto;
  }

测试通过

  • 当用户点击保存按钮时,将修改后的信息以json数据形式提交到服务端进一步保存到数据库。
    controller层
  /**
   * 修改套餐信息。
   *
   * @param setmealDto
   * @return
   */
  @PutMapping
  public R<String> update(@RequestBody SetmealDto setmealDto) {
    log.info("修改套餐信息{}", setmealDto);
    // 执行更新。
    setmealService.updateWithDish(setmealDto);
    return R.success("修改套餐信息成功");
  }

service层

  /**
   * 更新套餐信息,不仅要更新setmeal基本信息, 还要更新套餐所对应的菜品到setmeal_dish表
   *
   * @param setmealDto
   */
  @Override
  public void updateWithDish(SetmealDto setmealDto) {
    // 保存setmeal表中的基本数据。
    this.updateById(setmealDto);
    // 先删除原来的套餐所对应的菜品数据。
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
    setmealDishService.remove(queryWrapper);
    // 更新套餐关联菜品信息。setmeal_dish表。
    // Field 'setmeal_id' doesn't have a default value] with root cause
    // 所以需要处理setmeal_id字段。
    // 先获得套餐所对应的菜品集合。
    List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
    //每一个item为SetmealDish对象。
    setmealDishes = setmealDishes.stream().map((item) -> {
      //设置setmeal_id字段。
      item.setSetmealId(setmealDto.getId());
      return item;
    }).collect(Collectors.toList());

    // 重新保存套餐对应菜品数据
    setmealDishService.saveBatch(setmealDishes);
  }

测试通过

### 外卖项目的需求分析 #### 功能模块 外卖项目是一个基于Spring Boot和MyBatis-Plus框架构建的外卖管理系统。其核心功能模块可以分为以下几个部分[^1]: 1. **用户管理** - 用户注册与登录:通过自定义过滤器`LongCheckFilter`实现用户的登录状态检查,确保只有已登录用户才能访问特定资源[^3]。 2. **购物车管理** - 查询购物车商品列表:提供接口`/list`用于根据当前用户ID查询购物车中的商品,并按照创建时间排序[^2]。 - 清空购物车:提供接口`/clean`用于删除指定用户的所有购物车记录[^2]。 3. **菜单管理** - 菜品管理:涉及菜品表(dish),支持新增、修改、删除以及查询菜品信息[^4]。 - 套餐管理:涉及套餐表(setmeal)和套餐菜品关系表(setmeal_dish),允许管理员配置不同类型的套餐及其对应的菜品组合[^4]。 4. **订单管理** - 订单创建:当用户确认下单时,系统会生成一条新的订单记录存储至订单表(orders),并将对应的商品明细保存到订单详情表(order_detail)中[^4]。 - 订单查询与统计:支持按条件筛选历史订单数据以便于运营决策制定。 5. **其他辅助功能** - 数据分类展示:利用分类表(category)来组织前端界面上显示的内容结构; - 商品口味定制化选项设置:借助菜品口味表(dish_flavor)满足顾客对于特殊风味偏好需求的选择[^4]; #### 技术选型 该项目采用了主流Java Web开发栈进行建设,主要包括但不限于以下几项关键技术组件[^3]: - 后端框架选用轻量级企业级应用解决方案——Spring Boot,简化传统Spring应用程序繁琐复杂的XML配置过程的同时还提供了许多开箱即用的功能特性; - ORM层引入高性能持久层框架MyBatis-Plus,在原生SQL映射基础上进一步增强了CRUD操作便捷性和效率提升效果显著 ; - 安全机制方面则依赖内置Servlet API完成基本的身份认证逻辑处理并通过日志工具SLF4J记录下每次请求交互细节方便后续排查问题所在位置. #### 业务流程概述 以下是围绕着典型场景描述的一个完整闭环式运作链条图景: 1. 当未授权访客尝试进入受保护页面时触发拦截动作由`LongCheckFilter`类实例执行验证工作流判断是否具备有效凭证如果没有重定向回登录入口引导重新输入账号密码提交身份证明材料直至成功绑定session令牌为止. 2. 成功登陆后的消费者能够浏览平台所提供的各类美食推荐服务同时也可以把自己感兴趣的东西加入虚拟储物空间也就是常说的在线版"篮子"-这里指代的就是shopping_cart实体对象集合形式存在内存或者数据库里等待下一步结算指令下达前暂存起来供随时调整数量规格等参数设定直到最终决定购买那一刻才正式发起交易行为从而进入到下一个环节即生成唯一编号标识符关联多个细分子项构成一笔完整的商业契约关系记录下来永久保留便于日后追溯查阅等等用途广泛适用性强深受广大商家青睐追捧不已! ```python # 示例代码片段演示如何调用Controller方法获取购物车内物品清单 import requests def fetch_shopping_cart(user_id): headers = {"Authorization": f"Bearer {user_id}"} response = requests.get("http://example.com/api/shoppingcart/list", headers=headers) if response.status_code == 200: cart_items = response.json() return cart_items["data"] else: raise Exception(f"Failed to retrieve shopping cart items: {response.text}") if __name__ == "__main__": try: user_data = fetch_shopping_cart("test_user_123") print(user_data) except Exception as e: print(e) ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值