瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
文章目录
- 9 菜品管理
- 9.5 新增菜品
- 9.5.1 加载菜品分类
- 9.5.2 保存口味做法配置
- 9.5.3 新增菜品具体实现
- 9.6 (批量)删除菜品
- 9.6.1 需求分析
- 9.6.2 具体实现
9 菜品管理
9.5 新增菜品
9.5.1 加载菜品分类
在“新增菜品”页面,菜品分类是一个下拉框,因此进入该页面后需要向后端发起查询请求。
这里可以直接调用菜品/套餐分类的分页查询接口,参数要设置成?page=1&pageSize=999999&type=1
,表示查询第1页,该页显示999999条记录,相当于查出全部;type=1
表示查询的是菜品分类。
9.5.2 保存口味做法配置
由t_dish
的表结构可知,“新增菜品”页面的口味做法配置并不保存在t_dish
表。所以我们新建一个菜品口味关系表t_dish_flavor
表来单独保存。
- 1)在数据库新建菜品口味关系表
t_dish_flavor
DROP TABLE IF EXISTS `t_dish_flavor`;
CREATE TABLE `t_dish_flavor` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`dish_id` bigint(20) NOT NULL COMMENT '菜品',
`name` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '口味名称',
`value` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '口味数据list',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`create_user` bigint(20) NOT NULL COMMENT '创建人',
`update_user` bigint(20) NOT NULL COMMENT '修改人',
`is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='菜品口味关系表';
- 2)使用MyBatisPlus插件生成代码:
- 3)给
DishFlavor
实体类的公共字段添加注解:
// com.itweid.takeout.entity.DishFlavor
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
9.5.3 新增菜品具体实现
功能 | 请求方法 | 请求路径 |
---|---|---|
新增菜品 | POST | /dish/add |
该接口的入参较为复杂,下面是一个示例:
{
"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
类,添加以上参数,并做参数校验
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "DishQuery对象", description = "菜品查询对象")
public class DishQuery extends BaseQuery {
@ApiModelProperty(value = "菜品名称")
@NotBlank(groups = Add.class, message = "菜品名称不能为空")
private String name;
@ApiModelProperty(value = "菜品分类ID")
@NotBlank(groups = Add.class, message = "菜品分类不能为空")
private String categoryId;
@ApiModelProperty(value = "菜品价格")
@NotNull(groups = Add.class, message = "菜品价格不能为空")
private BigDecimal price;
@ApiModelProperty(value = "菜品图片")
@NotNull(groups = Add.class, message = "菜品图片不能为空")
private String image;
@ApiModelProperty(value = "菜品描述")
private String description;
@ApiModelProperty(value = "口味做法配置")
private DishFlavor[] flavors;
}
- 2)在
DishController
类创建add
方法,并添加参数校验
@ApiOperation("新增菜品")
@PostMapping("/add")
public BaseResult add(@RequestBody @Validated(Add.class) DishQuery dishQuery) {
return dishService.addDish(dishQuery);
}
- 3)在
DishServiceImpl
类具体实现addDish
方法
// com.itweid.takeout.service.impl.DishServiceImpl
@Override
public BaseResult addDish(DishQuery dishQuery) {
// 1 菜品名称不能重复
if(lambdaQuery().eq(Dish::getName, dishQuery.getName()).exists()) {
return BaseResult.error(ErrorCode.DISH_EXIST);
}
// 2 新增菜品
Dish dish = new Dish();
dish.setName(dishQuery.getName());
dish.setCategoryId(Long.valueOf(dishQuery.getCategoryId()));
dish.setPrice(dishQuery.getPrice());
dish.setImage(dishQuery.getImage());
dish.setDescription(dishQuery.getDescription());
// 随机指定商品码
dish.setCode(UUID.randomUUID().toString());
save(dish);
// 3 新增菜品口味配置
DishFlavor[] flavors = dishQuery.getFlavors();
if(flavors != null && flavors.length > 0) {
for(DishFlavor f : flavors) {
f.setDishId(dish.getId());
Db.save(f);
}
}
return BaseResult.success();
}
- 4)重启服务,测试新增菜品功能
- 5)完善“菜品分类”的显示
在Dish
实体类中增加categoryName
字段:
// com.itweid.takeout.entity.Dish
@ApiModelProperty(value = "菜品分类名称")
@TableField(exist = false)
private String categoryName;
改造DishServiceImpl
类的pageQueryDish
方法,处理菜品分类名称字段:
// com.itweid.takeout.service.impl.DishServiceImpl
@Override
public BaseResult<Page<Dish>> pageQueryDish(DishQuery dishQuery) {
Page<Dish> page = new Page<>(dishQuery.getPage(), dishQuery.getPageSize());
lambdaQuery()
.like(StringUtils.isNoneBlank(dishQuery.getName()), Dish::getName, dishQuery.getName())
.page(page);
if(page.getTotal() > 0){
for (Dish record : page.getRecords()) {
// 处理菜品分类
Category category = Db.getById(record.getCategoryId(), Category.class);
if(category != null){
record.setCategoryName(category.getName());
}
}
}
return BaseResult.success(page);
}
重启服务,测试菜品分类是否显示:
9.6 (批量)删除菜品
9.6.1 需求分析
在“菜品管理”页面,可以直接删除一个菜品,也可以选择多个菜品后批量删除:
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
新增菜品 | DELETE | /dish/delete | {“ids”:“1,2,3”} |
9.6.2 具体实现
- 1)在
DishController
类中添加delete
方法,并添加参数校验
// com.itweid.takeout.controller.DishController
@ApiOperation("(批量)删除菜品")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "待删除菜品ID不能为空") String ids) {
return dishService.deleteDish(ids);
}
- 2)在
DishServiceImpl
中具体实现deleteDish
方法
// com.itweid.takeout.service.impl.DishServiceImpl
@Value("${dir.upload}")
private String uploadDir;
@Override
public BaseResult deleteDish(String ids) {
String[] idArray = ids.split(",");
for (String id : idArray) {
log.info("delete id = {}", id);
// 先查询出菜品
Dish dish = getById(id);
if(dish != null) {
// 删除菜品
removeById(dish.getId());
// 删除菜品口味配置
Db.lambdaUpdate(DishFlavor.class)
.eq(DishFlavor::getDishId, dish.getId())
.remove();
// 删除菜品图片
File file = new File(uploadDir + dish.getImage());
if(file.exists()) {
log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());
}
}
}
return BaseResult.success();
}
- 3)重启服务,测试删除菜品功能
同样由于精度问题导致删除失败。我们只需要给Dish
实体类的id
字段添加一个@JsonSerialize
注解:
// com.itweid.takeout.entity.Dish
@ApiModelProperty(value = "ID")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
- 4)重启服务,再次测试删除菜品功能
…
本节完,更多内容查阅:瑞吉外卖项目实战