瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载
文章目录
- 10 套餐管理
- 10.5 修改套餐
- 10.5.1 需求分析
- 10.5.2 具体实现
- 10.6 (批量)删除套餐
- 10.6.1 需求分析
- 10.6.2 具体实现
- 10.7 (批量)起售/停售套餐
- 10.7.1 需求分析
- 10.7.2 具体实现
- 10.8 完善删除套餐分类功能
10 套餐管理
10.5 修改套餐
10.5.1 需求分析
-
用户点击“修改套餐”按钮,进入修改页面;
-
自动加载“套餐分类”下拉框,用户可以选择套餐分类,直接使用已经开发好的分页查询分类列表
/category/page
接口:
- 自动加载“菜品”列表,用户可将菜品添加到当前套餐中,直接使用已经开发好的菜品列表分页查询接口
/dish/page
:
- 用户可以上传套餐图片,直接使用已经开发好的文件上传
/common/upload
接口:
- 用户可以查看套餐图片,直接使用已经开发好的文件下载
/common/download
接口:
- 根据套餐ID查询套餐,回显当前套餐的信息:
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
根据ID查询套餐信息 | GET | /setmeal/get | ?id=1 |
- 用户在修改完所有信息后,点击“保存”按钮修改套餐信息:
功能 | 请求方法 | 请求路径 |
---|---|---|
修改套餐 | PUT | /setmeal/edit |
该接口的入参如下:
{"id": "1", //套餐ID"name":"3人套餐", //套餐名称"categoryId":"1413342269393674242", //套餐分类ID"price":3300, //套餐价格"image":"876ea3ae-4f70-4cba-bd76-e7c2daa29c2f.jpg", //套餐图片"description":"3人套餐真好吃!", //套餐描述"status":1, //套餐状态,默认1启售"setmealDishes":[ //套餐菜品{"copies":3, //菜品份数"dishId":"1397851668262465537", //菜品分类ID"name":"口味蛇", //菜品名称"price":16800 //菜品单价},{"copies":3,"dishId":"1397852391150759938","name":"辣子鸡丁","price":8800},{"copies":3,"dishId":"1397853183287013378","name":"麻辣兔头","price":19800}]
}
10.5.2 具体实现
- 1)在
Setmeal
类添加套餐菜品关系setmealDishes
属性
// com.itweid.takeout.entity.Setmeal@ApiModelProperty(value = "套餐菜品关系")
@TableField(exist = false)
private SetmealDish[] setmealDishes;
- 2)在
SetmealController
类添加根据ID查询套餐的get
方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("根据ID查询套餐")
@GetMapping("/get")
public BaseResult<Setmeal> get(Long id) {return setmealService.getSetmealById(id);
}
- 3)在
SetmealServiceImpl
类中具体实现getSetmealById
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult<Setmeal> getSetmealById(Long id) {// 查询套餐信息Setmeal setmeal = getById(id);// 查询套餐菜品信息if(setmeal != null) {List<SetmealDish> setmealDishList = Db.lambdaQuery(SetmealDish.class).eq(SetmealDish::getSetmealId, setmeal.getId()).list();if(setmealDishList != null && !setmealDishList.isEmpty()) {setmeal.setSetmealDishes(setmealDishList.toArray(new SetmealDish[0]));}}return BaseResult.success(setmeal);
}
- 4)回显数据功能测试
- 5)在
SetmealQuery
类添加修改套餐的参数,并设置表单校验规则
- 6)在
SetmealController
类添加修改套餐的edit
方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("修改套餐")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) SetmealQuery setmealQuery) {return setmealService.editSetmeal(setmealQuery);
}
- 7)在
SetmealServiceImpl
类中具体实现editSetmeal
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Value("${dir.upload}")
private String uploadDir;@Override
@Transactional(rollbackFor = Exception.class)
public BaseResult editSetmeal(SetmealQuery setmealQuery) {// 1 查询原套餐信息Setmeal exSetmeal = getById(setmealQuery.getId());if(exSetmeal == null) {return BaseResult.error(ErrorCode.SETMEAL_NOT_EXIST);}// 2 修改套餐信息Setmeal newSetmeal = new Setmeal();newSetmeal.setId(exSetmeal.getId());if(!exSetmeal.getName().equals(setmealQuery.getName())) {// 校验新套餐名是否已存在if(lambdaQuery().eq(Setmeal::getName, setmealQuery.getName()).exists()) {return BaseResult.error(ErrorCode.SETMEAL_EXIST);}newSetmeal.setName(setmealQuery.getName());}if(!exSetmeal.getCategoryId().toString().equals(setmealQuery.getCategoryId())) {newSetmeal.setCategoryId(Long.valueOf(setmealQuery.getCategoryId()));}if(!exSetmeal.getPrice().equals(setmealQuery.getPrice())) {newSetmeal.setPrice(setmealQuery.getPrice());}if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {newSetmeal.setImage(setmealQuery.getImage());}if(!exSetmeal.getDescription().equals(setmealQuery.getDescription())) {newSetmeal.setDescription(setmealQuery.getDescription());}updateById(newSetmeal);// 3 修改套餐菜品信息SetmealDish[] setmealDishes = setmealQuery.getSetmealDishes();if(setmealDishes != null && setmealDishes.length > 0) {// 删除原有菜品Db.lambdaUpdate(SetmealDish.class).eq(SetmealDish::getSetmealId, exSetmeal.getId()).remove();// 增加新菜品for(SetmealDish setmealDish : setmealDishes) {setmealDish.setSetmealId(exSetmeal.getId().toString());Db.save(setmealDish);}}// 4 删除旧的套餐图片if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {File file = new File(uploadDir + exSetmeal.getImage());if(file.exists()) {log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());}}return BaseResult.success();
}
- 8)测试修改套餐功能
10.6 (批量)删除套餐
10.6.1 需求分析
用户点击套餐记录操作栏的“删除”按钮,即可删除该套餐;或者用户勾选需要删除的套餐后,点击右上角的“批量删除”按钮,即可同时删除多个套餐。
后端只需要根据前端传递的套餐IDs删除对应的套餐即可:
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
根据IDs删除/批量删除套餐信息 | DELETE | /setmeal/delete | ?ids=1,2,3 |
10.6.2 具体实现
- 1)在
SetmealController
类添加根据IDs删除套餐的delete
方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("(批量)删除套餐")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "套餐ID不能为空") String ids) {return setmealService.deleteSetmeals(ids);
}
- 2)在
SetmealServiceImpl
类中具体实现deleteSetmeals
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult deleteSetmeals(String ids) {for (String id : ids.split(",")) {// 根据ID修改套餐删除状态Setmeal setmeal = new Setmeal();setmeal.setId(Long.valueOf(id));setmeal.setIsDeleted(StatusCode.HAD_DEL.getCode());updateById(setmeal);}return BaseResult.success();
}
- 3)测试删除套餐功能
- 4)测试批量删除套餐功能
10.7 (批量)起售/停售套餐
10.7.1 需求分析
用户点击套餐记录操作栏的“起售”或“停售”按钮,即可起售或停售该套餐;或者用户勾选需要起售/停售的套餐后,点击右上角的“批量起售”或“批量停售”按钮,即可同时起售或停售多个套餐。
对后端来说,起售和停售都只是修改套餐的状态而已,后端只需要根据前端传递的套餐ID修改对应的套餐的状态即可:
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
根据ID(批量)起售/停售套餐信息 | POST | /setmeal/status | {“id”:1, “status”:1} |
10.7.2 具体实现
- 1)在
SetmealQuery
类添加修改套餐状态的参数,并设置表单校验规则
// com.itweid.takeout.entity.SetmealQuery@ApiModelProperty("套餐ID")
@NotBlank(groups = {Edit.class, EditStatus.class}, message = "套餐ID不能为空")
private String id;@ApiModelProperty("套餐状态")
@NotNull(groups = {EditStatus.class}, message = "套餐状态不能为空")
private Integer status;
- 2)在
SetmealController
类添加根据ID修改套餐状态的ststus
方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("(批量)启售/停售套餐")
@PostMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) SetmealQuery setmealQuery) {return setmealService.editSetmealStatus(setmealQuery);
}
- 3)在
SetmealServiceImpl
类中具体实现editSetmealStatus
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult editSetmealStatus(SetmealQuery setmealQuery) {String ids = setmealQuery.getId();for (String id : ids.split(",")) {// 根据ID修改套餐状态Setmeal setmeal = new Setmeal();setmeal.setId(Long.valueOf(id));setmeal.setStatus(setmealQuery.getStatus());updateById(setmeal);}return BaseResult.success();
}
- 4)测试功能
10.8 完善删除套餐分类功能
在“分类管理”菜单中,进行删除套餐分类时,需要先判断该套餐分类是否已被套餐使用。如果已被使用,则不能删除。
改造CategoryServiceImpl
类的deleteCategory
方法:
// com.itweid.takeout.service.impl.CategoryServiceImpl@Override
public BaseResult deleteCategory(Long id) {// 判断该分类是否已被菜品使用if(Db.lambdaQuery(Dish.class).eq(Dish::getCategoryId, id).exists()) {return BaseResult.error(ErrorCode.CATEGORY_IS_USED);}// 判断该分类是否已被套餐使用if(Db.lambdaQuery(Setmeal.class).eq(Setmeal::getCategoryId, id).exists()) {return BaseResult.error(ErrorCode.CATEGORY_IS_USED);}boolean remove = removeById(id);return remove ? BaseResult.success() : BaseResult.error(ErrorCode.CATEGORY_NOT_EXIST);
}
…
本节完,更多内容查阅:瑞吉外卖项目实战