瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐
瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)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);
}
…
本节完,更多内容查阅:瑞吉外卖项目实战