苍穹外卖Day03——总结3

前期文章

文章标题地址
苍穹外卖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:阿里云云存储。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…

gRPC知识归档

文章目录 gRPC知识归档gRPC原理什么是gRPCgRPC的特性gRPC支持语言gRPC使用场景gRPC设计的动机和原则 数据封装和数据传输问题网络传输中的内容封装和数据体积问题JSONProtobuf&#xff08;微服务之间的服务器调用&#xff0c;一般采用二进制序列化&#xff0c;比如protobuf&…

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

计算机网络:数据链路层知识点汇总

文章目录 一、数据链路层功能概述二、封装成帧和透明传输三、差错控制&#xff08;检错编码&#xff09;四、差错控制&#xff08;纠错编码&#xff09;五、流量控制与可靠传输机制六、停止-等待协议七、后退N帧协议&#xff08;GBN&#xff09;八、选择重传协议&#xff08;SR…

SAP PP学习笔记04 - BOM1 - BOM创建,用途,形式,默认值,群组BOM等

本章开始讲BOM的内容。 1&#xff0c;BOM的定义 &#xff08;Bill of Materials&#xff09; 物料清单&#xff08;Bill of Materials&#xff0c;简称BOM&#xff09;是描述企业产品组成的技术文件。在加工资本式行业&#xff0c;它表明了产品的总装件、分装件、组件、部件、…

小程序固定头部实现:van-nav-bar插件

用的是Vant的NavBar插件&#xff1a; https://youzan.github.io/vant-weapp/#/nav-bar#wai-bu-yang-shi-lei 效果图 页面使用&#xff0c;放开注释的地方就可以显示左边按钮 <van-nav-bar title"精益成本核算" fixed"true" placeholder"true&qu…

Vmware Esxi 部署Mac OS虚拟机

Vmware Esxi在创建虚拟机的时候是有Mac OS选项的&#xff0c;但是实际创建时&#xff0c;选择ISO开机后一直反复引导&#xff0c;是有问题的&#xff0c;原因是需要先解锁&#xff0c;需要在ESXI主机上修改配置并重启。 首先找到管理-服务-TSM-ssh&#xff0c;点击启动&#x…

SecureCRT for Mac/win:保障数据安全的专业终端SSH工具软件

SecureCRT for Mac/win是一款广受欢迎的专业终端SSH工具软件&#xff0c;为用户提供了强大的加密通信和数据安全功能&#xff0c;使其成为网络管理人员、系统管理员和开发人员的首选工具。无论是在Mac还是Windows操作系统下&#xff0c;SecureCRT都能够帮助用户轻松地进行远程访…

数字生活的未来:Web3如何改变我们的日常

随着技术的飞速发展&#xff0c;我们的生活正变得日益数字化。而Web3作为一种新型的互联网模式&#xff0c;正以前所未有的方式改变着我们的日常生活。在本文中&#xff0c;我们将深入探讨Web3技术的特点以及它如何改变我们的数字生活。 1. Web3的特点 Web3是基于区块链技术和…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包&#xff1a;unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

ChatGPT-4 AI 绘图魔力释放

最近刚开通了 ChatGPT4&#xff0c;正好要设计一个网站图标&#xff0c;想测试一下它AI绘图的能力&#xff0c;让它根据文字描述生成一个想象中的图标 &#xff08;PS&#xff1a;如果想体验 GPT4 文生图&#xff0c;可以看这个教程 如何升级 ChatGPT 4.0&#xff09; 第1次交…

nginx使用详解--动静分离

什么是动静分离&#xff1f; 为了提高网站的响应速度&#xff0c;减轻程序服务器&#xff08;Tomcat&#xff0c;Jboss等&#xff09;的负载&#xff0c;对于静态资源&#xff0c;如图片、js、css等文件&#xff0c;可以在反向代理服务器中进行缓存&#xff0c;这样浏览器在请…

react使用@reduxjs/toolkit和react-redux实现store状态管理

一、概述 reduxjs/toolkit和react-redux是用于在React应用中管理全局状态的工具库 1、reduxjs/toolkit&#xff1a; reduxjs/toolkit是Redux官方推荐的工具库&#xff0c;是对 Redux 的二次封装&#xff0c;它提供了一些便捷的API和工具&#xff0c;帮助开发者更快速地编写R…

喜迎乔迁,开启新章 ▏易我科技新办公区乔迁庆典隆重举行

2024年1月18日&#xff0c;易我科技新办公区乔迁庆典在热烈而喜庆的氛围中隆重举行。新办公区的投入使用&#xff0c;标志着易我科技将以崭新姿态迈向新的发展阶段。 ▲ 易我科技新办公区 随着公司业务的不断发展和壮大&#xff0c;为了更好地适应公司发展的需要&#xff0c;…

mysql python学习笔记

mysql 基础概念 1.一个表格一般包含一个主建 2.可有多个主见,叫组合主见 3.可以有foreign key 用于链接外部表格的主建 外键目的&#xff1a; 这个约束的目的是确保当前表中的外键列&#xff08;JNO列&#xff09;的值必须存在于另一个表&#xff08;J’表&#xff09;的主键…

kswapd0挖矿病毒攻击记录

文章目录 一、起因与病毒分析1、起因2、阿里云告警2.1 恶意脚本代码执行12.2 恶意脚本代码执行22.3恶意脚本代码执行32.4 恶意脚本代码执行4 3、病毒简单分析3.1 病毒的初始化3.2 病毒本体执行 4、总结 二、ubuntu自救指南1、病毒清理2、如何防御 一、起因与病毒分析 1、起因 …

蓝桥杯 信号覆盖

遍历每一个坐标轴上的点&#xff0c;带入圆的方程&#xff0c;看是否在圆内或圆上 #include<bits/stdc.h> using namespace std; int main() {int w,h,n,r,i,j,k,s,ans0;cin>>w>>h>>n>>r;int x[n1],y[n1];for(i0;i<n;i){cin>>x[i]>&…

什么是前端框架中的数据绑定(data binding)?有哪些类型的数据绑定?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Linux读写锁相关函数及操作

读写锁&#xff1a; 概念&#xff1a;读写锁也叫共享-独占锁。当读写锁以读模式锁住时&#xff0c;它是以共享模式锁住的&#xff1b;当它以写模式锁住时&#xff0c;它是以独占模式锁住的。&#xff08;写独占&#xff0c;读共享&#xff09;。 读写锁使用场所&#xff1a; …

基于PHP的在线英语学习平台

有需要请加文章底部Q哦 可远程调试 基于PHP的在线英语学习平台 一 介绍 此在线英语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为学生&#xff0c;教师和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/…