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

news/2024/12/26 13:29:06/

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

相关文章

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息&#xff0c;并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

网络安全 | 云计算中的数据加密与访问控制

网络安全 | 云计算中的数据加密与访问控制 一、前言二、云计算概述2.1 云计算的定义与特点2.2 云计算的服务模式2.3 云计算的数据安全挑战 三、数据加密技术在云计算中的应用3.1 对称加密算法3.2 非对称加密算法3.3 混合加密算法 四、云计算中的访问控制模型4.1 基于角色的访问…

datatables快速入门

官网 进入官网https://datatables.net/ 点击下载 支持多种方式下载 快速入门 这里以cdn的方式演示 https://cdn.datatables.net/ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport&…

Adobe Illustrator 中裁剪图像的最快方案

1. 置入图像&#xff1a;选择“文件 > 置入”&#xff0c;然后选择要裁剪的图像的PDF并单击“置入”。可以得到下面图中所示&#xff1a; 2. 选择右边工具栏中的矩形&#xff0c;新建一个矩形将你想要裁剪的地方覆盖住。下图中白色矩形所示。 3. 点击右上角的箭头&#xff0…

java内存马

java内存马 idea 2024.1.2专业版 jdk1.8.0_181 tomcat 8.5.82 默认有java基础&#xff0c;Javassist&#xff0c;Jsp&#xff0c;JavaEE都会一点 更新ing 文章目录 java内存马0. 一些基础1. filter型内存马2. Servlet型内存马3. listener型内存马4. Tomcat特有的Valve内存马…

LRC电路

从以前的文章&#xff0c;可以了解到电容电感都是类似于电池一样的东西。但是他俩都作为储能原件&#xff0c;本身不消耗能量。电容储能成电荷&#xff0c;电感储能为电磁。且根据电容通交隔直的特殊之处&#xff0c;从充电过程能看出来并不是完全隔绝。充满电后才会完全隔绝。…

基于Java2D和Java3D实现的(GUI)图形编辑系统

基于Java2D和Java3D的图形编辑系统 摘 要 基于本学期计算机图形学课程的理解以及课外查找的资料内容&#xff0c;实现了一个基于Java2D及Java3D的图形编辑系统&#xff0c;可以供用户实时交互。基本功能包括二维图形的输入、编辑(裁剪二维变换)、图像存储以及三维图形(.off文…

MyBatis的一级、二级缓存

MyBatis 提供了两级缓存机制&#xff0c;即一级缓存和二级缓存&#xff0c;用于提高查询效率&#xff0c;减少数据库访问次数。 一级缓存&#xff08;Session Cache&#xff09; 一级缓存是 MyBatis 的默认缓存&#xff0c;它是基于 SQL Session 的缓存。在同一个 SQL Session …