From 782910efbab6c590c4e2c795391560868cf51fe2 Mon Sep 17 00:00:00 2001 From: zhugaoliang Date: Tue, 8 Apr 2025 08:07:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E4=B8=94=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/main.cpython-311.pyc | Bin 20868 -> 25341 bytes backend/lottery.db | Bin 40960 -> 40960 bytes backend/main.py | 155 ++++++++++++++++++++--- frontend/src/services/api.ts | 36 +++++- frontend/src/views/Home.vue | 59 +++++++-- 5 files changed, 219 insertions(+), 31 deletions(-) diff --git a/backend/__pycache__/main.cpython-311.pyc b/backend/__pycache__/main.cpython-311.pyc index 6c18e5ff96fdb3760ca80255b60c0181e3cb8f1a..21a345685f8217bdbad336dc0b41c57fb8fd6295 100644 GIT binary patch delta 9430 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 Qq?$GKzqX$cwm>WX50@su@p~ku{>pvNNg&Cb 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 { - const response = await api.put('/shipping/update', { user_id: userId, address }); + // 确保userId为数字,address为字符串 + // 直接使用纯文本格式的JSON作为请求体 + const data = JSON.stringify({ + user_id: Number(userId), + address: String(address).trim() + }); + + console.log('发送地址更新数据:', data); + + const response = await api.post('/shipping/update', data, { + headers: { + 'Content-Type': 'application/json' + } + }); + + return response.data; + }, + + // 新的专门用于提交收货地址的接口 + submitAddress: async (userId: number, address: string) => { + // 确保userId为数字,address为字符串 + const data = JSON.stringify({ + user_id: Number(userId), + address: String(address).trim() + }); + + console.log('发送收货地址数据:', data); + + const response = await api.post('/users/address', data, { + headers: { + 'Content-Type': 'application/json' + } + }); + return response.data; }, }; diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index c09340d..8b403f1 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -39,10 +39,18 @@ const drawLottery = async () => { try { // If user is already created, use the API if (userData.value.id !== 0) { - const result = await lotteryAPI.drawLottery(userData.value.id) - userData.value.prize = result - ElMessage.success(`恭喜您抽中了${result.name}!`) - return result + const response = await lotteryAPI.drawLottery(userData.value.id) + console.log('抽奖结果原始数据:', response) + + // 从响应中提取奖品信息 + if (response.success && response.prize) { + userData.value.prize = response.prize + ElMessage.success(`恭喜您抽中了${response.prize.name}!`) + return response.prize + } else { + ElMessage.warning(response.message || '抽奖失败,请重试') + return null + } } // Otherwise use simulated logic for now @@ -108,7 +116,8 @@ const submitUserInfo = async () => { if (userData.value.id === 0) { // Create new user response = await userAPI.createUser(userInfo) - userData.value.id = response.id // Save user ID for future updates + userData.value.id = response.user_id // Save user ID for future updates + console.log('创建新用户返回信息:', response) } else { // Update existing user response = await userAPI.updateUser(userData.value.id, userInfo) @@ -122,26 +131,52 @@ const submitUserInfo = async () => { } } -// Submit shipping address +// Submit shipping address - 完全独立的收货地址提交函数 +// 现在这个函数不再依赖于用户信息提交成功的结果 +// 直接使用专门的收货地址提交接口 const submitShippingAddress = async () => { try { + console.log('准备提交收货地址new:', userData.value) + + // 验证用户ID if (userData.value.id === 0) { ElMessage.error('请先提交个人信息') currentPage.value = 4 return } - // Call API to update shipping address - await shippingAPI.updateShipping(userData.value.id, userData.value.address) + // 验证地址不为空并且是有效字符串 + if (!userData.value.address || userData.value.address.trim() === '') { + ElMessage.error('请输入有效的收货地址') + return + } - // If user has a prize, save it to the database + // 转换并验证用户ID + const userId = Number(userData.value.id); + if (!userId || isNaN(userId)) { + ElMessage.error('用户ID无效,请重新提交个人信息') + currentPage.value = 4 + return + } + + // 准备发送的数据 + const address = userData.value.address.trim() + console.log('即将提交收货地址:', { + user_id: userId, + address: address + }) + + // 使用新的专门接口提交收货地址 + await shippingAPI.submitAddress(userId, address) + + // 如果用户有奖品,将其保存到数据库 if (userData.value.prize) { - // Assuming we have a claimPrize API that takes user ID and prize ID - await cardAPI.claimPrize(userData.value.id) + // 先尝试领取奖品(如果还没领取) + await cardAPI.claimPrize(userId) } ElMessage.success('收货地址提交成功!奖品即将派送') - nextPage() + nextPage() // 进入确认页面 } catch (error) { ElMessage.error('提交失败,请重试') console.error('Submit shipping address error:', error)