• 基于Springboot外卖系统16:菜品修改模块+菜品信息回显+ID查询口味列表+组装数据并返回


    4.1 菜品修改模块需求分析

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

    4.2 菜品修改模块前端页面(add.html)和服务端的交互过程

    1). 点击菜品列表的中的修改按钮,携带菜品id跳转至add.html

    2). 进入add.html,页面发送ajax请求,请求服务端获取分类数据,用于菜品分类下拉框中数据展示(已实现)

    3). add.html获取id, 发送ajax请求,请求服务端,根据id查询当前菜品信息,用于菜品信息回显

     4). 页面发送请求,请求服务端进行图片下载,用于页图片回显(已实现)

     5). 点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端

     4.3 新增功能

    经过上述的分析,菜品分类下拉框的展示、图片的下载回显功能已经实现了。只需要在这里实现两个功能即可,分别是:

    1). 根据ID查询菜品及菜品口味信息

    请求说明
    请求方式GET
    请求路径/dish/{id}

    2). 修改菜品及菜品口味信息

    请求说明
    请求方式PUT
    请求路径/dish
    请求参数json格式数据

    通过浏览器抓取 具体的json格式数据:

    1. {
    2. "id":"1422783914845487106",
    3. "name":"佛跳墙",
    4. "categoryId":"1397844357980663809",
    5. "price":88800,
    6. "code":"",
    7. "image":"da9e1c70-fc32-4781-9510-a1c4ccd2ff59.jpg",
    8. "description":"佛跳墙",
    9. "status":1,
    10. "sort":0,
    11. "createTime":"2021-08-04 12:58:14",
    12. "createUser":"1412578435737350122",
    13. "updateUser":"1412578435737350122",
    14. "flavors":[
    15. {
    16. "id":"1422783914883235842",
    17. "dishId":"1422783914845487106",
    18. "name":"辣度",
    19. "value":"[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]",
    20. "createTime":"2021-08-04 12:58:14",
    21. "updateTime":"2021-08-04 12:58:14",
    22. "createUser":"1412578435737350122",
    23. "updateUser":"1412578435737350122",
    24. "isDeleted":0,
    25. "showOption":false
    26. },
    27. {
    28. "id":"1422783914895818754",
    29. "dishId":"1422783914845487106",
    30. "name":"忌口",
    31. "value":"[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]",
    32. "createTime":"2021-08-04 12:58:14",
    33. "updateTime":"2021-08-04 12:58:14",
    34. "createUser":"1412578435737350122",
    35. "updateUser":"1412578435737350122",
    36. "isDeleted":0,
    37. "showOption":false
    38. }
    39. ]
    40. }

    4.4 代码实现

    4.4.1 根据ID查询菜品信息

    页面发送ajax请求,请求服务端,根据id查询当前菜品信息和对应的口味信息,用于修改页面中菜品信息回显。

    4.4.2 修改菜品信息

    点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端。在修改菜品信息时需要注意,除了要更新dish菜品表,还需要更新dish_flavor菜品口味表。

    4.4.3 在DishService接口中扩展getByIdWithFlavor、updateWithFlavor方法

    1. package com.itheima.reggie.service;
    2. import com.baomidou.mybatisplus.extension.service.IService;
    3. import com.itheima.reggie.dto.DishDto;
    4. import com.itheima.reggie.entity.Dish;
    5. public interface DishService extends IService {
    6. // 新增菜品,需要同时插入菜品对应的口味数据,需要操作两张表,dish、dish_flavor
    7. public void saveWithFlavor(DishDto dishDto);
    8. // 根据id查询菜品信息和对应的口味信息
    9. public DishDto getByIdWithFlavor(Long id);
    10. // 更新菜品信息,同时更新对应的口味信息
    11. public void updateWithFlavor(DishDto dishDto);
    12. }

     4.4.4 在DishService实现类中实现getByIdWithFlavor与updateWithFlavor方法

    ①getByIdWithFlavor具体逻辑为:

    A. 根据ID查询菜品的基本信息

    B. 根据菜品的ID查询菜品口味列表数据

    C. 组装数据并返回

    ②updateWithFlavor具体逻辑为:

    A. 根据ID查询菜品的基本信息

    B. 根据菜品的ID查询菜品口味列表数据

    C. 组装数据并返回

    1. package com.itheima.reggie.service.impl;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    4. import com.itheima.reggie.dto.DishDto;
    5. import com.itheima.reggie.entity.Dish;
    6. import com.itheima.reggie.entity.DishFlavor;
    7. import com.itheima.reggie.mapper.DishMapper;
    8. import com.itheima.reggie.service.DishFlavorService;
    9. import com.itheima.reggie.service.DishService;
    10. import lombok.extern.slf4j.Slf4j;
    11. import org.springframework.beans.BeanUtils;
    12. import org.springframework.beans.factory.annotation.Autowired;
    13. import org.springframework.stereotype.Service;
    14. import org.springframework.transaction.annotation.Transactional;
    15. import java.util.List;
    16. import java.util.stream.Collectors;
    17. /**
    18. * Description: new java files header..
    19. *
    20. * @author w
    21. * @version 1.0
    22. * @date 2022/8/16 10:15
    23. */
    24. @Service
    25. @Slf4j
    26. public class DishServiceImpl extends ServiceImpl implements DishService{
    27. @Autowired
    28. private DishFlavorService dishFlavorService;
    29. @Override
    30. @Transactional
    31. public void saveWithFlavor(DishDto dishDto) {
    32. /**@Description: 新增菜品 同时保存对应的口味数据
    33. * @author LiBiGo
    34. * @date 2022/8/18 11:58
    35. */
    36. // 保存菜品的基本信息到菜品表dish
    37. this.save(dishDto);
    38. Long dishId = dishDto.getId(); // 菜品id
    39. // 菜品口味
    40. List flavors = dishDto.getFlavors();
    41. flavors = flavors.stream().map((item)->{
    42. item.setDishId(dishId);
    43. return item;
    44. }).collect(Collectors.toList());
    45. // 保存菜品口味数据到菜品口味表dish_flavor
    46. dishFlavorService.saveBatch(flavors);
    47. }
    48. @Override
    49. // 根据id查询菜品信息和对应的口味信息
    50. public DishDto getByIdWithFlavor(Long id) {
    51. // 查询菜品的基本信息,从dish表查询
    52. Dish dish = this.getById(id);
    53. // 拷贝基本信息
    54. DishDto dishDto = new DishDto();
    55. BeanUtils.copyProperties(dish,dishDto);
    56. // 查询当前菜品对应的口味信息,从dish_flavor表查询flavors
    57. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    58. queryWrapper.eq(DishFlavor::getDishId,dish.getId());
    59. List flavors = dishFlavorService.list(queryWrapper);
    60. dishDto.setFlavors(flavors);
    61. return dishDto;
    62. }
    63. @Override
    64. @Transactional
    65. public void updateWithFlavor(DishDto dishDto) {
    66. // 更新dish表的基本信息
    67. this.updateById(dishDto);
    68. // 清理当前菜品对应的口味数据---dish_flavor表的delete操作
    69. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    70. queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());
    71. dishFlavorService.remove(queryWrapper);
    72. // 添加当前提交过来的口味数据---dish_flavor表的insert操作
    73. List flavors = dishDto.getFlavors();
    74. flavors = flavors.stream().map((item) -> {
    75. item.setDishId(dishDto.getId());
    76. return item;
    77. }).collect(Collectors.toList());
    78. dishFlavorService.saveBatch(flavors);
    79. }
    80. }

    4.4.5 在DishController中创建get方法与update方法

    1. package com.itheima.reggie.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    4. import com.itheima.reggie.common.R;
    5. import com.itheima.reggie.dto.DishDto;
    6. import com.itheima.reggie.entity.Category;
    7. import com.itheima.reggie.entity.Dish;
    8. import com.itheima.reggie.service.CategoryService;
    9. import com.itheima.reggie.service.DishFlavorService;
    10. import com.itheima.reggie.service.DishService;
    11. import lombok.extern.slf4j.Slf4j;
    12. import org.springframework.beans.BeanUtils;
    13. import org.springframework.beans.factory.annotation.Autowired;
    14. import org.springframework.web.bind.annotation.*;
    15. import java.util.List;
    16. import java.util.stream.Collectors;
    17. /**
    18. * Description: 菜品管理 菜品及菜品口味的相关操作,统一使用这一个controller即可。
    19. * @version 1.0
    20. * @date 2022/8/18 11:08
    21. */
    22. @Slf4j
    23. @RestController
    24. @RequestMapping("/dish")
    25. public class DishController {
    26. @Autowired
    27. private DishService dishService;
    28. @Autowired
    29. private DishFlavorService dishFlavorService;
    30. @Autowired
    31. private CategoryService categoryService;
    32. @PostMapping
    33. public R save(@RequestBody DishDto dishDto){
    34. /**@Description: 新增菜品
    35. * @author LiBiGo
    36. * @date 2022/8/18 11:44
    37. */
    38. log.info(dishDto.toString());
    39. dishService.saveWithFlavor(dishDto);
    40. return R.success("新增菜品成功");
    41. }
    42. @GetMapping("/page")
    43. public R page(int page,int pageSize,String name){
    44. /**@Description: 菜品信息分页查询
    45. * @author LiBiGo
    46. *
    47. * 数据库查询菜品信息时,获取到的分页查询结果 Page 的泛型为 Dish,而最终需要给前端页面返回的类型为DishDto,
    48. * 所以这个时候就要进行转换,基本属性直接通过属性拷贝的形式对Page中的属性进行复制,
    49. * 对于结果列表 records属性需要进行特殊处理的(需要封装菜品分类名称);
    50. *
    51. * @date 2022/8/19 10:41
    52. */
    53. // 构造分页构造器对象
    54. Page pageInfo = new Page<>(page,pageSize);
    55. Page dishDtoPage = new Page<>();
    56. // 条件构造器
    57. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    58. // 添加过滤条件
    59. queryWrapper.like(name!=null,Dish::getName,name);
    60. // 添加排序条件
    61. queryWrapper.orderByDesc(Dish::getUpdateTime);
    62. // 执行分页查询
    63. dishService.page(pageInfo,queryWrapper);
    64. // 对象的拷贝
    65. BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
    66. List records = pageInfo.getRecords();
    67. List list = records.stream().map((item) -> {
    68. DishDto dishDto = new DishDto();
    69. BeanUtils.copyProperties(item,dishDto);
    70. Long categoryId = item.getCategoryId();//分类id
    71. //根据id查询分类对象
    72. Category category = categoryService.getById(categoryId);
    73. if(category != null){
    74. String categoryName = category.getName();
    75. dishDto.setCategoryName(categoryName);
    76. }
    77. return dishDto;
    78. }).collect(Collectors.toList());
    79. dishDtoPage.setRecords(list);
    80. return R.success(dishDtoPage);
    81. }
    82. @GetMapping("/{id}")
    83. public R get(@PathVariable Long id){
    84. /**@Description: 根据id查询菜品信息和对应的口味信息
    85. * @author LiBiGo
    86. * @date 2022/8/19 11:43
    87. */
    88. DishDto dishDto = dishService.getByIdWithFlavor(id);
    89. return R.success(dishDto);
    90. }
    91. @PutMapping
    92. // @PathVariable : 该注解可以用来提取url路径中传递的请求参数。
    93. public R update(@RequestBody DishDto dishDto){
    94. /**@Description: 修改菜品
    95. * @author LiBiGo
    96. * @date 2022/8/19 11:58
    97. */
    98. log.info(dishDto.toString());
    99. dishService.updateWithFlavor(dishDto);
    100. return R.success("新增菜品成功");
    101. }
    102. }

    4.4.6 功能测试

    代码编写完成之后,重启服务,然后按照前面分析的操作流程进行测试,查看数据是否正常修改即可。

  • 相关阅读:
    骗子查询系统源码
    通过海康私有协议Ehome/ISUP协议将海康摄像头、录像机等设备统一接入到LiveNVR Web流媒体平台实现统一汇聚及Web播放等的配置说明,
    Eclipse搭建struts2框架
    【广州华锐互动】VR营销心理学情景模拟培训系统介绍
    23、短信登录(基于redis实现共享session登录)
    面试官:字节流可以处理一切文件为什么还需要字符流呢?
    C++运算符总结,看这一篇就够了
    RK 平台安装 ubuntu 系统
    gradle缓存路径
    [NOIP 2022] 建造军营 题解
  • 原文地址:https://blog.csdn.net/qq_39237205/article/details/126422536