SpringBoot電腦商城項目--修改默認收貨地址

1.?修改默認收貨地址-持久層

1.1 規劃sql語句

  • 檢測當前用戶向設置為默認收貨地址的這條數據是否存在

SELECT * FROM t_address WHERE aid=#{aid}

  • 在修改用戶的收獲默認地址之前,先將所有的收貨地址設置為非默認

UPDATE t_address SET is_default=0 WHERE uid=#{uid}

  • 將用戶當前選中的這條記錄設置為默認收貨地址

?UPDATE t_address SET is_default=1,
? ? ? ? ? ? modified_user=#{modifiedUser},
? ? ? ? ? ? ?modified_time=#{modifiedTime}
? ? ? ? WHERE aid=#{aid}

1.2 AddressMapper接口定義抽象方法

    /*** 根據aid查詢收貨地址數據* @param aid 收貨地址id* @return*/Address findByAid(Integer aid);/*** 根據aid修改收貨地址數據為默認地址* @param uid 用戶id* @return*/Integer updateNonDefault(Integer uid);/*** 根據aid修改收貨地址數據* @param * @return*/Integer updateDefaultByAid(@Param("aid") Integer aid,@Param("modifiedUser") String modifiedUser,@Param("modifiedTime") Date modifiedTime);

1.3 編寫xml文件的sql映射

<select id="findByAid" resultMap="AddressEntityMap">SELECT * FROM t_address WHERE aid=#{aid}</select>
<!--    把用戶的所有收貨地址均設為0  --><update id="updateNonDefault">UPDATE t_address SET is_default=0 WHERE uid=#{uid}</update>
<!--    將選中的地址設置為 1      --><update id="updateDefaultByAid">UPDATE t_address SET is_default=1,modified_user=#{modifiedUser},modified_time=#{modifiedTime}WHERE aid=#{aid}</update>

1.4 進行測試

? ? ? ? 在AddressMapperTest測試類中進行mapper接口測試

@Testvoid findByAid() {Address address = addressMapper.findByAid(7);System.out.println(address);}@Testvoid updateNonDefault() {Integer integer = addressMapper.updateNonDefault(1);System.out.println(integer);}@Testvoid updateDefaultByAid() {Integer integer = addressMapper.updateDefaultByAid(7, "admin", new Date());System.out.println(integer);}

2.?修改默認收貨地址-業務層

2.1 異常規劃

  • 在執行更新時產生未知的UpdateException異常,這個異常之前已經創建過了,無需重新創建
  • 訪問的數據不是當前登錄用戶的收貨地址數據,非法訪問異常,AccessDeniedException異常

/**非法訪問的異常*/
public class AccessDeniedException extends ServiceException {public AccessDeniedException() {super();}public AccessDeniedException(String message) {super(message);}public AccessDeniedException(String message, Throwable cause) {super(message, cause);}public AccessDeniedException(Throwable cause) {super(cause);}protected AccessDeniedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
  • 收貨地址有可能不存在的異常,AddressNotFoundException異常
package com.cy.store.service.ex;/**收貨地址數據不存在的異常*/
public class AddressNotFoundException extends ServiceException {public AddressNotFoundException() {super();}public AddressNotFoundException(String message) {super(message);}public AddressNotFoundException(String message, Throwable cause) {super(message, cause);}public AddressNotFoundException(Throwable cause) {super(cause);}protected AddressNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

2.2 接口類編寫抽象方法

    /*** 設置默認收貨地址* @param aid 收貨地址id* @param uid 用戶id* @param username 用戶名*/void setDefault(Integer aid, Integer uid, String username);

2.3 實現類實現接口,重寫抽象方法

    /*** 設置默認收貨地址* @param aid 收貨地址id* @param uid 用戶id* @param username 用戶名*/@Overridepublic void setDefault(Integer aid, Integer uid, String username) {
//        獲取當前收貨地址數據Address address = addressMapper.findByAid(aid);
//        判斷用戶id與收貨地址數據中的用戶id是否相同if (!address.getUid().equals(uid)){
//            不同的話拋出異常throw new AccessDeniedException("非法數據訪問");}
//        將用戶的所有收貨地址的is_default字段設置為0Integer rows = addressMapper.updateNonDefault(uid);
//        一個用戶可能有多個收貨地址,因此可能返回的行數小于1說明異常if (rows<1){throw new UpdateException("更新數據時產生未知的異常");}
//        修改當前收貨地址的is_default字段設置為1Integer integer = addressMapper.updateDefaultByAid(aid, username, new Date());if (integer!=1){throw new UpdateException("更新數據時產生未知的異常");}}

    2.4 AddressServiceTest測試類進行測試

        @Testvoid updateDefault() {addressService.setDefault(6,9,"admin");}

    ? ? ? ? 數據庫修改成功?

    ?

    3.?修改默認收貨地址-控制層

    3.1 在BaseController捕獲異常

    
    /*** 控制層基類*/
    public class BaseController {//操作成功的狀態碼public static final int OK = 200;/*** 全局異常處理器,用于捕獲并處理業務層拋出的異常。** @param e 捕獲的異常對象* @return 返回封裝后的 JsonResult 對象,包含狀態碼和錯誤信息*/
    //    該項目中產生了異常,會被統一攔截到此方法中,這個方法此時就充當了請求處理方法,方法的返回值直接給前端瀏覽器,返回給前端的數據中,狀態碼,狀態碼對應信息,數據@ExceptionHandler({ServiceException.class, FileUploadException.class})public JsonResult<Void> handleException(Throwable e) {// 創建一個 JsonResult 實例,并初始化異常消息JsonResult<Void> result = new JsonResult<>(e);// 判斷異常類型,設置對應的狀態碼和提示信息if (e instanceof UsernameDuplicatedException){// 用戶名被占用時返回 400 狀態碼和相應提示result.setState(4000);result.setMessage("用戶名被占用");} else if (e instanceof InsertException){// 插入數據失敗時返回 500 狀態碼和相應提示result.setState(4000);result.setMessage("注冊時產生未知的異常");}else if (e instanceof UsernameNotFoundException){result.setState(4001);result.setMessage("用戶數據不存在");}else if (e instanceof PasswordNotMatchException){result.setState(4002);result.setMessage("用戶密碼錯誤");}else if (e instanceof AddressCountLimitException){result.setState(4003);result.setMessage("收貨地址超出上限");}else if (e instanceof AccessDeniedException){result.setState(4004);result.setMessage("收貨地址數據非法訪問");}else if (e instanceof AddressNotFoundException){result.setState(4005);result.setMessage("收貨地址數據不存在");}else if (e instanceof UpdateException){result.setState(5003);result.setMessage("更新數據時產生未知的異常");} else if (e instanceof FileEmptyException) {result.setState(6000);} else if (e instanceof FileSizeException) {result.setState(6001);} else if (e instanceof FileTypeException) {result.setState(6002);} else if (e instanceof FileStateException) {result.setState(6003);} else if (e instanceof FileUploadIOException) {result.setState(6004);}// 返回最終的響應結果return result;}/*** 從Session中獲取當前登錄用戶的uid* * @param session HttpSession對象,用于獲取會話中的用戶ID* @return 當前登錄用戶的uid* * `protected` 表示該方法只能被同一個包內的類或子類訪問。* `final` 表示該方法不能被子類重寫。*/protected final Integer getUidFromSession(HttpSession session) {// 從Session中獲取uid// 從會話中獲取uid屬性并轉換為整數類型返回return Integer.valueOf(session.getAttribute("uid").toString());}/*** 從Session中獲取當前登錄用戶的用戶名* @param session HttpSession對象,用于獲取會話中的用戶名* @return 當前登錄用戶的用戶名*/protected final String getUsernameFromSession(HttpSession session) {// 從Session中獲取當前登錄的用戶名return session.getAttribute("username").toString();}}
    

    3.2 設計請求

    /addresses/setDefault/{aid}

    @PathVariable("aid") Integer aid,HttpSession session

    GET

    JsonResult<Void>

    3.3 AddressController類編寫業務代碼

        /*** 設置默認收貨地址* @param aid 收貨地址id* @param session 當前登錄的用戶的會話* @return*/@RequestMapping("/setDefault/{aid}")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);}

    3.4 測試

    ? ? ? ? 先登錄,訪問localhost:8080/addresses/setDefault/7查看返回狀態碼

    ? ? ? ? 數據庫也修改成功?

    4.?修改默認收貨地址-前端頁面

    41. address.html綁定點擊事件

    ? ? ? ? 首先需要先將之前展示的收貨地址列表清空 $("#address-list").empty();然后優化一下展示收貨地址列表的函數,創建一個點擊事件,將收貨地址id封裝到點擊事件上

    4.2 發送請求

    function setDefault(aid) {$.ajax({url: "/addresses/default/"+ aid,type: "POST",dataType: "json",success: function (json) {if (json.state == 200) {alert("設置默認地址成功")//	重新調用獲取列表的方法showAddressList();}else{alert("設置默認地址失敗")}},error: function (xhr) {alert("設置默認地址失敗"+xhr.message)}})}

    ????????完整代碼

    <script type="text/javascript">$(document).ready(function() {//	頁面一加載就調用方法showAddressList();})function showAddressList() {// 展示之前將收貨地址列表清空$("#address-list").empty();$.ajax({url: "/addresses",type: "GET",dataType: "json",success: function (json) {if (json.state == 200) {// 獲取省列表,包括所喲省名稱let list = json.data;// 遍歷省列表for (let i = 0; i < list.length; i++) {// #{tag} 占位符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 onclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">設為默認</a></td>\n' +'</tr>'//	將列表的tr清空,替代成新的tr//	replace() 替換tr = tr.replace("#{tag}", list[i].tag)tr = tr.replace("#{name}", list[i].name)tr = tr.replace("#{address}", list[i].address)tr = tr.replace("#{phone}", list[i].phone)// 獲取aidtr = tr.replace("#{aid}", list[i].aid)//	替換完成之后,將tr追加到address-list列表中$("#address-list").append(tr)}//	按照降序排列的話,第一項是設置的默認項,那么”設為默認地址“這個按鈕應該隱藏//	將某個元素隱藏使用hide()方法$(".add-def:eq(0)").hide();}else{alert("用戶收貨地址列表加載失敗")}}})}function setDefault(aid) {$.ajax({url: "/addresses/setDefault/"+ aid,type: "POST",dataType: "json",success: function (json) {if (json.state == 200) {alert("設置默認地址成功")//	將列表的tr清空,替代成新的tr//	重新調用獲取列表的方法showAddressList();}else{alert("設置默認地址失敗")}},error: function (xhr) {alert("設置默認地址失敗"+xhr.message)}})}</script>

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/85419.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85419.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/85419.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    LabVIEW FPGA 資源擴展

    針對NI CompactRIO 9045 控制器 Kintex-7 70T FPGA 資源不足問題&#xff0c;通過 NI 9151 R 系列可重配置 I/O 模塊擴展外部 FPGA 處理能力&#xff0c;在保留原有機箱架構下實現實時任務分流&#xff0c;解決Slice、LUT 等資源緊張問題&#xff0c;提升系統并行處理能力。 ?…

    【漏洞復現】Apache Kafka Connect 任意文件讀取漏洞(CVE-2025-27817)

    文章目錄 前言一、Apache Kafka 簡介二、漏洞描述三、影響版本四、FOFA查詢語句五、漏洞原理分析六、漏洞復現七、修復建議前言 由于Apache Kafka客戶端未對用戶輸入進行嚴格驗證和限制,未經身份驗證的攻擊者可通過構造惡意配置讀取環境變量或磁盤任意內容,或向非預期位置發…

    day13-軟件包管理

    1.每日復盤與今日內容 1.1復盤 yum源/apt源配置文件,核心下載地址.二進制部署服務.編譯安裝軟件. 2.軟件包管理-實戰部分 2.1 yum源/apt源配置 源下載軟件的地址配置多種源 1??系統也有默認的源&#xff0c;里面也包含很多常用的軟件. 2??安裝nginx、yum源 3??安…

    榕壹云快遞寄件系統:聚合快遞、智能追蹤、二次開發,一站式物流解決方案

    在電商物流高速發展的今天&#xff0c;快遞寄件需求呈現爆炸式增長。傳統分散的寄件方式效率低下&#xff0c;用戶迫切需要一個整合多家快遞公司的便捷平臺。榕壹云公司開發的快遞寄件系統應運而生&#xff0c;通過聚合多家快遞資源、優化操作流程、提供豐富的功能模塊&#xf…

    一款功能強大的專業CSV編輯工具

    Rons Data Edit是一款為Windows操作系統設計的現代CSV文件編輯器&#xff0c;它結合了優雅、強大和易用性&#xff0c;它可以打開任何格式的分隔文本文件(如CSV、TSV等)&#xff0c;并允許用戶完全控制文件的內容和結構。 功能特點 支持明暗主題&#xff0c;可以在預定義的20多…

    什么是軟件架構?和系統設計有何區別?

    一、軟件架構的定義與核心要素 1.1 基本概念 軟件架構(Software Architecture)是指系統的高層結構,包含: 組件(Components)及其相互關系指導設計的架構原則和決策滿足質量屬性(Quality Attributes)的技術方案引用權威定義:IEEE 1471標準將架構描述為"系統的基本組織,…

    九尾狐編程語言新算法“超維時空演算體”

    一、核心架構設計 1&#xff0e;量子&#xfe63;生物混合計算基座 ◇底層采用量子糾纏拓撲網絡&#xff0c;處理超越經 典計算復雜度的問題&#xff08;如 NP - Hard 優化&#xff09;&#xff0e;中層嵌入類腦脈沖神經網絡&#xff0c;模擬人腦跨領域聯想能力&#xff0c;…

    RoboVerse--為機器人學習打造的大一統世界--UC Berkeley...--2025.4.26

    ROBOVERSE 包含一個可擴展的仿真平臺、大規模的合成數據集&#xff0c;以及統一的基準測試。 該仿真平臺通過統一協議&#xff0c;支持新任務和演示的無縫接入&#xff0c;保證了靈活性和可擴展性。該數據集包含 1,000 多個多樣化任務及超過 1,000 萬個狀態轉換&#xff0c;構…

    Fiddler抓包工具實戰指南:結合Charles、Postman優化Web與移動調試流程

    在Web開發與移動端調試的工作流程中&#xff0c;網絡請求的可視化、分析和控制能力對開發效率有著決定性影響。特別是在處理復雜接口聯調、性能瓶頸排查&#xff0c;甚至安全漏洞分析時&#xff0c;一款可靠的抓包工具幾乎成為了每一位開發者的“標配”。 Fiddler作為長期深受…

    6/19作業

    思維導圖 單選題 樹 1. 向一棵平衡二叉樹中插入一個結點后&#xff0c;一定會改變其平衡性。 &#xff08; &#xff09; A 正確 B 錯誤 正確答案&#xff1a;B 你的答案&#xff1a;A 官方解析&#xff1a; 向平衡二叉樹中插入節點并不一定會改變其平衡性。平衡二叉樹(如AVL樹…

    angular 圖斑點擊,列表選中并滾動到中間位置

    如圖所示&#xff1a; html代碼&#xff1a; 1. #listContainer 2. [attr.data-id]"center.id" <div class"resTableCss" #listContainer><div *ngFor"let center of tbList" [attr.data-id]"center.id" class"res-it…

    Java線程同步的簡單理解

    為什么需要線程同步 對于以下代碼&#xff1a;兩個線程對同一個變量分別進行100000次加一和減一操作&#xff0c;但是每次運行的輸出基本都是不同的&#xff08;注意線程的join操作保證了兩個線程都運行完之后才執行System.out.println&#xff09; import org.junit.Test;pu…

    Makefile的通用模板 + 倒計時小程序(13)

    文章目錄 Makefile 的通用模板1. Makefile 的推導原則2. 設計 Makefile 的通用模板3. 通用模板代碼&#xff08;可以直接拿來用&#xff09; Linux 第一個系統程序-進度條&#xff08;7-3.00.00&#xff09;1. 補充回車與換行2. 行緩沖區3. 倒計時小程序 Makefile 的通用模板 …

    【ArcGIS】水文分析與流域劃分

    【ArcGIS】水文分析與流域劃分 一、基礎數據處理1、下載數據2、拼接DEM數據3、填充洼地4、流向分析5、流量分析6、河網生成&#xff08;柵格計算器&#xff09;7、河網分級8、河流鏈接&#xff08;提取子流域的關鍵&#xff09; 二、多個小流域提取1、捕捉傾瀉點2、集水區&…

    【C++】簡單工廠模式/工廠方法模式/抽象工廠模式對比

    目錄 一、簡單工廠模式&#xff08;Simple Factory Pattern&#xff09;二、工廠方法模式&#xff08;Factory Method Pattern&#xff09;三、抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;四、三者對比總結五、選擇建議如果這篇文章對你有所幫助&#xff0c…

    博圖SCL中CONTINUE語句詳解:高效循環控制案例

    博圖SCL中CONTINUE語句詳解&#xff1a;高效循環控制利器 在博圖&#xff08;TIA Portal&#xff09;的SCL&#xff08;結構化控制語言&#xff09;編程中&#xff0c;CONTINUE語句是優化循環流程的強大工具。它允許您**跳過當前循環迭代的剩余代碼&#xff0c;直接進入下一次…

    django HttpResponse 加返回碼

    在Django框架中&#xff0c;HttpResponse對象是用來構造HTTP響應并將其發送回客戶端的。當你創建一個HttpResponse對象時&#xff0c;你可以指定一個返回碼&#xff08;或狀態碼&#xff09;&#xff0c;這是HTTP響應的一部分&#xff0c;用來表示請求的處理結果。狀態碼是三位…

    【俄語圖片文字識別】批量識別俄語圖片文字,識別俄語圖片文字的操作步驟和注意事項

    場景&#xff1a;在俄語學習&#xff0c;俄語工作中經常遇到一些文字圖片&#xff0c;如何將韓語圖片文字從圖片上扣下來&#xff0c;我們可以直接復制粘貼&#xff0c;提高我們的工作效率 我們會用到一款小工具&#xff1a; 軟件操作步驟&#xff1a; 第一步、打開軟件 第二…

    關于AB PLC的ethernet/IP 通信 c++搭建

    1.下載開源的libplctag庫 2.通過Cmake-gui生成工程文件 3.編譯生成對應的Debug 4.配置VS studio 源碼 #include "libplctag.h" #include <cstring> #include <iostream> #include <thread> int main() { plc_tag_set_debug_level(PLCTAG_DEB…

    實驗分享|自研局部DIC-GPU算法與開源GPU算法對比實驗

    1實驗背景 數字圖像相關法DIC是材料力學領域研究的關鍵技術&#xff0c;其中局部DIC憑借亞像素級精度、全場測量等優勢&#xff0c;成為材料局部變形分析的優選方案。傳統CPU計算難以應對局部DIC數萬個子區并行計算需求&#xff0c;新興GPU算法一定程度提高了計算效率&#xf…