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

苍穹外卖项目实战(日记十)-记录实战教程及问题的解决方法-(day3-2)新增菜品功能完整版

阿里云-对象存储服务(OSS)教程

(1)阿里云OSS简介

(2)打开阿里云网址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

点击“立即开通”

(2)开通成功后,充值任意金额

顶栏选择“费用”|“充值”

(3)创建Bucket

点击左上角三条横线,搜索“OSS”|选择“对象存储OSS”

侧边栏选择“Bucket列表”|“创建Bucket”

填写自定义Bucket名称,其他默认即可

点击“完成创建”

点击“进入Bucket”

(4)关闭“阻止公共访问”

打开新建的Bucket,侧边栏选择“权限控制”|“阻止公共访问”

关闭阻止公用访问,选择“读写权限”,点击“设置”,选择”公共读“。步骤如下

(5)创建“AccessKey"

点击头像,点击“AccessKey”

选择“继续使用云账号 AccessKey”|点击“创建AccessKey”|点击“继续使用云账号 AccessKey”

进行身份验证

保存AccessKey

点击“确定”

(6)配置环境变量

用管理员身份打开命令行

按顺序输入以下命令

(1)设置环境变量命令行,xxxxxx改成你ID和SECRET

set OSS_ACCESS_KEY_ID=xxxxxxxxset OSS_ACCESS_KEY_SECRET=xxxxxxxx

注意等号左右不能有空格

(2)执行如下命令,让更改生效

setx OSS_ACCESS_KEY_ID "OSS_ACCESS_KEY_ID"setx OSS_ACCESS_KEY_SECRET "OSS_ACCESS_KEY_SECRET"

(3)验证环境变量是否生效

echo %OSS_ACCESS_KEY_ID%echo %OSS_ACCESS_KEY_SECRET%

至此,环境变量已成功配置!

(7)程序使用OSS服务

侧边栏滑动到最后,点击“SDK下载”|点击Java旁边的loge"查看文档",会弹出帮助文档|点击最下面的“文档中心打开”

找到以下位置,复制Maven依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

(8)application.yml代码完善

位置:sky-server/src/main/resources/application.yml

添加的具体代码:

alioss:endpoint: ${sky.alioss.endpoint}access-key-id: ${sky.alioss.access-key-id}access-key-secret: ${sky.alioss.access-key-secret}bucket-name: ${sky.alioss.bucket-name}文件的完整代码为:server:port: 8080spring:profiles:active: devmain:allow-circular-references: truedatasource:druid:driver-class-name: ${sky.datasource.driver-class-name}url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: ${sky.datasource.username}password: ${sky.datasource.password}mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#开启驼峰命名map-underscore-to-camel-case: truelogging:level:com:sky:mapper: debugservice: infocontroller: infosky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 720000022# 设置前端传递过来的令牌名称admin-token-name: tokenalioss:endpoint: ${sky.alioss.endpoint}access-key-id: ${sky.alioss.access-key-id}access-key-secret: ${sky.alioss.access-key-secret}bucket-name: ${sky.alioss.bucket-name}

(9)application-dev.yml代码完善

注意:以下代码中的数据库账号密码、access-key-id、access-key-secre和bucket-name需要改成自己的阿里云服务

如何申请阿里云的access-key-id、access-key-secre和bucket-name,在我主页有教程,这里不多赘述

位置:sky-server/src/main/resources/application-dev.yml

添加的代码:

  alioss:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: LTAI5tKTFVeyaccess-key-secret: mAgLzrVh68DKbucket-name: sky-itcast-tx文件的完整代码为:sky:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: sky_take_outusername: rootpassword: rootalioss:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: LTAI5tKTFVeaccess-key-secret: mAgLzrVh68DKAubucket-name: sky-itcast

(10)OssConfiguration.java文件创建

位置:sky-server/src/main/java/com/sky/config

文件完整代码:

package com.sky.config;import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/****  配置类,用于创建 AliOssUtil* Created by ZSC.* User: lenovo** @PackageName:com.sky.config* @projectName: sky-take-out* @ClassName: OssConfiguration* @Description: TODO* @Author ZSC* @Date 2024/3/18 09:49* @Version 1.0*/@Configuration
@Slf4j
public class OssConfiguration {/***  ConditionalOnMissingBean 条件创建  当没有这个类的时候进行创建*  @ConditionalOnMissingBean注解表示当不存在名为aliOssUtil的bean时,才会创建该bean。*       这意味着如果已经有其他地方定义了名为aliOssUtil的bean,那么这个方法将不会执行。**  在这个配置类中,定义了一个名为aliOssUtil的@Bean方法,用于创建一个AliOssUtil对象。**  在方法体中,通过依赖注入的方式获取AliOssProperties对象,并使用它的属性值来创建AliOssUtil对象。* @param aliOssProperties* @return*/@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("开始创建阿里云OSS文件上传工具类对象:{}", aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

(11)测试以上代码

可以直接启动项目

控制台出现以下信息,表示以上代码无误

(12)CommonController.java文件创建

创建位置:sky-server/src/main/java/com/sky/controller/admin

完整代码:

package com.sky.controller.admin;import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用借口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation(value = "上传文件")public Result<String> upload(MultipartFile file) {log.info("开始上传文件");try{// 获取文件名String originalFilename = file.getOriginalFilename();// 获取文件后缀String extension = originalFilename.substring(originalFilename.lastIndexOf("."));// 构造文件名String objectName = System.currentTimeMillis() + extension;// 上传文件String filePath = aliOssUtil.upload(file.getBytes(), objectName);// 返回文件路径return Result.success(filePath);} catch (IOException e) {log.error("上传文件失败", e);}return null;}
}

示意图:

(13)测试上传文件功能

网址:添加菜品

步骤:启动项目(DeBug)

至此,上传文件功能第一步实现成功!

注意,如果前端图片没有显现,说明调试时间太久了,图片显示不了的,复制控制台输出的图片路径到浏览器上看能不能访问,能访问就可以了

(14)新增菜品功能实现

以下是需要创建的完整的代码文件
1、DishController.java

位置:sky-server/src/main/java/com/sky/controller/admin/

文件完整代码:

package com.sky.controller.admin;import com.sky.dto.DishDTO;
import com.sky.result.Result;
import com.sky.service.DishService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/admin/dish")
@Api(tags = "后台菜品管理")
@Slf4j
public class DishController {@Autowiredprivate DishService dishService;/*** 新增菜品* @param dishDTO* @return*/@PostMapping@ApiOperation(value = "新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}", dishDTO);dishService.saveWithFlavors(dishDTO);return Result.success();}
}

示意图:

2、DishMapper.java

位置:sky-server/src/main/java/com/sky/mapper/

文件完整代码:

package com.sky.mapper;import com.sky.annotation.AutoFill;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);/*** 插入菜品* @param dish*/@AutoFill(value = OperationType.INSERT)//指定数据库操作类型为INSERTvoid insert(Dish dish);
}

示意图:

3、DishFlavorMapper.java

位置:sky-server/src/main/java/com/sky/mapper/

文件完整代码:

package com.sky.mapper;import com.sky.entity.DishFlavor;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface DishFlavorMapper {/*** 批量插入菜品配料信息* @param flavors*/void insertBatch(List<DishFlavor> flavors);
}

示意图:

4、DishMapper.java

位置:sky-server/src/main/java/com/sky/mapper/

文件完整代码:

package com.sky.mapper;import com.sky.annotation.AutoFill;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);/*** 插入菜品* @param dish*/@AutoFill(value = OperationType.INSERT)//指定数据库操作类型为INSERTvoid insert(Dish dish);
}

示意图:

5、DishService.java

位置:sky-server/src/main/java/com/sky/service/

文件完整代码:

package com.sky.service;import com.sky.dto.DishDTO;public interface DishService {// 新增菜品及其配料信息public void saveWithFlavors(DishDTO dishDTO);
}

示意图:

6、DishServiceimpl.java

位置:sky-server/src/main/java/com/sky/service/impl/

文件完整代码:

package com.sky.service.impl;import com.sky.dto.DishDTO;
import com.sky.entity.Dish;
import com.sky.entity.DishFlavor;
import com.sky.mapper.DishFlavorMapper;
import com.sky.mapper.DishMapper;
import com.sky.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Slf4j
public class DishServiceimpl implements DishService {@Autowiredprivate DishMapper dishMapper;@Autowiredprivate DishFlavorMapper dishFlavorMapper;/*** 保存菜品及其配料信息* @param dishDTO*/@Transactionalpublic void saveWithFlavors(DishDTO dishDTO) {Dish dish = new Dish();//将dto对象中的属性复制到dish对象中BeanUtils.copyProperties(dishDTO, dish);//向dish表中插入1条菜品信息dishMapper.insert(dish);//获取刚插入的菜品的idLong dishId = dish.getId();//向dish_flavor表中插入N个配料信息List<DishFlavor> flavors = dishDTO.getFlavors();//判断是否有配料信息if (flavors != null && flavors.size() > 0) {//给配料信息设置dish_idflavors.forEach(dishflavor -> {dishflavor.setDishId(dishId);});//向dish_flavor表中插入N条配料信息dishFlavorMapper.insertBatch(flavors);}}
}

示意图:

7、DishFlavorMapper.xml

位置:sky-server/src/main/resources/mapper/

完整代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishFlavorMapper"><insert id="insertBatch">insert into dish_flavor (dish_id, name, value) VALUES<foreach collection="flavors" item="df" separator=",">(#{df.dishId},#{df.name},#{df.value})</foreach></insert>
</mapper>

示意图:

8、DishMapper.xml

位置:sky-server/src/main/resources/mapper/

完整代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into dish(name, category_id, price, image, description,create_time, update_time, create_user, update_user)values(#{name}, #{categoryId}, #{price}, #{image}, #{description},#{createTime}, #{updateTime}, #{createUser}, #{updateUser})</insert>
</mapper>

示意图:

(15)测试新增菜品功能

1、IDEA启动(DeBug)项目,并在图中位置打上断点(sky-server/src/main/java/com/sky/service/impl/DishServiceimpl.java)

2、打开前端网页:添加菜品,并添加数据,点击保存,查看程序控制台断点位置信息

3、跳过断点(按F9)

4、检查数据库,查看数据(测试菜品或者text1)是否插入成功

至此,添加菜品功能已完成!

http://www.xdnf.cn/news/18575.html

相关文章:

  • 启动Flink SQL Client并连接到YARN集群会话
  • 拓展:simulink中将仿真环境离散化
  • K8S的部署与常用管理
  • VS2022的MFC中关联使用控制台并用printf输出调试信息
  • Redis 高可用篇
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十四)垂直滚动条
  • HarmonyOS实战(DevEco AI篇)—深度体验DevEco CodeGenie智能编程助手
  • 算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路(修改后版本)
  • `strcat` 字符串连接函数
  • 蔬菜溯源系统的开发与设计小程序
  • 新疆地州市1米分辨率土地覆盖图
  • Placement new是什么
  • 这也许就是DeepSeek V3.1性能提升的关键:UE8M0与INT8量化技术对比与优势分析
  • Python Excel
  • 何为‘口业’,怎么看待它
  • C++哈希表:unordered_map与unordered_set全解析
  • 搜索算法在实际场景中的应用
  • 基于ResNet50的血细胞图像分类模型训练全记录
  • 【Kubernetes知识点】Pod调度和ConfigMaps
  • 结构主义神话学的范式突破与后现代转向:从二元对立到数字神话素的符号学革命
  • 【深入理解 Linux 网络】收包原理与内核实现(下)应用层读取与 epoll 实现
  • 20250823解决荣品RD-RK3588-MID开发板在充电的时候大概每10s屏幕会像水波纹闪烁一下
  • douyin_search_tool:用python开发的抖音关键词搜索采集软件
  • 使用tensorRT10部署yolov5实例分割模型(2)
  • k8s总结
  • HTTP的状态码有哪些,并用例子说明一下
  • DS18B20温度传感器详解
  • 注意力机制:捕获长距离依赖关系的革命性技术
  • chapter06_应用上下文与门面模式
  • 每日算法题【链表】:链表的中间节点、返回倒数第k个节点、合并两个有序链表