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

苍穹外卖--新增菜品

1.需求分析和设计

产品原型

业务规则:

菜品名称必须是唯一的

菜品必须属于某个分类下,不能单独存在

新增菜品时可以根据情况选择菜品的口味

每个菜品必须对应一张图片

接口设计:

根据类型查询分类(已完成)

文件上传

新增菜品

根据类型查询分类

数据库设计(dish菜品表和dish_flavor口味表)

2.代码开发

OssConfiguration代码:

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对象*/
@Configuration//注解,表示这是员工配置类
@Slf4j
public class OssConfiguration {@Bean//交给spring容器管理@ConditionalOnMissingBean//保证Spring容器里只有员工Util对象public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());//读取配置文件内的数据,然后给配置类赋值}
}

CommonController代码:

package com.sky.controller.admin;import com.sky.constant.MessageConstant;
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;
import java.util.UUID;/*** 通用接口*/
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file){//参数名要和前端的保持一致log.info("文件上传:{}",file);try {//原始文件String originalFilename = file.getOriginalFilename();//截取原始文件名的后缀String 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) {log.info("文件上传失败:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
}

DishController代码:

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("新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}",dishDTO);dishService.saveWithFlavor(dishDTO);return Result.success();}
}

DishService代码:

package com.sky.service;import com.sky.dto.DishDTO;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;@Service
public interface DishService {/*** 新增菜品和对应的口味* @param dishDTO*/void saveWithFlavor(DishDTO dishDTO);
}

DishServiceImpl代码:

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 saveWithFlavor(DishDTO dishDTO) {Dish dish = new Dish();BeanUtils.copyProperties(dishDTO,dish);//向菜品表插入1条数据dishMapper.insert(dish);//获取inset语句生成的主键值Long dishId = dish.getId();//向口味表插入n条数据List<DishFlavor> flavors = dishDTO.getFlavors();if(flavors != null && flavors.size() > 0){//是否有口味数据flavors.forEach(dishFlavor -> {dishFlavor.setDishId(dishId);});dishFlavorMapper.insertBatch(flavors);}}
}

DishMapper代码:

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)void insert(Dish dish);
}

DishFlavorMapper代码:

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);
}

DishMapper.xml代码

<?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">/*useGeneratedKeys="true"表示刚刚插入所生成的主键值,keyProperty="id"将id返回值给id*/INSERT INTO dish (name,category_id,price,image,description,create_time,update_time,create_user,update_user,status)VALUES(#{name},#{categoryId},#{price},#{image},#{description},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})</insert>
</mapper>

DishFlavorMapper.xml代码:

<?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>

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}alioss:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: LTAI5tPeFLzsPPT8gG3LPW64access-key-secret: U6k1brOZ8gaOIXv3nXbulGTUzy6Pd7bucket-name: sky-itcast
http://www.xdnf.cn/news/417835.html

相关文章:

  • 按键精灵ios脚本新增元素功能助力辅助工具开发(一)
  • 机器学习07-归一化与标准化
  • mybatis中${}和#{}的区别
  • 【RabbitMQ】工作队列和发布/订阅模式的具体实现
  • 微服务八股(自用)
  • React Native告别图标体积大手动更换慢的噩梦:让图标更新像修改文字一样简单
  • 聊一聊Electron中Chromium多进程架构
  • 数据结构day1
  • 使用 IntelliJ IDEA 和 Maven 创建 Spark 项目
  • 云原生|kubernetes|kubernetes的etcd集群备份策略
  • 高防服务器部署实战:从IP隐匿到协议混淆
  • Scala和Go差异
  • 【面试 · 三】react大集合(类式/函数式)
  • 需求与技术实现不匹配,如何协调
  • 【 Redis | 实战篇 秒杀实现 】
  • 在虚拟机Ubuntu18.04中安装NS2教程及应用
  • Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
  • niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程
  • Unity引擎源码-物理系统详解-其一
  • centos中libc.so.6No such file的解决方式
  • AI+企业应用级PPT生成(实战)
  • 初识XML
  • 软件测试(概念1)
  • 使用CAS操作实现乐观锁的完整指南
  • C++的历史与发展
  • 原创-业务接口数据监控
  • MyBatis-Plus的批量插入与原生JDBC效率对比
  • git 怎么更改本地的存储的密码
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
  • Yarn-概述