瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

server/2024/12/27 8:36:44/

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)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)功能测试

本节完,更多内容查阅:瑞吉外卖项目实战


http://www.ppmy.cn/server/153570.html

相关文章

攻防世界web第三题file_include

<?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?>惯例&#xff1a; 代码审查&#xff1a; 1.可以看到include(“./check.php”);猜测是同级目录下有一个check.php文…

潮玩设备AI语音交互方案,ESP32-S3芯片模组物联网通信技术

在智能化的世界里&#xff0c;每一个设备都是一个节点&#xff0c;它们通过无线网络相互连接&#xff0c;形成一个庞大的智能网络。这些设备能够相互通信&#xff0c;理解并判断用户的需求&#xff0c;从而提供更加个性化的服务。 而这一切的背后&#xff0c;是强大的处理器和…

Java 中压缩图片并应用 EXIF 旋转信息

如何在 Java 中压缩图片并应用 EXIF 旋转信息 在图像处理中&#xff0c;特别是当你需要处理从相机或手机获取的照片时&#xff0c;图像的方向是一个常见问题。许多相机和手机在拍摄照片时会存储图像的方向信息&#xff0c;通常会保存在图像的 EXIF 元数据 中。Windows 和其他图…

SpringBoot3-第四篇(基础特性)

系列文章目录 SpringBoot3-第一篇&#xff08;快速入门&#xff09; SpringBoot3-第二篇&#xff08;Web开发&#xff09; SpringBoot3-第三篇&#xff08;数据访问&#xff09; SpringBoot3-第四篇&#xff08;基础特性&#xff09; 文章目录 系列文章目录1. SpringApplicati…

oscp学习之路,Kioptix Level2靶场通关教程

oscp学习之路&#xff0c;Kioptix Level2靶场通关教程 靶场下载&#xff1a;Kioptrix Level 2.zip 链接: https://pan.baidu.com/s/1gxVRhrzLW1oI_MhcfWPn0w?pwd1111 提取码: 1111 搭建好靶场之后输入ip a看一下攻击机的IP。 确定好本机IP后&#xff0c;使用nmap扫描网段&…

基于python+django的旅游信息网站-旅游景点门票管理系统

标题:基于 PythonDjango 的旅游信息网站-旅游景点门票管理系统 内容:1.摘要 基于 PythonDjango 的旅游信息网站-旅游景点门票管理系统的摘要&#xff1a; 随着旅游业的快速发展&#xff0c;旅游景点门票管理系统的重要性日益凸显。本文旨在设计并实现一个基于 PythonDjango 的…

Ps:在 Photoshop 中编辑视频

Photoshop 不仅是图像编辑的强大工具&#xff0c;它还提供了丰富的视频编辑功能&#xff0c;使用户可以轻松创建和编辑视频项目。 通过基于剪辑的“时间轴”面板&#xff0c;Photoshop 提供了类似于 Adobe Premiere Pro 等专业视频编辑器的操作体验。 Ps菜单&#xff1a;窗口/时…

微信小程序UI自动化测试实践 !

微信小程序UI自动化测试实践 引言&#xff1a; 随着微信小程序的快速发展&#xff0c;越来越多的企业和开发者开始开发小程序来满足用户的需求。而在开发小程序的过程中&#xff0c;UI自动化测试是一个必不可少的环节&#xff0c;可以帮助开发者减少人工测试的工作量&#xff…