瑞吉外卖Day04

1.文件的上传下载

  @Value("${reggie.path}")private String basePath;/*** 文件上传** @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file) {log.info("文件上传");//原始文件名String originalFilename = file.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//使用uuid重新生成文件名,防止文件被覆盖String filename = UUID.randomUUID().toString() + suffix;//创建目录对象File dir = new File(basePath);if (!dir.exists()) {//目录不存在创建dir.mkdir();}try {//将临时文件转存到指定位置file.transferTo(new File(basePath + filename));} catch (IOException e) {e.printStackTrace();}return R.success(filename);}

  /*** 文件下载*/@GetMapping("/download")public void download(String name, HttpServletResponse response) {try {//输入流,读入文件内容FileInputStream fileInputStream = new FileInputStream(basePath + name);//输出流,写回浏览器ServletOutputStream outputStream = response.getOutputStream();response.setContentType("image/jpeg");int len = 0;byte[] bytes = new byte[1024];while ((len = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, len);outputStream.flush();}fileInputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();} 

 2.新增菜品

2.1分类

   /*** 根据条件查询分类数据*/@GetMapping("/list")public R<List<Category>> list(Category category){//条件构造器LambdaQueryWrapper<Category> queryWrapper=new LambdaQueryWrapper();//条件queryWrapper.eq(category.getType()!=null,Category::getType,category.getType());//排序条件queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);List<Category> list = categoryService.list(queryWrapper);return R.success(list);}

2.2创建实体类

@Data
public class Dish {private Long id;//菜品名称private String name;//菜品分类idprivate Long categoryId;//菜品价格private BigDecimal price;//商品码private String code;//商品图片private String image;//描述信息private String description;//状态private Integer status;//顺序private Integer sort;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;@TableLogicprivate Integer is_deleted;
}
@Data
public class DishFlavor implements Serializable {private Long id;private Long dishId;private String name;private String value;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;@TableLogicprivate Integer is_deleted;}

dto

@Data
public class DishDto extends Dish {private List<DishFlavor> flavors=new ArrayList<>();private String categoryName;private Integer copies;
}

2.3service层

public interface DishService extends IService<Dish> {//新增菜品,同时插入菜品对应的口味public void saveWithFlavor(DishDto dishDto);
}

因为添加了@Transactional事务注解,所以主程序上添加事务驱动注解:

@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
public class ProductRuijiApplication {public static void main(String[] args) {SpringApplication.run(ProductRuijiApplication.class, args);log.info("程序启动成功");}
}

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {@Autowiredprivate DishFlavorService dishFlavorService;/*** 新增菜品** @param dishDto*/@Override@Transactionalpublic void saveWithFlavor(DishDto dishDto) {//保存菜品的基本信息this.save(dishDto);Long dishId = dishDto.getId();//保存菜品口味List<DishFlavor> flavors = dishDto.getFlavors();flavors = flavors.stream().map(item -> {item.setDishId(dishId);return item;}).collect(Collectors.toList());dishFlavorService.saveBatch(flavors);}
}

2.4controller层

@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate DishFlavorService dishFlavorService;@PostMapping()public R<String> save(@RequestBody DishDto dishDto){dishService.saveWithFlavor(dishDto);return R.success("新增菜品成功");}}

3.菜品分页查询

  @GetMapping("/page")public R<Page> page(int page, int pageSize, String name) {//分页构造器Page<Dish> pageInfo = new Page<>(page, pageSize);Page<DishDto> dishDtoPage = new Page<>();//条件构造器LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(name != null, Dish::getName, name);queryWrapper.orderByDesc(Dish::getUpdateTime);dishService.page(pageInfo, queryWrapper);//对象拷贝BeanUtils.copyProperties(pageInfo, dishDtoPage, "records");List<Dish> records = pageInfo.getRecords();List<DishDto> list = records.stream().map((item) -> {DishDto dishDto = new DishDto();//拷贝BeanUtils.copyProperties(item, dishDto);Long categoryId = item.getCategoryId();//分类idCategory category = categoryService.getById(categoryId);if (category!=null){String categoryName = category.getName();dishDto.setCategoryName(categoryName);}return dishDto;}).collect(Collectors.toList());dishDtoPage.setRecords(list);return R.success(dishDtoPage);}

4.修改菜品

4.1页面回显

因为需要查两张表,所以自定义查询

/*** 根据id查询菜品信息,以及口味信息** @param id*/@Overridepublic DishDto getWithFlavor(Long id) {//1.菜品基本信息Dish dish = this.getById(id);DishDto dishDto=new DishDto();BeanUtils.copyProperties(dish,dishDto);//2.菜品对应的口味信息LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(DishFlavor::getDishId,dish.getId());List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);dishDto.setFlavors(flavors);return dishDto;}

回显查询

 /*** 根据id查询菜品id*/@GetMapping ("/{id}")public R<DishDto> get(@PathVariable("id") Long id){DishDto dishDto = dishService.getWithFlavor(id);return R.success(dishDto);}

5.批量删除

    @DeleteMappingpublic R<String> delete(String ids) {String[] split = ids.split(","); //将每个id分开//每个id还是字符串,转成LongList<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());dishService.removeByIds(idList);//执行批量删除log.info("删除的ids: {}", ids);return R.success("删除成功"); //返回成功}

6.起售与禁售

@PostMapping("/status/{st}")public R<String> setStatus(@PathVariable int st, String ids) {//处理string 转成LongString[] split = ids.split(",");List<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());//将每个id new出来一个Dish对象,并设置状态List<Dish> dishes = idList.stream().map((item) -> {Dish dish = new Dish();dish.setId(item);dish.setStatus(st);return dish;}).collect(Collectors.toList()); //Dish集合log.info("status ids : {}", ids);dishService.updateBatchById(dishes);//批量操作return R.success("操作成功");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192809.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JimuReport积木报表 v1.6.5 版本发布—免费报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

k8s集群搭建(ubuntu 20.04 + k8s 1.28.3 + calico + containerd1.7.8)

环境&需求 服务器&#xff1a; 10.235.165.21 k8s-master 10.235.165.22 k8s-slave1 10.235.165.23 k8s-slave2OS版本&#xff1a; rootvms131:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.5 LTS Release: …

从头开始的卷积神经网络

VGG-16 卷积神经网络。来源&#xff1a;LearnOpenCV 参考资料&#xff1a;这篇文章可以在 Kaggle Notebook &#x1f9e0; Convolutional Neural Network From Scratch上更好地阅读。路易斯费尔南多托雷斯 一、说明 本文详细介绍在tf2.0上&#xff0c;使用ceras实现基本的神经…

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;…

springboot单体项目部署

配置类 检查跨域配置类 检查黑白名单是否有问题&#xff0c;是否需要更改 配置文件 检查端口 查看端口是否为需要搭建的端口 检查数据源 查看数据库是否为线上数据库 配置页面 注意&#xff1a;如果是单体项目的话&#xff0c;前端页面是和后端整合在一起的&#xff0…

第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.题库维护 4.1.1数据请求示意图 4.1.2添加题库&#xff08;login.php&#xff09;数据请求代码 4.1.3删除题库&#xff08;login.php&#xff09;数据请求代码 4.1.4 业务处理Service&#xff08;tiKuService…

【React】Redux基本使用

什么情况使用 Redux &#xff1f; Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话&#xff0c;当我们有以下的应用场景时&#xff0c;我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务&#xff0c;还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类&#xff0c;那么我们可以事先写好一个类&a…

【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff0c; 而从数据库处理查询操作。 为什么使用读写分离 从集中到分布&#xff0c;最基本的一个需求不是数据存储的瓶颈&#xff0c;而是在于计算的瓶颈&#xff…

汽配零件发FBA美国专线

随着电商的迅速发展&#xff0c;跨境电商平台如亚马逊的FBA(Fulfillment by Amazon)服务成为了许多商家选择的销售渠道。对于汽配零件行业来说&#xff0c;发FBA美国专线可以打开更广阔的市场&#xff0c;并且有望获得可观的发展前景。下面将从市场分析和前景两个方面来探讨汽配…

pyTorch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…

[NSSRound#7 Team]ShadowFlag

文章目录 前置知识/proc目录python的反弹shellpin码计算 解题步骤 前置知识 /proc目录 Linux系统上的/proc目录是一种文件系统&#xff0c;用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息&#xff0c;甚至可以通过更改其中某些文件来改变内核的运行状态。/pro…

漏电继电器 LLJ-250HT AC220V 50-500ma 面板安装

系列型号&#xff1a; LLJ-10H(S)漏电继电器LLJ-15H(S)漏电继电器LLJ-16H(S)漏电继电器 LLJ-25H(S)漏电继电器LLJ-30H(S)漏电继电器LLJ-32H(S)漏电继电器 LLJ-60H(S)漏电继电器LLJ-63H(S)漏电继电器LLJ-80H(S)漏电继电器 LLJ-100H(S)漏电继电器LLJ-120H(S)漏电继电器LLJ-125H(…

深度学习 机器视觉 人脸识别系统 - opencv python 计算机竞赛

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

等保到底在“保”什么?

在信息时代&#xff0c;等保评级成为衡量企业信息安全水平的重要标准。那么&#xff0c;什么是等保评级呢&#xff1f;等保合规到底保的是什么呢&#xff1f;一起来看看吧。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 等保评级&#xff0c;会从七个维度进…

03-CSS基础选择器

3.1 CSS基础认知&#x1f34e; 3.1.1 &#x1f441;️‍&#x1f5e8;️CSS概念 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets)&#xff0c;为网页标签增加样式表现的 语法格式&#xff1a; 选择器{<!-- 属性设置 -->属性名:属性值; <!--每一个…

从0到0.01入门React | 004.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序

QString exePath QCoreApplication::applicationDirPath(); //获取要启动的另一个exe路径 exePath exePath “/OffLineProcess.exe”; //路径exe名称 QProcess* Process new QProcess; //创建新的进程 Process->start(exePath)…

Dart利用私有构造函数_()创建单例模式

文章目录 类的构造函数_()函数dart中构造函数定义 类的构造函数 类的构造函数有两种&#xff1a; 1&#xff09;默认构造函数&#xff1a; 当实例化对象的时候&#xff0c;会自动调用的函数&#xff0c;构造函数的名称和类的名称相同&#xff0c;在一个类中默认构造函数只能由…

Copliot:让你一秒变身网页达人的神奇助手

Copliot&#xff1a;一款能够帮助你快速理解网页内容的智能助手 你是否有过这样的经历&#xff0c;当你浏览网页时&#xff0c;遇到了一些你不太了解的内容&#xff0c;比如一些专业术语&#xff0c;一些复杂的概念&#xff0c;或者一些有趣的话题&#xff1f;你是否想要快速地…