设置默认收货地址
持久层
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>
在单元测试方法中进行测试。
@Test
public void findByAid(){
Address byAid = addressMapper.findByAid(15);
System.out.println(byAid);
}
@Test
public void updateNonDefault(){
addressMapper.updateNonDefault(7);
}
@Test
public void updateDefaultByAid(){
addressMapper.updateDefaultByAid(15,"管理员",new Date());
}
业务层
异常的规划
1.在执行更新时产生未知的UpdateException异常。已经创建无需重复创建。
2.访问的数据不是当前登录用户的收货地址数据,非法访问:AccessDeniedException异常。
3.收货地址有可能不存在的异常:AddressNotFoundException异常。
抽象方法
在接口IAddressSevice编写抽象方法
@Override
public void setDefault(Integer aid, Integer uid, String username) {
}
实现抽象方法
在实现类中实现接口中的方法
@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("非法数据访问");
}
//先将所有的收货地址设置为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("修改数据时产生了未知的异常");
}
}
编写测试类测试
@Test
public 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页面进行测试。