瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
文章目录
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)功能测试
…
本节完,更多内容查阅:瑞吉外卖项目实战