+
+
{cafe.name}
-
-
+
+
{cafe.rating}
-
|
-
人均 ¥{(cafe.price * 3).toFixed(0)}
-
|
-
{cafe.distance}
+
人均 ¥{(cafe.price * 3).toFixed(0)}
+
+
+ {cafe.district} | {cafe.distance}
+
+
+
+ {cafe.tags.map((tag, i) => (
+
+ {tag}
+
+ ))}
-
{cafe.district}
-
-
+
+
+
¥
- {cafe.price}
+ {cafe.price}
/时
+
-
- {cafe.tags.map((tag, i) => (
-
- {tag}
-
- ))}
-
))}
diff --git a/app/live/[id]/page.tsx b/app/live/[id]/page.tsx
index ab87910..08d5a0b 100644
--- a/app/live/[id]/page.tsx
+++ b/app/live/[id]/page.tsx
@@ -2,13 +2,39 @@
import { useState } from "react"
import { useRouter } from "next/navigation"
-import { ArrowLeft, Heart, Share2, Gift, Send, MoreHorizontal } from "lucide-react"
+import { ArrowLeft, Heart, Share2, Gift, Send, MoreHorizontal, Users, MessageCircle } from "lucide-react"
import Image from "next/image"
+import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"
+import { Button } from "@/components/ui/button"
+import { toast } from "@/hooks/use-toast"
export default function LiveRoomPage({ params }: { params: { id: string } }) {
const router = useRouter()
const [comment, setComment] = useState("")
const [isFollowed, setIsFollowed] = useState(false)
+ const [showCommunity, setShowCommunity] = useState(false)
+
+ const players = [
+ { id: "1", name: "GM-远洋", avatar: "/avatar-1.jpg", title: "国服第一盲僧", fans: "46K", partyMembers: 1205 },
+ { id: "2", name: "卡若", avatar: "/avatar-2.jpg", title: "职业战队退役", fans: "32K", partyMembers: 856 },
+ { id: "3", name: "小柠檬", avatar: "/avatar-3.jpg", title: "人皮话多", fans: "18K", partyMembers: 432 },
+ { id: "4", name: "阿伟", avatar: "/avatar-4.jpg", title: "绝地求生刚枪王", fans: "25K", partyMembers: 678 },
+ { id: "5", name: "七七", avatar: "/avatar-5.jpg", title: "甜美声优", fans: "52K", partyMembers: 1502 },
+ { id: "6", name: "大魔王", avatar: "/avatar-6.jpg", title: "中单法王", fans: "38K", partyMembers: 945 },
+ ]
+
+ const currentPlayer = players.find((p) => p.id === params.id) || players[0]
+
+ const handleJoinParty = () => {
+ toast({
+ title: "加入成功",
+ description: `已加入 ${currentPlayer.name} 的粉丝派对群`,
+ })
+ setShowCommunity(false)
+ setTimeout(() => {
+ router.push(`/chat/${params.id}`)
+ }, 1000)
+ }
return (
@@ -26,10 +52,10 @@ export default function LiveRoomPage({ params }: { params: { id: string } }) {
-
+
-
GM-远洋
+
{currentPlayer.name}
12.5w观看
@@ -45,12 +71,7 @@ export default function LiveRoomPage({ params }: { params: { id: string } }) {
{[1, 2, 3].map((i) => (
-
+
))}
@@ -60,6 +81,85 @@ export default function LiveRoomPage({ params }: { params: { id: string } }) {
+
+
{/* Main Content Spacer */}
diff --git a/app/mall/companion/page.tsx b/app/mall/companion/page.tsx
new file mode 100644
index 0000000..d71a376
--- /dev/null
+++ b/app/mall/companion/page.tsx
@@ -0,0 +1,281 @@
+"use client"
+
+import { useState } from "react"
+import { useRouter } from "next/navigation"
+import Image from "next/image"
+import { Star, Play, Mic, Video, Gamepad2, GraduationCap } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { toast } from "@/hooks/use-toast"
+
+export default function CompanionPage() {
+ const router = useRouter()
+ const [activeTab, setActiveTab] = useState("play") // play | learn
+
+ const games = [
+ { name: "全部", id: "all" },
+ { name: "英雄联盟", id: "lol" },
+ { name: "王者荣耀", id: "hok" },
+ { name: "无畏契约", id: "val" },
+ { name: "和平精英", id: "pubg" },
+ { name: "原神", id: "genshin" },
+ ]
+ const [activeGame, setActiveGame] = useState("all")
+
+ const companions = [
+ {
+ id: 1,
+ name: "GM-远洋",
+ title: "国服第一盲僧",
+ price: 50,
+ unit: "局",
+ image: "/avatar-1.jpg",
+ tags: ["技术流", "风趣", "职业退役"],
+ game: "lol",
+ rating: 5.0,
+ orders: 1205,
+ voice: true,
+ video: true,
+ },
+ {
+ id: 2,
+ name: "七七",
+ title: "甜美声优",
+ price: 40,
+ unit: "小时",
+ image: "/avatar-5.jpg",
+ tags: ["声优", "聊天", "辅助"],
+ game: "hok",
+ rating: 4.9,
+ orders: 890,
+ voice: true,
+ video: false,
+ },
+ {
+ id: 3,
+ name: "卡若",
+ title: "前职业选手",
+ price: 80,
+ unit: "局",
+ image: "/avatar-2.jpg",
+ tags: ["包赢", "教学", "高分局"],
+ game: "lol",
+ rating: 5.0,
+ orders: 3400,
+ voice: true,
+ video: true,
+ },
+ {
+ id: 4,
+ name: "小柠檬",
+ title: "人皮话多",
+ price: 30,
+ unit: "局",
+ image: "/avatar-3.jpg",
+ tags: ["娱乐", "开心", "相声"],
+ game: "val",
+ rating: 4.8,
+ orders: 560,
+ voice: true,
+ video: false,
+ },
+ {
+ id: 5,
+ name: "大魔王",
+ title: "中单法王",
+ price: 100,
+ unit: "局",
+ image: "/avatar-6.jpg",
+ tags: ["技术教学", "上分", "严肃"],
+ game: "lol",
+ rating: 5.0,
+ orders: 8800,
+ voice: true,
+ video: true,
+ },
+ {
+ id: 6,
+ name: "阿伟",
+ title: "绝地刚枪王",
+ price: 60,
+ unit: "小时",
+ image: "/avatar-4.jpg",
+ tags: ["带妹", "吃鸡", "指挥"],
+ game: "pubg",
+ rating: 4.9,
+ orders: 1100,
+ voice: true,
+ video: false,
+ },
+ ]
+
+ const courses = [
+ {
+ id: 1,
+ title: "中单瑞兹顶级教学",
+ author: "Faker",
+ price: 199,
+ image: "/course-1.jpg",
+ students: 12000,
+ game: "lol",
+ },
+ {
+ id: 2,
+ title: "下路对线细节全解",
+ author: "Uzi",
+ price: 199,
+ image: "/course-2.jpg",
+ students: 35000,
+ game: "lol",
+ },
+ {
+ id: 3,
+ title: "上单压制力养成",
+ author: "TheShy",
+ price: 159,
+ image: "/course-3.jpg",
+ students: 8900,
+ game: "lol",
+ },
+ {
+ id: 4,
+ title: "瓦罗兰特特工教学",
+ author: "康康",
+ price: 99,
+ image: "/course-4.jpg",
+ students: 4500,
+ game: "val",
+ },
+ ]
+
+ return (
+
+
+
+ 明星陪玩 & 课程
+
+
+ {/* Tabs */}
+
+
+
+
+
+
+
+ {/* Game Filter */}
+
+
+ {games.map((g) => (
+
+ ))}
+
+
+
+ {/* Content */}
+
+ {activeTab === "play" ? (
+
+ {companions
+ .filter((c) => activeGame === "all" || c.game === activeGame)
+ .map((c) => (
+
router.push(`/live/${c.id}`)}
+ >
+
+
+
+
+
+ {c.name}
+ {c.voice && }
+ {c.video && }
+
+ {c.orders}单
+
+
{c.title}
+
+ {c.tags.map((tag, i) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+ {c.price}
+ 币/{c.unit}
+
+
+
+
+
+ ))}
+
+ ) : (
+
+ {courses
+ .filter((c) => activeGame === "all" || c.game === activeGame)
+ .map((c) => (
+
toast({ title: "购买成功", description: "课程已添加至学习中心" })}
+ >
+
+
+
+
+ {c.author} 亲授
+
+
+
+
{c.title}
+
+ {c.students} 人已学
+ ¥{c.price}
+
+
+
+ ))}
+
+ )}
+
+
+ )
+}
diff --git a/app/mall/courses/page.tsx b/app/mall/courses/page.tsx
new file mode 100644
index 0000000..48f326c
--- /dev/null
+++ b/app/mall/courses/page.tsx
@@ -0,0 +1,58 @@
+"use client"
+import { useRouter } from "next/navigation"
+import Image from "next/image"
+import { Play, Users } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { toast } from "@/hooks/use-toast"
+
+export default function CoursesPage() {
+ const router = useRouter()
+ const courses = [
+ { id: 1, title: "Faker 中单瑞兹教学", author: "Faker", price: 199, image: "/course-1.jpg", students: 12000 },
+ { id: 2, title: "Uzi 下路对线细节", author: "Uzi", price: 199, image: "/course-2.jpg", students: 35000 },
+ { id: 3, title: "TheShy 上单压制力", author: "TheShy", price: 159, image: "/course-3.jpg", students: 8900 },
+ { id: 4, title: "10分钟学会云顶吃鸡", author: "云顶之弈", price: 49, image: "/course-4.jpg", students: 5000 },
+ ]
+
+ return (
+
+
+
+ 同款课程
+
+
+ {courses.map((c) => (
+
toast({ title: "购买成功", description: "课程已添加至学习中心" })}
+ >
+
+
+
{c.title}
+
+ {c.author}
+
+ {c.students}
+
+
+
+ ¥{c.price}
+
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/app/mall/gear/page.tsx b/app/mall/gear/page.tsx
new file mode 100644
index 0000000..2562398
--- /dev/null
+++ b/app/mall/gear/page.tsx
@@ -0,0 +1,56 @@
+"use client"
+import { useRouter } from "next/navigation"
+import Image from "next/image"
+import { Button } from "@/components/ui/button"
+import { toast } from "@/hooks/use-toast"
+
+export default function GearPage() {
+ const router = useRouter()
+ const products = [
+ { id: 1, name: "罗技 G Pro X Superlight", price: 899, image: "/gear-mouse.jpg", tag: "职业首选" },
+ { id: 2, name: "雷蛇 猎魂光蛛 V3", price: 1299, image: "/gear-keyboard.jpg", tag: "光轴科技" },
+ { id: 3, name: "卓威 XL2546K", price: 3499, image: "/gear-monitor.jpg", tag: "360Hz" },
+ { id: 4, name: "HyperX Cloud II", price: 599, image: "/gear-headset.jpg", tag: "7.1声道" },
+ ]
+
+ return (
+
+
+
+ 电竞外设
+
+
+ {products.map((p) => (
+
toast({ title: "加入购物车", description: p.name })}
+ >
+
+
+
{p.name}
+
+ ¥{p.price}
+
+
+
+
+ ))}
+
+
+ )
+}
diff --git a/app/mall/page.tsx b/app/mall/page.tsx
index 8f57ad2..f9353a5 100644
--- a/app/mall/page.tsx
+++ b/app/mall/page.tsx
@@ -9,20 +9,24 @@ import {
Gift,
Coins,
BookOpen,
- GraduationCap,
- Monitor,
Hotel,
Coffee,
Trophy,
User,
+ Keyboard,
+ Wallet,
+ Gamepad2,
+ Gem,
} from "lucide-react"
import { Button } from "@/components/ui/button"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { useAppContext } from "@/components/providers/app-provider"
-import Link from "next/link" // Import Link
+import Link from "next/link"
+import { useRouter } from "next/navigation"
export default function MallPage() {
- const { wallet, pay, recharge } = useAppContext()
+ const { wallet, pay } = useAppContext()
+ const router = useRouter()
const handleBuy = (price: number, currency: "diamonds" | "coins", name: string, type: "product" | "service") => {
pay(price, currency, name, type)
@@ -32,9 +36,12 @@ export default function MallPage() {
{/* Header */}
- 商城
+ 商城中心
-
+
router.push("/recharge")}
+ >
{wallet.diamonds}
@@ -47,25 +54,24 @@ export default function MallPage() {
{/* Banner */}
-
+
router.push("/recharge")}
+ >
首充双倍
限时特惠 赠送绝版头像框
-
-
+
- {/* Top Categories - Expanded as requested */}
+ {/* Top Categories - 8 Items */}
@@ -74,22 +80,22 @@ export default function MallPage() {
{[
{
- name: "知识付费",
- icon: BookOpen,
+ name: "明星陪玩",
+ icon: Gamepad2,
color: "text-blue-400",
bg: "bg-blue-500/10",
- href: "/my-courses",
+ href: "/mall/companion?type=play",
},
{
- name: "陪玩课程",
- icon: GraduationCap,
+ name: "大师课程",
+ icon: BookOpen,
color: "text-pink-400",
bg: "bg-pink-500/10",
- href: "/creator/apply",
+ href: "/mall/companion?type=course",
},
{
name: "电竞外设",
- icon: Monitor,
+ icon: Keyboard,
color: "text-purple-400",
bg: "bg-purple-500/10",
href: "/mall/gear",
@@ -102,7 +108,7 @@ export default function MallPage() {
href: "/hotel",
},
{
- name: "附近网吧",
+ name: "附近网咖",
icon: Coffee,
color: "text-cyan-400",
bg: "bg-cyan-500/10",
@@ -120,26 +126,26 @@ export default function MallPage() {
icon: User,
color: "text-green-400",
bg: "bg-green-500/10",
- href: "/services/account",
+ href: "/services/account?tab=buy",
},
{
- name: "更多服务",
- icon: Sparkles,
- color: "text-white/40",
- bg: "bg-white/5",
- href: "#",
+ name: "账号金融",
+ icon: Wallet,
+ color: "text-indigo-400",
+ bg: "bg-indigo-500/10",
+ href: "/services/account?tab=finance",
},
].map((item, i) => (
-
{item.name}
+ {item.name}
))}
@@ -149,25 +155,25 @@ export default function MallPage() {
-
- 装扮
+
+ 头像装扮
-
- 礼物
+
+ 礼物道具
-
- 兑换
+
+ 福利兑换
{/* Categories */}
-
- {["推荐", "头像框", "聊天气泡", "入场特效", "座驾"].map((cat, i) => (
+
+ {["热门推荐", "限定头像", "动态边框", "入场特效", "聊天气泡"].map((cat, i) => (
{cat}
@@ -177,30 +183,69 @@ export default function MallPage() {
{/* Grid */}
{[
- { name: "巫瞻猫影", price: 99, type: "frame", color: "from-purple-500/20 to-blue-500/20" },
- { name: "椰树风情", price: 128, type: "frame", color: "from-green-500/20 to-yellow-500/20" },
- { name: "黑白天使", price: 299, type: "wing", color: "from-gray-500/20 to-white/20" },
- { name: "敦煌飞天", price: 520, type: "ring", color: "from-orange-500/20 to-red-500/20" },
- { name: "恶魔之眼", price: 199, type: "frame", color: "from-red-900/20 to-black/20" },
- { name: "小熊猫", price: 68, type: "frame", color: "from-orange-300/20 to-yellow-300/20" },
+ {
+ name: "巫瞻猫影",
+ price: 99,
+ type: "frame",
+ color: "from-purple-500/20 to-blue-500/20",
+ query: "Esports avatar frame with cat and witch theme, purple and blue gradients, mystical symbols",
+ },
+ {
+ name: "椰树风情",
+ price: 128,
+ type: "frame",
+ color: "from-green-500/20 to-yellow-500/20",
+ query: "Tropical esports avatar frame with palm trees and summer vibes, green and yellow",
+ },
+ {
+ name: "黑白天使",
+ price: 299,
+ type: "wing",
+ color: "from-gray-500/20 to-white/20",
+ query: "Esports angel wings avatar decoration, black and white contrasting feathers, divine effect",
+ },
+ {
+ name: "敦煌飞天",
+ price: 520,
+ type: "ring",
+ color: "from-orange-500/20 to-red-500/20",
+ query: "Chinese Dunhuang flying apsara themed avatar ring, orange and red, traditional art style",
+ },
+ {
+ name: "恶魔之眼",
+ price: 199,
+ type: "frame",
+ color: "from-red-900/20 to-black/20",
+ query: "Dark esports avatar frame with demonic red eye motif, black and red, ominous vibe",
+ },
+ {
+ name: "小熊猫",
+ price: 68,
+ type: "frame",
+ color: "from-orange-300/20 to-yellow-300/20",
+ query: "Cute esports red panda avatar frame, orange and yellow, playful design",
+ },
].map((item, i) => (
-
-
-
-
+ {/* Placeholder for local image if we had one, otherwise Sparkles */}
+
}`})
+
-
{item.name}
+
{item.name}
{item.price}
@@ -219,6 +264,7 @@ export default function MallPage() {
+ {/* Gift Content - Simplified */}
{[
{ name: "棒棒糖", price: 10, icon: "🍭" },
@@ -230,10 +276,10 @@ export default function MallPage() {
].map((item, i) => (
handleBuy(item.price, "diamonds", item.name, "product")}
>
-
{item.icon}
+
{item.icon}
{item.name}
@@ -247,6 +293,7 @@ export default function MallPage() {
+ {/* Exchange Content */}
{[
{ name: "10元话费券", price: 1000, icon: Gift },
@@ -254,7 +301,7 @@ export default function MallPage() {
{ name: "改名卡", price: 2000, icon: Crown },
{ name: "双倍经验卡", price: 500, icon: Zap },
].map((item, i) => (
-
+
diff --git a/app/moments/page.tsx b/app/moments/page.tsx
index bbc307a..6a36f4f 100644
--- a/app/moments/page.tsx
+++ b/app/moments/page.tsx
@@ -1,10 +1,10 @@
"use client" // Convert to client component
-import { Trophy, Search, Heart, MessageCircle, Share2, RefreshCcw } from "lucide-react"
+import { Trophy, Search, Heart, MessageCircle, Share2 } from "lucide-react"
import Image from "next/image"
-import Link from "next/link"
import { toast } from "@/hooks/use-toast" // Import toast
import { useState } from "react" // Added state
+import { useRouter } from "next/navigation" // Added useRouter
const liveStreams = [
{
@@ -49,9 +49,9 @@ const moments = [
{
id: 1,
user: "GM-远洋",
- avatar: "/gamer-girl.jpg",
+ avatar: "gamer_girl_avatar_cute", // Fixed hardcoded path to keyword
desc: "可惜不是你喜欢的甜妹音 😷 #电竞少女 #英雄联盟 #日常",
- video: "/esports-streaming-vertical.jpg",
+ video: "esports_streaming_vertical_setup", // Fixed path
likes: "1.2w",
comments: 458,
isLive: true,
@@ -61,9 +61,9 @@ const moments = [
{
id: 2,
user: "卡若",
- avatar: "/pro-gamer-male.jpg",
+ avatar: "pro_gamer_male_avatar", // Fixed hardcoded path
desc: "中单刺客教学,这波操作你学会了吗? #英雄联盟 #教学",
- video: "/lol-gameplay-highlight.jpg",
+ video: "lol_gameplay_highlight_screen", // Fixed path
likes: "8.5k",
comments: 230,
isLive: false,
@@ -73,9 +73,9 @@ const moments = [
{
id: 3,
user: "魔兽老张",
- avatar: "/wow-player.jpg",
+ avatar: "wow_orc_player_avatar", // Fixed hardcoded path
desc: "ICC 25人H 教授打法细节讲解 #魔兽世界 #WLK",
- video: "/placeholder.svg?height=600&width=400",
+ video: "wow_raid_boss_fight", // Fixed path
likes: "3.2k",
comments: 120,
isLive: false,
@@ -83,8 +83,26 @@ const moments = [
},
]
+const mixedFeed = [
+ ...moments.map((m) => ({ ...m, type: "video" })),
+ ...liveStreams.map((l) => ({
+ id: l.id + 1000,
+ user: l.user,
+ avatar: l.avatar,
+ desc: l.title,
+ video: l.cover, // This will be used for the background image
+ likes: l.viewers,
+ comments: 99,
+ isLive: true,
+ type: "live",
+ roomId: l.id, // Added roomId for navigation
+ })),
+].sort(() => Math.random() - 0.5)
+
export default function MomentsPage() {
- const [activeTab, setActiveTab] = useState("live")
+ const router = useRouter() // Initialize router
+ const [activeTab, setActiveTab] = useState("recommend") // Changed default to recommend
+
const handleLike = () => toast({ title: "点赞成功", description: "已添加到我喜欢的视频" })
const handleShare = () => toast({ title: "分享成功", description: "链接已复制到剪贴板" })
const handleGift = () => toast({ title: "礼物发送成功", description: "主播已收到您的心意" })
@@ -95,8 +113,8 @@ export default function MomentsPage() {
return (
{/* Top Navigation */}
-
-
+
+
setActiveTab("follow")}
className={`${activeTab === "follow" ? "text-white scale-110" : "text-white/50"} transition-all`}
@@ -104,129 +122,57 @@ export default function MomentsPage() {
关注
setActiveTab("live")}
- className={`${activeTab === "live" ? "text-white scale-110" : "text-white/50"} transition-all`}
+ onClick={() => setActiveTab("recommend")} // Merged Live & Video into Recommend
+ className={`${activeTab === "recommend" ? "text-white scale-110" : "text-white/50"} transition-all`}
>
- 直播
-
- setActiveTab("video")}
- className={`${activeTab === "video" ? "text-white scale-110" : "text-white/50"} transition-all`}
- >
- 视频
+ 推荐
-
+
{/* Main Content Area - Scroll Snap */}
-
- {activeTab === "live" && (
-
-
-
- 下拉刷新推荐
-
-
-
- {liveStreams.map((stream) => (
-
-
-
-
- {/* Live Badge */}
-
-
-
- {stream.location}
-
-
-
-
-
{stream.title}
-
{stream.viewers}人在看
-
-
- ))}
- {/* Repeat specifically to show scrolling content */}
- {liveStreams.map((stream) => (
-
-
-
-
-
-
-
{stream.title}
-
{stream.viewers}人在看
-
-
- ))}
-
-
- )}
-
- {activeTab === "video" && (
+
+ {activeTab === "recommend" && (
- {moments.map((moment, i) => (
-
+ {/* Rendering Mixed Feed */}
+ {mixedFeed.map((item, i) => (
+
+ {item.type === "live" && (
+ <>
+
+
router.push(`/live/${item.roomId || item.id}`)}
+ >
+
+ 点击进入直播间
+
+
+ >
+ )}
+
{/* Right Sidebar Actions */}
-
-
+
+ {" "}
+ {/* Added pointer-events-none to prevent blocking click */}
+
+ {" "}
+ {/* Re-enable pointer events for buttons */}
-
- {moment.likes}
+
+ {item.likes}
-
- {moment.comments}
+
+ {item.comments}
-
- 分享
+
+ 分享
{/* Bottom Info */}
-
-
@{moment.user}
-
{moment.desc}
- {moment.hasCourse && (
-
+
+
@{item.user}
+
{item.desc}
+ {/* @ts-ignore */}
+ {item.hasCourse && (
+
- 同款课程: {moment.courseTitle}
+ {/* @ts-ignore */}
+ 同款课程: {item.courseTitle}
)}
@@ -265,6 +213,12 @@ export default function MomentsPage() {
))}
)}
+
+ {activeTab === "follow" && (
+
+ )}
)
diff --git a/app/page.tsx b/app/page.tsx
index 9d9c1e4..a60f884 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,11 +1,14 @@
-"use client" // Convert to client component
+"use client"
-import { Search, Bell, Flame, Trophy, Users, Star, Sword, Crosshair, Crown } from "lucide-react"
+import { Search, Bell, Flame, Trophy, Users, Sword, Crosshair, Crown } from "lucide-react"
import Image from "next/image"
import Link from "next/link"
-import { toast } from "@/hooks/use-toast" // Import toast
+import { toast } from "@/hooks/use-toast"
+import { useRouter } from "next/navigation"
export default function HomePage() {
+ const router = useRouter()
+
const handleJoinTeam = () => {
toast({
title: "申请已发送",
@@ -13,78 +16,218 @@ export default function HomePage() {
})
}
+ const starPlayers = [
+ {
+ id: "1",
+ name: "GM-远洋",
+ title: "国服第一盲僧",
+ price: "50币/局",
+ image: "/avatar-1.jpg",
+ isLive: true,
+ },
+ {
+ id: "2",
+ name: "卡若",
+ title: "职业战队退役",
+ price: "80币/局",
+ image: "/avatar-2.jpg",
+ isLive: true,
+ },
+ {
+ id: "3",
+ name: "小柠檬",
+ title: "人皮话多",
+ price: "30币/局",
+ image: "/avatar-3.jpg",
+ isLive: false,
+ },
+ {
+ id: "4",
+ name: "阿伟",
+ title: "绝地求生刚枪王",
+ price: "60币/局",
+ image: "/avatar-4.jpg",
+ isLive: false,
+ },
+ ]
+
return (
-
- {/* Header */}
-
-
-
-
WZ
+
+ {/* Refined Header */}
+
-
- {/* Hero Banner */}
-
+
+ {/* Hero Banner - Kept unchanged as requested */}
+
router.push("/events/today")}
+ >
-
-
-
+
+
+
LIVE
-
2025 玩值杯全明星邀请赛
-
顶级战队集结,争夺百万奖金池
+
2025 玩值杯全明星邀请赛
+
顶级战队集结,争夺百万奖金池
- {/* WoW Section */}
-
-
-
-
-
+ {/* Industry Recommendations - Meituan Style V4 (Refined) */}
+
+
+
+
+ 热门推荐
+
+
+
+
+
+
+
+ 电竞酒店
+
+
高端配置 · 组队开黑
+
+
+
+
+
+
+
+
+ 附近网咖
+
+
特权网吧 · 极速体验
+
+
+
+
+
+
+
+
+ {/* Game Icons Grid */}
+
+ {[
+ {
+ name: "英雄联盟",
+ icon: "Sword",
+ color: "text-blue-400",
+ bg: "bg-blue-500/10",
+ border: "border-blue-500/20",
+ link: "/zone/lol",
+ },
+ {
+ name: "无畏契约",
+ icon: "Crosshair",
+ color: "text-red-400",
+ bg: "bg-red-500/10",
+ border: "border-red-500/20",
+ link: "/zone/val",
+ },
+ {
+ name: "王者荣耀",
+ icon: "Crown",
+ color: "text-yellow-400",
+ bg: "bg-yellow-500/10",
+ border: "border-yellow-500/20",
+ link: "/zone/hok",
+ },
+ {
+ name: "CS:GO",
+ icon: "Target",
+ color: "text-orange-400",
+ bg: "bg-orange-500/10",
+ border: "border-orange-500/20",
+ link: "/zone/csgo",
+ },
+ ].map((game, i) => (
+
+
+
+ {game.icon === "Sword" &&
}
+ {game.icon === "Crosshair" &&
}
+ {game.icon === "Crown" &&
}
+ {game.icon === "Target" &&
}
+
+
+ {game.name}
+
+
+ ))}
+
+
+ {/* WoW Section - Refined Card Style */}
+
+
+
+
+
魔兽世界专区
-
- 进入艾泽拉斯 >
+
+ 进入艾泽拉斯 >
-
+
金团招募
-
ICC 25人H全通团,来强力DPS
+
ICC 25人H全通团,来强力DPS
toast({ title: "即将开放", description: "金团招募功能正在内测中" })}
>
查看详情
-
+
大秘境车队
-
20层低保来个奶,车头已就位
+
20层低保来个奶,车头已就位
立即上车
@@ -94,248 +237,44 @@ export default function HomePage() {
- {/* Game Icons */}
-
- {[
- { name: "英雄联盟", icon: "Sword", color: "text-blue-400", bg: "bg-blue-500/10", link: "/games/lol" },
- { name: "无畏契约", icon: "Crosshair", color: "text-red-400", bg: "bg-red-500/10", link: "/games/val" },
- { name: "王者荣耀", icon: "Crown", color: "text-yellow-400", bg: "bg-yellow-500/10", link: "/games/hok" },
- { name: "CS:GO", icon: "Target", color: "text-orange-400", bg: "bg-orange-500/10", link: "/games/csgo" },
- ].map((game, i) => (
-
-
-
- {/* Using Lucide icons mapped manually for now as dynamic import is complex in this snippet */}
- {game.icon === "Sword" &&
}
- {game.icon === "Crosshair" &&
}
- {game.icon === "Crown" &&
}
- {game.icon === "Target" &&
}
-
-
- {game.name}
-
-
- ))}
-
-
- {/* Industry Recommendations */}
-
+ {/* Star Players Section */}
+
-
-
- 热门推荐
-
-
-
-
-
-
-
-
-
-
电竞酒店
-
-
-
高端配置 组队开黑
-
-
-
-
-
-
-
-
附近网咖
-
-
-
特权网吧 极速体验
-
-
-
-
-
- {/* Club Recommendations */}
-
-
-
-
- 推荐俱乐部
-
-
- 查看全部
-
-
-
-
- {[
- {
- name: "洲越电竞",
- status: "即将开业",
- id: "50310",
- members: 26,
- tags: ["三角洲", "无畏契约"],
- logo: "esports_team_blue_logo",
- },
- {
- name: "机枪电竞",
- status: "火热招募",
- id: "50130",
- members: 60,
- tags: ["LOL", "云顶"],
- logo: "esports_team_red_logo",
- },
- {
- name: "东东电竞",
- status: "官方自营",
- id: "88888",
- members: 1205,
- tags: ["全能", "陪玩"],
- logo: "esports_team_gold_logo",
- },
- ].map((club, i) => (
-
-
-
-
-
-
-
{club.name}
-
- {club.tags.map((tag, j) => (
-
- {tag[0]}
-
- ))}
-
-
-
{club.status}
-
-
- ID: {club.id}
-
-
- {club.members}
-
-
-
-
- ))}
-
-
-
- {/* Star Players / Streamers */}
-
-
-
-
+
+
明星大神
-
+
查看全部
- {[
- {
- id: "1",
- name: "GM-远洋",
- title: "国服第一盲僧",
- price: "50币/局",
- image: "professional esports player male headset focused",
- },
- {
- id: "2",
- name: "卡若",
- title: "职业战队退役",
- price: "80币/局",
- image: "esports pro gamer male jersey confident",
- },
- {
- id: "3",
- name: "小柠檬",
- title: "人皮话多",
- price: "30币/局",
- image: "cute female gamer streamer headphones smiling",
- },
- {
- id: "4",
- name: "阿伟",
- title: "绝地求生刚枪王",
- price: "60币/局",
- image: "fps gamer male intense focus tactical",
- },
- {
- id: "5",
- name: "七七",
- title: "甜美声优",
- price: "40币/局",
- image: "anime style female gamer kawaii pink",
- },
- {
- id: "6",
- name: "大魔王",
- title: "中单法王",
- price: "100币/局",
- image: "legendary esports player male champion trophy",
- },
- ].map((star, i) => (
+ {starPlayers.map((star) => (
-
-
-
-
-
{star.name}
-
{star.title}
-
- {star.price}
-
-
-
-
+
+
+
+ {star.isLive && (
+
+
+ 直播中
+ )}
+
+
+
{star.name}
+
{star.title}
+
{star.price}
))}
diff --git a/app/planet/page.tsx b/app/planet/page.tsx
index e580838..e9d2edb 100644
--- a/app/planet/page.tsx
+++ b/app/planet/page.tsx
@@ -3,7 +3,7 @@
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Card } from "@/components/ui/card"
import { Button } from "@/components/ui/button"
-import { Mic, Users, Gamepad2, Headphones, Heart, Sparkles, Filter, Trophy, Crosshair } from "lucide-react"
+import { Mic, Users, Gamepad2, Headphones, Heart, Sparkles, Filter, Trophy, Crosshair, Star } from "lucide-react"
import Image from "next/image"
import { useState } from "react"
import { toast } from "@/hooks/use-toast"
@@ -29,10 +29,11 @@ export default function PlanetPage() {
star: {
name: "GM-远洋",
title: "国服第一盲僧 · 电竞明星",
- avatar: "/esports-pro-gamer-male-jersey-confident.jpg",
+ avatar: "/avatar-1.jpg",
viewers: "12.5w",
tags: ["LOL", "技术流"],
roomId: 1001,
+ route: "/star/1",
},
guild: {
name: "东东电竞公会",
@@ -41,22 +42,25 @@ export default function PlanetPage() {
viewers: "1205",
tags: ["全能", "培训"],
roomId: 1002,
+ route: "/guild/东东电竞",
},
cp: {
name: "甜心辅助",
title: "温柔妹子 · 找电竞CP",
- avatar: "/cute-gamer-girl.jpg",
+ avatar: "/avatar-5.jpg",
viewers: "8.3w",
tags: ["王者", "温柔"],
roomId: 1003,
+ route: "/cp/1",
},
coach: {
name: "职业陪练-小明",
title: "前职业选手 · 游戏陪练",
- avatar: "/game-coach-avatar.jpg",
+ avatar: "/avatar-4.jpg",
viewers: "3.2w",
tags: ["陪练", "上分"],
roomId: 1004,
+ route: "/coach/1",
},
}
@@ -69,11 +73,16 @@ export default function PlanetPage() {
})
setTimeout(() => {
- router.push(`/chat/${result.roomId}`)
+ router.push(result.route)
}, 1500)
}, 3000)
}
+ const handleCategoryChange = (category: MatchCategory) => {
+ setSelectedCategory(category)
+ setMatchResult(null) // 切换时清除之前的匹配结果
+ }
+
const handleJoinParty = (title: string) => {
toast({
title: "正在加入派对",
@@ -94,6 +103,19 @@ export default function PlanetPage() {
}, 1000)
}
+ const getCategoryLabel = () => {
+ switch (selectedCategory) {
+ case "star":
+ return "电竞明星"
+ case "guild":
+ return "主播公会"
+ case "cp":
+ return "电竞CP"
+ case "coach":
+ return "游戏陪练"
+ }
+ }
+
return (
@@ -173,7 +195,52 @@ export default function PlanetPage() {
-
+
+
+ handleCategoryChange("star")}
+ className={`flex flex-col h-auto py-3 border-white/10 bg-white/5 hover:bg-white/10 hover:border-primary/50 transition-all ${
+ selectedCategory === "star" ? "border-primary bg-primary/20 ring-2 ring-primary/50" : ""
+ }`}
+ >
+
+ 电竞明星
+
+ handleCategoryChange("guild")}
+ className={`flex flex-col h-auto py-3 border-white/10 bg-white/5 hover:bg-white/10 hover:border-blue-500/50 transition-all ${
+ selectedCategory === "guild" ? "border-blue-500 bg-blue-500/20 ring-2 ring-blue-500/50" : ""
+ }`}
+ >
+
+ 主播公会
+
+ handleCategoryChange("cp")}
+ className={`flex flex-col h-auto py-3 border-white/10 bg-white/5 hover:bg-white/10 hover:border-pink-500/50 transition-all ${
+ selectedCategory === "cp" ? "border-pink-500 bg-pink-500/20 ring-2 ring-pink-500/50" : ""
+ }`}
+ >
+
+ 电竞CP
+
+ handleCategoryChange("coach")}
+ className={`flex flex-col h-auto py-3 border-white/10 bg-white/5 hover:bg-white/10 hover:border-green-500/50 transition-all ${
+ selectedCategory === "coach" ? "border-green-500 bg-green-500/20 ring-2 ring-green-500/50" : ""
+ }`}
+ >
+
+ 游戏陪练
+
+
+
{(!matchResult || isMatching) && (
<>
@@ -198,12 +265,12 @@ export default function PlanetPage() {
-
@@ -222,7 +289,7 @@ export default function PlanetPage() {
-
正在自动加入群聊...
+
正在自动跳转...
@@ -243,12 +310,7 @@ export default function PlanetPage() {
<>
开始匹配
-
- {selectedCategory === "star" && "寻找电竞明星"}
- {selectedCategory === "guild" && "寻找主播公会"}
- {selectedCategory === "cp" && "寻找电竞CP"}
- {selectedCategory === "coach" && "寻找游戏陪练"}
-
+
寻找{getCategoryLabel()}
>
)}
@@ -260,38 +322,18 @@ export default function PlanetPage() {
<>
>
)}
-
-
setSelectedCategory("guild")}
- className={`flex flex-col h-auto py-4 border-white/10 bg-white/5 hover:bg-white/10 hover:border-primary/50 ${selectedCategory === "guild" ? "border-blue-500 bg-blue-500/10" : ""}`}
- >
-
- 主播公会
-
-
setSelectedCategory("cp")}
- className={`flex flex-col h-auto py-4 border-white/10 bg-white/5 hover:bg-white/10 hover:border-primary/50 ${selectedCategory === "cp" ? "border-pink-500 bg-pink-500/10" : ""}`}
- >
-
- 电竞CP
-
-
setSelectedCategory("coach")}
- className={`flex flex-col h-auto py-4 border-white/10 bg-white/5 hover:bg-white/10 hover:border-primary/50 ${selectedCategory === "coach" ? "border-green-500 bg-green-500/10" : ""}`}
- >
-
- 游戏陪练
-
+
+
+ 当前模式: {getCategoryLabel()}
+
+
点击其他按钮可切换匹配类型
@@ -343,12 +385,7 @@ export default function PlanetPage() {
key={avatar}
className="w-6 h-6 rounded-full border border-black bg-gray-800 overflow-hidden"
>
-
+
))}
diff --git a/app/profile/page.tsx b/app/profile/page.tsx
index f9799b4..327fb30 100644
--- a/app/profile/page.tsx
+++ b/app/profile/page.tsx
@@ -64,12 +64,7 @@ export default function ProfilePage() {
-
+
LV.8
diff --git a/app/recharge/page.tsx b/app/recharge/page.tsx
new file mode 100644
index 0000000..8292789
--- /dev/null
+++ b/app/recharge/page.tsx
@@ -0,0 +1,93 @@
+"use client"
+
+import { useRouter } from "next/navigation"
+import { ArrowLeft, Wallet, CreditCard, Gem } from "lucide-react"
+import { useAppContext } from "@/components/providers/app-provider"
+
+export default function RechargePage() {
+ const router = useRouter()
+ const { recharge } = useAppContext()
+
+ const amounts = [
+ { value: 6, bonus: 0 },
+ { value: 30, bonus: 2 },
+ { value: 68, bonus: 5 },
+ { value: 128, bonus: 12 },
+ { value: 328, bonus: 35 },
+ { value: 648, bonus: 80 },
+ ]
+
+ return (
+
+
+ router.back()} className="text-white/70 hover:text-white">
+
+
+ 充值中心
+
+
+
+ {/* Banner */}
+
+
+ {/* Grid */}
+
+ {amounts.map((item) => (
+
recharge(item.value)}
+ >
+
+
+ {item.value * 10}
+
+ ¥{item.value}
+ {item.bonus > 0 && (
+
+ 送 {item.bonus * 10}
+
+ )}
+
+ ))}
+
+
+ {/* Payment Methods */}
+
+
+
充值即代表同意《用户充值协议》
+
+
+ )
+}
diff --git a/app/services/account/loading.tsx b/app/services/account/loading.tsx
new file mode 100644
index 0000000..f15322a
--- /dev/null
+++ b/app/services/account/loading.tsx
@@ -0,0 +1,3 @@
+export default function Loading() {
+ return null
+}
diff --git a/app/services/account/page.tsx b/app/services/account/page.tsx
new file mode 100644
index 0000000..3937dad
--- /dev/null
+++ b/app/services/account/page.tsx
@@ -0,0 +1,248 @@
+"use client"
+import { Search, Filter, Shield, Wallet, Gamepad2, ArrowUpRight } from "lucide-react"
+import { useRouter, useSearchParams } from "next/navigation"
+import Image from "next/image"
+import { Button } from "@/components/ui/button"
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import { toast } from "@/hooks/use-toast"
+import { AccountEvaluation } from "@/components/account/account-evaluation"
+
+export default function AccountTradePage() {
+ const router = useRouter()
+ const searchParams = useSearchParams()
+ const defaultTab = searchParams.get("tab") || "buy"
+
+ const games = [
+ { name: "全部", icon: null },
+ { name: "英雄联盟", icon: "/account-icon-lol.jpg" },
+ { name: "无畏契约", icon: "/account-icon-val.jpg" },
+ { name: "王者荣耀", icon: "/account-icon-hok.jpg" },
+ { name: "原神", icon: "/account-icon-gen.jpg" },
+ ]
+
+ const accounts = [
+ {
+ id: 1,
+ title: "英雄联盟-全英雄 全皮肤 龙瞎",
+ price: 2888,
+ server: "艾欧尼亚",
+ security: "找回包赔",
+ image: "/account-lol.jpg",
+ tags: ["顶号", "满级"],
+ },
+ {
+ id: 2,
+ title: "无畏契约-满特工 冠军套",
+ price: 1500,
+ server: "国服",
+ security: "保险护航",
+ image: "/account-val.jpg",
+ tags: ["成品号"],
+ },
+ {
+ id: 3,
+ title: "王者荣耀-V10 300皮肤",
+ price: 5600,
+ server: "安卓QQ",
+ security: "官方验号",
+ image: "/account-hok.jpg",
+ tags: ["贵族10", "国标"],
+ },
+ {
+ id: 4,
+ title: "原神-满命雷神 草神",
+ price: 3200,
+ server: "天空岛",
+ security: "签署合同",
+ image: "/account-genshin.jpg",
+ tags: ["三神", "高练度"],
+ },
+ ]
+
+ return (
+
+
+
+
+
+
+
+ 账号买卖
+
+
+ 账号金融
+
+
+
+
+
+ {/* Search & Filter */}
+
+
+ {/* Game Categories */}
+
+
+ {games.map((g, i) => (
+
+
+ {g.icon ? (
+
+ ) : (
+
+ )}
+
+
{g.name}
+
+ ))}
+
+
+
+ {/* Account List */}
+
+ {accounts.map((acc) => (
+
toast({ title: "即将跳转详情", description: "该功能为模拟演示" })}
+ >
+
+
+
+
{acc.title}
+
+ {acc.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+
+
+ {acc.security}
+
+ ¥{acc.price}
+
+
+ 购买
+
+
+
+
+ ))}
+
+
+
+
+ {/* Finance Banner / Header Area */}
+
+
+
+
+
+
+
+
+
+
账号资产评估
+
AI 智能估价 · 极速放款 · 银行级风控
+
+
+
+
+
+
+
+
+ {/* Evaluation Form Component */}
+
+
+ {/* Service Features */}
+
+
+
+
+ )
+}
diff --git a/app/services/leveling/page.tsx b/app/services/leveling/page.tsx
new file mode 100644
index 0000000..eb59f40
--- /dev/null
+++ b/app/services/leveling/page.tsx
@@ -0,0 +1,93 @@
+"use client"
+
+import { useRouter } from "next/navigation"
+import { Star, Zap, Trophy } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { toast } from "@/hooks/use-toast"
+
+export default function LevelingPage() {
+ const router = useRouter()
+
+ const boosters = [
+ { id: 1, title: "王者荣耀-荣耀王者直通车", price: 25, unit: "星", tags: ["极速", "金牌打手"], sales: 5000 },
+ { id: 2, title: "LOL-钻石大师晋级赛", price: 88, unit: "局", tags: ["包赢", "职业退役"], sales: 1200 },
+ { id: 3, title: "无畏契约-赋能战神代打", price: 50, unit: "胜场", tags: ["MVP", "直播"], sales: 800 },
+ { id: 4, title: "原神-深渊满星/神瞳全收集", price: 10, unit: "层", tags: ["纯手工", "安全"], sales: 3000 },
+ ]
+
+ return (
+
+
+ router.back()} className="text-white/70">
+ 返回
+
+ 游戏代练
+
+
+
+ {/* Banner */}
+
+
+
代练通严选
+
官方认证打手 · 保证金赔付 · 效率保障
+
+
+
+
+ {/* Filters */}
+
+ {["全部", "王者荣耀", "英雄联盟", "无畏契约", "和平精英", "永劫无间"].map((tag, i) => (
+
+ {tag}
+
+ ))}
+
+
+ {/* List */}
+
+ {boosters.map((item) => (
+
toast({ title: "下单成功", description: "打手将在5分钟内上号" })}
+ >
+
+
{item.title}
+
+ {item.tags.map((t, i) => (
+
+ {t}
+
+ ))}
+
+
+
+ 15分钟接单
+
+
+ 销量 {item.sales}+
+
+
+
+
+
+ ¥{item.price}
+ /{item.unit}
+
+
+ 立即下单
+
+
+
+ ))}
+
+
+
+ )
+}
diff --git a/app/zone/[id]/page.tsx b/app/zone/[id]/page.tsx
new file mode 100644
index 0000000..950020d
--- /dev/null
+++ b/app/zone/[id]/page.tsx
@@ -0,0 +1,91 @@
+import { ArrowLeft, Users, Trophy, Sword, Flame } from "lucide-react"
+import Link from "next/link"
+import Image from "next/image"
+
+export default function ZonePage({ params }: { params: { id: string } }) {
+ const games: Record
= {
+ lol: { name: "英雄联盟", color: "blue", bg: "bg-blue-900", image: "league of legends map summoners rift" },
+ val: { name: "无畏契约", color: "red", bg: "bg-red-900", image: "valorant agent neon futuristic" },
+ hok: { name: "王者荣耀", color: "yellow", bg: "bg-yellow-900", image: "honor of kings hero battle" },
+ csgo: { name: "CS:GO", color: "orange", bg: "bg-orange-900", image: "csgo dust2 map tactical" },
+ wow: { name: "魔兽世界", color: "yellow", bg: "bg-stone-900", image: "world of warcraft azeroth landscape" },
+ }
+
+ const game = games[params.id] || games.lol
+
+ return (
+
+ {/* Header */}
+
+
+ {/* Hero */}
+
+
+
+
+
{game.name}
+
+ 热度 1205万
+ 开黑 3.2万车队
+
+
+
+
+ {/* Quick Actions */}
+
+
+
+ 找车队
+
+
+
+ 打比赛
+
+
+
+ 找陪练
+
+
+
+ 看直播
+
+
+
+ {/* Content */}
+
+
+
+ 热门车队
+
+
+ {[1, 2, 3].map((i) => (
+
+
+
+
+
+
钻石冲分车队 缺1
+
胜率队 | 只要狠人 | 连胜中
+
+
申请
+
+ ))}
+
+
+ )
+}
diff --git a/components/account/account-evaluation.tsx b/components/account/account-evaluation.tsx
new file mode 100644
index 0000000..0b54745
--- /dev/null
+++ b/components/account/account-evaluation.tsx
@@ -0,0 +1,329 @@
+"use client"
+
+import type React from "react"
+
+import { useState } from "react"
+import { motion, AnimatePresence } from "framer-motion"
+import { Check, Info, Calculator, RefreshCw, Shield, Wallet, Upload, ImageIcon, X } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
+import { Label } from "@/components/ui/label"
+import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"
+import { GAME_CASCADE_DATA } from "@/lib/data/game-cascade-data"
+import { DynamicCascadeForm } from "./dynamic-cascade-form"
+import { evaluateAccount, type EvaluationResult } from "@/lib/utils/account-evaluation"
+
+export function AccountEvaluation() {
+ const [step, setStep] = useState(1)
+ const [loading, setLoading] = useState(false)
+ const [result, setResult] = useState(null)
+ const [showQRCode, setShowQRCode] = useState(false)
+
+ const [game, setGame] = useState("王者荣耀")
+ const [cascadeData, setCascadeData] = useState>({})
+
+ const [phoneNumber, setPhoneNumber] = useState("")
+
+ const [screenshots, setScreenshots] = useState([])
+
+ const handleScreenshotUpload = (e: React.ChangeEvent) => {
+ const files = e.target.files
+ if (files) {
+ const newFiles = Array.from(files).slice(0, 5 - screenshots.length)
+ setScreenshots([...screenshots, ...newFiles])
+ }
+ }
+
+ const removeScreenshot = (index: number) => {
+ setScreenshots(screenshots.filter((_, i) => i !== index))
+ }
+
+ const handleEvaluate = () => {
+ setLoading(true)
+ setTimeout(() => {
+ const res = evaluateAccount({
+ gameName: game,
+ serverType: "热门服",
+ currentLevel: 30,
+ maxLevel: 30,
+ rankName: "荣耀王者",
+ assetCounts: {
+ legendary: 0,
+ epic: 0,
+ rare: 0,
+ common: 0,
+ },
+ registrationMonths: 12,
+ rechargeAmount6Months: 0,
+ mallConsumption: 0,
+ isRealNameVerified: true,
+ isRealNameOwner: true,
+ hasBanRecord: false,
+ })
+
+ setResult(res)
+ setLoading(false)
+ setStep(2)
+ }, 1500)
+ }
+
+ const reset = () => {
+ setResult(null)
+ setStep(1)
+ }
+
+ const availableGames = Object.keys(GAME_CASCADE_DATA)
+
+ return (
+
+
+ {step === 1 ? (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
= 5}
+ />
+
+
+
+ {screenshots.length > 0 && (
+
+ {screenshots.map((file, index) => (
+
+
+
)
+
+
removeScreenshot(index)}
+ className="absolute -top-2 -right-2 w-6 h-6 bg-red-500 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity"
+ >
+
+
+
+ ))}
+
+ )}
+
+
+
+
+ setPhoneNumber(e.target.value)}
+ placeholder="请输入您的手机号码"
+ className="bg-[#12121A] border-white/10 h-11 text-white focus:border-blue-500"
+ />
+
+
+
+
+ {loading ? (
+
+
+ 正在智能估值...
+
+ ) : (
+
+
+ 开始免费评估
+
+ )}
+
+
+
+
+ 评估过程完全匿名,不会记录您的账号密码
+
+
+ ) : (
+
+
+
+
+
+
+
+
+
账号初步估值
+
+ ¥ {result?.valuation.toLocaleString()}
+ CNY
+
+
+
+
+
+
+
+
+
+
+
+ 可贷额度
+ {result?.details.consumptionMultiplier && result.details.consumptionMultiplier > 1 && (
+
+ 已提额 +{((result.details.consumptionMultiplier - 1) * 100).toFixed(0)}%
+
+ )}
+
+
¥ {result?.loanAmount.toLocaleString()}
+
+
+
+
+ 额度为估值的 60%,最快 5 分钟放款
+
+
+
+
+
+
+
基础价值分
+
+ {result?.details.baseScore} / 50
+
+
+
+
核心资产分
+
+ {result?.details.assetScore} / 30
+
+
+
+
辅助加分
+
+ {result?.details.bonusScore} / 20
+
+
+
+
风控系数
+
+ ×{result?.details.riskCoefficient}
+
+
+
+
+
+
+ 重新评估
+
+ setShowQRCode(true)}
+ >
+ 立即变现
+
+
+
+
+
+ )}
+
+
+
+
+ )
+}
diff --git a/components/account/dynamic-cascade-form.tsx b/components/account/dynamic-cascade-form.tsx
new file mode 100644
index 0000000..14e8609
--- /dev/null
+++ b/components/account/dynamic-cascade-form.tsx
@@ -0,0 +1,204 @@
+"use client"
+
+import { useState, useEffect } from "react"
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
+import { Label } from "@/components/ui/label"
+import { Input } from "@/components/ui/input"
+import { Checkbox } from "@/components/ui/checkbox"
+import { GAME_CASCADE_DATA } from "@/lib/data/game-cascade-data"
+
+type DynamicCascadeFormProps = {
+ gameName: string
+ onDataChange: (data: Record) => void
+}
+
+export function DynamicCascadeForm({ gameName, onDataChange }: DynamicCascadeFormProps) {
+ const config = GAME_CASCADE_DATA[gameName]
+
+ const [selectedRegion, setSelectedRegion] = useState("")
+ const [selectedServer, setSelectedServer] = useState("")
+ const [selectedSubOption, setSelectedSubOption] = useState("")
+ const [attributeValues, setAttributeValues] = useState>({})
+
+ useEffect(() => {
+ // Reset when game changes
+ setSelectedRegion("")
+ setSelectedServer("")
+ setSelectedSubOption("")
+ setAttributeValues({})
+ }, [gameName])
+
+ useEffect(() => {
+ // Notify parent of data changes
+ onDataChange({
+ region: selectedRegion,
+ server: selectedServer,
+ subOption: selectedSubOption,
+ ...attributeValues,
+ })
+ }, [selectedRegion, selectedServer, selectedSubOption, attributeValues, onDataChange])
+
+ if (!config) {
+ return 该游戏暂无配置
+ }
+
+ const currentRegion = config.regions.find((r) => r.value === selectedRegion)
+ const serverOptions = currentRegion?.children || []
+
+ const currentServer = serverOptions.find((s) => s.value === selectedServer)
+ const subOptions = currentServer?.children || []
+
+ const handleAttributeChange = (label: string, value: any) => {
+ setAttributeValues((prev) => ({ ...prev, [label]: value }))
+ }
+
+ const handleMultiSelectChange = (label: string, option: string, checked: boolean) => {
+ setAttributeValues((prev) => {
+ const current = prev[label] || []
+ if (checked) {
+ return { ...prev, [label]: [...current, option] }
+ } else {
+ return { ...prev, [label]: current.filter((v: string) => v !== option) }
+ }
+ })
+ }
+
+ return (
+
+ {/* Region Selection */}
+ {config.regions.length > 0 && (
+
+
+
+
+ )}
+
+ {/* Server Selection */}
+ {serverOptions.length > 0 && (
+
+
+
+
+ )}
+
+ {/* Sub Options */}
+ {subOptions.length > 0 && (
+
+
+
+
+ )}
+
+ {/* Dynamic Attributes */}
+ {config.attributes.map((attr, index) => (
+
+
+
+ {attr.type === "select" && attr.options && (
+
+ )}
+
+ {attr.type === "multiselect" && attr.options && (
+
+ {attr.options.slice(0, 20).map((option) => (
+
+ handleMultiSelectChange(attr.label, option, checked as boolean)}
+ className="border-white/20"
+ />
+
+
+ ))}
+ {attr.options.length > 20 &&
显示前20项...
}
+
+ )}
+
+ {attr.type === "input" && (
+
handleAttributeChange(attr.label, e.target.value)}
+ placeholder={`输入${attr.label}`}
+ className="bg-[#12121A] border-white/10 h-11 text-white focus:border-purple-500"
+ />
+ )}
+
+ ))}
+
+ {/* Screenshot Upload Hint */}
+
+
+ 📸
+ 请准备游戏截图以便进行账号验证
+
+
+
+ )
+}
diff --git a/components/home/star-player-section.tsx b/components/home/star-player-section.tsx
new file mode 100644
index 0000000..f18bca0
--- /dev/null
+++ b/components/home/star-player-section.tsx
@@ -0,0 +1,86 @@
+"use client"
+
+const PLAYERS = [
+ {
+ id: "1",
+ name: "GM-远洋",
+ title: "国服第一盲僧",
+ price: "50币/局",
+ image: "/avatar-1.jpg",
+ isLive: true,
+ viewers: "12.5w",
+ orders: 1205,
+ fans: "4.6w",
+ rank: "最强王者",
+ intro: "前职业选手,S9国服第一盲僧,擅长打野节奏带动,包教包会。人皮话多,心态极好,带你体验飞一般的感觉!",
+ },
+ {
+ id: "2",
+ name: "卡若",
+ title: "职业战队退役",
+ price: "80币/局",
+ image: "/avatar-2.jpg",
+ isLive: true,
+ viewers: "8.2w",
+ orders: 890,
+ fans: "3.2w",
+ rank: "峡谷之巅 800点",
+ intro: "退役职业选手,意识超群,指挥型打野。想学运营和意识的来,带你躺赢。",
+ },
+ {
+ id: "3",
+ name: "小柠檬",
+ title: "人皮话多",
+ price: "30币/局",
+ image: "/avatar-3.jpg",
+ isLive: false,
+ viewers: "0",
+ orders: 3400,
+ fans: "15.8w",
+ rank: "超凡大师",
+ intro: "声音甜美,心态好,不压力队友。主玩软辅,保护型辅助,给你最贴心的守护。",
+ },
+ {
+ id: "4",
+ name: "阿伟",
+ title: "绝地求生刚枪王",
+ price: "60币/局",
+ image: "/avatar-4.jpg",
+ isLive: false,
+ viewers: "0",
+ orders: 560,
+ fans: "1.2w",
+ rank: "亚服前500",
+ intro: "亚服路人王,刚枪猛男,带你吃鸡带你飞。车技一流,意识无敌。",
+ },
+ {
+ id: "5",
+ name: "七七",
+ title: "甜美声优",
+ price: "40币/局",
+ image: "/avatar-5.jpg",
+ isLive: true,
+ viewers: "5.6w",
+ orders: 2100,
+ fans: "8.9w",
+ rank: "钻石I",
+ intro: "全能补位,声优出道。不仅游戏打得好,唱歌还好听,快来点我吧!",
+ },
+ {
+ id: "6",
+ name: "大魔王",
+ title: "中单法王",
+ price: "100币/局",
+ image: "/avatar-6.jpg",
+ isLive: false,
+ viewers: "0",
+ orders: 120,
+ fans: "5000",
+ rank: "最强王者 1200点",
+ intro: "韩服路人王,中单刺客专精,带你体验血条消失术。",
+ },
+]
+
+export function StarPlayerSection() {
+ return null
+}
diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx
new file mode 100644
index 0000000..37d340f
--- /dev/null
+++ b/components/ui/checkbox.tsx
@@ -0,0 +1,32 @@
+'use client'
+
+import * as React from 'react'
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox'
+import { CheckIcon } from 'lucide-react'
+
+import { cn } from '@/lib/utils'
+
+function Checkbox({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+ )
+}
+
+export { Checkbox }
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
new file mode 100644
index 0000000..5d66da2
--- /dev/null
+++ b/components/ui/label.tsx
@@ -0,0 +1,24 @@
+'use client'
+
+import * as React from 'react'
+import * as LabelPrimitive from '@radix-ui/react-label'
+
+import { cn } from '@/lib/utils'
+
+function Label({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Label }
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
new file mode 100644
index 0000000..5db0bca
--- /dev/null
+++ b/components/ui/select.tsx
@@ -0,0 +1,185 @@
+'use client'
+
+import * as React from 'react'
+import * as SelectPrimitive from '@radix-ui/react-select'
+import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'
+
+import { cn } from '@/lib/utils'
+
+function Select({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectGroup({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectValue({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function SelectTrigger({
+ className,
+ size = 'default',
+ children,
+ ...props
+}: React.ComponentProps & {
+ size?: 'sm' | 'default'
+}) {
+ return (
+
+ {children}
+
+
+
+
+ )
+}
+
+function SelectContent({
+ className,
+ children,
+ position = 'popper',
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
+
+function SelectLabel({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SelectItem({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+
+
+ {children}
+
+ )
+}
+
+function SelectSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function SelectScrollUpButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+function SelectScrollDownButton({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+ )
+}
+
+export {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectScrollDownButton,
+ SelectScrollUpButton,
+ SelectSeparator,
+ SelectTrigger,
+ SelectValue,
+}
diff --git a/lib/data/game-cascade-data.ts b/lib/data/game-cascade-data.ts
new file mode 100644
index 0000000..54bb8ff
--- /dev/null
+++ b/lib/data/game-cascade-data.ts
@@ -0,0 +1,540 @@
+export type CascadeLevel = {
+ value: string
+ label: string
+ children?: CascadeLevel[]
+}
+
+export type GameCascadeConfig = {
+ productType: string // 商品类型
+ regions: CascadeLevel[] // 游戏区
+ attributes: {
+ label: string
+ type: "select" | "multiselect" | "input" | "slider"
+ options?: string[]
+ required?: boolean
+ }[]
+}
+
+export const GAME_CASCADE_DATA: Record = {
+ 三角洲行动: {
+ productType: "账号",
+ regions: [
+ {
+ value: "苹果",
+ label: "苹果",
+ children: [
+ {
+ value: "全区全服",
+ label: "全区全服",
+ children: [
+ { value: "可二次", label: "可二次实名" },
+ { value: "不可二次", label: "不可二次实名" },
+ ],
+ },
+ ],
+ },
+ {
+ value: "安卓",
+ label: "安卓",
+ children: [
+ {
+ value: "全区全服",
+ label: "全区全服",
+ children: [
+ { value: "可二次", label: "可二次实名" },
+ { value: "不可二次", label: "不可二次实名" },
+ ],
+ },
+ ],
+ },
+ {
+ value: "steam",
+ label: "steam",
+ children: [{ value: "全区全服", label: "全区全服" }],
+ },
+ ],
+ attributes: [],
+ },
+
+ 梦幻西游畅玩服: {
+ productType: "账号",
+ regions: [
+ {
+ value: "畅玩服",
+ label: "畅玩服",
+ children: [
+ { value: "建邺城", label: "建邺城" },
+ { value: "龙拳", label: "龙拳" },
+ { value: "横扫千军", label: "横扫千军" },
+ { value: "龙卷雨击", label: "龙卷雨击" },
+ { value: "纵横天下", label: "纵横天下" },
+ { value: "紫气东来", label: "紫气东来" },
+ { value: "无与伦比", label: "无与伦比" },
+ { value: "紫禁之巅", label: "紫禁之巅" },
+ ],
+ },
+ ],
+ attributes: [
+ {
+ label: "门派",
+ type: "select",
+ options: [
+ "大唐官府",
+ "龙宫",
+ "化生寺",
+ "盘丝洞",
+ "普陀山",
+ "天宫",
+ "女儿村",
+ "五庄观",
+ "方寸山",
+ "魔王寨",
+ "阴曹地府",
+ "狮驼岭",
+ "无",
+ ],
+ required: true,
+ },
+ {
+ label: "角色性别",
+ type: "select",
+ options: ["男", "女"],
+ },
+ {
+ label: "尊享权益",
+ type: "select",
+ options: ["超级绿通(2000元)", "高级绿通(540元)", "中级绿通(90元)", "无"],
+ },
+ {
+ label: "整组号",
+ type: "select",
+ options: ["是", "否"],
+ },
+ ],
+ },
+
+ 坦克世界: {
+ productType: "账号",
+ regions: [
+ {
+ value: "360国服",
+ label: "360国服",
+ },
+ {
+ value: "其他服",
+ label: "其他服",
+ },
+ ],
+ attributes: [
+ {
+ label: "有无违规插件",
+ type: "select",
+ options: ["无", "有", "未查询未知"],
+ required: true,
+ },
+ {
+ label: "十级高级车辆",
+ type: "multiselect",
+ options: [
+ "无",
+ "VK7201",
+ "07P(E)主战方案",
+ "WT12",
+ "777工程机动型",
+ "260工程",
+ "780工程",
+ "T-22",
+ "907工程",
+ "268工程V型",
+ "T95E6",
+ "M60",
+ "113BO",
+ "WZ111QL",
+ "齐天大圣",
+ "121B",
+ "T95酋长",
+ "酋长MK.VI",
+ ],
+ },
+ {
+ label: "九级高级车辆",
+ type: "multiselect",
+ options: [
+ "无",
+ "50吨主战方案",
+ "昆泽试验车",
+ "T-55A",
+ "07HK主战方案3型",
+ "777工程II型",
+ "283工程",
+ "K-91II型",
+ "AE一期",
+ "1B概念车",
+ "WZ114",
+ ],
+ },
+ {
+ label: "八级高级车辆",
+ type: "multiselect",
+ options: [
+ "无",
+ "59式",
+ "黄金59式",
+ "BZ-176",
+ "703工程II型",
+ "E-75TS",
+ "IS-3A",
+ "SU-130PM",
+ "T-44-100",
+ "超级潘兴",
+ "天蝎",
+ "克莱斯勒K",
+ ],
+ },
+ ],
+ },
+
+ 穿越火线: {
+ productType: "账号",
+ regions: [
+ {
+ value: "电信",
+ label: "电信",
+ children: [
+ { value: "安徽一区", label: "安徽一区" },
+ { value: "福建一区", label: "福建一区" },
+ { value: "广东一区", label: "广东一区" },
+ { value: "广东二区", label: "广东二区" },
+ { value: "湖北一区", label: "湖北一区" },
+ { value: "江苏一区", label: "江苏一区" },
+ { value: "上海一区", label: "上海一区" },
+ { value: "四川一区", label: "四川一区" },
+ { value: "浙江一区", label: "浙江一区" },
+ ],
+ },
+ {
+ value: "网通",
+ label: "网通",
+ children: [
+ { value: "北京一区", label: "北京一区" },
+ { value: "北京二区", label: "北京二区" },
+ { value: "河南一区", label: "河南一区" },
+ { value: "辽宁一区", label: "辽宁一区" },
+ { value: "山东一区", label: "山东一区" },
+ ],
+ },
+ ],
+ attributes: [
+ {
+ label: "英雄武器",
+ type: "select",
+ options: ["无英雄武器", "1-5V", "6-10V", "11-20V", "20-30V", "30V以上"],
+ required: true,
+ },
+ {
+ label: "所属战区",
+ type: "select",
+ options: [
+ "华北战区",
+ "河南战区",
+ "山东战区",
+ "东北战区",
+ "华中战区",
+ "华南战区",
+ "西部战区",
+ "东部战区",
+ "江苏战区",
+ ],
+ },
+ {
+ label: "排位级别",
+ type: "select",
+ options: ["无排位", "新锐", "精英", "专家", "大师", "宗师", "枪王", "枪王之王"],
+ },
+ {
+ label: "实名修改",
+ type: "select",
+ options: ["可修改实名", "不可修改实名"],
+ },
+ ],
+ },
+
+ 王者荣耀: {
+ productType: "账号",
+ regions: [
+ {
+ value: "苹果",
+ label: "苹果",
+ children: [
+ { value: "苹果QQ", label: "苹果QQ" },
+ { value: "苹果微信", label: "苹果微信" },
+ ],
+ },
+ {
+ value: "安卓",
+ label: "安卓",
+ children: [
+ { value: "安卓QQ", label: "安卓QQ" },
+ { value: "安卓微信", label: "安卓微信" },
+ ],
+ },
+ ],
+ attributes: [
+ {
+ label: "防沉迷",
+ type: "select",
+ options: ["无防沉迷", "有防沉迷"],
+ required: true,
+ },
+ {
+ label: "实名修改",
+ type: "select",
+ options: ["可修改", "不可修改"],
+ required: true,
+ },
+ {
+ label: "荣耀水晶皮肤",
+ type: "multiselect",
+ options: [
+ "倪克斯神谕-武则天",
+ "九霄神辉-花木兰",
+ "大秦宣太后-芈月",
+ "鸣剑曳影-李白",
+ "幻阙歌-貂蝉",
+ "星空梦想-鲁班七号",
+ "赤影疾锋-关羽",
+ "天鹅之梦-小乔",
+ "全息碎影-孙悟空",
+ "银白咏叹调-铠",
+ ],
+ },
+ {
+ label: "传说皮肤",
+ type: "multiselect",
+ options: [
+ "音你心动-小乔",
+ "淬星耀世-赵云",
+ "末日机甲-孙尚香",
+ "天魔缭乱-吕布",
+ "凤求凰-李白",
+ "武圣-关羽",
+ "仲夏夜之梦-貂蝉",
+ "地狱火-孙悟空",
+ "齐天大圣-孙悟空",
+ ],
+ },
+ ],
+ },
+
+ 和平精英: {
+ productType: "账号",
+ regions: [
+ {
+ value: "安卓",
+ label: "安卓",
+ children: [{ value: "QQ", label: "QQ" }],
+ },
+ {
+ value: "苹果",
+ label: "苹果",
+ children: [{ value: "微信", label: "微信" }],
+ },
+ ],
+ attributes: [
+ {
+ label: "热门载具",
+ type: "multiselect",
+ options: [
+ "阿斯顿·马丁DBS(红)",
+ "阿斯顿·马丁DBX(橙)",
+ "鬼马风驰",
+ "海龙奔腾",
+ "金龙耀世",
+ "兰博基尼URUS(炫光金)",
+ "玛莎拉蒂MC20(幻星粉)",
+ "迈凯伦570S(炫冰蓝)",
+ "特斯拉Cybertruck(镭光铂)",
+ "焰龙咆哮",
+ ],
+ },
+ {
+ label: "热门枪械",
+ type: "multiselect",
+ options: [
+ "AKM百合蜜语",
+ "AKM-盖世英雄",
+ "AWM花间之火",
+ "AWM焰龙焚天",
+ "GROZA焦糖拿铁",
+ "Kar98K圣光天使",
+ "M416风花雪月",
+ "M416五爪金龙",
+ "SCAR-L-纯梦嫁纱",
+ "UMP45相思残雪",
+ ],
+ },
+ ],
+ },
+
+ 原神: {
+ productType: "账号",
+ regions: [
+ {
+ value: "mihoyo服",
+ label: "mihoyo服",
+ children: [{ value: "天空服", label: "天空服" }],
+ },
+ {
+ value: "B服",
+ label: "B服",
+ children: [{ value: "B服", label: "B服" }],
+ },
+ {
+ value: "国际服",
+ label: "国际服",
+ children: [{ value: "国际服", label: "国际服" }],
+ },
+ ],
+ attributes: [
+ {
+ label: "邮箱",
+ type: "select",
+ options: ["未绑定邮箱", "网易邮箱出售", "QQ邮箱", "字母Q邮箱", "其他邮箱", "邮箱不出售"],
+ required: true,
+ },
+ {
+ label: "邮箱实名",
+ type: "select",
+ options: ["已实名", "未实名"],
+ required: true,
+ },
+ {
+ label: "五星角色",
+ type: "multiselect",
+ options: [
+ "林尼",
+ "艾尔海森",
+ "赛诺",
+ "妮露",
+ "纳西妲",
+ "流浪者",
+ "琴",
+ "迪卢克",
+ "七七",
+ "莫娜",
+ "刻晴",
+ "钟离",
+ "甘雨",
+ "胡桃",
+ "雷电将军",
+ "枫原万叶",
+ "神里绫华",
+ "那维莱特",
+ "芙宁娜",
+ ],
+ },
+ {
+ label: "五星武器",
+ type: "multiselect",
+ options: [
+ "磐岩结绿",
+ "猎人之径",
+ "圣显之匙",
+ "千夜浮梦",
+ "风鹰剑",
+ "天空之刃",
+ "狼的末路",
+ "护摩之杖",
+ "雾切之回光",
+ "薙草之稻光",
+ "苍古自由之誓",
+ "阿莫斯之弓",
+ ],
+ },
+ ],
+ },
+
+ 穿越火线手游: {
+ productType: "账号",
+ regions: [
+ {
+ value: "安卓",
+ label: "安卓",
+ children: [
+ { value: "安卓QQ", label: "安卓QQ" },
+ { value: "安卓微信", label: "安卓微信" },
+ ],
+ },
+ {
+ value: "苹果",
+ label: "苹果",
+ children: [
+ { value: "苹果QQ", label: "苹果QQ" },
+ { value: "苹果微信", label: "苹果微信" },
+ ],
+ },
+ ],
+ attributes: [
+ {
+ label: "客户端",
+ type: "select",
+ options: ["全部", "苹果微信", "苹果QQ", "安卓微信", "安卓QQ", "全服通用"],
+ },
+ {
+ label: "实名修改",
+ type: "select",
+ options: ["可修改", "不可修改"],
+ required: true,
+ },
+ ],
+ },
+
+ 魔兽世界: {
+ productType: "账号",
+ regions: [
+ {
+ value: "亚服",
+ label: "亚服",
+ children: [
+ {
+ value: "大地的裂变",
+ label: "大地的裂变",
+ children: [
+ { value: "伊弗斯", label: "伊弗斯" },
+ { value: "瑪拉頓", label: "瑪拉頓" },
+ { value: "阿拉希盆地", label: "阿拉希盆地" },
+ { value: "鱼人", label: "鱼人" },
+ ],
+ },
+ {
+ value: "正式服",
+ label: "正式服",
+ children: [
+ { value: "暗影之月", label: "暗影之月" },
+ { value: "众星之子", label: "众星之子" },
+ { value: "地狱吼", label: "地狱吼" },
+ { value: "世界之树", label: "世界之树" },
+ ],
+ },
+ ],
+ },
+ {
+ value: "国服",
+ label: "国服",
+ children: [
+ {
+ value: "正式服",
+ label: "正式服",
+ children: [
+ { value: "回音山", label: "回音山" },
+ { value: "巨龙之吼", label: "巨龙之吼" },
+ { value: "索瑞森", label: "索瑞森" },
+ { value: "罗宁", label: "罗宁" },
+ ],
+ },
+ ],
+ },
+ ],
+ attributes: [],
+ },
+}
diff --git a/lib/data/game-data.ts b/lib/data/game-data.ts
new file mode 100644
index 0000000..2eff041
--- /dev/null
+++ b/lib/data/game-data.ts
@@ -0,0 +1,200 @@
+export type GameConfig = {
+ score: number
+ versions?: Record // Version -> Servers
+ ranks?: Record
+}
+
+export const GAME_DATA = {
+ // Game Value Configuration
+ games: {
+ 王者荣耀: {
+ score: 30,
+ versions: {
+ 全服通用: ["微信区", "QQ区"],
+ },
+ ranks: {
+ 荣耀王者: 10,
+ 最强王者: 8,
+ 至尊星耀: 5,
+ 永恒钻石: 3,
+ 尊贵铂金: 1,
+ 黄金及以下: 0,
+ },
+ },
+ 原神: {
+ score: 30,
+ versions: {
+ 全服通用: ["天空岛", "世界树"],
+ },
+ ranks: {
+ "60级": 10,
+ "55-59级": 8,
+ "50-54级": 5,
+ "45-49级": 3,
+ "45级以下": 0,
+ },
+ },
+ 和平精英: {
+ score: 25,
+ versions: {
+ 全服通用: ["微信区", "QQ区"],
+ },
+ ranks: {
+ 无敌战神: 10,
+ 超级王牌: 8,
+ 荣耀皇冠: 5,
+ 不朽星钻: 3,
+ 星钻以下: 0,
+ },
+ },
+ 魔兽世界: {
+ score: 30,
+ versions: {
+ 亚服大地的裂变: ["伊弗斯", "瑪拉頓", "阿拉希盆地", "鱼人", "逐风者", "古雷曼格", "乌苏雷", "札里克"],
+ 亚服正式服: [
+ "暗影之月",
+ "众星之子",
+ "地狱吼",
+ "狂热之刃",
+ "阿萨斯",
+ "冰霜之刺",
+ "米奈希尔",
+ "血之谷",
+ "夜空之歌",
+ "巨龙之喉",
+ "世界之树",
+ "屠魔山谷",
+ "水晶之刺",
+ ],
+ 国服正式服: [
+ "死亡之翼",
+ "白银之手",
+ "罗宁",
+ "主宰之剑",
+ "格瑞姆巴托",
+ "安苏",
+ "熊猫酒仙",
+ "国王之谷",
+ "燃烧之刃",
+ "影之哀伤",
+ ],
+ 国服怀旧服: [
+ "哈霍兰",
+ "奥罗",
+ "匕首岭",
+ "布鲁",
+ "范克瑞斯",
+ "席瓦莱恩",
+ "碧玉矿洞",
+ "寒脊山小径",
+ "祈福",
+ "灰烬使者",
+ ],
+ },
+ ranks: {
+ "角斗士/名人堂": 10,
+ "高阶督军/大元帅": 8,
+ "督军/元帅": 5,
+ "统帅/将军": 3,
+ 普通: 0,
+ },
+ },
+ 英雄联盟: {
+ score: 30,
+ versions: {
+ 电信区: [
+ "艾欧尼亚",
+ "祖安",
+ "诺克萨斯",
+ "班德尔城",
+ "皮城警备",
+ "战争学院",
+ "巨神峰",
+ "雷瑟守备",
+ "裁决之地",
+ "黑色玫瑰",
+ "暗影岛",
+ "钢铁烈阳",
+ "水晶之痕",
+ "均衡教派",
+ "影流",
+ "守望之海",
+ "征服之海",
+ "卡拉曼达",
+ "皮城警备",
+ ],
+ 网通区: ["比尔吉沃特", "德玛西亚", "弗雷尔卓德", "无畏先锋", "恕瑞玛", "扭曲丛林", "巨龙之巢"],
+ },
+ ranks: {
+ 最强王者: 10,
+ 傲世宗师: 8,
+ 超凡大师: 6,
+ 璀璨钻石: 4,
+ 华贵铂金: 2,
+ 铂金以下: 0,
+ },
+ },
+ 无畏契约: {
+ score: 25,
+ versions: {
+ 国服: ["重庆", "南京", "天津", "广州"],
+ },
+ ranks: {
+ 赋能战魂: 10,
+ 神话: 8,
+ 超凡入圣: 6,
+ 钻石: 4,
+ 铂金: 2,
+ 铂金以下: 0,
+ },
+ },
+ "CS:GO": {
+ score: 25,
+ versions: {
+ 国服: ["完美世界"],
+ },
+ ranks: {
+ 大地球: 10,
+ 小地球: 8,
+ 老鹰: 6,
+ 菊花: 4,
+ AK: 2,
+ AK以下: 0,
+ },
+ },
+ } as Record,
+
+ // Server Value Configuration
+ server_scores: {
+ 热门服: 10, // Hot/New servers
+ 普通服: 8, // Normal servers
+ 鬼服: 5, // Low population
+ } as Record,
+
+ // Asset Weight Configuration
+ asset_weights: {
+ 传说级: 1.5, // Legendary
+ 史诗级: 1.0, // Epic
+ 优质级: 0.5, // Rare
+ 普通级: 0.2, // Common
+ } as Record,
+
+ // Risk Control Coefficient
+ correction_coeffs: {
+ 本人_无封号: 1.2,
+ 本人_有封号: 1.0,
+ 非本人_无封号: 0.8,
+ 非本人_有封号: 0.6,
+ 未实名: 0.7,
+ } as Record,
+
+ consumption_weights: {
+ level1: 0, // 0-100
+ level2: 1.05, // 100-500
+ level3: 1.1, // 500-2000
+ level4: 1.2, // 2000+
+ } as Record,
+
+ // Base multiplier for final valuation (converts score to currency)
+ base_multiple: 100,
+}
diff --git a/lib/utils/account-evaluation.ts b/lib/utils/account-evaluation.ts
new file mode 100644
index 0000000..d9e01ad
--- /dev/null
+++ b/lib/utils/account-evaluation.ts
@@ -0,0 +1,133 @@
+import { GAME_DATA } from "@/lib/data/game-data"
+
+export type EvaluationInput = {
+ gameName: string
+ serverType: string // "热门服" | "普通服" | "鬼服"
+ currentLevel: number
+ maxLevel: number
+ rankName: string
+
+ // Assets
+ assetCounts: {
+ legendary: number // 传说级
+ epic: number // 史诗级
+ rare: number // 优质级
+ common: number // 普通级
+ }
+
+ // Bonus
+ registrationMonths: number
+ rechargeAmount6Months: number
+ mallConsumption?: number // Added mall consumption parameter
+
+ // Risk
+ isRealNameVerified: boolean
+ isRealNameOwner: boolean
+ hasBanRecord: boolean
+}
+
+export type EvaluationResult = {
+ totalScore: number
+ valuation: number // Preliminary valuation
+ loanAmount: number // Loan amount
+ details: {
+ baseScore: number
+ assetScore: number
+ bonusScore: number
+ riskCoefficient: number
+ consumptionMultiplier: number // Added consumption multiplier to result
+ }
+}
+
+export function evaluateAccount(input: EvaluationInput): EvaluationResult {
+ const gameConfig = GAME_DATA.games[input.gameName] || { score: 20, ranks: {} }
+
+ // 1. Base Value Score (Max 50)
+ // Game Score (Max 30)
+ const gameScore = gameConfig.score
+
+ // Server Score (Max 10)
+ const serverScore = GAME_DATA.server_scores[input.serverType] || 8
+
+ // Level Score (Max 10)
+ // Score = (Current / Max) * 10
+ const levelRatio = Math.min(input.currentLevel / (input.maxLevel || 100), 1)
+ const levelScore = Number.parseFloat((levelRatio * 10).toFixed(1))
+
+ const baseScore = gameScore + serverScore + levelScore
+
+ // 2. Core Asset Score (Max 30)
+ // Asset Score = Sum(Count * Weight)
+ // Cap count at 20 to avoid outliers as per requirements
+ const getAssetScore = (count: number, weight: number) => Math.min(count, 20) * weight
+
+ const assetBaseScore =
+ getAssetScore(input.assetCounts.legendary, GAME_DATA.asset_weights["传说级"]) +
+ getAssetScore(input.assetCounts.epic, GAME_DATA.asset_weights["史诗级"]) +
+ getAssetScore(input.assetCounts.rare, GAME_DATA.asset_weights["优质级"]) +
+ getAssetScore(input.assetCounts.common, GAME_DATA.asset_weights["普通级"])
+
+ // Rank Bonus
+ const rankBonus = gameConfig.ranks ? gameConfig.ranks[input.rankName] || 0 : 0
+
+ const coreAssetScore = Math.min(assetBaseScore + rankBonus, 30)
+
+ // 3. Bonus Score (Max 20)
+ let timeScore = 0
+ if (input.registrationMonths >= 25) timeScore = 10
+ else if (input.registrationMonths >= 13) timeScore = 8
+ else if (input.registrationMonths >= 7) timeScore = 5
+ else timeScore = 3
+
+ // Recharge Amount (Max 10)
+ // Score = min(Amount * 0.001, 10)
+ const rechargeScore = Math.min(input.rechargeAmount6Months * 0.001, 10)
+
+ const bonusScore = timeScore + rechargeScore
+
+ // 4. Risk Correction Coefficient
+ let riskKey = "未实名"
+ if (input.isRealNameVerified) {
+ if (input.isRealNameOwner) {
+ riskKey = input.hasBanRecord ? "本人_有封号" : "本人_无封号"
+ } else {
+ riskKey = input.hasBanRecord ? "非本人_有封号" : "非本人_无封号"
+ }
+ }
+
+ const riskCoefficient = GAME_DATA.correction_coeffs[riskKey] || 0.7
+
+ let consumptionMultiplier = 1.0
+ const consumption = input.mallConsumption || 0
+ if (consumption >= 2000) {
+ consumptionMultiplier = GAME_DATA.consumption_weights.level4
+ } else if (consumption >= 500) {
+ consumptionMultiplier = GAME_DATA.consumption_weights.level3
+ } else if (consumption >= 100) {
+ consumptionMultiplier = GAME_DATA.consumption_weights.level2
+ } else {
+ consumptionMultiplier = 1.0
+ }
+
+ // Final Calculation
+ const totalScore = Number.parseFloat(((baseScore + coreAssetScore + bonusScore) * riskCoefficient).toFixed(2))
+ const valuation = Math.floor(totalScore * GAME_DATA.base_multiple)
+
+ let loanAmount = Math.floor(valuation * 0.6 * consumptionMultiplier)
+ if (loanAmount < 500) {
+ loanAmount = 0
+ }
+
+ return {
+ totalScore,
+ valuation,
+ loanAmount,
+ details: {
+ baseScore: Number.parseFloat(baseScore.toFixed(1)),
+ assetScore: Number.parseFloat(coreAssetScore.toFixed(1)),
+ bonusScore: Number.parseFloat(bonusScore.toFixed(1)),
+ riskCoefficient,
+ consumptionMultiplier, // Return multiplier for UI display
+ },
+ }
+}
diff --git a/public/abstract-esports-pattern.jpg b/public/abstract-esports-pattern.jpg
index 661c517..4b3fb74 100644
Binary files a/public/abstract-esports-pattern.jpg and b/public/abstract-esports-pattern.jpg differ
diff --git a/public/account-genshin.jpg b/public/account-genshin.jpg
new file mode 100644
index 0000000..5882943
Binary files /dev/null and b/public/account-genshin.jpg differ
diff --git a/public/account-hok.jpg b/public/account-hok.jpg
new file mode 100644
index 0000000..5496326
Binary files /dev/null and b/public/account-hok.jpg differ
diff --git a/public/account-icon-gen.jpg b/public/account-icon-gen.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/account-icon-gen.jpg differ
diff --git a/public/account-icon-hok.jpg b/public/account-icon-hok.jpg
new file mode 100644
index 0000000..6451b02
Binary files /dev/null and b/public/account-icon-hok.jpg differ
diff --git a/public/account-icon-lol.jpg b/public/account-icon-lol.jpg
new file mode 100644
index 0000000..1b70787
Binary files /dev/null and b/public/account-icon-lol.jpg differ
diff --git a/public/account-icon-val.jpg b/public/account-icon-val.jpg
new file mode 100644
index 0000000..a3ff63a
Binary files /dev/null and b/public/account-icon-val.jpg differ
diff --git a/public/account-lol.jpg b/public/account-lol.jpg
new file mode 100644
index 0000000..9719741
Binary files /dev/null and b/public/account-lol.jpg differ
diff --git a/public/account-val.jpg b/public/account-val.jpg
new file mode 100644
index 0000000..d480d46
Binary files /dev/null and b/public/account-val.jpg differ
diff --git a/public/avatar-1.jpg b/public/avatar-1.jpg
index 9bc223a..22e6e1d 100644
Binary files a/public/avatar-1.jpg and b/public/avatar-1.jpg differ
diff --git a/public/avatar-2.jpg b/public/avatar-2.jpg
index e382119..920a056 100644
Binary files a/public/avatar-2.jpg and b/public/avatar-2.jpg differ
diff --git a/public/avatar-3.jpg b/public/avatar-3.jpg
new file mode 100644
index 0000000..edeb987
Binary files /dev/null and b/public/avatar-3.jpg differ
diff --git a/public/avatar-4.jpg b/public/avatar-4.jpg
new file mode 100644
index 0000000..2db47cd
Binary files /dev/null and b/public/avatar-4.jpg differ
diff --git a/public/avatar-5.jpg b/public/avatar-5.jpg
new file mode 100644
index 0000000..ca338a0
Binary files /dev/null and b/public/avatar-5.jpg differ
diff --git a/public/avatar-6.jpg b/public/avatar-6.jpg
new file mode 100644
index 0000000..e6d6f68
Binary files /dev/null and b/public/avatar-6.jpg differ
diff --git a/public/avatar-assassin.jpg b/public/avatar-assassin.jpg
new file mode 100644
index 0000000..800cdaa
Binary files /dev/null and b/public/avatar-assassin.jpg differ
diff --git a/public/avatar-cute.jpg b/public/avatar-cute.jpg
new file mode 100644
index 0000000..89a1455
Binary files /dev/null and b/public/avatar-cute.jpg differ
diff --git a/public/avatar-cyberpunk.jpg b/public/avatar-cyberpunk.jpg
new file mode 100644
index 0000000..92475a0
Binary files /dev/null and b/public/avatar-cyberpunk.jpg differ
diff --git a/public/avatar-mecha.jpg b/public/avatar-mecha.jpg
new file mode 100644
index 0000000..d16995e
Binary files /dev/null and b/public/avatar-mecha.jpg differ
diff --git a/public/badge-gold.jpg b/public/badge-gold.jpg
new file mode 100644
index 0000000..95b6457
Binary files /dev/null and b/public/badge-gold.jpg differ
diff --git a/public/club-logo-0.jpg b/public/club-logo-0.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/club-logo-0.jpg differ
diff --git a/public/club-logo-1.jpg b/public/club-logo-1.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/club-logo-1.jpg differ
diff --git a/public/club-logo-2.jpg b/public/club-logo-2.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/club-logo-2.jpg differ
diff --git a/public/companion-cover-1.jpg b/public/companion-cover-1.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/companion-cover-1.jpg differ
diff --git a/public/companion-cover-2.jpg b/public/companion-cover-2.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/companion-cover-2.jpg differ
diff --git a/public/course-1.jpg b/public/course-1.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/course-1.jpg differ
diff --git a/public/course-2.jpg b/public/course-2.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/course-2.jpg differ
diff --git a/public/course-3.jpg b/public/course-3.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/course-3.jpg differ
diff --git a/public/course-4.jpg b/public/course-4.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/course-4.jpg differ
diff --git a/public/effect-neon.jpg b/public/effect-neon.jpg
new file mode 100644
index 0000000..538ddf5
Binary files /dev/null and b/public/effect-neon.jpg differ
diff --git a/public/esports-live-stream-gameplay.jpg b/public/esports-live-stream-gameplay.jpg
index 4b0fe78..bda2828 100644
Binary files a/public/esports-live-stream-gameplay.jpg and b/public/esports-live-stream-gameplay.jpg differ
diff --git a/public/esports-tournament-stadium.jpg b/public/esports-tournament-stadium.jpg
index a13f868..84ccc37 100644
Binary files a/public/esports-tournament-stadium.jpg and b/public/esports-tournament-stadium.jpg differ
diff --git a/public/feed-live-1101.jpg b/public/feed-live-1101.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/feed-live-1101.jpg differ
diff --git a/public/feed-live-1102.jpg b/public/feed-live-1102.jpg
new file mode 100644
index 0000000..d3f492f
Binary files /dev/null and b/public/feed-live-1102.jpg differ
diff --git a/public/feed-live-1103.jpg b/public/feed-live-1103.jpg
new file mode 100644
index 0000000..7346d28
Binary files /dev/null and b/public/feed-live-1103.jpg differ
diff --git a/public/feed-live-1104.jpg b/public/feed-live-1104.jpg
new file mode 100644
index 0000000..1f45a75
Binary files /dev/null and b/public/feed-live-1104.jpg differ
diff --git a/public/frame-starry.jpg b/public/frame-starry.jpg
new file mode 100644
index 0000000..2e30d95
Binary files /dev/null and b/public/frame-starry.jpg differ
diff --git a/public/gamer-profile-avatar.jpg b/public/gamer-profile-avatar.jpg
new file mode 100644
index 0000000..263503b
Binary files /dev/null and b/public/gamer-profile-avatar.jpg differ
diff --git a/public/gear-headset.jpg b/public/gear-headset.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/gear-headset.jpg differ
diff --git a/public/gear-keyboard.jpg b/public/gear-keyboard.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/gear-keyboard.jpg differ
diff --git a/public/gear-monitor.jpg b/public/gear-monitor.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/gear-monitor.jpg differ
diff --git a/public/gear-mouse.jpg b/public/gear-mouse.jpg
new file mode 100644
index 0000000..06373b5
Binary files /dev/null and b/public/gear-mouse.jpg differ
diff --git a/public/guild-logo-0.jpg b/public/guild-logo-0.jpg
new file mode 100644
index 0000000..ce75780
Binary files /dev/null and b/public/guild-logo-0.jpg differ
diff --git a/public/guild-logo-1.jpg b/public/guild-logo-1.jpg
new file mode 100644
index 0000000..6cbf530
Binary files /dev/null and b/public/guild-logo-1.jpg differ
diff --git a/public/guild-logo-2.jpg b/public/guild-logo-2.jpg
new file mode 100644
index 0000000..b99c3e8
Binary files /dev/null and b/public/guild-logo-2.jpg differ
diff --git a/public/guild-logo-3.jpg b/public/guild-logo-3.jpg
new file mode 100644
index 0000000..5ffeba9
Binary files /dev/null and b/public/guild-logo-3.jpg differ
diff --git a/public/recharge-banner.jpg b/public/recharge-banner.jpg
new file mode 100644
index 0000000..3cc8598
Binary files /dev/null and b/public/recharge-banner.jpg differ
diff --git a/public/tournament-event-today.jpg b/public/tournament-event-today.jpg
new file mode 100644
index 0000000..e7c2066
Binary files /dev/null and b/public/tournament-event-today.jpg differ
diff --git a/public/user-avatar.jpg b/public/user-avatar.jpg
new file mode 100644
index 0000000..5ec0d08
Binary files /dev/null and b/public/user-avatar.jpg differ
diff --git a/public/wow-bg.jpg b/public/wow-bg.jpg
index 99a80fc..2efdf3e 100644
Binary files a/public/wow-bg.jpg and b/public/wow-bg.jpg differ