feat(订单): 添加取消订单功能
实现订单取消功能,包括添加取消订单API接口和在订单管理页面添加取消操作按钮及确认弹窗
Showing
2 changed files
with
118 additions
and
25 deletions
| 1 | /* | 1 | /* |
| 2 | * @Date: 2025-07-03 17:21:45 | 2 | * @Date: 2025-07-03 17:21:45 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-07-14 09:34:58 | 4 | + * @LastEditTime: 2025-07-14 14:43:05 |
| 5 | * @FilePath: /jgdl/src/api/orders.js | 5 | * @FilePath: /jgdl/src/api/orders.js |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | */ | 7 | */ |
| ... | @@ -13,6 +13,7 @@ const Api = { | ... | @@ -13,6 +13,7 @@ const Api = { |
| 13 | CREATE_ORDER: '/srv/?a=order&t=add', | 13 | CREATE_ORDER: '/srv/?a=order&t=add', |
| 14 | REVIEW_ORDER: '/srv/?a=order&t=review', | 14 | REVIEW_ORDER: '/srv/?a=order&t=review', |
| 15 | DELETE_ORDER: '/srv/?a=order&t=del', | 15 | DELETE_ORDER: '/srv/?a=order&t=del', |
| 16 | + CANCEL_ORDER: '/srv/?a=order&t=cancel', | ||
| 16 | } | 17 | } |
| 17 | 18 | ||
| 18 | /** | 19 | /** |
| ... | @@ -55,3 +56,10 @@ export const reviewOrderAPI = (params) => fn(fetch.post(Api.REVIEW_ORDER, params | ... | @@ -55,3 +56,10 @@ export const reviewOrderAPI = (params) => fn(fetch.post(Api.REVIEW_ORDER, params |
| 55 | * @returns data{} | 56 | * @returns data{} |
| 56 | */ | 57 | */ |
| 57 | export const deleteOrderAPI = (params) => fn(fetch.post(Api.DELETE_ORDER, params)); | 58 | export const deleteOrderAPI = (params) => fn(fetch.post(Api.DELETE_ORDER, params)); |
| 59 | + | ||
| 60 | +/** | ||
| 61 | + * @description: 取消订单 | ||
| 62 | + * @param order_id 订单ID | ||
| 63 | + * @returns data{} | ||
| 64 | + */ | ||
| 65 | +export const cancelOrderAPI = (params) => fn(fetch.post(Api.CANCEL_ORDER, params)); | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2022-09-19 14:11:06 | 2 | * @Date: 2022-09-19 14:11:06 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-07-14 14:36:50 | 4 | + * @LastEditTime: 2025-07-14 14:51:17 |
| 5 | * @FilePath: /jgdl/src/pages/myOrders/index.vue | 5 | * @FilePath: /jgdl/src/pages/myOrders/index.vue |
| 6 | * @Description: 订单管理页面 | 6 | * @Description: 订单管理页面 |
| 7 | --> | 7 | --> |
| ... | @@ -81,7 +81,11 @@ | ... | @@ -81,7 +81,11 @@ |
| 81 | <view class="order-actions"> | 81 | <view class="order-actions"> |
| 82 | <!-- 买车模式:待支付状态 --> | 82 | <!-- 买车模式:待支付状态 --> |
| 83 | <template v-if="viewMode === 'buy' && order.status === 3"> | 83 | <template v-if="viewMode === 'buy' && order.status === 3"> |
| 84 | - <nut-button type="primary" size="small" @click="handlePayment(order)" color="orange"> | 84 | + <nut-button type="default" size="small" @click="handleCancelOrder(order.id)" |
| 85 | + :loading="cancelingOrderId === order.id" :disabled="cancelingOrderId === order.id"> | ||
| 86 | + {{ cancelingOrderId === order.id ? '取消中...' : '取消订单' }} | ||
| 87 | + </nut-button> | ||
| 88 | + <nut-button type="primary" size="small" @click="handlePayment(order)" color="orange" class="ml-2"> | ||
| 85 | 去支付 | 89 | 去支付 |
| 86 | </nut-button> | 90 | </nut-button> |
| 87 | </template> | 91 | </template> |
| ... | @@ -270,7 +274,7 @@ | ... | @@ -270,7 +274,7 @@ |
| 270 | </view> | 274 | </view> |
| 271 | </nut-popup> | 275 | </nut-popup> |
| 272 | 276 | ||
| 273 | - <!-- Confirmation Modal --> | 277 | + <!-- Delete Confirmation Modal --> |
| 274 | <nut-dialog | 278 | <nut-dialog |
| 275 | v-model:visible="showConfirmModal" | 279 | v-model:visible="showConfirmModal" |
| 276 | title="温馨提示" | 280 | title="温馨提示" |
| ... | @@ -285,6 +289,22 @@ | ... | @@ -285,6 +289,22 @@ |
| 285 | </view> | 289 | </view> |
| 286 | </template> | 290 | </template> |
| 287 | </nut-dialog> | 291 | </nut-dialog> |
| 292 | + | ||
| 293 | + <!-- Cancel Order Confirmation Modal --> | ||
| 294 | + <nut-dialog | ||
| 295 | + v-model:visible="showCancelConfirmModal" | ||
| 296 | + title="温馨提示" | ||
| 297 | + cancel-text="我再想想" | ||
| 298 | + ok-text="确定取消" | ||
| 299 | + @cancel="showCancelConfirmModal = false" | ||
| 300 | + @ok="performCancelOrder(pendingCancelOrderId)" | ||
| 301 | + > | ||
| 302 | + <template #default> | ||
| 303 | + <view> | ||
| 304 | + <text style="font-size: 1rem;">取消订单后将无法恢复,确定要取消吗?</text> | ||
| 305 | + </view> | ||
| 306 | + </template> | ||
| 307 | + </nut-dialog> | ||
| 288 | </view> | 308 | </view> |
| 289 | </template> | 309 | </template> |
| 290 | 310 | ||
| ... | @@ -295,7 +315,7 @@ import './index.less' | ... | @@ -295,7 +315,7 @@ import './index.less' |
| 295 | import { $ } from '@tarojs/extend' | 315 | import { $ } from '@tarojs/extend' |
| 296 | import payCard from '@/components/payCard.vue' | 316 | import payCard from '@/components/payCard.vue' |
| 297 | // 导入接口 | 317 | // 导入接口 |
| 298 | -import { getOrderListAPI, getOrderDetailAPI, reviewOrderAPI } from '@/api/orders' | 318 | +import { getOrderListAPI, getOrderDetailAPI, reviewOrderAPI, cancelOrderAPI, deleteOrderAPI } from '@/api/orders' |
| 299 | import { DEFAULT_COVER_IMG } from '@/utils/config' | 319 | import { DEFAULT_COVER_IMG } from '@/utils/config' |
| 300 | 320 | ||
| 301 | const scrollStyle = ref({ | 321 | const scrollStyle = ref({ |
| ... | @@ -683,6 +703,9 @@ const submitRate = async () => { | ... | @@ -683,6 +703,9 @@ const submitRate = async () => { |
| 683 | } | 703 | } |
| 684 | } | 704 | } |
| 685 | 705 | ||
| 706 | +// 取消订单相关状态 | ||
| 707 | +const cancelingOrderId = ref('') | ||
| 708 | + | ||
| 686 | // 删除订单相关状态 | 709 | // 删除订单相关状态 |
| 687 | const deletingOrderId = ref('') | 710 | const deletingOrderId = ref('') |
| 688 | 711 | ||
| ... | @@ -697,6 +720,80 @@ const showConfirmModal = ref(false) | ... | @@ -697,6 +720,80 @@ const showConfirmModal = ref(false) |
| 697 | const pendingDeleteOrderId = ref('') | 720 | const pendingDeleteOrderId = ref('') |
| 698 | 721 | ||
| 699 | /** | 722 | /** |
| 723 | + * 取消订单确认弹窗显示状态 | ||
| 724 | + */ | ||
| 725 | +const showCancelConfirmModal = ref(false) | ||
| 726 | + | ||
| 727 | +/** | ||
| 728 | + * 待取消的订单ID | ||
| 729 | + */ | ||
| 730 | +const pendingCancelOrderId = ref('') | ||
| 731 | + | ||
| 732 | +/** | ||
| 733 | + * 取消订单 | ||
| 734 | + * @param {string} orderId - 订单ID | ||
| 735 | + */ | ||
| 736 | +const handleCancelOrder = async (orderId) => { | ||
| 737 | + try { | ||
| 738 | + // 保存待取消的订单ID | ||
| 739 | + pendingCancelOrderId.value = orderId | ||
| 740 | + showCancelConfirmModal.value = true | ||
| 741 | + } catch (error) { | ||
| 742 | + // 用户取消操作或其他错误 | ||
| 743 | + // console.log('取消订单操作被取消或出错:', error) | ||
| 744 | + } | ||
| 745 | +} | ||
| 746 | + | ||
| 747 | +/** | ||
| 748 | + * 执行取消订单操作 | ||
| 749 | + * @param {string} orderId - 订单ID | ||
| 750 | + */ | ||
| 751 | +const performCancelOrder = async (orderId) => { | ||
| 752 | + // 关闭确认弹窗 | ||
| 753 | + showCancelConfirmModal.value = false | ||
| 754 | + | ||
| 755 | + // 设置取消状态,用于显示加载效果 | ||
| 756 | + cancelingOrderId.value = orderId | ||
| 757 | + | ||
| 758 | + try { | ||
| 759 | + // 调用取消订单API | ||
| 760 | + const response = await cancelOrderAPI({ id: orderId }) | ||
| 761 | + | ||
| 762 | + if (response.code) { | ||
| 763 | + // API取消成功后的处理 | ||
| 764 | + const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders | ||
| 765 | + const order = orders.value.find(o => o.id === orderId) | ||
| 766 | + | ||
| 767 | + if (order) { | ||
| 768 | + // 更新订单状态为已取消 | ||
| 769 | + order.status = 7 | ||
| 770 | + | ||
| 771 | + Taro.showToast({ | ||
| 772 | + title: '订单已取消', | ||
| 773 | + icon: 'success', | ||
| 774 | + duration: 2000 | ||
| 775 | + }) | ||
| 776 | + } | ||
| 777 | + } else { | ||
| 778 | + throw new Error(response.message || '取消失败') | ||
| 779 | + } | ||
| 780 | + } catch (error) { | ||
| 781 | + // console.error('取消订单失败:', error) | ||
| 782 | + | ||
| 783 | + Taro.showToast({ | ||
| 784 | + title: error.message || '取消订单失败,请重试', | ||
| 785 | + icon: 'error', | ||
| 786 | + duration: 2000 | ||
| 787 | + }) | ||
| 788 | + } finally { | ||
| 789 | + // 清除取消状态 | ||
| 790 | + cancelingOrderId.value = '' | ||
| 791 | + // 清除待取消订单ID | ||
| 792 | + pendingCancelOrderId.value = '' | ||
| 793 | + } | ||
| 794 | +} | ||
| 795 | + | ||
| 796 | +/** | ||
| 700 | * 删除订单 | 797 | * 删除订单 |
| 701 | * @param {string} orderId - 订单ID | 798 | * @param {string} orderId - 订单ID |
| 702 | */ | 799 | */ |
| ... | @@ -723,24 +820,11 @@ const performDeleteOrder = async (orderId) => { | ... | @@ -723,24 +820,11 @@ const performDeleteOrder = async (orderId) => { |
| 723 | deletingOrderId.value = orderId | 820 | deletingOrderId.value = orderId |
| 724 | 821 | ||
| 725 | try { | 822 | try { |
| 726 | - // 真实的API调用(当前注释掉,使用模拟数据) | 823 | + // 调用删除订单API |
| 727 | - // const response = await deleteOrderAPI({ orderId }) | 824 | + const response = await deleteOrderAPI({ id: orderId }) |
| 728 | - // if (response.code) { | 825 | + |
| 729 | - // // API删除成功后的处理 | 826 | + if (response.code) { |
| 730 | - // const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders | 827 | + // API删除成功后的处理 |
| 731 | - // const orderIndex = orders.value.findIndex(order => order.id === orderId) | ||
| 732 | - // if (orderIndex !== -1) { | ||
| 733 | - // orders.value.splice(orderIndex, 1) | ||
| 734 | - // } | ||
| 735 | - // Toast.success(response.message || '订单删除成功') | ||
| 736 | - // } else { | ||
| 737 | - // throw new Error(response.message || '删除失败') | ||
| 738 | - // } | ||
| 739 | - | ||
| 740 | - // 模拟API调用延迟(开发阶段使用) | ||
| 741 | - await new Promise(resolve => setTimeout(resolve, 1000)) | ||
| 742 | - | ||
| 743 | - // 从本地数据中移除订单 | ||
| 744 | const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders | 828 | const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders |
| 745 | const orderIndex = orders.value.findIndex(order => order.id === orderId) | 829 | const orderIndex = orders.value.findIndex(order => order.id === orderId) |
| 746 | 830 | ||
| ... | @@ -748,12 +832,13 @@ const performDeleteOrder = async (orderId) => { | ... | @@ -748,12 +832,13 @@ const performDeleteOrder = async (orderId) => { |
| 748 | orders.value.splice(orderIndex, 1) | 832 | orders.value.splice(orderIndex, 1) |
| 749 | 833 | ||
| 750 | Taro.showToast({ | 834 | Taro.showToast({ |
| 751 | - title: '订单删除成功', | 835 | + title: response.message || '订单删除成功', |
| 752 | icon: 'success', | 836 | icon: 'success', |
| 753 | duration: 2000 | 837 | duration: 2000 |
| 754 | }) | 838 | }) |
| 839 | + } | ||
| 755 | } else { | 840 | } else { |
| 756 | - throw new Error('订单不存在') | 841 | + throw new Error(response.message || '删除失败') |
| 757 | } | 842 | } |
| 758 | 843 | ||
| 759 | } catch (error) { | 844 | } catch (error) { | ... | ... |
-
Please register or login to post a comment