refactor: restructure project into 5 core modules

Organize project by 5 core modules based on requirement docs.

Co-authored-by: null <4804959+fnvtk@users.noreply.github.com>
This commit is contained in:
v0
2026-01-31 04:18:24 +00:00
parent b4aa620c93
commit 22e725887a
74 changed files with 4219 additions and 9234 deletions

View File

@@ -0,0 +1,322 @@
"use client"
import { useState } from "react"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { DollarSign, TrendingUp, BarChart3, Calculator, Target, Users, ArrowUpRight, ArrowDownRight } from 'lucide-react'
import { Progress } from "@/components/ui/progress"
export default function ValueAssessment() {
// 价值评估模型数据
const valueModels = [
{
name: "RFM价值模型",
description: "基于最近购买、购买频率、购买金额",
totalValue: 8560000000,
avgValue: 199.8,
coverage: 92.5,
status: "active",
},
{
name: "用户生命周期价值",
description: "预测用户终身价值(LTV)",
totalValue: 12580000000,
avgValue: 293.5,
coverage: 78.3,
status: "active",
},
{
name: "行为价值模型",
description: "基于用户行为数据评估",
totalValue: 6780000000,
avgValue: 158.2,
coverage: 85.7,
status: "training",
},
]
// 项目价值分布
const projectValues = [
{ name: "美妆行业项目A", users: 45600000, value: 2856000000, growth: 15.8, level: "A" },
{ name: "教育培训项目B", users: 32800000, value: 1968000000, growth: 12.3, level: "A" },
{ name: "电商零售项目C", users: 58900000, value: 3534000000, growth: 18.5, level: "S" },
{ name: "金融服务项目D", users: 28500000, value: 1995000000, growth: 8.7, level: "B" },
{ name: "本地生活项目E", users: 19200000, value: 1152000000, growth: 6.5, level: "B" },
]
// 微信号价值排名
const wechatRanking = [
{ name: "微信号001", users: 2856000, value: 168560000, avgValue: 59.0, rank: 1 },
{ name: "微信号002", users: 2345000, value: 145780000, avgValue: 62.2, rank: 2 },
{ name: "微信号003", users: 1980000, value: 128640000, avgValue: 65.0, rank: 3 },
{ name: "微信号004", users: 1756000, value: 112340000, avgValue: 64.0, rank: 4 },
{ name: "微信号005", users: 1520000, value: 95600000, avgValue: 62.9, rank: 5 },
]
// 价值增长趋势
const growthTrend = [
{ month: "1月", value: 9850000000, growth: 8.5 },
{ month: "2月", value: 10250000000, growth: 4.1 },
{ month: "3月", value: 10850000000, growth: 5.9 },
{ month: "4月", value: 11420000000, growth: 5.3 },
{ month: "5月", value: 11980000000, growth: 4.9 },
{ month: "6月", value: 12580000000, growth: 5.0 },
]
const formatNumber = (num: number): string => {
if (num >= 1000000000) return `${(num / 1000000000).toFixed(1)}B`
if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`
if (num >= 1000) return `${(num / 1000).toFixed(1)}K`
return num.toString()
}
const formatCurrency = (num: number): string => {
if (num >= 100000000) return `${(num / 100000000).toFixed(1)}亿`
if (num >= 10000) return `${(num / 10000).toFixed(1)}`
return num.toString()
}
const getLevelColor = (level: string) => {
const colors = {
S: "border-purple-500/50 text-purple-400 bg-purple-500/10",
A: "border-blue-500/50 text-blue-400 bg-blue-500/10",
B: "border-green-500/50 text-green-400 bg-green-500/10",
C: "border-yellow-500/50 text-yellow-400 bg-yellow-500/10",
D: "border-gray-500/50 text-gray-400 bg-gray-500/10",
}
return colors[level as keyof typeof colors] || colors.D
}
return (
<div className="min-h-screen bg-black text-white p-6">
{/* Header */}
<div className="mb-8 flex items-center justify-between">
<div>
<h1 className="text-4xl font-bold mb-2"></h1>
<p className="text-gray-400"></p>
</div>
<div className="flex items-center gap-4">
<Button variant="outline" className="bg-white/5 border-white/10 hover:bg-white/10">
<Calculator className="w-4 h-4 mr-2" />
</Button>
<Button className="bg-gradient-to-r from-blue-500 to-purple-500">
<BarChart3 className="w-4 h-4 mr-2" />
</Button>
</div>
</div>
{/* 核心价值指标 */}
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
<Card className="bg-gradient-to-br from-purple-500/20 to-purple-900/20 border-purple-500/30">
<CardHeader className="pb-3">
<CardTitle className="text-white flex items-center gap-2">
<DollarSign className="w-5 h-5" />
</CardTitle>
</CardHeader>
<CardContent>
<div className="text-4xl font-bold text-purple-400 mb-2">¥{formatCurrency(12580000000)}</div>
<div className="flex items-center gap-2 text-sm">
<ArrowUpRight className="w-4 h-4 text-green-400" />
<span className="text-green-400">+5.0%</span>
<span className="text-gray-400"></span>
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-blue-500/20 to-blue-900/20 border-blue-500/30">
<CardHeader className="pb-3">
<CardTitle className="text-white flex items-center gap-2">
<Users className="w-5 h-5" />
</CardTitle>
</CardHeader>
<CardContent>
<div className="text-4xl font-bold text-blue-400 mb-2">¥293.5</div>
<div className="flex items-center gap-2 text-sm">
<ArrowUpRight className="w-4 h-4 text-green-400" />
<span className="text-green-400">+2.8%</span>
<span className="text-gray-400"></span>
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-green-500/20 to-green-900/20 border-green-500/30">
<CardHeader className="pb-3">
<CardTitle className="text-white flex items-center gap-2">
<TrendingUp className="w-5 h-5" />
</CardTitle>
</CardHeader>
<CardContent>
<div className="text-4xl font-bold text-green-400 mb-2">85.5%</div>
<div className="text-sm text-gray-400"></div>
</CardContent>
</Card>
</div>
<Tabs defaultValue="models" className="space-y-6">
<TabsList className="bg-white/5 border border-white/10">
<TabsTrigger value="models"></TabsTrigger>
<TabsTrigger value="projects"></TabsTrigger>
<TabsTrigger value="wechat"></TabsTrigger>
<TabsTrigger value="trend"></TabsTrigger>
</TabsList>
{/* 价值模型 */}
<TabsContent value="models" className="space-y-6">
{valueModels.map((model, index) => (
<Card key={index} className="bg-white/5 border-white/10">
<CardHeader>
<div className="flex items-center justify-between">
<div>
<CardTitle className="text-white text-xl mb-1">{model.name}</CardTitle>
<p className="text-sm text-gray-400">{model.description}</p>
</div>
<Badge
variant="outline"
className={
model.status === "active"
? "border-green-500/50 text-green-400"
: "border-yellow-500/50 text-yellow-400"
}
>
{model.status === "active" ? "运行中" : "训练中"}
</Badge>
</div>
</CardHeader>
<CardContent>
<div className="grid grid-cols-3 gap-6 mb-4">
<div>
<div className="text-sm text-gray-400 mb-1"></div>
<div className="text-2xl font-bold text-white">¥{formatCurrency(model.totalValue)}</div>
</div>
<div>
<div className="text-sm text-gray-400 mb-1"></div>
<div className="text-2xl font-bold text-blue-400">¥{model.avgValue}</div>
</div>
<div>
<div className="text-sm text-gray-400 mb-1"></div>
<div className="text-2xl font-bold text-green-400">{model.coverage}%</div>
</div>
</div>
<Progress value={model.coverage} className="h-2" />
</CardContent>
</Card>
))}
</TabsContent>
{/* 项目价值 */}
<TabsContent value="projects" className="space-y-6">
<div className="grid grid-cols-1 gap-4">
{projectValues.map((project, index) => (
<Card key={index} className="bg-white/5 border-white/10">
<CardContent className="p-6">
<div className="flex items-center justify-between mb-4">
<div className="flex items-center gap-3">
<div className="text-lg font-semibold text-white">{project.name}</div>
<Badge variant="outline" className={getLevelColor(project.level)}>
{project.level}
</Badge>
</div>
<div className="flex items-center gap-2">
<ArrowUpRight className="w-4 h-4 text-green-400" />
<span className="text-green-400 font-semibold">+{project.growth}%</span>
</div>
</div>
<div className="grid grid-cols-4 gap-4 text-sm">
<div>
<div className="text-gray-400 mb-1"></div>
<div className="text-lg font-semibold text-white">{formatNumber(project.users)}</div>
</div>
<div>
<div className="text-gray-400 mb-1"></div>
<div className="text-lg font-semibold text-green-400">¥{formatCurrency(project.value)}</div>
</div>
<div>
<div className="text-gray-400 mb-1"></div>
<div className="text-lg font-semibold text-blue-400">
¥{(project.value / project.users).toFixed(2)}
</div>
</div>
<div>
<div className="text-gray-400 mb-1"></div>
<div className="text-lg font-semibold text-white">{project.growth}%</div>
</div>
</div>
</CardContent>
</Card>
))}
</div>
</TabsContent>
{/* 微信号排名 */}
<TabsContent value="wechat" className="space-y-6">
<div className="grid grid-cols-1 gap-4">
{wechatRanking.map((wechat, index) => (
<Card key={index} className="bg-white/5 border-white/10">
<CardContent className="p-6">
<div className="flex items-center gap-4 mb-4">
<div
className={`w-12 h-12 rounded-full flex items-center justify-center text-2xl font-bold ${
wechat.rank === 1
? "bg-gradient-to-br from-yellow-400 to-orange-500"
: wechat.rank === 2
? "bg-gradient-to-br from-gray-300 to-gray-500"
: wechat.rank === 3
? "bg-gradient-to-br from-orange-400 to-orange-600"
: "bg-white/10"
}`}
>
{wechat.rank}
</div>
<div className="flex-1">
<h3 className="text-lg font-semibold text-white mb-1">{wechat.name}</h3>
<div className="text-sm text-gray-400">{formatNumber(wechat.users)} </div>
</div>
<div className="text-right">
<div className="text-2xl font-bold text-green-400">¥{formatCurrency(wechat.value)}</div>
<div className="text-sm text-gray-400"> ¥{wechat.avgValue}</div>
</div>
</div>
</CardContent>
</Card>
))}
</div>
</TabsContent>
{/* 增长趋势 */}
<TabsContent value="trend" className="space-y-6">
<Card className="bg-white/5 border-white/10">
<CardHeader>
<CardTitle className="text-white flex items-center gap-2">
<TrendingUp className="w-5 h-5" />
</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-4">
{growthTrend.map((item, index) => (
<div key={index} className="flex items-center justify-between p-4 bg-white/5 rounded-lg">
<div className="flex items-center gap-4">
<div className="text-lg font-semibold text-white">{item.month}</div>
<div className="text-2xl font-bold text-green-400">¥{formatCurrency(item.value)}</div>
</div>
<div className="flex items-center gap-2">
<ArrowUpRight className="w-4 h-4 text-green-400" />
<span className="text-lg font-semibold text-green-400">+{item.growth}%</span>
</div>
</div>
))}
</div>
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
)
}