当前位置: 首页 > news >正文

苍穹外卖项目实战(日记十三)-记录实战教程及问题的解决方法-(day3-5) 修改菜品功能实现

修改菜品功能

(1)需求分析与设计

(2)DishController完善

文件位置:sky-server/src/main/java/com/sky/controller/admin/DishController.java

文件完整代码:

package com.sky.controller.admin;import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/admin/dish")
@Api(tags = "后台菜品管理")
@Slf4j
public class DishController {@Autowiredprivate DishService dishService;/*** 新增菜品* @param dishDTO* @return*/@PostMapping@ApiOperation(value = "新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}", dishDTO);dishService.saveWithFlavors(dishDTO);return Result.success();}/*** 分页查询菜品* @param dishPageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("分页查询菜品")public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO){log.info("分页查询菜品:{}", dishPageQueryDTO);PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);return Result.success(pageResult);}/*** 删除菜品* @param ids* @return*/@DeleteMapping@ApiOperation("批量删除菜品")public Result delete(@RequestParam List<Long> ids){log.info("删除菜品:{}", ids);dishService.deleteBatch(ids);return Result.success();}/*** 根据ID查询菜品详情* @param id* @return*/@GetMapping("/{id}")@ApiOperation("根据ID查询菜品详情")public Result<DishVO> getById(@PathVariable Long id){log.info("查询菜品:{}", id);DishVO dishVO = dishService.getByIdWithFlavors(id);return Result.success(dishVO);}@PutMapping@ApiOperation("更新菜品")public Result update(@RequestBody DishDTO dishDTO){log.info("更新菜品:{}", dishDTO);dishService.updateWithFlavors(dishDTO);return Result.success();}
}

添加的功能代码:

/*** 根据ID查询菜品详情* @param id* @return*/
@GetMapping("/{id}")
@ApiOperation("根据ID查询菜品详情")
public Result<DishVO> getById(@PathVariable Long id){log.info("查询菜品:{}", id);DishVO dishVO = dishService.getByIdWithFlavors(id);return Result.success(dishVO);
}@PutMapping
@ApiOperation("更新菜品")
public Result update(@RequestBody DishDTO dishDTO){log.info("更新菜品:{}", dishDTO);dishService.updateWithFlavors(dishDTO);return Result.success();
}

示意图:

(3)DishService完善

文件位置:sky-server/src/main/java/com/sky/service/DishService.java

文件完整代码:

package com.sky.service;import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.vo.DishVO;import java.util.List;public interface DishService {// 新增菜品及其配料信息public void saveWithFlavors(DishDTO dishDTO);/*** 分页查询菜品信息* @param dishPageQueryDTO* @return*/PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);/*** 根据ID删除菜品信息* @param ids*/void deleteBatch(List<Long> ids);/**** 根据ID查询菜品详情及其配料信息* @param id* @return*/DishVO getByIdWithFlavors(Long id);/*** 更新菜品及其配料信息* @param dishDTO*/void updateWithFlavors(DishDTO dishDTO);
}

添加的功能代码:

    /**** 根据ID查询菜品详情及其配料信息* @param id* @return*/DishVO getByIdWithFlavors(Long id);/*** 更新菜品及其配料信息* @param dishDTO*/void updateWithFlavors(DishDTO dishDTO);

示意图:

(4)DishServiceimpl完善

文件位置:sky-server/src/main/java/com/sky/service/impl/DishServiceimpl.java

完整代码文件:

package com.sky.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.entity.DishFlavor;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.DishFlavorMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealDishMapper;
import com.sky.result.PageResult;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Slf4j
public class DishServiceimpl implements DishService {@Autowiredprivate DishMapper dishMapper;@Autowiredprivate DishFlavorMapper dishFlavorMapper;@Autowiredprivate SetmealDishMapper setmealDishMapper;/*** 保存菜品及其配料信息** @param dishDTO*/@Transactionalpublic void saveWithFlavors(DishDTO dishDTO) {Dish dish = new Dish();//将dto对象中的属性复制到dish对象中BeanUtils.copyProperties(dishDTO, dish);//向dish表中插入1条菜品信息dishMapper.insert(dish);//获取刚插入的菜品的idLong dishId = dish.getId();//向dish_flavor表中插入N个配料信息List<DishFlavor> flavors = dishDTO.getFlavors();//判断是否有配料信息if (flavors != null && flavors.size() > 0) {//给配料信息设置dish_idflavors.forEach(dishflavor -> {dishflavor.setDishId(dishId);});//向dish_flavor表中插入N条配料信息dishFlavorMapper.insertBatch(flavors);}}/*** 分页查询菜品信息** @param dishPageQueryDTO* @return*/public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);return new PageResult(page.getTotal(), page.getResult());}/*** 根据ID批量删除菜品信息** @param ids*/@Transactional//由于涉及到多个表的操作,需要使用事务注解,保证删除操作的原子性public void deleteBatch(List<Long> ids) {//判断当前菜品是否能够被删除-是否存在起售中的菜品for (Long id : ids) {Dish dish = dishMapper.getByID(id);if (dish.getStatus() == StatusConstant.ENABLE) {//抛出异常,提示菜品已上架,不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);}}//是否被关联List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishId(ids);if (setmealIds != null && setmealIds.size() > 0) {//抛出异常,提示菜品已关联套餐,不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);}//方法一://删除菜品信息
//        for (Long id : ids) {
//            dishMapper.deleteByID(id);
//            //删除菜品口味信息
//            dishFlavorMapper.deleteByDishId(id);
//        }//方法二://sql:delete from dish where id in (?,?,?)//批量删除菜品信息dishMapper.deleteByIDs(ids);//sql:delete from dishFlavor where dish_id in (?,?,?)//批量删除菜品口味信息dishFlavorMapper.deleteByDishIds(ids);}/*** 根据ID查询菜品及其配料信息* @param id* @return*/public DishVO getByIdWithFlavors(Long id) {//根据ID查询菜品Dish dish = dishMapper.getByID(id);//根据id查询菜品口味信息List<DishFlavor> dishflavors = dishFlavorMapper.getByDishId(id);//将菜品和菜品口味信息封装到DishVO对象中DishVO dishVo = new DishVO();BeanUtils.copyProperties(dish, dishVo);//将dish对象中的属性复制到dishVo对象中dishVo.setFlavors(dishflavors);//将dishflavors列表复制到dishVo对象中return dishVo;}/*** 更新菜品及其配料信息* @param dishDTO*/public void updateWithFlavors(DishDTO dishDTO) {Dish dish = new Dish();BeanUtils.copyProperties(dishDTO, dish);//更新菜品信息dishMapper.update(dish);//删除原有的菜品口味信息dishFlavorMapper.deleteByDishId(dishDTO.getId());//插入新的菜品口味信息List<DishFlavor> flavors = dishDTO.getFlavors();if (flavors != null && flavors.size() > 0) {flavors.forEach(dishflavor -> {dishflavor.setDishId(dishDTO.getId());});//向dish_flavor表中插入N条配料信息dishFlavorMapper.insertBatch(flavors);}}
}

添加的功能代码:

/*** 根据ID查询菜品及其配料信息* @param id* @return*/
public DishVO getByIdWithFlavors(Long id) {//根据ID查询菜品Dish dish = dishMapper.getByID(id);//根据id查询菜品口味信息List<DishFlavor> dishflavors = dishFlavorMapper.getByDishId(id);//将菜品和菜品口味信息封装到DishVO对象中DishVO dishVo = new DishVO();BeanUtils.copyProperties(dish, dishVo);//将dish对象中的属性复制到dishVo对象中dishVo.setFlavors(dishflavors);//将dishflavors列表复制到dishVo对象中return dishVo;
}/*** 更新菜品及其配料信息* @param dishDTO*/
public void updateWithFlavors(DishDTO dishDTO) {Dish dish = new Dish();BeanUtils.copyProperties(dishDTO, dish);//更新菜品信息dishMapper.update(dish);//删除原有的菜品口味信息dishFlavorMapper.deleteByDishId(dishDTO.getId());//插入新的菜品口味信息List<DishFlavor> flavors = dishDTO.getFlavors();if (flavors != null && flavors.size() > 0) {flavors.forEach(dishflavor -> {dishflavor.setDishId(dishDTO.getId());});//向dish_flavor表中插入N条配料信息dishFlavorMapper.insertBatch(flavors);}
}

示意图:

(5)DishMapper.java完善

文件位置:sky-server/src/main/java/com/sky/mapper/DishMapper.java

文件完整代码:

package com.sky.mapper;import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import com.sky.vo.DishVO;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);/*** 插入菜品* @param dish*/@AutoFill(value = OperationType.INSERT)//指定数据库操作类型为INSERTvoid insert(Dish dish);/*** 更新菜品* @param dishPageQueryDTO* @return*/Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);/*** 根据id查询菜品* @param id* @return*/@Select("select * from dish where id = #{id}")Dish getByID(Long id);/*** 根据id删除菜品* @param id*/@Delete("delete from dish where id = #{id}")void deleteByID(Long id);/*** 根据ids删除菜品* @param ids*/void deleteByIDs(List<Long> ids);/*** 更新菜品* @param dish*/@AutoFill(value = OperationType.UPDATE)void update(Dish dish);
}

添加的功能代码:

/*** 根据ids删除菜品* @param ids*/
void deleteByIDs(List<Long> ids);/*** 更新菜品* @param dish*/
@AutoFill(value = OperationType.UPDATE)
void update(Dish dish);

示意图:

(6)DishMapper.xml完善

文件位置:sky-server/src/main/resources/mapper/DishMapper.xml

文件完整代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into dish(name, category_id, price, image, description,create_time, update_time, create_user, update_user)values(#{name}, #{categoryId}, #{price}, #{image}, #{description},#{createTime}, #{updateTime}, #{createUser}, #{updateUser})</insert><update id="update">update dish<set><if test="name != null">name = #{name},</if><if test="categoryId != null">category_id = #{categoryId},</if><if test="price != null">price = #{price},</if><if test="image != null">image = #{image},</if><if test="description != null">description = #{description},</if><if test="status != null">status = #{status},</if><if test="updateTime != null">update_time = #{updateTime},</if><if test="updateUser != null">update_user = #{updateUser},</if></set>where id = #{id}</update><delete id="deleteByIDs">delete from dish where id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></delete><select id="pageQuery" resultType="com.sky.vo.DishVO">select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id<where><if test="name != null">and d.name like concat('%', #{name}, '%')</if><if test="categoryId != null">and d.category_id = #{categoryId}</if><if test="status != null">and d.status = #{status}</if></where>order by d.create_time desc</select>
</mapper>

添加的功能代码:

<update id="update">update dish<set><if test="name != null">name = #{name},</if><if test="categoryId != null">category_id = #{categoryId},</if><if test="price != null">price = #{price},</if><if test="image != null">image = #{image},</if><if test="description != null">description = #{description},</if><if test="status != null">status = #{status},</if><if test="updateTime != null">update_time = #{updateTime},</if><if test="updateUser != null">update_user = #{updateUser},</if></set>where id = #{id}
</update><delete id="deleteByIDs">delete from dish where id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>

示意图:

(7)DishFlavorMapper.java完善

文件位置:sky-server/src/main/java/com/sky/mapper/DishFlavorMapper.java

文件完整代码:

package com.sky.mapper;import com.sky.entity.DishFlavor;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface DishFlavorMapper {/*** 批量插入菜品配料信息* @param flavors*/void insertBatch(List<DishFlavor> flavors);/*** 根据id删除菜品配料信息* @param dishId*/@Delete("DELETE FROM dish_flavor WHERE dish_id = #{dishId}")void deleteByDishId(Long dishId);/*** 根据菜品id集合批量删除菜品配料信息* @param ids*/void deleteByDishIds(List<Long> ids);/*** 根据菜品id查询菜品配料信息* @param dishId* @return*/@Select("SELECT * FROM dish_flavor WHERE dish_id = #{dishId}")List<DishFlavor> getByDishId(Long dishId);
}

添加的功能代码:

    /*** 根据菜品id集合批量删除菜品配料信息* @param ids*/void deleteByDishIds(List<Long> ids);/*** 根据菜品id查询菜品配料信息* @param dishId* @return*/@Select("SELECT * FROM dish_flavor WHERE dish_id = #{dishId}")List<DishFlavor> getByDishId(Long dishId);
}

示意图:

DishFlavorMapper

(8)DishFlavorMapper.xml完善

文件位置:sky-server/src/main/resources/mapper/DishFlavorMapper.xml

文件完整代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishFlavorMapper"><insert id="insertBatch">insert into dish_flavor (dish_id, name, value) VALUES<foreach collection="flavors" item="df" separator=",">(#{df.dishId},#{df.name},#{df.value})</foreach></insert><delete id="deleteByDishIds">delete from dish_flavor where dish_id<foreach collection="dishIds" open="(" separator="," close=")" item="dishId">#{dishId}</foreach></delete></mapper>

添加的功能代码:

<delete id="deleteByDishIds">delete from dish_flavor where dish_id<foreach collection="dishIds" open="(" separator="," close=")" item="dishId">#{dishId}</foreach>
</delete>

示意图:

(9)测试功能

打开前端网页:菜品管理

点击任意选择一个菜品,如平菇豆腐汤,点击“修改”,添加口味信息,点击保存

返回后端控制台,查看相关返回信息,我们能发现对应的添加数据,直接跳过断点

查看菜单,内容已修改

至此,修改菜品功能已完成!

http://www.dtcms.com/a/362336.html

相关文章:

  • C# FlaUI win 自动化框架,介绍
  • 用只能以关键字指定和只能按位置传入的参数来设计清晰的接口(Effective Python 第25条)
  • 利用 DrissionPage 精准获取淘宝商品描述:Python 爬虫实战指南
  • shell之扩展
  • 奇瑞QQ的后轮制动器设计cad+三维图+设计说明书
  • 【Java】谈谈IdentityHashMap
  • 前阿里专家揭秘:你对中国十大GEO专家的认知,99%都是错的
  • 苹果ipa应用安装包ios系统闪退问题
  • 携程旅行网景区,评论数据爬虫项目数据库保存附源码
  • 需求工程——你真的懂吗
  • C 基础(1) - 初识C语言
  • 在Docker容器中运行Windows:Dockur Windows项目全面解析
  • 机器翻译:python库PyGTranslator的详细使用
  • 身份证识别及信息核验 API 对接说明
  • 手写MyBatis第47弹:Interceptor接口设计与Invocation上下文传递机制--MyBatis动态代理生成与方法拦截的精妙实现
  • AI公共数据分析完整实战教程:从原始数据到商业洞察【网络研讨会完整回放】
  • AR-LSAT 推理任务全解析:从逻辑推理到类比推理的挑战
  • 【WIFI电表】物联网无线通讯光伏储能三相单相智能电表
  • 【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解
  • Hello World背后的秘密:详解 C++ 编译链接模型
  • FPGA|Quartus II 中pll IP核的具体使用方法
  • Redis 的链表:像智能文件夹一样灵活的列表结构
  • 【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]
  • FDTD_梯度波导学习(1)
  • 8.5 循环神经网络的从零开始实现
  • 二维元胞自动机:从生命游戏到自复制系统的计算宇宙
  • AI 安全与伦理:当大模型拥有 “决策能力”,我们该如何建立技术边界与监管框架?
  • Spring Cloud ------ Gateway
  • h5实现内嵌微信小程序支付宝 --截图保存海报分享功能
  • vmware中linux虚拟机提示磁盘空间不足