> 文章列表 > 【store商城项目07】设置默认收获地址

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

【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_addressset is_default=0where uid=#{uid}</update><update id="updateDefaultByAid">update t_addressset 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设计实现类和实现方法

    @Overridepublic 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);}});}