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


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

    1. 需求分析

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

    数据模型

    涉及的一张地址表:address_book

    对应的AddressBook.Java实体

    1. package com.itheima.reggie.entity;
    2. import com.baomidou.mybatisplus.annotation.FieldFill;
    3. import com.baomidou.mybatisplus.annotation.TableField;
    4. import lombok.Data;
    5. import java.io.Serializable;
    6. import java.time.LocalDateTime;
    7. /**
    8. * 地址簿
    9. */
    10. @Data
    11. public class AddressBook implements Serializable {
    12. private static final long serialVersionUID = 1L;
    13. private Long id;
    14. //用户id
    15. private Long userId;
    16. //收货人
    17. private String consignee;
    18. //手机号
    19. private String phone;
    20. //性别 0 女 1 男
    21. private String sex;
    22. //省级区划编号
    23. private String provinceCode;
    24. //省级名称
    25. private String provinceName;
    26. //市级区划编号
    27. private String cityCode;
    28. //市级名称
    29. private String cityName;
    30. //区级区划编号
    31. private String districtCode;
    32. //区级名称
    33. private String districtName;
    34. //详细地址
    35. private String detail;
    36. //标签
    37. private String label;
    38. //是否默认 0 否 1是
    39. private Integer isDefault;
    40. //创建时间
    41. @TableField(fill = FieldFill.INSERT)
    42. private LocalDateTime createTime;
    43. //更新时间
    44. @TableField(fill = FieldFill.INSERT_UPDATE)
    45. private LocalDateTime updateTime;
    46. //创建人
    47. @TableField(fill = FieldFill.INSERT)
    48. private Long createUser;
    49. //修改人
    50. @TableField(fill = FieldFill.INSERT_UPDATE)
    51. private Long updateUser;
    52. //是否删除
    53. private Integer isDeleted;
    54. }

    2. 代码实现

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

     API

    请求网址:

    http://localhost:8080/addressBook/

    请求方法GET

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

    1. package com.itheima.reggie.controller;
    2. /**
    3. * @author jektong
    4. * @date 2022年05月25日 20:46
    5. */
    6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    7. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
    8. import com.itheima.reggie.common.BaseContext;
    9. import com.itheima.reggie.common.R;
    10. import com.itheima.reggie.entity.AddressBook;
    11. import com.itheima.reggie.service.AddressBookService;
    12. import lombok.extern.slf4j.Slf4j;
    13. import org.springframework.web.bind.annotation.*;
    14. import javax.annotation.Resource;
    15. import java.util.List;
    16. /**
    17. * 地址簿管理
    18. */
    19. @Slf4j
    20. @RestController
    21. @RequestMapping("/addressBook")
    22. public class AddressBookController {
    23. @Resource
    24. private AddressBookService addressBookService;
    25. /**
    26. * 新增用户地址
    27. */
    28. @PostMapping
    29. public R<AddressBook> save(@RequestBody AddressBook addressBook) {
    30. // 通过上下文获取用户ID
    31. addressBook.setUserId(BaseContext.getCurrentId());
    32. log.info("addressBook:{}", addressBook);
    33. addressBookService.save(addressBook);
    34. return R.success(addressBook);
    35. }
    36. }

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

     在AddressBookController.java中添加:

    1. /**
    2. * 设置默认地址
    3. */
    4. @PutMapping("/default")
    5. public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {
    6. log.info("addressBook:{}", addressBook);
    7. // 构建更新条件
    8. LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
    9. wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    10. wrapper.set(AddressBook::getIsDefault, 0);
    11. //SQL:update address_book set is_default = 0 where user_id = ?
    12. addressBookService.update(wrapper);
    13. // 设置默认地址为1
    14. addressBook.setIsDefault(1);
    15. //SQL:update address_book set is_default = 1 where id = ?
    16. addressBookService.updateById(addressBook);
    17. return R.success(addressBook);
    18. }
    19. /**
    20. * 根据id查询地址
    21. */
    22. @GetMapping("/{id}")
    23. public R get(@PathVariable Long id) {
    24. AddressBook addressBook = addressBookService.getById(id);
    25. if (addressBook != null) {
    26. return R.success(addressBook);
    27. } else {
    28. return R.error("没有找到该地址");
    29. }
    30. }
    31. /**
    32. * 查询默认地址
    33. */
    34. @GetMapping("/default")
    35. public R<AddressBook> getDefault() {
    36. LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
    37. queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    38. queryWrapper.eq(AddressBook::getIsDefault, 1);
    39. //SQL:select * from address_book where user_id = ? and is_default = 1
    40. AddressBook addressBook = addressBookService.getOne(queryWrapper);
    41. if (null == addressBook) {
    42. return R.error("没有找到该对象");
    43. } else {
    44. return R.success(addressBook);
    45. }
    46. }
    47. /**
    48. * 查询指定用户的全部地址
    49. */
    50. @GetMapping("/list")
    51. public R<List<AddressBook>> list(AddressBook addressBook) {
    52. addressBook.setUserId(BaseContext.getCurrentId());
    53. log.info("addressBook:{}", addressBook);
    54. //条件构造器
    55. LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
    56. queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
    57. queryWrapper.orderByDesc(AddressBook::getUpdateTime);
    58. //SQL:select * from address_book where user_id = ? order by update_time desc
    59. return R.success(addressBookService.list(queryWrapper));
    60. }

    二. 移动端菜品展示

    2.1 需求分析

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

    菜品展示交互流程

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

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

    1. //获取购物车内商品的集合
    2. function cartListApi(data) {
    3. return $axios({
    4. //'url': '/shoppingCart/list',
    5. 'url': '/front/cartData.json',
    6. 'method': 'get',
    7. params:{...data}
    8. })
    9. }

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

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

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

    DishController.java添加如下代码

    1. @GetMapping("/list")
    2. public R<List<DishDto>> list(Dish dish){
    3. // 构造条件
    4. LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper();
    5. queryWrapper.eq(Dish::getStatus, CommonsConst.DISH_OPEN);
    6. queryWrapper.eq(dish.getCategoryId()!=null, Dish::getCategoryId, dish.getCategoryId());
    7. // 添加排序条件
    8. queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
    9. List<Dish> dishList = dishService.list(queryWrapper);
    10. List<DishDto> dishDtoList = dishList.stream().map((item)->{
    11. DishDto dishDto = new DishDto();
    12. BeanUtils.copyProperties(item,dishDto);
    13. // 获取categoryId
    14. Long categoryId = item.getCategoryId();
    15. // 给categoryName赋值
    16. Category category = categoryService.getById(categoryId);
    17. if(category!=null){
    18. dishDto.setCategoryName(category.getName());
    19. }
    20. // 当前菜品ID
    21. Long dishId = item.getId();
    22. LambdaQueryWrapper<DishFlavor> dishFlavorQueryWrapper= new LambdaQueryWrapper<>();
    23. dishFlavorQueryWrapper.eq(DishFlavor::getDishId,dishId);
    24. List<DishFlavor> dishFlavorList = flavorService.list(dishFlavorQueryWrapper);
    25. dishDto.setFlavors(dishFlavorList);
    26. return dishDto;
    27. }).collect(Collectors.toList());
    28. return R.success(dishDtoList);
    29. }

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

    1. /**
    2. * 根据条件查询套餐数据
    3. * @param setmeal
    4. * @return
    5. */
    6. @GetMapping("/list")
    7. public R<List<Setmeal>> list(Setmeal setmeal){
    8. // 构造查询条件
    9. LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
    10. queryWrapper.eq(setmeal.getCategoryId()!=null,Setmeal::getCategoryId,setmeal.getCategoryId());
    11. queryWrapper.eq(setmeal.getStatus()!=null,Setmeal::getStatus,setmeal.getStatus());
    12. queryWrapper.orderByDesc(Setmeal::getUpdateTime);
    13. List<Setmeal> list = setmealService.list(queryWrapper);
    14. return R.success(list);
    15. }

     测试完成:

     

  • 相关阅读:
    flutter arr 依赖
    Ubuntu20.04 Mysql基本操作知识
    基本微信小程序的二手车交易平台
    柔性制造物料抓取及加工系统设计
    软工作业2:个人项目
    Kettle Spoon数据交换工具图文说明
    About 8.21 This Week
    数据结构之栈和队列以及如何封装栈和队列,栈和队列的实例(进制转换和击鼓传花)
    Dubbo Invoker
    Linux内核VFS详解
  • 原文地址:https://blog.csdn.net/qq_41857955/article/details/124972561