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

苍穹外卖 ...待更新

苍穹外卖

  • 1、 阿里云OSS
  • 2、菜品分类查询
  • 3、菜品的停售和起售

1、 阿里云OSS

在这里插入图片描述
工具类

package com.sky.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}
}

属性类 可以通过在properties中根据前缀名称匹配到

package com.sky.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}

配置类 项目启动时把工具类加载进来 只有一个即可

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;import java.nio.charset.StandardCharsets;/*** @ClassName Myconfig* @Description 配置类 用于构建阿里云文件上传工具类* @Author lukcy* @Date 2024/7/7 11:02* @Version 1.0*/@Configuration
@Slf4j
public class Myconfig {/*** 返回工具类 只用创建一个就行* @param aliOssProperties* @return*/@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("创建文件上传工具类:{}",aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

使用

package com.sky.controller.admin;import com.sky.annotation.AutoFilled;
import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
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;
import java.util.UUID;/*** @ClassName CommonController* @Description TODO* @Author lukcy* @Date 2024/7/7 10:46* @Version 1.0*/
@Api("通用接口")
@Slf4j
@RequestMapping("/admin/common")
@RestController
public class CommonController {/*** 文件上传* @param file* @return*/@Autowiredprivate AliOssUtil aliOssUtil;@PostMapping("/upload")public Result<String> upload(MultipartFile file){try {String originalFilename = file.getOriginalFilename();String extension = null;if (originalFilename != null) {extension = originalFilename.substring(originalFilename.lastIndexOf("."));}String objectName = UUID.randomUUID().toString() + extension;String filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {}return Result.error(MessageConstant.UPLOAD_FAILED);}}

即可上传到服务器 并且将地址回显给前端 前端通过src就能显示照片了

2、菜品分类查询

    /*** 菜品分页查询* @param dishPageQueryDTO* @return*/@Overridepublic PageResult page(DishPageQueryDTO dishPageQueryDTO) {PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());Page<DishVO> page = dishMapper.page(dishPageQueryDTO);return new PageResult(page.getTotal(), page.getResult());}

主要前端需要的有一个分类名称 这是DIsh里边没有的,我们需要根据分类id找到分类名称,二表连接。

 <select id="page" resultType="com.sky.vo.DishVO">select d.*, c.name as categoryName from dish d left outer join category c on d.category_id = c.id<where><if test="name != null">and d.name like concat('%', #{name}, '%')</if><if test="categoryId != null">and d.category_id = #{categoryId}</if><if test="status != null">and d.status = #{status}</if></where>order by d.create_time desc</select>

命名为categoryName 是因为我们的VO里就是该名称,mybatis可以帮我们set进去

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;//菜品分类idprivate 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;
}

这里我本来使用的是这个方法

 /*** 菜品分页查询* @param dishPageQueryDTO* @return*/@Overridepublic PageResult page(DishPageQueryDTO dishPageQueryDTO) {PageHelper.startPage(dishPageQueryDTO.getPage(),dishPageQueryDTO.getPageSize());//先获取DISH的基本信息Page<Dish> page=dishMapper.page(dishPageQueryDTO);long total = page.getTotal();List<Dish> result = page.getResult();//将分类名称给加上List<DishVO> dishVOS=result.stream().map((item->{DishVO dishVO=new DishVO();BeanUtils.copyProperties(item,dishVO);Long categoryId = item.getCategoryId();String Cname=categoryMapper.getNameByCID(category`DishServiceImpl`Id);dishVO.setCategoryName(Cname);return dishVO;})).collect(Collectors.toList());return new PageResult(total,dishVOS);}

但是每个菜品都要查询一次数据库 查询名称 耗时
第一种方法 只用查询一次即可。

3、菜品的停售和起售

我自己原来想的是 菜品停售时要判断是否有正在起售的套餐关联它,如果有,则不能停售,该方法不对,因为菜品停售时应该把关联的套餐也给停售了,

DishServiceImpl

/*** 菜品起售停售** @param status* @param id
*/
@Transactional
public void startOrStop(Integer status, Long id) {Dish dish = Dish.builder().id(id).status(status).build();dishMapper.update(dish);if (status == StatusConstant.DISABLE) {// 如果是停售操作,还需要将包含当前菜品的套餐也停售List<Long> dishIds = new ArrayList<>();dishIds.add(id);// select setmeal_id from setmeal_dish where dish_id in (?,?,?)List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(dishIds);if (setmealIds != null && setmealIds.size() > 0) {for (Long setmealId : setmealIds) {Setmeal setmeal = Setmeal.builder().id(setmealId).status(StatusConstant.DISABLE).build();setmealMapper.update(setmeal);}}}
}

还有就是不必把套餐和菜品查询出来再去更改其状态,直接把id和状态赋值给他更改就行了,减少了sql操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RocketMQ 消费者之顺序消费和流程详解附源码解析
  • JavaSE学习笔记之内部类、枚举类和基本类型包装类
  • 不同型号的GD32 MCU如何区分?
  • C语言——基础框架、变量、运算符
  • jmeter-beanshell学习6-beanshell生成测试报告
  • Java:构造函数与对象
  • 服务器怎么进PE系统?
  • Wintopay - 一站式国际支付收款平台
  • leetcode74. 搜索二维矩阵
  • 一周涨8K star!RAG技术迎来大升级,速度关注
  • Postgresql - 用户权限数据库
  • Python酷库之旅-第三方库Pandas(017)
  • 5G中的RedCap
  • 【源码开源】C#桌面应用开发:串口调试助手
  • JS爬虫实战之极验四代
  • canvas绘制圆角头像
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • k个最大的数及变种小结
  • mockjs让前端开发独立于后端
  • Next.js之基础概念(二)
  • Node项目之评分系统(二)- 数据库设计
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对象管理器(defineProperty)学习笔记
  • 我与Jetbrains的这些年
  • 原生JS动态加载JS、CSS文件及代码脚本
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 2017年360最后一道编程题
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #include<初见C语言之指针(5)>
  • #宝哥教你#查看jquery绑定的事件函数
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $forceUpdate()函数
  • (42)STM32——LCD显示屏实验笔记
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (推荐)叮当——中文语音对话机器人
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Sublime Text3配置Lua运行环境
  • (转)母版页和相对路径
  • (转)树状数组
  • .net 4.0发布后不能正常显示图片问题
  • .NET C# 使用 iText 生成PDF
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net 反编译_.net反编译的相关问题
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 的字符串暂存池
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • @31省区市高考时间表来了,祝考试成功
  • @RequestBody与@ModelAttribute
  • @Transactional事务注解内含乾坤?
  • [2024-06]-[大模型]-[Ollama] 0-相关命令