瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
文章目录
- 9 菜品管理
- 9.7 修改菜品
- 9.7.1 菜品数据回显
- 9.7.2 修改菜品具体实现
- 9.8 (批量)启售/停售菜品
- 9.8.1 需求分析
- 9.8.2 具体实现
- 9.9 完善删除菜品分类功能
9 菜品管理
9.7 修改菜品
9.7.1 菜品数据回显
点击“修改”菜品按钮,进入修改页面,首先需要根据菜品ID查询菜品信息进行数据回显。不仅要返回菜品的基本信息,还要返回菜品的口味配置信息。
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
根据ID查询菜品信息 | GET | /dish/get | ?id=1 |
- 1)在实体类
Dish
中添加flavors
属性,用于保存菜品对应的口味配置
// com.itweid.takeout.entity.Dish
@ApiModelProperty(value = "菜品口味配置")
@TableField(exist = false)
private DishFlavor[] flavors;
- 2)在
DishController
类中添加get
方法
// com.itweid.takeout.controller.DishController
@ApiOperation("根据ID查询菜品")
@GetMapping("/get")
public BaseResult<Dish> get(@NotNull(message = "菜品ID不能为空") Long id) {
return dishService.getDishById(id);
}
- 3)在
DishServiceImpl
类中具体实现getDishById
方法
// com.itweid.takeout.service.impl.DishServiceImpl
@Override
public BaseResult<Dish> getDishById(Long id) {
// 查询菜品信息
Dish dish = getById(id);
if(dish != null) {
// 查菜品口味配置
List<DishFlavor> dishFlavorList = Db.lambdaQuery(DishFlavor.class)
.eq(DishFlavor::getDishId, dish.getId())
.list();
if(dishFlavorList != null && !dishFlavorList.isEmpty()) {
dish.setFlavors(dishFlavorList.toArray(new DishFlavor[0]));
}
}
return BaseResult.success(dish);
}
- 4)重启服务,测试数据回显
大部分数据成功回显,但菜品分类没有成功回显。原因还是Long
类型数据的精度丢失问题。(所以根本没必要把ID搞得这么大。。。)
- 5)给
Dish
实体类的categoryId
字段添加@JsonSerialize(using = ToStringSerializer.class)
注解,重启服务,再次测试数据回显
9.7.2 修改菜品具体实现
功能 | 请求方法 | 请求路径 |
---|---|---|
修改菜品 | PUT | /dish/edit |
该接口的入参也跟新增菜品一样,比新增菜品多了一个菜品ID,下面是一个示例:
{
"id":"1397852391150759938", //菜品ID
"name":"辣子鸡", //菜品名称
"price":14.99, //菜品价格
"image":"e7cff7e7-4f63-4e3a-8001-6866e27f82d6.png", //菜品图片
"description":"辣子鸡真的好吃!!", //菜品描述
"categoryId":"1397844263642378242", //菜品分类ID
"flavors":[ //口味做法配置
{
"name":"甜味",
"value":"[\"无糖\",\"少糖\",\"半糖\"\"多糖\",\"全糖\"]",
"showOption":false
},{
"name":"温度",
"value":"[\"热饮\",\"常温\",\"去冰\",\"少冰\",\"多冰\"]",
"showOption":false
},{
"name":"忌口",
"value":"[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]",
"showOption":false
},{
"name":"辣度",
"value":"[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]",
"showOption":false
}
]
}
- 1)在
DishQuery
查询类中添加id
属性,并添加修改菜品的表单校验规则
- 2)在
DishController
类中添加edit
方法
// com.itweid.takeout.controller.DishController
@ApiOperation("修改菜品")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) DishQuery dishQuery) {
return dishService.editDish(dishQuery);
}
- 3)在
DishServiceImpl
中具体实现editDish
方法
// com.itweid.takeout.service.impl.DishServiceImpl
@Override
public BaseResult editDish(DishQuery dishQuery) {
// 1 查询原菜品信息
Dish exDish = getById(dishQuery.getId());
if(exDish == null) {
return BaseResult.error(ErrorCode.DISH_NOT_EXIST);
}
// 2 修改菜品基本信息
Dish newDish = new Dish();
newDish.setId(exDish.getId());
if(!exDish.getName().equals(dishQuery.getName())) {
newDish.setName(dishQuery.getName());
}
if(!exDish.getCategoryId().equals(Long.valueOf(dishQuery.getCategoryId()))) {
newDish.setCategoryId(exDish.getCategoryId());
}
if(!exDish.getPrice().equals(dishQuery.getPrice())) {
newDish.setPrice(dishQuery.getPrice());
}
if(!exDish.getImage().equals(dishQuery.getImage())) {
newDish.setImage(dishQuery.getImage());
}
if(!exDish.getDescription().equals(dishQuery.getDescription())) {
newDish.setDescription(dishQuery.getDescription());
}
updateById(newDish);
// 3 修改菜品口味做法配置
DishFlavor[] flavors = dishQuery.getFlavors();
if(flavors != null && flavors.length > 0) {
// 删除原有配置
Db.lambdaUpdate(DishFlavor.class)
.eq(DishFlavor::getDishId, exDish.getId())
.remove();
// 增加新配置
for(DishFlavor f : flavors) {
f.setDishId(exDish.getId());
Db.save(f);
}
}
// 4 删除旧的菜品图片
if(!exDish.getImage().equals(dishQuery.getImage())) {
File file = new File(uploadDir + exDish.getImage());
if(file.exists()) {
log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());
}
}
return BaseResult.success();
}
- 4)重启服务,测试修改菜品功能
9.8 (批量)启售/停售菜品
9.8.1 需求分析
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
修改菜品 | PUT | /dish/status | {“id”: “1,2”, “status”: 0} |
参数id
指需要修改状态的菜品ID,多个菜品ID时使用英文逗号隔开;
参数status
指需要改到的状态,0表示停售,1表示启售。
9.8.2 具体实现
- 1)在
DishController
类中添加status
方法,并添加表单校验规格
// com.itweid.takeout.controller.DishController
@ApiOperation("修改菜品状态")
@PutMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) DishQuery dishQuery) {
return dishService.editDishStatus(dishQuery);
}
- 2)在
DishServiceImpl
中具体实现editDishStatus
方法
// com.itweid.takeout.service.impl.DishServiceImpl
@Override
public BaseResult editDishStatus(DishQuery dishQuery) {
String ids = dishQuery.getId();
for (String id : ids.split(",")) {
Dish dish = new Dish();
dish.setId(Long.valueOf(id));
dish.setStatus(dishQuery.getStatus());
updateById(dish);
}
return BaseResult.success();
}
- 3)重启服务,测试功能
9.9 完善删除菜品分类功能
在“分类管理”菜单中,进行删除分类时,需要先判断改分类是否已被菜品使用。如果已被使用,则不能删除。
改造``类的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);
}
boolean remove = removeById(id);
return remove ? BaseResult.success() : BaseResult.error(ErrorCode.CATEGORY_NOT_EXIST);
}
重启服务,测试功能:
…
本节完,更多内容查阅:瑞吉外卖项目实战