java 瑞吉外卖day4及补全功能 文件上传下载 菜品分页查询 Dto类 菜品状态修改 菜品停售以及菜品删除

news2024/11/25 13:31:25

文件上传下载

 

 

文件下载介绍 

 

文件上传代码实现

 服务端上传:

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.path}")
    private String basePath;//从配置文件读取设置好的basePath

    @PostMapping("/upload")
    public R upload(MultipartFile file){
        //file是一个临时文件,需要转存到地址中,否则请求结束就会自动删除

        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取文件类型的字符串.jpg/.jpeg等等
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名 防止文件重名导致覆盖
        String fileName = UUID.randomUUID().toString() + substring;

        //创建文件路径,并检查文件夹是否存在
        File dir =new File(basePath);
        //如果不存在就新建文件夹
        if (!dir.exists()){
            dir.mkdirs();
        }

        try {
            //将文件转存到我们指定的文件夹里
            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //将fileName返回,后续还会用到
        return new R(1,fileName);

    }
}

文件下载实现

@GetMapping("/download")
public void download(String name, HttpServletResponse response){
    //输入流 读取文件内容
    try {
        FileInputStream fileInputStream =new FileInputStream(new File(basePath+name));
        //输出流,通过输出流将文件写会浏览器,在浏览器展示图片
        ServletOutputStream outputStream=response.getOutputStream();

        int len = 0;
        byte[] bytes=new byte[1024];
        while ((len=fileInputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,len);
            outputStream.flush();
        }
        //关闭资源
        outputStream.close();
        fileInputStream.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

}

新增菜品

 

 准备工作:

 

 梳理交互过程

下拉框数据:


//根据条件查询分类数据
@GetMapping("/list")
public R 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 new R(1,"查询成功",list);
}

 

DishServletImpl:

Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    @Autowired
    private DishFlavorService dishFlavorService;
    /**
     * 新增菜品,同时保存对应的口味数据
     * @param dishDto
     */

    @Override
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        //保存菜品的基本信息到菜品表dish
        this.save(dishDto);

        Long dishId = dishDto.getId();//菜品Id

        //菜品口味
        List<DishFlavor> flavors =dishDto.getFlavors();


        //给集合中的每个菜品口味都附上菜品id值
        flavors=flavors.stream().map((item)->{
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());

        //保存菜品口味数据到菜品口味表dish_flavor

        dishFlavorService.saveBatch(flavors);


    }
}

 

DishController:

@RestController
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;
    @Autowired
    private DishFlavorService dishFlavorService;

    @PostMapping
    public R save(@RequestBody DishDto dishDto){
        dishService.saveWithFlavor(dishDto);
        return new R(1,"新增菜品成功");
    }
}

菜品分页查询

 

 DishController:

@GetMapping("/page")
public R 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);

    //因为我们查询dish的集合中,只查到category的id,不包含category的categoryName
    //所以要用新建并装进DishDto集合中

    //对象拷贝 ,排除records数据,pageInfo的records也就是 dish集合
    BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
    List<Dish> records =pageInfo.getRecords();

    //把Dish集合的每一个dish都拷贝到新建的dishDto 然后封装数据返回dishDto的集合
    List<DishDto> list = records.stream().map((item) -> {
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(item, dishDto);
        Long categoryId = item.getCategoryId();
        //根据Id查询category对象 然后获得name
        Category category = categoryService.getById(categoryId);
        //获取到name并封装进dishDto
        String categoryName = category.getName();
        dishDto.setCategoryName(categoryName);

        return dishDto;

    }).toList();
    //设置封装的Page类的Records
    dishDtoPage.setRecords(list);

    return new R(1,"查询成功",dishDtoPage);


}

修改菜品

 DishServiceImpl:

@Override
public void updateWithFlavor(DishDto dishDto) {
    log.info("dishDto:{}",dishDto);
    //更新dish表基本信息
    this.updateById(dishDto);
    //清理当前菜品对应口味数据---dish_flavor标的delete操作
    LambdaQueryWrapper<DishFlavor> queryWrapper= new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());

    dishFlavorService.remove(queryWrapper);

    //添加当前菜品对应口味数据--- dish_flavor 的insert操作
    List<DishFlavor> flavors = dishDto.getFlavors();
    //给集合中的每个菜品口味都附上菜品id值
    flavors=flavors.stream().map((item)->{
        item.setDishId(dishDto.getId());
        return item;
    }).collect(Collectors.toList());

    dishFlavorService.saveBatch(flavors);

}

DishController:

@PutMapping()
public R update(@RequestBody DishDto dishDto){
    dishService.updateWithFlavor(dishDto);
    return new R(1,"新增菜品成功");
}

菜品状态修改以及菜品删除

菜品状态修改

菜品状态,在前端post

传了一个status,跟菜品的当前状态相反

还有一个ids,也就是菜品的id

直接写DishController方法:

@PostMapping("/status/{status}")
public R statusChange(@PathVariable int status, Long ids) {
      log.info("status:{},ids:{}",status,ids);
      Dish dish =new Dish();
      dish.setStatus(status);
      UpdateWrapper<Dish> updateWrapper =new UpdateWrapper<>();
      updateWrapper.eq("id",ids);

      dishService.update(dish,updateWrapper);

      log.info("dish:{}",dish);

      return new R(1,"状态修改成功");

}

菜品删除

菜品删除前,我们需要把菜品对应的口味删除掉

前端只传过来一个id 用的Delete请求

我们在DishService层写一个deleteWithFlavor方法

@Override
public void deleteWithFlavor(Long id) {
    //清除当前菜品对应口味数据
    LambdaQueryWrapper<DishFlavor> queryWrapper =new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId,id);
    dishFlavorService.remove(queryWrapper);

    //删除当前菜品数据
    this.removeById(id);
}

然后再在controller调用就可以了

@DeleteMapping
public R deleteById(Long ids){
    dishService.deleteWithFlavor(ids);
    return new R(1,"删除成功");
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】5步免费白嫖使用Grammarly Premium高级版

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 1、使用Chrome或者Edge浏览器。 2、安装名为Cookie-Editor的谷歌Chrome扩展。 https://chrome.google.com/webstore/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm 2、打开Grammarly网站&#xff0c;…

DBCO-PEG-Cyanine5.5,CY5.5 PEG DBCO,二苯并环辛炔-聚乙二醇-Cyanine5.5

中文名&#xff1a;二苯并环辛炔-聚乙二醇-菁染料CY5.5&#xff0c;二苯并环辛炔-聚乙二醇-Cyanine5.5&#xff0c;菁染料CY5.5PEG环辛炔&#xff0c;花青素Cyanine5.5-聚乙二醇-二苯并环辛炔英文名&#xff1a;DBCO-PEG-CY5.5&#xff0c;DBCO-PEG-Cyanine5.5&#xff0c;Cyan…

位运算、递推与递归、前缀和、差分、二分

题目链接&#xff1a;位运算、递推与递归、前缀和、差分、二分 - Virtual Judge (vjudge.net) A.洛谷 - P2280 样例输入&#xff1a; 2 1 0 0 1 1 1 1样例输出&#xff1a; 1 分析&#xff1a;这道题先用二维前缀和处理一下地图&#xff0c;这样我们就可以在O(1)的复杂度内…

SIT-board 远程交互式白板的实现

来自上海应用技术大学的「SIT-board」团队&#xff0c;在七牛云校园黑客马拉松中勇夺冠军&#xff0c;以下是他们的参赛作品——SIT-board远程交互白板的实现过程。 需求分析 基本绘图功能 作为一个在线协作白板&#xff0c;离线的本地化的白板是一切功能的前提。本地白板中需…

Uniapp安卓apk原生云端打包完整过程

1.进入HbuliderX,找到菜单的发行 2.选择原生App-云打包&#xff0c;接着会弹出一个对话框&#xff0c;如图&#xff1a; 3.在对话框中勾选Andriod&#xff08;apk包&#xff09;、选择使用云端证书。 证书说明如下&#xff1a; (1)使用自有证书&#xff1a;开发者自己生成…

左偏树解决猴王问题

一 问题描述 在森林里住着 N 只好斗的猴子。开始时&#xff0c;猴子们彼此不认识&#xff0c;难免吵架&#xff0c;吵架只发生在互不认识的两只猴子之间。吵架发生时&#xff0c;两只猴子都会邀请它们中最强壮的朋友来决斗。决斗过后&#xff0c;两只猴子和它们的所有朋友都认…

screenviewer工具在树莓派3B+上的适配

目录 工具简介 适配初衷 第三方模块适配问题 源码代编译问题 最后完美运行如图 工具简介 屏幕截图web端展示功能、视频设备如摄像头、视频流等接入&#xff0c;并可web端展示。 适配初衷 这样的工具如果能完美运行在嵌入式linux上是极好的&#xff0c;目前仅适配了wind…

为什么你的程序跑不满CPU?——简单聊聊多核多线程

最近同事测试自己的程序&#xff0c;感觉处理耗时太长&#xff0c;一看CPU使用率&#xff0c;才25%。想要提高CPU使用率降低处理时长&#xff0c;于是向我询问。以此为契机写了这篇&#xff0c;聊聊多核多线程。水平有限&#xff0c;仅供参考。 1.单核单线程 一切开始的前提是…

CCProxy + Proxifier 通过另一台电脑访问网络

问题场景描述&#xff1a; 公司提供的 vpn 只提供了 windows 客户端&#xff1b;Mac没有客户端&#xff0c;而家里的 windows 电脑是多年前的旧电脑&#xff0c;配置不足&#xff0c;所以不能使用&#xff1b;这里整理了一种 搭建跳板机 作为中专的方式进行访问 搭建过程 1.…

OpenCV(7)-OpenCV中的滤波器

OpenCV中的滤波器 图像滤波 滤波的作用&#xff1a;一幅图像通过滤波器得到另一幅图像&#xff1b;其中滤波器又称为卷积核&#xff0c;滤波的过程被称为卷积 卷积的几个基本概念&#xff1a; 卷积核的大小&#xff1a; 卷积核一般为奇数&#xff0c;如3 * 3,5 * 5&#xf…

【DELM回归预测】基于matlab灰狼算法改进深度学习极限学习机GWO-DELM数据回归预测【含Matlab源码 1867期】

⛄一、基本极限学习机算法简介 1 核极限学习机 极限学习机(ELM)是一种含L个神经元的单隐藏层前馈神经网络(SLFN)算法&#xff0c;相比于其他神经网络(如BP)具有训练速度快和泛化能力强等特点。但是ELM算法是随机生成各个神经元连接权值和阈值&#xff0c;易造成算法的波动性和…

架构师必读 —— 逻辑模型(4)

解决问题的基本步骤 如果情绪急躁&#xff0c;过于钻牛角尖&#xff0c;坚持“这就是唯一结论”的态度&#xff0c;就会阻碍逻辑思考。情绪急躁、钻牛角尖的行为属短见薄识&#xff0c;只能导致主观臆断。一味地想“简短地传达观点”时&#xff0c;往往会跳过三角逻辑中的论据和…

VSCode下载和安装详细步骤

一、下载 点击 这里 到Visual Studio Code官网下载。 选择下载版本&#xff0c;大家按自己的电脑版本进行选择&#xff08;这里我选的是Windows 64位的&#xff09;。 二、安装 1. 下载好之后&#xff0c;双击进行安装&#xff1b; 2. 选择【我同意此协议】&#xff0c;再点…

如何快速上手react中的redux管理库

前言&#xff1a; 什么是redux&#xff1f;redux和vuex一样&#xff0c;都被统称为状态管理库&#xff0c;是核心数据存贮与分发、监听数据改变的核心所在。 可以简单说下redux和vuex的区别&#xff1a; 相同点 state 共享数据流程一致&#xff1a;定义全局state&#xff0c;…

【DELM回归预测】基于matlab粒子群算法改进深度学习极限学习机PSO-DELM数据回归预测【含Matlab源码 1884期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

静态HTML个人音乐网页 大学生网页设计作业 简单音乐娱乐网页制作 DW个人网站模板下载 大学生简单音乐网页作品代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于风驱动算法改进的DELM预测-附代码

风驱动算法改进的深度极限学习机DELM的回归预测 文章目录风驱动算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.风驱动算法4.风驱动算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1…

12月编程语言排行榜,java跌至低点,低代码发展迅猛

2022年12月编程语言排行榜&#xff1a;TIOBE Index for December 2022 TIOBE揭晓了12月全球编程语言排名&#xff0c;Python 以0.1%微弱优势领先C语言&#xff0c;成功夺冠。目前&#xff0c;这两种语言竞争焦灼&#xff0c;都是多次霸榜。 本次榜单&#xff0c;C作为一匹黑马…

chrome插件开发之发送网络请求v3版本

如果某个扩展希望访问自己所属域以外的资源&#xff0c;比如说来自http://www.google.com的资源(假设该扩展不是来自www.google.com), 浏览器不会允许这样的请求&#xff0c;除非该扩展获得了相应的跨域请求允许。 获取跨域请求允许 通过添加域名或者域名匹配到manifest文件的p…

CentOS 8:Redis服务器

Redis &#xff0c;一款基于内存的键值型数据库服务器 常见于网站开发场景 Redis 服务器只发布了 Linux 版本 Redis服务器的安装&#xff0c;有3种办法&#xff1a; 1 自动安装 , redis 5.0 yum install redis 2 源码方式 从官网下载源码&#xff0c;先编译、后部署 3 …