(八)搭建springboot商城--设置默认收货地址

1 持久层

1.1 SQL语句规划

1.检测当前用户想设置为默认收货地址的这条数据是否存在。

select * from t_address aid=?

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

update t_address set is_default=0 where uid=? 

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

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

1.2 设计抽象方法 

在AddressMapper中进行定义和声明

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

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

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

1.3 配置SQL映射

AddressMapper.xml配置映射。 

<update id="updateNonDefault">
        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(9));
    }
    @Test
    public void updateNonDefault(){
        addressMapper.updateNonDefault(9);
    }
    @Test
    public void updateDefaultByAid(){
        addressMapper.updateDefaultByAid(11,"的方法",new Date());
    }

2 业务层 

2.1 异常规划

1.在执行更新时产生未知的updateException异常,已经创建无需重复。

2.访问的数据不是当前登陆用户的收货地址数据,非法访问AccessDeniedException异常。

3.收货地址有可能不存在:AddressNotFoundException异常。

2.2 抽象方法

在接口IAddressService中编写抽象方法。

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

2.3 实现抽象方法 

在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.updateNonDefault(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(10,9,"管理员");
    }

3 控制层 

 3.1 处理异常

在BaseController类中进行统一的处理

3.2 请求设计 

 /addresser/{aid}/set_default

@PathVariable("aid") Integer aid,HttpSession session

GET

JsonResult<Void>

3.3 完成请求方法

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

  //Restful风格
    @RequestMapping("{aid}/set_default")
    public JsonResult<Void>  setDefault(@PathVariable("aid")Integer aid, HttpSession session){
        addressService.setDefault(aid,getUidFromSession(session),getUsernameFromSession(session));
        return new JsonResult<>(OK);
    }

打开浏览器先登陆再去访问一个请求路径:/localhost:8080/addresser/12/set_default

4 前端页面 

1.给设置默认收货地址按钮添加一个onclick属性,指向一个方法的调用,在这个方法中来完成ajax请求的方法。

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)
			}
		})
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值