当前位置: 首页 > article >正文

【苍穹外卖】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

修改菜品:


http://www.kler.cn/news/288894.html

相关文章:

  • dinput8.dll错误应该如何修复呢?五种快速修复dinput8.dll错误的问题
  • SpringBoot开发——初步了解SpringBoot
  • CephX 认证机制及用户管理
  • 功能测试常用的测试用例大全
  • 大模型入门 ch01:大模型概述
  • 强化学习,第 5 部分:时间差异学习
  • 数据结构——单链表相关操作
  • C# 开发环境搭建(Avalonia UI、Blazor Web UI、Web API 应用示例)
  • n*n矩阵,输出矩阵中任意两点之间所有路径
  • 使用组件库:提升开发效率的关键
  • Arduino library for proteus 下载 安装 测试
  • <数据集>TACO垃圾识别数据集<目标检测>
  • 编译与链接
  • ArrayList 和 LinkedList 之间的主要区别。在什么情况下你会选择使用 ArrayList 而不是 LinkedList,反之亦然?
  • 文本数据分析-(TF-IDF)(1)
  • 突发性网络攻击的安全挑战分析
  • Google Play下架超110万款应用,中国成重灾区
  • HiveQL如何统计用户近一段时间活跃标签
  • 设计模式 17 中介者模式
  • Spring优缺点和SpringBoot基础和搭建
  • 数据库系统 第31节 物理存储与文件系统
  • 奇安信天眼--探针/分析平台部署及联动
  • MySQL5.7配置优化
  • h5适配iOS——window.open失效
  • 搭建pypi私有仓库(局域网内)出现的一些问题及解决方法
  • 【数据库|第11期】深入掌握 SQL Server、Access 与 SQLite 中的 `UNION` 与 `UNION ALL`:从理论到实践
  • windows系统安装配置Apache Maven
  • React16新手教程记录
  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  • 晋升路上的梦想之光,社科院与杜兰大学金融管理硕士助力你前行