删除收货地址
1 持久层
1.1 规划需要执行的SQL语句
1.在删除之前判断改数据是否存在,判断该条地址数据的归属是否是当前的用户。
不用重复开发
2.执行删除收货地址的信息。
delete 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.如果用户本身就只有一条收货地址的数据,删除后,其他的操作就可以不进行了。
1.2 设计抽象方法
在AddressMapper接口中进抽象方法的设计。
/** * 根据收货地址id删除收货地址数据 * @param aid 收货地址id * @return 受影响的行数 */ Integer deleteByAid(Integer aid); /** * 根据用户uid查询当前用户最后一次被修改的收货地址数据 * @param uid 用户id * @return 收货地址 */ Address findLastModified(Integer uid);
1.3 映射SQL语句
在AddressMapper.xml文件中进行映射。
<select id="findByAid" resultMap="AddressEntityMap"> SELECT * FROM t_address WHERE aid=#{aid} </select> <delete id="deleteByAid"> DELETE FROM t_address WHERE aid=#{aid} </delete> <select id="findLastModified" resultMap="AddressEntityMap"> SELECT * FROM t_address WHERE uid=#{uid} ORDER BY modified_time DESC LIMIT 0,1 </select>
AddressMapper–deleteByAid
测试
单元测试方法
@Test void deleteByAid(){ Integer rows = addressMapper.deleteByAid(1); System.out.println(rows); } @Test void findLastModified(){ System.out.println(addressMapper.findLastModified(8)); }
AddressMapperTests–deleteByAid
2 业务层
2.1 规划异常
在执行删除的时候可能会产生未知的删除异常导致数据不能够删除成功,则抛出DeleteException异常。需要定义和创建。
/**删除数据时产生的异常*/ public class DeleteException extends ServiceException{ //Ctrl+O }
DeleteException
2.2 抽象方法设计
在IAddressService接口中进行设计抽象方法、
/** * 删除用户选中的收货地址数据 * @param aid 收货地址id * @param uid 用户id * @param username 用户名 */ void delete(Integer aid,Integer uid,String username);
2.3 实现抽象方法
业务层方法的设计和实现。
@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 DeleteException("删除数据产生未知的异常"); } Integer count = addressMapper.countByUid(uid); if (count==0){ //直接终止程序 return; } if (result.getIsDefault()==0){ return; } //将这条数据中is_default字符设置为1 Address address = addressMapper.findLastModified(uid); rows=addressMapper.updateDefaultByAid(address.getAid(),username,new Date()); if (rows!=1){ throw new UpdateException("更新数据时产生未知的异常"); } }
AddressService–delete
测试
在测试类测试该方法的功能
@Test public void delete(){ addressService.delete(3,8,"管理员"); }
AddressServiceTests–delete
3 控制层
1.需要处理异常DeleteException。
else if (e instanceof DeleteException){ result.setState(5002); result.setMessage("删除数据时产生未知的异常"); }
BaseController–DeleteException
2.设计请求方法
/addresses/{aid}/delete POST Integer aid,HttpSession session JsonResult<Void>
3.编写请求处理方法实现。
@RequestMapping("{aid}/delete") public JsonResult<Void> delete(@PathVariable("aid") Integer aid,HttpSession session){ addressService.delete( aid, getuidFromSession(session), getUsernameFromSession(session) ); return new JsonResult<>(OK); }
AddressController–delete
测试
略
4 前端页面
在address.html页面中添加删除按钮的事件。
+ '<td><a οnclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>'
在去编写deleteByAid(aid)方法的具体实现。
// <!--delete--> 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"; } }); } // <!--delete-->
address.html–delete
测试
登录系统,在访问收货地址页面进行删除的数据测试。
README–删除收货地址