Files
users/app/conversion/page.tsx
v0 2408d50cb0 refactor: overhaul UI for streamlined user experience
Redesign navigation, home overview, user portrait, and valuation pages
with improved functionality and responsive design.

Co-authored-by: null <4804959+fnvtk@users.noreply.github.com>
2025-07-18 13:47:12 +00:00

509 lines
22 KiB
TypeScript

"use client"
import { useState } from "react"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
import { BarChart, LineChart } from "@/components/charts"
import {
Activity,
ArrowUpRight,
Download,
Filter,
RefreshCw,
ShoppingCart,
TrendingUp,
MessageSquare,
} from "lucide-react"
import { Badge } from "@/components/ui/badge"
import { Progress } from "@/components/ui/progress"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
export default function ConversionPage() {
const [timeRange, setTimeRange] = useState("30days")
return (
<div className="container mx-auto p-4 space-y-6">
{/* 页面标题和工具栏 */}
<div className="flex flex-col md:flex-row md:justify-between md:items-center gap-4">
<div>
<h1 className="text-3xl font-bold"></h1>
<p className="text-muted-foreground mt-1"></p>
</div>
<div className="flex flex-wrap gap-2">
<Select value={timeRange} onValueChange={setTimeRange}>
<SelectTrigger className="w-[140px]">
<SelectValue placeholder="选择时间范围" />
</SelectTrigger>
<SelectContent>
<SelectItem value="7days">7</SelectItem>
<SelectItem value="30days">30</SelectItem>
<SelectItem value="90days">90</SelectItem>
</SelectContent>
</Select>
<Button variant="outline" size="icon">
<Filter className="h-4 w-4" />
</Button>
<Button variant="outline" size="icon">
<RefreshCw className="h-4 w-4" />
</Button>
<Button variant="outline">
<Download className="mr-2 h-4 w-4" />
</Button>
</div>
</div>
{/* 成交转化概览 */}
<Card className="border-none shadow-md overflow-hidden">
<CardHeader className="bg-gradient-to-r from-blue-50 to-indigo-50 border-b">
<div className="flex justify-between items-center">
<div>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</div>
<Button variant="outline">
<ShoppingCart className="h-4 w-4 mr-2" />
</Button>
</div>
</CardHeader>
<CardContent className="p-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<Card className="bg-gradient-to-br from-blue-50 to-indigo-50 border-none shadow-sm">
<CardContent className="p-4">
<div className="flex justify-between items-start">
<div>
<div className="text-sm font-medium text-blue-600"></div>
<div className="text-2xl font-bold mt-2">45.2%</div>
<div className="text-sm text-green-600 mt-1 flex items-center">
<ArrowUpRight className="h-4 w-4 mr-1" />
2.1%
</div>
</div>
<div className="bg-blue-100 p-2 rounded-full">
<Activity className="h-5 w-5 text-blue-600" />
</div>
</div>
<div className="mt-3">
<div className="flex justify-between text-xs mb-1">
<span></span>
<span>50%</span>
</div>
<Progress value={90.4} className="h-1.5 bg-blue-100" />
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-green-50 to-emerald-50 border-none shadow-sm">
<CardContent className="p-4">
<div className="flex justify-between items-start">
<div>
<div className="text-sm font-medium text-green-600"></div>
<div className="text-2xl font-bold mt-2">12.5%</div>
<div className="text-sm text-green-600 mt-1 flex items-center">
<ArrowUpRight className="h-4 w-4 mr-1" />
0.8%
</div>
</div>
<div className="bg-green-100 p-2 rounded-full">
<ShoppingCart className="h-5 w-5 text-green-600" />
</div>
</div>
<div className="mt-3">
<div className="flex justify-between text-xs mb-1">
<span></span>
<span>15%</span>
</div>
<Progress value={83.3} className="h-1.5 bg-green-100" />
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-purple-50 to-pink-50 border-none shadow-sm">
<CardContent className="p-4">
<div className="flex justify-between items-start">
<div>
<div className="text-sm font-medium text-purple-600"></div>
<div className="text-2xl font-bold mt-2">18.3%</div>
<div className="text-sm text-green-600 mt-1 flex items-center">
<ArrowUpRight className="h-4 w-4 mr-1" />
1.2%
</div>
</div>
<div className="bg-purple-100 p-2 rounded-full">
<MessageSquare className="h-5 w-5 text-purple-600" />
</div>
</div>
<div className="mt-3">
<div className="flex justify-between text-xs mb-1">
<span></span>
<span>20%</span>
</div>
<Progress value={91.5} className="h-1.5 bg-purple-100" />
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-amber-50 to-yellow-50 border-none shadow-sm">
<CardContent className="p-4">
<div className="flex justify-between items-start">
<div>
<div className="text-sm font-medium text-amber-600"></div>
<div className="text-2xl font-bold mt-2">¥245</div>
<div className="text-sm text-green-600 mt-1 flex items-center">
<ArrowUpRight className="h-4 w-4 mr-1" />
5.2%
</div>
</div>
<div className="bg-amber-100 p-2 rounded-full">
<TrendingUp className="h-5 w-5 text-amber-600" />
</div>
</div>
<div className="mt-3">
<div className="flex justify-between text-xs mb-1">
<span></span>
<span>¥250</span>
</div>
<Progress value={98} className="h-1.5 bg-amber-100" />
</div>
</CardContent>
</Card>
</div>
</CardContent>
</Card>
{/* 用户行为分析 */}
<Card className="border-none shadow-md overflow-hidden">
<CardHeader className="bg-gradient-to-r from-blue-50 to-indigo-50 border-b">
<div className="flex justify-between items-center">
<div>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</div>
<Badge className="bg-blue-100 text-blue-800"></Badge>
</div>
</CardHeader>
<CardContent className="p-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-white p-4 rounded-lg shadow-sm">
<h3 className="text-lg font-medium mb-3"></h3>
<BarChart
data={{
labels: ["浏览", "搜索", "点击", "加购", "下单", "支付", "分享"],
datasets: [
{
label: "行为占比(%)",
data: [100, 65, 45, 25, 15, 12, 8],
backgroundColor: "rgba(59, 130, 246, 0.8)",
},
],
}}
height={220}
/>
</div>
<div className="bg-white p-4 rounded-lg shadow-sm">
<h3 className="text-lg font-medium mb-3"></h3>
<LineChart
data={{
labels: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
datasets: [
{
label: "活跃用户数",
data: [65000, 59000, 80000, 81000, 56000, 85000, 90000],
borderColor: "rgb(59, 130, 246)",
backgroundColor: "rgba(59, 130, 246, 0.1)",
},
{
label: "平均停留时间(分钟)",
data: [12, 10, 14, 15, 11, 18, 20],
borderColor: "rgb(16, 185, 129)",
backgroundColor: "rgba(16, 185, 129, 0.1)",
},
],
}}
height={220}
/>
</div>
</div>
<div className="mt-4">
<Card className="bg-white shadow-sm">
<CardHeader className="pb-2">
<CardTitle className="text-lg"></CardTitle>
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">68.5%</span>
</div>
<Progress value={68.5} className="h-1.5" />
</div>
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">12.5</span>
</div>
<Progress value={62.5} className="h-1.5" />
</div>
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">45.2%</span>
</div>
<Progress value={45.2} className="h-1.5" />
</div>
</div>
</CardContent>
</Card>
</div>
</CardContent>
</Card>
{/* 交易漏斗分析 */}
<Card className="border-none shadow-md overflow-hidden">
<CardHeader className="bg-gradient-to-r from-green-50 to-emerald-50 border-b">
<div className="flex justify-between items-center">
<div>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</div>
<Badge className="bg-blue-100 text-blue-800"></Badge>
</div>
</CardHeader>
<CardContent className="p-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-white p-4 rounded-lg shadow-sm">
<h3 className="text-lg font-medium mb-3"></h3>
<div className="flex flex-col items-center space-y-2 py-4">
<div className="w-full max-w-md">
<div className="relative pt-1">
<div className="flex mb-2 items-center justify-between">
<div>
<span className="text-xs font-semibold inline-block py-1 px-2 uppercase rounded-full text-blue-600 bg-blue-200">
(100%)
</span>
</div>
<div className="text-right">
<span className="text-xs font-semibold inline-block text-blue-600">125,689</span>
</div>
</div>
<div className="overflow-hidden h-2 mb-4 text-xs flex rounded bg-blue-200">
<div
style={{ width: "100%" }}
className="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-blue-500"
></div>
</div>
</div>
</div>
<div className="w-full max-w-md">
<div className="relative pt-1">
<div className="flex mb-2 items-center justify-between">
<div>
<span className="text-xs font-semibold inline-block py-1 px-2 uppercase rounded-full text-blue-600 bg-blue-200">
(45%)
</span>
</div>
<div className="text-right">
<span className="text-xs font-semibold inline-block text-blue-600">56,560</span>
</div>
</div>
<div className="overflow-hidden h-2 mb-4 text-xs flex rounded bg-blue-200">
<div
style={{ width: "45%" }}
className="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-blue-500"
></div>
</div>
</div>
</div>
<div className="w-full max-w-md">
<div className="relative pt-1">
<div className="flex mb-2 items-center justify-between">
<div>
<span className="text-xs font-semibold inline-block py-1 px-2 uppercase rounded-full text-yellow-600 bg-yellow-200">
(18%)
</span>
</div>
<div className="text-right">
<span className="text-xs font-semibold inline-block text-yellow-600">22,624</span>
</div>
</div>
<div className="overflow-hidden h-2 mb-4 text-xs flex rounded bg-yellow-200">
<div
style={{ width: "18%" }}
className="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-yellow-500"
></div>
</div>
</div>
</div>
<div className="w-full max-w-md">
<div className="relative pt-1">
<div className="flex mb-2 items-center justify-between">
<div>
<span className="text-xs font-semibold inline-block py-1 px-2 uppercase rounded-full text-green-600 bg-green-200">
(8%)
</span>
</div>
<div className="text-right">
<span className="text-xs font-semibold inline-block text-green-600">10,055</span>
</div>
</div>
<div className="overflow-hidden h-2 mb-4 text-xs flex rounded bg-green-200">
<div
style={{ width: "8%" }}
className="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-green-500"
></div>
</div>
</div>
</div>
</div>
</div>
<div className="bg-white p-4 rounded-lg shadow-sm">
<h3 className="text-lg font-medium mb-3"></h3>
<LineChart
data={{
labels: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
datasets: [
{
label: "浏览转化率",
data: [40, 42, 43, 44, 45, 46, 45],
borderColor: "rgb(59, 130, 246)",
backgroundColor: "rgba(59, 130, 246, 0.1)",
},
{
label: "购买转化率",
data: [15, 16, 16.5, 17, 17.5, 18, 18],
borderColor: "rgb(16, 185, 129)",
backgroundColor: "rgba(16, 185, 129, 0.1)",
},
],
}}
height={220}
/>
</div>
</div>
</CardContent>
</Card>
{/* 场景管理 */}
<Card className="border-none shadow-md overflow-hidden">
<CardHeader className="bg-gradient-to-r from-purple-50 to-pink-50 border-b">
<div className="flex justify-between items-center">
<div>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</div>
<Badge className="bg-blue-100 text-blue-800"></Badge>
</div>
</CardHeader>
<CardContent className="p-4">
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<Card className="bg-white shadow-sm">
<CardHeader className="pb-2">
<CardTitle className="text-lg"></CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">48</span>
</div>
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">18.3%</span>
</div>
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">85.2%</span>
</div>
</div>
</CardContent>
</Card>
<Card className="bg-white shadow-sm">
<CardHeader className="pb-2">
<CardTitle className="text-lg"></CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">35%</span>
</div>
<Progress value={35} className="h-1.5" />
<div className="flex justify-between items-center mt-2">
<span className="text-sm"></span>
<span className="text-sm font-medium">30%</span>
</div>
<Progress value={30} className="h-1.5" />
<div className="flex justify-between items-center mt-2">
<span className="text-sm"></span>
<span className="text-sm font-medium">20%</span>
</div>
<Progress value={20} className="h-1.5" />
</div>
</CardContent>
</Card>
<Card className="bg-white shadow-sm">
<CardHeader className="pb-2">
<CardTitle className="text-lg"></CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">8.5</span>
</div>
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">42.3%</span>
</div>
<div className="flex justify-between items-center">
<span className="text-sm"></span>
<span className="text-sm font-medium">18.3%</span>
</div>
</div>
</CardContent>
</Card>
</div>
<div className="mt-4">
<div className="bg-white p-4 rounded-lg shadow-sm">
<h3 className="text-lg font-medium mb-3">使</h3>
<LineChart
data={{
labels: ["1月", "2月", "3月", "4月", "5月", "6月", "7月"],
datasets: [
{
label: "社交场景",
data: [25000, 27000, 28000, 30000, 32000, 35000, 38000],
borderColor: "rgb(59, 130, 246)",
backgroundColor: "rgba(59, 130, 246, 0.1)",
},
{
label: "购物场景",
data: [20000, 22000, 24000, 25000, 28000, 30000, 32000],
borderColor: "rgb(16, 185, 129)",
backgroundColor: "rgba(16, 185, 129, 0.1)",
},
],
}}
height={220}
/>
</div>
</div>
</CardContent>
</Card>
</div>
)
}