使用SpringBoot+MyBatis+MySQL完成设置默认收货地址

设置默认收货地址 - 持久层

SQL语句规划

① 检测当前用户想要设为默认地址的这条数据是否存在。

select * from t_address where aid=?

② 在修改用户的收货默认地址之前,先将所有的收货地址设置为非默认。

update t_address set is_default=0 where uid=?

③ 将用户当前选中的这条记录设置为默认收货地址。

update t_address set is_default=1,modified_user=?,modified_time=? where aid=?

设计抽象方法

在AddressMapper接口中进行声明和定义

/**
 * 根据aid查询收货地址数据
 * @param aid 收货地址id
 * @return 收货地址数据,如果没有找到则返回null值
 */
Address findByAid(Integer aid);

/**
 * 根据用户的uid来修改用户的收货地址为非默认
 * @param uid 用户的id值
 * @return 受影响的行数
 */
Integer updateNoneDefault(Integer uid);

Integer updateDefaultByAid(
        @Param("aid") Integer aid,
        @Param("modifieduser") String modifiedUser,
        @Param("modifiedTime") Date modifiedTime);

配置SQL映射

在AddressMapper.xml文件中

<update id="updateNoneDefault">
    UPDATE t_address
    SET is_default=0
    WHERE uid=#{uid}
</update>
<update id="updateDefaultByAid">
    UPDATE t_address
    SET is_default=1,
        modified_user=#{modifiedUser},
        modified_time=#{modifiedTime}
    WHERE aid=#{aid}
</update>
<select id="findByAid" resultMap="AddressEntityMap">
    SELECT * FROM t_address WHERE aid=#{aid}
</select>

单元测试

@Test
public void findByAid() {
    System.out.println(addressMapper.findByAid(10));
}

@Test
public void updateNoneDefault() {
    addressMapper.updateNoneDefault(14);
}

@Test
public void updateDefaultByAid() {
    addressMapper.updateDefaultByAid(10,"明明", new Date());
}

设置默认收货地址 - 业务层

异常规划

  • 在执行更新时产生未知的UpdateException异常,已经创建无需重复创建;
  • 访问的数据不是当前登录用户的收货地址数据,非法访问AccessDeniedException异常;
  • 收货地址可能不存在的异常:AddressNotFoundException异常。

抽象方法

在IAddressService中编写抽象方法。

/**
 * 修改某个用户的某条收货地址为默认收货地址
 * @param aid 收货地址id
 * @param uid 用户id
 * @param username 表示修改执行的人
 */
void setDefault(Integer aid, Integer uid, String username);

实现抽象方法

在AddressServiceImpl类中进行开发和业务设计。

@Override
public void setDefault(Integer aid, Integer uid, String username) {
    Address result = addressMapper.findByAid(aid);
    if (result == null) {
        throw new AddressNotFoundException("收货地址不存在");
    }
    // 检测当前获取的收货地址数据的归属
    if (!result.getUid().equals(uid)) {
        throw new AccessDeniedException("非法数据访问");
    }
    // 先将所有的收货地址设置为非默认
    Integer rows = addressMapper.updateNoneDefault(uid);
    if (rows < 1) {
        throw new UpdateException("更新数据时产生未知的异常");
    }
    // 将用户选中的某条地址设置为默认收货地址
    rows = addressMapper.updateDefaultByAid(aid, username, new Date());
    if (rows !=1 ) {
        throw new UpdateException("更新数据时产生未知的异常");
    }
}

单元测试

@Test
public void setDefault() {
    addressService.setDefault(8, 14,"admin001");
}

设置默认收货地址 - 控制层

处理异常

在BaseController类中进行统一的处理。

else if (e instanceof AddressNotFoundException){
    result.setState(4004);
    result.setMessage("用户的收货地址数据不存在的异常");
} else if (e instanceof AccessDeniedException){
    result.setState(4005);
    result.setMessage("收货数据地址非法访问的异常");
}

设计请求

为了在URL中提交更多的数据,可以采用RESTful的风格进行提交数据,将请求路径中的某个参数交给RESTful风格进行解析。

请求路径:/addresses/{aid}/set_default
请求方法:GET
请求数据:@PathVariable("aid") Interger aid, HttpSession session
响应结果:JsonResult<Void>

完成请求方法

在AddressController类中编写请求处理方法。

// RestFul风格的请求编写
@RequestMapping("{aid}/set_default")
public JsonResult<> setDefault(@PathVariable("aid") Integer aid,
                               HttpSession session) {
    addressService.setDefault(
            aid,
            getuidFromSession(session),
            getUsernameFromSession(session));
    return new JsonResult<>(OK);
}

打开浏览器,先登录再去访问一个请求路径
http://localhost:8080/addresses/10/set_default
执行完成后,可以在数据库中查询结果(is_default为1)。

设置默认收货地址 - 前端页面

① 给设为默认(收货地址)按钮添加一个onclick属性,指向一个方法的调用,在这个方法中完成ajax请求的发送。

let tr = '<tr>\n' +
       '<td>#{tag}</td>\n' +
       '<td>#{name}</td>\n' +
       '<td>#{address}</td>\n' +
       '<td>#{phone}</td>\n' +
       '<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>\n' +
       '<td><a class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>\n' +
       '<td><a οnclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>\n' +
       '</tr>';
tr = tr.replace(/#{tag}/g,list[i].tag);
tr = tr.replace(/#{name}/g,list[i].name);
tr = tr.replace("#{phone}",list[i].phone);
tr = tr.replace("#{address}",list[i].address);
tr = tr.replace("#{aid}", list[i].aid);

② address.html页面点击”设为默认“来发送ajax请求。完成setDefault()方法的声明和定义。

function setDefault(aid) {
    $.ajax({
       url: "/addresses/" + aid + "/set_default",
       type: "POST",
       dataType: "JSON",
       success: function (json) {
          if (json.state == 200) {
             // 重新加载收货地址列表页面
             showAddressList();
          } else {
             alert("设置默认收货地址失败");
          }
       },
       error: function (xhr) {
          alert("设置默认收货地址时时产生未知的异常" + xhr.message);
       }
    });
}

启动项目,先登录再访问收货管理页面进行测试。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值