瑞吉外卖 - 修改菜品功能(18)

news2024/11/18 14:37:26

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 + JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。
相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PDe_7uIg?pwd=x548
提取码:x548

文章目录

    • 1.需求分析
    • 2.代码开发
      • 2.1 分析交互过程
      • 2.2 代码实现
    • 3.功能测试

1.需求分析

在菜品管理列表页面点击修改按钮,跳转到修改菜品页面,在修改页面回显菜品相关信息并进行修改,最后点击确定按钮完成修改操作。

2.代码开发

2.1 分析交互过程

在开发代码之前,需要梳理一下修改菜品时前端页面 (add.html) 和服务端的交互过程:

  1. 页面发送 ajax 请求,请求服务端获取分类数据,用于菜品分类下拉框中数据展示;
  2. 页面发送 ajax 请求,请求服务端,根据 id 查询当前菜品信息,用于菜品信息回显;
  3. 页面发送请求,请求服务端进行图片下载,用于页图片回显;
  4. 点击保存按钮,页面发送 ajax 请求,将修改后的菜品相关数据以 json 形式提交到服务端。

开发修改菜品功能,其实就是在服务端编写代码去处理前端页面发送的这 4 次请求即可,其中第 1、3 次请求我们已经实现了,现在只需要实现 2、4 两个请求的处理即可。

根据 id 查询当前菜品信息的请求信息如下:

将修改后的菜品相关数据以 json 形式提交到服务端的请求信息如下:

2.2 代码实现

这里由于我们同样涉及到了两个表的操作,因此对于根据 ID 回显信息和修改操作都需要提供自定义的方法,DishService 中的抽象方法如下:

public interface DishService extends IService<Dish> {
    // 省略其他方法

    /**
     * 根据菜品id查询菜品,同时查询菜品口味
     *
     * @param id 菜品id
     * @return DishDto
     */
    public DishDto getByIdWithFlavor(Long id);

    /**
     * 根据菜品id更新菜品,同时更新菜品口味
     *
     * @param dishDto 自定义的 DTO 对象,用于接收前端传递的数据
     */
    public void updateWithFlavor(DishDto dishDto);
}

DishServiceImpl 中对应的具体实现如下:

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    @Resource
    private DishFlavorService dishFlavorService;

    // 省略其他代码

    /**
     * 根据菜品id查询菜品,同时查询菜品口味
     * @param id 菜品id
     * @return DishDto
     */
    @Override
    public DishDto getByIdWithFlavor(Long id) {
        // 1.根据菜品 id 查询菜品信息
        Dish dish = this.getById(id);
        // 2.创建 DishDto 对象
        DishDto dishDto = new DishDto();
        // 3.将 dish 对象中的属性值复制到 dishDto 对象中
        BeanUtils.copyProperties(dish, dishDto);
        // 4.构造查询条件
        QueryWrapper<DishFlavor> queryWrapper = new QueryWrapper<>();
        // 5.设置查询条件,根据菜品 id 查询菜品口味
        queryWrapper.eq("dish_id", id);
        // 6.根据查询条件查询菜品口味
        List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);
        // 7.将菜品口味设置到 dishDto 对象中
        dishDto.setFlavors(flavors);
        // 8.返回 dishDto 对象
        return dishDto;
    }

    /**
     * 根据菜品id更新菜品,同时更新菜品口味
     * @param dishDto 自定义的 DTO 对象,用于接收前端传递的数据
     */
    @Transactional
    @Override
    public void updateWithFlavor(DishDto dishDto) {
        // 1.更新 dish 表中的数据
        this.updateById(dishDto);
        // 2.构造查询条件
        QueryWrapper<DishFlavor> queryWrapper = new QueryWrapper<>();
        // 3.设置查询条件,根据菜品 id 查询菜品口味
        queryWrapper.eq("dish_id", dishDto.getId());
        // 4.根据查询条件删除菜品口味
        dishFlavorService.remove(queryWrapper);
        // 5.获取菜品口味
        List<DishFlavor> flavors = dishDto.getFlavors();
        // 6.遍历菜品口味,设置菜品 id
        flavors.forEach(flavor -> flavor.setDishId(dishDto.getId()));
        // 7.批量保存菜品口味
        dishFlavorService.saveBatch(flavors);
    }
}

DishController 中相关的两个处理方法如下:

@RestController
@RequestMapping("/dish")
public class DishController {
    /**
     * 根据 id 查询菜品,用于修改菜品时的数据回显
     * @param id 菜品 id
     * @return R
     */
    @GetMapping("/{id}")
    public R<DishDto> getById(@PathVariable Long id) {
        DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
    }

    /**
     * 修改菜品
     * @param dishDto 自定义的 DTO 对象,用于接收前端传递的数据
     * @return R
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto) {
        dishService.updateWithFlavor(dishDto);
        return R.success("修改菜品成功");
    }
    
    // 省略其他代码
}

3.功能测试

重启应用,进行修改菜品数据测试:

点击保存,修改成功:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink第四章:水位线和窗口

系列文章目录 Flink第一章:环境搭建 Flink第二章:基本操作. Flink第三章:基本操作(二) Flink第四章:水位线和窗口 文章目录 系列文章目录前言一、水位线二、窗口二、实际案例1.自定义聚合函数2.全窗口函数3.水位线窗口4.统计用户点击数据5.处理迟到数据 总结 前言 这次博客记…

ChatGPT、GPT4、AutoGPT 和 MemoryGPT:初学者指南

人工智能 (AI) 不仅在改变行业&#xff0c;也在改变我们的日常生活。借助人工智能&#xff0c;我们可以改善我们的组织和生产力&#xff0c;让我们能够专注于真正重要的事情。在本文中&#xff0c;我们将探讨一些适用于日常生活的 AI 工具&#xff0c;以及它们如何帮助您保持井…

【Spring框架】--02.容器IoC、原理(手写IoC)

文章目录 3.容器&#xff1a;IoC3.1 IoC容器3.1.1 控制反转&#xff08;IoC&#xff09;3.1.2 依赖注入3.1.3 IoC容器在Spring的实现 3.2 基于XML管理Bean3.2.1搭建子模块spring6-ioc-xml3.2.2 获取bean①方式一&#xff1a;根据id获取②方式二&#xff1a;根据类型获取③方式三…

【Jmeter第三章】Jmeter给请求添加请求头

给请求加上请求头最常见的场景就是在请求头上添加token了&#xff0c;这里也拿添加token来举例 1、添加某个请求的请求头 1、选中HTTP请求&#xff0c;右键添加 2、添加请求头 2、添加公共的请求头信息 其实步骤和上面是一样的&#xff0c;只不过是选择&#xff1a;线程组…

极客的git常用命令手册

极客的git常用命令手册 1.1 权限配置篇1.1.1 创建ssh key1.1.2 本地存在多个密钥时&#xff0c;如何根据目标平台自动选择用于认证的密钥&#xff1f; 1.2 基础信息配置篇1.2.1 配置用户名1.2.2 配置用户邮箱1.2.3 设置文件名大小写区分1.2.4 设置命令行显示颜色1.2.5 检查git全…

MySQL高级_第11章_数据库的设计规范

MySQL高级_第11章_数据库的设计规范 1. 为什么需要数据库设计 2. 范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关…

如何用postman进行http接口测试?好好看好好学

目录 优点&#xff1a; 1、什么是POSTMAN 2、新建一个项目 2、新增一个用例 3、添加请求信息 4、post请求参数 5、添加头信息 6、预处理和结果检查 7、全局变量与环境变量 8、导出用例为代码 9、批量执行用例 HTTP的接口测试工具有很多&#xff0c;可以进行http请求…

打死都千万不要进外包...

我18年毕业于一个普通二本学校&#xff0c;是一个很不出名的小本科。大学期间专业知识也没有去认真的学习&#xff0c;所以毕业的时候就随便找了一份工作&#xff0c;在一个小公司做功能测试。 记得那时候薪资大概是6k左右&#xff0c;因为是在工厂&#xff0c;工作环境很差&a…

终极猜想 |欧科云链研究院揭秘货币未来形态

前言 5月18日&#xff0c;澎湃科技联合欧科云链研究院重磅发布的《从Web3“去美元化”看货币未来形态的终极猜想》文章&#xff0c;通过分析Web3.0“去美元化”的两大路径&#xff0c;对货币未来形态进行了前沿性的猜想。其中&#xff0c;Web3行业盛会Consensus2023&#xff0…

补充点【机器学习部分】

0518机器学习 身高和体重为特征&#xff0c;和标签训练阔以得到一个式子。 1.有监督学习&#xff1a; 2.训练集和测试集 3.模型学习 4.模型评估 5.基本术语 数据集&#xff1a;记录数据的集合 样本&#xff1a;每条记录关于一个事件或者对象的描述 特征&#xff1a;反映对…

软件安全-课后练习-格式化字符串-fmtstr2-随笔

一、准备工作 题目-百度网盘 1. 2.代码审计 只要输入不是yes或者no&#xff0c;就会调用到存在格式化字符串漏洞的printf函数 如果authenticated 的值为1195526213&#xff08;十六进制&#xff1a;0x47424845&#xff09;&#xff0c;就可以得到flag。 二、思路&#xf…

10. Redis哨兵(sentinel)

10. Redis哨兵sentinel 是什么&#xff1f;能干嘛怎么玩&#xff08;实战演示&#xff1a;&#xff09;Redis Sentinel架构&#xff0c;前提说明案例步骤&#xff0c;不服就干重点参数项说明其他 本次案例哨兵sentinel文件通用配置sentinel26379.confsentinel26380.confsentin…

Java并发常见面试题

Java并发常见面试题总结 1、什么是线程和进程&#xff1f; 何为进程&#xff1f; 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行程序&#xff0c;是一个进程从创建、运行到消亡的过程。 在Java中&#xff0c;当我们…

Java 的八大基本类型及其包装类型(超级详细)

Java 中有八种内置的基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char 和 boolean&#xff0c;其中&#xff0c;byte、short、int 和 long 都是用来表示整数&#xff0c;float 和 double 是用来表示浮点数的&#xff0c;那它们之间有什么区别和…

【C++】哈希/散列详细解析

前言&#xff1a;上篇文章介绍了unordered_set和unordered_map序列关联式容器&#xff0c;它们之所以效率比较高&#xff0c;是因为其底层使用了哈希结构。&#xff0c;所以这篇文章我们就来详细讲解一下哈希表。有关unordered序列关联式容器的知识&#xff0c;请移步至这篇文章…

单片机--USART

目录 【2】USART 【3】串口通信协议 【4】相关寄存器 串口控制寄存器 波特率寄存器 中断和状态寄存器 ​编辑 数据发送寄存器 数据接收寄存器 【5】 USART功能框图 【6】串口发送实验 实验要求 1.观察实物 2.分析原理图 3.STM32CubeMX配置 7、不定长接收 8、重定向 【1】…

2022 CCPC-final 总结

赛前 去年 CCPC-final 拿了银牌第二。赛后&#xff0c;我选择退役&#xff0c;另一位队友 George_Plover 选择继续。 今年他队友 Kieray 去组女队了&#xff0c;于是邀请我替补参赛。 赛前一个月&#xff0c;约定好每周末组队训一场&#xff08;在 cf 和 qoj 上&#xff0…

Spring Boot集成Swagger2

文章目录 1.什么是Swagger22.SpringBoot集成Swagger23.Swagger2配置管理(1)对Swagger2信息进行更改(2)swagger配置扫描接口(3)配置api文档分组&#xff08;分组无非就是多个Docket&#xff09;(4)实体类的配置 面试题&#xff1a;如果我们希望Swagger在某一个环境中使用&#x…

自学黑客(网络安全),看完这篇,再去追你的黑客梦!

今天专题是替一些想入门网络安全&#xff0c;但还迷茫不知所措的同学解一解惑。想30天零基础入门网络安全&#xff0c;这些你一定要搞清楚。 一、学习网络安全容易造成的误区 1、把编程当作目的&#xff0c;忽略了它的工具职能 千万不要抱着“以编程为目的&#xff0c;再开始…

C++(2):变量和基本类型

基本内置类型 C定义了一套包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。 算数类型 算数类型分为两类&#xff1a;整型&#xff0…