外卖项目04---菜品管理业务开发

news2025/1/12 6:19:21

效果展示: 

目录

一、文件上传下载 50 

 1.1文件上传 50​编辑

1.2文件下载

1.3文件上传下载---文件上传代码实现1

1.4文件上传下载---文件上传代码实现2

1.5文件上传下载---文件下载代码实现 53

二、新增菜品 54

2.1需求分析 54

2.2数据模型

2.3新增菜品---代码开发---准备工作&梳理交互过程 55 

2.4新增菜品---代码开发---查询分类数据 56

2.5新增菜品---代码开发---接收页面提交的数据 57

2.6新增菜品---代码开发---保存数据到菜品表和菜品口味表(操作多张表的处理) 58

2.7新增菜品---代码开发---功能测试 59

三、菜品信息分页查询 60

3.1需求分析 60

3.2代码开发---梳理交互过程 61

3.3菜品信息分页查询---代码开发2(菜品分类的完善)62

3.5菜品信息分页查询---功能测试 63

四、修改菜品 64

4.1需求分析 64

4.2代码开发---梳理交互过程 64

4.3修改菜品---代码开发---根据id查询菜品信息和对应口味信息 65

4.4修改菜品---代码开发---测试数据回显 66


 

一、文件上传下载 50 

 1.1文件上传 50

 服务端如何接收客户端上传的文件:

1.2文件下载

 注:本质上是流的操作处理

1.3文件上传下载---文件上传代码实现1

代码部分:

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

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFilte file){//file:参数名要与页面请求的文件名一致
        //file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
        log.info(file.toString());
        return null;

    }

1.4文件上传下载---文件上传代码实现2

文件上传的完善:代码如下(主要实现功能1、指定路径的保存,2、照片文件名的随机命名)

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

    @Value("${reggie.path}")
    private String basePath;


    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){//file:参数名要与页面请求的文件名一致
        //file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
        log.info(file.toString());

        //原始文件名
        String originalFilename = file.getOriginalFilename();//例如原始的文件名:abc.jpg
        //解决原始文件名的后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//获取得到 .jpg

        //判断路径是否存在
        //创建一个目录对象
        File dir = new File(basePath);
        //判断当前目录是否存在
        if(!dir.exists()){
            //目录不存在,需要创建
            dir.mkdirs();
        }


        //使用UUID重新生成文件名,放置文件名重复造成文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;//重新随机的给文件名命名 dfjshgnk.jpg
        try {
            //将临时文件转存到指定的位置
            file.transferTo(new File(basePath + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

}

1.5文件上传下载---文件下载代码实现 53

二、新增菜品 54

2.1需求分析 54

2.2数据模型

 

2.3新增菜品---代码开发---准备工作&梳理交互过程 55 

 梳理交互过程:

2.4新增菜品---代码开发---查询分类数据 56

本部分主要是实现以下功能,点击新增菜品处的菜品分类会自动回显菜品的分类选择。

本部分代码:还是在catagorycontroller中服务层controller中进行修改。

    /**
     * 根据条件查询分类数据
     * @param category
     * @return
     */
    @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::getType).orderByAsc(Category::getUpdateTime);

        List<Category> list = categoryService.list(queryWrapper);
        return R.success(list);
    }

2.5新增菜品---代码开发---接收页面提交的数据 57

由于本部分提交的数据,在原来的实体类中有一些属性数据不存在,导入了一个新的创建的类,用于封装页面提交的数据。

 注:该类的作用:用于展示层于服务层之间数据的交互

步骤一:添加新的数据交互类

步骤二:在controller层进行方法的书写驱动

/**
 * 菜品管理
 */
@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private DishFlavorService dishFlavorService;


    /**
     * 新增菜品
     * @param dishDto
     * @return
     */
    @PatchMapping
    public R<String> save(@RequestBody DishDto dishDto){//Dish这个类是一个新的封装controller层与展现层数据交互的类,
                                            // 由于本部分涉及到两个json,所以采用该类做封装
        log.info(dishDto.toString());
        return null;
    }

}

2.6新增菜品---代码开发---保存数据到菜品表和菜品口味表(操作多张表的处理) 58

由于存在对数据库中的多张表的处理,需要事务控制,需要开启事务AOP功能。添加注解@Transactional。并且需要在启动类中添加,开启启动类的注@EnableTransactionManagement

代码部分:

@Slf4j
@Service
//public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
public class DishServiceImpl extends ServiceImpl<DishMapper,Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;
    //新增菜品,同时保存对应的口味数据

    /**
     * 新增菜品,同时保存对应的口味数据
     * @param dishDto
     */
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        //保存菜品的基本信息到菜品表dish
        this.save(dishDto);
        Long dishId = dishDto.getId();//获取目前正在保存的菜品的id

        //菜品口味
        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors = flavors.stream().map((item) ->{   //将每个元素都重新赋了一个新的名称,并保存到集合当中
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());


//        //保存菜品口味数据到菜品口味表dish_flavor
//        dishFlavorService.saveBatch(dishDto.getFlavors());




    }
}

并且在启动类处添加启动事务开启的注解@EnableTransactionManagement

2.7新增菜品---代码开发---功能测试 59

三、菜品信息分页查询 60

3.1需求分析 60

3.2代码开发---梳理交互过程 61

发布的请求是三部分的数据信息参数:

 

 本部分是实现的效果:

本部分实现代码:


    /**
     * 菜品信息的分页
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize, String name){
        //构造分页构造对象
        Page<Dish> pageInfo = new Page<>(page,pageSize);

        //条件构造器
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        //添加过滤条件
        queryWrapper.like(name != null,Dish::getName,name);
        //添加排序条件
        queryWrapper.orderByDesc(Dish::getUpdateTime);

        //执行分页查询
        dishService.page(pageInfo,queryWrapper);
        return R.success(pageInfo);
    }

3.3菜品信息分页查询---代码开发2(菜品分类的完善)62

由于返回的值是菜品分类的id,并不是分类的结果。所以不显示。本部分采用之前创建的DishDto

本部分代码:


    /**
     * 菜品信息的分页
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @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();
            Long categoryId = item.getCategoryId();//分类id
            //根据id查询分类对象
            Category category = categoryService.getById(categoryId);
            String categoryName = category.getName();
            dishDto.setCategoryName(categoryName);
            return dishDto;

        }).collect(Collectors.toList());


        dishDtoPage.setRecords(list);


        return R.success(dishDtoPage);
    }

3.5菜品信息分页查询---功能测试 63

四、修改菜品 64

4.1需求分析 64

4.2代码开发---梳理交互过程 64

 注:

1、新增菜品和修改菜品信息使用的是同一个前端的界面

2、处理上面的四次请求

4.3修改菜品---代码开发---根据id查询菜品信息和对应口味信息 65

如何匹配id在url中:

如图所示:

代码的解决:使用注解@PathVariable

4.4修改菜品---代码开发---测试数据回显 66

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

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

相关文章

uniapp使用nfc功能及详解

公司使用uniapp在android手机端要增加一个nfc识别的功能。在此记录一下实现的过程。 资料查找 我的代码逻辑主要来源于找到的这篇文章&#xff1a; uniapp-安卓NFC读取 - 我要找到我的全世界 - 博客园 文章内附有代码&#xff0c;为防止文章失效代码消失&#xff0c;在这篇文…

向中央超算平台进化 哪吒汽车发布技术品牌“浩智”

电子电气架构是汽车的“大脑和神经系统”&#xff0c;决定了智能汽车的体验上限。为了实现高阶智能&#xff0c;车企须将汽车的电子电气架构从分布式&#xff0c;向集中式转变&#xff0c;打造出中央超算平台 11月21日&#xff0c;哪吒汽车举行“浩智战略2025”全球技术品牌发布…

Mentor Xpedition VX2.11入门遇到的问题和解决方案 (1)

一、前言 平时使用AD绘制板子&#xff0c;最近又朋友强烈推荐Mentor Xpedition。说它的自动布线功能非常强。相比于pads&#xff0c;这款软件的教程很少。但好在B站还是又几个不错的视频。在相关视频的讲解下&#xff0c;慢慢入门。目前来看这款软件的易用性很差&#xff0c;操…

aws eks创建节点组的不同方式和逻辑

该问题来源于&#xff0c;eks节点组能否修改实例类型&#xff0c;不同创建方式修改节点参数的方式是否有区别。结论如下&#xff1a; eksctl创建托管节点组&#xff0c;无法通过修改启动模板修改节点类型&#xff08;在eks控制台update会报错&#xff09;&#xff0c;但是可以…

网络系统管理 - Server02配置

一、Server02系统基础环境配置 二、DISK配置服务器软RAID工作任务 三、DFS membe端配置工作任务 1.Server02系统基础环境配置 (1)请根据附件说明或提供的基础信息,配置服务器的主机名,IP 地址,创建要求的用户名及密码;

docker镜像、容器 常用命令,容器端口映射

文章目录前言一、docker基础命令二、docker镜像命令1、docker images&#xff1a;列出本地主机的镜像2、 docker search &#xff1a;查看镜像3、docker pull&#xff1a;拉取镜像4、docker rmi &#xff1a; 删除docker镜像三、docker容器命令1、环境准备2、运行容器3、启动、…

Python常见工厂函数用法

工厂函数&#xff1a;能够产生类实例的内建函数。 工厂函数是指这些内建函数都是类对象&#xff0c; 当调用它们时&#xff0c;实际上是创建了一个类实例。 Python中的工厂函数举例如下&#xff1a; int(),long(),float(),complex(),bool()aint(9.9) a 9 blong(45) b 45L ff…

JavaScript 虚拟键盘:Mindfusion JavaScript Keyboard

高度交互&#xff0c;高度可定制--JavaScript 虚拟键盘--Mindfusion JavaScript Keyboard 现在&#xff0c;您的 JavaScript 应用程序可以像本地移动应用程序一样处理屏幕输入。 特征 键盘布局 扩展、紧凑和标准布局模式。KeyboardLayout 工具可帮助您根据需要创建和排列自定义…

【Hack The Box】linux练习-- Traverxec

HTB 学习笔记 【Hack The Box】linux练习-- Traverxec &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月21日&#x1f334; &#x…

Spark学习(5)-Spark Core之RDD

1 RDD详解 1.1 为什么需要RDD 分布式计算需要: 分区控制Shuffle控制数据存储\序列化\发送数据计算API等一系列功能 这些功能, 不能简单的通过Python内置的本地集合对象(如 List\ 字典等)去完成。我们在分布式框架中, 需要有一个统一的数据抽象对象, 来实现上述分布式计算所需…

JavaScript面向对象:类的继承

继承 现实中的继承&#xff1a;子承父业&#xff0c;比如我们都继承了父亲的姓。 程序中的继承&#xff1a;子类可以继承父类的一些属性和方法。 语法&#xff1a; class Father{ // 父类 } class Son extends Father { // 子类继承父类 } 实例&#xff1a; cla…

手把手教你开通小程序流量主

手把手教你开通小程序流量主 开通条件是累计独立访客不低于 1000。也就是1000级以上&#xff0c;其实这个不难。 接下来以防火安全知识专项学习与竞答为例&#xff0c;写一篇开通流量主、创建广告和代码嵌入的图文教程。 功能介绍 广告展示位置灵活控制&#xff0c;接入简单…

操作系统复习【面试】

操作系统复习【面试】前言推荐操作系统复习第一章 操作系统引论 11.3 操作系统的基本特性 141.3.1 并发1.3.2 共享1.3.3 虚拟1.3.4 异步1.4 操作系统的主要功能 171.4.1 处理机管理功能1.4.2 存储器管理功能1.4.3 设备管理功能1.4.4 文件管理功能1.4.5 操作系统和用户之间的接口…

目标管理利器OKR-给被各大APP抢占使用时长的你

今天聊聊好用的时间和目标管理利器OKR&#xff0c;给被各大APP抢占使用时长的你。 1、海龟的秘密 一个游泳健将&#xff0c;他发现自己竟然游不过一只海龟&#xff0c;这让他疲惫不堪&#xff0c;又失望&#xff0c;又难堪。 然后他又去不断观察&#xff0c;终于发现了海龟游…

数据结构之队列

文章目录前言一、队列二、队列应该如何实现顺序表or链表扩展了解三、队列的实现1.队列的声明2.接口&#xff08;声明&#xff09;3.接口的实现创建一个新的节点判断队列为空队头元素入队出队销毁队列注意&#xff1a;4.主函数&#xff08;测试&#xff09;四、相关习题总结前言…

【C++基础】友元

友元 定义&#xff1a;类的特点是私有成员无法在作用域外访问&#xff0c;而友元函数是特权函数&#xff0c;允许访问私有成员。 语法&#xff1a;在函数或类前加friend。 例子&#xff1a;在message中&#xff0c;published每个人都可访问&#xff0c;secret只有自己可以访问…

开放经济中的货币-中国视角下的宏观经济

开放经济中的货币 – 潘登同学的宏观经济学笔记 文章目录开放经济中的货币 -- 潘登同学的宏观经济学笔记汇率&#xff1a;复习外汇冲销下的可能三角中国的811汇改国际货币体系的现在与未来当前国际货币体系存在三个主要问题体系具有内生不稳定性美元的中心地位带来了不平等非对…

[附源码]java毕业设计校园博客系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

树莓派快速上手-远程调试图形界面

0 简述 前面的文章里介绍过通过ssh在局域网或者远程访问树莓派&#xff0c;一般而言&#xff0c;对于非图形界面的开发仅通过ssh命令行交互就能够完成的&#xff0c;但是要开发图形界面展示或交互的应用时&#xff0c;光命令行交互的方式就远远不够了。这篇文章将针对树莓派这…

Conformer测试问题

https://github.com/pengzhiliang/Conformer 抽空测试了conformer&#xff0c;训练起来很简单&#xff0c;但是会遇到一个问题&#xff1a; Loss is nan, stopping training 我用的默认配置&#xff0c;不知道为什么会有这个问题&#xff0c;知道的来探讨下。 1.数据准备 我…