From cfa65ea872f5459012da76ead9aee3f9514a6b57 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 21 Jun 2025 11:06:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=AE=A2=E5=8D=95-?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/user.ts | 5 +++++ src/views/user/AlipayResult.vue | 38 +++++++++++++++++++++++++++++++++ src/views/user/Shopping.vue | 36 ++++++++++++++++++++----------- 3 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 src/views/user/AlipayResult.vue diff --git a/src/router/user.ts b/src/router/user.ts index 1b27d31..eb00440 100644 --- a/src/router/user.ts +++ b/src/router/user.ts @@ -51,6 +51,11 @@ const routes = [ }), }, { + path: '/alipay-result', + name: 'AlipayResult', + component: () => import('@/views/user/AlipayResult.vue') + }, + { path: 'shopping', name: 'Shopping', component: Shopping, diff --git a/src/views/user/AlipayResult.vue b/src/views/user/AlipayResult.vue new file mode 100644 index 0000000..2f178ad --- /dev/null +++ b/src/views/user/AlipayResult.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/views/user/Shopping.vue b/src/views/user/Shopping.vue index 3786400..2f991e0 100644 --- a/src/views/user/Shopping.vue +++ b/src/views/user/Shopping.vue @@ -2,7 +2,6 @@

总金额:¥{{ totalPrice.toFixed(2) }}

@@ -42,7 +41,7 @@ v-model="orderRemark" type="textarea" placeholder="请输入订单备注,如:不要香菜、少盐等" - rows="3" + :rows="3" /> @@ -94,20 +93,33 @@ watch(showPayDialog, (val) => { // 确认支付函数 const confirmPay = async () => { try { - const response = await axios.post('/api/alipay/pay', { - totalAmount: totalPrice.value, - items: cartItems.value + // 先调用已有的 createOrder 方法,生成订单 + const orderId = await createOrder() + if (!orderId) { + // 如果订单创建失败,不继续支付 + return + } + + // 发起支付宝支付请求 + const payResponse = await axios.post('/api/user/alipay/pay', { + outTradeNo: orderId, + subject: '顾客订单', + totalAmount: totalPrice.value.toFixed(2) }, { - responseType: 'blob' // 让后端返回的 HTML 可以被正确打开 + responseType: 'blob' }) - const blob = new Blob([response.data], { type: 'text/html' }) + // 打开支付宝支付页 + const blob = new Blob([payResponse.data], { type: 'text/html' }) const url = URL.createObjectURL(blob) window.open(url, '_blank') + + // 清空购物车、关闭弹窗 + cartStore.clearCart() showPayDialog.value = false } catch (error) { console.error('支付失败:', error) - ElMessage.error('支付请求失败') + ElMessage.error('支付失败,请稍后再试') } } @@ -141,12 +153,10 @@ const createOrder = async () => { } const response = await axios.post('/api/user/orders/create', orderRequest)//ok + const orderId = response.data.orderId + ElMessage.success('订单已生成,订单号:' + orderId) - ElMessage.success('订单已生成,订单号:' + response.data.orderId) - - // 可选:清空购物车、关闭支付弹窗 - cartStore.clearCart() - showPayDialog.value = false + return orderId } catch (error) { console.error('订单生成失败:', error) ElMessage.error('生成订单失败') From dd6888376d88eb144a5f937cbf5afc97395eca68 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 21 Jun 2025 11:59:21 +0800 Subject: [PATCH 2/2] =?UTF-8?q?excel=E6=96=87=E6=A1=A3=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/user/Shopping.vue | 2 +- src/views/user/SpendingChart.vue | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/views/user/Shopping.vue b/src/views/user/Shopping.vue index 2f991e0..5ebd93a 100644 --- a/src/views/user/Shopping.vue +++ b/src/views/user/Shopping.vue @@ -147,7 +147,7 @@ const createOrder = async () => { branchId: restaurantId, orderRemarks: orderRemark.value, orderMoney: totalPrice.value, - orderStatus: 0 + orderStatus: 1 }, items: orderItems } diff --git a/src/views/user/SpendingChart.vue b/src/views/user/SpendingChart.vue index 6c7f4b2..fce1331 100644 --- a/src/views/user/SpendingChart.vue +++ b/src/views/user/SpendingChart.vue @@ -4,6 +4,14 @@ + + 导出订单Excel + + { // 当选择店铺时重新渲染图表 watch(selectedBranch, renderChart) + +const downloadExcel = async () => { + try { + const response = await axios.get(`/api/user/orders/export/${customerId}`, { + responseType: 'blob' // 一定要是 blob,否则文件下载不了 + }) + + const blob = new Blob([response.data], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }) + const url = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + // 你可以自定义文件名,也可以从后端 header 获取 filename + link.setAttribute('download', `订单数据_${new Date().toISOString().slice(0,10)}.xlsx`) + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + window.URL.revokeObjectURL(url) + } catch (error) { + ElMessage.error('导出失败,请稍后再试') + } +} +