苍穹外卖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*/@Transactionalpublic void saveWithFlavor(DishDTO dishDTO) {// 1. 添加菜品Dish dish = new Dish();BeanUtils.copyProperties(dishDTO, dish);dishMapper.saveDish(dish);// 主键回填技术, 用于后续给每个口味添加对应的菜品dish_idLong 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;//分类idprivate 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.hqwc.cn/news/499107.html

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

相关文章

【Wireshark傻瓜式安装,Wireshark使用过滤条件】

Wireshark傻瓜式安装&#xff0c;Wireshark使用过滤条件 安装使用wireshark过滤器表达式的规则1.抓包过滤器语法和实例&#xff08;1&#xff09;协议过滤&#xff08;2&#xff09;IP过滤&#xff08;3&#xff09;端口过滤&#xff08;4&#xff09;逻辑运算符&&与、…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库&#xff0c;常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步&#xff1a;确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本&#xff0c;您可…

2024031期传足14场胜负前瞻

2024031期售止时间为3月1日&#xff08;周五&#xff09;22点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率2场&#xff0c;1.5-2.0赔率3场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。 1、西布罗 VS 考文垂 西布朗近2次面对高…

小程序固定头部实现: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…

一图总结动态规划

该图是对动态规划的总的总结&#xff0c;想理解动态规划在各个题型的具体应用和题型分类&#xff0c;请移步另一篇详解文章 一命通关动态规划dp-CSDN博客https://blog.csdn.net/qq_74260823/article/details/136171639?spm1001.2014.3001.5501

s-table和columns初始化不完整,造成table文件的filter报错

问题 顺藤摸瓜找errorHandler.js文件 发现文件并没有什么问题 顺藤摸瓜找index.vue文件 首先找到报错的filter&#xff0c;发现与columnsSetting相关 找到columnsSetting发现等于columns 返回自己使用S-table组件的地方&#xff0c;发现columns初始化时仅初始化为ref()未表明…

如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

C++重新入门-string容器

目录 1.包含头文件 2.创建字符串 3.获取字符串长度 4.字符串拼接 5.字符串比较 相等性比较 大小比较 使用比较函数 6.访问字符串 7.查找子串 8.字符串修改 替换子串 插入字符或子串 删除字符或子串 9.提取子串 10.总结 当谈到C中的字符串时&#xff0c;std::str…

C++编译相关学习笔记

1.编译是什么&#xff1f; 简单的说&#xff0c;就是将文本文件转化为obj对象。详细的说包含以下三个步骤&#xff1a; &#xff08;1&#xff09;预处理代码。常用的预处理语句包含#include、if、ifdef、pragma。经过这一阶段 main.cpp变为main.i 这种文件里的内容就是在原文…

小红书的几种赚钱方式解读

小红书的七种变现方式&#xff1a; 1.通过小红书蒲公英平台接广告&#xff0c;粉丝数量大于1000的用户可以开通。单条笔记的广告费用从几百元到几十万不等。 2.开设小红书专栏&#xff0c;粉丝数量大于1万的用户可以开通。 3.进行私域变现&#xff0c;将小红书的咨询引导到微信…