【Java项目实战】瑞吉外卖-06 套餐管理业务开发(包含修改套餐和单个/批量停售和启售方法)

2023-11-14

套餐管理业务开发

一、新增套餐

需求分析

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

数据模型

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

setmeal(套餐表) setmeal_dish(套餐菜品关系表)

代码开发

所需要的类和接口:实体类SetmealDish、SetmealDto;Mapper接口SetmealDishMapper;业务层接口SetmealDishService;业务层实现类SetmealDishServiceImpl;控制层StemealController

前端页面和服务端的交互过程:

1.页面(backend/page/combo/add.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中;

2.页面发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中;

3.页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中;

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

5.页面发送请求进行图片下载,将上传的图片进行回显;

6.点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端。

开发新增套餐功能,其实就是在服务端编写代码去处理前端页面发送的这6次请求。

点击新增套餐,前端页面发送的请求:

请求路径category/list?type=2  获得套餐分类数据  之前已经写过

请求路径category/list/?type=1 获得菜品分类数据

 点击添加菜品,发送的请求:

请求路径dish/list

 

    /**
     * 新增套餐中,根据条件查询菜品分类下对应的菜品数据
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<Dish>> list(Dish dish){
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        //查询条件
        queryWrapper.eq(dish.getCategoryId() != null,Dish::getCategoryId,dish.getCategoryId());
        queryWrapper.eq(Dish::getStatus,1); //查询在售的菜品

        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

        List<Dish> list = dishService.list(queryWrapper);
        return R.success(list);
    }

 使用SetmealDto封装stemeal和stemealdish信息,返回给页面。

SetmealService实现类重写方法来保存两部分内容

 SetmealController方法

/**
 * 套餐管理业务开发
 */
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("套餐信息:{}",setmealDto);
        setmealService.saveWithDish(setmealDto);//Service实现类重写的方法
        return R.success("新增套餐成功");
    }
}

二、套餐信息分页查询

需求分析

系统中的套餐数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般系统中都会以分页的方式来展示列表数据。

代码开发

前端页面和服务端的交互过程:

1.页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据;

2.页面发送请求,请求服务端进行图片下载,用于页面图片展示。

开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求。

查询套餐名称时,发送的请求

    /**
     * 套餐信息分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        Page<SetmealDto> setmealdtoPage = new Page<>();

        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        //查询条件
        queryWrapper.like(name != null,Setmeal::getName,name);
        //排序条件
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);
        setmealService.page(pageInfo,queryWrapper);

        //对象拷贝
        BeanUtils.copyProperties(pageInfo,setmealdtoPage,"records");
        List<Setmeal> records = pageInfo.getRecords();
        List<SetmealDto> list = records.stream().map(item ->{
            SetmealDto setmealDto = new SetmealDto(); //new出来的setmealDto没有封装信息
            Long categoryId = item.getCategoryId();
            BeanUtils.copyProperties(item,setmealDto);//把item中除了categoryName属性的信息都赋值给setmealDto
            Category category = categoryService.getById(categoryId);

            if(category != null){
                String categoryName = category.getName();
                setmealDto.setCategoryName(categoryName); //把categoryName属性赋值给setmealDto
            }
            return setmealDto;
        }).collect(Collectors.toList());
        setmealdtoPage.setRecords(list);
        return R.success(setmealdtoPage);
    }

 当没有拷贝套餐分类名称的时候

使用对象拷贝,显示套餐分类名称

 三、删除套餐

需求分析

在套餐管理列表页面点击删除按钮,可以删除对应的套餐信息,也可以通过复选框选择多个套餐,点击批量删除按钮异常删除多个套餐。注意:对应状态为售卖中的套餐不能删除,需要先停售,然后才能删除。

代码开发

前端页面和服务端的交互过程:

删除单个/批量删除套餐时,页面发送ajax请求

 删除单个、批量删除套餐的请求信息可以发现,两种请求的地址和请求方式都是相同的,不同的是传递id的个数,所以在服务端可以提供一个方法来统一处理。

要删除套餐和套餐菜品表中的内容,在SetmealService中重写删除方法

    /**
     * 删除套餐
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> remove(@RequestParam List<Long> ids){
        log.info("ids:{}",ids);
        setmealService.removeWithDish(ids);
        return R.success("删除套餐成功");
    }

 四、套餐单个/批量起售或者停售

代码开发

前端页面发送的请求

单个请求

 批量请求

 SetmealDishService实现类重写实现方法

    /**
     * 套餐单个/批量停售或者起售
     * @param status
     * @param ids
     */
    public void updateSetmealStatus(Integer status, List<Long> ids) {
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(ids != null,Setmeal::getId,ids);
        List<Setmeal> list = this.list(queryWrapper);

        for (Setmeal setmeal : list) {
            if(setmeal != null){
                setmeal.setStatus(status);
                this.updateById(setmeal);
            }
        }
    }

SetmealController方法

五、修改套餐信息

 代码开发

修改套餐信息,需要分两步完成,首先进行数据回显,然后再修改信息

数据回显

前端页面发送的请求

 SetmealDishService实现类重写实现方法

    /**
     * 修改套餐信息:数据回显 根据id查询套餐信息和对应的菜品信息
     * @param id
     * @return
     */
    public SetmealDto getByIdWithDish(Long id) {
        //从setmeal表中查setmeal信息,并将信息赋值给SetmealDto
        Setmeal setmeal = this.getById(id);
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(setmeal,setmealDto);

        //从setmealdish表中查菜品信息,并将信息赋值给SetmealDto
        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SetmealDish::getSetmealId,setmeal.getId());
        List<SetmealDish> dishes = setmealDishService.list(queryWrapper);
        setmealDto.setSetmealDishes(dishes); //设置菜品信息
        return setmealDto;
    }

SetmealController方法 

 修改信息

前端页面发送的请求

  SetmealDishService实现类重写实现方法

    /**
     * 修改套餐信息
     * @param setmealDto
     */
    public void updateWithDish(SetmealDto setmealDto) {
        //修改除菜品外的其他基本信息
        this.updateById(setmealDto);

        //修改套餐中的菜品信息,采用的方法是首先删除数据表中的原来的菜品信息,然后再添加新的菜品信息
        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SetmealDish::getSetmealId,setmealDto.getId());
        setmealDishService.remove(queryWrapper);

        List<SetmealDish> dishes = setmealDto.getSetmealDishes();
        dishes = dishes.stream().map((item) ->{
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());
        setmealDishService.saveBatch(dishes);
    }

 SetmealController方法 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java项目实战】瑞吉外卖-06 套餐管理业务开发(包含修改套餐和单个/批量停售和启售方法) 的相关文章

  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 在反应中访问回调内的 event.target

    我有以下课程片段 constructor props super props this timeout null search e gt clearTimeout this timeout this timeout setTimeout f
  • 如何解决“消息端口在收到响应之前已关闭”的问题。在 JavaScript 中的 window.location.reload() 之后

    我遇到了 javascript 问题 从 chrome v73 0 3683 86 开始 每当我在 window location reload 函数之后运行 javascript 代码时 它总是给我错误 Unchecked runtime
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • jQuery Mobile + Admob:轮换?

    我使用 jQuery Mobile 框架创建了一个移动应用程序 所有页面都在index php中加载 使用 div 在每个页面的页脚中 我添加了Admob代码 div div div
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

  • Scala 面试问题

    在阅读这篇文章之前 请浏览我之前的文章 Scala 基本面试问题及解答 获取一些有关 Scala 语言的基础知识 在这篇文章中 我们将讨论更多 Scala 面试问题 这些问题对一些经验丰富的 Scala 开发人员很有用 Note 由于这个列
  • Java 中的扫描器类

    Java Scanner 类是 java util 包的一部分 它是在 Java 1 5 版本中引入的 Scanner 主要用于接收用户输入并将其解析为原始数据类型 例如 int double 或默认 String 它是一个实用程序类 通过
  • Java equals() 和 hashCode()

    Java equals 和 hashCode 方法存在于 Object 类中 所以每个java类都有equals 和hashCode 的默认实现 在这篇文章中 我们将详细研究 java equals 和 hashCode 方法 Java 等
  • 如何在 Ubuntu 18.04 上设置时间同步

    介绍 准确的计时已成为现代软件部署的关键组成部分 无论是确保以正确的顺序记录日志还是正确应用数据库更新 时间不同步都可能导致错误 数据损坏和其他难以调试的问题 Ubuntu 18 04 内置了时间同步 并且默认使用 systemd 的 ti
  • Linux/UNIX 中的 ls 命令

    ls 命令是日常 Linux UNIX 操作中最常用的命令之一 该命令用于列出目录内的内容 是初学者从一开始就学习的少数命令之一 在本指南中 我们将讨论 Linux 中的常见 ls 命令以及可与该命令一起使用的其他参数 使用不带任何参数的
  • 使用 Kotlin 在活动之间进行 Android Intent 处理

    在本教程中 我们将讨论 Android Intents 并在我们的应用程序中使用 Kotlin 实现它们 你会学到什么 什么是意图 意图的类型 在活动之间使用意图 使用 Android Intent 发送数据 使用 Parcelable 和
  • 如何在 Rocky Linux 9 上为专用连接设置 Squid 代理

    介绍 代理服务器是缓存或混淆网络流量的有用方法 这意味着 通过将连接卸载到中介 可以从与表面不同的入站或出站地址提供 Web 请求服务 对于普通最终用户来说 这通常意味着允许您从与您自己的 IP 地址不同的 IP 地址发出 Web 请求 这
  • 如何在 MySQL 中导入和导出数据库以及重置 root 密码

    如何导入和导出数据库 Export 要导出数据库 请打开终端 确保您没有登录 MySQL 并输入 mysqldump u username p database name gt database name sql 您在命令中选择的数据库现在
  • 如何在 Python 中向列表添加元素

    介绍 在本教程中 我们将学习在 Python 中向列表添加元素的不同方法 在 Python 中 有四种方法可以将元素添加到列表中 append 将元素追加到列表末尾 insert 在给定索引之前插入元素 extend 通过附加可迭代对象中的
  • 如何使用 Celery 和 RabbitMQ 在 Ubuntu VPS 上对任务进行排队

    介绍 异步或非阻塞处理是一种将某些任务的执行与程序的主流程分开的方法 这为您提供了多种优势 包括允许面向用户的代码不间断地运行 消息传递是程序组件用来通信和交换信息的一种方法 它可以同步或异步实现 并且可以允许离散进程毫无问题地进行通信 对
  • STL之priority_queue

    priority queue是一个拥有价值观的queue 它允许加入新元素 移除旧元素 审视新元素值等功能 由于这是一个queue 所以只允许在底部加入元素 并从顶端取出元素 除此之外另无其他存取元素的途径 priority queue带有
  • JDK8 下载与安装教程,超简单版(Windows)

    大家好 我是大鹅 最近换了新电脑 要安装开发环境 趁这个机会出一个安装教程 希望可以帮助到有需要的人 下载JDK安装包 在个人的电脑上 我是比较喜欢使用zulu的JDK 不论是版本还是功能都非常齐全 各个系统都有对应版本 基于OpenJDK
  • 用Python制作日历简答代码

    代码如下 import calendar 输入指定的年月 yy int input 输入年份 mm int input 输入月份 显示月日历 print calendar month yy mm 显示年日历 print calendar p
  • 体验最近火爆的ChatGPT,真的被震惊到了

    前言 前几天OpenAI公布了ChatGPT算是火爆朋友圈 这个模型以对话方式进行交互 能够回答人们提出的问题 承认错误并拒绝一些不适当的请求 GIS宇宙也是看到了各种文章写着什么谷歌要亡 百度要亡 取代StackOverflow的话语 抱
  • LeetCode【567】 字符串的排列

    这里写自定义目录标题 LeetCode567 字符串的排列 LeetCode567 字符串的排列 题目描述 给定两个字符串 s1 和 s2 写一个函数来判断 s2 是否包含 s1 的排列 换句话说 第一个字符串的排列之一是第二个字符串的子串
  • PROFIBUS DP从站开发 VPC3源程序分析---vpc3_cfg_data_update(void)

    以下程序注释由成都地质学院霸王猫添加 引用时请尊重作者劳动成果 标明引用者来自成都地质学院霸王猫 UBYTE vpc3 cfg data update void 入口参数 无 出口参数 无 返回值 VPC3 CFG FINISHED VPC
  • 可以悬浮在屏幕的搜题软件_给大家总结几款好用的搜题软件

    在学习中 难免会碰到不会做的题 一时想不开解题方法 这就需要搜题软件的帮助了 另外现在很多单位突击考试 让人来不得及准备 如果有好用的搜题软件 那么也能帮自己顺利通过考试 身心愉悦 搜题软件汇总 一 优题宝 优题宝是一款除k12考试之外 其
  • 如何查出同一张表中字段值重复的记录

    比如现在有一人员表 表名 peosons 若想将姓名 身份证号 住址这三个字段完全相同的记录查询出来 select p1 from persons p1 persons p2 where p1 idp2 id and p1 cardid p
  • RFID仓库管理解决方案-RFID智能仓储-RFID智能仓储-新导智能

    通过RFID技术可以实现科学有效的仓库库位管理 例如RFID出入库 RFID智能仓库等 实现仓库管理的信息化和时效化 在现代物流体系中 仓储往往起着平衡 调节 缓冲的作用 同时也是物流的中心环节 在现代化仓库的设计理念中 进出仓的效率将直接
  • 【Java项目实战】瑞吉外卖-06 套餐管理业务开发(包含修改套餐和单个/批量停售和启售方法)

    套餐管理业务开发 一 新增套餐 需求分析 套餐就是菜品的集合 后台系统中可以管理套餐信息 通过新增套餐功能来添加一个新的套餐 在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品 并且需要上传套餐对应的图片 在移动端会按照套餐分类来展示对