苍穹外卖笔记07

Day08-02-04地址簿模块

查询当前登录用户的所有地址信息

AddressBookController:

 /**
     * 查询当前登录用户的所有地址信息
     *
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("查询当前登录用户的所有地址信息")
    public Result> list() {
        AddressBook addressBook = new AddressBook();
        addressBook.setUserId(BaseContext.getCurrentId());
        List list = addressBookService.list(addressBook);
        return Result.success(list);
    }

返回类型是 Result>,一个包含 AddressBook 对象列表的 Result 对象。Result 通常用于封装返回结果,包含成功或失败的状态信息。

AddressBook包含以下属性:

 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;

    AddressBook addressBook = new AddressBook();

new一个addressBook的对象,用于存储查询条件。

    addressBook.setUserId(BaseContext.getCurrentId());

BaseContext.getCurrentId() 获取当前登录用户的ID,并将其设置到 addressBook 对象中。这样在查询时,只会返回该用户的地址信息。

    List list = addressBookService.list(addressBook);

调用 addressBookService 的 list 方法,传入 addressBook 对象作为查询条件,返回符合条件的 AddressBook 对象列表。最后返回list。

addressBookService.list :

接口:

    List list(AddressBook addressBook);

实现类:

    /**
     * 条件查询
     *
     * @param addressBook
     * @return
     */
    public List list(AddressBook addressBook) {
        return addressBookMapper.list(addressBook);
    }

Mapper : 

 /**
     * 条件查询
     * @param addressBook
     * @return
     */
    List list(AddressBook addressBook);

xml : 

    

将传入的addressBook对象中的userid解析并作为条件查询。

parameterType="AddressBook" 的含义:
指定 SQL 语句中传入的参数类型为 AddressBook 类。
这意味着在 SQL 语句中,可以通过 #{属性名} 的方式访问 AddressBook 对象的属性。

resultType 的含义
指定 SQL 查询结果的返回类型。
MyBatis 会将查询结果自动映射到 resultType 指定的 Java 类型。

新增地址

    /**
     * 新增地址
     *
     * @param addressBook
     * @return
     */
    @PostMapping
    @ApiOperation("新增地址")
    public Result save(@RequestBody AddressBook addressBook) {
        addressBookService.save(addressBook);
        return Result.success();
    }

将前端传入的AddressBod的Json数据解析为,AddressBook对象。

调用save方法保存地址到数据库。

接口:

void save(AddressBook addressBook);

实现类:

    /**
     * 新增地址
     *
     * @param addressBook
     */
    public void save(AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        addressBook.setIsDefault(0);
        addressBookMapper.insert(addressBook);
    }
//是否默认 0否 1是
private Integer isDefault;

设置addressBook对象中的UserId和是否默认的值。(由于是新增地址,这里默认为0)

Mapper.insert : 

    /**
     * 新增
     * @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查询地址

  @GetMapping("/{id}")
    @ApiOperation("根据id查询地址")
    public Result getById(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        return Result.success(addressBook);
    }

@PathVariable Long id:@PathVariable 是 Spring 注解,表示从 URL 路径中提取 {id} 的值,并将其绑定到方法参数 id 上。Long 是参数的类型。

调用 addressBookService 的 getById 方法,传入 id 作为参数,查询对应的 AddressBook 对象。

返回addressBook对象。

Impl:

   /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    public AddressBook getById(Long id) {
        AddressBook addressBook = addressBookMapper.getById(id);
        return addressBook;
    }

根据id修改地址

    /**
     * 根据id修改地址
     *
     * @param addressBook
     * @return
     */
    @PutMapping
    @ApiOperation("根据id修改地址")
    public Result update(@RequestBody AddressBook addressBook) {
        addressBookService.update(addressBook);
        return Result.success();
    }

调用Service的update方法,将addressBook对象传入该方法。

接口:

  void update(AddressBook addressBook);

实现类:

    /**
     * 根据id修改地址
     *
     * @param addressBook
     */
    public void update(AddressBook addressBook) {
        addressBookMapper.update(addressBook);
    }

Mapper:

    /**
     * 根据id修改
     * @param addressBook
     */
    void update(AddressBook addressBook);

xml:

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

设置默认地址

    /**
     * 设置默认地址
     *
     * @param addressBook
     * @return
     */
    @PutMapping("/default")
    @ApiOperation("设置默认地址")
    public Result setDefault(@RequestBody AddressBook addressBook) {
        addressBookService.setDefault(addressBook);
        return Result.success();
    }

传入addressBook对象,调用setDefault方法。

接口:

  void setDefault(AddressBook 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);
    }

方法使用了 @Transactional 注解,确保两个操作(将所有地址设置为非默认,将当前地址设置为默认)在同一个事务中执行。
如果其中一个操作失败,事务会回滚,保证数据的一致性。

通过 addressBookMapper.updateIsDefaultByUserId 方法,将当前用户的所有地址的 isDefault 字段设置为 0(非默认)。

xml:

 /**
     * 根据 用户id修改 是否默认地址
     * @param addressBook
     */
    @Update("update address_book set is_default = #{isDefault} where user_id = #{userId}")
    void updateIsDefaultByUserId(AddressBook addressBook);

修改当前地址为默认地址:

通过 addressBookMapper.update 方法,将当前地址的 isDefault 字段设置为 1(默认)。

查询默认地址

    /**
     * 查询默认地址
     */
    @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("没有查询到默认地址");
    }

根据当前登录用户的 userId 和 isDefault 字段(值为 1),查询用户的默认地址。
如果查询到默认地址,返回该地址;否则,返回错误信息。

     AddressBook addressBook = new AddressBook();
     addressBook.setIsDefault(1);
     addressBook.setUserId(BaseContext.getCurrentId())

创建一个 AddressBook 对象,并设置 isDefault 为 1(表示默认地址)。
设置 userId 为当前登录用户的 ID(通过 BaseContext.getCurrentId() 获取)。

     List list = addressBookService.list(addressBook);

调用 addressBookService.list 方法,根据查询条件获取地址列表。

如果查询结果列表不为空且大小为 1,返回该默认地址。
否则,返回错误信息“没有查询到默认地址”。

你可能感兴趣的:(笔记,服务器,运维)