1. 程式人生 > 其它 >刪除收貨地址

刪除收貨地址

刪除收貨地址

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頁面,點選“刪除”超連結按鈕進行功能測試。