设置默认收货地址
持久层
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=?
设计抽象方法
在AddressMappe接口中进行定义和声明
/*** 根据aid查询地址数据* @param aid 收货地址id* @return 收货地址数据,如果没有找到则返回null值*/Address findByAid(Integer aid);/*** 根据用户的uid值来修改用户的收货地址设置为非默认* @param uid 用户的id值* @return 受影响的行数*/Integer updateNonDefault(Integer uid);/**** @param aid* @return*/Integer updateDefaultByAid(@Param("aid") Integer aid,@Param("modifiedUser") String modifiedUser,@Param("modifiedTime") Date modifiedTime);
配置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>
在单元测试方法中进行测试。
@Testpublic void findByAid(){Address byAid = addressMapper.findByAid(15);System.out.println(byAid);}@Testpublic void updateNonDefault(){addressMapper.updateNonDefault(7);}@Testpublic void updateDefaultByAid(){addressMapper.updateDefaultByAid(15,"管理员",new Date());}
业务层
异常的规划
1.在执行更新时产生未知的UpdateException异常。已经创建无需重复创建。
2.访问的数据不是当前登录用户的收货地址数据,非法访问:AccessDeniedException异常。
3.收货地址有可能不存在的异常:AddressNotFoundException异常。
抽象方法
在接口IAddressSevice编写抽象方法
@Overridepublic void setDefault(Integer aid, Integer uid, String username) {}
实现抽象方法
在实现类中实现接口中的方法
@Overridepublic 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("非法数据访问");}//先将所有的收货地址设置为0(不是默认地址)Integer rows = addressMapper.updateNonDefault(uid);if(rows < 1 ){throw new UpdateException("修改数据时产生了未知的异常");}//设置选中的地址数据为1(默认地址)Integer rows1 = addressMapper.updateDefaultByAid(aid, username, new Date());if(rows1 != 1){throw new UpdateException("修改数据时产生了未知的异常");}}
编写测试类测试
@Testpublic void setDefault(){addressService.setDefault(16,7,"管理员");}
控制层
###处理异常
在BaseController类中进行统一的处理。
else if(e instanceof AddressCountLimitException){result.setstate(4003);result.setMessage("用户地址超出限制");}else if(e instanceof AccessDeniedException){result.setstate(4004);result.setMessage("非法数据访问");}
请求设计
/addresses/{aid}/set_default
@PathVariable(“id”) Integer aid,HttpSession session
GET
JsonResult
完成请求方法
在AddressController类中编写请求方法。
//RestFul风格的请求编写@RequestMapping("{aid}/set_default")public JsonResult<Void> setDefault(@PathVariable("aid") Integer aid,HttpSession session){Integer uid = getUidFromSession(session);String username = getUsernameFromSession(session);addressService.setDefault(aid,uid,username);return new JsonResult<>(OK);}打开浏览
器先登录再去访问一个请求路径localhost:8080/addresses/{aid}/set_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("#{address}", list[i].address);tr = tr.replace("#{phone}", list[i].phone);tr = tr.replace("#{aid}",list[i].aid);
address.html页面点击"设置默认"按钮,来发送ajax请求。完成setDefault()方法的声明和定义。
/*设置地址为默认地址*/function setDefault(aid) {$.ajax({url:"/addresses/"+ aid +"/set_default",type:"GET",dataType:"JSON",success:function(json){if(json.state == 200){//重新加载收货地址页面showAddressList();}else {alert("设置默认收货地址失败");}},error:function (xhr) {alert("设置默认收货地址时产生了未知的异常" + xhr.message);}});}
先登录再访问address.html页面进行测试。