目录
一. 新增套餐
1.1 需求分析
1.2 数据模型
1.3 代码实现
二.套餐分页查询
三.套餐删除
四. 套餐批量起售与停售
一. 新增套餐
1.1 需求分析
首先,套菜就是菜品的集合,后台系统管理套餐信息,可以新增套餐信息,添加套餐时可以选择当前套餐所属的分类与包含的菜品,并且可以上传图片,移动端按照套餐分类来展示对应套餐。
?
1.2 数据模型
新增套餐,就是将新增页面录入的套餐信息插入到setmeal表中,同时还需要向setmeal_dish表中插入套餐与菜品关联的数据。
setmeal:套餐表
setmeal_dish:套餐菜品关联表
1.3 代码实现
代码开发前准备
- 实体类SetmealDish.java与Setmeal.java(参照)
- DTO SetmealDto.java页面数据交互对象
- Mapper接口SetmealDishMapper
- 业务层接口SetmealDishService?
- 业务层实现类SetmealDishServicelmpl
- 控制层SetmealController
SetmealDish.java
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;
}
?代码开发流程:
- 页面(backend/page/combo/add.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中
- 页面发送aiax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中
- 页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
- 页面发送请求进行图片上传,请求服务端将图片保存到服务器
- 页面发送请求进行图片下载,将上传的图片进行回显
- 点击保存按钮,发送ajax请求,将套餐相关数据以ison形式提交到服务端
开发新增套餐功能,其实就是在服务端编写代码去处理前端页面发送的这6次请求即可。
首先,添加套餐菜品,需要根据各菜品分类Id查出对应的菜品集合:
?在DishController.java添加如下代码实现此功能:
@GetMapping("/list")
public R<List<Dish>> list(Dish dish){
// 构造条件
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(dish.getCategoryId()!=null, Dish::getCategoryId, dish.getCategoryId());
// 添加排序条件
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
List<Dish> dishList = dishService.list(queryWrapper);
return R.success(dishList);
}
?添加功能实现SetmealServiceImpl.java
package com.itheima.reggie.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author jektong
* @date 2022年05月10日 19:47
*/
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
@Resource
private SetmealDishService setmealDishService;
/**
* 新增套餐以及新增套餐关联关系
*
* @param setmealDto
*/
@Override
@Transactional
public void saveWithDish(SetmealDto setmealDto) {
// 保存套餐基本信息 操作setmeal执行insert操作
this.save(setmealDto);
// 保存套餐与菜品的关联关系,操作setmeal_dish执行insert操作
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
setmealDishes.stream().map((item)->{
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
// 保存套餐与菜品的关联信息
setmealDishService.saveBatch(setmealDishes);
}
}
二.套餐分页查询
实现页面效果:
?
套餐的分页功能与上一节的功能差不多,在SetmealController.java中添加:
package com.itheima.reggie.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
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;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author jektong
* @date 2022年05月21日 1:07
*/
@RestController
@Slf4j
@RequestMapping("/setmeal")
public class SetmealController {
@Resource
private SetmealService setmealService;
@Resource
private SetmealDishService setmealDishService;
@Resource
private CategoryService categoryService;
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto) {
log.info("SetmealDto===>{}" + setmealDto);
setmealService.saveWithDish(setmealDto);
return R.success("套餐信息插入成功");
}
/**
* 套餐分页查询
*
* @param page
* @param pageSize
* @param name
* @return
*/
@PostMapping("/page")
public R<Page> page(int page, int pageSize, String name) {
//构建分页对象
Page<Setmeal> pageInfo = new Page<>(page, pageSize);
Page<SetmealDto> setmealDtoPage = new Page(page, pageSize);
// 构造条件
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper();
// 模糊查询
queryWrapper.like(StringUtils.isNotEmpty(name), Setmeal::getName, name);
// 时间降序
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setmealService.page(pageInfo, queryWrapper);
// 对象拷贝
BeanUtils.copyProperties(pageInfo, setmealDtoPage, "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());
setmealDtoPage.setRecords(list);
return R.success(setmealDtoPage);
}
}
三.套餐删除
?对于套餐删除有批量删除与单个删除,都是根据套餐ID去删除菜品的,通过一个方法处理即可
/**
* 根据ID删除套餐信息,同时删除所关联的菜品
*
* @param ids
*/
@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("套餐正在售卖,无法删除");
}
// 可以删除,先删除套餐表中数据
this.removeByIds(ids);
// 删除关系表中数据
LambdaQueryWrapper<SetmealDish> setmealDishLambdaQueryWrapper = new LambdaQueryWrapper<>();
setmealDishLambdaQueryWrapper.in(SetmealDish::getSetmealId, ids);
setmealDishService.remove(setmealDishLambdaQueryWrapper);
}
?需要注意的是需要删除对应的关联数据。
四. 套餐批量起售与停售
?API参照
在SetmealController.java中添加:
/**
* 套餐的起售与停售
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> onOrClose(@PathVariable Integer status, Long[] ids){
log.info("setmeal====>{},status==>{}" + ids +"====>" + status);
for (int i = 0; i < ids.length; i++) {
// 获取菜品
Setmeal setmeal = setmealService.getById(ids[i]);
setmeal.setStatus(status);
// 修改状态
setmealService.updateById(setmeal);
}
return R.success("修改成功");
}
|