瑞吉外卖项目(超详细)

瑞吉外卖(六)

  • 瑞吉外卖(六)
      • 新增套餐
      • 套餐分页查询
      • 删除套餐

)

新增套餐

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

实体类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;//套餐idprivate Long setmealId;//菜品idprivate 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 {@Autowiredprivate SetmealDishService setmealDishService;//新增套餐保存套餐和菜品的关联关系@Override@Transactionalpublic 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 {@Autowiredprivate SetmealService setmealService;@Autowiredprivate 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);//分类idLong 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删除对应套餐。
General
Request URL: http: //localhost:8080/setmeal?ids=1414118011303899137Request Method:DELETE

2、删除多个套餐时,页面发送ajax请求,根据提交的多个套餐id删除对应套餐。

开发删除套餐功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
观察删除单个套餐和批量删除套餐的请求信息可以发现,两种请求的地址和请求方式都是相同的。不同的则是传递的id个数,所以在服务端可以提供一个方法来统一处理。

在SetmealService中添加一个方法removeWithDish

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

在SermeaServiceimpl中实现这个removeWithDish方法

    //删除套餐,同时需要删除套餐和菜品的关联数据@Override@Transactionalpublic 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("套餐数据删除成功");
}

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部