diff --git a/tourism-server/src/main/java/com/tourism/order/service/impl/ProductOrderServiceImpl.java b/tourism-server/src/main/java/com/tourism/order/service/impl/ProductOrderServiceImpl.java index be80932..07c2fc6 100644 --- a/tourism-server/src/main/java/com/tourism/order/service/impl/ProductOrderServiceImpl.java +++ b/tourism-server/src/main/java/com/tourism/order/service/impl/ProductOrderServiceImpl.java @@ -242,7 +242,9 @@ public class ProductOrderServiceImpl extends ServiceImpl result = baseMapper.selectPage(page, wrapper).convert(this::convertToVO); + result.getRecords().forEach(vo -> vo.setItems(getOrderItems(vo.getId()))); + return result; } // ========== 私有方法 ========== diff --git a/tourism-web/src/api/index.ts b/tourism-web/src/api/index.ts index 7f49167..21e758d 100644 --- a/tourism-web/src/api/index.ts +++ b/tourism-web/src/api/index.ts @@ -19,6 +19,11 @@ http.interceptors.request.use((config) => { http.interceptors.response.use( (response: AxiosResponse) => { const res = response.data + if (res.code === 401) { + localStorage.removeItem('token') + window.location.href = '/user/login' + return Promise.reject(new Error(res.msg || '未登录')) + } if (res.code !== 200) { ElMessage.error(res.msg || '请求失败') return Promise.reject(new Error(res.msg)) diff --git a/tourism-web/src/api/order.ts b/tourism-web/src/api/order.ts index 9c6dcd6..e21abd9 100644 --- a/tourism-web/src/api/order.ts +++ b/tourism-web/src/api/order.ts @@ -46,3 +46,50 @@ export function cancelAttractionOrder(data: { id: number; cancelReason?: string export function getMyAttractionOrders(params: { current?: number; size?: number; status?: number }) { return http.get<{ records: AttractionOrder[]; total: number }>('/order/attraction/my', { params }) } + +export interface ProductOrderItem { + id: number + productId: number + productName: string + skuId: number + skuName: string + quantity: number + unitPrice: number + totalPrice: number +} + +export interface ProductOrder { + id: number + orderNo: string + totalQuantity: number + totalPrice: number + actualAmount: number + consignee: string + phone: string + province: string + city: string + district: string + detailAddress: string + status: number + statusText: string + createTime: string + deliveryTime: string + receiveTime: string + items: ProductOrderItem[] +} + +export function getMyProductOrders(params: { current?: number; size?: number; status?: number }) { + return http.get<{ records: ProductOrder[]; total: number }>('/order/product/my', { params }) +} + +export function payProductOrder(id: number) { + return http.put(`/order/product/${id}/pay`) +} + +export function cancelProductOrder(data: { id: number; cancelReason?: string }) { + return http.put('/order/product/cancel', data) +} + +export function receiveProductOrder(id: number) { + return http.put(`/order/product/${id}/receive`) +} diff --git a/tourism-web/src/router/index.ts b/tourism-web/src/router/index.ts index ff2b40f..6a7e1eb 100644 --- a/tourism-web/src/router/index.ts +++ b/tourism-web/src/router/index.ts @@ -78,12 +78,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/views/user/AddressView.vue'), meta: { title: '地址管理' }, }, - { - path: 'order', - name: 'OrderList', - component: () => import('@/views/order/OrderList.vue'), - meta: { title: '我的订单' }, - }, { path: 'cart', name: 'Cart', diff --git a/tourism-web/src/views/order/OrderConfirm.vue b/tourism-web/src/views/order/OrderConfirm.vue index 8f3d9af..caaaa0f 100644 --- a/tourism-web/src/views/order/OrderConfirm.vue +++ b/tourism-web/src/views/order/OrderConfirm.vue @@ -192,7 +192,7 @@ function submitOrder() { } ElMessage.success('下单成功') cartStore.clear() - setTimeout(() => { router.push('/user/order') }, 1000) + setTimeout(() => { router.push('/user/profile?orders=product') }, 1000) } diff --git a/tourism-web/src/views/order/OrderList.vue b/tourism-web/src/views/order/OrderList.vue deleted file mode 100644 index 11b8c5d..0000000 --- a/tourism-web/src/views/order/OrderList.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - - - diff --git a/tourism-web/src/views/payment/PaymentView.vue b/tourism-web/src/views/payment/PaymentView.vue index 52f3813..85e6102 100644 --- a/tourism-web/src/views/payment/PaymentView.vue +++ b/tourism-web/src/views/payment/PaymentView.vue @@ -36,7 +36,7 @@ import { ref, computed } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ElMessage } from 'element-plus' -import { payAttractionOrder } from '@/api/order' +import { payAttractionOrder, payProductOrder } from '@/api/order' const route = useRoute() const router = useRouter() @@ -60,9 +60,14 @@ async function handlePay() { for (const id of orderIds.value) { await payAttractionOrder(id) } + } else if (orderType.value === 'product' && orderIds.value.length > 0) { + for (const id of orderIds.value) { + await payProductOrder(id) + } } ElMessage.success('支付成功(沙箱环境)') - setTimeout(() => { router.push('/user/order') }, 1000) + const target = orderType.value === 'product' ? '/user/profile?orders=product' : '/user/profile?orders=attraction' + setTimeout(() => { router.push(target) }, 1000) } catch { // 错误提示由 axios 拦截器统一处理 } finally { diff --git a/tourism-web/src/views/user/OrderPanel.vue b/tourism-web/src/views/user/OrderPanel.vue new file mode 100644 index 0000000..6efe883 --- /dev/null +++ b/tourism-web/src/views/user/OrderPanel.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/tourism-web/src/views/user/ProfileView.vue b/tourism-web/src/views/user/ProfileView.vue index 8d2a40c..ce0da7c 100644 --- a/tourism-web/src/views/user/ProfileView.vue +++ b/tourism-web/src/views/user/ProfileView.vue @@ -34,7 +34,7 @@
+ +
+
+

景点门票订单

+ 查询你的门票订单 +
+ +
+ +
+
+

商品订单

+ 查询你的商品订单 +
+ +
@@ -134,12 +150,14 @@