瑞吉外卖-Day5-功能开发(5)

功能开发-套餐管理功能

一、效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、新增套餐功能

2.1、需求分析

在这里插入图片描述

2.2、数据模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:菜品名称和价格直接放在关系表,方便使用,这个系统的所有关系表,一般集合的用途是新增,名字是输出

2.3、代码开发

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.1、SetmealDish实体类
package com.xxxit.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 套餐菜品关系
 */
@Data
public class SetmealDish implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;


    //套餐id
    private Long setmealId;


    //菜品id
    private Long dishId;


    //菜品名称 (冗余字段)
    private String name;

    //菜品原价
    private BigDecimal price;

    //份数
    private Integer copies;


    //排序
    private Integer sort;


    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;


    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;


    @TableField(fill = FieldFill.INSERT)
    private Long createUser;


    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;


    //是否删除
    private Integer isDeleted;
}

2.4.2、mapper,service,controller构建

Mapper

package com.xxxit.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xxxit.reggie.entity.SetmealDish;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SetmealDishMapper extends BaseMapper<SetmealDish> {
}

service

package com.xxxit.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xxxit.reggie.entity.SetmealDish;

public interface SetmealDishService extends IService<SetmealDish> {
}

ServiceImpl

package com.xxxit.reggie.service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxxit.reggie.entity.SetmealDish;
import com.xxxit.reggie.mapper.SetmealDishMapper;
import com.xxxit.reggie.service.SetmealDishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class SetmealDishServiceImpl extends ServiceImpl<SetmealDishMapper, SetmealDish> implements SetmealDishService {
}

Controller

package com.xxxit.reggie.controller;

import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;

}
2.4.3、根据菜品分类查询对应的菜品

DishController

package com.xxxit.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxit.reggie.common.R;
import com.xxxit.reggie.dto.DishDto;
import com.xxxit.reggie.entity.Category;
import com.xxxit.reggie.entity.Dish;
import com.xxxit.reggie.service.CategoryService;
import com.xxxit.reggie.service.DishFlavorService;
import com.xxxit.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 菜品管理
 */
@RestController
@Slf4j
@RequestMapping("/dish")
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private DishFlavorService dishFlavorService;


    @Autowired
    private CategoryService categoryService;

    /**
     * 新增菜品
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());

        // 保存菜品,直接存,向上转型
        dishService.saveWithFlavor(dishDto);

        return R.success("新增菜品成功");

    }

    /**
     * 查询菜品分页功能
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){
        log.info("获取菜品分页信息");

        // 构造分页构造器对象
        Page<Dish> pageInfo = new Page<>(page,pageSize);
        Page<DishDto> dishDtoPage = new Page<>();

        // 条件构造器
        LambdaQueryWrapper<Dish> DishQueryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件
        DishQueryWrapper.like(name != null,Dish::getName,name);
        // 添加排序添加
        DishQueryWrapper.orderByDesc(Dish::getUpdateTime);

        // 执行
        dishService.page(pageInfo,DishQueryWrapper);

        // 复制,忽略数据库数据,只拿页码数据条数
        BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");

        // 分类id改名字
        List<Dish> records = pageInfo.getRecords();
        List<DishDto> DishDtoRecords = records.stream().map((item) -> {
            // 把Dish的数据复制到dishDto
            DishDto dishDto = new DishDto();

            // 复制
            BeanUtils.copyProperties(item,dishDto);

            Long categoryId = item.getCategoryId();
            Category category = categoryService.getById(categoryId);
            String categoryName = category.getName();
            dishDto.setCategoryName(categoryName);

            return dishDto;
        }).collect(Collectors.toList());

        // 把数据放进页面
        dishDtoPage.setRecords(DishDtoRecords);

        return R.success(dishDtoPage);
    }

    /**
     * 根据id查询菜品信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> get(@PathVariable Long id){
        log.info("查询菜品信息:{}",id);
        DishDto dish = dishService.getByIdWithFlavor(id);
        return R.success(dish);
    }


    /**
     * 修改菜品
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());

        dishService.updateWithFlavor(dishDto);

        return R.success("新增菜品成功");
    }

    /**
     * 根据分类id查询对应菜品
     * @param dish
     * @return
     */
    @RequestMapping("/list")
    public R<List<Dish>> list(Dish dish){

        // 条件构建器
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 添加条件
        dishLambdaQueryWrapper.eq(Dish::getCategoryId,dish.getCategoryId());
        // 添加条件:启售
        dishLambdaQueryWrapper.eq(Dish::getStatus,1);
        // 添加排序条件
        dishLambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
        // 执行
        List<Dish> list = dishService.list(dishLambdaQueryWrapper);

        return R.success(list);
    }

}
2.4.4、新增套餐
SetmealDto
因为新增套餐时要同时操作套餐菜品关系表,所以要用dto接收数据
package com.xxxit.reggie.dto;

import com.xxxit.reggie.entity.Setmeal;
import com.xxxit.reggie.entity.SetmealDish;
import lombok.Data;
import java.util.List;

@Data
public class SetmealDto extends Setmeal {

    private List<SetmealDish> setmealDishes;

    private String categoryName;
}

SetmealService
因为过程比较复制,实现过程在service实现
package com.xxxit.reggie.service;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Setmeal;

public interface SetmealService extends IService<Setmeal> {

    // 新增套餐,同时保存套餐菜品关系数据
    public void saveWithDish(SetmealDto setmealDto);

}
SetmealServiceImpl
package com.xxxit.reggie.service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Setmeal;
import com.xxxit.reggie.entity.SetmealDish;
import com.xxxit.reggie.mapper.SetmealMapper;
import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealDishService setmealDishService;

    /**
     * 新增套餐的同时,保存套餐菜品数据
     * @param setmealDto
     */
    @Override
    public void saveWithDish(SetmealDto setmealDto) {

        // 保存套餐信息
        this.save(setmealDto);

        // 获取套餐菜品关系数据,把套餐id,放进套餐菜品关系实体
        // 1.套餐id
        Long setmealId = setmealDto.getId();
        // 2.获取菜品套餐关系信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        // 3.赋值
        setmealDishes.stream().map((item) -> {
            item.setSetmealId(setmealId);
            return item;
        }).collect(Collectors.toList());

        // 保存菜品套餐关系信息
        setmealDishService.saveBatch(setmealDishes);
    }
}
SetmealController
package com.xxxit.reggie.controller;

import com.xxxit.reggie.common.R;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("新增套餐信息:{}",setmealDto.toString());
        setmealService.saveWithDish(setmealDto);
        return R.success("新增成功");
    }

}

三、套餐分页查询功能

3.1、需求分析

在这里插入图片描述
在这里插入图片描述

3.2、代码开发

3.2.1、SetmealController
package com.xxxit.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxit.reggie.common.R;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Category;
import com.xxxit.reggie.entity.Setmeal;
import com.xxxit.reggie.service.CategoryService;
import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;

    @Autowired
    private CategoryService categoryService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("新增套餐信息:{}",setmealDto.toString());
        setmealService.saveWithDish(setmealDto);
        return R.success("新增成功");
    }

    /**
     * 分页查询功能
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){

        // 前端展示的套餐分类不是id而是名称所以用dto返回结果
        // 分页构造器
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        Page<SetmealDto> setmealDtoPage = new Page<>();

        // 条件构造器
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 添加条件
        setmealLambdaQueryWrapper.like(name != null,Setmeal::getName,name);
        setmealLambdaQueryWrapper.orderByDesc(Setmeal::getUpdateTime);

        setmealService.page(pageInfo,setmealLambdaQueryWrapper);

        // 复制页面信息,忽略数据库信息
        BeanUtils.copyProperties(pageInfo,setmealDtoPage,"records");

        // 赋值分类名称
        List<Setmeal> records = pageInfo.getRecords();
        List<SetmealDto> list = records.stream().map((item) -> {
            // Setmeal信息复制到SetmealDto
            SetmealDto setmealDto = new SetmealDto();
            BeanUtils.copyProperties(item,setmealDto);

            // 获取名字赋值
            Long categoryId = item.getCategoryId();
            Category category = categoryService.getById(categoryId);
            if (category != null){
                setmealDto.setCategoryName(category.getName());
            }

            return setmealDto;
        }).collect(Collectors.toList());

        // 设置数据库数据
        setmealDtoPage.setRecords(list);

        return R.success(setmealDtoPage);
    }
}

3.3、测试

四、套餐删除功能

4.1、需求分析

在这里插入图片描述
在这里插入图片描述

4.2、代码开发

4.2.1、SetmealService
package com.xxxit.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Setmeal;

import java.util.List;

public interface SetmealService extends IService<Setmeal> {

    // 新增套餐,同时保存套餐菜品关系数据
    public void saveWithDish(SetmealDto setmealDto);

    // 删除套餐,同时删除套餐菜品关系数据
    public void removeWithDish(List<Long> ids);

}
4.2.2、SetmealServiceImpl
package com.xxxit.reggie.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxxit.reggie.common.CustomException;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Setmeal;
import com.xxxit.reggie.entity.SetmealDish;
import com.xxxit.reggie.mapper.SetmealMapper;
import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealDishService setmealDishService;

    /**
     * 新增套餐的同时,保存套餐菜品数据
     * @param setmealDto
     */
    @Override
    public void saveWithDish(SetmealDto setmealDto) {

        // 保存套餐信息
        this.save(setmealDto);

        // 获取套餐菜品关系数据,把套餐id,放进套餐菜品关系实体
        // 1.套餐id
        Long setmealId = setmealDto.getId();
        // 2.获取菜品套餐关系信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        // 3.赋值
        setmealDishes.stream().map((item) -> {
            item.setSetmealId(setmealId);
            return item;
        }).collect(Collectors.toList());

        // 保存菜品套餐关系信息
        setmealDishService.saveBatch(setmealDishes);
    }

    /**
     * 删除套餐,同时删除套餐菜品关系数据
     * @param ids
     */
    @Override
    @Transactional
    public void removeWithDish(List<Long> ids) {
        // 查询套餐是否符合删除条件 select count(*) from setmeal where id in (1,2,3) and status = 1;
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealLambdaQueryWrapper.in(Setmeal::getId,ids);
        setmealLambdaQueryWrapper.eq(Setmeal::getStatus,1);

        // 执行
        int count = this.count(setmealLambdaQueryWrapper);

        // 如果不能删除,抛出一个业务异常
        if (count > 0){
            throw new CustomException("当前状态在售,不能删除");
        }

        // 可以删除
        this.removeByIds(ids);

        // 删除套餐中的菜品
        LambdaQueryWrapper<SetmealDish> setmealDishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        setmealDishLambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
        setmealDishService.remove(setmealDishLambdaQueryWrapper);

    }
}
4.2.3、SetmealServiceImpl
package com.xxxit.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxit.reggie.common.R;
import com.xxxit.reggie.dto.SetmealDto;
import com.xxxit.reggie.entity.Category;
import com.xxxit.reggie.entity.Setmeal;
import com.xxxit.reggie.service.CategoryService;
import com.xxxit.reggie.service.SetmealDishService;
import com.xxxit.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 套餐管理
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private SetmealDishService setmealDishService;

    @Autowired
    private CategoryService categoryService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("新增套餐信息:{}",setmealDto.toString());
        setmealService.saveWithDish(setmealDto);
        return R.success("新增成功");
    }

    /**
     * 分页查询功能
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){

        // 前端展示的套餐分类不是id而是名称所以用dto返回结果
        // 分页构造器
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        Page<SetmealDto> setmealDtoPage = new Page<>();

        // 条件构造器
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 添加条件
        setmealLambdaQueryWrapper.like(name != null,Setmeal::getName,name);
        setmealLambdaQueryWrapper.orderByDesc(Setmeal::getUpdateTime);

        setmealService.page(pageInfo,setmealLambdaQueryWrapper);

        // 复制页面信息,忽略数据库信息
        BeanUtils.copyProperties(pageInfo,setmealDtoPage,"records");

        // 赋值分类名称
        List<Setmeal> records = pageInfo.getRecords();
        List<SetmealDto> list = records.stream().map((item) -> {
            // Setmeal信息复制到SetmealDto
            SetmealDto setmealDto = new SetmealDto();
            BeanUtils.copyProperties(item,setmealDto);

            // 获取名字赋值
            Long categoryId = item.getCategoryId();
            Category category = categoryService.getById(categoryId);
            if (category != null){
                setmealDto.setCategoryName(category.getName());
            }

            return setmealDto;
        }).collect(Collectors.toList());

        // 设置数据库数据
        setmealDtoPage.setRecords(list);

        return R.success(setmealDtoPage);
    }

    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids){
        log.info("ids:{}",ids);
        setmealService.removeWithDish(ids);
        return R.success("套餐数据删除成功");
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值