个人名片:
本项目基于B站黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目。
视频链接【黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis
plus开发核心技术的真java实战项目】 https://www.bilibili.com/video/BV13a411q753?
点击观看
分析:setmeal地址,GET方式,page地址,page,pageSize属性
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.entity.Setmeal;
import com.itheima.reggie.service.ISetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* 套餐 前端控制器
*
*
* @author 酒徒
* @since 2022-09-04
*/
@RestController
@RequestMapping("/setmeal")
public class SetmealController {
@Autowired
private ISetmealService setmealService;
/**
* 页面显示
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
//页面构造器
Page<Setmeal> pageInfo = new Page<>(page, pageSize);
//查询setmeal表中所有信息
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setmealService.page(pageInfo, queryWrapper);
return R.success(pageInfo);
}
}
在此查询页面,发现一点小问题,套餐分类没有内容。也就是categoryName。
修改后代码如下
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.entity.SetmealDish;
import com.itheima.reggie.service.ICategoryService;
import com.itheima.reggie.service.ISetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 套餐 前端控制器
*
*
* @author 酒徒
* @since 2022-09-04
*/
@RestController
@RequestMapping("/setmeal")
public class SetmealController {
@Autowired
private ISetmealService setmealService;
@Autowired
private ICategoryService categoryService;
/**
* 页面显示
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
//页面构造器
Page<Setmeal> setmealPage = new Page<>(page, pageSize);
Page<SetmealDto> setmealDtoPage = new Page<>(page, pageSize);
//查询setmeal表中所有信息
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setmealService.page(setmealPage, queryWrapper);
//setmealDtoPage,将其加入setmealDtoPage
//1.拷贝setmealPage到setmealDtoPage
BeanUtils.copyProperties(setmealPage, setmealDtoPage);
//以流的形式设置每一个categoryName
List<Setmeal> records = setmealPage.getRecords();
List<SetmealDto> dtoList = records.stream().map((item) -> {
//通过categoryId查询categoryName
LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Category::getId, item.getCategoryId());
Category category = categoryService.getOne(wrapper);
//设置categoryName到setmealDto中
SetmealDto setmealDto = new SetmealDto();
setmealDto.setCategoryName(category.getName());
return setmealDto;
}).collect(Collectors.toList());
//添加categoryName
setmealDtoPage.setRecords(dtoList);
return R.success(setmealDtoPage);
}
}
相对于全部查询来说,多了一个name属性
if (name != null){
queryWrapper.like(Setmeal::getName, name);
}
完整代码如下:
/**
* 页面显示
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
//页面构造器
Page<Setmeal> setmealPage = new Page<>(page, pageSize);
Page<SetmealDto> setmealDtoPage = new Page<>(page, pageSize);
//查询setmeal表中所有信息
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
if (name != null){
queryWrapper.like(Setmeal::getName, name);
}
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setmealService.page(setmealPage, queryWrapper);
//setmealDtoPage,将其加入setmealDtoPage
//1.拷贝setmealPage到setmealDtoPage
BeanUtils.copyProperties(setmealPage, setmealDtoPage);
//以流的形式设置每一个categoryName
List<Setmeal> records = setmealPage.getRecords();
List<SetmealDto> dtoList = records.stream().map((item) -> {
//通过categoryId查询categoryName
LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Category::getId, item.getCategoryId());
Category category = categoryService.getOne(wrapper);
//设置categoryName到setmealDto中
SetmealDto setmealDto = new SetmealDto();
setmealDto.setCategoryName(category.getName());
//拷贝setmeal的信息到SetmealDto中
BeanUtils.copyProperties(item, setmealDto);
return setmealDto;
}).collect(Collectors.toList());
//添加categoryName
setmealDtoPage.setRecords(dtoList);
return R.success(setmealDtoPage);
}
分析:dish地址,GET方式,list地址,categoryId属性
/**
* 套餐——新增套餐——套餐菜品显示
* @param categoryId
* @return
*/
@GetMapping("/list")
public R<List<Dish>> list(@PathParam("categoryId") Long categoryId){
//根据categoryId查询菜品名
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Dish::getCategoryId, categoryId)
.eq(Dish::getStatus, 1)
.orderByAsc(Dish::getSort)
.orderByDesc(Dish::getUpdateTime);
List<Dish> list = dishService.list(queryWrapper);
return R.success(list);
}
分析:setmeal地址,POST方式
/**
* 新建套餐——保存
* @param request
* @param setmealDto
* @return
*/
@PostMapping
public R<String> setmeal(HttpServletRequest request, @RequestBody SetmealDto setmealDto){
//log.info("setmealDto:{}",setmealDto);//setmealDto:SetmealDto(setmealDishes=[SetmealDish(id=null, setmealId=null, dishId=1397851668262465537, name=口味蛇, price=16800, copies=1, sort=null, createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), categoryName=null)
//添加创建时间和修改时间
setmealDto.setCreateTime(LocalDateTime.now());
setmealDto.setUpdateTime(LocalDateTime.now());
//添加创建人和修改人
Long empId = (Long) request.getSession().getAttribute("employee");
setmealDto.setCreateUser(empId);
setmealDto.setUpdateUser(empId);
setmealService.saveWithSetmealDto(request,setmealDto);
return R.success("新增套餐成功");
}
在ISetmealService中创建saveWithSetmealDto方法
void saveWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);
在ISetmealServiceImpl中实现方法
@Override
public void saveWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto) {
//1.保存Setmeal
this.save(setmealDto);
//2.设置SetmealDish setmealId=null createTime=null, updateTime=null, createUser=null, updateUser=null
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
setmealDishes = setmealDishes.stream().map((item) -> {
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
setmealDishService.saveBatch(setmealDishes);
}
分析:setmeal地址,GET方式,id地址
页面包括套餐的基本信息,和套餐菜品。也就是Setmeal和SetmealDish。即SetmealDto。
/**
* 修改——信息回显
* @param id
* @return
*/
@GetMapping("/{id}")
public R<SetmealDto> list(@PathVariable Long id){
//测试是否能接受(套餐表)id信息
log.info("id:{}",id);
SetmealDto setmealDto = setmealService.getSetmealDto(id);
return R.success(setmealDto);
}
在ISetmealService中创建getSetmealDto方法
SetmealDto getSetmealDto(Long id);
在ISetmealServiceImpl中实现此方法
/**
* 套餐修改——信息回显
* @param id
* @return
*/
@Override
public SetmealDto getSetmealDto(Long id) {
//1.根据id查询setmeal表信息
Setmeal setmeal = setmealService.getById(id);
//2.将setmeal的信息赋值到SetmealDto中
SetmealDto setmealDto = new SetmealDto();
BeanUtils.copyProperties(setmeal, setmealDto);
//3.查询套餐菜品 多个菜品 流
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SetmealDish::getSetmealId, id);
List<SetmealDish> list = setmealDishService.list(queryWrapper);
//键菜品信息设置到SetmealDto中
setmealDto.setSetmealDishes(list);
return setmealDto;
}
分析:setmeal地址,PUT方式
(注意:和前面修改菜品相同_)_查询数据库中的setmeal_dish表,发现表格为空。所以修改套餐菜品就是保存套餐菜品到setmeal_dish表中,但要注意先删除原有的套餐菜品.
/**
* 修改——保存
* @param request
* @param setmealDto
* @return
*/
@PutMapping
public R<String> setmeals(HttpServletRequest request, @RequestBody SetmealDto setmealDto){
log.info("setmealDto:{}",setmealDto);//setmealDto:SetmealDto(setmealDishes=[SetmealDish(id=null, setmealId=null, dishId=1397851668262465537, name=口味蛇, price=16800, copies=1, sort=null, createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), categoryName=null)
setmealDto.setUpdateTime(LocalDateTime.now());
setmealService.updateWithSetmealDto(request, setmealDto);
return R.success("修改成功");
}
在ISetmealService中创建getSetmealDto方法
void updateWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);
在ISetmealServiceImpl中实现此方法
/**
* 套餐修改——保存
* @param request
* @param setmealDto
*/
@Override
public void updateWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto) {
//1.保存setmeal
setmealService.updateById(setmealDto);
//2.删除setmeald中所有的套餐菜品
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
setmealDishService.remove(queryWrapper);
//3.保存setmealDish
//批量修改setmealdish setmealId=null, createTime=null, updateTime=null, createUser=null, updateUser=null
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
setmealDishes = setmealDishes.stream().map((item) -> {
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
//修改
setmealDishService.saveBatch(setmealDishes);
}
分析:setmeal地址,POST方式,status,{status}地址,ids属性
/**
* 单个停售与起售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable int status, @PathParam("ids") Long ids){
log.info("status,{},ids:{}",status,ids);
//1.根据ids查询setmeal信息
Setmeal setmeal = setmealService.getById(ids);
//2.修改状态码
setmeal.setStatus(status);
//3.修改setmeal
setmealService.updateById(setmeal);
if (status == 0){
return R.success("停售成功");
}else if (status == 1){
return R.success("起售成功");
}else {
return R.success("状态码异常");
}
}
相对于单个而言,需要查询多个ids。
与菜品管理中修改完全相同。(这里就不解释了)
/**
* 批量停售与起售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable int status, @RequestParam("ids") List<Long> ids){
log.info("status,{},ids:{}",status,ids);
//1.根据ids查询所有setmeal信息
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Setmeal::getId, ids);
List<Setmeal> list = setmealService.list(queryWrapper);
//2.批量修改状态码
for (Setmeal setmeal : list) {
setmeal.setStatus(status);
//3.批量修改setmeal
setmealService.updateById(setmeal);
}
if (status == 0){
return R.success("停售成功");
}else if (status == 1){
return R.success("起售成功");
}else {
return R.error("状态码异常");
}
}
分析:setmeal地址,DELETE方式,ids属性
/**
* 删除
* @param ids
* @return
*/
@DeleteMapping
public R<String> setmeal(@PathParam("ids") Long ids){
//根据id删除
setmealService.removeById(ids);
return R.success("删除成功");
}
相对于单个而言,需要查询多个ids。这里就不多说了。
/**
* 批量删除
* @param ids
* @return
*/
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
//根据id删除
setmealService.removeByIds(ids);
return R.success("删除成功");
}
检查数据库,发现套餐菜品没有删除。
/**
* 批量删除
* @param ids
* @return
*/
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
//根据id查询setmealdish表中对应的信息
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SetmealDish::getSetmealId, ids);
setmealDishService.remove(queryWrapper);
//根据id删除
setmealService.removeByIds(ids);
return R.success("删除成功");
}
老是粗心,刚刚删除时看到在起售状态竟然也成功删除了。做出修改。
/**
* 批量删除——补充口味删除
* @param ids
* @return
*/
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
//判断setmeal状态
//根据ids获取所有的setmeal信息
LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
wrapper.in(Setmeal::getId, ids);
List<Setmeal> list = setmealService.list();
//判断每一个status 如果都为0,可以删除。
boolean flag = true;
for (Setmeal setmeal : list) {
if (setmeal.getStatus() == 1){
flag = false;
}
}
if (flag){
//根据id查询setmealdish表中对应的信息
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SetmealDish::getSetmealId, ids);
setmealDishService.remove(queryWrapper);
//根据id删除
setmealService.removeByIds(ids);
return R.success("删除成功");
}else {
return R.error("存在正在售卖套餐,删除失败");
}
}