瑞吉外卖项目(超详细)

简介: 新增套餐在开发业务功能前,先将需要用到的类和接口基本结构创建好:实体类SetmealDish

新增套餐

在开发业务功能前,先将需要用到的类和接口基本结构创建好:

实体类SetmealDish

package com.itheima.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;
}

DTO SetmealDto

package com.itheima.reggie.dto;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import lombok.Data;
import java.util.List;
@Data
public class SetmealDto extends Setmeal {
    private List<SetmealDish> setmealDishes;
    private String categoryName;
}

Mapper接口SetmealDishMapper

package com.itheima.reggie.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.reggie.entity.SetmealDish;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SetmealDishMapper extends BaseMapper<SetmealDish> {
}


业务层接口SetmealDishService

package com.itheima.reggie.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Setmeal;
public interface SetmealService extends IService<Setmeal> {
    //新增套餐保存套餐和菜品的关联关系
public void saveWithDish(SetmealDto setmealDto);
}
}

业务层实现类SetmealDishServicelmpl

@Slf4j
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal>implements SetmealService {
  @Autowired
   private SetmealDishService setmealDishService;
    //新增套餐保存套餐和菜品的关联关系
    @Override
    @Transactional
    public void saveWithDish(SetmealDto setmealDto) {
//保存套餐的基本信息,操作setmeal,执行insert操作
   this.save(setmealDto);
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        setmealDishes.stream().map((item)->{
            item.setSetmealId(setmealDto.getId());
        return item;
        }).collect(Collectors.toList());
        //保存套餐和菜品的关联信息,操作setmeal——dish,执行insert操作
setmealDishService.saveBatch(setmealDishes);
    }
}

控制层SetmealController

//套餐管理
@RestController
@RequestMapping("setmeal")
@Slf4j
public class SetmealController {
    @Autowired
    private SetmealService setmealService;
    @Autowired
    private SetmealDishService setmealDishService;
    //新增套餐
    @PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
   log.info("套餐信息:{}",setmealDto);
  setmealService.saveWithDish(setmealDto);
    return R.success("新增套餐成功!");
}

在dishController里编写

    //根据条件查询对应菜品数据
@GetMapping("/list")
    public R<List<Dish>> list(Dish dish){
        //构造查询对象
    LambdaQueryWrapper<Dish> queryWrapper=new LambdaQueryWrapper<>();
    queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
   //查询状态为1的
    queryWrapper.eq(Dish::getStatus,1);
     //添加排序条件
    queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
    List<Dish> list = dishService.list(queryWrapper);
    return R.success(list);
    }

套餐分页查询

在开发代码之前,需要梳理一下套餐分页查询时前端页面和服务端的交互过程:

1、页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、 pageSize.name)提交到服务端,获取分页数据。

2、页面发送请求,请求服务端进行图片下载,用于页面图片展示。

开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。

//套餐分页查询
@GetMapping("/page")
public R<Page> page(int page,int pageSize,String name){
   //构造分页构造器
    Page<Setmeal> pageInfo=new Page<>(page,pageSize);
    Page<SetmealDto> dtoPage=new Page<>();
    LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();
    //添加查询条件 根据name进行like模糊查询
    queryWrapper.like(name!=null,Setmeal::getName,name);
    //添加排序条件,根据更新时间
    queryWrapper.orderByDesc(Setmeal::getUpdateTime);
     setmealService.page(pageInfo,queryWrapper);
//对象拷贝
    BeanUtils.copyProperties(pageInfo,dtoPage,"records");
    List<Setmeal> records = pageInfo.getRecords();
  List<SetmealDto> list=records.stream().map((item)->{
      SetmealDto setmealDto=new SetmealDto();
      //对象拷贝
      BeanUtils.copyProperties(item,setmealDto);
    //分类id
      Long categoryId= item.getCategoryId();
//根据分类id查询分类对象
      Category category= categoryService.getById(categoryId);
if (category!=null){
    //分类名称
    String categoryName=category.getName();
    setmealDto.setCategoryName(categoryName);
}
return setmealDto;
  }).collect(Collectors.toList());
dtoPage.setRecords(list);
    return R.success(dtoPage);
}

删除套餐

在开发代码之前,需要梳理一下删除套餐时前端页面和服务端的交互过程:

1、删除单个套餐时,页面发送ajax请求,根据套餐id删除对应套餐。


d4c55b82696048cda65e10e69292ead4.png


208a0cab4c0a47cda59987e5a7fb3afd.png

开发删除套餐功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。

观察删除单个套餐和批量删除套餐的请求信息可以发现,两种请求的地址和请求方式都是相同的。不同的则是传递的id个数,所以在服务端可以提供一个方法来统一处理。

在SetmealService中添加一个方法removeWithDish

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

在SermeaServiceimpl中实现这个removeWithDish方法

   //删除套餐,同时需要删除套餐和菜品的关联数据
    @Override
    @Transactional
    public void removeWithDish(List<Long> ids) {
     //查询套餐状态,确定是否可以删除
        LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper();
     queryWrapper.in(Setmeal::getId,ids);
     queryWrapper.eq(Setmeal::getStatus,1);
     int count=this.count(queryWrapper);
     if (count>0){
         // 如果不能删除,抛出一个业务异常
         throw new CustomException("套餐正在售卖中,不能删除");
     }
        //如果可以删除,先删除套餐表中的数据setmeal
this.removeByIds(ids);
        //删除关系表中的数据setmeal_dish
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
setmealDishService.remove(lambdaQueryWrapper);
    }

在SermealController中调用该removeWithDish方法

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

美好的一天到此结束,下次继续努力!

相关文章
|
18天前
|
Java 关系型数据库 MySQL
餐厅收银系统|基于SSM实现餐厅收银系统
餐厅收银系统|基于SSM实现餐厅收银系统
|
9月前
|
Python
项目商场储物柜
用python语言编写项目商场储物柜。
59 0
|
18天前
|
存储 安全 JavaScript
萌宠宜家商城系统
萌宠宜家商城系统
|
9月前
|
负载均衡 Java 数据库连接
瑞吉外卖项目
瑞吉外卖项目
65 0
|
SQL 缓存 JSON
瑞吉外卖笔记
这是一份写给自己的笔记,主要记录瑞吉外卖项目中自己没有了解过的知识点。我将按照功能来分别解析
671 1
|
12月前
|
Java 数据库连接 mybatis
瑞吉外卖项目(超详细)
公共字段自动填充 Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 实现步骤: 1、在实体类的属性上加入@TableField注解,指定自动填充的策略 2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口
|
12月前
|
SQL 前端开发 Java
学习瑞吉外卖项目
以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。基于流行的Spring Boot、mybatis plus等技术框架进行开发。 第一天: 设计产品原型。 新建数据库,导入sql文件。
|
移动开发 负载均衡 小程序