【store商城项目07】设置默认收获地址

1.设置默认收获地址-持久层

1.1规划SQL语句

1.检测当前用户想设置的默认收获地址是否存在

select * from t_address where 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设计接口和抽象方法

public interface AddressMapper {
    /**
     * 根据aid查询收货地址数据
     * @param aid 修改用户的aid
     * @return 收货地址数据,如果没有找到则返回null
     */
    Address findAddressByAid(Integer aid);

    /**
     * 根据用户的uid,将修改用户下的地址全部设置为非默认
     * @param uid 修改用户的uid
     * @return 返回受影响的行数
     */
    Integer updateNonDefault(Integer uid);

    /**
     * 根据
     * @param aid
     * @param modifiedUser
     * @param modifiedTime
     * @return
     */
    Integer updateDefaultByAid(@Param("aid") Integer aid,
                               @Param("modifiedUser") String modifiedUser,
                               @Param("modifiedTime") Date modifiedTime);
}

1.3编写映射

    <select id="findAddressByAid" resultMap="AddressEntityMap">
        select * from t_address where aid=#{aid}
    </select>
    <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>

2.设置默认收获地址-业务层

2.1规划异常

  1. 在执行更新时产生未知的UpdateException异常,已经创建无需重复创建
  2. 访问的数据不是当前登录用户的收货地址数据,属于非法访问,AccessDeniedException异常(就比如说,展示收货地址列表的sql语句写错了,然后这里展示的是别人的收货地址,此时想要将某个收货地址改为默认就属于非法访问了)
  3. 收货地址可能不存在的AddressNotFoundException异常,(比如,刚展示完收货地址列表,管理员误删地址了,此时地址就不存在了)
    在业务层的ex包下创建如下两个异常类,并使其继承ServiceException类
/**收货地址数据不存在的异常*/
public class AddressNotFoundException extends ServiceException {
    /**重写ServiceException的所有构造方法*/
}
/**非法访问的异常*/
public class AccessDeniedException extends ServiceException {
    /**重写ServiceException的所有构造方法*/
}

2.2设计接口和抽象方法

先看持久层的三个方法需要什么参数:aid,uid,modifiedUser,modifiedTime.
其中aid是从前端一步一步传到业务层的,所以需要该参数,uid和modifiedUser是一样的,都是由控制层从session获取的uid并传给业务层,所以需要该参数,modifiedTime可以在业务层new Date,所以不需要该参数

public interface IAddressService {
    /**
     * 设置默认收获地址
     * @param aid 修改用户的aid
     * @param uid 修改用户的uid
     * @param username 修改用户名字
     */
    void setDefault(Integer aid,Integer uid,String username);

2.3设计实现类和实现方法

    @Override
    public void setDefault(Integer aid, Integer uid, String username) {
        //查询是否存在
        Address addressByAid = addressMapper.findAddressByAid(aid);
        if(addressByAid == null){
            throw new AddressNotFoundException("收货地址不存在");
        }
        //检测当前获取到的收货地址是否归属于该用户
        if(addressByAid.getUid().equals(uid)){
            throw new AccessDeniedException("非法数据访问");
        }
        //将修改用户的所有地址置为未默认
        Integer integer = addressMapper.updateNonDefault(uid);
        if(integer < 1){
            throw new UpdateException("更新数据时产生未知的异常");
        }
        //将用户选中的收货地址修改为默认地址
        Integer integer1 = addressMapper.updateDefaultByAid(aid, username, new Date());
        if(integer1 < 1){
            throw new UpdateException("更新数据时产生未知异常");
        }
    }

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

3.1处理异常

在BaseController类中处理业务层抛出的两个异常

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

3.2设计请求

  1. /address/{aid}/set_default(以前的数据是通过表单直接提交的,还有一种提交方式就是RestFul风格,这种提交方式可以提交更多的数据,这里用这个提交方式)
  2. GET
  3. Integer aid,HttpSession session(如果这里是id那就必须在Integer aid前加@PathVariable(“aid”)强行将aid的值注入到id中)
  4. JsonResult

3.3处理请求

在AddressController类中编写请求处理方法.
RestFul编写时不管参数名和占位符是否一致都必须加@PathVariable(“aid”)

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

启动服务,登录账号后在地址栏输入http://localhost:8080/store/address/31/set_default进行测试

4.前端页面


			function setDefault(aid){
				$.ajax({
					url: "/store/address/"+aid+"/set_default",
					type: "POST",
					dataType: "JSON",
					success: function(json){
						if(json.state == 200){
							//重新加载收货地址列表页面
							showAddressList();
						}else{
							alert("设置默认收货地址失败")
						}
					},
					error: function(xhr){
						alert("设置默认收货地址时产生未知的异常!"+xhr.message);
					}
				});
			}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值