fix: resolve frontend build error and order refund bug, add member price filter

This commit is contained in:
2026-01-07 21:49:04 +08:00
parent 5b45f7d5c4
commit a1de16bc01
18 changed files with 772 additions and 282 deletions

View File

@@ -24,7 +24,7 @@
</div>
<div class="ml-auto relative w-64">
<i class="pi pi-search absolute left-3 top-1/2 -translate-y-1/2 text-slate-400"></i>
<input type="text" placeholder="搜索订单号或买家..."
<input type="text" v-model="searchKeyword" @keyup.enter="fetchOrders" placeholder="搜索订单号或买家..."
class="w-full h-9 pl-9 pr-4 rounded border border-slate-200 text-sm focus:border-primary-500 outline-none transition-all" />
</div>
</div>
@@ -165,7 +165,7 @@
</label>
</div>
<div v-if="refundAction === 'reject'" class="mt-4">
<textarea class="w-full p-2 border border-slate-200 rounded text-sm focus:border-red-500 outline-none"
<textarea v-model="refundReason" class="w-full p-2 border border-slate-200 rounded text-sm focus:border-red-500 outline-none"
rows="2" placeholder="请输入拒绝理由..."></textarea>
</div>
<template #footer>
@@ -188,51 +188,54 @@ import Dialog from "primevue/dialog";
import RadioButton from "primevue/radiobutton";
import Toast from "primevue/toast";
import { useToast } from "primevue/usetoast";
import { computed, ref } from "vue";
import { computed, ref, onMounted, watch } from "vue";
import { creatorApi } from "../../api/creator";
const toast = useToast();
const filterStatus = ref("all");
const searchKeyword = ref("");
const detailDialog = ref(false);
const refundDialog = ref(false);
const selectedOrder = ref(null);
const refundAction = ref("accept");
const refundReason = ref("");
const orders = ref([]);
const loading = ref(false);
const orders = ref([
{
id: "82934712",
title: "《霸王别姬》全本实录珍藏版",
type: "视频",
cover:
"https://images.unsplash.com/photo-1514306191717-452ec28c7f31?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=60",
buyerName: "戏迷小张",
buyerAvatar: "https://api.dicebear.com/7.x/avataaars/svg?seed=Zhang",
buyerId: "9527",
amount: "9.90",
date: "2025-12-24 14:30",
status: "completed",
},
{
id: "82934715",
title: "京剧打击乐基础教程",
type: "视频",
cover:
"https://images.unsplash.com/photo-1533174072545-e8d4aa97edf9?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=60",
buyerName: "票友老李",
buyerAvatar: "https://api.dicebear.com/7.x/avataaars/svg?seed=Li",
buyerId: "8848",
amount: "19.90",
date: "2025-12-25 09:15",
status: "refunding",
},
]);
const fetchOrders = async () => {
loading.value = true;
try {
const params = {
status: filterStatus.value === 'all' ? '' : filterStatus.value,
keyword: searchKeyword.value
};
const res = await creatorApi.listOrders(params);
orders.value = (res || []).map(o => ({
id: o.id,
title: o.title || '未知内容',
type: '数字内容',
cover: o.cover,
buyerName: o.buyer_name,
buyerAvatar: o.buyer_avatar,
amount: o.amount,
date: o.create_time,
status: o.status
}));
} catch (e) {
console.error(e);
} finally {
loading.value = false;
}
};
const filteredOrders = computed(() => {
if (filterStatus.value === "all") return orders.value;
return orders.value.filter((o) => o.status === filterStatus.value);
});
onMounted(fetchOrders);
watch(filterStatus, fetchOrders);
const filteredOrders = computed(() => orders.value);
const statusStyle = (status) => {
switch (status) {
case "paid":
case "completed":
return { bg: "bg-green-50", text: "text-green-600", label: "已完成" };
case "refunding":
@@ -252,18 +255,21 @@ const viewDetail = (order) => {
const handleRefund = (order) => {
selectedOrder.value = order;
refundAction.value = "accept";
refundReason.value = "";
refundDialog.value = true;
};
const confirmRefund = () => {
// Mock API
refundDialog.value = false;
toast.add({
severity: "success",
summary: "处理完成",
detail: refundAction.value === "accept" ? "已同意退款" : "已拒绝退款申请",
life: 3000,
});
// In real app, refresh list
const confirmRefund = async () => {
try {
const res = await creatorApi.refundOrder(selectedOrder.value.id, {
action: refundAction.value,
reason: refundReason.value
});
refundDialog.value = false;
toast.add({ severity: "success", summary: "处理成功", life: 3000 });
fetchOrders();
} catch (e) {
toast.add({ severity: "error", summary: "处理失败", detail: e.message, life: 3000 });
}
};
</script>