八、顾客手机端页面展示

0、地址管理

需求分析:

一个用户可以有多个地址

一个用户只能设置一个默认地址

设置默认地址时,先将该用户下所有的地址都设置为不默认。再设置默认地址。

将AdressBook相关的domain、dao、service、serviceImpl编写好。

0.1、编写AdressBookController

  • Controller的编写,与之前的编写大同小异。
/*** 地址簿管理*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {@Autowiredprivate AddressBookService addressBookService;/*** 新增地址*/@PostMappingpublic R<AddressBook> save(@RequestBody AddressBook addressBook) {log.info("addressBook的id:{}",addressBook.getId());addressBook.setUserId(BaseContext.getCurrentId());log.info("addressBook:{}", addressBook);addressBookService.save(addressBook);return R.success(addressBook);}/*** 设置默认地址* 先将用户id下的所有地址的is_default都设为0,* 再将需要设置的地址的is_default设为1。*/@PutMapping("default")public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {log.info("addressBook:{}", addressBook);LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());wrapper.set(AddressBook::getIsDefault, 0);//SQL:update address_book set is_default = 0 where user_id = ?addressBookService.update(wrapper);addressBook.setIsDefault(1);//SQL:update address_book set is_default = 1 where id = ?addressBookService.updateById(addressBook);return R.success(addressBook);}/*** 根据id查询地址*/@GetMapping("/{id}")public R get(@PathVariable Long id) {AddressBook addressBook = addressBookService.getById(id);if (addressBook != null) {return R.success(addressBook);} else {return R.error("没有找到该对象");}}/*** 查询默认地址*/@GetMapping("default")public R<AddressBook> getDefault() {LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());queryWrapper.eq(AddressBook::getIsDefault, 1);//SQL:select * from address_book where user_id = ? and is_default = 1AddressBook addressBook = addressBookService.getOne(queryWrapper);if (null == addressBook) {return R.error("没有找到该对象");} else {return R.success(addressBook);}}/*** 查询指定用户的全部地址*/@GetMapping("/list")public R<List<AddressBook>> list(AddressBook addressBook) {addressBook.setUserId(BaseContext.getCurrentId());log.info("addressBook:{}", addressBook);//条件构造器LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());queryWrapper.orderByDesc(AddressBook::getUpdateTime);//SQL:select * from address_book where user_id = ? order by update_time descreturn R.success(addressBookService.list(queryWrapper));}
}

1、菜品展示

  • 用户登录成功之后,会自动发送获取菜品列表和套餐列表的请求。

    • /dish/list此请求我们之前在DishController中完成了,但是还不够,还需要完善。具体的就是后端管理菜品时不需要口味表,但是用户端请求时是需要口味表的,逻辑上是用户点菜需要勾选口味。
    • /setmeal/list这个请求我们需要在SetmealController编辑,获取套餐下的各个套餐。
    • /setmeal/dish/{id}这个请求是我们点击套餐查看详情是发起的请求,可以看到套餐中的菜品。需要编辑。
  • 我们将DishController中的list请求进行改进即可。将返回的参数改为R<List<DishDto>>,这样可以让返回的参数携带着Flavors口味信息。如下:

    /*** 根据条件查询响应的菜品信息* @param dish* @return*/
    @GetMapping("/list")
    public R<List<DishDto>> 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);//将返回的Dish的list转为DishDto的listList<DishDto> dishDtoList = list.stream().map(item->{//创建新的DishDto对象,将Dish的基本信息copy进dishDtoDishDto dishDto = new DishDto();BeanUtils.copyProperties(item,dishDto);//取出dishList中每个dish的idLong dishId = item.getId();//构造一个dish_flavors表的条件构造器LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>();//根据dishId来查出dish的口味信息wrapper.eq(DishFlavor::getDishId,dishId);List<DishFlavor> flavorList = dishFlavorService.list(wrapper);//将口味信息设置进dishDto中,这样需要返回的参数就齐全了dishDto.setFlavors(flavorList);return dishDto;}).collect(Collectors.toList());return R.success(dishDtoList);
    }
    
  • 套餐相关的请求编辑如下:

    /*** 用户页面套餐展示** @param dish* @return*/@GetMapping("/list")public R<List<Setmeal>> list(Dish dish) {//构造套餐的查询条件LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();//分类idqueryWrapper.eq(Setmeal::getCategoryId, dish.getCategoryId());//分类状态要是启售的queryWrapper.eq(Setmeal::getStatus, dish.getStatus());//根据更新时间降序排序queryWrapper.orderByDesc(Setmeal::getUpdateTime);//查询套餐List<Setmeal> list = setmealService.list(queryWrapper);return R.success(list);}
    
    /*** 用户页面套餐详情展示** @param id* @return*/@GetMapping("/dish/{id}")public R<List<Dish>> setmealDish(@PathVariable Long id) {//构造setmeal_dish表的查询条件LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();//根据套餐id查询queryWrapper.eq(SetmealDish::getSetmealId, id);//查询出setmealDish的集合List<SetmealDish> list = setmealDishService.list(queryWrapper);//遍历其中的每一个setmealDish,取出对应的dishId List<Dish> dishes = list.stream().map(item -> {Long dishId = item.getDishId();//查询出对应的dish信息Dish dish = dishService.getById(dishId);//返回收集查询的dish信息为dish集合return dish;}).collect(Collectors.toList());return R.success(dishes);}
    

2、最终效果:

|菜品展示
|套餐列表

|套餐内详情菜品

黑马瑞吉外卖用户端顾客手机端页面展示相关推荐

  1. 【SpringBoot项目实战+思维导图】瑞吉外卖⑥(用户地址簿功能、菜品展示、购物车、下单)

    文章目录 用户地址簿功能 需求分析 数据模型 导入功能代码 功能测试 思维导图总结 菜品展示 需求分析 前端页面分析 代码开发 查询菜品方法修改 根据分类ID查询套餐 功能测试 思维导图总结 购物车 ...

  2. 黑马瑞吉外卖之移动端验证码登录使用qq邮箱

    黑马瑞吉外卖之移动端验证码登录 说明 用qq邮箱进行验证码发送 hi,我是兰舟千帆,本次更文还是将瑞吉外卖的笔记完善一下.每一篇都写得很认真哦,希望需要的人可以得到帮助,谢谢你们的阅读. 说明 pc端 ...

  3. 黑马瑞吉外卖项目开发笔记

    目录 软件开发整体介绍 开发流程 角色分工 软件环境 瑞吉外卖项目介绍 项目介绍 产品原型展示 技术选型 功能架构 角色 开发环境搭建 数据库环境搭建 Maven环境搭建 1.直接创建maven项目( ...

  4. 黑马瑞吉外卖项目之订单明细的查询,分页,派送功能

    黑马瑞吉外卖项目之订单明细的查询,分页,派送功能 /*** 后台管理订单信息分页查询* @param page* @param pageSize* @return*/@GetMapping(" ...

  5. 黑马瑞吉外卖之购物车功能开发(添加购物车和购物车数据展示)

    黑马瑞吉外卖之购物车功能 前端界面分析 后台购物车功能逻辑实现 前端界面分析 当我们点击选择规格的时候,数据参数item会传入按钮绑定的方法中 我们点击到这个按钮的时候,那么就会绑定到这个方法.这个方 ...

  6. 黑马瑞吉外卖之菜品的启售停售

    黑马瑞吉外卖值菜品的启售卖.和停售 这一部分功能是课程没有去完成的,但是其实是比较简单的,我们需要去完成菜品的启售和停售. 执行之前的项目,我们要完成的就是这里的这个售卖的状态的更改. 我们先去看一下 ...

  7. 黑马瑞吉外卖之文件上传和下载

    黑马瑞吉外卖之文件上传和下载 文件上传的前端页面我们使用到的是spring-web对上传代码的一个封装. 我们采用到一个上传的前端页面 这里采用到的前端页面主要部分就是 ---- <body&g ...

  8. 瑞吉外卖-移动端菜品展示功能,购物车添加菜品及修改等功能,用户下单功能及历史订单派送功能

    整理记录下学习整个瑞吉外卖项目,详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用! 12.菜品展示 12.1 需求分析 12.2 更改前台页面使其正常显示 由于购物车功能还未进行开发,所以修 ...

  9. 猿创征文|瑞吉外卖——移动端_订单明细

    个人名片: 博主:酒徒ᝰ. 专栏:瑞吉外卖 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来. 本篇励志:一些伤口之所以总会痛,那是因为你总是去摸.有一种女人像贝壳一样,外面很硬,内在其实很软.心里 ...

最新文章

  1. Codeforces #440.Div.2
  2. 【Python】Autoviz: 一行代码搞定数据集探索并可视化
  3. linux hadoop测试,快速搭建Hadoop环境并测试mapreduce
  4. 小程序导航组件navigator活学活用
  5. onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)
  6. 提高C++程序运行效率的10个简单方法
  7. as3 urlloader php交互 jsion,phpQuery获取网页里的js变量,如何获取
  8. linux的定制和发布(二)
  9. zepto源码--filtered, contains,funcArg,setAttribute,className,deserializeVale--学习笔记
  10. three.js TextBufferGeometry创建3d文字(文字乱码问题解答)
  11. java单例模式 实例_java 单例模式的实例详解
  12. 在网上看到SpiceWorks是一个免费但很强大的HELPDESK系统
  13. 用爬虫的底子两天做了一个简单的网页(新手版)
  14. 嵌入式软件开发是做什么的?要学哪些课程?
  15. 对一批编号为1~100,全部开关朝上(开)的灯进行以下操作:凡是1的倍数反方向拨一次开关;2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关……问:最后为关熄状态的灯的编号。
  16. 《软技能—代码之外的生存指南》读书笔记之二:自我营销
  17. 软件研发管理工具Ones横评,对比国内外主流项目管理软件
  18. 大战在即!手机芯片巨头“All in”智能汽车,5G只是冰山一角
  19. 保护小程序,防止反编译:打造不怕反编译的小程序
  20. linux网络编程--网络编程的基本函数介绍与使用【转】

热门文章

  1. 爱奇艺等43款APP被“通报”,个人信息保护法将提供“新护法”
  2. 基于fabric的物资管理系统
  3. 【软件生命周期各个阶段详解】
  4. 产品经理100问:如何升职加薪、快速成长?
  5. Anaconda安装fake_useragent、tesseract-ocr、scrapy
  6. 通过按键切换LED颜色
  7. 北航 X 墨刀——原来软件工程课还可以这么上!
  8. 单机安装greenplum记录
  9. 2021年全球特许餐饮收入大约33040百万美元,预计2028年达到45830百万美元,2022至2028期间,年复合增长率CAGR为5.2%
  10. Kubernetes:(七)k8s优化大法(江湖失传已久的武林秘籍)