plan pages

This commit is contained in:
xavier
2025-06-03 16:37:39 +08:00
parent 0d33ba7e34
commit 1f2a1dab00
62 changed files with 12508 additions and 1984 deletions

View File

@@ -0,0 +1,377 @@
"use client"
import { useState } from "react"
import { useRouter } from "next/navigation"
import Image from "next/image"
import { ChevronLeft, Download, Share2, QrCode, Copy, BarChart4, Users } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"
import { Badge } from "@/components/ui/badge"
import { Switch } from "@/components/ui/switch"
import { toast } from "@/components/ui/use-toast"
export default function PaymentCodeDetailPage({ params }: { params: { id: string } }) {
const router = useRouter()
const [activeTab, setActiveTab] = useState("detail")
// 模拟数据
const paymentCode = {
id: params.id,
name: "社群会员付款码",
amount: "19.9",
description: "加入VIP社群会员",
status: "active",
qrCodeUrl: "/placeholder.svg?height=300&width=300&query=QR%20Code",
paymentMethod: "wechat",
createTime: "2023-10-26 11:00:00",
totalPayments: 156,
totalAmount: 3104.4,
distribution: {
enabled: true,
type: "percentage",
value: "10%",
totalDistributed: 310.44,
},
redPacket: {
enabled: true,
amount: "5",
totalSent: 156,
totalAmount: 780,
},
autoWelcome: {
enabled: true,
message: "感谢您的支付欢迎加入我们的VIP社群",
},
tags: ["付款客户", "社群会员", "已成交"],
}
const recentPayments = [
{ id: 1, user: "用户1", amount: "19.9", time: "2023-10-26 15:30:00", status: "success" },
{ id: 2, user: "用户2", amount: "19.9", time: "2023-10-26 14:45:00", status: "success" },
{ id: 3, user: "用户3", amount: "19.9", time: "2023-10-26 13:20:00", status: "success" },
{ id: 4, user: "用户4", amount: "19.9", time: "2023-10-26 12:10:00", status: "success" },
{ id: 5, user: "用户5", amount: "19.9", time: "2023-10-26 11:05:00", status: "success" },
]
const handleStatusChange = (checked: boolean) => {
toast({
title: checked ? "付款码已启用" : "付款码已停用",
description: checked ? "客户现在可以通过此付款码支付" : "客户将无法通过此付款码支付",
})
}
const handleCopy = (text: string) => {
navigator.clipboard.writeText(text)
toast({
title: "复制成功",
description: "内容已复制到剪贴板",
})
}
const handleDownload = () => {
toast({
title: "下载成功",
description: "付款码已保存到相册",
})
}
const handleShare = () => {
toast({
title: "分享成功",
description: "付款码已分享",
})
}
return (
<div className="flex flex-col min-h-screen bg-gray-50">
{/* 头部 */}
<header className="sticky top-0 z-10 bg-white border-b">
<div className="flex items-center justify-between h-14 px-4">
<div className="flex items-center">
<Button variant="ghost" size="icon" onClick={() => router.back()}>
<ChevronLeft className="h-5 w-5" />
</Button>
<h1 className="ml-2 text-lg font-medium"></h1>
</div>
<div className="flex items-center">
<Switch checked={paymentCode.status === "active"} onCheckedChange={handleStatusChange} />
<span className="ml-2 text-sm">{paymentCode.status === "active" ? "启用中" : "已停用"}</span>
</div>
</div>
</header>
{/* 标签页 */}
<div className="flex-1 px-4 pb-20">
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
<TabsList className="grid grid-cols-3 mb-4">
<TabsTrigger value="detail" className="text-xs">
<QrCode className="h-4 w-4 mr-1" />
</TabsTrigger>
<TabsTrigger value="payments" className="text-xs">
<BarChart4 className="h-4 w-4 mr-1" />
</TabsTrigger>
<TabsTrigger value="settings" className="text-xs">
<Users className="h-4 w-4 mr-1" />
</TabsTrigger>
</TabsList>
{/* 付款码详情 */}
<TabsContent value="detail" className="space-y-4">
<Card>
<CardContent className="p-4 flex flex-col items-center">
<h2 className="font-medium text-center mb-2">{paymentCode.name}</h2>
<p className="text-sm text-gray-500 mb-4">{paymentCode.description}</p>
<div className="relative w-64 h-64 mb-4">
<Image
src={paymentCode.qrCodeUrl || "/placeholder.svg"}
alt="付款码"
fill
className="object-contain"
/>
</div>
<div className="text-center mb-4">
<Badge variant="outline" className="text-green-500 bg-green-50">
¥{paymentCode.amount}
</Badge>
</div>
<div className="flex justify-center space-x-4 w-full">
<Button variant="outline" size="sm" onClick={handleDownload}>
<Download className="h-4 w-4 mr-1" />
</Button>
<Button variant="outline" size="sm" onClick={handleShare}>
<Share2 className="h-4 w-4 mr-1" />
</Button>
<Button
variant="outline"
size="sm"
onClick={() => handleCopy(`付款码:${paymentCode.name},金额:${paymentCode.amount}`)}
>
<Copy className="h-4 w-4 mr-1" />
</Button>
</div>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="space-y-3">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500">ID</span>
<span className="font-medium">{paymentCode.id}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
{paymentCode.paymentMethod === "wechat"
? "微信支付"
: paymentCode.paymentMethod === "alipay"
? "支付宝"
: "微信和支付宝"}
</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.createTime}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.totalPayments}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.totalAmount}</span>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 支付记录 */}
<TabsContent value="payments" className="space-y-4">
<Card>
<CardContent className="p-4">
<div className="flex justify-between items-center mb-3">
<h3 className="font-medium"></h3>
<Button
variant="ghost"
size="sm"
className="text-blue-500"
onClick={() => router.push(`/scenarios/payment/${params.id}/payments`)}
>
</Button>
</div>
<div className="space-y-3">
{recentPayments.map((payment) => (
<div key={payment.id} className="flex justify-between items-center py-2 border-b last:border-0">
<div>
<p className="font-medium">{payment.user}</p>
<p className="text-xs text-gray-500">{payment.time}</p>
</div>
<div className="text-right">
<p className="font-medium">¥{payment.amount}</p>
<Badge variant="outline" className="text-green-500 bg-green-50 text-xs">
</Badge>
</div>
</div>
))}
</div>
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="space-y-3">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.totalPayments}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.totalAmount}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
¥{(paymentCode.totalAmount / paymentCode.totalPayments).toFixed(2)}
</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">{Math.floor(paymentCode.totalPayments * 0.9)}</span>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 高级设置 */}
<TabsContent value="settings" className="space-y-4">
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.distribution.enabled} />
</div>
{paymentCode.distribution.enabled && (
<div className="space-y-3 pl-4 border-l-2 border-blue-100">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">
{paymentCode.distribution.type === "percentage" ? "比例返利" : "固定金额"}
</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.distribution.value}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.distribution.totalDistributed}</span>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.redPacket.enabled} />
</div>
{paymentCode.redPacket.enabled && (
<div className="space-y-3 pl-4 border-l-2 border-blue-100">
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.redPacket.amount}</span>
</div>
<div className="flex justify-between items-center py-2 border-b">
<span className="text-gray-500"></span>
<span className="font-medium">{paymentCode.redPacket.totalSent}</span>
</div>
<div className="flex justify-between items-center py-2">
<span className="text-gray-500"></span>
<span className="font-medium">¥{paymentCode.redPacket.totalAmount}</span>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex items-center justify-between mb-3">
<span className="text-gray-500"></span>
<Switch checked={paymentCode.autoWelcome.enabled} />
</div>
{paymentCode.autoWelcome.enabled && (
<div className="pl-4 border-l-2 border-blue-100">
<div className="py-2">
<span className="text-gray-500 block mb-2"></span>
<div className="bg-gray-50 p-3 rounded-md text-sm">{paymentCode.autoWelcome.message}</div>
</div>
</div>
)}
</CardContent>
</Card>
<Card>
<CardContent className="p-4">
<h3 className="font-medium mb-3"></h3>
<div className="flex flex-wrap gap-2">
{paymentCode.tags.map((tag, index) => (
<Badge key={index} variant="outline" className="rounded-full">
{tag}
</Badge>
))}
<Button variant="outline" size="sm" className="rounded-full text-blue-500">
+
</Button>
</div>
</CardContent>
</Card>
<div className="flex justify-center mt-6">
<Button
variant="outline"
className="text-red-500 border-red-200 hover:bg-red-50"
onClick={() => {
if (confirm("确定要删除此付款码吗?删除后将无法恢复。")) {
toast({
title: "付款码已删除",
description: "付款码已成功删除",
})
router.push("/scenarios/payment")
}
}}
>
</Button>
</div>
</TabsContent>
</Tabs>
</div>
</div>
)
}