删除收货地址

删除收货地址

1 删除收货地址-持久层

1.1 规划需要执行的SQL语句

1.在删除之前,需检查数据是否存在,数据归属是否正确。此功能已完成,无需再次开发。

2.删除指定的收货地址的SQL语句大致是。

delete from t_address where aid=?

3.如果删除的这条数据是默认收货地址,则应该将剩余的收货地址中的某一条设置为默认收货地址,可以设定规则“将最近修改的设置为默认收货地址”,要实现此功能就必须要知道“最近修改的收货地址的id是多少”。则通过以下查询语句完成。

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);

/**
* 查询某用户最后修改的收货地址
* @param uid 归属的用户id
* @return 该用户最后修改的收货地址,如果该用户没有收货地址数据则返回null
*/
Address findLastModified(Integer uid);

1.3 配置SQL映射

1.在AddressMapper.xml文件中添加以上两个抽象方法的映射。

<!-- 根据收货地址id删除数据:Integer deleteByAid(Integer aid) -->
<delete id="deleteByAid">
  DELETE FROM
      t_address
  WHERE
      aid=#{aid}
</delete>

<!-- 查询某用户最后修改的收货地址:Address findLastModified(Integer uid) -->
<select id="findLastModified" resultMap="AddressEntityMap">
  SELECT
      *
  FROM
      t_address
  WHERE
      uid=#{uid}
  ORDER BY
      modified_time DESC
      LIMIT 0,1
</select>

2.在AddressMapperTests测试类中添加单元测试方法。

@Test
public void deleteByAid() {
   Integer aid = 4;
   Integer rows = addressMapper.deleteByAid(aid);
   System.out.println("rows=" + rows);
}

@Test
public void findLastModified() {
   Integer uid = 30;
   Address result = addressMapper.findLastModified(uid);
   System.out.println(result);
}

2 删除收货地址-业务层

2.1 规划异常

在执行删除操作时,可能会删除数据失败,此时抛出DeleteException异常。在创建com.cy.store.service.ex.DeleteException异常类,并继承自ServiceException类。

package com.cy.store.service.ex;

/** 删除数据失败的异常 */
public class DeleteException extends ServiceException {
   // Override Methods...
}

2.2 接口与抽象方法

在IAddressService接口中添加删除收货地址的抽象方法。

/**
* 删除收货地址
* @param aid 收货地址id
* @param uid 归属的用户id
* @param username 当前登录的用户名
*/
void delete(Integer aid, Integer uid, String username);

2.3 实现抽象方法

1.在AddressServiceImpl实现类中实现以上两个抽象方法。

@Transactional
@Override
public void delete(Integer aid, Integer uid, String username) {
   // 根据参数aid,调用findByAid()查询收货地址数据
   Address result = addressMapper.findByAid(aid);
   // 判断查询结果是否为null
   if (result == null) {
       // 是:抛出AddressNotFoundException
       throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
  }

   // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
   if (!result.getUid().equals(uid)) {
       // 是:抛出AccessDeniedException:非法访问
       throw new AccessDeniedException("非常访问");
  }

   // 根据参数aid,调用deleteByAid()执行删除
   Integer rows1 = addressMapper.deleteByAid(aid);
   if (rows1 != 1) {
       throw new DeleteException("删除收货地址数据时出现未知错误,请联系系统管理员");
  }

   // 判断查询结果中的isDefault是否为0
   if (result.getIsDefault() == 0) {
       return;
  }

   // 调用持久层的countByUid()统计目前还有多少收货地址
   Integer count = addressMapper.countByUid(uid);
   // 判断目前的收货地址的数量是否为0
   if (count == 0) {
       return;
  }

   // 调用findLastModified()找出用户最近修改的收货地址数据
   Address lastModified = addressMapper.findLastModified(uid);
   // 从以上查询结果中找出aid属性值
   Integer lastModifiedAid = lastModified.getAid();
   // 调用持久层的updateDefaultByAid()方法执行设置默认收货地址,并获取返回的受影响的行数
   Integer rows2 = addressMapper.updateDefaultByAid(lastModifiedAid, username, new Date());
   // 判断受影响的行数是否不为1
   if (rows2 != 1) {
       // 是:抛出UpdateException
       throw new UpdateException("更新收货地址数据时出现未知错误,请联系系统管理员");
  }
}

2.在AddressServiceTests测试类中添加单元测试方法。

@Test
public void delete() {
   try {
       Integer aid = 18;
       Integer uid = 30;
       String username = "明明";
       addressService.delete(aid, uid, username);
       System.out.println("OK.");
  } catch (ServiceException e) {
       System.out.println(e.getClass().getSimpleName());
       System.out.println(e.getMessage());
  }
}

3 删除收货地址-控制器

3.1 处理异常

在BaseController类中添加DeleteException异常的处理。

// ...
else if (e instanceof DeleteException) {
   result.setState(5002);
}
// ...

3.2 设计请求

设计用户提交的请求,并设计响应的方式。

请求路径:/addresses/{aid}/delete
请求参数:@PathVariable("aid") Integer aid, HttpSession session
请求类型:POST
响应结果:JsonResult<Void>

3.3 处理请求

1.在AddressController类中添加处理请求的delete()方法。

@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<Void>(OK);
}

2.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/addresses/26/delete进行测试。

4 删除收货地址-前端页面

1.在address.html页面中body标签内部的script标签内,添加设置用户删除收货地址的代码。

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";
      }
  });
}

2.给showAddressList()方法中的“设为默认”超链接按钮添加设置默认收货地址的点击事件。

<td><a onclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>

3.完成后启动项目,打开浏览器先登录,再访问http://localhost:8080/web/address.html页面,点击“删除”超链接按钮进行功能测试。

 

 

 

posted @   爽爽子的秃头生活  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示