相关推荐recommended
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三)
作者:mmseoamin日期:2024-01-25

地址簿相关功能

  • 1.1 需求分析和设计
    • 1.1.1 产品原型
    • 1.1.2 接口设计
    • 1.1.3 表设计
    • 1.2 代码实现
      • 1.2.1 Mapper层
      • 1.2.2 Service层
      • 1.2.3 Controller层

        1.1 需求分析和设计

        1.1.1 产品原型

        地址簿,指的是消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。同一个用户可以有多个地址信息,但是只能有一个默认地址。

        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第1张

        对于地址簿管理,有以下几个功能:

        • 查询地址列表
        • 新增地址
        • 修改地址
        • 删除地址
        • 设置默认地址
        • 查询默认地址

          1.1.2 接口设计

          根据上述原型图先粗粒度设计接口,共包含7个接口。

          接口设计:

          • 新增地址
          • 查询登录用户所有地址
          • 查询默认地址
          • 根据id修改地址
          • 根据id删除地址
          • 根据id查询地址
          • 设置默认地址

            接下来细粒度分析每个接口,明确每个接口的请求方式、请求路径、传入参数和返回值。

            1). 新增地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第2张

            2). 查询登录用户所有地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第3张

            3). 查询默认地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第4张

            4). 修改地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第5张

            5). 根据id删除地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第6张

            6). 根据id查询地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第7张

            7). 设置默认地址

            基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三),在这里插入图片描述,第8张

            1.1.3 表设计

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

            字段名数据类型说明备注
            idbigint主键自增
            user_idbigint用户id逻辑外键
            consigneevarchar(50)收货人
            sexvarchar(2)性别
            phonevarchar(11)手机号
            province_codevarchar(12)省份编码
            province_namevarchar(32)省份名称
            city_codevarchar(12)城市编码
            city_namevarchar(32)城市名称
            district_codevarchar(12)区县编码
            district_namevarchar(32)区县名称
            detailvarchar(200)详细地址信息具体到门牌号
            labelvarchar(100)标签公司、家、学校
            is_defaulttinyint(1)是否默认地址1是 0否

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

            1.2 代码实现

            1.2.1 Mapper层

            创建AddressBookMapper.java

            package com.sky.mapper;
            import com.sky.entity.AddressBook;
            import org.apache.ibatis.annotations.*;
            import java.util.List;
            @Mapper
            public interface AddressBookMapper {
                /**
                 * 条件查询
                 * @param addressBook
                 * @return
                 */
                List list(AddressBook addressBook);
                /**
                 * 新增
                 * @param addressBook
                 */
                @Insert("insert into address_book" +
                        "        (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," +
                        "         district_name, detail, label, is_default)" +
                        "        values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," +
                        "                #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})")
                void insert(AddressBook addressBook);
                /**
                 * 根据id查询
                 * @param id
                 * @return
                 */
                @Select("select * from address_book where id = #{id}")
                AddressBook getById(Long id);
                /**
                 * 根据id修改
                 * @param addressBook
                 */
                void update(AddressBook addressBook);
                /**
                 * 根据 用户id修改 是否默认地址
                 * @param addressBook
                 */
                @Update("update address_book set is_default = #{isDefault} where user_id = #{userId}")
                void updateIsDefaultByUserId(AddressBook addressBook);
                /**
                 * 根据id删除地址
                 * @param id
                 */
                @Delete("delete from address_book where id = #{id}")
                void deleteById(Long id);
            }
            

            创建AddressBookMapper.xml

            
            
            
                
                
                    update address_book
                    
                        
                            consignee = #{consignee},
                        
                        
                            sex = #{sex},
                        
                        
                            phone = #{phone},
                        
                        
                            detail = #{detail},
                        
                        
                            label = #{label},
                        
                        
                            is_default = #{isDefault},
                        
                    
                    where id = #{id}
                
            
            

            1.2.2 Service层

            创建AddressBookService.java

            package com.sky.service;
            import com.sky.entity.AddressBook;
            import java.util.List;
            public interface AddressBookService {
                List list(AddressBook addressBook);
                void save(AddressBook addressBook);
                AddressBook getById(Long id);
                void update(AddressBook addressBook);
                void setDefault(AddressBook addressBook);
                void deleteById(Long id);
            }
            

            创建AddressBookServiceImpl.java

            package com.sky.service.impl;
            @Service
            @Slf4j
            public class AddressBookServiceImpl implements AddressBookService {
                @Autowired
                private AddressBookMapper addressBookMapper;
                /**
                 * 条件查询
                 *
                 * @param addressBook
                 * @return
                 */
                public List list(AddressBook addressBook) {
                    return addressBookMapper.list(addressBook);
                }
                /**
                 * 新增地址
                 *
                 * @param addressBook
                 */
                public void save(AddressBook addressBook) {
                    addressBook.setUserId(BaseContext.getCurrentId());
                    addressBook.setIsDefault(0);
                    addressBookMapper.insert(addressBook);
                }
                /**
                 * 根据id查询
                 *
                 * @param id
                 * @return
                 */
                public AddressBook getById(Long id) {
                    AddressBook addressBook = addressBookMapper.getById(id);
                    return addressBook;
                }
                /**
                 * 根据id修改地址
                 *
                 * @param addressBook
                 */
                public void update(AddressBook addressBook) {
                    addressBookMapper.update(addressBook);
                }
                /**
                 * 设置默认地址
                 *
                 * @param addressBook
                 */
                @Transactional
                public void setDefault(AddressBook addressBook) {
                    //1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ?
                    addressBook.setIsDefault(0);
                    addressBook.setUserId(BaseContext.getCurrentId());
                    addressBookMapper.updateIsDefaultByUserId(addressBook);
                    //2、将当前地址改为默认地址 update address_book set is_default = ? where id = ?
                    addressBook.setIsDefault(1);
                    addressBookMapper.update(addressBook);
                }
                /**
                 * 根据id删除地址
                 *
                 * @param id
                 */
                public void deleteById(Long id) {
                    addressBookMapper.deleteById(id);
                }
            }
            

            1.2.3 Controller层

            package com.sky.controller.user;
            @RestController
            @RequestMapping("/user/addressBook")
            @Api(tags = "C端地址簿接口")
            public class AddressBookController {
                @Autowired
                private AddressBookService addressBookService;
                /**
                 * 查询当前登录用户的所有地址信息
                 *
                 * @return
                 */
                @GetMapping("/list")
                @ApiOperation("查询当前登录用户的所有地址信息")
                public Result> list() {
                    AddressBook addressBook = new AddressBook();
                    addressBook.setUserId(BaseContext.getCurrentId());
                    List list = addressBookService.list(addressBook);
                    return Result.success(list);
                }
                /**
                 * 新增地址
                 *
                 * @param addressBook
                 * @return
                 */
                @PostMapping
                @ApiOperation("新增地址")
                public Result save(@RequestBody AddressBook addressBook) {
                    addressBookService.save(addressBook);
                    return Result.success();
                }
                @GetMapping("/{id}")
                @ApiOperation("根据id查询地址")
                public Result getById(@PathVariable Long id) {
                    AddressBook addressBook = addressBookService.getById(id);
                    return Result.success(addressBook);
                }
                /**
                 * 根据id修改地址
                 *
                 * @param addressBook
                 * @return
                 */
                @PutMapping
                @ApiOperation("根据id修改地址")
                public Result update(@RequestBody AddressBook addressBook) {
                    addressBookService.update(addressBook);
                    return Result.success();
                }
                /**
                 * 设置默认地址
                 *
                 * @param addressBook
                 * @return
                 */
                @PutMapping("/default")
                @ApiOperation("设置默认地址")
                public Result setDefault(@RequestBody AddressBook addressBook) {
                    addressBookService.setDefault(addressBook);
                    return Result.success();
                }
                /**
                 * 根据id删除地址
                 *
                 * @param id
                 * @return
                 */
                @DeleteMapping
                @ApiOperation("根据id删除地址")
                public Result deleteById(Long id) {
                    addressBookService.deleteById(id);
                    return Result.success();
                }
                /**
                 * 查询默认地址
                 */
                @GetMapping("default")
                @ApiOperation("查询默认地址")
                public Result getDefault() {
                    //SQL:select * from address_book where user_id = ? and is_default = 1
                    AddressBook addressBook = new AddressBook();
                    addressBook.setIsDefault(1);
                    addressBook.setUserId(BaseContext.getCurrentId());
                    List list = addressBookService.list(addressBook);
                    if (list != null && list.size() == 1) {
                        return Result.success(list.get(0));
                    }
                    return Result.error("没有查询到默认地址");
                }
            }
            

            后记

            👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹