// 订单结算页面脚本
let selectedAddressId = 0;
let subtotal = 0;
// 初始化页面
document.addEventListener('DOMContentLoaded', function() {
// 从页面获取初始数据
const defaultAddress = document.querySelector('input[name="address_id"]:checked');
if (defaultAddress) {
selectedAddressId = parseInt(defaultAddress.value);
}
// 获取商品总价
const subtotalElement = document.getElementById('subtotal');
if (subtotalElement) {
subtotal = parseFloat(subtotalElement.textContent.replace('¥', ''));
}
// 初始化地址卡片动画
initAddressAnimations();
});
// 初始化地址卡片动画
function initAddressAnimations() {
const addressCards = document.querySelectorAll('.address-card');
addressCards.forEach((card, index) => {
card.style.animationDelay = `${index * 0.1}s`;
});
}
// 选择地址(优化版本)
function selectAddress(addressId) {
selectedAddressId = addressId;
// 添加加载状态
const clickedCard = document.querySelector(`[data-address-id="${addressId}"]`);
if (clickedCard) {
clickedCard.classList.add('loading');
}
// 延迟执行UI更新,给用户视觉反馈
setTimeout(() => {
// 更新UI
document.querySelectorAll('.address-card').forEach(card => {
card.classList.remove('selected', 'loading');
});
const selectedCard = document.querySelector(`[data-address-id="${addressId}"]`);
if (selectedCard) {
selectedCard.classList.add('selected');
// 添加选中动画效果
selectedCard.style.animation = 'none';
selectedCard.offsetHeight; // 触发重排
selectedCard.style.animation = 'slideIn 0.4s ease';
}
// 更新单选按钮
const radioButton = document.querySelector(`input[value="${addressId}"]`);
if (radioButton) {
radioButton.checked = true;
// 触发单选按钮动画
const radioMark = radioButton.nextElementSibling;
if (radioMark) {
radioMark.style.transform = 'scale(1.1)';
setTimeout(() => {
radioMark.style.transform = 'scale(1)';
}, 200);
}
}
// 显示成功提示
showSelectionFeedback('地址选择成功');
}, 150);
}
// 显示选择反馈
function showSelectionFeedback(message) {
// 创建临时提示元素
const feedback = document.createElement('div');
feedback.className = 'position-fixed top-0 start-50 translate-middle-x mt-3';
feedback.style.zIndex = '9999';
feedback.innerHTML = `
${message}
`;
document.body.appendChild(feedback);
// 3秒后自动移除
setTimeout(() => {
if (feedback.parentNode) {
feedback.remove();
}
}, 3000);
}
// 更新运费(优化版本)
function updateShippingFee() {
const shippingMethodElement = document.querySelector('input[name="shipping_method"]:checked');
if (!shippingMethodElement) return;
const shippingMethod = shippingMethodElement.value;
let fee = 0;
let description = '';
switch(shippingMethod) {
case 'express':
fee = 10;
description = '次日达服务';
break;
case 'same_day':
fee = 20;
description = '当日达服务';
break;
default:
fee = 0;
description = '标准配送';
}
// 添加动画效果更新价格
const shippingFeeElement = document.getElementById('shippingFee');
const totalAmountElement = document.getElementById('totalAmount');
if (shippingFeeElement && totalAmountElement) {
// 淡出效果
shippingFeeElement.style.opacity = '0.5';
totalAmountElement.style.opacity = '0.5';
setTimeout(() => {
shippingFeeElement.textContent = `¥${fee.toFixed(2)}`;
totalAmountElement.textContent = `¥${(subtotal + fee).toFixed(2)}`;
// 淡入效果
shippingFeeElement.style.opacity = '1';
totalAmountElement.style.opacity = '1';
// 显示配送方式反馈
if (fee > 0) {
showSelectionFeedback(`已选择${description} (+¥${fee})`);
} else {
showSelectionFeedback(`已选择${description} (免费)`);
}
}, 200);
}
}
// 提交订单(优化版本)
function submitOrder() {
// 验证地址选择
if (!selectedAddressId) {
showAlert('请选择收货地址', 'warning');
highlightAddressSection();
return;
}
// 获取表单数据
const shippingMethodElement = document.querySelector('input[name="shipping_method"]:checked');
const paymentMethodElement = document.querySelector('input[name="payment_method"]:checked');
const remarkElement = document.getElementById('orderRemark');
if (!shippingMethodElement) {
showAlert('请选择配送方式', 'warning');
highlightSection('shipping');
return;
}
if (!paymentMethodElement) {
showAlert('请选择支付方式', 'warning');
highlightSection('payment');
return;
}
const shippingMethod = shippingMethodElement.value;
const paymentMethod = paymentMethodElement.value;
const remark = remarkElement ? remarkElement.value : '';
// 获取选中的购物车商品ID
const urlParams = new URLSearchParams(window.location.search);
const selectedItems = urlParams.getAll('items');
if (selectedItems.length === 0) {
showAlert('没有选中的商品', 'error');
return;
}
const orderData = {
selected_items: selectedItems,
address_id: selectedAddressId,
shipping_method: shippingMethod,
payment_method: paymentMethod,
remark: remark
};
// 显示加载状态
const submitBtn = document.querySelector('.btn-danger');
if (!submitBtn) {
showAlert('提交按钮未找到', 'error');
return;
}
const originalText = submitBtn.innerHTML;
submitBtn.innerHTML = ' 提交中...';
submitBtn.disabled = true;
submitBtn.classList.add('loading');
// 添加页面加载遮罩
showLoadingOverlay();
// 提交订单
fetch('/order/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(orderData)
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
hideLoadingOverlay();
if (data.success) {
showAlert('订单创建成功!正在跳转到支付页面...', 'success');
// 添加成功动画
submitBtn.innerHTML = ' 订单创建成功';
submitBtn.classList.add('btn-success');
submitBtn.classList.remove('btn-danger');
setTimeout(() => {
window.location.href = `/order/pay/${data.payment_sn}`;
}, 1500);
} else {
showAlert(data.message || '订单创建失败', 'error');
restoreSubmitButton(submitBtn, originalText);
}
})
.catch(error => {
console.error('提交订单错误:', error);
hideLoadingOverlay();
showAlert('提交订单失败,请重试', 'error');
restoreSubmitButton(submitBtn, originalText);
});
}
// 恢复提交按钮状态
function restoreSubmitButton(submitBtn, originalText) {
submitBtn.innerHTML = originalText;
submitBtn.disabled = false;
submitBtn.classList.remove('loading', 'btn-success');
submitBtn.classList.add('btn-danger');
}
// 高亮地址选择区域
function highlightAddressSection() {
const addressSection = document.querySelector('#addressList');
if (addressSection) {
addressSection.style.border = '2px solid #dc3545';
addressSection.style.borderRadius = '8px';
addressSection.scrollIntoView({ behavior: 'smooth', block: 'center' });
setTimeout(() => {
addressSection.style.border = '';
}, 3000);
}
}
// 高亮指定区域
function highlightSection(sectionType) {
let selector = '';
switch(sectionType) {
case 'shipping':
selector = 'input[name="shipping_method"]';
break;
case 'payment':
selector = 'input[name="payment_method"]';
break;
}
if (selector) {
const element = document.querySelector(selector);
if (element) {
const section = element.closest('.card');
if (section) {
section.style.border = '2px solid #dc3545';
section.scrollIntoView({ behavior: 'smooth', block: 'center' });
setTimeout(() => {
section.style.border = '';
}, 3000);
}
}
}
}
// 显示加载遮罩
function showLoadingOverlay() {
const overlay = document.createElement('div');
overlay.id = 'loadingOverlay';
overlay.className = 'position-fixed top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center';
overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';
overlay.style.zIndex = '9999';
overlay.innerHTML = `
加载中...
正在创建订单...
请稍候,不要关闭页面
`;
document.body.appendChild(overlay);
}
// 隐藏加载遮罩
function hideLoadingOverlay() {
const overlay = document.getElementById('loadingOverlay');
if (overlay) {
overlay.remove();
}
}
// 增强的提示函数
function showAlert(message, type = 'info') {
const alertClass = {
'success': 'alert-success',
'error': 'alert-danger',
'warning': 'alert-warning',
'info': 'alert-info'
}[type] || 'alert-info';
const icon = {
'success': 'bi-check-circle',
'error': 'bi-exclamation-triangle',
'warning': 'bi-exclamation-triangle',
'info': 'bi-info-circle'
}[type] || 'bi-info-circle';
const alertDiv = document.createElement('div');
alertDiv.className = `alert ${alertClass} alert-dismissible fade show position-fixed top-0 start-50 translate-middle-x mt-3`;
alertDiv.style.zIndex = '10000';
alertDiv.innerHTML = `
${message}
`;
document.body.appendChild(alertDiv);
// 5秒后自动移除
setTimeout(() => {
if (alertDiv.parentNode) {
alertDiv.remove();
}
}, 5000);
}