苍穹外卖-新增菜品代码开发

一.文件上传接口

整个程序的执行过程:浏览器传来图片到后端,后端将图片传到阿里云:

POST请求,请求路径是admin/common/upload,我们需要先创建一个CommonController

1.控制层开发commoncontroller

CommonController 类通过 @RestController 注解暴露为一个 RESTful 接口,主要提供文件上传功能。通过 @PostMapping("/upload"),定义了一个文件上传的接口 upload。该接口接收前端上传的文件,使用 MultipartFile 类型的 file 参数接收文件。首先,接口获取文件的原始文件名 originalFilename,然后通过 substring() 截取文件的后缀(例如 .jpg.png)。接着,利用 UUID.randomUUID() 生成一个唯一的文件名 objectName,避免文件名冲突。生成的文件名与原始文件的后缀结合后,调用 AliOssUtil.upload() 方法将文件的字节流上传至阿里云 OSS,并返回文件的存储路径 filePath

在文件上传过程中,接口通过 try-catch 块捕获可能出现的异常,例如文件读取或上传失败等。如果上传过程中没有出现异常,文件上传成功后,接口会使用 Result.success(filePath) 返回一个成功响应,携带上传后文件在阿里云 OSS 中的存储路径。若发生异常,则会捕获 IOException 并记录错误日志 log.error("文件上传失败", e),然后返回一个失败的响应 Result.error("MessageConstant.UPLOAD_FAILED"),告知前端上传失败。

2.OSS配置

AliOssProperties 类通过 @ConfigurationProperties(prefix = "sky.alioss") 注解从 application.propertiesapplication.yml 中读取以 sky.alioss 为前缀的配置信息。这些配置信息包括:endpoint(阿里云 OSS 服务的访问域名)、accessKeyId(用于身份验证的阿里云访问密钥 ID)、accessKeySecret(用于身份验证的阿里云访问密钥 Secret)和 bucketName(存储桶名称)。这些配置项被自动注入到 AliOssProperties 类中的字段,并通过 @Component 注解使其成为 Spring 的一个组件,供其他部分使用。

AliOssUtil 类是一个工具类,提供了与阿里云 OSS 的交互功能,特别是文件上传。它包含一个 upload() 方法,接受文件的字节数据和目标文件名,并将文件上传到阿里云 OSS 存储桶。方法中首先使用 OSSClientBuilder 创建一个 OSSClient 实例,并通过该实例调用 putObject() 方法将文件上传到指定的 OSS 存储桶。上传成功后,生成文件的访问路径(https://bucketName.endpoint/objectName)并返回该路径。在上传过程中,AliOssUtil 会捕获并处理 OSSExceptionClientException,并打印详细的错误信息。

最终在配置文件application.yml中进行配置

二.新增菜品接口

1.控制层DishController

DishController 是一个用于处理菜品相关请求的控制器,使用了 @RestController 来标记它是一个 RESTful 风格的控制器,并通过 @RequestMapping("/admin/dish") 定义了该控制器的基本请求路径前缀 /admin/dish。控制器内的 save() 方法处理菜品的新增操作,接受前端传来的 DishDTO 对象,并调用 DishServicesaveWithFlavor() 方法来完成新增操作。在方法中,使用 @ApiOperation 注解对接口进行了描述,帮助生成接口文档,并通过日志 log.info("新增菜品:{}", dishDTO); 记录了操作过程中的关键信息。新增操作完成后,返回一个成功的 Result 对象,表示操作成功。

2.服务层方法及实现类

DishServiceImpl 类是 DishService 接口的实现类,主要用于处理菜品及口味的业务逻辑。在 saveWithFlavor() 方法中,首先通过 BeanUtils.copyProperties()DishDTO 中的属性复制到 Dish 实体对象中,然后调用 dishMapper.insert(dish) 插入菜品数据。接着,通过 dish.getId() 获取菜品的 ID,并遍历菜品口味列表 flavors,将 dishId 设置到每个 DishFlavor 实体中。最后,调用 dishFlavorMapper.insertBatch(flavors) 批量插入口味数据。方法上使用了 @Transactional 注解,确保菜品和口味的数据插入操作要么全部成功,要么全部失败,保证数据的一致性。

3.Mapper层开发

DishFlavorMapper 接口用于管理菜品口味数据,提供了一个方法 insertBatch(List<DishFlavor> flavors) 来批量插入口味数据。方法体内使用 MyBatis 注解 @Mapper 来声明该接口是 MyBatis 的映射接口。在 insertBatch() 方法中,使用了 <insert> 标签的 SQL 映射,向 dish_flavor 表插入多条数据。<foreach> 标签用于迭代传入的口味列表 flavors,并将每个口味的 dishIdnamevalue 插入到表中。

DishFlavorMapper.xml 中,insertBatch 是一个批量插入口味数据的方法。使用 <insert> 标签来定义插入语句,<foreach> 标签遍历传入的 flavors 列表,生成多条插入语句。每一条插入语句都将 dishIdnamevalue 插入到 dish_flavor 表中。

DishMapper.xml 中,insert 是一个插入菜品数据的方法。通过 useGeneratedKeys="true"keyProperty="id",该配置能够使数据库自动生成的主键(菜品的 ID)回填到 Dish 实体中。在 insert 语句中,菜品的各种字段(如 namecategoryIdpriceimage 等)会被插入到 dish 表中。@AutoFill 注解确保在插入时自动填充创建时间、更新时间等公共字段。

相关推荐
yxlalm1 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
Flynt6 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei6 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
yxlalm8 小时前
5.3解决超卖问题
java·spring boot·超卖
名字还没想好☜9 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
边境悍匪10 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
sunshine22 girl11 小时前
Java学习一 环境配置3 Idea中的maven仓库,pom.xml文件配置
学习·maven·intellij-idea
xcl092512 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet12 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly768912 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储