一. 移动端导入用户地址簿

1. 需求分析

用户登录移动端,需要消费者填写并维护自己的地址信息,此功能需要实现一个用户可以有多个地址但是只能存在一个默认的地址。

数据模型

涉及的一张地址表:address_book

对应的AddressBook.Java实体

package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 地址簿*/
@Data
public class AddressBook implements Serializable {private static final long serialVersionUID = 1L;private Long id;//用户idprivate Long userId;//收货人private String consignee;//手机号private String phone;//性别 0 女 1 男private String sex;//省级区划编号private String provinceCode;//省级名称private String provinceName;//市级区划编号private String cityCode;//市级名称private String cityName;//区级区划编号private String districtCode;//区级名称private String districtName;//详细地址private String detail;//标签private String label;//是否默认 0 否 1是private Integer isDefault;//创建时间@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;//更新时间@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;//创建人@TableField(fill = FieldFill.INSERT)private Long createUser;//修改人@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;//是否删除private Integer isDeleted;
}

2. 代码实现

点击添加收获地址,可以添加用户的收货地址:

API

请求网址:

http://localhost:8080/addressBook/

请求方法 GET

AddressBookController.java中添加新增地址的代码:

package com.itheima.reggie.controller;/*** @author jektong* @date 2022年05月25日 20:46*/import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.AddressBook;
import com.itheima.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;/*** 地址簿管理*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {@Resourceprivate AddressBookService addressBookService;/*** 新增用户地址*/@PostMappingpublic R<AddressBook> save(@RequestBody AddressBook addressBook) {// 通过上下文获取用户IDaddressBook.setUserId(BaseContext.getCurrentId());log.info("addressBook:{}", addressBook);addressBookService.save(addressBook);return R.success(addressBook);}}

用户设置默认地址,并查出用户所设置的默认地址以及用户自己添加的所有地址:

AddressBookController.java中添加:

/*** 设置默认地址*/@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);// 设置默认地址为1addressBook.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));}

二. 移动端菜品展示

2.1 需求分析

移动端菜品展示页的左端展示菜品的分类,右侧展示分类的菜品信息,若菜品设置了口味信息,需要展示选择规格的按钮。

菜品展示交互流程

  1. 页面(front/index.html)发送ajax请求,获取分类数据(菜品分类和套餐分类)
  2. 页面发送ajax请求,获取第一个分类下的菜品或者套餐

当首页记载完毕后,会发送一个请求去加载购物车的数据,这个代码并未开发,放在一旁,我们可以使用加载静态JSON文件的方式获取数据:

//获取购物车内商品的集合
function cartListApi(data) {return $axios({//'url': '/shoppingCart/list','url': '/front/cartData.json','method': 'get',params:{...data}})
}

这部分的代码之前已经实现,做以上更改之后,页面会展示动态数据(未展示的使用CTRL+F5)清楚浏览器页面缓存。

同时希望图中的加号按钮变为:

其实就是查询出菜品所对应的菜系口味数据:

DishController.java添加如下代码

@GetMapping("/list")
public R<List<DishDto>> list(Dish dish){// 构造条件LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper();queryWrapper.eq(Dish::getStatus, CommonsConst.DISH_OPEN);queryWrapper.eq(dish.getCategoryId()!=null, Dish::getCategoryId, dish.getCategoryId());// 添加排序条件queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);List<Dish> dishList = dishService.list(queryWrapper);List<DishDto> dishDtoList = dishList.stream().map((item)->{DishDto dishDto = new DishDto();BeanUtils.copyProperties(item,dishDto);// 获取categoryIdLong categoryId = item.getCategoryId();// 给categoryName赋值Category category = categoryService.getById(categoryId);if(category!=null){dishDto.setCategoryName(category.getName());}// 当前菜品IDLong dishId = item.getId();LambdaQueryWrapper<DishFlavor> dishFlavorQueryWrapper= new LambdaQueryWrapper<>();dishFlavorQueryWrapper.eq(DishFlavor::getDishId,dishId);List<DishFlavor> dishFlavorList = flavorService.list(dishFlavorQueryWrapper);dishDto.setFlavors(dishFlavorList);return dishDto;}).collect(Collectors.toList());return R.success(dishDtoList);
}

上面还有一个小Bug就是套餐分类的代码还未开发展示出菜品套餐,在SetmealController.java中添加:

    /*** 根据条件查询套餐数据* @param setmeal* @return*/@GetMapping("/list")public R<List<Setmeal>> list(Setmeal setmeal){// 构造查询条件LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());queryWrapper.orderByDesc(Setmeal::getUpdateTime);List<Setmeal> list = setmealService.list(queryWrapper);return R.success(list);}

测试完成:

瑞吉外卖项目:移动端导入用户地址簿与菜品展示功能实现相关推荐

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

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

  2. 【SpringBoot项目实战+思维导图】瑞吉外卖①(项目介绍、开发环境搭建、后台登陆/退出功能开发)

    文章目录 软件开发整体介绍 软件开发流程 角色分工 软件环境 瑞吉外卖项目介绍 项目介绍 产品原型 技术选型 功能架构 角色 开发环境搭建 数据库环境搭建 创建数据库 数据库表导入 数据库表介绍 Ma ...

  3. 瑞吉外卖项目移动端再来一单功能

    我的前端页面是拷贝了资料中day6的前端页面 这里"/order/again"浏览器传来的数据是orders表中的id数据 注意:数据库中order_detail表中的order_ ...

  4. 【瑞吉外卖】学习笔记-day6:(一)导入用户地址簿相关功能及菜品展示

    导入用户地址簿相关功能: 需求分析: 地址簿,指的是移动端消费者用户的地址信息 用户登录成功后可以维护自己的地址信息 同一个用户可以有多个地址信息,但是只能有一个默认地址. 页面展示:  数据模型: ...

  5. 瑞吉外卖项目(一)软件开发流程设计及环境搭建

    第一章 软件开发整体介绍 软件开发流程 软件开发流程 需求分析:产品原型.需求规格说明书 设计:产品文档,ui界面设计,概要设计,详细设计,数据库设计 编码:项目代码,单元测试 测试:测试用例,测试报 ...

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

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

  7. 瑞吉外卖项目 基于spring Boot+mybatis-plus开发 超详细笔记,有源码链接

    本项目是基于自学b站中 黑马程序员 的瑞吉外卖项目:视频链接: 黑马程序员Java项目实战<瑞吉外卖>,轻松掌握springboot + mybatis plus开发核心技术的真java实 ...

  8. 瑞吉外卖项目day01

    一.软件开发整体介绍 1.1 软件开发流程 需求分析:产品原型.需求规格说明书 设计:产品文档.UI界面设计.概要设计.详细设计.数据库设计 编码:项目代码,是单元测试 上线运维:软件环境安装.配置 ...

  9. 瑞吉外卖项目重难点及易错点知识点总结

    本文是对b站黑马程序员瑞吉外卖项目的总结,实现流程以及简单部分不做详解,重点归纳难点以及易错点.(前面是对项目的介绍,可以直接略过 看第四点总结) 视频链接:https://www.bilibili. ...

最新文章

  1. MindSpore特性支持类
  2. 31个好用的 Python 字符串方法,建议收藏!
  3. 线性回归之模型的保存和加载
  4. 公安计算机专业就业前景,公安视听技术专业毕业后干什么
  5. leetcode 62. 不同路径(dp)
  6. pil对图像加透明 python_使用Python图像处理库Pillow处理图像文件
  7. ubuntun 16.04环境安装Caffe过程
  8. tensorflow 十四 强化学习Q-learning
  9. “蚂蚁牙黑”太火,想玩就用ModelArts做一个!
  10. Recipe terminated with error. vscode latex-workshop新的配置文件
  11. matlab vision hdl,MATLAB下载,MATLAB购买,MATLAB试用,MATLAB介绍,MATLAB评价
  12. 周博通 | 阿里开源首个 DL 框架、4000台服务器真实数据集;明年1月开源Blink...
  13. 小程序map地图多点定位
  14. SWAT模型非点源模拟原理
  15. ubuntu18.04安装CH340和CH341驱动
  16. 规格模式(Specification)
  17. 饥饿的小易 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因
  18. 根据url 在ensembl 网站爬取外显子等数据
  19. 计算机科学刘培姣,高中物理课堂融入物理学史体现核心素养的必要性
  20. Gantt(甘特图)与PERT(项目计划评审技术)图,项目关键路径和松弛时间

热门文章

  1. “一阶数字低通滤波器”原理推导(含仿真和代码实现)
  2. memory interleaving(内存交织)
  3. 基因调控分析之转录因子结合位点分析
  4. 04-前端技术_盒子模型与页面布局
  5. 恢复出厂设置 LED灯闪烁
  6. Pycharm 2019安装激活
  7. 什么是NURBS曲线
  8. 《电磁场与电磁波》---恒定电场思维导图
  9. 虚拟机Centos,登陆之后又弹回到登陆界面,无法进入系统
  10. win10不识别移动硬盘