瑞吉外卖项目实战Day04
一、添加菜品
进入添加菜品界面,会发出一个请求查询菜品分类
/**
* 根据条件查询分类数据
* @param category
* @return
*/
@GetMapping("/list")
public R<List<Category>> list(Category category){
//条件构造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加条件
queryWrapper.eq(category.getType() != null,Category::getType,category.getType());
//添加排序条件
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
List<Category> list = categoryService.list(queryWrapper);
return R.success(list);
}
上传图片:
在配置文件中定义保存文件的地址:
#自定义文件保存的路径
reggie:
path: D:\im
//文件的上传和下载
@RestController
@RequestMapping("/common")
public class CommonController {
@Value("${reggie.path}")
private String path;
//文件上传
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
//file是一个临时文件,需要转存,否则本次请求结束后就消失
//使用UUID随机生成文件名
//获取文件后缀
//获取原始文件名
String originalFilename = file.getOriginalFilename();
//截取后缀
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
String FileName = UUID.randomUUID().toString()+substring;
//需要判断path是否存在
File dir=new File(path);
if (!dir.exists()){
//目录不存在,需要创建
dir.mkdirs();
}
try {
file.transferTo(new File(path+FileName));
} catch (IOException e) {
e.printStackTrace();
}
//需要返回文件名,以便保存到数据库
return R.success(FileName);
}
下载图片
//文件下载
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
//输入流,读取文件内容
try {
FileInputStream fileInputStream=new FileInputStream(new File(path+name));
//输出流,将文件写回浏览器
//设置写回浏览器的文件格式
response.setContentType("image/jpeg");
byte[] bytes=new byte[1024];
int len=0;
ServletOutputStream outputStream = response.getOutputStream();
while ((len=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭流
fileInputStream.close();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
导入dish(菜品)实体类和dishflavor(口味)实体类
创建DishMapper和DishFlavorMapper
创建DishService,DishFlavorService和DishServiceImpl,DishFlavorServiceImpl
创建DishController
因为需要同时操作两张表
所以需要自定义一个方法完成数据的插入,并且需要添加事务
由于前端传过来的数据包括口味
我们需要重新创建一个实体类 DishDto
@Data
public class DishDto extends Dish {
private List<DishFlavor> flavors = new ArrayList<>();
private String categoryName;
private Integer copies;
}
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
@Autowired
private DishFlavorService dishFlavorService;
@Override
@Transactional
public void addDish(DishDto dishDto) {
//需要操作两张表
//向dish表中添加菜品
this.save(dishDto);
//向dishFlavor表中插入数据
//获取dish_id
Long id = dishDto.getId();
//获取口味
List<DishFlavor> flavors = dishDto.getFlavors();
//给口味对应的菜品id赋值
flavors =flavors.stream().map((item)->{
item.setDishId(id);
return item;
}).collect(Collectors.toList());
//添加到口味表中
dishFlavorService.saveBatch(flavors);
}
在DishController中调用这个方法,返回成功即可
二、分页查询
@GetMapping("/page")
public R<Page> selectByPage(int page,int pageSize,String name){
Page<Dish> pageDish=new Page<>(page,pageSize);
LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(name!=null,Dish::getName,name);
lambdaQueryWrapper.orderByAsc(Dish::getId);
dishService.page(pageDish,lambdaQueryWrapper);
return R.success(pageDish);
}
实现结果:
而DithDto中有个属性就是categoryName
@GetMapping("/page")
public R<Page> selectByPage(int page,int pageSize,String name){
Page<Dish> pageDish=new Page<>(page,pageSize);
LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(name!=null,Dish::getName,name);
lambdaQueryWrapper.orderByAsc(Dish::getId);
dishService.page(pageDish,lambdaQueryWrapper);
//复制分页,除了数据不复制
Page<DishDto> pageDishDto=new Page<>();
BeanUtils.copyProperties(pageDish,pageDishDto,"records");
//获取原来的分页数据
List<Dish> records = pageDish.getRecords();
List<DishDto> DishDtoRecords=records.stream().map((item)->{
//对其进行加工处理,
DishDto dishDto=new DishDto();
//复制数据
BeanUtils.copyProperties(item,dishDto);
Long id =item.getId();
Dish dish = dishService.getById(id);
if (dish!=null){
Long categoryId = dish.getCategoryId();
//得到分类名称
Category category = categoryService.getById(categoryId);
String categoryName = category.getName();
//设置dishDto中的分类名称
dishDto.setCategoryName(categoryName);
}
return dishDto;
}).collect(Collectors.toList());
pageDishDto.setRecords(DishDtoRecords);
return R.success(pageDishDto);
}
}
三、批量启售停售
前端发来的请求:
dishController中
//批量启售停售
@PostMapping("/status/{status}")
public R<String> update(@PathVariable int status,Long [] ids){
//修改对应id的状态为0
for (Long id:ids
) {
Dish dish = dishService.getById(id);
if (dish!=null&&dish.getIsDeleted()==0){
dish.setStatus(status);
dishService.updateById(dish);
}
else{
return R.error("菜品已经被删除了");
}
}
return R.success("修改成功");
}
}
四、批量删除
只有菜品处于停售状态才可删除
注意修改分页查询的条件(当菜品的isDeleted=1时)不展示该菜品
@DeleteMapping
public R<String> deleteByIds(Long[]ids){
int msg=0;//0表示删除失败,1表示删除成功
//判断是否是停售状态,只有停售状态才能删除
for (Long id:ids){
Dish dish = dishService.getById(id);
if (dish.getStatus()==1){
msg=0;
}
else{
dish.setIsDeleted(1);
dishService.updateById(dish);
msg=1;
}
}
return msg==1? R.success("删除成功"):R.error("该菜品处于启售状态,删除失败");
}
}