苍穹外卖Day03——总结3

news2024/11/19 15:35:44

前期文章

文章标题地址
苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359
苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412
苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126
苍穹外卖Day02——解决总结2中存在的问题https://lushimeng.blog.csdn.net/article/details/136242268

总结3—菜品管理模块

  • 1. 菜品管理效果图
  • 2. 新增菜品模块
  • 3. 分页查询模块
  • 4. 删除菜品模块
  • 5. 修改菜品模块
  • 6. 总结

1. 菜品管理效果图

分页查询界面

在这里插入图片描述

新增菜品界面

在这里插入图片描述

2. 新增菜品模块

新增菜品界面

在这里插入图片描述

业务规则:

  • 菜品名称必须是唯一的
  • 菜品必须属于某个菜品分类categorey下,不能单独存在
  • 新增菜品时可以根据情况选择菜品的口味
  • 每个菜品必须对应一张图片

接口需求

  • 查询菜品分类接口
  • 上传图片接口,这里把图片存在在阿里云OOS
  • 保存菜品接口

前两个接口都比较简单,这里需要介绍一下第三个接口:保存菜品接口,由于一个菜品包含多个口味,多以在插入菜品dish的同时还需要把菜品的口味插入到另一个独立的dish_flavour中。这里在插入菜品dish的时候需要使用主键回填的技术,这样才能为每个口味添加对应的dish_id。

DishServiceImpl

/**
     * 菜品添加
     * @param dishDTO
     */
    @Transactional
    public void saveWithFlavor(DishDTO dishDTO) {
        // 1. 添加菜品
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO, dish);
        dishMapper.saveDish(dish);

        // 主键回填技术, 用于后续给每个口味添加对应的菜品dish_id
        Long dishId = dish.getId();

        // 2. 添加菜品的口味
        List<DishFlavor> flavors = dishDTO.getFlavors();
        flavors.forEach(flavor -> flavor.setDishId(dishId));
        dishFlavorMapper.saveBatch(flavors); // 批量添加
    }

DishMapper.xml

    <!--主键回填-->
    <insert id="saveDish" useGeneratedKeys="true" keyProperty="id">
        insert into dish (name, category_id, price, image, description, create_time, update_time, create_user,update_user, status)
        values
               (#{name}, #{categoryId}, #{price}, #{image}, #{description}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}, #{status})
    </insert>

3. 分页查询模块

分页查询效果图

在这里插入图片描述

分页查询不是很熟悉,这里就详细的介绍一下整体的流程。

步骤一:确定前端传递的参数以及后端需要返回的数据格式

前端传递参数

@Data
public class DishPageQueryDTO implements Serializable {
    private int page;
    private int pageSize;
    private String name;
    //分类id
    private Integer categoryId;
    //状态 0表示禁用 1表示启用
    private Integer status;
}

后端返回数据格式

/**
 * 封装分页查询结果
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {
    private long total; //总记录数
    private List records; //当前页数据集合
}

步骤二:确定接口

DishController

    /**
     * 分页查询
     *
     * @param dishPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("分页查询接口")
    public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {
        log.info("分页查询:{}", dishPageQueryDTO);
        PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
        return Result.success(pageResult);
    }

DishServiceImpl

这里使用PageHelper插件。首先调用startPage方法,开始分页查询;然后获取查询信息,这里返回统一为Page page;然后根据获取的page得到查询总数以及每条查询信息集合。下面代码是固定的套路,记住即可。

    /**
     * 分页查询
     * @param dishPageQueryDTO
     * @return
     */
    public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
        // 开始分页查询
        PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
        // 获取分页查询page, 固定写法
        Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);
        long total = page.getTotal();  // 获取总数
        List<DishVO> records = page.getResult();  // 获取内容
        return new PageResult(total, records);
    }

DishMapper.xml:

这里使用了多表联查:“select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id

给表起别名、表字段起别名以及联合查询。要特别学一下这种思想,经常在分页查询中用到。

    <select id="pageQuery" parameterType="com.sky.dto.DishPageQueryDTO" 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>

4. 删除菜品模块

删除菜品

在这里插入图片描述

业务规则:

  • 可以一次删除一个菜品,也可以批量删除菜品,因为一次删除多个菜品包括一次删除一个,所以只需要一个接口即可:一次删除多个。
  • 起售中的菜品不能删除
  • 被套餐关联的菜品不能删除
  • 删除菜品后,关联的口味数据也需要删除掉

上述接口比较简单,只需要弄清业务规则即可,特别是在删除菜品的时候需要该菜品是否有关联项,能否不考虑其他部分直接删除。

5. 修改菜品模块

修改菜品界面:

在这里插入图片描述

在修改菜品的时候需要回显菜品相关信息,该页面共涉及4个接口。

接口:

  • 根据id查询菜品
  • 根据类型查询分类
  • 文件上传
  • 修改菜品

修改注意事项

  • 菜品数据回显
  • 修改菜品时候可能会修改菜品口味,正确的做法是删除该菜品对应的所有口味,然后插入新传入的口味信息
  • 云资源浪费为题。如果换了图片原来的图片还存储在云上会造成资源浪费,猜测后续使用redis删除无用的照片,插入到云上的图片也存入到redis中,redis上的图片信息和运算的图片信息进行比对,然后删除多余文件信息,减少云资源浪费

6. 总结

收获

  1. CURD: Controller -> service -> serviceImpl -> mapper -> mapper.xml
  2. 前端到后端数据:XXXDTO, 后端返回给前端数据:XXXVO;
  3. 分页查询有自己一套模板,使用分页插件,记住就行;
  4. 业务逻辑分析:
    • 删除模块:在删除的时候需要考虑该信息是否关联其他信息?
    • 修改模块:如果该信息关联其他模块,修改了该信息其他信息是否会修改,原来的信息怎么办?

补充内容

内容1:字段填充,由于每个模块都含有创建时间、创建人、更新时间和更新人信息,每次都需要setXXX进行设置,太繁琐,提出了字段填充。本项目提出的字段填充使用到: AOP, 反射,主键等技术;

内容2:@RequestBody、@RequestParam、@PathVariable用法区别;

内容3:阿里云云存储。

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

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

相关文章

嵌入式中14 个超级牛的免费开源小工具

Homebrew for macOS 地址&#xff1a;https://brew.sh Mac 上非常好用的包管理工具&#xff0c;很多常见的安装都可以通过 brew install app 或者 brew cask install app 直接安装&#xff0c;类似 apt-get 。 Oh My Zsh 地址&#xff1a;https://github.com/robbyrussell…

系统设计:设计Spotify

初始阶段&#xff1a;基础版本 需求: 初始要求是处理50万用户和3000万首歌曲。我们将有播放歌曲的用户和上传歌曲的艺术家。 1*6V8fzH4kUg780E7AJExMsA.png 估算&#xff1a;数据计算 让我们从估算我们需要的存储开始。首先&#xff0c;我们需要将歌曲存储在某种存储中。 •歌曲…

Machine Vision Technology:Lecture2 Linear filtering

Machine Vision Technology&#xff1a;Lecture2 Linear filtering Types of ImagesImage denoising图像去噪Defining convolution卷积的定义Key properties卷积的关键属性卷积的其它属性Annoying details卷积练习Sharpening锐化Gaussian KernelNoise噪声 分类Gaussian noise高…

Sora:开启视频生成新时代的强大人工智能模型

目录 一、Sora模型的诞生与意义 二、Sora模型的技术特点与创新 三、Sora模型的应用前景与影响 四、面临的挑战与未来发展 1、技术挑战 2、道德和伦理问题 3、计算资源需求 4、未来发展方向 随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为…

jenkins插件下载失败bug

如果遇到安装jenkins插件经常失败并报以下类似错误&#xff0c;很可能是因为jenkins国外官方插件地址下载速度非常慢&#xff0c;我们可以修改为国内插件地址。 java.io.IOException: Failed to load: SCM API Plugin (scm-api 676.v886669a_199a_a_) - Jenkins (2.361.4) or h…

外包干了6个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了重庆一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

Java中的时间API:Date、Calendar到Java.time的演变

引言 在软件开发中&#xff0c;处理时间和日期是一项基本且不可或缺的任务。无论是日志记录、用户信息管理还是复杂的定时任务&#xff0c;准确地处理时间都显得至关重要。然而&#xff0c;时间的处理并不像它看起来那么简单&#xff0c;尤其是当我们考虑到时区、夏令时等因素…

稀疏图带负边的全源最短路Johnson算法

BellmanFord算法 Johnson算法解决的问题 带负权的稀疏图的全源最短路 算法流程 重新设置的每条边的权重都大于或等于0&#xff0c;跑完Djikstra后得到的全源最短路&#xff0c;记得要还原&#xff0c;即&#xff1a;f(u,v) d(u,v) - h[u] h[v] 例题

Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析

3. SpringBoot原理 SpringBoot使我们能够集中精力地去关注业务功能的开发&#xff0c;而不用过多地关注框架本身的配置使用。而我们前面所讲解的都是面向应用层面的技术&#xff0c;接下来我们开始学习SpringBoot的原理&#xff0c;这部分内容偏向于底层的原理分析。 在剖析Sp…

LeetCode225. 用队列实现栈(C++)

LeetCode225. 用队列实现栈 题目链接代码 题目链接 https://leetcode.cn/problems/implement-stack-using-queues/description/ 代码 class MyStack { public:queue<int> q1;queue<int> q2;MyStack() {}void push(int x) {q1.push(x);}int pop() {int size q1…

【Unity】如何设置Unity脚本的执行顺序?

在 Unity 编辑器中设置脚本执行顺序 在 Unity 中&#xff0c;如果有多个脚本&#xff0c;并且它们之间的执行顺序很重要&#xff0c;可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中&#xff0c;将向会展示如…

MySQL 5.7.31详细下载安装配置

1、下载步骤 下载完毕后将文件解压到你想保存到的盘和目录内。我是将文件解压到D:\Mysql目录下面 2.配置环境变量 1.系统—>高级系统设置—>环境变量—>系统变量 在系统变量中点击新建&#xff0c;变量名为量名为&#xff1a;MYSQL_HOME&#xff0c;添加你的mysql…

怎么调用文心一言的api接口生成一个简单的聊天机器人(python代码)

寒假在学习大模型&#xff0c;但也没弄出多少眉目&#xff0c;电脑性能还有点小问题&#xff0c;大模型总跑不起来&#xff0c;只会简单调用一下现有的大模型的接口&#xff0c;例如&#xff1a;文心一言&#xff0c;下面展示一下代码&#xff1a; import tkinter as tk impor…

比亚迪领航新能源时代:汉唐传承,品牌力量

比亚迪&#xff0c;以中国文化的深度与自信&#xff0c;为新能源汽车领域注入强大动力。汉唐车型&#xff0c;不仅承载着中国古代文明的辉煌&#xff0c;更以其创新技术和环保理念&#xff0c;终结油电之争&#xff0c;让燃油车再次破防。作为销量冠军&#xff0c;比亚迪品牌的…

Leetcode : 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;最开始排序算法&…

超越传统模式:商品企划系统如何助力鞋服品牌创新突围?

随着市场竞争的日益激烈&#xff0c;传统的商品管理模式已经难以满足现代鞋服品牌的发展需求。为了在这个快速变化的时代中立足&#xff0c;许多品牌开始寻求创新和突破。而商品企划系统&#xff0c;作为一种新兴的管理工具&#xff0c;正成为鞋服品牌创新突围的关键。 一、打…

域控操作七:让某人不执行某策略/单独放行某人

比如我设置的是禁用移动热点&#xff0c;我在这里对某人拒绝&#xff0c;那他就能用移动热点

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

模型优化_如何提高网络/模型的泛化能力?(全面)

目录 1. 以数据为中心的泛化方法 1.1 使用更多数据 1.2 做好数据预处理 特征工程 1.3 数据增强 1.4 调整数据分布 2. 以模型为中心的泛化方法 2.1 使用更大批次 超参数调优 2.2 调整目标函数 2.3 调整网络结构 2.4 屏蔽网络节点 2.5 权值正则化 2.6 偏差-方差权衡…

基于springboot+vue的企业oa管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…