【瑞吉外卖】学习笔记-day4:(三)菜品管理开发——菜品信息分页查询、修改菜品、停售起售菜品以及删除菜品
菜品信息分页查询:
需求分析:
系统中的菜品数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。
其中,图片列和菜品分类列比较特殊。图片列会用到文件下载功能;菜品分类列只保存了菜品的category_id,需通过查找category_id所对应的菜品分类名称,从而回显数据,才能在网页界面中显示。
交互流程:
1、页面(backend/page/food/list.html)发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示
开发菜品信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
图片下载的请求前面已经写好了,前端也写好了相关的请求,所以第二步的图片下载和展示就不需要另外开发了。
代码开发:(重点梳理熟悉代码流程)
DishController层代码:
/*** 菜品信息分页查询* @param page* @param pageSize* @param name* @return*/
@GetMapping("/page")
public R<Page> page(int page,int pageSize,String name){//构造一个分页构造器对象Page<Dish> dishPage = new Page<>(page,pageSize);//构造一个条件构造器LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();//添加过滤条件 注意判断是否为空 使用对name的模糊查询queryWrapper.like(name != null,Dish::getName,name);//添加排序条件 根据更新时间降序排queryWrapper.orderByDesc(Dish::getUpdateTime);//去数据库处理分页 和 查询dishService.page(dishPage,queryWrapper);//因为上面处理的数据没有分类的id,这样直接返回R.success(dishPage)虽然不会报错,但是前端展示的时候这个菜品分类这一数据就为空return R.success(dishPage);
}
这段代码有bug,前端展示的时候,菜品分类这一栏的数据都为空
之前我们创建了DishDto类,发现类中的属性名正好和前端的categoryName属性名对应
修改DishController中的page方法
/*** 菜品信息分页查询* @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);//对象拷贝(忽略掉records这个属性)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();//分类id//根据id查询分类对象Category 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);
}
修改菜品:(先将数据回显到修改界面,后修改保存数据)
需求分析:
- 在菜品管理列表页面点击修改按钮,跳转到修改菜品页面
- 在修改页面回显菜品相关信息并进行修改
- 最后点击确定按钮完成修改操作
交互流程:
- 页面发送ajax请求,请求服务端获取分类数据,用于菜品分类下拉框中数据展示(已完成)
- 页面发送ajax请求,请求服务端,根据id查询当前菜品信息,用于菜品信息回显
- 页面发送请求,请求服务端进行图片下载,用于页图片回显(已完成)
- 点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端
代码开发:
在DishService接口中添加方法getByIdWithFlavor
在DishServicelmpl中实现getByIdWithFlavor方法,并添加逻辑代码
/*** 根据id来查询菜品信息和对应的口味信息* @param id* @return*/
@Override
public DishDto getByIdWithFlavor(Long id) {//查询菜品基本信息,从dish表查询Dish dish = this.getById(id);DishDto dishDto = new DishDto();BeanUtils.copyProperties(dish,dishDto);//查询当前菜品对应的口味信息,从dish_flavor表查询LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(DishFlavor::getDishId,dish.getId());List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);dishDto.setFlavors(flavors);return dishDto;
}
- 根据服务端接收的id,查询菜品的基本信息-dish
- 创建dishDto对象,并将查询到的dish对象属性赋值给dishDto
- 根据查询到的dish对象,可以取出对应的菜品id,再通过等值条件查询,查询到DishFlavor数据信息
- 将查询到的flavor数据信息使用set方法赋值给dishDto对象
- 返回dishDto对象
在DishController中添加get方法,实现添加在DishServicelmpl中的逻辑代码,返回查询到的数据信息
/*** 根据id查询菜品信息和对应的口味信息* @param id* @return*/
@GetMapping("/{id}")
public R<DishDto> get(@PathVariable Long id){DishDto dishDto = dishService.getByIdWithFlavor(id);return R.success(dishDto);
}
在DishService接口中添加updateWithFlavor方法
DishServicelmpl类中实现DishService定义的方法,并添加代码逻辑
- 根据id修改菜品的基本信息
- 通过dish_id,删除菜品的flavor
- 获取前端提交的flavor数据
- 为条flavor的dishId属性赋值
- 将数据批量保存到dish_flavor数据库
@Override
public void updateWithFlavor(DishDto dishDto) {//更新dish表基本信息this.updateById(dishDto);//更新dish_flavor表基本信息//1.清理当前菜品对应口味数据---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();flavors = flavors.stream().map((item) ->{item.setDishId(dishDto.getId());return item;}).collect(Collectors.toList());dishFlavorService.saveBatch(flavors);
}
在DishController类中添加方法update,并调用updateWithFlavor方法实现表中数据的修改
/*** 修改菜品* @param dishDto* @return*/
@PutMapping
public R<String> update(@RequestBody DishDto dishDto){log.info(dishDto.toString());dishService.updateWithFlavor(dishDto);return R.success("修改菜品成功");
}
停售起售菜品以及修改菜品:
/*** 停售/起售菜品* @param status* @param ids* @return*/@PostMapping("/status/{status}")public R<String> sale(@PathVariable int status,String[] ids){for(String id: ids){Dish dish = dishService.getById(id);dish.setStatus(status);dishService.updateById(dish);}return R.success("修改成功");}/*** 删除菜品* @param ids* @return*/@DeleteMappingpublic R<String> delete(String[] ids){for (String id:ids) {dishService.removeById(id);}return R.success("删除成功");}
【瑞吉外卖】学习笔记-day4:(三)菜品管理开发——菜品信息分页查询、修改菜品、停售起售菜品以及删除菜品相关推荐
- 瑞吉外卖项目笔记+踩坑1——基础功能
导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 1 ...
- 【瑞吉外卖开发笔记】
瑞吉外卖开发笔记 源码地址 一.业务开发Day01 1.软件开发整体介绍 软件开发流程 角色分工 软件环境 2.瑞奇外卖项目介绍 项目介绍 产品原型展示 技术选型 功能架构 角色 3.环境搭建 开发环 ...
- 瑞吉外卖day01笔记
一. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工.职责, 并了解软件开发中涉及到的三种软件环境.那么这一小节,我 ...
- java 瑞吉外卖 day5 套餐管理业务 套餐新增,套餐分页查询 套餐修改 套餐停售起售设置 短信服务
新增套餐 准备工作: 套餐信息分页查询 前面已经写了好几个分页查询了,这里查询的关键点,是套餐分类名称,不在套餐表中,我们要到别的表里拿,然后封装进setmealDto @GetMapping(&qu ...
- 自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询
本章目录 自定义sql 分页查询 1. 自定义sql 在dao文件中编写自定义接口,并在方法上使用注解形式注入SQL,如图所示: 第一种: 第二种 ① application.yml加入下面配置 my ...
- ElasticSearch学习笔记(三):CRUD之简单查询
city-event-processing--索引名 一.数据体 索引结构 PUT city-event-processing {"settings": {"number ...
- 瑞吉外卖【后台管理系统篇】
瑞吉外卖 一.软件开发整体介绍 1.软件开发流程 2.角色分工 3.软件环境 二.瑞吉外卖项目介绍 1.项目介绍 2.技术选型 3.功能架构 三.开发环境搭建 1.数据库环境搭建 2.maven项目搭 ...
- Java实战项目《瑞吉外卖》
目录 <瑞吉外卖>后台管理系统开发 软件开发整体介绍 1.软件开发流程 2.角色分工 3.软件环境 瑞吉外卖项目介绍 1.项目介绍 2.产品原型展示 3.技术选型 4.功能架构 5.角色 ...
- 瑞吉外卖项目——瑞吉外卖
软件开发整体介绍 软件开发流程 需求分析:产品原型.需求规格说明书 设计:产品文档.UI界面设计.概要设计.详细设计.数据库设计 编码:项目代码.单元测试 测试:测试用例.测试报告 上线运维:软件环境 ...
- 黑马瑞吉外卖之移动端验证码登录使用qq邮箱
黑马瑞吉外卖之移动端验证码登录 说明 用qq邮箱进行验证码发送 hi,我是兰舟千帆,本次更文还是将瑞吉外卖的笔记完善一下.每一篇都写得很认真哦,希望需要的人可以得到帮助,谢谢你们的阅读. 说明 pc端 ...
最新文章
- RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)
- ABAP术语-Object Name
- IBM 公开最新 Power 处理器架构
- 论文笔记_S2D.25_2007-ACM-ISMAR-小型AR环境的并行跟踪和建图
- docker alpine中 配置 nginx和php两个容器互联时,访问php文件不执行问题
- JSP EL表达式中11个隐藏对象file:///D:/SoftwareFile/qq file/MobileFile/34090016310074682(1).png
- 注册ActiveX控件时DllRegisterServer调用失败的解决方法
- 保留地址就是私有地址吗?
- EyouCMS瀑布流分页详细教程
- JAVA图片与字节流的相互转换
- 贝叶斯法则与先验概率,后验概率
- PLC抑制干扰电路的设计
- mcnp的重复探测器单元计数-fmesh卡的介绍
- HNUCM-XP的点滴(水题)
- ERP系统开发需要多少钱?
- 人生六十才开始(转载)
- http://www.cnblogs.com/bluestorm/archive/2012/03/02/2377615.html
- 操作系统面经总结—虚拟内存、内存分页、内存交换与覆盖等
- 校园随手拍之Android从相册选取图片或拍摄图片并上传(kotlin版)
- Python:摘苹果
热门文章
- PHP 开发 APP 接口 学习笔记与总结 - 静态缓存
- 量化投资实战(一)之KDJ交易策略
- c语言跑酷游戏,C++用easyx图形库实现障碍跑酷小游戏
- 2019多校第九场 HDU6681 Rikka with Cake(欧拉图论定理,线段树)
- 中学教学能用上python吗_AI双师教学、用Python绘图 未来的中小学可能这样上课
- Linux-GNU make
- 优化问题-LP,QP和QCQP(线性规划,Linear Programming; 二次规划,Quadratic Programming;二次约束二次规划)
- linux安装elasticsearch服务
- 【MySQL】内容汇总
- 免疫学课件软件测试,免疫学实验2-----免疫荧光技术.ppt