diff --git a/app/coach/[id]/page.tsx b/app/coach/[id]/page.tsx new file mode 100644 index 0000000..d947d46 --- /dev/null +++ b/app/coach/[id]/page.tsx @@ -0,0 +1,119 @@ +"use client" + +import { ArrowLeft, Star, Trophy, Users, Shield, Gamepad2, Award, MessageCircle } from "lucide-react" +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 CoachDetailPage({ params }: { params: { id: string } }) { + const router = useRouter() + + const handleBook = () => { + toast({ + title: "预约成功", + description: "陪练师将在15分钟内联系您", + }) + } + + return ( +
+ {/* Hero Section */} +
+ Cover +
+ +
+ +
+
+
+ Coach +
+
+
+ + +
+
+ +
+
+

职业打野-小明

+ +
+

前LPL职业选手 · 国服第一打野 · 5年教学经验

+
+ + + 4.9 评分 + + + + 2456 订单 + + + + 98% 好评 + +
+
+ + {/* Services */} +
+

+ + 服务项目 +

+
+ {[ + { name: "单局陪练", price: 80, desc: "边玩边教,即时指导", duration: "1局" }, + { name: "5局套餐", price: 360, desc: "系统提升,优惠45元", duration: "5局", hot: true }, + { name: "10局特训", price: 650, desc: "深度培训,包上分", duration: "10局" }, + ].map((service, i) => ( +
+ {service.hot && ( + + 最热门 + + )} +
+
+

{service.name}

+

{service.desc}

+
+
+
{service.price}
+
+
+
+
+ ))} +
+
+ + {/* Trust Badge */} +
+
+ +
+

平台认证陪练师

+

服务不满意,全额退款

+
+
+
+
+
+ ) +} diff --git a/app/coach/page.tsx b/app/coach/page.tsx new file mode 100644 index 0000000..565f91e --- /dev/null +++ b/app/coach/page.tsx @@ -0,0 +1,208 @@ +"use client" + +import { ArrowLeft, Trophy, Star, Gamepad2, MessageCircle, Award } from "lucide-react" +import { useRouter } 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" + +export default function CoachPage() { + const router = useRouter() + + const handleBookCoach = (coachName: string) => { + toast({ + title: "预约成功", + description: `已成功预约${coachName}的陪练服务`, + }) + } + + return ( +
+ {/* Header */} +
+ +

游戏陪练

+
+ +
+ {/* Banner */} +
+
+

专业陪练服务

+ 1000+ 陪练师 +
+

前职业选手、路人王陪你上分,技术提升看得见

+
+
+
专业认证
+
实力保障
+
+
+
快速上分
+
胜率提升
+
+
+
技术指导
+
边玩边学
+
+
+
+ + {/* Filters */} + + + + 热门陪练 + + + 职业选手 + + + 王者大神 + + + + + {[ + { + name: "职业打野-小明", + title: "前LPL职业选手", + avatar: "/avatar-2.jpg", + games: ["英雄联盟"], + rank: "王者2000分", + orders: 2456, + rating: 4.9, + price: 80, + tags: ["职业", "打野", "带飞"], + online: true, + }, + { + name: "上分小助手", + title: "国服路人王", + avatar: "/avatar-4.jpg", + games: ["王者荣耀", "和平精英"], + rank: "荣耀王者100星", + orders: 1823, + rating: 4.8, + price: 50, + tags: ["温柔", "耐心", "指导"], + online: true, + }, + { + name: "FPS大神", + title: "前职业选手", + avatar: "/avatar-5.jpg", + games: ["无畏契约", "三角洲"], + rank: "超凡入圣", + orders: 987, + rating: 4.9, + price: 100, + tags: ["枪法", "意识", "专业"], + online: false, + }, + { + name: "温柔陪练师", + title: "全能型选手", + avatar: "/avatar-6.jpg", + games: ["王者荣耀", "英雄联盟"], + rank: "多区王者", + orders: 3201, + rating: 5.0, + price: 60, + tags: ["声音好听", "技术强", "幽默"], + online: true, + }, + ].map((coach, i) => ( +
router.push(`/coach/${i + 1}`)} + > +
+
+
+ {coach.name} +
+ {coach.online && ( +
+ )} +
+ +
+
+

{coach.name}

+ {coach.rating === 5.0 && } +
+ +

{coach.title}

+ +
+ + + {coach.rating} + + + + {coach.orders}单 + +
+ +
+ {coach.tags.map((tag, j) => ( + + {tag} + + ))} +
+
+ +
+
{coach.price}
+
元/局
+
+
+ +
+ + +
+
+ ))} + + + +
职业选手列表加载中...
+
+ + +
王者大神列表加载中...
+
+ +
+
+ ) +} diff --git a/app/cp/[id]/page.tsx b/app/cp/[id]/page.tsx new file mode 100644 index 0000000..191647e --- /dev/null +++ b/app/cp/[id]/page.tsx @@ -0,0 +1,127 @@ +"use client" + +import { ArrowLeft, Heart, Star, MessageCircle, Shield, Trophy, Users, Gamepad2 } from "lucide-react" +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 CPDetailPage({ params }: { params: { id: string } }) { + const router = useRouter() + + const handleSendRequest = () => { + toast({ + title: "请求已发送", + description: "对方收到通知后会尽快回复你", + }) + } + + return ( +
+ {/* Hero Section */} +
+ Cover +
+ +
+ +
+
+
+ Avatar +
+
+
+ + +
+
+ +
+
+

甜心辅助

+ + 女 · 22岁 + +
+

喜欢玩辅助,找个靠谱的ADC一起开黑~

+
+ + + 星耀段位 + + + + 385 场游戏 + + + + 68 位好友 + +
+
+ + {/* Games */} +
+

+ + 擅长游戏 +

+
+ {[ + { game: "王者荣耀", rank: "星耀I", hero: "瑶、大乔" }, + { game: "和平精英", rank: "无敌战神", role: "四排辅助位" }, + ].map((item, i) => ( +
+
{item.game}
+
{item.rank}
+
{item.hero || item.role}
+
+ ))} +
+
+ + {/* Tags */} +
+

个人标签

+
+ {["声音好听", "技术不错", "温柔", "有耐心", "爱聊天"].map((tag, i) => ( + + {tag} + + ))} +
+
+ + {/* Trust Badge */} +
+
+ +
+

平台实名认证

+

真实身份,安全交友

+
+
+
+
+
+ ) +} diff --git a/app/cp/page.tsx b/app/cp/page.tsx new file mode 100644 index 0000000..6163b3f --- /dev/null +++ b/app/cp/page.tsx @@ -0,0 +1,207 @@ +"use client" + +import { ArrowLeft, Heart, Star, MessageCircle, Sparkles } from "lucide-react" +import { useRouter } 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" + +export default function CPPage() { + const router = useRouter() + + const handleContact = (cpName: string) => { + toast({ + title: "发送成功", + description: `已向${cpName}发送交友请求`, + }) + } + + return ( +
+ {/* Header */} +
+ +

电竞CP

+
+ +
+ {/* Banner */} +
+
+

+ + 找个游戏CP +

+ +
+

一起开黑,一起上分,遇见你的电竞知己

+
+
+
声音甜美
+
温柔妹子
+
+
+
技术强劲
+
带飞大佬
+
+
+
长期陪伴
+
稳定组队
+
+
+
+ + {/* Filters */} + + + + 全部 + + + 女生 + + + 男生 + + + + + {[ + { + name: "甜心辅助", + gender: "女", + age: 22, + avatar: "/avatar-1.jpg", + games: ["王者荣耀", "和平精英"], + voice: "温柔甜美", + rank: "星耀", + online: true, + tags: ["声音好听", "技术不错", "温柔"], + bio: "喜欢玩辅助,找个靠谱的ADC一起开黑~", + }, + { + name: "职业打野", + gender: "男", + age: 24, + avatar: "/avatar-2.jpg", + games: ["英雄联盟", "无畏契约"], + voice: "成熟稳重", + rank: "大师", + online: true, + tags: ["技术流", "有耐心", "幽默"], + bio: "前职业选手,带你上分不是梦", + }, + { + name: "软萌小姐姐", + gender: "女", + age: 20, + avatar: "/avatar-3.jpg", + games: ["王者荣耀", "原神"], + voice: "软萌可爱", + rank: "钻石", + online: false, + tags: ["萌妹子", "爱聊天", "佛系"], + bio: "游戏菜但是爱玩,找个不嫌弃的~", + }, + { + name: "中单刺客", + gender: "男", + age: 23, + avatar: "/avatar-4.jpg", + games: ["英雄联盟"], + voice: "阳光帅气", + rank: "王者", + online: true, + tags: ["Carry型", "稳定", "负责"], + bio: "擅长刺客中单,带妹上分专业户", + }, + ].map((cp, i) => ( +
router.push(`/cp/${i + 1}`)} + > +
+
+
+ {cp.name} +
+ {cp.online && ( +
+ )} +
+ +
+
+

{cp.name}

+ + {cp.gender} · {cp.age}岁 + +
+ +
+ + + {cp.rank} + + {cp.voice} +
+ +

{cp.bio}

+ +
+ {cp.tags.map((tag, j) => ( + + {tag} + + ))} +
+
+
+ +
+ + +
+
+ ))} + + + +
女生列表加载中...
+
+ + +
男生列表加载中...
+
+ +
+
+ ) +} diff --git a/app/dress-up/page.tsx b/app/dress-up/page.tsx index dbf2e29..f670102 100644 --- a/app/dress-up/page.tsx +++ b/app/dress-up/page.tsx @@ -11,16 +11,16 @@ export default function DressUpPage() { const router = useRouter() const avatars = [ - { id: 1, name: "赛博朋克战士", price: 98, rarity: "传说", sales: 1205, image: "cyberpunk warrior avatar neon" }, - { id: 2, name: "甜心电竞少女", price: 68, rarity: "稀有", sales: 3420, image: "cute esports girl avatar pink" }, - { id: 3, name: "暗影刺客", price: 128, rarity: "传说", sales: 856, image: "shadow assassin avatar dark" }, - { id: 4, name: "机甲战神", price: 88, rarity: "史诗", sales: 2100, image: "mecha warrior avatar blue" }, + { id: 1, name: "赛博朋克战士", price: 98, rarity: "传说", sales: 1205, image: "/avatar-cyberpunk.jpg" }, + { id: 2, name: "甜心电竞少女", price: 68, rarity: "稀有", sales: 3420, image: "/avatar-cute.jpg" }, + { id: 3, name: "暗影刺客", price: 128, rarity: "传说", sales: 856, image: "/avatar-assassin.jpg" }, + { id: 4, name: "机甲战神", price: 88, rarity: "史诗", sales: 2100, image: "/avatar-mecha.jpg" }, ] const decorations = [ - { id: 101, name: "星空边框", price: 38, type: "边框", image: "starry frame decoration" }, - { id: 102, name: "炫光特效", price: 58, type: "特效", image: "neon glow effect" }, - { id: 103, name: "王者徽章", price: 48, type: "徽章", image: "champion badge gold" }, + { id: 101, name: "星空边框", price: 38, type: "边框", image: "/frame-starry.jpg" }, + { id: 102, name: "炫光特效", price: 58, type: "特效", image: "/effect-neon.jpg" }, + { id: 103, name: "王者徽章", price: 48, type: "徽章", image: "/badge-gold.jpg" }, ] return ( @@ -41,7 +41,7 @@ export default function DressUpPage() { {/* Current Avatar Display */}
- Current Avatar + Current Avatar
LV.8
@@ -81,18 +81,13 @@ export default function DressUpPage() { className="glass-card p-3 rounded-xl hover:bg-white/10 transition-colors cursor-pointer" onClick={() => toast({ - title: "即将购买", - description: `${avatar.name} - ¥${avatar.price}`, + title: "购买成功", + description: `已获得 ${avatar.name},消费 ¥${avatar.price}`, }) } >
- {avatar.name} + {avatar.name}
{avatar.rarity}
@@ -118,12 +113,7 @@ export default function DressUpPage() { className="glass-card p-3 rounded-xl flex items-center gap-3 hover:bg-white/10 transition-colors cursor-pointer" >
- {item.name} + {item.name}

{item.name}

diff --git a/app/events/today/page.tsx b/app/events/today/page.tsx new file mode 100644 index 0000000..43b237d --- /dev/null +++ b/app/events/today/page.tsx @@ -0,0 +1,106 @@ +"use client" + +import { ArrowLeft, Clock, Users, Trophy, MapPin } from "lucide-react" +import { useRouter } from "next/navigation" +import Image from "next/image" +import Link from "next/link" + +export default function TodayEventsPage() { + const router = useRouter() + + const events = [ + { + id: 1, + title: "2025 玩值杯全明星邀请赛", + game: "英雄联盟", + time: "20:00", + status: "即将开始", + teams: ["RNG", "EDG"], + venue: "上海梅赛德斯奔驰中心", + prize: "100万", + viewers: "25.6w", + image: "/tournament-event-today.jpg", + }, + { + id: 2, + title: "王者荣耀职业联赛", + game: "王者荣耀", + time: "18:30", + status: "直播中", + teams: ["AG超玩会", "QGhappy"], + venue: "线上赛", + prize: "50万", + viewers: "18.2w", + image: "/tournament-event-today.jpg", + }, + ] + + return ( +
+
+ +

今日赛事

+
+ +
+ {events.map((event) => ( + +
+ {event.title} +
+ {event.status === "直播中" && ( +
+ + {event.status} +
+ )} +
+

{event.title}

+
+ + {event.time} + + {event.viewers} +
+
+
+ +
+
+
+
+
{event.teams[0]}
+
战队
+
+
VS
+
+
{event.teams[1]}
+
战队
+
+
+
+
+ + {event.prize} +
+
奖金池
+
+
+ +
+ + {event.venue} +
+
+ + ))} +
+
+ ) +} diff --git a/app/guild/page.tsx b/app/guild/page.tsx index 4b21786..dbc056d 100644 --- a/app/guild/page.tsx +++ b/app/guild/page.tsx @@ -109,7 +109,7 @@ export default function GuildPage() {
{guild.name}
- + + {/* Added Header for Recommendations */} +
+ 热门推荐 +
+ {hotels.map((hotel) => (
handleBook(hotel.name)} > -
-
-
-

{hotel.name}

- {hotel.id === 1 && ( - - 热门 - - )} + {/* Added Image on the left */} +
+ {hotel.name} + {hotel.id === 1 && ( +
+ 热门
+ )} +
+ +
+
+
+

{hotel.name}

+
+
-
- +
+ {hotel.rating}
- | - {hotel.reviews}条评论 - | - {hotel.distance} + {hotel.reviews}条评论 +
+ +
+ {hotel.district} | {hotel.distance} +
+ +
+ {hotel.tags.map((tag, i) => ( + + {tag} + + ))}
-
{hotel.district}
-
-
+ +
+
¥ - {hotel.price} + {hotel.price} +
-
-
- {hotel.tags.map((tag, i) => ( - - {tag} - - ))} -
))} - + +
+ 附近好店 +
+ {cafes.map((cafe) => (
handleBook(cafe.name)} > -
-
-

{cafe.name}

+ {/* Added Image on the left */} +
+ {cafe.name} +
+ +
+
+

{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 } }) {
- Avatar + Avatar
-

GM-远洋

+

{currentPlayer.name}

12.5w观看

@@ -45,12 +71,7 @@ export default function LiveRoomPage({ params }: { params: { id: string } }) {
{[1, 2, 3].map((i) => (
- Viewer + Viewer
))}
@@ -60,6 +81,85 @@ export default function LiveRoomPage({ params }: { params: { id: string } }) {
+ + + + + + + + + {currentPlayer.name} 的派对群 + + +
+ {/* 主播信息卡片 */} +
+
+ {currentPlayer.name} +
+
+

{currentPlayer.name}

+

{currentPlayer.title}

+
+ + + {currentPlayer.fans} 粉丝 + + + + {currentPlayer.partyMembers} 群成员 + +
+
+
+ + {/* 群介绍 */} +
+
+ + 派对正在进行中 +
+

+ 加入 {currentPlayer.name} 的专属粉丝派对群,与主播和其他粉丝实时互动、语音开黑、参与专属福利活动! +

+
+ + {/* 群特权 */} +
+ {[ + { icon: "🎁", text: "专属礼物" }, + { icon: "🎮", text: "组队开黑" }, + { icon: "💬", text: "语音聊天" }, + ].map((item, i) => ( +
+ {item.icon} + {item.text} +
+ ))} +
+ + +
+
+
+ {/* 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.rating} +
+
+
+
+
+

+ {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.title} +
+ +
+
+ {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.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.tag} +
+
+
+

{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) => ( @@ -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.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 */} -
-
+
+
-
- +
{/* Main Content Area - Scroll Snap */} -
- {activeTab === "live" && ( -
-
- - 下拉刷新推荐 -
- -
- {liveStreams.map((stream) => ( - - {stream.title} -
- - {/* Live Badge */} -
-
- LIVE -
- -
- {stream.location} -
- -
-
-
- {stream.user} -
- {stream.user} -
-

{stream.title}

- {stream.viewers}人在看 -
- - ))} - {/* Repeat specifically to show scrolling content */} - {liveStreams.map((stream) => ( - - {stream.title} -
-
-
- LIVE -
-
-
-
- {stream.user} -
- {stream.user} -
-

{stream.title}

- {stream.viewers}人在看 -
- - ))} -
-
- )} - - {activeTab === "video" && ( +
+ {activeTab === "recommend" && (
- {moments.map((moment, i) => ( -
+ {/* Rendering Mixed Feed */} + {mixedFeed.map((item, i) => ( +
Video
+ {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 */}
User
- - {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 */} +
+
+
+
+
+ WZ +
-

玩值电竞

+

玩值电竞

- - - - + + + - {/* */}
-
- {/* Hero Banner */} -
+
+ {/* Hero Banner - Kept unchanged as requested */} +
router.push("/events/today")} + > Tournament -
-
-
+
+
+
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

-
+

大秘境车队

-

20层低保来个奶,车头已就位

+

20层低保来个奶,车头已就位

- {/* 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 */} +
-

- - 热门推荐 -

-
- -
- - Hotel -
-
-
-

电竞酒店

- -
-

高端配置 组队开黑

-
- - - Cafe -
-
-
-

附近网咖

- -
-

特权网吧 极速体验

-
- -
-
- - {/* 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.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.name}

-

{star.title}

-
- {star.price} - -
+ {star.name} +
+ + {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() { -
+
+
+ + + + +
+
{(!matchResult || isMatching) && ( <> @@ -198,12 +265,12 @@ export default function PlanetPage() {
Streamer -
+
MATCHED
@@ -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() { <>
- User + User
)}
-
- - - +
+

+ 当前模式: {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" > - User + User
))}
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() {
- Profile + Profile
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 ( +
+
+ +

充值中心

+
+ +
+ {/* Banner */} +
+
+

首充双倍

+

限时特惠 赠送绝版头像框

+
+
+ +
+
+ + {/* Grid */} +
+ {amounts.map((item) => ( + + ))} +
+ + {/* 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 ( +
+
+ +

游戏账号交易

+
{/* Placeholder for right action if needed */}
+
+ + +
+ + + 账号买卖 + + + 账号金融 + + +
+ + + {/* Search & Filter */} +
+
+ + +
+ +
+ + {/* Game Categories */} +
+
+ {games.map((g, i) => ( +
+
+ {g.icon ? ( + {g.name} + ) : ( + + )} +
+ {g.name} +
+ ))} +
+
+ + {/* Account List */} +
+ {accounts.map((acc) => ( +
toast({ title: "即将跳转详情", description: "该功能为模拟演示" })} + > +
+ {acc.title} +
+ {acc.server} +
+
+
+
+

{acc.title}

+
+ {acc.tags.map((tag) => ( + + {tag} + + ))} +
+
+ +
+
+ + {acc.security} + + ¥{acc.price} +
+ +
+
+
+ ))} +
+
+ + + {/* Finance Banner / Header Area */} +
+
+ +
+
+
+ +
+
+

账号资产评估

+

AI 智能估价 · 极速放款 · 银行级风控

+
+
+
+
已评估账号
+
12,508
+
+
+ +
+
+
放款总额
+
¥ 1.2亿
+
+
+
平均额度
+
¥ 3,500
+
+
+
最快到账
+
5 分钟
+
+
+
+ + {/* 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 ( +
+
+ +

游戏代练

+
+ +
+ {/* Banner */} +
+
+

代练通严选

+

官方认证打手 · 保证金赔付 · 效率保障

+
+ +
+ + {/* Filters */} +
+ {["全部", "王者荣耀", "英雄联盟", "无畏契约", "和平精英", "永劫无间"].map((tag, i) => ( + + ))} +
+ + {/* 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 */} +
+ + + +

{game.name}专区

+
+ + {/* Hero */} +
+ {game.name} +
+
+

{game.name}

+
+ 热度 1205万 + 开黑 3.2万车队 +
+
+
+ + {/* Quick Actions */} +
+
+ + 找车队 +
+
+ + 打比赛 +
+
+ + 找陪练 +
+
+ + 看直播 +
+
+ + {/* Content */} +
+

+
+ 热门车队 +

+ + {[1, 2, 3].map((i) => ( +
+
+ Avatar +
+
+

钻石冲分车队 缺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) => ( +
+
+ {`Screenshot +
+ +
+ ))} +
+ )} +
+ +
+ + setPhoneNumber(e.target.value)} + placeholder="请输入您的手机号码" + className="bg-[#12121A] border-white/10 h-11 text-white focus:border-blue-500" + /> +
+
+ + + +

+ + 评估过程完全匿名,不会记录您的账号密码 +

+ + ) : ( + +
+
+
+ +
+
+
+

账号初步估值

+
+ ¥ {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} +
+
+
+ +
+ + +
+
+
+ + )} + + + + + + 联系客服完成变现 + +
+
+
+
+ 微信 +
+
+
+
+

扫描二维码添加客服微信

+

预计放款时间: 5-10分钟

+

客服工作时间: 9:00 - 22:00

+
+
+
+
+
+ ) +} 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