001 側邊欄 地址增刪改查 默認地址代碼沒完善

文章目錄

    • user_index.html
    • myaccount_style.css
    • myaccount_scripts.js
    • address_edit.html
    • ReceiverAddress
    • ReceiverAddressController
    • ReceiverAddressServiceImpl
    • IReceiverAddressService
    • R
    • FshopAppApplication
    • ServletInitializer
    • pom.xml
    • ReceiverAddressMapper.xml
    • ReceiverAddressMapper.java

user_index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>水果商城 - 個人中心</title><link rel="stylesheet" href="myaccount_style.css"><script src="../common/jquery-3.3.1.min.js"></script><script src="myaccount_scripts.js"></script>
</head><!-- <header><nav class="main-nav"><ul><li><a href="#" data-page="my_coupons">我的優惠券</a></li><li><a href="#" data-page="my_addresses" class="active">我的地址</a></li></ul></nav>
</header>  --><main><aside><!-- 側邊欄導航 --><nav><ul><li><a href="#" data-page="my_coupons">我的優惠券</a></li><li><a href="#" data-page="my_addresses">我的地址</a></li><!-- 其他側邊欄鏈接 --></ul></nav></aside><div id="content-area"><!-- 內容將通過JavaScript加載 --></div><button id="addNewAddressBtn" class="add-address-btn" >添加新地址</button><!-- 添加新地址的表單(放在內容區域下方以避免重復ID問題)<form id="newAddressForm" style="display: none;">表單內容 ... --><!-- <input type="text" placeholder="接收人姓名" required>其他表單字段 ... --><!-- <input type="submit" value="保存"><button type="button" class="cancel-new-address-btn">取消</button>
</form>   --><div id="content-area-address"><form id="newAddressForm" style="display: none;"><!-- 用戶ID(隱藏字段) --><input type="hidden" id="userId" name="userId" value=""> <!-- 這里的值應該由后臺設置 --><!-- 收件地址ID(隱藏字段),對于新地址可能是空的或自動生成 --><input type="hidden" id="receiveAddressId" name="receiveAddressId" value=""> <!-- 這里的值可能是空的,或者由后臺在編輯地址時提供 --><!-- 收件人姓名 --><div class="form-group"><label for="receiverName">收件人姓名:</label><input type="text" id="receiverName" name="receiverName" placeholder="請輸入收件人姓名" required></div><!-- 收件人電話號碼 --><div class="form-group"><label for="receiverPhone">收件人電話號碼:</label><input type="tel" id="receiverPhone" name="receiverPhone" placeholder="請輸入收件人電話號碼" required></div><!-- 省份(這里假設使用下拉選擇) --><div class="form-group"><label for="receiverProvince">省份:</label><select id="receiverProvince" name="receiverProvince" required><!-- 這里應該動態生成省份選項 --><option value="">請選擇</option><!-- <option value="province1">省份1</option> --><!-- ... --></select></div><!-- 城市(同樣假設使用下拉選擇) --><div class="form-group"><label for="receiverCity">城市:</label><select id="receiverCity" name="receiverCity" required><!-- 這里應該根據選擇的省份動態生成城市選項 --><option value="">請選擇</option><!-- <option value="city1">城市1</option> --><!-- ... --></select></div><!-- 縣區(假設使用下拉選擇) --><div class="form-group"><label for="receiverArea">縣區:</label><select id="receiverArea" name="receiverArea" required disabled><!-- 這里應該根據選擇的城市動態生成縣區選項 --><option value="">請選擇</option><!-- <option value="area1">縣區1</option> --><!-- ... --></select></div><!-- 街道 --><div class="form-group"><label for="receiverStreet">街道:</label><select id="receiverStreet" name="receiverStreet" required disabled><option value="">請選擇</option><!-- 街道選項將根據縣區動態生成 --></select></div><!-- 詳細地址 --><div class="form-group"><label for="receiverDetail">詳細地址:</label><textarea id="receiverDetail" name="receiverDetail" placeholder="請輸入詳細地址" required></textarea></div><!-- ... --><!-- 是否是默認收件地址(使用單選按鈕) --><div class="form-group"><label><input type="radio" id="isDefaultYes" name="isDefault" value="1">是默認收件地址</label><label><input type="radio" id="isDefaultNo" name="isDefault" value="0" checked>不是默認收件地址</label></div><!-- 其他字段,如other1, other2,可以根據需要添加 --><!-- ... --><!-- 提交和取消按鈕 --><div class="form-actions"><input type="submit" value="保存"><button type="button" class="cancel-new-address-btn">取消</button></div></form></div><div id="content-area-review"></div></main><!-- 隱藏的模板數據 -->
<div id="my_coupons-list-template" style="display: none;"><div class="content-block coupon-list"><h2>我的優惠券列表</h2><!-- 優惠券列表內容(模擬數據) --><div class="coupon-item"><p>優惠券1</p></div><div class="coupon-item"><p>優惠券2</p></div></div>
</div><div id="my_addresses-list-template" style="display: none;"><div class="content-block address-list"><h2>我的地址列表</h2><div class="address-item"><p>地址1</p><button class="edit-btn">修改</button><button class="delete-btn">刪除</button><!-- 其他地址詳情 --></div><!-- ... 其他地址項 ... --></div>
</div></body></html>

myaccount_style.css

/* 基本樣式 */
body {font-family: Arial, sans-serif;margin: 0;padding: 0;
}header {background-color: #f2f2f2;padding: 15px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 添加陰影效果 */
}main {display: flex;margin-top: 20px; /* 保持一定間距 */
}aside {width: 20%; /* 根據需要調整寬度 */background-color: #fff;border-right: 1px solid #ddd; /* 添加右側邊框 */box-shadow: 2px 0 4px rgba(0, 0, 0, 0.1); /* 添加陰影效果 */padding: 20px;
}/* .header-info {  display: flex;  align-items: center;  
}  .avatar {  width: 40px;  height: 40px;  border-radius: 50%;  margin-right: 10px;  
}  .username, .user-level {  margin-right: 10px;  
}   */nav ul {list-style: none;padding: 0;}/* 導航鏈接樣式 */
/* nav ul li {  margin-bottom: 10px;    
}   */nav ul li a {display: block;padding: 10px;text-decoration: none;color: #333;transition: background-color 0.3s ease;border-radius: 5px; /* 添加圓角 */}nav ul li a.active,nav ul li a:hover {color: #fff; /* 激活或懸停時的鏈接顏色 */background-color: #f00; /* 替換為您的品牌顏色 *//* border-bottom-color: transparent; /* 移除底部邊框 */
}/* 地址項樣式 */
.address-item {border: 1px solid #ddd; /* 添加邊框 */border-radius: 5px; /* 添加圓角 */padding: 10px; /* 增加內邊距 */margin-bottom: 20px; /* 增加間距 */box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); /* 添加陰影效果 */transition: all 0.3s ease; /* 添加過渡效果 *//*position: relative;*/ /* 為絕對定位的子元素設置參考點 */
}.address-item button {/*margin-left: 10px;*/ /* 按鈕與地址信息之間留點間距 */padding: 5px 10px; /* 調整按鈕的內邊距 */font-size: 12px; /* 調整按鈕上的字體大小 */margin-right: 5px; /* 如果需要,調整按鈕之間的水平間距 */
}.address-item:hover {box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* 鼠標懸停時增加陰影效果 */transform: translateY(-2px); /* 輕微上移,增加立體感 */
}/* 編輯表單樣式 */
.edit-form {display: none; /* 默認隱藏編輯表單 */margin-top: 10px; /* 與地址項保持一定間距 */padding: 10px; /* 為表單內容添加內邊距 */border: 1px solid #ccc; /* 添加邊框 */border-radius: 5px; /* 添加圓角 */background-color: #f5f5f5; /* 設置背景色 */position: absolute; /* 絕對定位以確保它不會干擾其他地址項 */width: 100%; /* 與父元素(.address-item)相同寬度 */z-index: 10; /* 提高層級,確保在其他元素之上 */box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* 添加陰影效果 */
}/* 編輯表單中的輸入和按鈕樣式 */
.edit-form input[type="text"] {width: 100%; /* 占據整個表單寬度 */padding: 5px; /* 添加內邊距 */margin-bottom: 10px; /* 與按鈕保持間距 */
}.edit-form button {padding: 5px 10px; /* 添加內邊距 */margin-right: 5px; /* 如果需要,與其他按鈕保持間距 */background-color: #4CAF50; /* 綠色背景 */border: none; /* 移除邊框 */color: white; /* 白色文本 */cursor: pointer; /* 鼠標懸停時變為手形圖標 */
}/* 編輯表單中的取消按鈕樣式 */
/* 特別注意:.cancel-new-address-btn的樣式 */
.edit-form .cancel-new-address-btn {padding: 5px 10px;margin-right: 5px;background-color: #f44336; /* 紅色背景,以示與保存按鈕區別 */border: none;color: white;cursor: pointer;/* 其他樣式可以保持與.edit-form button一致,或者根據需要調整 */
}/* Content 區域樣式增強 */
#content-area {/* ... 保持不變 ... */padding: 30px; /* 增加內邊距,使內容區域更加寬敞 */
}#content-area div {display: none; /* 初始隱藏所有內容區域 */
}#content-area div.active {display: block; /*顯示當前激活的內容區域   */
}/* 去除激活狀態時的透明底部邊框(如果需要的話)   */
nav ul li a.active {border-bottom-color: #f00; /* 無需透明 */
}/* 其他樣式... */
/* 底部導航樣式 */
/* footer nav ul {  background-color: #f2f2f2; /* 淺灰色背景,與頭部不同 */
/* }   */#addNewAddressBtn {margin-top: 20px; /* 與地址列表保持間距 */
}/* 地址列表標題樣式 */
.address-list h2 {font-size: 18px; /* 調整字體大小 */font-weight: bold; /* 加粗字體 */color: #333; /* 設置字體顏色 */margin-bottom: 20px; /* 增加底部間距,與地址項分開 */text-align: left; /* 文本左對齊,或根據需要調整 */
}/* 如果需要背景色或邊框 */
.address-list {background-color: #fff; /* 設置背景色(如果需要) */border: 1px solid #ddd; /* 添加邊框(如果需要) */padding: 10px; /* 添加內邊距,使內容與邊框有些距離 */
}/* 添加新地址按鈕樣式 */
.add-address-btn {/* 讓按鈕變小 */padding: 5px 10px; /* 減少內邊距 */font-size: 14px; /* 減小字體大小 *//* 將按鈕放置在右上角 */position: absolute; /* 使用絕對定位 */top: 20px; /* 距離頂部一定距離 */right: 20px; /* 距離右側一定距離 */z-index: 10; /* 提高層級,確保在其他元素之上 */display: inline-block; /* 讓按鈕表現為行內塊元素 */color: white; /* 字體顏色 */background-color: #4CAF50; /* 背景顏色,這里使用了綠色 */border: none; /* 移除邊框 */border-radius: 5px; /* 圓角 */cursor: pointer; /* 鼠標懸停時變為手形圖標 */transition: background-color 0.3s ease; /* 背景色過渡效果 */
}.add-address-btn:hover {background-color: #45a049; /* 鼠標懸停時的背景顏色 */
}/* 如果按鈕是激活狀態(例如正在加載數據),可以添加額外的樣式 */
.add-address-btn.active {opacity: 0.6; /* 降低透明度表示按鈕處于非交互狀態 */cursor: not-allowed; /* 更改鼠標圖標為禁止狀態 */
}/* 添加新地址表單樣式 */
#newAddressForm {background-color: #fff; /* 白色背景 */border: 1px solid #ccc; /* 邊框 */border-radius: 5px; /* 圓角 */padding: 20px; /* 內邊距 */box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 陰影效果 */margin-top: 20px; /* 與其他元素間距 */width: 100%; /* 寬度占滿容器 */max-width: 600px; /* 最大寬度限制,防止表單過寬 */
}#newAddressForm label {display: block; /* 塊級元素,獨占一行 */margin-bottom: 10px; /* 與輸入框間距 */font-weight: bold; /* 加粗 */
}#newAddressForm input[type="text"],
#newAddressForm input[type="tel"],
#newAddressForm textarea {width: 100%; /* 寬度占滿容器 */padding: 10px; /* 內邊距 */border: 1px solid #ddd; /* 邊框 */border-radius: 4px; /* 圓角 */box-sizing: border-box; /* 包括內邊距和邊框在內,寬度占滿容器 */
}#newAddressForm textarea {height: 100px; /* 高度 */resize: vertical; /* 允許垂直調整大小 */
}#newAddressForm select {width: 100%; /* 寬度占滿容器 */padding: 10px; /* 內邊距 */border: 1px solid #ddd; /* 邊框 */border-radius: 4px; /* 圓角 */
}#newAddressForm .form-group {margin-bottom: 20px; /* 表單項之間的間距 */
}#newAddressForm .form-actions {text-align: right; /* 右對齊按鈕 */margin-top: 20px; /* 與表單項間距 */
}#newAddressForm .form-actions button {padding: 10px 20px; /* 內邊距 */margin-left: 10px; /* 與前一個按鈕間距 */border: none; /* 無邊框 */border-radius: 4px; /* 圓角 */cursor: pointer; /* 鼠標懸停時變為手形圖標 */
}#newAddressForm .form-actions .save-btn {background-color: #4CAF50; /* 綠色背景 */color: #fff; /* 白色文本 */
}#newAddressForm .form-actions .cancel-btn {background-color: #f44336; /* 紅色背景 */color: #fff; /* 白色文本 */
}/* 響應式設計 */
@media (max-width: 768px) {aside, #content-area {width: 100%; /* 小屏幕上側邊欄和內容區域占滿全寬 */border-right: none; /* 移除右側邊框 */}main {flex-direction: column; /* 改為垂直排列 */}aside {margin-bottom: 20px; /* 與內容區域保持一定間距 */}.add-address-btn {/* 在小屏幕上可能需要調整位置或大小 */top: 10px;right: 10px;padding: 3px 8px;font-size: 12px;}/* 在小屏幕上,可能需要減少內邊距、字體大小等 */.address-list h2 {font-size: 16px;}.address-item {margin-bottom: 10px;}}

myaccount_scripts.js

$(document).ready(function() {var currentPage = '未賦值'; // 假設頁面加載時默認顯示“我的地址”頁面var provinces = [{name: '省份1',cities: [{ name: '城市1', areas: [{ name: '縣區1', streets: ['街道1-1', '街道1-2'] }, { name: '縣區2', streets: ['街道2-1', '街道2-2'] }] },// ... 更多城市和縣區]},{name: '省份2',cities: [{ name: '城市3', areas: [{ name: '縣區3', streets: ['街道3-1', '街道3-2'] }] },// ... 更多城市和縣區]},// ... 添加更多省份和城市];// 初始化省份下拉列表function initProvinceSelect() {var $provinceSelect = $('#receiverProvince');$provinceSelect.empty();$provinceSelect.append($('<option>').val('').text('請選擇'));$.each(provinces, function(index, province) {$provinceSelect.append($('<option>').val(province.name).text(province.name));});}// 根據選擇的省份初始化城市下拉列表function initCitySelect(provinceName) {var $citySelect = $('#receiverCity');$citySelect.empty();$citySelect.append($('<option>').val('').text('請選擇'));var $areaSelect = $('#receiverArea');$areaSelect.empty().append($('<option>').val('').text('請選擇'));$areaSelect.prop('disabled', true);var $streetSelect = $('#receiverStreet');$streetSelect.empty().append($('<option>').val('').text('請選擇'));$streetSelect.prop('disabled', true);$.each(provinces, function(index, province) {if (province.name === provinceName) {$.each(province.cities, function(cityIndex, city) {$citySelect.append($('<option>').val(city.name).text(city.name));});return false; // 找到匹配的省份后退出循環}});}// 根據選擇的城市初始化縣區下拉列表function initAreaSelect(cityName) {var $areaSelect = $('#receiverArea');$areaSelect.empty();$areaSelect.append($('<option>').val('').text('請選擇'));var $streetSelect = $('#receiverStreet');$streetSelect.empty().append($('<option>').val('').text('請選擇'));$streetSelect.prop('disabled', true);$.each(provinces, function(index, province) {$.each(province.cities, function(cityIndex, city) {if (city.name === cityName) {$.each(city.areas, function(areaIndex, area) {$areaSelect.append($('<option>').val(area.name).text(area.name));});$areaSelect.prop('disabled', false);return false; // 找到匹配的城市后退出循環}});});}// 根據選擇的縣區初始化街道下拉列表function initStreetSelect(areaName) {var $streetSelect = $('#receiverStreet');$streetSelect.empty();$streetSelect.append($('<option>').val('').text('請選擇'));$.each(provinces, function(index, province) {$.each(province.cities, function(cityIndex, city) {$.each(city.areas, function(areaIndex, area) {if (area.name === areaName) {$.each(area.streets, function(streetIndex, street) {$streetSelect.append($('<option>').val(street).text(street));});$streetSelect.prop('disabled', false);return false; // 找到匹配的縣區后退出循環}});if (!$streetSelect.prop('disabled')) return false; // 如果已經找到匹配的縣區,則退出城市循環});});}// 綁定省份下拉列表的change事件$('#receiverProvince').on('change', function() {var selectedProvince = $(this).val();if (selectedProvince) {initCitySelect(selectedProvince);}});// 綁定城市下拉列表的change事件$('#receiverCity').on('change', function() {var selectedCity = $(this).val();if (selectedCity) {initAreaSelect(selectedCity);}});// 綁定縣區下拉列表的change事件$('#receiverArea').on('change', function() {var selectedArea = $(this).val();if (selectedArea) {initStreetSelect(selectedArea);}});// 頁面加載時默認加載地址列表// 綁定導航鏈接的點擊事件$('nav ul li a').on('click', function(e) {e.preventDefault();var page = $(this).data('page');// 顯示或隱藏添加新地址按鈕和表單// $('#addNewAddressBtn, #newAddressForm').toggle(page === 'my_addresses');// 只針對表單進行顯示與隱藏的控制console.log("變量"+currentPage);console.log("傳入的"+page);// 如果點擊的頁面與當前頁面不同,則加載新頁面內容if ((page !== currentPage) || page == '未賦值') {loadContent(page);currentPage = page; // 更新當前頁面變量}$('#addNewAddressBtn').toggle(page === 'my_addresses');//這行代碼會在每次點擊導航鏈接時檢查當前頁面是否是“我的地址”頁面。如果是,則顯示添加新地址按鈕和表單;否則,隱藏它們。這樣就確保了在不同頁面之間切換時,表單和按鈕的顯示狀態是正確的。// 如果只有一個元素,則不執行任何操作});// 加載內容函數(使用局部變量來存儲地址列表,以便在后續添加新地址)//var addressesListHtml = $('#my_addresses-list-template').html(); // 初始地址列表HTMLfunction loadContent(page) {console.log("加載");// 移除之前所有導航鏈接的active類$('nav ul li a').removeClass('active');// 為當前點擊的導航鏈接添加active類$('nav ul li a[data-page="' + page + '"]').addClass('active');// 根據頁面加載不同的內容if (page === 'my_addresses') {$('#content-area-address').show();let token = localStorage.getItem("token");$.ajax({url: 'http://localhost:8080/fshop/receiverAddress', // 假設的地址列表API端點headers:{'token': token},type: 'GET',dataType: 'json',success: function(addresses) {console.log(addresses.data);var addressListHtml = '<div class="address-list active">';$.each(addresses.data, function(index, address) {addressListHtml += '<div class="address-item active" data-address-id="' + address.receiveAddressId + '" data-user-id="' + address.userId + '">' +'<p><strong>姓名:</strong> ' + address.receiverName + '</p>' +'<p><strong>電話:</strong> ' + address.receiverPhone + '</p>' +'<p><strong>省份:</strong> ' + address.receiverProvince + '</p>' +'<p><strong>城市:</strong> ' + address.receiverCity + '</p>' +'<p><strong>縣區:</strong> ' + address.receiverArea + '</p>' +'<p><strong>街道:</strong> ' + address.receiverStreet + '</p>' +'<p><strong>詳細地址:</strong> ' + address.receiverDetail + '</p>' +'<button class="edit-btn">修改</button>' +'<button class="delete-btn">刪除</button>' +'</div>';});addressListHtml += '</div>';$('#content-area').html(addressListHtml); // 將地址列表HTML插入到內容區域$('#addNewAddressBtn').show(); // 顯示添加新地址按鈕},error: function(jqXHR, textStatus, errorThrown) {alert('加載地址列表失敗!錯誤: ' + textStatus + ', 詳細信息: ' + errorThrown);// 可能還需要一些錯誤處理邏輯,比如顯示一個空列表或加載指示器}});} else if (page === 'my_coupons') {// 加載優惠券頁面內容(如果有的話)// 這里可以是從模板加載,或者從服務器請求數據后加載// 例如:$('#content-area').html($('#my_coupons-list-template').html());// 但由于我們只想清空內容區域,所以這里簡單清空即可//$('#content-area-coupon').empty();$('#content-area').text('我的優惠券頁面');$('#content-area-address').hide();}// 注意:這里不需要再次為.save-edit-btn和.cancel-edit-btn綁定事件,因為它們只在頁面加載時綁定一次// 移除之前所有content-block的active類$('#content-area .content-block').removeClass('active');$('#content-area .content-block').addClass('active');$('#content-area .address-item').addClass('active');}// 綁定添加新地址相關事件(只需在頁面加載時綁定一次)function bindAddNewAddressEvents() {$('#addNewAddressBtn').on('click', function() {// 隱藏表單(如果之前顯示過)//   $('#newAddressForm').hide().removeData('edit-mode'); // 確保表單不處于編輯模式// 將表單插入到地址列表的末尾,并顯示它// $('#newAddressForm').appendTo('.address-list').show().find('input[type="text"]').val('');// 確保表單在點擊時顯示$('#newAddressForm').show().find('input[type="text"]').val(''); // 顯示表單并清空輸入框// 移除表單的編輯模式數據(如果有的話)$('#newAddressForm').removeData('edit-mode'); // 確保表單不處于編輯模式//$('#newAddressForm').toggle();// $('#newAddressForm').show().find('input[type="text"]').val(''); // 顯示表單并清空輸入框// 設置一個標志來表示不是編輯模式(如果需要的話,但在這個例子中可能不是必需的)// 默認情況下,我們假設不是編輯模式,所以不需要顯式設置標志// 如果需要的話,可以在這里設置 $('#newAddressForm').data('edit-mode', false);});$('#newAddressForm').on('submit', function(e) {e.preventDefault();// 收集表單數據var formData = {userId: $('#userId').val(),receiverName: $('#receiverName').val(),receiverPhone: $('#receiverPhone').val(),receiverProvince: $('#receiverProvince').val(),receiverCity: $('#receiverCity').val(),receiverArea: $('#receiverArea').val(),receiverStreet: $('#receiverStreet').val(),receiverDetail: $('#receiverDetail').val(),isDefault: $('input[name="isDefault"]:checked').val()};// 確保所有必填字段都已填寫if (!receiverName || !receiverPhone || !receiverProvince || !receiverCity || !receiverArea || !receiverStreet) {alert('請填寫所有必填字段!');return;}let token = localStorage.getItem("token");// 發送AJAX POST請求到服務器$.ajax({url: 'http://localhost:8080/fshop/receiverAddress/saveAddr', // 假設的地址添加API端點contentType: 'application/json; charset=utf-8', // 設置請求體的內容類型為 JSONheaders:{'token': token},type: 'POST',data: JSON.stringify(formData),dataType: 'json',success: function(response) {console.log(response);if (response.code == 1) {console.log("成功"+response.data);// 構建新的地址項HTML字符串var newAddressHtml = createAddressItemHtml(response.data); // 假設這是一個輔助函數// 將新地址添加到列表中$('#content-area .address-list').append(newAddressHtml);// 隱藏表單$('#newAddressForm').hide();// 顯示成功消息(如果需要)alert('地址添加成功!');} else {console.log("失敗"+response.data);// 處理添加失敗的情況(比如顯示錯誤消息)alert('地址添加失敗:' + response.message);}},error: function(jqXHR, textStatus, errorThrown) {// 處理AJAX請求失敗的情況alert('添加地址時發生錯誤:' + textStatus + ', 詳細信息: ' + errorThrown);}});});$('#newAddressForm').on('click', '.cancel-new-address-btn', function() {$('#newAddressForm').hide(); // 隱藏表單});}// 輔助函數,用于從響應數據中創建地址項HTMLfunction createAddressItemHtml(addressData) {return '<div class="address-item active" data-address-id="' + addressData.receiveAddressId + '" data-user-id="' + addressData.userId + '">' +'<p><strong>姓名:</strong> ' + addressData.receiverName + '</p>' +'<p><strong>電話:</strong> ' + addressData.receiverPhone + '</p>' +'<p><strong>省份:</strong> ' + addressData.receiverProvince + '</p>' +'<p><strong>城市:</strong> ' + addressData.receiverCity + '</p>' +'<p><strong>縣區:</strong> ' + addressData.receiverArea+ '</p>' +'<p><strong>街道:</strong> ' + addressData.receiverStreet + '</p>' +'<p><strong>詳細地址:</strong> ' + addressData.receiverDetail + '</p>' +'<button class="edit-btn">修改</button>' +'<button class="delete-btn">刪除</button>' +'</div>';}// 綁定編輯地址事件function bindEditAddressEvents() {// 使用事件委托綁定.edit-btn的點擊事件,這樣即使后續添加了新的地址項,事件依然有效// 在頁面加載時一次性綁定編輯按鈕的點擊事件$('#content-area').on('click', '.edit-btn', function() {var addressItem = $(this).closest('.address-item');var addressId = addressItem.data('address-id'); // 獲取地址ID// 構建編輯地址的URL,并攜帶addressId作為查詢參數var editUrl = 'address_edit.html?addressId=' + addressId;// 重定向到編輯頁面,傳遞地址ID作為參數window.location.href = editUrl;// 注意:這里不會進行AJAX調用,因為我們要跳轉到另一個頁面});}// 綁定刪除地址事件function bindDeleteAddressEvents() {$('#content-area').on('click', '.delete-btn', function() {var addressItem = $(this).closest('.address-item');var addressId = addressItem.data('address-id'); // 假設每個地址項都有一個data-address-id屬性來存儲地址IDif (confirm('確定要刪除這個地址嗎?')) { // 添加確認對話框$.ajax({url: 'http://localhost:8080/fshop/receiverAddress/' + addressId, // 假設的地址刪除API端點,需要地址ID作為參數headers: { 'token': localStorage.getItem("token") }, // 添加身份驗證token(如果需要)type: 'DELETE', // 使用DELETE請求來刪除資源dataType: 'json',success: function(response) {if (response.code == 1) {addressItem.remove(); // 從DOM中刪除地址項alert('地址刪除成功!');} else {alert('地址刪除失敗:' + response.message);}},error: function(jqXHR, textStatus, errorThrown) {alert('刪除地址時發生錯誤:' + textStatus + ', 詳細信息: ' + errorThrown);}});}});}loadContent('my_addresses');initProvinceSelect(); // 初始化省份下拉列表bindAddNewAddressEvents();bindEditAddressEvents();bindDeleteAddressEvents();});

address_edit.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../common/jquery-3.3.1.min.js"></script><script>function getQueryParam(name) {var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),results = regex.exec(window.location.href);if (!results) return null;if (!results[2]) return '';return decodeURIComponent(results[2].replace(/\+/g, " "));}// 使用方式var addressId = getQueryParam('addressId');console.log(addressId); // 輸出地址ID的值</script><style>/* 基本表單樣式 */#newAddressForm {max-width: 600px;margin: 0 auto; /* 水平居中 */padding: 20px;border: 1px solid #ccc;border-radius: 5px;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);}/* 表單項樣式 */.form-group {margin-bottom: 20px;}.form-group label {display: block;font-weight: bold;margin-bottom: 5px;}.form-group input[type="text"],.form-group input[type="tel"],.form-group textarea {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box; /* 包括內邊距和邊框在內,寬度占滿容器 */}/* 下拉列表樣式 */.form-group select {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 4px;}/* 單選按鈕樣式 */.form-group input[type="radio"] {margin-right: 5px;}/* 提交和取消按鈕樣式 */.form-actions {text-align: right; /* 右對齊按鈕 */margin-top: 20px;}.form-actions input[type="button"],.form-actions button {padding: 10px 20px;border: none;border-radius: 4px;cursor: pointer;}.form-actions input[type="button"]:hover,.form-actions button:hover {background-color: #ddd; /* 鼠標懸停時背景色變淺 */}/* 保存按鈕樣式 */#submitBtn {background-color: #4CAF50; /* 綠色背景 */color: white; /* 白色文本 */}/* 取消按鈕樣式 */.cancel-new-address-btn {background-color: #f44336; /* 紅色背景 */color: white; /* 白色文本 */}/* 加載指示器樣式(如果需要的話) */#loading-indicator {text-align: center;padding: 10px;background-color: rgba(255, 255, 255, 0.8);position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 9999; /* 確保在其他元素之上 */}</style>
</head>
<body><!-- 加載指示器(可選) -->
<div id="loading-indicator" style="display: none;">加載中...</div><form id="newAddressForm" style="display: none;"><!-- 用戶ID(隱藏字段) --><input type="hidden" id="userId" name="userId" value=""> <!-- 這里的值應該由后臺設置 --><!-- 收件地址ID(隱藏字段),對于新地址可能是空的或自動生成 --><input type="hidden" id="receiveAddressId" name="receiveAddressId" value=""> <!-- 這里的值可能是空的,或者由后臺在編輯地址時提供 --><!-- 收件人姓名 --><div class="form-group"><label for="receiverName">收件人姓名:</label><input type="text" id="receiverName" name="receiverName" placeholder="請輸入收件人姓名" required></div><!-- 收件人電話號碼 --><div class="form-group"><label for="receiverPhone">收件人電話號碼:</label><input type="tel" id="receiverPhone" name="receiverPhone" placeholder="請輸入收件人電話號碼" required></div><!-- 省份(這里假設使用下拉選擇) --><div class="form-group"><label for="receiverProvince">省份:</label><select id="receiverProvince" name="receiverProvince" required><!-- 這里應該動態生成省份選項 --><option value="">請選擇</option><!-- <option value="province1">省份1</option> --><!-- ... --></select></div><!-- 城市(同樣假設使用下拉選擇) --><div class="form-group"><label for="receiverCity">城市:</label><select id="receiverCity" name="receiverCity" required><!-- 這里應該根據選擇的省份動態生成城市選項 --><option value="">請選擇</option><!-- <option value="city1">城市1</option> --><!-- ... --></select></div><!-- 縣區(假設使用下拉選擇) --><div class="form-group"><label for="receiverArea">縣區:</label><select id="receiverArea" name="receiverArea" required disabled><!-- 這里應該根據選擇的城市動態生成縣區選項 --><option value="">請選擇</option><!-- <option value="area1">縣區1</option> --><!-- ... --></select></div><!-- 街道 --><div class="form-group"><label for="receiverStreet">街道:</label><select id="receiverStreet" name="receiverStreet" required disabled><option value="">請選擇</option><!-- 街道選項將根據縣區動態生成 --></select></div><!-- 詳細地址 --><div class="form-group"><label for="receiverDetail">詳細地址:</label><textarea id="receiverDetail" name="receiverDetail" placeholder="請輸入詳細地址" required></textarea></div><!-- ... --><!-- 是否是默認收件地址(使用單選按鈕) --><div class="form-group"><label><input type="radio" id="isDefaultYes" name="isDefault" value="1">是默認收件地址</label><label><input type="radio" id="isDefaultNo" name="isDefault" value="0" checked>不是默認收件地址</label></div><!-- 其他字段,如other1, other2,可以根據需要添加 --><!-- ... --><!-- 提交和取消按鈕 --><div class="form-actions"><input type="button" id="submitBtn" value="保存"><button type="button" id="cancelBtn" class="cancel-new-address-btn">取消</button></div>
</form></body><script>$(document).ready(function() {// 顯示加載指示器$('#loading-indicator').show();var provinces = [{name: '省份1',cities: [{ name: '城市1', areas: [{ name: '縣區1', streets: ['街道1-1', '街道1-2'] }, { name: '縣區2', streets: ['街道2-1', '街道2-2'] }] },// ... 更多城市和縣區]},{name: '省份2',cities: [{ name: '城市3', areas: [{ name: '縣區3', streets: ['街道3-1', '街道3-2'] }] },// ... 更多城市和縣區]},{name: '江蘇省',cities: [{ name: '宿遷市', areas: [{ name: '灌南縣', streets: ['五老村街道', '五老村街道3'] },{ name: '2縣', streets: ['2街道', '3街道'] }] },// ... 更多城市和縣區]}// ... 添加更多省份和城市];// 初始化省份下拉列表function initProvinceSelect() {var $provinceSelect = $('#receiverProvince');$provinceSelect.empty();$provinceSelect.append($('<option>').val('').text('請選擇'));$.each(provinces, function(index, province) {$provinceSelect.append($('<option>').val(province.name).text(province.name));});}// 根據選擇的省份初始化城市下拉列表function initCitySelect(provinceName) {var $citySelect = $('#receiverCity');$citySelect.empty();$citySelect.append($('<option>').val('').text('請選擇'));var $areaSelect = $('#receiverArea');$areaSelect.empty().append($('<option>').val('').text('請選擇'));$areaSelect.prop('disabled', true);var $streetSelect = $('#receiverStreet');$streetSelect.empty().append($('<option>').val('').text('請選擇'));$streetSelect.prop('disabled', true);$.each(provinces, function(index, province) {if (province.name === provinceName) {$.each(province.cities, function(cityIndex, city) {$citySelect.append($('<option>').val(city.name).text(city.name));});return false; // 找到匹配的省份后退出循環}});}// 根據選擇的城市初始化縣區下拉列表function initAreaSelect(cityName) {var $areaSelect = $('#receiverArea');$areaSelect.empty();$areaSelect.append($('<option>').val('').text('請選擇'));var $streetSelect = $('#receiverStreet');$streetSelect.empty().append($('<option>').val('').text('請選擇'));$streetSelect.prop('disabled', true);$.each(provinces, function(index, province) {$.each(province.cities, function(cityIndex, city) {if (city.name === cityName) {$.each(city.areas, function(areaIndex, area) {$areaSelect.append($('<option>').val(area.name).text(area.name));});$areaSelect.prop('disabled', false);return false; // 找到匹配的城市后退出循環}});});}// 根據選擇的縣區初始化街道下拉列表function initStreetSelect(areaName) {var $streetSelect = $('#receiverStreet');$streetSelect.empty();$streetSelect.append($('<option>').val('').text('請選擇'));$.each(provinces, function(index, province) {$.each(province.cities, function(cityIndex, city) {$.each(city.areas, function(areaIndex, area) {if (area.name === areaName) {$.each(area.streets, function(streetIndex, street) {$streetSelect.append($('<option>').val(street).text(street));});$streetSelect.prop('disabled', false);return false; // 找到匹配的縣區后退出循環}});if (!$streetSelect.prop('disabled')) return false; // 如果已經找到匹配的縣區,則退出城市循環});});}// 綁定省份下拉列表的change事件$('#receiverProvince').on('change', function() {var selectedProvince = $(this).val();if (selectedProvince) {initCitySelect(selectedProvince);}});// 綁定城市下拉列表的change事件$('#receiverCity').on('change', function() {var selectedCity = $(this).val();if (selectedCity) {initAreaSelect(selectedCity);}});// 綁定縣區下拉列表的change事件$('#receiverArea').on('change', function() {var selectedArea = $(this).val();if (selectedArea) {initStreetSelect(selectedArea);}});initProvinceSelect(); // 初始化省份下拉列表});// 獲取地址IDvar addressId = getQueryParam('addressId');if (addressId) {// 發送AJAX請求獲取地址詳情$.ajax({url: 'http://localhost:8080/fshop/receiverAddress/' + addressId, // 假設的API端點headers: { 'token': localStorage.getItem("token") },type: 'GET',dataType: 'json',success: function(address) {let addressData = address.data;// 隱藏加載指示器$('#loading-indicator').hide();// 更新表單字段$('#receiveAddressId').val(addressData.receiveAddressId); // 如果需要顯示這個ID$('#userId').val(addressData.userId); // 假設后臺已經提供了這個值$('#receiverName').val(addressData.receiverName);$('#receiverPhone').val(addressData.receiverPhone);// 假設你已經從某處獲得了要選中的省份的值//var selectedProvince = addressData.receiverProvince;// 使用jQuery選擇器找到對應的<option>并設置selected屬性//$('#receiverProvince option[value="' + selectedProvince + '"]').prop('selected', true);// 設置省份下拉列表的選中項$('#receiverProvince').val(addressData.receiverProvince).trigger('change'); // 觸發change事件以更新城市列表// 注意:由于城市、縣區、街道的更新依賴于之前的change事件,這里不需要立即設置它們的值// 因為change事件的監聽器會處理這些更新$('#receiverDetail').val(addressData.receiverDetail);var defaultValueFromBackend = addressData.isDefault;// 設置默認收件地址單選按鈕if (defaultValueFromBackend === 1) {$('#isDefaultYes').prop('checked', true);} else if (defaultValueFromBackend === 0) {$('#isDefaultNo').prop('checked', true);}// 顯示表單$('#newAddressForm').show();},error: function(jqXHR, textStatus, errorThrown) {// 隱藏加載指示器$('#loading-indicator').hide();// 顯示錯誤信息或執行其他錯誤處理邏輯alert('獲取地址詳情失敗:' + textStatus);}});}// ... 省略其他代碼 ...// 綁定保存按鈕的點擊事件$('#submitBtn').on('click', function(event) {// 阻止表單的默認提交行為event.preventDefault(); // 注意這里需要傳入 event 參數,例如 function(event) {...}// 收集表單數據var formData = {userId: $('#userId').val(),receiveAddressId: $('#receiveAddressId').val(),receiverName: $('#receiverName').val(),receiverPhone: $('#receiverPhone').val(),receiverProvince: $('#receiverProvince').val(),receiverCity: $('#receiverCity').val(),receiverArea: $('#receiverArea').val(),receiverStreet: $('#receiverStreet').val(),receiverDetail: $('#receiverDetail').val(),isDefault: $('input[name="isDefault"]:checked').val()};// 發送 AJAX POST 請求到服務器$.ajax({url: 'http://localhost:8080/fshop/receiverAddress/updateAddr', // 保存地址的API端點contentType: 'application/json; charset=utf-8', // 設置請求體的內容類型為 JSONheaders:{'token': localStorage.getItem("token")},type: 'POST',data: JSON.stringify(formData),headers: { 'token': localStorage.getItem("token") }, // 身份驗證token(如果需要)dataType: 'json',success: function(response) {console.log(response);if (response.code == 1 ) { // 假設后端返回的成功狀態碼是 1 或者有 success 字段為 true// 提交成功,跳轉到另一個頁面window.location.href = 'user_index.html';} else {// 處理提交失敗的情況(比如顯示錯誤消息)alert('地址保存失敗:' + response.message);}},error: function(jqXHR, textStatus, errorThrown) {// 處理 AJAX 請求失敗的情況alert('保存地址時發生錯誤:' + textStatus + ', 詳細信息: ' + errorThrown);}});});// ... 省略其他代碼 ...$('#cancelBtn').on('click', function(event) {event.preventDefault();window.location.href = 'user_index.html';});</script></html>

ReceiverAddress


package com.fshop.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.time.LocalDateTime;/*** <p>* 地址表* </p>** @author dev* @since 2024-04-23*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("receiver_address")
public class ReceiverAddress implements Serializable {private static final long serialVersionUID = 1L;/*** 地址ID*/@TableId(value = "receive_address_id", type = IdType.AUTO)private Integer receiveAddressId;/*** 用戶ID,外鍵(關聯用戶表)*/private Integer userId;/*** 收件人姓名*/private String receiverName;/*** 收件人電話號碼*/private String receiverPhone;/*** 省份*/private String receiverProvince;/*** 城市*/private String receiverCity;/*** 縣區*/private String receiverArea;/*** 街道*/private String receiverStreet;/*** 詳細地址*/private String receiverDetail;/*** 是否是默認收件地址,默認值0*/private Byte isDefault;/*** 地址狀態*/private Integer status;/*** 版本*/private Integer version;/*** 創建時間*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;/*** 最近更新時間*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;private String other1;private String other2;}

ReceiverAddressController


package com.fshop.controller;import com.fshop.common.R;
import com.fshop.common.ResponseCode;
import com.fshop.entity.ReceiverAddress;
import com.fshop.service.IReceiverAddressService;
import com.fshop.util.JwtUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.util.List;/*** 地址表 前端控制器** @author dev* @since 2024-04-23*/
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/receiverAddress")
@RequiredArgsConstructor
@Slf4j
public class ReceiverAddressController {private final IReceiverAddressService receiverAddressService;/*** 根據用戶id查詢地址* @return*/@GetMapping()public R<List<ReceiverAddress>> getById(HttpServletRequest request){//獲取tokenString token = request.getHeader("token");log.info("根據id查詢地址的token:{}",token);//檢查tokenif (JwtUtil.checkToken(token)){log.info("查詢地址的token正確:{}",token);// 查詢地址調用業務R<List<ReceiverAddress>> listR = receiverAddressService.getById(token);log.info("查詢地址返回的數據:{}",listR);return listR;}//token失效return R.error(ResponseCode.TOKEN_ERROR);}/*** 根據地址id查詢地址* @return*/@GetMapping("{addrId}")public R<ReceiverAddress> getByAddrId(@PathVariable("addrId") Integer addrId){// 查詢地址調用業務log.info("地址id:{}",addrId);R<ReceiverAddress> result = receiverAddressService.getByAddrId(addrId);return result;}/*** 添加地址* @return*/@PostMapping("/saveAddr")public R<ReceiverAddress> saveAddr(@RequestBody ReceiverAddress receiverAddress, HttpServletRequest request){// 查詢地址調用業務log.info("地址信息:{}",receiverAddress);String token = request.getHeader("token");log.info("地址信息token:{}",token);if (JwtUtil.checkToken(token)){R<ReceiverAddress> receiverAddressR = receiverAddressService.saveAddr(receiverAddress, token);return receiverAddressR;}return R.error(ResponseCode.TOKEN_ERROR);}/*** 修改地址* @return*/@PostMapping("/updateAddr")public R<ReceiverAddress> updateAddr(@RequestBody ReceiverAddress receiverAddress, HttpServletRequest request){// 查詢地址調用業務//log.info("地址信息:{}",receiverAddress);String token = request.getHeader("token");//log.info("地址信息token:{}",token);if (JwtUtil.checkToken(token)){R<ReceiverAddress> receiverAddressR = receiverAddressService.updateAddr(receiverAddress, token);return receiverAddressR;}return R.error(ResponseCode.TOKEN_ERROR);}/*** 刪除地址* @return*/@DeleteMapping("{addrId}")public R<ReceiverAddress> deleteByAddrId(@PathVariable("addrId") Integer addrId, HttpServletRequest request){String token = request.getHeader("token");if (JwtUtil.checkToken(token)){R<ReceiverAddress> receiverAddressR = receiverAddressService.deleteByAddrId(addrId, token);return receiverAddressR;}return R.error(ResponseCode.TOKEN_ERROR);}}

ReceiverAddressServiceImpl


package com.fshop.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fshop.common.R;
import com.fshop.dto.LoginUserDto;
import com.fshop.entity.ReceiverAddress;
import com.fshop.mapper.ReceiverAddressMapper;
import com.fshop.service.IReceiverAddressService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fshop.util.JwtUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;/*** <p>* 地址表 服務實現類* </p>** @author dev* @since 2024-04-23*/
@Service
@RequiredArgsConstructor
@Slf4j
public class ReceiverAddressServiceImpl extends ServiceImpl<ReceiverAddressMapper, ReceiverAddress> implements IReceiverAddressService {//dao層接口private final ReceiverAddressMapper receiverAddressMapper;/*** 根據用戶id查詢地址* @param token 用戶攜帶的token* @return 返回地址信息*/@Overridepublic R<List<ReceiverAddress>> getById(String token) {log.info("根據用戶id查詢地址:{}",token);//解析token,獲取用戶信息LoginUserDto loginUserDto = JwtUtil.parseToken(token);//根據id查詢地址QueryWrapper<ReceiverAddress> wrapper = new QueryWrapper<>();wrapper.eq("user_id",loginUserDto.getUserId()).eq("status",1);List<ReceiverAddress> receiverAddresses = receiverAddressMapper.selectList(wrapper);log.info("根據用戶id查詢到的地址信息:{}",receiverAddresses);//返回數據return R.ok(receiverAddresses);}/*** 根據地址id查詢* @param addrId* @return*/@Overridepublic R<ReceiverAddress> getByAddrId(Integer addrId) {ReceiverAddress address = receiverAddressMapper.selectById(addrId);if (address != null)return R.ok(address);return R.error("地址不存在");}/*** 添加地址* @param receiverAddress* @param token* @return*/@Overridepublic R<ReceiverAddress> saveAddr(ReceiverAddress receiverAddress, String token) {//查詢用戶idLoginUserDto loginUserDto = JwtUtil.parseToken(token);if (loginUserDto.getUserId() != null){//填充地址數據receiverAddress.setUserId(loginUserDto.getUserId());receiverAddress.setStatus(1);receiverAddress.setVersion(1);receiverAddress.setCreateTime(LocalDateTime.now());receiverAddress.setUpdateTime(LocalDateTime.now());Integer insert = receiverAddressMapper.insert(receiverAddress);if (insert > 0){return R.ok(receiverAddress);}return R.error("添加失敗");}return R.error("token錯誤,未登錄");}/*** 修改地址* @param receiverAddress* @param token* @return*/@Overridepublic R<ReceiverAddress> updateAddr(ReceiverAddress receiverAddress, String token) {//查詢用戶idLoginUserDto loginUserDto = JwtUtil.parseToken(token);if (loginUserDto.getUserId() != null && receiverAddress.getUserId().equals(loginUserDto.getUserId())){ReceiverAddress receiverAddress1 = receiverAddressMapper.selectById(receiverAddress.getReceiveAddressId());//receiverAddress.setVersion(receiverAddress1.getVersion()+1);receiverAddress.setUpdateTime(LocalDateTime.now());Integer update = receiverAddressMapper.updateById(receiverAddress);if (update > 0){return R.ok(receiverAddress);}return R.error("修改失敗");}return R.error("token錯誤,未登錄");}@Overridepublic R<ReceiverAddress> deleteByAddrId(@PathVariable("addrId") Integer addrId,String token){//查詢用戶idLoginUserDto loginUserDto = JwtUtil.parseToken(token);ReceiverAddress receiverAddress = receiverAddressMapper.selectById(addrId);receiverAddress.setStatus(0);if(receiverAddress != null && receiverAddress.getUserId().equals(loginUserDto.getUserId())){receiverAddressMapper.updateById(receiverAddress);return R.ok("刪除成功");}return  R.error("刪除失敗");}}

IReceiverAddressService


package com.fshop.service;import com.fshop.common.R;
import com.fshop.entity.ReceiverAddress;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.bind.annotation.PathVariable;import java.util.List;/*** <p>* 地址表 服務類* </p>** @author dev* @since 2024-04-23*/
public interface IReceiverAddressService extends IService<ReceiverAddress> {//根據用戶id查詢地址R<List<ReceiverAddress>> getById(String token);//根據地址id查詢地址信息R<ReceiverAddress> getByAddrId(Integer addrId);//添加地址R<ReceiverAddress> saveAddr(ReceiverAddress receiverAddress, String token);public R<ReceiverAddress> deleteByAddrId(@PathVariable("addrId") Integer addrId, String token);public R<ReceiverAddress> updateAddr(ReceiverAddress receiverAddress, String token);
}

R


package com.fshop.common;import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;import java.io.Serializable;// @JsonInclude 保證序列化json的時候, 如果是null的對象, key也會消失
@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> implements Serializable {private static final long serialVersionUID = 7735505903525411467L;// 成功值,默認為1private static final int SUCCESS_CODE = 1;// 失敗值,默認為0private static final int ERROR_CODE = 0;// 狀態碼private final int code;// 消息private String msg;// 返回數據private T data;private R(int code) {this.code = code;}private R(int code, T data) {this.code = code;this.data = data;}private R(int code, String msg) {this.code = code;this.msg = msg;}private R(int code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}public static <T> R<T> ok() {return new R<T>(SUCCESS_CODE, "success");}public static <T> R<T> ok(String msg) {return new R<T>(SUCCESS_CODE, msg);}public static <T> R<T> ok(T data) {return new R<T>(SUCCESS_CODE, data);}public static <T> R<T> ok(String msg, T data) {return new R<T>(SUCCESS_CODE, msg, data);}public static <T> R<T> error() {return new R<T>(ERROR_CODE, "error");}public static <T> R<T> error(String msg) {return new R<T>(ERROR_CODE, msg);}public static <T> R<T> error(int code, String msg) {return new R<T>(code, msg);}public static <T> R<T> error(ResponseCode res) {return new R<T>(res.getCode(), res.getMessage());}@Overridepublic String toString() {return "R{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}

FshopAppApplication

package com.fshop;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;@SpringBootApplication
@MapperScan("com.fshop.mapper")
public class FshopAppApplication {public static void main(String[] args) {SpringApplication.run(FshopAppApplication.class, args);}}

ServletInitializer


package com.fshop;import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(FshopAppApplication.class);}}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.fshop</groupId><artifactId>fshop-app</artifactId><version>0.0.1-SNAPSHOT</version><name>fshop-app</name><description>fshop-app</description><packaging>war</packaging><properties><java.version>1.8</java.version></properties><dependencies><!--短信--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.15</version></dependency><!-- SPRINGBOOT --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- JDBC --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!-- MYBATIS PLUS --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!-- DRUID --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.9</version></dependency><!--REDIS--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- JWT --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!-- ALIPAY --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.1.0</version></dependency><!-- LOMBOK --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- rabbitmq --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version></dependency><!-- servlet --><!--<dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>--><!-- 牛🐎云相關依賴 --><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.13.0</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version><scope>compile</scope></dependency><dependency><groupId>com.qiniu</groupId><artifactId>happy-dns-java</artifactId><version>0.1.6</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.6</version></plugin></plugins></build></project>

ReceiverAddressMapper.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fshop.mapper.ReceiverAddressMapper"></mapper>

ReceiverAddressMapper.java


package com.fshop.mapper;import com.fshop.entity.ReceiverAddress;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;/*** <p>* 地址表 Mapper 接口* </p>** @author dev* @since 2024-04-23*/
public interface ReceiverAddressMapper extends BaseMapper<ReceiverAddress> {}

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

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

相關文章

文件存儲解決方案-阿里云OSS

文章目錄 1.菜單分級顯示問題1.問題引出1.蘋果燈&#xff0c;放到節能燈下面也就是id大于1272.查看菜單&#xff0c;并沒有出現蘋果燈3.放到燈具下面id42&#xff0c;就可以顯示 2.問題分析和解決1.判斷可能出現問題的位置2.找到遞歸返回樹形菜單數據的位置3.這里出現問題的原因…

Golang 的 unmarshal 踩坑指南

文章目錄 1. 寫在最前面2. 字段區分出空字段還是未設置字段2.1 問題描述2.2 解決 3. 字段支持多種類型 & 按需做不同類型處理3.1 問題描述3.2 解決 4. 碎碎念5. 參考資料 1. 寫在最前面 筆者最近在實現將內部通知系統的數據定義轉化為產品定義的對外提供的數據結構。 舉例…

算法學習筆記(5.0)-基于比較的高效排序算法-歸并排序

##時間復雜度O(nlogn) 目錄 ##時間復雜度O(nlogn) ##遞歸實現歸并排序 ##原理 ##圖例 ##代碼實現 ##非遞歸實現歸并排序 ##釋 #代碼實現 ##遞歸實現歸并排序 ##原理 是一種基于分治策略的基礎排序算法。 1.劃分階段&#xff1a;通過不斷遞歸地將數組從中點處分開&…

Java 開發 框架安全:Spring 命令執行漏洞.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一個用于構建企業級應用程序的開源框架。它提供了一種全面的編程和配置模型&#xff0c;可以簡化應用程序的開發過程。Spring 框架的核心特性包括依賴注入&#xff08;Dependency Injection&#xff09;、面向切面編程&#xff08;Aspect-Or…

【SpringBoot筆記43】SpringBoot應用程序集成spring-boot-admin監控工具

這篇文章,主要介紹SpringBoot應用程序如何集成spring-boot-admin監控工具。 目錄 一、spring-boot-admin監控工具 1.1、創建admin-client客戶端 (1)引入依賴

DeepSpeed

文章目錄 一、關于 DeepSpeed1、DeepSpeed 是什么2、深度學習訓練和推理的極致速度和規模3、DeepSpeed 的四大創新支柱1&#xff09;DeepSpeed 訓練2&#xff09;DeepSpeed 推理3&#xff09;DeepSpeed 壓縮4&#xff09;DeepSpeed4Science 4、DeepSpeed 軟件套件DeepSpeed 庫推…

React 第二十七章 Hook useCallback

useCallback 是 React 提供的一個 Hook 函數&#xff0c;用于優化性能。它的作用是返回一個記憶化的函數&#xff0c;當依賴發生變化時&#xff0c;才會重新創建并返回新的函數。 在 React 中&#xff0c;當一個組件重新渲染時&#xff0c;所有的函數都會被重新創建。這可能會…

青少年軟件編程(Python)等級考試試卷(五級)2024年3月

2024.03 電子學會 青少年軟件編程&#xff08;Python&#xff09;等級考試試卷&#xff08;五級&#xff09; 一、單選題 1.以下代碼的輸出結果是? ) nums list(range(100, 201)) print(nums[::10]) A.[100,110,120,130,140,150,160,170,180,190,200] B.[100,101,1…

QML筆記八

QML與C交互 QML中調用C功能、使用QML或者Quick中的C接口、使用C實現自定義的QML對象 注&#xff1a; 只有QObject的派生類才能與QML交互 QML引擎集成Qt元對象系統&#xff0c;QObject的派生子類的屬性、方法、信號都可以在QML中訪問 C類可以被注冊為一個QML實例 C類可以被注冊為…

【Web后端】請求頭

1、簡介 請求頭&#xff08;Request Headers&#xff09;是在HTTP協議中&#xff0c;客戶端&#xff08;如瀏覽器或應用程序&#xff09;向服務器發送請求時附帶的元數據。包含了關于請求的額外信息&#xff0c;有助于客戶端與服務器之間的有效通信。請求頭中的信息可以讓服務…

.[sqlback@memeware.net].2700勒索病毒數據怎么處理|數據解密恢復

導言&#xff1a; 隨著信息技術的飛速發展&#xff0c;網絡安全問題愈發嚴峻&#xff0c;其中勒索病毒成為了企業和個人用戶面臨的重要威脅之一。.[sqlbackmemeware.net].2700勒索病毒作為其中的佼佼者&#xff0c;以其獨特的攻擊方式和強大的破壞力&#xff0c;引起了廣泛關注…

【Go語言入門學習筆記】Part1.夢開始的地方

一、前言 經過一系列的學習&#xff0c;終于有時間來學習一些新的語言&#xff0c;Go語言在現在還是比較時髦的&#xff0c;多一個技能總比不多的好&#xff0c;故有時間來學一下。 二、配置環境 按照網絡中已有的配置方法配置好&#xff0c;本人采用了Jetbrain的Goland&#…

DTC 2024回顧丨zData X 多元數據庫一體機:開創多元數據庫時代部署新范式

導語 在2024“數據技術嘉年華”上&#xff0c;云和恩墨數據庫一體機產品總經理劉宇在“數據庫極致特性”專題論壇發表了題為《打造多元數據庫部署新范式&#xff0c;引領一體化資源池創新之路》的演講。他深入分析了國產數據庫面臨的挑戰&#xff0c;并詳細介紹了云和恩墨如何利…

5.10.1 Pre-Trained Image Processing Transformer

研究了低級計算機視覺任務&#xff08;例如去噪、超分辨率和去雨&#xff09;并開發了一種新的預訓練模型&#xff0c;即圖像處理變壓器&#xff08;IPT&#xff09;。利用著名的 ImageNet 基準來生成大量損壞的圖像對。 IPT 模型是在這些具有多頭和多尾的圖像上進行訓練的。此…

Megatron-lm、DeepSpeed

1、為了訓練更多的數據、更大的模型&#xff0c;提出了并行訓練框架。 2、并行的方式&#xff1a;數據并行、模型并行&#xff08;張量并行、流水線并行&#xff09;。 3、Megatron-LM 綜合應用了數據并行&#xff08;Data Parallelism&#xff09;&#xff0c;張量并行&…

內網安全工具之ADExplorer的使用

ADExplorer是域內一款信息查詢工具&#xff0c;它是獨立的可執行文件&#xff0c;無需安裝。它能夠列出域組織架構、用戶賬號、計算機賬號登&#xff0c;可以幫助尋找特權用戶和數據庫服務器等敏感目標。 下載地址&#xff1a;http://live.sysinternals.com/ 連接 下載了ADE…

第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組 拼數字

//bfs只能過40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

Java入門基礎學習筆記24——While循環和do-while循環

1、While循環&#xff1a; 例1&#xff1a; package cn.ensource.loop;public class WhileDemo3 {public static void main(String[] args) {// 目標&#xff1a;掌握while循環的書寫格式&#xff0c;以及理解其執行流程// 需求&#xff1a;打印多行Hello Worldint i 0;while…

EFCore_創建項目

添加依賴 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools(Migration工具) 根據使用的DB添加對應依賴&#xff1a; SQL Server&#xff1a;Microsoft.EntityFrameworkCore.SqlServer 添加該依賴時可不添加Microsoft.EntityFrameworkCore&#xff0c;該依…

電工能混到這份上

最近看到某電工師傅發了一篇帖子&#xff0c;大致內容是他在處理一個簡單故障的時候居然花了很長的時間。我們一起來看看他遇到的是什么故障吧! plc 控制的一臺設備&#xff0c;行走部分靠 2 個腳踏開關控制&#xff08;內部開關量控制方向&#xff0c;電位器控制速度&#xff…