From 3e0a1a2d4b6703a104598bb0f145364af46c43d0 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 10 Jun 2026 16:21:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=B9=B6=E4=BC=98=E5=8C=96=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=92=8C=E7=94=A8=E6=88=B7=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/migrations/000001_init.sql | 14 +- .../000002_finance_query_indexes.sql | 20 -- frontend/src/features/orders/api/orders.ts | 4 +- .../orders/views/MobileOrdersView.vue | 3 +- .../src/features/orders/views/OrdersView.vue | 32 +++- frontend/src/layouts/AppLayout.vue | 176 +++++++++++------- 6 files changed, 149 insertions(+), 100 deletions(-) delete mode 100644 backend/migrations/000002_finance_query_indexes.sql diff --git a/backend/migrations/000001_init.sql b/backend/migrations/000001_init.sql index ec47c5c..e2fc641 100644 --- a/backend/migrations/000001_init.sql +++ b/backend/migrations/000001_init.sql @@ -143,7 +143,9 @@ CREATE TABLE IF NOT EXISTS rental_orders ( KEY idx_rental_orders_refund_status (refund_status), KEY idx_rental_orders_rented_at (status, rented_at), KEY idx_rental_orders_status_created_at (status, created_at DESC), - KEY idx_rental_orders_settlement (settlement_status, owner_id, created_at) + KEY idx_rental_orders_settlement (settlement_status, owner_id, created_at), + KEY idx_rental_orders_settled_at_id (settled_at, id), + KEY idx_rental_orders_created_at_id (created_at, id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租号订单表'; -- 订单结算记录表:记录租用完成后的结算信息 @@ -171,7 +173,8 @@ CREATE TABLE IF NOT EXISTS order_checkouts ( created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_order_checkouts_order_id (order_id), - KEY idx_order_checkouts_status (status) + KEY idx_order_checkouts_status (status), + KEY idx_order_checkouts_status_order_id_id (status, order_id, id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单结算记录表'; -- 账号交接记录表:记录号主和租客之间的账号交接 @@ -223,7 +226,8 @@ CREATE TABLE IF NOT EXISTS wallet_ledger ( KEY idx_wallet_ledger_user_created (user_id, created_at), KEY idx_wallet_ledger_order_id (order_id), KEY idx_wallet_ledger_biz (biz_type, biz_no), - KEY idx_wallet_ledger_user_biz_created (user_id, biz_type, created_at DESC) + KEY idx_wallet_ledger_user_biz_created (user_id, biz_type, created_at DESC), + KEY idx_wallet_ledger_order_direction_biz (order_id, direction, biz_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包流水表'; -- ------------------------------------------- @@ -262,7 +266,9 @@ CREATE TABLE IF NOT EXISTS payment_orders ( KEY idx_payment_orders_user_id (user_id), KEY idx_payment_orders_provider_order_id (provider_order_id), KEY idx_payment_orders_biz_type (biz_type), - KEY idx_payment_orders_status (status) + KEY idx_payment_orders_status (status), + KEY idx_payment_orders_order_biz_status (order_id, biz_type, status), + KEY idx_payment_orders_created_biz_status (created_at, biz_type, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付订单表'; -- 支付商户配置表:支持多商户、多渠道支付配置 diff --git a/backend/migrations/000002_finance_query_indexes.sql b/backend/migrations/000002_finance_query_indexes.sql deleted file mode 100644 index 3894e01..0000000 --- a/backend/migrations/000002_finance_query_indexes.sql +++ /dev/null @@ -1,20 +0,0 @@ --- 为后台财务汇总、明细查询和退款统计补充复合索引。 --- 该迁移按版本只执行一次;若手工执行,请先确认索引不存在。 - -ALTER TABLE rental_orders - ADD INDEX idx_rental_orders_settled_at_id (settled_at, id); - -ALTER TABLE rental_orders - ADD INDEX idx_rental_orders_created_at_id (created_at, id); - -ALTER TABLE order_checkouts - ADD INDEX idx_order_checkouts_status_order_id_id (status, order_id, id); - -ALTER TABLE payment_orders - ADD INDEX idx_payment_orders_order_biz_status (order_id, biz_type, status); - -ALTER TABLE payment_orders - ADD INDEX idx_payment_orders_created_biz_status (created_at, biz_type, status); - -ALTER TABLE wallet_ledger - ADD INDEX idx_wallet_ledger_order_direction_biz (order_id, direction, biz_type); diff --git a/frontend/src/features/orders/api/orders.ts b/frontend/src/features/orders/api/orders.ts index a4fb4a8..d36ab3d 100644 --- a/frontend/src/features/orders/api/orders.ts +++ b/frontend/src/features/orders/api/orders.ts @@ -165,8 +165,8 @@ export async function fetchPostRentalNotice() { } export async function fetchOrders() { - const { data } = await apiClient.get>('/orders') - return data.data + const { data } = await apiClient.get>('/orders') + return Array.isArray(data.data?.items) ? data.data.items : [] } export async function fetchOrder(id: string | number) { diff --git a/frontend/src/features/orders/views/MobileOrdersView.vue b/frontend/src/features/orders/views/MobileOrdersView.vue index 908d4cb..fd4bbf3 100644 --- a/frontend/src/features/orders/views/MobileOrdersView.vue +++ b/frontend/src/features/orders/views/MobileOrdersView.vue @@ -34,7 +34,8 @@ onMounted(() => { async function loadOrders() { loading.value = true try { - orders.value = await fetchOrders() + const items = await fetchOrders() + orders.value = Array.isArray(items) ? items : [] } catch { showToast({ message: '订单加载失败,请稍后重试', icon: 'warning-o' }) } finally { diff --git a/frontend/src/features/orders/views/OrdersView.vue b/frontend/src/features/orders/views/OrdersView.vue index c2046eb..a5e130f 100644 --- a/frontend/src/features/orders/views/OrdersView.vue +++ b/frontend/src/features/orders/views/OrdersView.vue @@ -42,11 +42,11 @@ const displayOrders = computed(() => { const keyword = searchKeyword.value.trim().toLowerCase() filtered = filtered.filter( order => - order.order_no.toLowerCase().includes(keyword) || + textValue(order.order_no).toLowerCase().includes(keyword) || formatListingCode(order).toLowerCase().includes(keyword) || String(order.listing_id).includes(keyword) || String(order.account_id).includes(keyword) || - order.title.toLowerCase().includes(keyword) + textValue(order.title).toLowerCase().includes(keyword) ) } @@ -85,7 +85,8 @@ function handleTabChange(tab: string | number) { async function loadOrders() { loading.value = true try { - orders.value = await fetchOrders() + const items = await fetchOrders() + orders.value = Array.isArray(items) ? items : [] } finally { loading.value = false } @@ -143,14 +144,29 @@ function money(value: unknown) { return formatMoney(Number(value || 0)) } -function shortenOrderNo(orderNo: string) { - if (orderNo.length <= 20) return orderNo - return `${orderNo.slice(0, 12)}...${orderNo.slice(-6)}` +function textValue(value: unknown) { + return typeof value === 'string' ? value : '' } -async function copyOrderNo(orderNo: string) { +function orderNoText(orderNo: unknown) { + return textValue(orderNo) || '订单号未生成' +} + +function shortenOrderNo(orderNo: unknown) { + const value = orderNoText(orderNo) + if (value === '订单号未生成') return value + if (value.length <= 20) return value + return `${value.slice(0, 12)}...${value.slice(-6)}` +} + +async function copyOrderNo(orderNo: unknown) { + const value = textValue(orderNo) + if (!value) { + ElMessage.warning('订单号未生成,暂无法复制') + return + } try { - await navigator.clipboard.writeText(orderNo) + await navigator.clipboard.writeText(value) ElMessage.success('订单号已复制') } catch { ElMessage.error('复制失败') diff --git a/frontend/src/layouts/AppLayout.vue b/frontend/src/layouts/AppLayout.vue index ecaeb73..3ba2f55 100644 --- a/frontend/src/layouts/AppLayout.vue +++ b/frontend/src/layouts/AppLayout.vue @@ -12,7 +12,6 @@ import { EditPen, Finished, House, - InfoFilled, Search, Service, Shop, @@ -201,45 +200,43 @@ async function handleSupportClick() {
- - - 个人资料 - - - - 我的订单 - - - - 我的钱包 - - - - 发布账号 - - - - 实名认证 - - {{ realnameBadge.text }} - - - - - 租后须知 - +