瑞吉外卖 - 菜品信息分页查询功能(17)

news2024/11/19 0:45:41

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 + JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。
相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PDe_7uIg?pwd=x548
提取码:x548

文章目录

    • 1.需求分析
    • 2.代码开发
      • 2.1 梳理交互过程
      • 2.2 代码实现
    • 3.功能测试

1.需求分析

系统中的菜品数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。并且在菜品页面中我们还应该一同展示菜品图片和菜品所属分类信息。

2.代码开发

2.1 梳理交互过程

在开发代码之前,需要梳理一下菜品分页查询时前端页面和服务端的交互过程:

  1. 页面(backend/page/food/list.html)发送 ajax 请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据;
  2. 页面发送请求,请求服务端进行图片下载,用于页面图片展示。

开发菜品信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这 2 次请求即可。我们先来看看分页查询的相关请求信息:

同时菜品管理页面还支持基于菜品名称的模糊查询,对应的请求信息如下:

2.2 代码实现

DishController 中处理分页查询的相关代码如下:

@RestController
@RequestMapping("/dish")
public class DishController {
    @Resource
    private DishService dishService;
    
    @Resource
    private CategoryService categoryService;
    
    /**
     * 分页查询
     * @param page 当前页
     * @param pageSize 每页显示条数
     * @param name 菜品名称
     * @return R
     */
    @GetMapping("/page")
    public R<Page<DishDto>> page(int page,int pageSize,String name){
        // 1.创建分页构造器
        Page<Dish> pageInfo = new Page<>(page, pageSize);
        Page<DishDto> dishDtoPage = new Page<>();

        // 2.构造查询条件
        QueryWrapper<Dish> queryWrapper = new QueryWrapper<>();
        // 如果菜品名称不为空,则根据菜品名称进行模糊查询
        if(name != null && !"".equals(name)){
            queryWrapper.like("name",name);
        }
        // 根据跟新时间进行排序(Asc 升序、Desc 降序)
        queryWrapper.orderByDesc("update_time");

        // 3.执行分页查询
        dishService.page(pageInfo, queryWrapper);

        // 4.将 pageInfo 中的数据复制到 dishDtoPage 中
        // 4.1 使用 BeanUtils 工具类进行属性拷贝(忽略 records 属性,因为 records 属性是 List<Dish> 类型)
        BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
        // 4.2 获取 pageInfo 中的 records 属性(List<Dish>),并将其转换为 List<DishDto>
        List<Dish> records = pageInfo.getRecords();
        List<DishDto> list = records.stream().map((item) -> {
            // 4.2.1 创建 DishDto 对象
            DishDto dishDto = new DishDto();
            // 4.2.2 将 item 中的属性拷贝到 dishDto 中
            BeanUtils.copyProperties(item,dishDto);
            // 4.2.3 获取分类id
            Long categoryId = item.getCategoryId();
            // 4.2.4 根据分类id查询分类对象
            Category category = categoryService.getById(categoryId);
            // 4.2.5 如果分类对象不为空,则将分类名称设置到 dishDto 中
            if(category != null){
                dishDto.setCategoryName(category.getName());
            }
            // 4.2.6 返回 dishDto
            return dishDto;
        }).collect(Collectors.toList());

        // 4.3 将 list 设置到 dishDtoPage 中
        dishDtoPage.setRecords(list);
        // 5.返回 R
        return R.success(dishDtoPage);
    }
    
    // 省略其他代码
}

上面为了能够正常显示分类名称,我们需要使用到前面的 DishDto,通过将 pageInfo 分页对象中的信息拷贝到 dishDtoPage 中去设置 categoryName 属性,最终返回 DishDto 类型的分页对象。

下面简单介绍一下上面拷贝用到的 BeanUtils 工具类。org.springframework.beans.BeanUtils 是 Spring 框架中的一个工具类,提供了一系列静态方法,用于实现 JavaBean 之间的属性拷贝、类型转换等操作。其中,该类的 copyProperties 方法是一个非常常用的方法,用于将源对象的属性值复制到目标对象中。

该方法的定义如下:

public static void copyProperties(Object source, Object target, String... ignoreProperties)

该方法接受两个参数(后面的 ignoreProperties 参数是可选的),分别为源对象和目标对象(还有忽略的属性)。该方法会将源对象中的属性值复制到目标对象中,如果属性名相同且类型相同,则直接复制;如果属性名相同但类型不同,则尝试进行类型转换;如果源对象中存在目标对象中不存在的属性,则忽略该属性。

3.功能测试

重启应用,点击菜品管理页面,分页查询成功:

可以看到分类信息和菜品图片也一同显示了,达到我们的需要。你可能要问了,图片不是都没有吗?这是应为当时导入数据库的 SQL 文件时的图片数据在本地都是没有的,自然无法下载。

你可以试着新增一个测试菜品上传图片呢,就能看到图片正常显示了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源大语言模型完整列表

Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 LLM 通常基于神经网络模型&#xff0c;使用大规模的语料库进行训练&#xff0c;比如使…

【Linux进阶之路】基本指令(下)

文章目录 一. 日志 date指令——查看日期基本语法1基本语法2cal指令——查看日历常见选项 二 .find——查找文件常用选项-name显示所有文件显示指定类型的文件 三.grep——行文本过滤工具语法常见的用法补充知识——APP与服务器的联系 四.打包压缩与解压解包zip与unzipzipunzip…

又一高速AD/DA数据采集卡问世,何不了解一下?

FMC190 子卡集成 2 通道 3Gsps 采样率&#xff0c;14 位 AD&#xff0c;2 通道12.8Gsps 16 位DA。板载时钟芯片 HMC7044&#xff0c;可以提供JESD204B所需要的各种时钟。具有同步/触发功能&#xff0c;模拟信号采用 SSMA 射频连接器输入和输出。板载时钟芯片为 HMC7044&#xf…

Unity UI -- (3)管理屏幕大小和锚点

在前面我们探索了一些基本的文本格式。我们需要考虑一个问题&#xff0c;这个文本在屏幕大小发生变化时该如何适应呢&#xff1f; 在Unity中&#xff0c;我们可以使用Canvas和Anchor Point&#xff08;锚点&#xff09;系统来确保UI元素总是出现在正确的位置&#xff0c;不管它…

Arduino ESP32的串口

Arduino的ESP32的三个串口 ESP32的三个串口 在Arduino的核心中有三个串口&#xff0c;分别是Serial&#xff0c;Serial1&#xff0c;和Serial2. 当然ESP32也可以使用软串口。但硬件串口更稳健&#xff08;我这样理解&#xff09;。但Serial1这个串口不能使用&#xff0c;因为…

腾讯云轻量应用服务器公网带宽速度如何?

腾讯云轻量应用服务器网速怎么样&#xff1f;轻量应用公网IP带宽速度与地域有关&#xff0c;中国大陆地域如北京、上海、广州等地域采用多线BGP网络&#xff0c;保障轻量应用服务器的速度&#xff0c;中国香港国际CN2高速网络。中国内地的地域大家是完全不用担心&#xff0c;大…

Eureka实战入门

spring cloud的版本 spring cloud的版本是根据springboot版本确定的 Spring Cloud Dalston, Edgware, Finchley, and Greenwich 版本不再更新了 版本 SNAPSHOT&#xff1a;开发版本&#xff0c;最新版本 Milestone&#xff1a;大版本在发布前的里程碑的版本 Release candi…

usb摄像头驱动-core层hub.c

usb摄像头驱动-core层hub.c 文章目录 usb摄像头驱动-core层hub.cusb_hub_inithub_probehub_eventport_eventhub_port_connect_changehub_port_connectusb_new_deviceannounce_device 在USB摄像头驱动中&#xff0c;hub.c文件扮演着USB集线器&#xff08;Hub&#xff09;驱动的角…

<数据结构>顺序表和链表的比较|缓存命中率

&#x1f4ad;前言&#xff1a;通过之前对顺序表和链表的实现&#xff0c;我们可以发现在增删查改某些操作上两者的效率前言有所差异&#xff0c;本篇文章将总结二者的异同。 顺序表的实现http://t.csdn.cn/Lxyg2单链表的实现http://t.csdn.cn/rHgjG双链表的实现http://t.csdn.…

国考省考行测:现期比重,基期比重

国考省考行测&#xff1a; 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

【c++】位图与布隆过滤器

一.位图 1.位图的概念 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这 40 亿个数中。【腾讯】 刚开始许多同学能想到的方法有&#xff1a; 1. 遍历&#xff0c;时间复杂度 O(N) 2. 排序 (O(NlogN)) &#x…

分代回收工作流程

GC回收算法之分代回收 GC回收垃圾主要有三个算法&#xff0c;分别是标记清除&#xff0c;复制算法以及标记整理。 三种算法各有优缺点&#xff0c;其中标记清除的优点就是简单高效&#xff0c;缺点就是很容易带来内存碎片化问题。 复制算法的话&#xff0c;优点确实解决了内存碎…

springcloud-alibaba (02)nacos学习笔记

nacos 一&#xff0c;介绍1. 什么是Spring Cloud Alibaba Nacos2. Nacos的特点和优势 二&#xff0c;安装和配置三&#xff0c;创建项目第一步&#xff0c;创建父工程第二步&#xff0c;创建基础公共模块第三步&#xff0c;创建服务模块第四步&#xff0c;开启多个实例 四&…

用Python进行AB测试之T检验的案例学习【文末源码地址】

文章目录 案例背景假设检验解读一、提出假设二、检验统计量三、代码实现四、结论 源码地址 案例背景 产品经理对APP做了许多改动&#xff0c;想要通过AB测试评估一下改动后的效果如何&#xff1f; 其中有一项评估是&#xff1a;签到按钮从蓝色改为红色后&#xff0c;客户点击…

Java 成员变量与局部变量有什么区别?

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符…

Smart HTML Elements Crack

Smart HTML Elements Crack Smart HTML Elements是一个现代的Vanilla JS和ES6库以及下一代前端框架。企业级Web组件包括可访问性功能(WAI-ARIA&#xff0c;第508/WTAG法规遵从性)、本地化、从右到左键盘导航和主题化。与Angular、ReactJS、Vue.js、Bootstrap、Meteor和任何其他…

vue编写组件 根据指定日期获取一周内所有 日期与农历日期展示 并标记当天

首先 我们要引入一下对应的第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader这里 我们需要 chinese-lunar-calendar 将日期变成农历日期的工具 sass是因为 我这里为了方便 用了 sass写样式 组件代码如下 <template><headerclass "ske…

学习自动化这3个坏习惯要你命,90%测试人躺枪!

将自动化测试当成很了不起的资本&#xff0c;源于国内对Coding的崇拜 盲目的学习自动化&#xff0c;不光对你的工作没有帮助&#xff0c;可能对你的测试之路还会起反作用&#xff01; 1,为什么说盲目学习自动化可能会让你一无是处&#xff1f; 没有全面理解软件测试的基本原理…

让自己再认识一下分区吧

在上个博客中&#xff0c;我们讨论了复制 —— 即数据在不同节点上的副本&#xff0c;对于非常大的数据集&#xff0c;或非常高的吞吐量&#xff0c;仅仅进行复制是不够的&#xff1a;我们需要将数据进行 分区&#xff08;partitions&#xff09;&#xff0c;也称为 分片&#…

【Proteus仿真】| 51单片机——MAX7219 驱动数码管

系列文章 todo: 文章目录 前言1. 简单了解MAX72191.1 引脚说明1.2 寄存器说明1.2.1 选位寄存器1.2.2 BCD译码器设置寄存器1.2.3 亮度寄存器1.2.4 扫描限制寄存器1.2.5 显示测试寄存器1.2.6 关停寄存器 1.3 spi总线通信时序1.4 数据格式 2. 使用MAX7219驱动数码管2.1 驱动数码管…