瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
文章目录
- 10 套餐管理
- 10.1 需求分析
- 10.2 数据准备
- 10.2.1 套餐表`t_setmeal`
- 10.2.2 套餐菜品关系表`t_setmeal_dish`
- 10.3 套餐列表分页查询
- 10.3.1 需求分析
- 10.3.2 具体实现
- 10.4 套餐列表分页查询
- 10.4.1 需求分析
- 10.4.2 具体实现
10 套餐管理
10.1 需求分析
在“套餐管理”页面,实现以下功能:
- 套餐列表分页查询
- 新增套餐
- 修改套餐
- (批量)启售/停售套餐
- (批量)删除套餐
10.2 数据准备
10.2.1 套餐表t_setmeal
在数据库新建套餐表t_setmeal
:
DROP TABLE IF EXISTS `t_setmeal`;
CREATE TABLE `t_setmeal` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`category_id` bigint(20) NOT NULL COMMENT '菜品分类id',`name` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '套餐名称',`price` decimal(10,2) NOT NULL COMMENT '套餐价格',`status` int(11) DEFAULT NULL COMMENT '状态 0:停用 1:启用',`code` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '编码',`description` varchar(512) COLLATE utf8_bin DEFAULT NULL COMMENT '描述信息',`image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',`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,UNIQUE KEY `idx_setmeal_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='套餐';INSERT INTO `t_setmeal` VALUES ('1415580119015145474', '1413386191767674881', '儿童套餐A计划', '4000.00', '1', '', '', '61d20592-b37f-4d72-a864-07ad5bb8f3bb.jpg', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
使用MyBatisPlus插件生成代码:
给Setmeal
实体类的公共字段添加注解,其余字段保持默认:
// com.itweid.takeout.entity.Setmeal@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;@ApiModelProperty(value = "菜品分类id")
@JsonSerialize(using = ToStringSerializer.class)
private Long categoryId;@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
@JsonSerialize(using = ToStringSerializer.class)
private Long createUser;@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonSerialize(using = ToStringSerializer.class)
private Long updateUser;
创建查询对象SetmealQuery
:
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SetmealQuery对象", description="套餐查询对象")
public class SetmealQuery extends BaseQuery {@ApiModelProperty("套餐名称")private String name;
}
10.2.2 套餐菜品关系表t_setmeal_dish
在数据库新建套餐菜品关系表t_setmeal_dish
:
DROP TABLE IF EXISTS `t_setmeal_dish`;
CREATE TABLE `t_setmeal_dish` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`setmeal_id` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '套餐id ',`dish_id` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '菜品id',`name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '菜品名称 (冗余字段)',`price` decimal(10,2) DEFAULT NULL COMMENT '菜品原价(冗余字段)',`copies` int(11) NOT NULL COMMENT '份数',`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',`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='套餐菜品关系';INSERT INTO `t_setmeal_dish` VALUES ('1415580119052894209', '1415580119015145474', '1397862198033297410', '老火靓汤', '49800.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
INSERT INTO `t_setmeal_dish` VALUES ('1415580119061282817', '1415580119015145474', '1413342036832100354', '北冰洋', '500.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
INSERT INTO `t_setmeal_dish` VALUES ('1415580119069671426', '1415580119015145474', '1413385247889891330', '米饭', '200.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
使用MyBatisPlus插件生成代码:
给SetmealDish
实体类的公共字段添加注解,其余字段保持默认:
// com.itweid.takeout.entity.SetmealDish@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;@ApiModelProperty(value = "套餐id ")
@JsonSerialize(using = ToStringSerializer.class)
private String setmealId;@ApiModelProperty(value = "菜品id")
@JsonSerialize(using = ToStringSerializer.class)
private String dishId;@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
@JsonSerialize(using = ToStringSerializer.class)
private Long createUser;@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonSerialize(using = ToStringSerializer.class)
private Long updateUser;
10.3 套餐列表分页查询
10.3.1 需求分析
支持根据根据套餐名称进行模糊查询;支持分页查询。
功能 | 请求方法 | 请求路径 | 请求参数 |
---|---|---|---|
套餐列表分页查询 | GET | /setmeal/page | ?page=1&pageSize=10&name=“3人套餐” |
10.3.2 具体实现
- 1)在
Setmeal
实体类中添加categoryName
字段
// com.itweid.takeout.entity.Setmeal@ApiModelProperty(value = "套餐分类名称")
@TableField(exist = false)
private String categoryName;
- 2)在
SetmealController
类中添加page
方法
// com.itweid.takeout.controller.SetmealController@ApiOperation("套餐列表分页查询")
@GetMapping("/page")
public BaseResult<Page<Setmeal>> page(SetmealQuery setmealQuery) {return setmealService.pageQuerySetmeal(setmealQuery);
}
- 3)在``类中具体实现
pageQuerySetmeal
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult<Page<Setmeal>> pageQuerySetmeal(SetmealQuery setmealQuery) {Page<Setmeal> page = new Page<>(setmealQuery.getPage(), setmealQuery.getPageSize());lambdaQuery()// 只查询删除标记为0的记录.eq(Setmeal::getIsDeleted, StatusCode.NOT_DEL.getCode())// 套餐名称模糊查询.like(StringUtils.isNoneBlank(setmealQuery.getName()), Setmeal::getName, setmealQuery.getName()).page(page);if(page.getTotal() > 0) {// 处理套餐名称for (Setmeal setmeal : page.getRecords()) {Category category = Db.getById(setmeal.getCategoryId(), Category.class);if(category != null) {setmeal.setCategoryName(category.getName());}}}return BaseResult.success(page);
}
- 4)功能测试
10.4 套餐列表分页查询
10.4.1 需求分析
- 用户点击“新增套餐”按钮,进入新增页面;
- 自动加载“套餐分类”下拉框,用户可以选择套餐分类,直接使用已经开发好的分页查询分类列表
/category/page
接口:
- 自动加载“菜品”列表,用户可将菜品添加到当前套餐中,直接使用已经开发好的菜品列表分页查询接口
/dish/page
:
- 用户可以上传套餐图片,直接使用已经开发好的文件上传
/common/upload
接口:
- 用户可以查看套餐图片,直接使用已经开发好的文件下载
/common/download
接口:
- 用户在输入完所有信息后,点击“保存”按钮新增一个套餐:
功能 | 请求方法 | 请求路径 |
---|---|---|
新增套餐 | POST | /setmeal/add |
该接口的入参如下:
{"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.4.2 具体实现
- 1)在
SetmealQuery
查询类中添加参数,并添加表单校验规则
// com.itweid.takeout.entity.SetmealQuery@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SetmealQuery对象", description="套餐查询对象")
public class SetmealQuery extends BaseQuery {@ApiModelProperty("套餐名称")@NotBlank(groups = Add.class, message = "套餐名称不能为空")private String name;@ApiModelProperty("套餐分类ID")@NotBlank(groups = Add.class, message = "套餐分类不能为空")private String categoryId;@ApiModelProperty("套餐价格")@NotNull(groups = Add.class, message = "套餐价格不能为空")private BigDecimal price;@ApiModelProperty("套餐图片")@NotBlank(groups = Add.class, message = "套餐图片不能为空")private String image;@ApiModelProperty("套餐描述")private String description;@ApiModelProperty("套餐状态")private Integer status;@ApiModelProperty("套餐菜品")private SetmealDish[] setmealDishes;
}
- 2)在
SetmealController
类中添加add
方法,并添加表单校验规则
// com.itweid.takeout.controller.SetmealController@ApiOperation("套餐列表分页查询")
@PostMapping("/add")
public BaseResult add(@RequestBody @Validated(Add.class) SetmealQuery setmealQuery) {return setmealService.addSetmeal(setmealQuery);
}
- 3)在
SetmealServiceImpl
类中具体实现addSetmeal
方法
// com.itweid.takeout.service.impl.SetmealServiceImpl@Override
public BaseResult addSetmeal(SetmealQuery setmealQuery) {// 1 套餐名称不能重复if(lambdaQuery().eq(Setmeal::getName, setmealQuery.getName()).exists()) {return BaseResult.error(ErrorCode.SETMEAL_EXIST);}// 2 新增套餐Setmeal setmeal = new Setmeal();setmeal.setName(setmealQuery.getName());setmeal.setCategoryId(Long.valueOf(setmealQuery.getCategoryId()));setmeal.setPrice(setmealQuery.getPrice());setmeal.setStatus(setmealQuery.getStatus());setmeal.setDescription(setmealQuery.getDescription());setmeal.setImage(setmealQuery.getImage());save(setmeal);// 3 新增套餐菜品关系SetmealDish[] setmealDishes = setmealQuery.getSetmealDishes();if (setmealDishes != null && setmealDishes.length > 0) {for (SetmealDish setmealDish : setmealDishes) {setmealDish.setSetmealId(setmeal.getId().toString());Db.save(setmealDish);}}return BaseResult.success();
}
- 4)功能测试
…
本节完,更多内容查阅:瑞吉外卖项目实战