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

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

File diff suppressed because it is too large Load Diff

View File

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

View File

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