• 基于Springboot外卖系统19:用户地址+默认收货地址


    1. 用户地址簿功能

    1.1 需求分析

    地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。

    同一个用户可以有多个地址信息,但是只能有一个默认地址

     

     

    对于地址簿管理,我们需要实现以下几个功能:、

    • 新增地址

    • 地址列表查询

    • 设置默认地址

    • 编辑地址

    • 删除地址

    1.2 数据模型

    用户的地址信息会存储在address_book表,即地址簿表中。具体表结构如下:

     这里面有一个字段is_default,实际上我们在设置默认地址时,只需要更新这个字段就可以了。

    2 功能代码

    1). 实体类 AddressBook

    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). Mapper接口 AddressBookMapper

    1. package com.itheima.reggie.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.itheima.reggie.entity.AddressBook;
    4. import org.apache.ibatis.annotations.Mapper;
    5. import org.apache.ibatis.annotations.Select;
    6. import java.util.List;
    7. @Mapper
    8. public interface AddressBookMapper extends BaseMapper {
    9. }

     3). 业务层接口 AddressBookService

    1. package com.itheima.reggie.service;
    2. import com.baomidou.mybatisplus.extension.service.IService;
    3. import com.itheima.reggie.entity.AddressBook;
    4. public interface AddressBookService extends IService {
    5. }

     4). 业务层实现类 AddressBookServiceImpl

    1. package com.itheima.reggie.service.impl;
    2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    3. import com.itheima.reggie.entity.AddressBook;
    4. import com.itheima.reggie.mapper.AddressBookMapper;
    5. import com.itheima.reggie.service.AddressBookService;
    6. import org.springframework.stereotype.Service;
    7. @Service
    8. public class AddressBookServiceImpl extends ServiceImpl implements AddressBookService {
    9. }

     5). 控制层 AddressBookController

    1.逻辑:

    A. 新增地址逻辑说明:

    • 需要记录当前是哪个用户的地址(关联当前登录用户)

    B. 设置默认地址

    • 每个用户可以有很多地址,但是默认地址只能有一个 ;

    • 先将该用户所有地址的is_default更新为0 , 然后将当前的设置的默认地址的is_default设置为1

    C. 根据ID查询地址

    D. 查询默认地址

    • 根据当前登录用户ID 以及 is_default进行查询,查询当前登录用户is_default为1的地址信息

    E. 查询指定用户的全部地址

    • 根据当前登录用户ID,查询所有的地址列表

     2 代码:

    1. package com.itheima.reggie.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
    4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    5. import com.itheima.reggie.common.BaseContext;
    6. import com.itheima.reggie.common.R;
    7. import com.itheima.reggie.entity.AddressBook;
    8. import com.itheima.reggie.service.AddressBookService;
    9. import lombok.extern.slf4j.Slf4j;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import org.springframework.util.CollectionUtils;
    12. import org.springframework.web.bind.annotation.*;
    13. import java.util.List;
    14. /**
    15. * 地址簿管理
    16. */
    17. @Slf4j
    18. @RestController
    19. @RequestMapping("/addressBook")
    20. public class AddressBookController {
    21. @Autowired
    22. private AddressBookService addressBookService;
    23. /**
    24. * 新增
    25. */
    26. @PostMapping
    27. public R save(@RequestBody AddressBook addressBook) {
    28. addressBook.setUserId(BaseContext.getCurrentId());
    29. log.info("addressBook:{}", addressBook);
    30. addressBookService.save(addressBook);
    31. return R.success(addressBook);
    32. }
    33. /**
    34. * 设置默认地址
    35. */
    36. @PutMapping("default")
    37. public R setDefault(@RequestBody AddressBook addressBook) {
    38. log.info("addressBook:{}", addressBook);
    39. LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
    40. wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    41. wrapper.set(AddressBook::getIsDefault, 0);
    42. //SQL:update address_book set is_default = 0 where user_id = ?
    43. addressBookService.update(wrapper);
    44. addressBook.setIsDefault(1);
    45. //SQL:update address_book set is_default = 1 where id = ?
    46. addressBookService.updateById(addressBook);
    47. return R.success(addressBook);
    48. }
    49. /**
    50. * 根据id查询地址
    51. */
    52. @GetMapping("/{id}")
    53. public R get(@PathVariable Long id) {
    54. AddressBook addressBook = addressBookService.getById(id);
    55. if (addressBook != null) {
    56. return R.success(addressBook);
    57. } else {
    58. return R.error("没有找到该对象");
    59. }
    60. }
    61. /**
    62. * 查询默认地址
    63. */
    64. @GetMapping("default")
    65. public R getDefault() {
    66. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    67. queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    68. queryWrapper.eq(AddressBook::getIsDefault, 1);
    69. //SQL:select * from address_book where user_id = ? and is_default = 1
    70. AddressBook addressBook = addressBookService.getOne(queryWrapper);
    71. if (null == addressBook) {
    72. return R.error("没有找到该对象");
    73. } else {
    74. return R.success(addressBook);
    75. }
    76. }
    77. /**
    78. * 查询指定用户的全部地址
    79. */
    80. @GetMapping("/list")
    81. public R> list(AddressBook addressBook) {
    82. addressBook.setUserId(BaseContext.getCurrentId());
    83. log.info("addressBook:{}", addressBook);
    84. //条件构造器
    85. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    86. queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
    87. queryWrapper.orderByDesc(AddressBook::getUpdateTime);
    88. //SQL:select * from address_book where user_id = ? order by update_time desc
    89. return R.success(addressBookService.list(queryWrapper));
    90. }
    91. }

     

    3 功能测试

    测试过程中,通过debug断点调试观察服务端程序的执行过程,在浏览器中使用调试工具查看页面和服务端的交互过程和请求响应数据。

     

    2). 列表查询

    当新增地址完成后,页面会再次发送一个请求,来查询该用户的所有地址列表,在界面进行展示。

     

    3). 设置默认

    在地址列表页面中,勾选 "设为默认地址" ,此时会发送PUT请求,来设置默认地址。

     

  • 相关阅读:
    三菱PLC FX3U脉冲轴回原功能块(MC_Home_P)
    Python Urllib:网络库(stdlib)的强大功能与灵活运用
    eclipse 添加注释
    基于MindSpore框架的道路场景语义分割方法研究
    融合之力:数字孪生、人工智能和数据分析的创新驱动
    json-server环境搭建
    EasyCVR服务private.pem文件被清空,导致无法正常启动该如何处理?
    【Elasticsearch教程7】Mapping字段类型之boolean
    js使用构造函数的注意点?
    编写云计算计费系统
  • 原文地址:https://blog.csdn.net/qq_39237205/article/details/126579922