fix: resolve frontend build error and order refund bug, add member price filter
This commit is contained in:
@@ -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>
|
||||
Reference in New Issue
Block a user