增加前端格式检查配置

This commit is contained in:
yml2213
2026-06-08 06:40:33 +08:00
parent 79ea3a476c
commit 500f511185
150 changed files with 7254 additions and 4013 deletions
@@ -1,139 +1,143 @@
<script setup lang="ts">
import { onMounted, ref, computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { showDialog, showToast } from "vant";
import MobileBottomNav from "@/components/MobileBottomNav.vue";
import { onMounted, ref, computed } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { showDialog, showToast } from 'vant'
import MobileBottomNav from '@/components/MobileBottomNav.vue'
import { fetchOrders, startOrderPayment, type Order, type PaymentOrder } from "@/features/orders/api/orders";
import { useSessionStore } from "@/stores/session";
import { formatDateMinute } from "@/utils/time";
import {
fetchOrders,
startOrderPayment,
type Order,
type PaymentOrder,
} from '@/features/orders/api/orders'
import { useSessionStore } from '@/stores/session'
import { formatDateMinute } from '@/utils/time'
const router = useRouter();
const route = useRoute();
const session = useSessionStore();
const loading = ref(false);
const orders = ref<Order[]>([]);
const activeTab = ref("all");
const payingOrderId = ref<number | null>(null);
const router = useRouter()
const route = useRoute()
const session = useSessionStore()
const loading = ref(false)
const orders = ref<Order[]>([])
const activeTab = ref('all')
const payingOrderId = ref<number | null>(null)
onMounted(() => {
loadOrders();
loadOrders()
if (route.query.tab) {
activeTab.value = String(route.query.tab);
activeTab.value = String(route.query.tab)
}
});
})
async function loadOrders() {
loading.value = true;
loading.value = true
try {
orders.value = await fetchOrders();
orders.value = await fetchOrders()
} catch {
showToast({ message: "订单加载失败,请稍后重试", icon: "warning-o" });
showToast({ message: '订单加载失败,请稍后重试', icon: 'warning-o' })
} finally {
loading.value = false;
loading.value = false
}
}
/* 状态筛选 */
const statusTabs = [
{ key: "all", label: "全部" },
{ key: "pending_payment", label: "待支付" },
{ key: "pending_handoff", label: "待交接" },
{ key: "renting", label: "使用中" },
{ key: "pending_checkout_confirm", label: "待结账" },
{ key: "completed", label: "已完成" },
];
{ key: 'all', label: '全部' },
{ key: 'pending_payment', label: '待支付' },
{ key: 'pending_handoff', label: '待交接' },
{ key: 'renting', label: '使用中' },
{ key: 'pending_checkout_confirm', label: '待结账' },
{ key: 'completed', label: '已完成' },
]
const displayOrders = computed(() => {
if (activeTab.value === "all") return orders.value;
return orders.value.filter((o) => o.status === activeTab.value);
});
if (activeTab.value === 'all') return orders.value
return orders.value.filter(o => o.status === activeTab.value)
})
function statusLabel(status: string) {
const map: Record<string, string> = {
pending_payment: "待支付",
pending_handoff: "待交接",
renting: "使用中",
overdue: "已逾期",
pending_return_confirm: "待结账",
pending_checkout_confirm: "待号主确认",
pending_checkout_accept: "待租客确认",
checkout_disputing: "结账争议中",
completed: "已完成",
cancelled: "已取消",
disputing: "申诉中",
abnormal: "异常",
closed: "已关闭",
};
return map[status] || status;
pending_payment: '待支付',
pending_handoff: '待交接',
renting: '使用中',
overdue: '已逾期',
pending_return_confirm: '待结账',
pending_checkout_confirm: '待号主确认',
pending_checkout_accept: '待租客确认',
checkout_disputing: '结账争议中',
completed: '已完成',
cancelled: '已取消',
disputing: '申诉中',
abnormal: '异常',
closed: '已关闭',
}
return map[status] || status
}
function goDetail(id: number) {
router.push(`/m/orders/${id}`);
router.push(`/m/orders/${id}`)
}
async function handlePay(order: Order) {
payingOrderId.value = order.id;
payingOrderId.value = order.id
try {
const payment = await startOrderPayment(order.id);
const payment = await startOrderPayment(order.id)
if (payment.paid) {
showToast({ message: "支付成功,等待号主交接", icon: "passed" });
await loadOrders();
showToast({ message: '支付成功,等待号主交接', icon: 'passed' })
await loadOrders()
} else {
openPaymentCashier(payment);
openPaymentCashier(payment)
}
} catch (error) {
showToast({ message: readError(error, "支付失败"), icon: "cross" });
showToast({ message: readError(error, '支付失败'), icon: 'cross' })
} finally {
payingOrderId.value = null;
payingOrderId.value = null
}
}
function openPaymentCashier(payment: PaymentOrder) {
const payURL = payment.jspay_url || payment.td_code || payment.jspay_info || "";
const payURL = payment.jspay_url || payment.td_code || payment.jspay_info || ''
if (payURL && /^https?:\/\//i.test(payURL)) {
window.location.href = payURL;
return;
window.location.href = payURL
return
}
showDialog({
title: "订单支付",
message: payURL || "支付单已创建,请在订单详情页刷新支付状态。",
confirmButtonText: "查看详情",
title: '订单支付',
message: payURL || '支付单已创建,请在订单详情页刷新支付状态。',
confirmButtonText: '查看详情',
}).then(() => {
router.push(`/m/orders/${payment.order_id}`);
});
router.push(`/m/orders/${payment.order_id}`)
})
}
function readError(error: unknown, fallback: string) {
if (typeof error === "object" && error && "response" in error) {
const response = (error as { response?: { data?: { message?: string } } })
.response;
return response?.data?.message || fallback;
if (typeof error === 'object' && error && 'response' in error) {
const response = (error as { response?: { data?: { message?: string } } }).response
return response?.data?.message || fallback
}
return fallback;
return fallback
}
function money(value: unknown) {
return Math.round(Number(value || 0));
return Math.round(Number(value || 0))
}
function isOwner(order: Order) {
return order.owner_id === session.userId;
return order.owner_id === session.userId
}
function amountLabel(order: Order) {
return isOwner(order) ? "预计租金" : "支付租金";
return isOwner(order) ? '预计租金' : '支付租金'
}
function orderRentAmount(order: Order) {
if (isOwner(order)) return Number(order.owner_rent_amount ?? order.display_amount ?? 0);
return Number(order.rent_amount ?? order.display_amount ?? 0);
if (isOwner(order)) return Number(order.owner_rent_amount ?? order.display_amount ?? 0)
return Number(order.rent_amount ?? order.display_amount ?? 0)
}
function ownerActualIncome(order: Order) {
if (!isOwner(order)) return null;
const value = order.checkout?.owner_income_amount;
return typeof value === "number" ? value : null;
if (!isOwner(order)) return null
const value = order.checkout?.owner_income_amount
return typeof value === 'number' ? value : null
}
</script>
@@ -161,12 +165,7 @@ function ownerActualIncome(order: Order) {
swipeable
animated
>
<van-tab
v-for="tab in statusTabs"
:key="tab.key"
:title="tab.label"
:name="tab.key"
/>
<van-tab v-for="tab in statusTabs" :key="tab.key" :title="tab.label" :name="tab.key" />
</van-tabs>
<!-- 订单列表 -->
@@ -203,12 +202,14 @@ function ownerActualIncome(order: Order) {
<span class="info-tag">{{ order.server_region }}</span>
<span class="info-tag">{{ order.login_platform }}</span>
</div>
<div class="price-row">
<div class="price-item">
<span class="price-label">{{ amountLabel(order) }}</span>
<span class="price-val">¥{{ money(orderRentAmount(order)) }}</span>
<span v-if="ownerActualIncome(order) !== null" class="price-sub">实际到手 ¥{{ money(ownerActualIncome(order)) }}</span>
<span v-if="ownerActualIncome(order) !== null" class="price-sub"
>实际到手 ¥{{ money(ownerActualIncome(order)) }}</span
>
</div>
<div class="price-item">
<span class="price-label">押金金额</span>
@@ -235,9 +236,7 @@ function ownerActualIncome(order: Order) {
>
去支付
</van-button>
<span v-else class="detail-link">
查看详情 <van-icon name="arrow" :size="10" />
</span>
<span v-else class="detail-link"> 查看详情 <van-icon name="arrow" :size="10" /> </span>
</div>
</div>
</div>
@@ -334,8 +333,12 @@ function ownerActualIncome(order: Order) {
border-radius: 16px;
margin-bottom: 14px;
padding: 16px;
box-shadow: 0 4px 18px rgba(0, 0, 0, 0.02), 0 1px 4px rgba(0, 0, 0, 0.02);
transition: transform 0.1s ease, box-shadow 0.1s ease;
box-shadow:
0 4px 18px rgba(0, 0, 0, 0.02),
0 1px 4px rgba(0, 0, 0, 0.02);
transition:
transform 0.1s ease,
box-shadow 0.1s ease;
border: 1px solid rgba(243, 244, 246, 0.9);
cursor: pointer;
}
@@ -368,19 +371,58 @@ function ownerActualIncome(order: Order) {
}
/* 状态徽章颜色 - 现代轻量化配色 */
.badge-pending_payment { color: #ff6a00; background: rgba(255, 106, 0, 0.08); }
.badge-pending_handoff { color: #d97706; background: rgba(217, 119, 6, 0.08); }
.badge-renting { color: #1477ff; background: rgba(20, 119, 255, 0.08); }
.badge-overdue { color: #ef4444; background: rgba(239, 68, 68, 0.08); }
.badge-pending_return_confirm { color: #8b5cf6; background: rgba(139, 92, 246, 0.08); }
.badge-pending_checkout_confirm { color: #8b5cf6; background: rgba(139, 92, 246, 0.08); }
.badge-pending_checkout_accept { color: #a855f7; background: rgba(168, 85, 247, 0.08); }
.badge-checkout_disputing { color: #ef4444; background: rgba(239, 68, 68, 0.08); }
.badge-completed { color: #10b981; background: rgba(16, 185, 129, 0.08); }
.badge-cancelled { color: #9ca3af; background: rgba(156, 163, 175, 0.08); }
.badge-disputing { color: #ef4444; background: rgba(239, 68, 68, 0.08); }
.badge-abnormal { color: #ef4444; background: rgba(239, 68, 68, 0.08); }
.badge-closed { color: #6b7280; background: rgba(107, 114, 128, 0.08); }
.badge-pending_payment {
color: #ff6a00;
background: rgba(255, 106, 0, 0.08);
}
.badge-pending_handoff {
color: #d97706;
background: rgba(217, 119, 6, 0.08);
}
.badge-renting {
color: #1477ff;
background: rgba(20, 119, 255, 0.08);
}
.badge-overdue {
color: #ef4444;
background: rgba(239, 68, 68, 0.08);
}
.badge-pending_return_confirm {
color: #8b5cf6;
background: rgba(139, 92, 246, 0.08);
}
.badge-pending_checkout_confirm {
color: #8b5cf6;
background: rgba(139, 92, 246, 0.08);
}
.badge-pending_checkout_accept {
color: #a855f7;
background: rgba(168, 85, 247, 0.08);
}
.badge-checkout_disputing {
color: #ef4444;
background: rgba(239, 68, 68, 0.08);
}
.badge-completed {
color: #10b981;
background: rgba(16, 185, 129, 0.08);
}
.badge-cancelled {
color: #9ca3af;
background: rgba(156, 163, 175, 0.08);
}
.badge-disputing {
color: #ef4444;
background: rgba(239, 68, 68, 0.08);
}
.badge-abnormal {
color: #ef4444;
background: rgba(239, 68, 68, 0.08);
}
.badge-closed {
color: #6b7280;
background: rgba(107, 114, 128, 0.08);
}
.card-body {
padding: 12px 0 0;