地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。
同一个用户可以有多个地址信息,但是只能有一个默认地址。
对于地址簿管理,我们需要实现以下几个功能:、
新增地址
地址列表查询
设置默认地址
编辑地址
删除地址
用户的地址信息会存储在address_book表,即地址簿表中。具体表结构如下:
这里面有一个字段is_default,实际上我们在设置默认地址时,只需要更新这个字段就可以了。
- 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;
-
-
- //用户id
- private 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;
- }
- package com.itheima.reggie.mapper;
-
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.itheima.reggie.entity.AddressBook;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Select;
-
- import java.util.List;
-
- @Mapper
- public interface AddressBookMapper extends BaseMapper
{ -
- }
- package com.itheima.reggie.service;
-
- import com.baomidou.mybatisplus.extension.service.IService;
- import com.itheima.reggie.entity.AddressBook;
-
- public interface AddressBookService extends IService
{ -
- }
- package com.itheima.reggie.service.impl;
-
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.itheima.reggie.entity.AddressBook;
- import com.itheima.reggie.mapper.AddressBookMapper;
- import com.itheima.reggie.service.AddressBookService;
- import org.springframework.stereotype.Service;
-
- @Service
- public class AddressBookServiceImpl extends ServiceImpl
implements AddressBookService { -
- }
A. 新增地址逻辑说明:
需要记录当前是哪个用户的地址(关联当前登录用户)
B. 设置默认地址
每个用户可以有很多地址,但是默认地址只能有一个 ;
先将该用户所有地址的is_default更新为0 , 然后将当前的设置的默认地址的is_default设置为1
C. 根据ID查询地址
D. 查询默认地址
根据当前登录用户ID 以及 is_default进行查询,查询当前登录用户is_default为1的地址信息
E. 查询指定用户的全部地址
根据当前登录用户ID,查询所有的地址列表
- package com.itheima.reggie.controller;
-
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
- import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
- 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.beans.factory.annotation.Autowired;
- import org.springframework.util.CollectionUtils;
- import org.springframework.web.bind.annotation.*;
-
- import java.util.List;
-
- /**
- * 地址簿管理
- */
- @Slf4j
- @RestController
- @RequestMapping("/addressBook")
- public class AddressBookController {
-
- @Autowired
- private AddressBookService addressBookService;
-
- /**
- * 新增
- */
- @PostMapping
- public R
save(@RequestBody AddressBook addressBook) { - addressBook.setUserId(BaseContext.getCurrentId());
- log.info("addressBook:{}", addressBook);
- addressBookService.save(addressBook);
- return R.success(addressBook);
- }
-
- /**
- * 设置默认地址
- */
- @PutMapping("default")
- public R
setDefault(@RequestBody AddressBook addressBook) { - log.info("addressBook:{}", addressBook);
-
- LambdaUpdateWrapper
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
getDefault() { - LambdaQueryWrapper
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 = 1
- AddressBook addressBook = addressBookService.getOne(queryWrapper);
-
- if (null == addressBook) {
- return R.error("没有找到该对象");
- } else {
- return R.success(addressBook);
- }
- }
-
- /**
- * 查询指定用户的全部地址
- */
- @GetMapping("/list")
- public R
> list(AddressBook addressBook) {
- addressBook.setUserId(BaseContext.getCurrentId());
- log.info("addressBook:{}", addressBook);
-
- //条件构造器
- LambdaQueryWrapper
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 desc
- return R.success(addressBookService.list(queryWrapper));
- }
- }
测试过程中,通过debug断点调试观察服务端程序的执行过程,在浏览器中使用调试工具查看页面和服务端的交互过程和请求响应数据。
当新增地址完成后,页面会再次发送一个请求,来查询该用户的所有地址列表,在界面进行展示。
在地址列表页面中,勾选 "设为默认地址" ,此时会发送PUT请求,来设置默认地址。