删除收货地址
持久层
规划需要执行的SQL语句。
1.在删除之前判断该数据是否存在,判断该条地址的归属是否是当前的用户。不用重复开发。
2.执行删除收货地址的信息。
delect * from t_address where aid=?
3.如果用户删除的是默认收货地址,将剩下的地址中的某一条设置为默认的收货地址。规则可以自定义:最新修改的收货地址设置为默认的收货地址(modified_time的字段值)。
#limit (n-1)n,pageSize
select * from t_address where uid=? order by modified_time DESC limit 0,1
4.如果用户本身就只有一条收货地址的数据,删除后其他操作就可以不进行了。
设计抽象方法
在AddressMapper中进行抽象方法的设计。
/**
* 根据地址id删除地址信息
* @param aid 地址id
* @return 影响的行数
*/
Integer deleteByAid(Integer aid);
/**
* 根据uid查询最后一次修改的地址
* @param uid 用户id
* @return 地址信息
*/
Address findLastModified(Integer uid);
映射SQL语句
在AddressMapper.xml文件中进行映射。
<delete id="deleteByAid">
DELETE FROM t_address WHERE aid=#{aid}
</delete>
<select id="findLastModified">
SELECT * FROM t_address WHERE uid=#{uid} ORDER BY modified_time DESC LIMIT 0,1
</select>
在测试类中进行测试
@Test
public void deleteByAid(){
Integer integer = addressMapper.deleteByAid(2);
System.out.println(integer);
}
@Test
public void findLastModified(){
Address lastModified = addressMapper.findLastModified(7);
System.out.println(lastModified);
}
业务层
规划异常
在执行删除的时候可能会产生未知的异常导致数据不能删除成功,则抛出DeleteException异常。需要定义和创建。
/*删除数据时产生的异常*/
public class DeleteException extends ServiceException {...}
抽象方法的设计
在IAddressService编写抽象方法
/**删除用户的收货地址*/
void delete(Integer aid,Integer uid,String username);
在AddressServiceImpl类中实现接口中的抽象方法
@Override
public void delete(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.deleteByAid(aid);
if(rows!= 1){
throw new UpdateException("删除用户地址时产生了未知的异常");
}
Integer count = addressMapper.countByUid(uid);
if(count == 0){
//直接终止程序
return;
}
if(result.getIsDefault() == 0){
return;
}
Address address = addressMapper.findLastModified(uid);
//将这条数据的idDefault设置为1
Integer integer = addressMapper.updateDefaultByAid(address.getAid(), username, new Date());
if(integer != 1){
throw new UpdateException("更新数据时产生未知的异常");
}
}
测试类进行测试
@Test
public void delete(){
addressService.delete(16,7,"管理员");
}
控制层
1.需要处理异常DeleteException类。
else if(e instanceof DeleteException){
result.setstate(5002);
result.setMessage("删除数据时发生了未知的异常");
}
2.设计请求处理。
/addresses/{aid}/delete
POST
Integer aid,HttpSession session
JsonResult
3.编写请求处理方法的实现
//使用RestFul风格编写{}里面大数据所对应的值必须用@PathVariable()相对应,不然找不到
@RequestMapping("/{aid}/delete")
public JsonResult<Void> delete(@PathVariable("aid") Integer aid,HttpSession session){
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
addressService.delete(aid,uid,username);
return new JsonResult<>(OK);
}
4.访问地址localhost:8080/addresses/{aid}/delete进行测试。
前端页面
在address.html页面中来添加删除按钮的事件
'<td><a οnclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>\n'
再去编写deleteByAid(aid)方法的具体实现
function deleteByAid(aid) {
$.ajax({
url: "/addresses/" + aid + "/delete",
type: "POST",
dataType: "JSON",
success: function(json) {
if (json.state == 200) {
showAddressList();
} else {
alert("删除收货地址失败!" + json.message);
}
},
error: function(json) {
alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + json.status);
location.href = "login.html";
}
});
}
登录系统,再访问收货地址页面进行删除的数据测试。