瑞吉外卖
黑马程序员的一门SSM的入门项目,其中在其课程中的菜品业务讲解中,留下了让学员自主实现的几个功能,细分的话可以分为:单个菜品的 删除、启售、停售,批量菜品的 删除、启售、停售
实现流程(超详细)
说在前面,本文功能实现是作者拙见,不代表最佳,仅供学习。
下面会大概按照课程里面的理解来实现讲解
查看ajax请求
从前端界面查看 删除 和 状态修改所发送的ajax请求,得到路由和请求信息。
以删除为例,启停售原理相同(文章后附有全部代码):
page->food->list.html界面中,找到单个菜品的删除,批量删除。如代码所示,两者的单击事件都是deleteHandle(),有所不同的是传参的不同,单删,批量。
单删的时候直接把当前行的id传给函数
从deleteHandle()可以找出两种删除它们都是访问的deleteDish(),可以看到路由和访问方法
这里值得看的是我们要注意通用一个路由,两个删除的ids肯定是不同的,单个删除是Long ids,批量删除是checkList的字符串,我们就需要在后端处理。
明确参数
@DeleteMapping
public R<String> delete(String ids){
//如果单纯的用Long来接,ids会报错,批量删除肯定接不到,所以这里选用String
//log打印看看能否接收单个和批量
log.info("删除的ids: {}",ids);
return null;
}
log信息如图:
最终实现
我们明确我们的参数现在是String接收的,把每个id提取出来,自然能想到使用removeByIds()进行批量删除,单个删除也是批量,只不过批量大小是1。现在要处理removeByIds()可接受的参数。
直接贴上代码及注释
@DeleteMapping
public R<String> delete(String ids){
String[] split = ids.split(","); //将每个id分开
//每个id还是字符串,转成Long
List<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
dishService.removeByIds(idList);//执行批量删除
log.info("删除的ids: {}",ids);
return R.success("删除成功"); //返回成功
}
启、停售状态(分析如删除一样)
先附上代码,说几个比较值得注意的点
1.我们同样还是使用批量更新的方法updateBatchById(),接受的是一个Dish集合,而不是单单的id。以为需要根据实体类匹配数据库字段,更新每个Dish对象的值。
2.我们得到的id需要设置给每个Dish对象,并修改状态信息。
3.路径参数传过来的st,就是要修改的状态值,即我要让这些ids停售,st = 0,所以直接设置状态即可。
@PostMapping("/status/{st}")
public R<String> setStatus(@PathVariable int st, String ids){
//处理string 转成Long
String[] split = ids.split(",");
List<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
//将每个id new出来一个Dish对象,并设置状态
List<Dish> dishes = idList.stream().map((item) -> {
Dish dish = new Dish();
dish.setId(item);
dish.setStatus(st);
return dish;
}).collect(Collectors.toList()); //Dish集合
log.info("status ids : {}",ids);
dishService.updateBatchById(dishes);//批量操作
return R.success("操作成功");
}