springboot项目外卖管理 day05-新增与删除套餐

news2025/1/24 11:44:28

文章目录

  • 一、新增菜品
    • 1.1、需求分析
    • 1.2、数据模型
      • setmeal
      • setmeal_dish
    • 1.3、代码开发-梳理交互过程
      • 1.3.1、下拉框展示
      • 1.3.2、菜品窗口展示
      • 1.3.3、新增套餐
  • 2、套餐分页查询


一、新增菜品

1.1、需求分析

套餐就是菜品的集合。

后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。
在这里插入图片描述

在这里插入图片描述

1.2、数据模型

新增套餐,其实就是将新增页面录入的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和菜品关联数据。所以在新增套餐时,涉及到两个表:

setmeal

在这里插入图片描述

setmeal_dish

在这里插入图片描述

1.3、代码开发-梳理交互过程

在开发代码之前,需要梳理一下新增套餐时前端页面和服务端的交互过程:
1、页面(backend/ page/comboladd.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中
在这里插入图片描述
2、页面发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中
在这里插入图片描述

3、页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
在这里插入图片描述

4、页面发送请求进行图片上传,请求服务端将图片保存到服务器

5、页面发送请求进行图片下载,将上传的图片进行回显
6、点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端,在SetmealServiceImpl实现saveWithDish方法:新增套餐,同时要保持与菜品的关联关系

1.3.1、下拉框展示

前端发送请求
在这里插入图片描述
可以看到前端传了一个参数type type的值便分别对应菜品分类和套餐分类,后端通过一个实体类接收,再通过实体类的tpye属性作为条件进行查询,再把结果返回给前端下拉框页面。

    @GetMapping("/list")
    public R<List<Category>> list(Category category)
    {
        //条件构造器
        LambdaQueryWrapper<Category> queryWrapper=new LambdaQueryWrapper<>();
        //添加条件
        queryWrapper.eq(Category::getType,category.getType());
        //添加排序条件
        queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
        List<Category> list = categoryService.list(queryWrapper);
        return R.success(list);
    }

1.3.2、菜品窗口展示

根据分类查询菜品 前端传入了一个菜品id 后端用一个实体类接收 然后构建条件查询器通过id查询菜品同时停售的商品不展示,
这里同时也做了一个模糊查询,设置好条件后进行查询,然后把结果返回给前端

@GetMapping("/list")
    public R<List<Dish>> select(Dish dish)
    {
        System.out.println("666");
            LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
            lambdaQueryWrapper.like(StringUtils.isNotEmpty(dish.getName()), Dish::getName, dish.getName());
            lambdaQueryWrapper.eq(Dish::getCategoryId,dish.getCategoryId());
            lambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
        //添加条件,查询状态为1(起售状态)的菜品
             lambdaQueryWrapper.eq(Dish::getStatus,1);


        List<Dish> list=dishService.list(lambdaQueryWrapper);
            System.out.println(list);
            return R.success(list);
    }

1.3.3、新增套餐

同样的这里的插入也不止是对setmeal一张表的操作还有SetmealDish,首先把基本信息插入setmeal表,由于是新增套餐其id是基于雪花算法自动生成的,所以需要在save完之后才能获得id,后面再遍历集合给setmealDish中的setmealid赋值便可

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService{

    @Autowired
    private SetmealDishService setmealDishService;

    //新增套餐,同时要保持与菜品的关联关系
    @Override
    @Transactional
    public void saveWithDish(SetmealDto setmealDto) {
        //保存套餐基本信息,操作setmeal,执行insert操作
        this.save(setmealDto);

        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();

        setmealDishes.stream().map((item)->{
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());

        //保存套餐和菜品的关联信息,操作setmeal_dish,执行insert操作
        setmealDishService.saveBatch(setmealDishes);

    }
}

2、套餐分页查询

@GetMapping("/page")
public R<Page> page(int page,int pageSize,String name){
    //构造分页构造器
    Page<Setmeal> pageInfo=new Page<>(page,pageSize);

    Page<SetmealDto> pageDtoInfo=new Page<>();
    //构造条件构造器
    LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();
    //根据name进行模糊查询
    queryWrapper.like(!StringUtils.isEmpty(name),Setmeal::getName,name);
    //添加排序条件,根据sort进行排序
    queryWrapper.orderByDesc(Setmeal::getUpdateTime);
    //进行分页查询
    setmealService.page(pageInfo,queryWrapper);

    //对象拷贝
    BeanUtils.copyProperties(pageInfo,pageDtoInfo,"records");

    List<Setmeal> records=pageInfo.getRecords();

    List<SetmealDto> list= records.stream().map((item)->{
        SetmealDto setmealDto=new SetmealDto();

        BeanUtils.copyProperties(item,setmealDto);
        Long categoryId = item.getCategoryId();
        //根据id查分类对象
        Category category = categoryService.getById(categoryId);
        if(category!=null){
            String categoryName = category.getName();
            setmealDto.setCategoryName(categoryName);
        }
        return setmealDto;
    }).collect(Collectors.toList());

    pageDtoInfo.setRecords(list);

    return R.success(pageDtoInfo);
}

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

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

相关文章

solr快速上手:常用查询语法(八)

0. 引言 solr作为搜索引擎&#xff0c;就像我们使用mysql一样&#xff0c;在日常业务中&#xff0c;更多接触的则是各类操作语法&#xff0c;所以今天&#xff0c;我们再来学习solr的常用查询语法&#xff0c;为大家在工作中最基本的solr查询打下基础。 solr快速上手&#xff…

ia write 自定义 导出模板

https://github.com/yangyang5214/github-plus.iatemplate 使用了点个 star 吧&#xff09; 在原有的 GitHub 模板基础上&#xff0c;增加了 封面页面和页脚。 封面页面 展示文章标题 作者 时间。高端大气&#xff5e; 增加页脚&#xff0c;显示 page/pageCount 加载 通过…

做策划有这些特质才能成为行业大咖,看看你符合几个

这个问题确实很重要&#xff0c;策划也不是职业也不是适合所有人的&#xff01; 首先&#xff0c;从性格方面来说吧。 有些人就是适合说话&#xff0c;有些人就是适合埋头苦干&#xff0c;还有一些人有强大的学习能力和逻辑思维。所以就是适合做创意类、创作类、策划类、统筹…

百度翻译API使用教程(前端+后端)

1.资格获取 首先我们需要登录百度翻译开放平台&#xff0c;获取开发者资格&#xff1a; 访问 百度翻译开放平台 然后进行注册&#xff08;如果有百度账号的话可以直接登录&#xff09; 注册成功后点击“产品服务”&#xff1a; 跳转到通用文本API界面&#xff1a; 在页面底…

怎么自学电脑编程

首要之首&#xff1a;不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择&#xff0c;但你不能说那种语言最好。 我们应该理解&#xff1a;说到底&#xff0c;什么语言并不重要。 重要的是理解数据结构、控制逻辑…

C语言——修改控制台背景色和字体颜色

C语言——修改控制台背景色和字体颜色 方法一&#xff1a;system(“color NUM1NUM2”) system("color NUM1NUM2");可以用库函数system(“color NUM1NUM2”)实现 需要头文件 <stdlib.h> NUM1,NUM2均为16进制数 NUM1控制控制台背景色&#xff0c;NUM2控制前…

大数据驱动的实时文本情感分析系统:构建高效准确的情感洞察【上进小菜猪大数据】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 随着互联网的快速发展和大数据技术的不断成熟&#xff0c;用户推荐系统在各个应用领域变得越来越重要。本文将介绍如何利用大数据技术构建一个实时用户推荐系统。我们将通过结合Ap…

基本算法温习:打印金字塔

最终结果图如下&#xff1a; 想达到这个结果&#xff0c;通常的做法是通过拼结两个三角型达到&#xff0c;但是实际上还有最右边的第三个三角型没有处理&#xff0c;这个拼结的方法总让人看起来有一点不完美的感觉&#xff0c;于是我自创了一个思路&#xff0c;一气合成&#x…

【数据结构】七大排序算法(超详细)

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云之志&…

uniapp和springboot微信小程序开发实战:后端架构搭建之封装WEB接口返回对象

文章目录 前言本节所需依赖工具类实现测试代码运行结果总结前言 作为开发者,开发的接口请求返回数据类型有很多种。比如返回字符串,返回对象,返回集合数组等情况,每个人开发者都有自己喜欢的方式或风格。所以在一个项目开发的时候架构师会定义好返回对象,给前端返回数据格…

redis基本数据类型001String

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 一个Redis中字符串value最多可以是512M 应用场景 需要存储常规数据的场景 缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。 需要计数的场景 举…

Singer混沌映射与莱维飞行改进灰狼算法

目录 一、灰狼算法 二、改进策略 2.1 混沌初始化种群 2.2 非线性收敛因子 三、引入莱维飞行 四、运行结果 从改进运行结果来看&#xff0c;效果非常好&#xff0c;在、、等极易陷入局部最优的测试函数上都取到了最优值&#xff0c;收敛速度也得到极大提升。 一、灰狼算法…

数学模型:Python实现整数规划

上篇文章&#xff1a;线性规划 文章摘要&#xff1a;整数规划的Python实现。 参考书籍&#xff1a;数学建模算法与应用(第3版)司守奎 孙玺菁。 PS&#xff1a;只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现&#xff1a;可以参考1.最优化模型与算法——基于P…

谷粒商城学习笔记(三):简介-项目微服务划分图

目录 一、微服务划分图二、前后端分离三、网关四、业务微服务群五、第三方服务六、服务治理七、状态监控八、数据层 一、微服务划分图 二、前后端分离 这个项目是基于前后端分离的开发&#xff0c;需要创建一些前端项目&#xff0c;admin-vue是面向工作人员的后台管理系统&…

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings 1. 文章简介2. 文章概括3 文章重点技术3.1 对比学习 Contrastive Learning3.2 Unsupervised SimCSE3.3 Supervised SimCSE3.4 Anisotropy3.5 Alignment and Uniformity 4. 文章亮点5. 原文传送门6. Refe…

Spring中Aop实现日志功能

文章目录 前言1.环境搭建2.设计日志记录表3.aop需要引入aspectj依赖4.日志实体类设计5.自定义日志BusiLog注解6.定义日志切面6.1 此处只使用了环绕通知6.2 Aspect中有5种通知 7.业务中使用注解8.测试8.1 测试查询8.2 测试删除 前言 上篇分享了jdk动态代理以及cglib代理&#x…

SQL注入总结

Sql注入定义&#xff1a; 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行的sql命令的目的。 sql注入分类&#xff1a; 基于联合查询 基于错误回显 基于盲注&#xff0c;分时间盲注和布尔型的盲注 基于user-agen…

NIN(Network In Network)

目录 论文信息摘要批注 主要工作1. MLPCONV结构1.1为什么11卷积层可以代替MLP层1.2 批注2. Global Average Pooling(GAP)3、NIN网络结构NIN论文解读及个人理解NIN网络的代码实现&#xff08;pytorch&#xff09; 参考文献 论文信息 论文名称&#xff1a;Network In Network 论…

SQL注入—报错注入

0x00 背景 SQL注入长期位于OWASP TOP10 榜首&#xff0c;对Web 安全有着很大的影响&#xff0c;黑客们往往在注入过程中根据错误回显进行判断&#xff0c;但是现在非常多的Web程序没有正常的错误回显&#xff0c;这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲…

SpringBoot集成WebSocket的两种方式

本站在2014年4月时曾全面的学习HTML5的技术&#xff0c;特写过HTML5的WebSocket示例&#xff0c;当时使用的Servlet3.0规范中的API&#xff0c;需要Tomcat7的支持&#xff08;貌似在Tomcat6的后期维护版本也增加了WebSocket的支持&#xff09;&#xff0c;早在当初该示例还是本…