苍穹外卖-菜品分页查询
3. 菜品分页查询
3.1 需求分析和设计
3.1.1 产品原型
系统中的菜品数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。
菜品分页原型:

在菜品列表展示时,除了菜品的基本信息(名称、售价、售卖状态、最后操作时间)外,还有两个字段略微特殊,第一个是图片字段 ,我们从数据库查询出来的仅仅是图片的名字,图片要想在表格中回显展示出来,就需要下载这个图片。第二个是菜品分类,这里展示的是分类名称,而不是分类ID,此时我们就需要根据菜品的分类ID,去分类表中查询分类信息,然后在页面展示。
业务规则:
-
根据页码展示菜品信息
-
每页展示10条数据
-
分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询
3.1.2 接口设计
根据上述原型图,设计出相应的接口。


3.2 代码开发
3.2.1 设计DTO类
根据菜品分页查询接口定义设计对应的DTO:
在sky-pojo模块中,已定义
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class DishPageQueryDTO implements Serializable {
private int page;private int pageSize;private String name;private Integer categoryId; //分类idprivate Integer status; //状态 0表示禁用 1表示启用
}
3.2.2 设计VO类
根据菜品分页查询接口定义设计对应的VO:
在sky-pojo模块中,已定义
package com.sky.vo;
import com.sky.entity.DishFlavor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DishVO implements Serializable {
private Long id;//菜品名称private String name;//菜品分类idprivate Long categoryId;//菜品价格private BigDecimal price;//图片private String image;//描述信息private String description;//0 停售 1 起售private Integer status;//更新时间private LocalDateTime updateTime;//分类名称private String categoryName;//菜品关联的口味private List<DishFlavor> flavors = new ArrayList<>();
}
3.2.3 Controller层
根据接口定义创建DishController的page分页查询方法:
/*** 菜品分页查询** @param dishPageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("菜品分页查询")public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {log.info("菜品分页查询:{}", dishPageQueryDTO);PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);//后绪步骤定义return Result.success(pageResult);}
3.2.4 Service层接口
在 DishService 中扩展分页查询方法:
/*** 菜品分页查询** @param dishPageQueryDTO* @return*/PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);
3.2.5 Service层实现类
在 DishServiceImpl 中实现分页查询方法:
/*** 菜品分页查询** @param dishPageQueryDTO* @return*/public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);//后绪步骤实现return new PageResult(page.getTotal(), page.getResult());}
3.2.6 Mapper层
在 DishMapper 接口中声明 pageQuery 方法:
/*** 菜品分页查询** @param dishPageQueryDTO* @return*/Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);
在 DishMapper.xml 中编写SQL:
<select id="pageQuery" resultType="com.sky.vo.DishVO">select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id<where><if test="name != null">and d.name like concat('%',#{name},'%')</if><if test="categoryId != null">and d.category_id = #{categoryId}</if><if test="status != null">and d.status = #{status}</if></where>order by d.create_time desc
</select>
1. 因为left join category表,即d表查全部,c表查部分,即c表有约束,约束的方式是用on关键字进行约束
2.因为d.*里有name属性,二者重合了,所以要给c.name取个别名,c.name as categoryName,否则mybatis底层无法完成自动映射。
3.
小结
分页查询菜品功能 1.把前端返回的数据封装成了DTO2.把数据库查询返回的结果封装成了VO3.分页查询首先使用分页插件然后进行查全部,因为涉及到了多表所以就用了了左外连接把查到的结果封装成page<实体类>最后封装PageResult返回<!--查询所有菜品以及菜品所属分类 因为left join category表,即d表查全部,c表查部分,所以c表有约束,约束的方式是用on关键字进行约束--><select id="findAll" resultType="com.sky.vo.DishVO">select d.*,c.name as categoryNamefrom dish d left join category c on d.category_id = c.id。。。</select>小细节:因为d.*里有name属性,二者重合了,所以要给c.name取个别名,c.name as categoryName,否则mybatis底层无法完成自动映射。
相关文章:
苍穹外卖-菜品分页查询
3. 菜品分页查询 3.1 需求分析和设计 3.1.1 产品原型 系统中的菜品数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。 菜品分页原型: 在菜品列表展示时…...
子集II(力扣90)
这道题与子集(力扣78)-CSDN博客 的区别就在于集合中的元素会重复,那么还按照之前的代码来操作就会得到重复的子集,因此这道题的重点就在于去重。需要注意的是,这里的去重指的是在同一层递归中,而在往下递归的子集中可以取重复的元…...
user、assistant、system三大角色在大语言模型中的作用(通俗解释)
1 概述 在大语言模型中,通常涉及到三种角色:用户(user)、助手(assistant)和系统(system)。简单来说,和大模型对话其实是三个人的电影。 2 角色定义 2.1 系统…...
LeetCode 3444.使数组包含目标值倍数的最小增量
给你两个数组 nums 和 target 。 在一次操作中,你可以将 nums 中的任意一个元素递增 1 。 返回要使 target 中的每个元素在 nums 中 至少 存在一个倍数所需的 最少操作次数 。 示例 1: 输入:nums [1,2,3], target [4] 输出:…...
2月9日星期日今日早报简报微语报早读
2月9日星期日,农历正月十二,早报#微语早读。 1、2025WTT新加坡大满贯:王楚钦林诗栋获得男双冠军; 2、海南万宁快查快处一起缺斤短两案件:拟罚款5万元,责令停业3个月; 3、四川宜宾市筠连县山体…...
MOSSE目标跟踪算法详解
1. 引言 MOSSE算法(Multi-Object Spectral Tracking with Energy Regularization)是多目标跟踪领域的一座里程碑式成果,被认为是开创性的工作,为后续研究奠定了重要基础。该算法通过创新性地结合频域特征分析与能量正则化方法&am…...
生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 下
生成式聊天机器人 -- 基于Pytorch Global Attention 双向 GRU 实现的SeqToSeq模型 -- 下 训练Masked 损失单次训练过程迭代训练过程 测试贪心解码(Greedy decoding)算法实现对话函数 训练和测试模型完整代码 生成式聊天机器人 – 基于Pytorch Global Attention 双向 GRU 实…...
本地部署的DeepSeek-R1-32B与DeepSeek-R1-7B模型效果对比
本地部署的DeepSeek-R1-32B与DeepSeek-R1-7B模型效果对比 在当今人工智能快速发展的时代,大语言模型(Large Language Model, LLM)的应用场景日益广泛。无论是企业级应用还是个人开发,本地部署大语言模型已经成为一种趋势。DeepSeek-R1-32B和DeepSeek-R1-7B作为DeepSeek系列…...
AWS Fargate
AWS Fargate 是一个由 Amazon Web Services (AWS) 提供的无服务器容器计算引擎。它使开发者能够运行容器化应用程序,而无需管理底层的服务器或虚拟机。简而言之,AWS Fargate 让你只需关注应用的容器本身,而不需要管理运行容器的基础设施&…...
表单与交互:HTML表单标签全面解析
目录 前言 一.HTML表单的基本结构 基本结构 示例 二.常用表单控件 文本输入框 选择控件 文件上传 按钮 综合案例 三.标签的作用 四.注意事项 前言 HTML(超文本标记语言)是构建网页的基础,其中表单(<form>&…...
【电机控制器】STC8H1K芯片——低功耗
【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频(待填) 六、参考资料总结 前言 使用工具: 1.STC仿真器烧录器 提示:以下是本…...
win10 llamafactory模型微调相关① || Ollama运行微调模型
目录 微调相关 1.微调结果评估 2.模型下载到本地 导出转换,Ollama运行 1.模型转换(非常好的教程!) 2.Ollama 加载GGUF模型文件 微调相关 1.微调结果评估 【06】LLaMA-Factory微调大模型——微调模型评估_llamafactory评估-C…...
SMU寒假训练周报
训练情况 本周是第一周,训练情况不是很好,因为从期末周到现在一直没训练,不是在复习就是在忙其他的事情,导致状态下滑很严重,没有什么代码的感觉,而且回家之后的事情也挺多,社会实践的时间有时…...
高并发读多写少场景下的高效键查询与顺序统计的方案思路
之前在某平台看到一篇有意思的场景——对于高并发读多写少场景下,如何进行高效键查询与统计早于其创建时间且没有被删除的数量(只需要先入先出,不需要从中间删元素) 在高并发、读多写少的场景下,业务需求通常聚焦在以…...
Android Studio 配置 Gerrit Code Review
很多大厂(华为、荣耀)的大型项目都有gerrit代码审查流程,那么我们如何实现不手动敲命令行,就在Android Studio中像平常开发一样,只需要用鼠标点点点,就能将代码推送到gerrit审查仓呢,现在就来跟…...
html为<td>添加标注文本
样式说明: /*为td添加相对定位点*/ .td_text {position: relative; }/*为p添加绝对坐标(相对于父元素中的定位点)*/ .td_text p {position: absolute;top: 80%;font-size: 8px; }参考资料:...
(done) openMP学习 (Day10: Tasks 原语)
url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp 本章节内容仅提供引入,关于 task 更详细的细节请看 openMP 手册或者源材料 Day9 介绍了一个优化链表遍历的粗糙方…...
力扣-字符串-28 找出字符串中第一个匹配项的下标
思路 kmp算法的练习,实际上来说在构建next数组和使用next数组都用到了前一位字符串的最长相等前后缀 代码 class Solution { public:void getNext(int *next, string s){int j 0;next[0] 0;for(int i 1; i < s.size(); i){while(j > 0 && s[j] …...
linux 基础知识点之工作队列workqueue
多年前就了解了workqueue着玩意,但理解上就并不是很很深刻,今天重新梳理一下,本文重点的是哪个些现成的demo代码,都是可以直接拿来用的,这就是写这文章的目的和作用,就是为了备份后续工作用到的时候&#x…...
C++蓝桥杯基础篇(二)
片头 嗨!小伙伴们,今天我们将学习C蓝桥杯基础篇(二),继续练习相关习题,准备好了吗?咱们开始咯~ 第1题 简单计算器输入两个数,以及一个运算符 ,-,*ÿ…...
别再手动切换收发!用SP3485芯片实现RS485自动收发电路的保姆级教程
用SP3485芯片实现RS485自动收发电路的完整设计指南 在工业控制、楼宇自动化等长距离通信场景中,RS485接口因其抗干扰能力强、传输距离远等优势成为首选。然而传统RS485设计需要手动控制收发使能信号,不仅增加软件复杂度,还容易因时序错误导致…...
UOS20远程桌面XRDP配置指南:告别黑屏卡顿,轻松实现Windows远程连接
UOS20远程桌面XRDP配置实战:从零搭建流畅的Windows远程控制环境 在混合办公成为常态的今天,跨平台远程控制需求激增。UOS20作为国产操作系统的代表,其XRDP服务能让Windows用户无缝接入,但配置过程中的黑屏、卡顿问题常令人却步。…...
不止是上网:用PVE虚拟的OpenWRT旁路由解锁Docker、AdGuard Home和异地组网玩法
解锁PVE虚拟OpenWRT旁路由的进阶玩法:从Docker到智能家居中枢 在家庭网络架构中,OpenWRT旁路由早已超越了简单的网关转发角色。当它运行在PVE虚拟化环境中时,这个轻量级Linux系统(仅需1G内存)可以变身为多功能家庭网络…...
zteOnu:核心功能全解析与实战指南
zteOnu:核心功能全解析与实战指南 【免费下载链接】zteOnu 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 解锁高级配置:工厂模式激活指南 场景描述 网络管理员在配置中兴光猫时,发现普通用户权限无法修改关键网络参数&…...
OpCore Simplify:三步搞定黑苹果EFI配置的智能工具
OpCore Simplify:三步搞定黑苹果EFI配置的智能工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果的复杂EFI配置而烦恼吗&am…...
OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手
OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手 1. 为什么需要AI作业辅导助手? 作为两个小学生的家长,我深刻体会到辅导作业的"痛"。每天晚上检查数学题、批改作文、讲解错题的过程,常常让亲子关系变得紧…...
保姆级教程:深求·墨鉴Podman部署全流程,小白也能轻松搞定
保姆级教程:深求墨鉴Podman部署全流程,小白也能轻松搞定 1. 为什么选择Podman部署深求墨鉴? 传统Docker部署方式虽然常见,但对于深求墨鉴这样的轻量级OCR工具来说,Podman提供了更优雅的解决方案。Podman是一款无需守…...
告别SSH断连焦虑:用Tmux会话持久化拯救你的远程工作
远程开发者的救星:Tmux实战指南与高阶会话管理技巧 凌晨三点,服务器上的关键编译任务刚执行到一半,突然网络抖动导致SSH连接中断——这种令人抓狂的场景,每一位远程开发者都深有体会。传统终端会话的脆弱性让我们不得不反复重做工…...
终极解决方案:Calibre中文路径插件让书库管理回归本真
终极解决方案:Calibre中文路径插件让书库管理回归本真 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 项目地址: h…...
Eigen矩阵打印踩坑记:从乱码到优雅输出的3个关键技巧与一个隐藏Bug
Eigen矩阵打印踩坑记:从乱码到优雅输出的3个关键技巧与一个隐藏Bug 第一次在ROS项目里调试Eigen矩阵时,我盯着终端里歪歪扭扭的数字对齐和突然冒出的科学计数法,花了整整两小时才意识到这不是算法问题,而是输出格式在作祟。Eigen作…...
