【苍穹外卖】Day3 菜品接口
1 公共字段自动填充(待添加)
2 菜品接口
2.1 新增菜品
2.1.1 根据类型查询分类 接口
(已完成)
2.1.2 文件上传 接口
通用接口
配置文件
在自定义配置类中定义了四个属性
在配置文件中
代表当前使用的配置环境是 dev 开发环境
在 dev 里面继续配置阿里云 OSS
然后创建一个配置类
@Bean
是Spring框架中的一个注解,用于指示一个方法的返回值应该被注册为Spring应用上下文中的bean。使用@Bean
注解的方法通常会在Spring容器启动时被调用,并且其返回的对象会被Spring容器管理需要的时候要 @autowired 自动注入
@ConditionalOnMissingBean
是Spring框架提供的一个条件化注解,用于在存在特定类型的bean时才创建或注册另一个bean。如果容器中已经存在相同类型的bean,则不会注册被此注解标记的方法产生的bean
新建一个 CommonController
在 postman 上传图片
保存在阿里云 OSS
(注意图片大小,过大会出现错误)
2.1.3 新增菜品 接口
Path:/admin/dish
Method:POST
DishDTO:
package com.sky.dto;
import com.sky.entity.DishFlavor;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
public class DishDTO implements Serializable {
private Long id;
//菜品名称
private String name;
//菜品分类id
private Long categoryId;
//菜品价格
private BigDecimal price;
//图片
private String image;
//描述信息
private String description;
//0 停售 1 起售
private Integer status;
//口味
private List<DishFlavor> flavors = new ArrayList<>();
}
DishFlavor
package com.sky.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 菜品口味
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DishFlavor implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//菜品id
private Long dishId;
//口味名称
private String name;
//口味数据list
private String value;
}
@Transactional
是Spring框架提供的注解,用于声明方法执行时应该具有事务性,即方法的执行要么完全成功,要么完全失败,不留下中间状态。这通常是通过将方法的执行包裹在一个数据库事务中来实现的
2.1.4 分页查询
业务规则:
- 根据页码展示菜品信息
- 每页展示10条数据
- 分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询
设计一个VO(视图对象)
包括了查询要展示的所有字段
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;
//菜品分类id
private 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<>();
//private Integer copies;
}
Controller
Service
Mapper
用到了“起别名”和“左外连接”
左外连接:
select a.name,b.name from a
left outer join b
on a.id = b.id
会返回一张表,这张表包括 a 表的全部信息(如果 b 中没有 a.id 的信息,则设置为 null),包括b的部分信息(仅仅当且仅当 a.id = b.id 时)
2.1.5 删除菜品
业务规则:
- 可以一次删除一个菜品,也可以批量删除菜品
- 起售中的菜品不能删除
- 被套餐关联的菜品不能删除
- 删除菜品后,关联的口味数据也需要删除掉
注意:这里设计接口传参是一个 id 数组,当需要删除一个菜品时,仅需要传递一个 id
需要操作三张表,分别是 菜品表、口味表 和 套餐菜品 表
Controller
前端传递过来的是"1,2,3"这样的字符串,用注解进行自动解析成 List
@RequestParam
是一个用在Java Spring Web框架中的注解,它用于将Web请求中的参数(例如,来自HTML表单或URL的参数)映射到控制器(Controller)方法的参数上。当你使用基于注解的控制器方法时,Spring框架能够自动将请求参数绑定到相应的方法参数上
Service
业务逻辑比较复杂,要先判断两步,然后再删除两步
这里 判断当前菜品是否被套餐关联 时,新建了一个 Mapper,用来根据菜品 id 获得套餐 id,然后看套餐 id 集合是否为空
Mapper
这里用到了 in 和 foreach
foreach的标签:
<collection> 值是调用 Mapper 接口的形参名
<item> 遍历的临时变量名
<separator> 分隔符
<open> 和 <close> 开始和结尾的字符
剩下两个mapper都是简单的
2.1.6 修改菜品
根据 id 查询菜品(还有连带的口味)
根据 id 查询菜品
Service
修改菜品: