而对于以上的前4个功能我们都已经实现, 所以我们接下来需要开发的功能主要是最后两项, 具体的请求信息如下:
1). 根据分类ID查询菜品列表
请求 | 说明 |
请求方式 | GET |
请求路径 | /dish/list |
请求参数 | ?categoryId=1397844263642378242 |
2). 保存套餐信息
请求 | 说明 |
请求方式 | POST |
请求路径 | /setmeal |
请求参数 | json格式数据 |
传递的json格式数据如下:
{ "name":"营养超值工作餐", "categoryId":"1399923597874081794", "price":3800, "code":"", "image":"9cd7a80a-da54-4f46-bf33-af3576514cec.jpg", "description":"营养超值工作餐", "dishList":[], "status":1, "idType":"1399923597874081794", "setmealDishes":[ {"copies":2,"dishId":"1423329009705463809","name":"米饭","price":200}, {"copies":1,"dishId":"1423328152549109762","name":"可乐","price":500}, {"copies":1,"dishId":"1397853890262118402","name":"鱼香肉丝","price":3800} ] }
1.5 代码开发
上面我们已经分析了接下来我们需要实现的两个功能,接下来我们就需要根据上述的分析,来完成具体的功能实现。
1.5.1 根据分类查询菜品
1.5.1.1 功能实现
在当前的需求中,我们只需要根据页面传递的菜品分类的ID(categoryId)来查询菜品列表即可,我们可以直接定义一个DishController的方法,声明一个Long类型的categoryId,这样做是没问题的。但是考虑到该方法的拓展性,我们在这里定义方法时,通过Dish这个实体来接收参数。
在DishController中定义方法list,接收Dish类型的参数:
在查询时,需要根据菜品分类categoryId进行查询,并且还要限定菜品的状态为起售状态(status为1),然后对查询的结果进行排序。
/*** 根据条件查询对应的菜品数据* @param dish* @return*/"/list") (publicR<List<Dish>>list(Dishdish){ //构造查询条件LambdaQueryWrapper<Dish>queryWrapper=newLambdaQueryWrapper<>(); 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); returnR.success(list); } ————————————————版权声明:本文为CSDN博主「陶然同学」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_45481821/article/details/126309868
1.5.1.2 功能测试
代码编写完毕,我们重新启动服务器,进行测试,可以通过debug断点跟踪的形式查看页面传递的参数封装情况,及响应给页面的数据信息。
1.5.2 保存套餐
1.5.2.1 功能实现
在进行套餐信息保存时,前端提交的数据,不仅包含套餐的基本信息,还包含套餐关联的菜品列表数据 setmealDishes。所以这个时候我们使用Setmeal就不能完成参数的封装了,我们需要在Setmeal的基本属性的基础上,再扩充一个属性 setmealDishes 来接收页面传递的套餐关联的菜品列表,而我们在准备工作中,导入进来的SetmealDto能够满足这个需求。
1). SetmealController中定义方法save,新增套餐
在该Controller的方法中,我们不仅需要保存套餐的基本信息,还需要保存套餐关联的菜品数据,所以我们需要再该方法中调用业务层方法,完成两块数据的保存。
页面传递的数据是json格式,需要在方法形参前面加上@RequestBody注解, 完成参数封装。
publicR<String>save(SetmealDtosetmealDto){ log.info("套餐信息:{}",setmealDto); setmealService.saveWithDish(setmealDto); returnR.success("新增套餐成功"); } 2). SetmealService中定义方法saveWithDish/*** 新增套餐,同时需要保存套餐和菜品的关联关系* @param setmealDto*/publicvoidsaveWithDish(SetmealDtosetmealDto);
3). SetmealServiceImpl实现方法saveWithDish
具体逻辑:
A. 保存套餐基本信息
B. 获取套餐关联的菜品集合,并为集合中的每一个元素赋值套餐ID(setmealId)
C. 批量保存套餐关联的菜品集合
代码实现:
/*** 新增套餐,同时需要保存套餐和菜品的关联关系* @param setmealDto*/publicvoidsaveWithDish(SetmealDtosetmealDto) { //保存套餐的基本信息,操作setmeal,执行insert操作this.save(setmealDto); List<SetmealDish>setmealDishes=setmealDto.getSetmealDishes(); setmealDishes.stream().map((item) -> { item.setSetmealId(setmealDto.getId()); returnitem; }).collect(Collectors.toList()); //保存套餐和菜品的关联信息,操作setmeal_dish,执行insert操作setmealDishService.saveBatch(setmealDishes); } ————————————————版权声明:本文为CSDN博主「陶然同学」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_45481821/article/details/126309868
1.5.2.2 功能测试
代码编写完毕,我们重新启动服务器,进行测试,可以通过debug断点跟踪的形式查看页面传递的参数封装情况,及套餐相关数据的保存情况。
2. 套餐分页查询
2.1 需求分析
系统中的套餐数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。
在进行套餐数据的分页查询时,除了传递分页参数以外,还可以传递一个可选的条件(套餐名称)。查询返回的字段中,包含套餐的基本信息之外,还有一个套餐的分类名称,在查询时,需要关联查询这个字段。
2.2 前端页面分析
在开发代码之前,需要梳理一下套餐分页查询时前端页面和服务端的交互过程:
1). 访问页面(backend/page/combo/list.html),页面加载时,会自动发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据
而对于以上的流程中涉及到2个功能,文件下载功能我们已经实现,本小节我们主要实现列表分页查询功能, 具体的请求信息如下:
请求 | 说明 |
请求方式 | GET |
请求路径 | /setmeal/page |
请求参数 | ?page=1&pageSize=10&name=xxx |