苍穹外卖项目实战(日记十六)-(day4-2) 批量删除套餐功能和根据id获取套餐功能实现-记录实战教程及问题的解决方法

批量删除套餐功能实现

(28)SetmealServiceImpl完善

位置:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java

添加的代码:

/**
 * 批量删除套餐
 * 1.删除套餐表数据
 * 2.删除套餐菜品表数据
 * 3.删除菜品表数据
 * @param ids
 */
@Transactional//由于涉及到三个表的操作,需要事务控制
public void delete(List<Long> ids) {
    //判断起售状态是否为0,如果为0,则不能删除
    ids.forEach(id -> {
        Setmeal setmeal = setmealMapper.getByID(id);
        if (setmeal.getStatus() == StatusConstant.ENABLE) {
            throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
        }
    });

    //判断是否有菜品关联了套餐,如果有,则不能删除
    ids.forEach(id -> {
    setmealMapper.deleteByIDs(ids);//删除套餐表数据
    setmealDishMapper.deleteBySetmealIds(ids);//删除套餐菜品表数据
    });
}

示意图:

(29)SetmealController完善

位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java

添加的代码:

/**
 * 批量删除套餐
 * @param ids
 * @return
 */
@DeleteMapping
@ApiOperation("批量删除套餐")
public Result delete(@RequestParam List<Long> ids) {
    log.info("批量删除套餐:{}", ids);
    setmealService.delete(ids);
    return Result.success();
}

示意图:

(30)SetmealService完善

位置:sky-server/src/main/java/com/sky/service/SetmealService.java

添加的代码:

/**
 * 根据id删除套餐
 * @param ids
 */
void delete(List<Long> ids);

示意图:

(31)SetmealDishMapper.xml完善

位置:sky-server/src/main/resources/mapper/SetmealDishMapper.xml

添加的代码:

<delete id="deleteBySetmealIds" parameterType="list">
    DELETE FROM setmeal_dish
    WHERE setmeal_id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

<select id="getDishIdsBySetmealIds" resultType="java.lang.Long">
    SELECT DISTINCT dish_id
    FROM setmeal_dish
    WHERE setmeal_id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

示意图:

(32)SetmealDishMapper.java完善

位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java

添加的代码:

/**
 * 根据套餐id删除套餐菜品
 * @param ids
 */
void deleteBySetmealIds(List<Long> ids);

/**
 * 根据套餐id获取菜品id
 * @param ids
 * @return
 */
List<Long> getDishIdsBySetmealIds(List<Long> ids);

示意图:

(33)SetmealMapper.java完善

位置:sky-server/src/main/java/com/sky/mapper/SetmealMapper.java

添加的代码:

/**
 *  根据id删除套餐
 * @param ids
 */
void deleteByIDs(List<Long> ids);

/**
 *  根据id查询套餐
 * @param id
 * @return
 */
@Select("select * from setmeal where id = #{id}")
Setmeal getByID(Long id);

示意图:

(34)SetmealMapper.xml完善

位置:sky-server/src/main/resources/mapper/SetmealMapper.xml

添加的代码:

<delete id="deleteByIDs">
    delete from setmeal
    where id in
    <foreach collection = "ids" item="id" index="index" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

示意图:

(35)功能测试

直接打开或调试项目,打开前端网页,选择需要删除的套餐,点击批量删除,删除成功则功能完成!

根据id获取套餐功能实现

(36)SetmealController

位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java

添加的代码:

/**
 * 根据id获取套餐
 * @param id
 * @return
 */
@GetMapping("/{id}")
@ApiOperation("根据id获取套餐")
public Result<SetmealVO> getById(@PathVariable("id") Long id){
    log.info("根据id获取套餐:{}", id);
    SetmealVO setmealVO = setmealService.getById(id);
    return Result.success(setmealVO);
}

示意图:

(37)SetmealService

位置:sky-server/src/main/java/com/sky/service/SetmealService.java

添加的代码:

/**
 * 根据id获取套餐详情
 * @param id
 * @return
 */
SetmealVO getById(Long id);

示意图:

(38)MessageConstant和SetmealServiceImpl

位置1:sky-common/src/main/java/com/sky/constant/MessageConstant.java

添加代码:

public static final String SETMEAL_NOT_FOUND = "套餐不存在";

示意图:

位置2:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java

添加的代码:

/**
 * 根据id查询套餐详情和菜品信息
 * @param id
 * @return
 */
public SetmealVO getById(Long id) {
    //查询套餐信息,如果没有该菜品,则抛出异常
    Setmeal setmeal = setmealMapper.getByID(id);
    if (setmeal == null) {
        throw new SetmealEnableFailedException(MessageConstant.SETMEAL_NOT_FOUND);
    }
 
    //查询套餐菜品信息
    List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);
 
    //创建套餐vo对象
    SetmealVO setmealVO = new SetmealVO();
    BeanUtils.copyProperties(setmeal, setmealVO);
 
    //设置套餐菜品信息
    setmealVO.setSetmealDishes(setmealDishes);
 
    return setmealVO;
}

示意图:

(39)SetmealDishMapper.java

位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java

添加的代码:

/**
 * 根据id获取套餐及菜品关联关系
 * @param id
 * @return
 */
@Select("SELECT * FROM setmeal_dish WHERE id = #{id}")
List<SetmealDish> getBySetmealId(Long id);

示意图:

(40)功能测试

打开Swagger测试文档:苍穹外卖项目接口文档

查看数据库,找到套餐对应的id号,并输入到参数值中,如“32”,查看相应内容是否有对应的套餐信息,有则成功!

最后输入一个,数据库中没有的套餐id,如“1”,借此判断是否能正确抛出异常,

(41)SetmealController完善

位置:sky-server/src/main/java/com/sky/controller/admin/SetmealController.java

添加的代码:

/**
 * 更新套餐
 * @param setmealDTO
 * @return
 */
@PutMapping
@ApiOperation("更新套餐")
public Result Update(@RequestBody SetmealDTO setmealDTO) {
    log.info("更新套餐:{}", setmealDTO);
    setmealService.update(setmealDTO);
    return Result.success();
}

示意图:

(42)SetmealService完善

位置:sky-server/src/main/java/com/sky/service/SetmealService.java

添加的代码:

/**
 * 更新套餐
 * @param setmealDTO
 */
void update(SetmealDTO setmealDTO);

示意图:

(43)SetmealServiceImpl完善

位置:sky-server/src/main/java/com/sky/service/impl/SetmealServiceImpl.java

添加的代码:

/**
 * 修改套餐
 * @param setmealDTO
 */
@Transactional
public void update(SetmealDTO setmealDTO) {
    Setmeal setmeal = new Setmeal();
    BeanUtils.copyProperties(setmealDTO, setmeal);
 
    //1、修改套餐表,执行update
    setmealMapper.update(setmeal);
 
    //套餐id
    Long setmealId = setmealDTO.getId();
 
    //2、删除套餐和菜品的关联关系,操作setmeal_dish表,执行delete
    setmealDishMapper.deleteBySetmealId(setmealId);
 
    //获取套餐菜品dto列表
    List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
 
    //执行循环,设置套餐id,然后保存到数据库,作用为保存套餐菜品的关联关系
    setmealDishes.forEach(setmealDish -> {
        setmealDish.setSetmealId(setmealId);
    });
 
    //3、重新插入套餐和菜品的关联关系,操作setmeal_dish表,执行insert
    setmealDishMapper.insertBatch(setmealDishes);
}

示意图:

(44)SetmealDishMapper.java完善

位置:sky-server/src/main/java/com/sky/mapper/SetmealDishMapper.java

添加的代码:

/**
 * 根据套餐id删除套餐菜品
 * @param setmealId
 */
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);

示意图:

(45)功能测试

调试或者直接启动项目,打开前端网页,找到以下位置,任意选择一个套餐,点击“修改”,任意输入修改的数据,点击保存,跳出修改成功的信息,则说明功能完成!

查看数据库,数据库已发生变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值