瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

文章目录

  • 10 套餐管理
    • 10.5 修改套餐
      • 10.5.1 需求分析
      • 10.5.2 具体实现
    • 10.6 (批量)删除套餐
      • 10.6.1 需求分析
      • 10.6.2 具体实现
    • 10.7 (批量)起售/停售套餐
      • 10.7.1 需求分析
      • 10.7.2 具体实现
    • 10.8 完善删除套餐分类功能

10 套餐管理

10.5 修改套餐

10.5.1 需求分析

  • 用户点击“修改套餐”按钮,进入修改页面;

  • 自动加载“套餐分类”下拉框,用户可以选择套餐分类,直接使用已经开发好的分页查询分类列表/category/page接口:

  • 自动加载“菜品”列表,用户可将菜品添加到当前套餐中,直接使用已经开发好的菜品列表分页查询接口/dish/page:

  • 用户可以上传套餐图片,直接使用已经开发好的文件上传/common/upload接口:

  • 用户可以查看套餐图片,直接使用已经开发好的文件下载/common/download接口:

  • 根据套餐ID查询套餐,回显当前套餐的信息:
功能请求方法请求路径请求参数
根据ID查询套餐信息GET/setmeal/get?id=1
  • 用户在修改完所有信息后,点击“保存”按钮修改套餐信息:
功能请求方法请求路径
修改套餐PUT/setmeal/edit

该接口的入参如下:

{"id": "1", //套餐ID"name":"3人套餐", //套餐名称"categoryId":"1413342269393674242", //套餐分类ID"price":3300, //套餐价格"image":"876ea3ae-4f70-4cba-bd76-e7c2daa29c2f.jpg", //套餐图片"description":"3人套餐真好吃!", //套餐描述"status":1, //套餐状态,默认1启售"setmealDishes":[ //套餐菜品{"copies":3, //菜品份数"dishId":"1397851668262465537", //菜品分类ID"name":"口味蛇", //菜品名称"price":16800 //菜品单价},{"copies":3,"dishId":"1397852391150759938","name":"辣子鸡丁","price":8800},{"copies":3,"dishId":"1397853183287013378","name":"麻辣兔头","price":19800}]
}

10.5.2 具体实现

  • 1)在Setmeal类添加套餐菜品关系setmealDishes属性
// com.itweid.takeout.entity.Setmeal@ApiModelProperty(value = "套餐菜品关系")
@TableField(exist = false)
private SetmealDish[] setmealDishes;
  • 2)在SetmealController类添加根据ID查询套餐的get方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("根据ID查询套餐")
@GetMapping("/get")
public BaseResult<Setmeal> get(Long id) {return setmealService.getSetmealById(id);
}
  • 3)在SetmealServiceImpl类中具体实现getSetmealById方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult<Setmeal> getSetmealById(Long id) {// 查询套餐信息Setmeal setmeal = getById(id);// 查询套餐菜品信息if(setmeal != null) {List<SetmealDish> setmealDishList = Db.lambdaQuery(SetmealDish.class).eq(SetmealDish::getSetmealId, setmeal.getId()).list();if(setmealDishList != null && !setmealDishList.isEmpty()) {setmeal.setSetmealDishes(setmealDishList.toArray(new SetmealDish[0]));}}return BaseResult.success(setmeal);
}
  • 4)回显数据功能测试

  • 5)在SetmealQuery类添加修改套餐的参数,并设置表单校验规则

  • 6)在SetmealController类添加修改套餐的edit方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("修改套餐")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) SetmealQuery setmealQuery) {return setmealService.editSetmeal(setmealQuery);
}
  • 7)在SetmealServiceImpl类中具体实现editSetmeal方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Value("${dir.upload}")
private String uploadDir;@Override
@Transactional(rollbackFor = Exception.class)
public BaseResult editSetmeal(SetmealQuery setmealQuery) {// 1 查询原套餐信息Setmeal exSetmeal = getById(setmealQuery.getId());if(exSetmeal == null) {return BaseResult.error(ErrorCode.SETMEAL_NOT_EXIST);}// 2 修改套餐信息Setmeal newSetmeal = new Setmeal();newSetmeal.setId(exSetmeal.getId());if(!exSetmeal.getName().equals(setmealQuery.getName())) {// 校验新套餐名是否已存在if(lambdaQuery().eq(Setmeal::getName, setmealQuery.getName()).exists()) {return BaseResult.error(ErrorCode.SETMEAL_EXIST);}newSetmeal.setName(setmealQuery.getName());}if(!exSetmeal.getCategoryId().toString().equals(setmealQuery.getCategoryId())) {newSetmeal.setCategoryId(Long.valueOf(setmealQuery.getCategoryId()));}if(!exSetmeal.getPrice().equals(setmealQuery.getPrice())) {newSetmeal.setPrice(setmealQuery.getPrice());}if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {newSetmeal.setImage(setmealQuery.getImage());}if(!exSetmeal.getDescription().equals(setmealQuery.getDescription())) {newSetmeal.setDescription(setmealQuery.getDescription());}updateById(newSetmeal);// 3 修改套餐菜品信息SetmealDish[] setmealDishes = setmealQuery.getSetmealDishes();if(setmealDishes != null && setmealDishes.length > 0) {// 删除原有菜品Db.lambdaUpdate(SetmealDish.class).eq(SetmealDish::getSetmealId, exSetmeal.getId()).remove();// 增加新菜品for(SetmealDish setmealDish : setmealDishes) {setmealDish.setSetmealId(exSetmeal.getId().toString());Db.save(setmealDish);}}// 4 删除旧的套餐图片if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {File file = new File(uploadDir + exSetmeal.getImage());if(file.exists()) {log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());}}return BaseResult.success();
}
  • 8)测试修改套餐功能

10.6 (批量)删除套餐

10.6.1 需求分析

用户点击套餐记录操作栏的“删除”按钮,即可删除该套餐;或者用户勾选需要删除的套餐后,点击右上角的“批量删除”按钮,即可同时删除多个套餐。

后端只需要根据前端传递的套餐IDs删除对应的套餐即可:

功能请求方法请求路径请求参数
根据IDs删除/批量删除套餐信息DELETE/setmeal/delete?ids=1,2,3

10.6.2 具体实现

  • 1)在SetmealController类添加根据IDs删除套餐的delete方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("(批量)删除套餐")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "套餐ID不能为空") String ids) {return setmealService.deleteSetmeals(ids);
}
  • 2)在SetmealServiceImpl类中具体实现deleteSetmeals方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult deleteSetmeals(String ids) {for (String id : ids.split(",")) {// 根据ID修改套餐删除状态Setmeal setmeal = new Setmeal();setmeal.setId(Long.valueOf(id));setmeal.setIsDeleted(StatusCode.HAD_DEL.getCode());updateById(setmeal);}return BaseResult.success();
}
  • 3)测试删除套餐功能

  • 4)测试批量删除套餐功能

10.7 (批量)起售/停售套餐

10.7.1 需求分析

用户点击套餐记录操作栏的“起售”或“停售”按钮,即可起售或停售该套餐;或者用户勾选需要起售/停售的套餐后,点击右上角的“批量起售”或“批量停售”按钮,即可同时起售或停售多个套餐。

对后端来说,起售和停售都只是修改套餐的状态而已,后端只需要根据前端传递的套餐ID修改对应的套餐的状态即可:

功能请求方法请求路径请求参数
根据ID(批量)起售/停售套餐信息POST/setmeal/status{“id”:1, “status”:1}

10.7.2 具体实现

  • 1)在SetmealQuery类添加修改套餐状态的参数,并设置表单校验规则
// com.itweid.takeout.entity.SetmealQuery@ApiModelProperty("套餐ID")
@NotBlank(groups = {Edit.class, EditStatus.class}, message = "套餐ID不能为空")
private String id;@ApiModelProperty("套餐状态")
@NotNull(groups = {EditStatus.class}, message = "套餐状态不能为空")
private Integer status;
  • 2)在SetmealController类添加根据ID修改套餐状态的ststus方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("(批量)启售/停售套餐")
@PostMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) SetmealQuery setmealQuery) {return setmealService.editSetmealStatus(setmealQuery);
}
  • 3)在SetmealServiceImpl类中具体实现editSetmealStatus方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult editSetmealStatus(SetmealQuery setmealQuery) {String ids = setmealQuery.getId();for (String id : ids.split(",")) {// 根据ID修改套餐状态Setmeal setmeal = new Setmeal();setmeal.setId(Long.valueOf(id));setmeal.setStatus(setmealQuery.getStatus());updateById(setmeal);}return BaseResult.success();
}
  • 4)测试功能

10.8 完善删除套餐分类功能

在“分类管理”菜单中,进行删除套餐分类时,需要先判断该套餐分类是否已被套餐使用。如果已被使用,则不能删除。

改造CategoryServiceImpl类的deleteCategory方法:

// com.itweid.takeout.service.impl.CategoryServiceImpl@Override
public BaseResult deleteCategory(Long id) {// 判断该分类是否已被菜品使用if(Db.lambdaQuery(Dish.class).eq(Dish::getCategoryId, id).exists()) {return BaseResult.error(ErrorCode.CATEGORY_IS_USED);}// 判断该分类是否已被套餐使用if(Db.lambdaQuery(Setmeal.class).eq(Setmeal::getCategoryId, id).exists()) {return BaseResult.error(ErrorCode.CATEGORY_IS_USED);}boolean remove = removeById(id);return remove ? BaseResult.success() : BaseResult.error(ErrorCode.CATEGORY_NOT_EXIST);
}

本节完,更多内容查阅:瑞吉外卖项目实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502137.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 实时获取Linux服务器信息

在进行服务器监控、运维管理时&#xff0c;实时获取服务器信息至关重要。特别是在 Linux 环境下&#xff0c;我们常常需要获取系统的运行状态、资源占用情况以及硬件信息。如果你是运维人员、开发者或是正在做自动化运维任务的人&#xff0c;那么如何高效地实时获取 Linux 服务…

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求&#xff0c;有一部分算法的代码需要MATLAB来进行处理&#xff0c;而最后需要集成到C#中的wpf项目中去&#xff0c;选择灵活性更高的dll&#xff0c;去进行集成。&#xff08;可以简单理解为&#xff1a;将MATLAB的函数&#xff0c;变为C#中类的函数成员&…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域&#xff0c;pytest 是当之无愧的王者。提到 pytest&#xff0c;不得不说它的一大核心功能——Fixture。Fixture 的强大&#xff0c;让复杂的测试流程变得井井有条&#xff0c;让测试代码更加灵活和可复用。 那么&#xff0c;pytest 的 Fixture 究竟是…

【AI编辑器】Cursor与DeepSeek模型的集成:提升开发效率的新选择

目录 一、为什么选择DeepSeek模型 1.1 模型参数与训练 1.2 技术创新 1、FP8格式介绍 2、FP8混合精度训练的优势 3、FP8混合精度训练的技术要点 4、FP8混合精度训练的应用与挑战 1.3 性能表现 1.4 应用与部署 1.5 争议与前景 二、注册DeepSeek账号并获取API Key 三、…

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出?】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff09;在不同情况下可能会退出&am…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力&#xff0c;泛型是具体类型或其他属性的抽象代替&#xff0c;可以看成是一种模版&#xff0c;一个占位符&#xff0c;编译器在编译时会将这些占位符替换成具体的类型&#xff0c;这个过程叫做“单态化”&#xff0c;所以使用泛型的…

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标&#xff1a;  网络应用的 原理&#xff1a;网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例&#xff1a;互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…

2022浙江大学信号与系统笔记

原视频地址&#xff1a;2022浙江大学信号与系统&#xff08;含配套课件和代码&#xff09; - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记&#xff1a;飞书链接 - 信号与系统 基于视频&#xff0c;记得笔记&#xff0c;加了点自己的补充&#xff08;有的是问 ChatGPT 的&#xff09;…

数学建模入门——建模流程

摘要&#xff1a;本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤&#xff0c;像分析问题、…

如何使用OpenCV进行抓图-多线程

前言 需求&#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求&#xff0c;之前就有做了&#xff0c;但是由于出现了一个问题&#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了&#xff0c;而我的程序…

NLP CH3复习

CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降&#xff08;GD&#xff09; 全批量&#xff1a;在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…

01 数据分析介绍及工具准备

数据分析介绍及工具准备 一、工具准备二、下载和使用Anaconda三、jupyter notebook常用快捷键 一、工具准备 数据科学库 NumPy&#xff0c;SciPy&#xff0c;Pandas&#xff0c;Scikit-Learn 数据可视化库 Matplotlib&#xff0c;Seaborn 编译器 Jupyter Notebook 数据科…

机组的概述

计算机系统组成 硬件系统和软件系统 计算机硬件 1.冯诺依曼机基本思想 特点 1.采用“存储程序”工作方式 2.硬件系统由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入输出设备组成 3.指令和数据存在存储器中&#xff0c;形式无区别 4.指令和数据用二进制代…

Windows应用开发-解析MP4视频文件(第1部分)

下载本应用 本Windows应用解析MP4视频文件&#xff0c;以表格的方式显示MP4文件结构。并可以将结果保存到bmp图片。 使用方法 选择“打开MP4视频文件”菜单项&#xff0c;打开MP4文件&#xff0c;就可以获得如下图像&#xff1a; box的每一项&#xff0c;用3个矩形表示&…

Scala_【4】流程控制

第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理

文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…

基于springboot的课程作业管理系统(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;前端运行截图后端运行截图 项目简介&#xff08;论文摘要&#xff09; 随着科学技术的飞速发展&#xff0c;社会的方方面…