Optimize commercial web UI

This commit is contained in:
2026-04-27 15:11:46 +08:00
parent 1f5c452a30
commit ea61063d02
4 changed files with 908 additions and 579 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +1,71 @@
import {
ArrowRight,
CirclePlay,
Coins,
Film,
FolderKanban,
ImagePlus,
LineChart,
MonitorPlay,
ShieldCheck,
Sparkles,
Workflow,
} from "lucide-react";
import Image from "next/image";
import Link from "next/link";
const productHighlights = [
{
title: "生成工作台",
copy: "模型、提示词、时长、比例和素材引用收进一个创作面板。",
title: "面向付费用户的生成工作台",
copy: "模型、提示词、规格、素材引用和积分预估聚合在同一条创作链路里。",
icon: Sparkles,
},
{
title: "素材系统",
copy: "图片、视频、音频参考素材统一入库,创作时直接调用。",
title: "可复用的多媒体素材资产",
copy: "图片、视频、音频统一入库,用户可以在创作时快速检索和引用。",
icon: ImagePlus,
},
{
title: "任务追踪",
copy: "生成状态实时刷新,结果视频、积分消耗和任务详情一屏可见。",
title: "任务、结果和扣费可追溯",
copy: "生成状态、结果视频、冻结积分和最终扣费形成完整交付记录。",
icon: FolderKanban,
},
{
title: "积分与增长",
copy: "充值、兑换码、注册奖励和邀请关系形成完整的商业闭环。",
title: "商业化闭环内置",
copy: "充值、兑换码、注册奖励和邀请关系已经接入后台规则系统。",
icon: Coins,
},
];
const workflow = [
{
step: "01",
title: "配置模型与预算",
copy: "模型能力、输出规格和积分预估前置展示。",
},
{
step: "02",
title: "组织提示词与素材",
copy: "用户在同一屏完成提示词、参考图、参考视频和音频引用。",
},
{
step: "03",
title: "提交并追踪结果",
copy: "任务状态、结果视频、异常信息和扣费记录持续可回看。",
},
];
export default function HomePage() {
return (
<main className="marketing-home">
<header className="marketing-nav">
<div className="marketing-logo">AIVideo</div>
<Link className="marketing-logo" href="/">
<span className="marketing-logo-mark">AI</span>
<span>AIVideo</span>
</Link>
<nav className="marketing-nav-links">
<a href="#product"></a>
<a href="#workflow"></a>
<a href="#ops"></a>
<a href="#product"></a>
<a href="#workflow"></a>
<a href="#ops"></a>
</nav>
<div className="marketing-nav-actions">
<Link href="/login" className="marketing-link-button">
@@ -54,14 +79,15 @@ export default function HomePage() {
<section className="marketing-hero">
<div className="marketing-hero-copy">
<span className="marketing-kicker">AI VIDEO PLATFORM</span>
<h1></h1>
<span className="marketing-kicker">Commercial AI Video Platform</span>
<h1>AIVideo AI </h1>
<p>
AIVideo
AIVideo
AI 线
</p>
<div className="marketing-hero-actions">
<Link href="/register" className="marketing-primary-button">
<ArrowRight size={16} />
</Link>
<Link href="/login" className="marketing-secondary-button">
@@ -70,44 +96,44 @@ export default function HomePage() {
</div>
<div className="marketing-stat-row">
<div>
<strong></strong>
<span></span>
<strong></strong>
<span></span>
</div>
<div>
<strong></strong>
<span></span>
<strong></strong>
<span></span>
</div>
<div>
<strong></strong>
<span></span>
<strong></strong>
<span></span>
</div>
</div>
</div>
<div className="marketing-stage">
<div className="marketing-stage-card marketing-stage-card-dark">
<div className="marketing-stage-label">Creator Workspace</div>
<h2> AI </h2>
<p>
</p>
<div className="marketing-chip-row">
<span>Text to video</span>
<span>Asset references</span>
<span>Task polling</span>
<div className="marketing-hero-visual" aria-label="AIVideo 产品界面预览">
<Image
alt="AIVideo 创作工作台界面预览"
className="marketing-hero-image"
height={1050}
priority
src="/brand/aivideo-hero-preview.png"
width={1600}
/>
<div className="marketing-proof-strip">
<div>
<MonitorPlay size={18} />
<span></span>
<strong> / / </strong>
</div>
</div>
<div className="marketing-stage-grid">
<div className="marketing-stage-card">
<CirclePlay size={18} />
<strong></strong>
<span></span>
<div>
<LineChart size={18} />
<span></span>
<strong> / / </strong>
</div>
<div className="marketing-stage-card">
<Coins size={18} />
<strong></strong>
<span></span>
<div>
<ShieldCheck size={18} />
<span></span>
<strong> / / </strong>
</div>
</div>
</div>
@@ -116,9 +142,9 @@ export default function HomePage() {
<section className="marketing-section marketing-section-light" id="product">
<div className="marketing-section-copy">
<span className="marketing-kicker">Product Capabilities</span>
<h2></h2>
<h2> Demo</h2>
<p>
DEMO
</p>
</div>
<div className="marketing-tile-grid">
@@ -140,24 +166,16 @@ export default function HomePage() {
<section className="marketing-section marketing-section-dark" id="workflow">
<div className="marketing-section-copy">
<span className="marketing-kicker">Workflow</span>
<h2></h2>
<h2></h2>
</div>
<div className="marketing-flow-grid">
<div className="marketing-flow-card">
<span>01</span>
<strong></strong>
<p></p>
</div>
<div className="marketing-flow-card">
<span>02</span>
<strong></strong>
<p></p>
</div>
<div className="marketing-flow-card">
<span>03</span>
<strong></strong>
<p></p>
</div>
{workflow.map((item) => (
<div className="marketing-flow-card" key={item.step}>
<span>{item.step}</span>
<strong>{item.title}</strong>
<p>{item.copy}</p>
</div>
))}
</div>
</section>
@@ -165,18 +183,30 @@ export default function HomePage() {
<div className="marketing-ops-shell">
<div className="marketing-section-copy">
<span className="marketing-kicker">Operations Console</span>
<h2></h2>
<h2>线</h2>
<p>
</p>
</div>
<div className="marketing-ops-card">
<ShieldCheck size={20} />
<strong></strong>
<p>
AIVideo
</p>
<div className="marketing-ops-grid">
<span>
<Workflow size={18} />
</span>
<span>
<Coins size={18} />
</span>
<span>
<Film size={18} />
</span>
<span>
<ShieldCheck size={18} />
</span>
</div>
<Link href="/admin/login" className="marketing-link-inline">
<ArrowRight size={14} />

View File

@@ -2,7 +2,17 @@
import { useQuery } from "@tanstack/react-query";
import clsx from "clsx";
import { Activity, LogOut } from "lucide-react";
import {
Activity,
Clapperboard,
FolderKanban,
ImagePlus,
LogOut,
Plus,
Share2,
UserRound,
WalletCards,
} from "lucide-react";
import Link from "next/link";
import { usePathname, useRouter } from "next/navigation";
import { useEffect, useMemo } from "react";
@@ -16,36 +26,42 @@ const navigation = [
label: "创作",
title: "生成工作台",
description: "组织模型、提示词、素材和任务提交。",
icon: Clapperboard,
},
{
href: "/workspace/tasks",
label: "任务",
title: "任务记录",
description: "追踪生成状态、扣费结果和最终视频。",
icon: FolderKanban,
},
{
href: "/workspace/assets",
label: "素材",
title: "素材管理",
description: "统一管理图片、视频和音频参考素材。",
icon: ImagePlus,
},
{
href: "/wallet",
label: "钱包",
title: "钱包概览",
description: "查看积分、充值和兑换的资金流转。",
icon: WalletCards,
},
{
href: "/invite",
label: "邀请",
title: "邀请中心",
description: "处理邀请关系和增长奖励链路。",
icon: Share2,
},
{
href: "/profile",
label: "账户",
title: "个人资料",
description: "维护基础资料和账户身份信息。",
icon: UserRound,
},
];
@@ -88,23 +104,28 @@ export function SiteShell({ children }: { children: React.ReactNode }) {
<header className="site-topbar">
<div className="site-brand-block">
<Link className="site-brand" href="/">
<span className="site-brand-mark">AI</span>
AIVideo
</Link>
<span className="site-brand-subtitle">AI Video Platform</span>
<span className="site-brand-subtitle">Creator Console</span>
</div>
<nav className="site-topnav">
{navigation.map((item) => (
<Link
key={item.href}
href={item.href}
className={clsx("site-topnav-link", {
active: current.href === item.href,
})}
>
{item.label}
</Link>
))}
{navigation.map((item) => {
const Icon = item.icon;
return (
<Link
key={item.href}
href={item.href}
className={clsx("site-topnav-link", {
active: current.href === item.href,
})}
>
<Icon size={15} />
<span>{item.label}</span>
</Link>
);
})}
</nav>
<div className="site-userbar">
@@ -112,6 +133,10 @@ export function SiteShell({ children }: { children: React.ReactNode }) {
<strong>{data.nickname || data.username}</strong>
<span>{data.email}</span>
</div>
<Link href="/workspace/create" className="primary-button compact-button">
<Plus size={14} />
</Link>
<button
className="ghost-button compact-button"
onClick={async () => {
@@ -129,7 +154,7 @@ export function SiteShell({ children }: { children: React.ReactNode }) {
<main className="site-main-shell">
<section className="site-page-hero">
<div className="site-page-copy">
<span className="header-kicker">Creative Workspace</span>
<span className="header-kicker">Creator Console</span>
<h1>{current.title}</h1>
<p>{current.description}</p>
</div>
@@ -144,16 +169,16 @@ export function SiteShell({ children }: { children: React.ReactNode }) {
<section className="site-highlight-strip">
<div className="site-highlight-card">
<span></span>
<strong></strong>
<span></span>
<strong>{data.publicId ? "已同步用户身份" : "当前会话有效"}</strong>
</div>
<div className="site-highlight-card">
<span></span>
<strong></strong>
<span></span>
<strong></strong>
</div>
<div className="site-highlight-card">
<span></span>
<strong></strong>
<span></span>
<strong></strong>
</div>
</section>