阿里云-对象存储服务(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=xxxxxxxx
set 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: 8080
spring:
  profiles:
    active: dev
  main:
    allow-circular-references: true
  datasource:
    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=true
      username: ${sky.datasource.username}
      password: ${sky.datasource.password}
mybatis:
  #mapper配置文件
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.sky.entity
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true
logging:
  level:
    com:
      sky:
        mapper: debug
        service: info
        controller: info
sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 720000022
    # 设置前端传递过来的令牌名称
    admin-token-name: token
  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}
(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.com
    access-key-id: LTAI5tKTFVey
    access-key-secret: mAgLzrVh68DK
    bucket-name: sky-itcast-tx
文件的完整代码为:
sky:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    host: localhost
    port: 3306
    database: sky_take_out
    username: root
    password: root
  alioss:
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: LTAI5tKTFVe
    access-key-secret: mAgLzrVh68DKAu
    bucket-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
    @ConditionalOnMissingBean
    public 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 {
    @Autowired
    private 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 {
    @Autowired
    private 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)//指定数据库操作类型为INSERT
    void 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)//指定数据库操作类型为INSERT
    void 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 {
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private DishFlavorMapper dishFlavorMapper;
    /**
     * 保存菜品及其配料信息
     * @param dishDTO
     */
    @Transactional
    public void saveWithFlavors(DishDTO dishDTO) {
        Dish dish = new Dish();
        //将dto对象中的属性复制到dish对象中
        BeanUtils.copyProperties(dishDTO, dish);
        //向dish表中插入1条菜品信息
        dishMapper.insert(dish);
        //获取刚插入的菜品的id
        Long dishId = dish.getId();
 
        //向dish_flavor表中插入N个配料信息
        List<DishFlavor> flavors = dishDTO.getFlavors();
        //判断是否有配料信息
        if (flavors != null && flavors.size() > 0) {
            //给配料信息设置dish_id
            flavors.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)是否插入成功

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