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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware Workstation虚拟机网络模式

做虚拟机和宿主机互ping实验时&#xff0c;除了要提前配置好网段、ip等信息&#xff0c;还要把宿主机、虚拟机的防火墙关闭&#xff01; 首先说一下VMware的几种虚拟交换机。 VMnet0&#xff1a;用于虚拟桥接网络下的虚拟交换机。 VMnet1&#xff1a;用于虚拟Host-Only网络下…

UDP传输层通信协议详解

引言 在计算机网络通信的广阔天地中&#xff0c;传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;以其独特的特性和应…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网&#xff0c;下载 Node.js&#xff0c;上面有好几种下载方式&#xff0c;文中下载的是 zip 压缩包。 如图&…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来&#xff1f; 查看是否被360主页锁定&#xff0c;地址栏输入chrome://version&#xff0c;看命令行end后面&#xff08;蓝色部分&#xff09;&#xff0c;是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

Mysql 查询性能调优总结

一、查询分析性能的相关配置 1.1 配置显示查询性能的参数 在 MySQL 中&#xff0c;SHOW PROFILES 命令用于显示最近的查询性能概况&#xff0c;帮助你分析哪些查询比较耗时。 show profiles; 需要启用参数 profiling&#xff0c;才能使用上述功能&#xff0c;其相关参数设置…

python中使用selenium执行组合快捷键ctrl+v不生效问题

在执行ctrlv进行粘贴时&#xff0c;绑定一个页面上的元素对象&#xff08;无论元素对象是否是引用过期或者是粘贴的目标文本区&#xff0c;但前提需要粘贴的目标文本区获取焦点&#xff09;执行ctrlv后可以生效。执行粘贴组合快捷键&#xff08;ctrlv&#xff09;的示例代码 se…

C++模板:编译时模拟Duck Typing

C泛型与多态&#xff08;4&#xff09;: Duck Typing - 简书 James Whitcomb Riley在描述这种is-a的哲学时&#xff0c;使用了所谓的鸭子测试&#xff08;Duck Test&#xff09;: 当我看到一只鸟走路像鸭子&#xff0c;游泳像鸭子&#xff0c;叫声像鸭子&#xff0c;那我就把它…

【求职面试】驾照的种类

大型客车 A1 大型载客汽车 A3、B1、B2、C1、C2、C3、C4、M 牵引车 A2 重型、中型全挂、半挂汽车列车 B1、B2、C1、C2、C3、C4、M 城市公交车 A3 核载10人以上的城市公共汽车 C1、C2、C3、C4 中型客车 B1 中型载客汽车&#xff08;10人以上、19人以下&#xff09; C1、C2、C3…

PyQt实战——使用python提取JSON数据(十)

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

RAG实战:构建基于本地大模型的智能问答系统

RAG实战&#xff1a;构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代&#xff0c;如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;结合本地大模型&#xff0c;构建一个高效的智…

OAuth 2.0

简介 OAuth 是一种开放标准的授权协议或框架&#xff0c;它提供了一种安全的方式&#xff0c;使第三方应用程序能够访问用户在其他服务上的受保护资源&#xff0c;而无需共享用户的凭证&#xff08;如用户名和密码&#xff09;。OAuth 的核心思想是通过“授权令牌”来代替直接…

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…

美国辅料查询之FDA批准药用辅料数据库(IID数据库)

药用辅料的性质很大程度上决定了制剂的性质&#xff0c;每一种新的药用辅料的问世&#xff0c;都会为制剂技术的发展带来新的机遇&#xff0c;每一种药用辅料都可能让制剂研发员开发出新剂型药物&#xff0c;所以在药物制剂研发过程中&#xff0c;药用辅料的信息调研是不可或缺…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

Redis学习(五)优惠券秒杀2——分布式锁

Redis学习&#xff08;五&#xff09;优惠券秒杀2 一、分布式锁-redission二、快速入门三、redission可重入锁原理四、redission锁的MutiLock原理 一、分布式锁-redission 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程…

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…

模型的量化(Quantization)

文章目录 一、浮点数格式&#xff1a;FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别1、关于浮点数2、常见的浮点数格式 二、量化&#xff08;Quantization&#xff09;1、基本概念2、量化的实现8bit量化4bit量化 三、QLora四、大语言模型量化方法对比&#xff1a;GPTQ、GGUF…

勤云远程稿件处理系统 SQL注入漏洞复现(XVE-2024-18393)

0x01 产品简介 勤云远程稿件处理系统(又称勤云采编系统)是北京勤云科技发展有限公司研发的一款产品,是一款全网络版期刊采编管理系统,旨在解决从投稿到稿件发表整个过程的信息化管理问题。该系统集成了搜索引擎、云计算等先进技术,为编辑部、作者和审稿人提供了便捷、高效…

谷歌Gemini与Anthropic Claude对比测试引发争议:AI竞赛暗流涌动

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…