Files
qihuaiflow/frontend/src/pages/front/LandingPage.tsx
T

423 lines
24 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState, useEffect, useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { mockAdBanners, mockApps } from '@/mock/data';
import type { AdBanner, MarketApp } from '@/types';
import './LandingPage.css';
/* ---------- 内联 Lucide 风格图标(满足"用 Lucide 图标、禁 emoji"铁律) ---------- */
const Icon: React.FC<{ d: React.ReactNode; size?: number }> = ({ d, size = 20 }) => (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor"
strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round">{d}</svg>
);
/* ---------- 品牌同系渐变(仅靛蓝→青蓝,无第三色相) ---------- */
const appGradients: Record<string, string> = {
a1: 'linear-gradient(135deg,#5B5FED 0%,#4F8DF9 100%)',
a2: 'linear-gradient(135deg,#6366F1 0%,#60A5FA 100%)',
a3: 'linear-gradient(135deg,#5B5FED 0%,#818CF8 100%)',
a4: 'linear-gradient(135deg,#4F8DF9 0%,#38BDF8 100%)',
a5: 'linear-gradient(135deg,#6366F1 0%,#7DD3FC 100%)',
a6: 'linear-gradient(135deg,#5B5FED 0%,#8185F5 100%)',
a7: 'linear-gradient(135deg,#4F8DF9 0%,#818CF8 100%)',
a8: 'linear-gradient(135deg,#6366F1 0%,#4F8DF9 100%)',
};
const gradFor = (id: string) => appGradients[id] || 'linear-gradient(135deg,#5B5FED 0%,#4F8DF9 100%)';
const typeLabels: Record<string, string> = { skill: 'Skill', agent: 'Agent', mcp: 'MCP' };
const typeBadge: Record<string, string> = {
skill: 'badge-skill', agent: 'badge-agent', mcp: 'badge-mcp',
};
/* ---------- 文案数据(来自用户原始需求提炼) ---------- */
const painPoints = [
{ d: <><path d="M12 1v22" /><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" /></>,
title: '大模型 API 贵且复杂', desc: '多家模型计费规则不一、调用门槛高,个人与小企业难以低成本接入。' },
{ d: <><path d="M12 20h9" /><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z" /></>,
title: 'Prompt 难调试', desc: '缺乏可视化编排与复用,效果全靠手感,团队无法沉淀最佳实践。' },
{ d: <><ellipse cx="12" cy="5" rx="9" ry="3" /><path d="M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5" /><path d="M3 12c0 1.7 4 3 9 3s9-1.3 9-3" /></>,
title: '数据孤岛', desc: '知识散落在文档、表格、聊天记录里,AI 答非所问,价值无法被激活。' },
{ d: <><path d="M3 3v18h18" /><path d="m19 9-5 5-4-4-3 3" /></>,
title: '个人开发者无变现渠道', desc: '做出好用的 AI 能力却找不到分发与交易场景,难以转化为收入。' },
];
const valueProps = [
{ d: <><path d="M12 1v22" /><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" /></>,
title: '低价订阅 · 无限 Token', kw: '无限Token',
desc: '一个低价会员即可放开使用,告别按次计费与额度焦虑,放心把 AI 用进日常。' },
{ d: <><rect x="3" y="3" width="7" height="7" rx="1.2" /><rect x="14" y="3" width="7" height="7" rx="1.2" /><rect x="3" y="14" width="7" height="7" rx="1.2" /><rect x="14" y="14" width="7" height="7" rx="1.2" /></>,
title: '垂直可用办公模板', kw: '办公提效',
desc: '写 PPT、出投标书、做运营、排版公众号——开箱即用的模板,把重复劳动交给 AI。' },
{ d: <><path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4Z" /><path d="M3 6h18" /><path d="M16 10a4 4 0 0 1-8 0" /></>,
title: '可交易的技能市场', kw: 'AI变现',
desc: '把自己打磨的技能上架交易,按订阅 / 下载获得收益,能力即资产。' },
{ d: <><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" /></>,
title: 'AI 创作应用基地', kw: '',
desc: '写小说、做漫剧、谱音乐——在 AI 试炼场低成本试错,让创作想法快速跑通。' },
{ d: <><path d="M3 12a9 9 0 1 0 9-9" /><path d="M3 3v6h6" /><path d="M12 7v5l3 3" /></>,
title: '低成本养模型', kw: '',
desc: '低成本微调 / 托管你的专属模型——养马、养龙虾、养螃蟹,把"养模型"变成可负担的日常。' },
];
const features = [
{ d: <><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" /></>,
title: '多模型 AI 对话', desc: 'DeepSeek / Qwen / 国际模型自由切换,按需选用最优模型。' },
{ d: <><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" /><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z" /></>,
title: '私有知识库', desc: '上传文档构建专属知识库,AI 回答基于你的内容,更精准可靠。' },
{ d: <><rect x="3" y="3" width="7" height="7" rx="1.2" /><rect x="14" y="3" width="7" height="7" rx="1.2" /><rect x="3" y="14" width="7" height="7" rx="1.2" /><rect x="14" y="14" width="7" height="7" rx="1.2" /></>,
title: '技能 / 应用中心', desc: '丰富的 Skills、Agent、MCP 应用,即装即用,一键接入工作流。' },
{ d: <><circle cx="12" cy="12" r="10" /><path d="M12 6v6l4 2" /></>,
title: 'Token 驾驶舱', desc: '实时监控 Token 消耗,费用透明可控,每一笔都有据可查。' },
{ d: <><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" /><circle cx="9" cy="7" r="4" /><path d="M23 21v-2a4 4 0 0 0-3-3.87" /><path d="M16 3.13a4 4 0 0 1 0 7.75" /></>,
title: 'AI 微信Bot', desc: '个人微信 AI 助手直接对接,消息自动回复,AI 融入你的日常沟通。' },
{ d: <><polyline points="16 3 21 3 21 8" /><line x1="4" y1="20" x2="21" y2="3" /><polyline points="21 16 21 21 16 21" /><line x1="15" y1="15" x2="21" y2="21" /><line x1="4" y1="4" x2="9" y2="9" /></>,
title: '自动化任务编排', desc: '关键词触发、定时执行等自动化任务,让 AI 按你的节奏工作。' },
];
const LandingPage: React.FC = () => {
const navigate = useNavigate();
const [currentSlide, setCurrentSlide] = useState(0);
const [isPaused, setIsPaused] = useState(false);
const [mobileMenu, setMobileMenu] = useState(false);
const [banners, setBanners] = useState<AdBanner[]>(
mockAdBanners.filter(b => b.status === 'active')
);
const publishedApps = mockApps.filter(a => a.status === 'published');
const topSkills = [...publishedApps].sort((a, b) => b.installCount - a.installCount).slice(0, 5);
const nextSlide = useCallback(() => {
if (banners.length === 0) return;
setCurrentSlide(prev => (prev + 1) % banners.length);
}, [banners.length]);
useEffect(() => {
if (banners.length <= 1 || isPaused) return;
const timer = setInterval(nextSlide, 4500);
return () => clearInterval(timer);
}, [banners.length, isPaused, nextSlide]);
// 精选推荐:对接平台「广告位」能力——拉取后台已上架(active)的真实广告轮播;
// 无数据或接口异常时回退到内置示例,保证首屏不空。
useEffect(() => {
let alive = true;
fetch('/app/api/market/ads')
.then(r => (r.ok ? r.json() : Promise.reject(r.status)))
.then((rows: any[]) => {
if (!alive || !Array.isArray(rows) || rows.length === 0) return;
const mapped: AdBanner[] = rows.map(a => ({
id: a.id,
title: a.title,
imageUrl: a.image_url || '',
linkAppId: a.link_app_id || undefined,
linkAppName: a.link_app_name || undefined,
sortOrder: a.sort_order ?? 0,
clickCount: a.click_count ?? 0,
status: (a.status as 'active' | 'inactive') || 'active',
createdAt: a.created_at || '',
}));
setBanners(mapped);
setCurrentSlide(0);
})
.catch(() => { /* 静默失败,保留 mock 回退 */ });
return () => { alive = false; };
}, []);
// SEO / GEO:动态写入标题与描述
useEffect(() => {
document.title = '七虎AI · 个人体验 AI、办公提效与 AI 创收的一站式平台';
let meta = document.querySelector('meta[name="description"]');
if (!meta) { meta = document.createElement('meta'); meta.setAttribute('name', 'description'); document.head.appendChild(meta); }
meta.setAttribute('content', '七虎AI 是面向个人与职场用户的 AI 平台:低价订阅无限 Token、垂直办公模板、可交易技能市场、AI 创作试炼场与低成本养模型,让每个人用 AI 把事做成。');
}, []);
const goLogin = () => navigate('/login');
// 点击 logo 回到首页顶部(.lp 是滚动容器,用 scrollTo 而非 window)
const goTop = () => {
const el = document.querySelector('.lp') as HTMLElement | null;
if (el) el.scrollTo({ top: 0, behavior: 'smooth' });
else window.scrollTo({ top: 0, behavior: 'smooth' });
};
// 页内锚点导航:原生 <a href="#id"> 会触发路由跳转而非滚动,
// 故改为编程式 scrollIntoView + preventDefault,仅在 LandingPage 内部滚动容器内跳转。
const anchorClick = (id: string, after?: () => void) => (e: React.MouseEvent) => {
e.preventDefault();
document.getElementById(id)?.scrollIntoView({ behavior: 'smooth', block: 'start' });
after?.();
};
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: '七虎AI',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
aggregateRating: { '@type': 'AggregateRating', ratingValue: '4.8', reviewCount: '1000' },
};
return (
<div className="lp">
{/* JSON-LD 富媒体摘要(SEO / GEO) */}
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
{/* 浮层玻璃顶栏 */}
<header className="lp-header glass">
<div className="lp-header-inner">
<div className="lp-brand" onClick={goTop} role="button" tabIndex={0}
onKeyDown={e => e.key === 'Enter' && goTop()} aria-label="回到顶部">
<svg width="30" height="30" viewBox="0 0 32 32" fill="none" aria-hidden>
<rect width="32" height="32" rx="8" fill="#5B5FED" />
<path d="M8 20V12l4 4 4-4v8" stroke="#fff" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" fill="none" />
<path d="M6 22h20" stroke="#fff" strokeWidth="1.5" strokeLinecap="round" opacity="0.5" />
</svg>
<span className="brand-name">七虎AI</span>
</div>
<nav className="lp-nav" aria-label="主导航">
<a href="#positioning" onClick={anchorClick('positioning')}>平台定位</a>
<a href="#value" onClick={anchorClick('value')}>平台价值</a>
<a href="#top" onClick={anchorClick('top')}>热门技能</a>
<a href="#market" onClick={anchorClick('market')}>应用中心</a>
<a href="#features" onClick={anchorClick('features')}>平台能力</a>
</nav>
<div className="lp-header-actions">
<button className="lp-btn lp-btn-ghost" onClick={goLogin}>登录</button>
<button className="lp-btn lp-btn-primary" onClick={goLogin}>免费注册</button>
</div>
<button className="lp-menu-toggle" aria-label="菜单" onClick={() => setMobileMenu(v => !v)}>
<Icon d={mobileMenu ? <><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></> : <><line x1="3" y1="6" x2="21" y2="6" /><line x1="3" y1="12" x2="21" y2="12" /><line x1="3" y1="18" x2="21" y2="18" /></>} size={22} />
</button>
</div>
{mobileMenu && (
<div className="lp-mobile-menu">
<a href="#positioning" onClick={anchorClick('positioning', () => setMobileMenu(false))}>平台定位</a>
<a href="#value" onClick={anchorClick('value', () => setMobileMenu(false))}>平台价值</a>
<a href="#top" onClick={anchorClick('top', () => setMobileMenu(false))}>热门技能</a>
<a href="#market" onClick={anchorClick('market', () => setMobileMenu(false))}>应用中心</a>
<a href="#features" onClick={anchorClick('features', () => setMobileMenu(false))}>平台能力</a>
<div className="lp-mobile-actions">
<button className="lp-btn lp-btn-ghost" onClick={() => { setMobileMenu(false); goLogin(); }}>登录</button>
<button className="lp-btn lp-btn-primary" onClick={() => { setMobileMenu(false); goLogin(); }}>免费注册</button>
</div>
</div>
)}
</header>
<main>
{/* Hero:左=标题文案(1/3),右=精选推荐广告位(2/3) */}
<section className="lp-hero">
<div className="lp-hero-grid">
<div className="lp-hero-text">
<h1 className="lp-title">让每个人都能<br /><span className="lp-accent">用 AI 把事做成</span></h1>
<p className="lp-desc">
七虎AI 是个人体验 AI、办公提效、AI 创收与自我提升的一站式交互平台。
提供垂直可用的办公模板、可交易的市场与低成本养模型能力,帮你把 AI 用进日常。
</p>
<div className="lp-actions">
<button className="lp-btn lp-btn-primary lp-btn-lg" onClick={goLogin}>免费开始使用</button>
<button className="lp-btn lp-btn-outline lp-btn-lg" onClick={anchorClick('market')}>浏览应用中心</button>
</div>
<div className="lp-stats">
<div><span className="lp-stat-num">3,500+</span><span className="lp-stat-label">活跃用户</span></div>
<div><span className="lp-stat-num">120+</span><span className="lp-stat-label">应用 / Skills</span></div>
<div><span className="lp-stat-num">99.8%</span><span className="lp-stat-label">服务可用率</span></div>
</div>
</div>
{/* Hero 右侧:精选推荐广告位(占 2/3) */}
<div className="lp-hero-ad">
{banners.length > 0 && (
<div className="lp-ad-head">
<span className="lp-ad-title">精选推荐</span>
</div>
)}
<div className="lp-carousel" onMouseEnter={() => setIsPaused(true)} onMouseLeave={() => setIsPaused(false)}>
<div className="lp-track" style={{ transform: `translateX(-${currentSlide * 100}%)` }}>
{banners.map(b => (
<div key={b.id} className="lp-slide">
<div className="lp-carousel-card" style={{ background: gradFor(b.linkAppId || 'a1') }}>
{b.imageUrl && (<><img className="lp-cc-cover" src={b.imageUrl} alt={b.title} loading="lazy" /><span className="lp-cc-scrim" /></>)}
<div className="lp-cc-content">
<div className="lp-cc-badge">推荐</div>
<h3 className="lp-cc-title">{b.title}</h3>
{b.linkAppName && <p className="lp-cc-sub">立即体验 {b.linkAppName}</p>}
<button className="lp-cc-cta" onClick={goLogin}>查看详情 <Icon d={<polyline points="9 18 15 12 9 6" />} size={14} /></button>
</div>
{!b.imageUrl && <div className="lp-cc-visual"><span className="c1" /><span className="c2" /><span className="c3" /></div>}
</div>
</div>
))}
</div>
{banners.length > 1 && (
<>
<button className="lp-arrow lp-arrow-l" onClick={() => setCurrentSlide(p => (p - 1 + banners.length) % banners.length)} aria-label="上一张"><Icon d={<polyline points="15 18 9 12 15 6" />} size={20} /></button>
<button className="lp-arrow lp-arrow-r" onClick={nextSlide} aria-label="下一张"><Icon d={<polyline points="9 18 15 12 9 6" />} size={20} /></button>
<div className="lp-dots">{banners.map((_, i) => (<button key={i} className={`lp-dot ${i === currentSlide ? 'on' : ''}`} onClick={() => setCurrentSlide(i)} aria-label={`第${i + 1}张`} />))}</div>
</>
)}
</div>
</div>
</div>
</section>
{/* 平台定位(痛点) */}
<section className="lp-section" id="positioning">
<div className="lp-inner">
<div className="lp-section-head">
<h2 className="lp-h2">我们解决什么</h2>
<p className="lp-sub">七虎AI 帮你绕过个人与职场使用 AI 时最高频的痛点</p>
</div>
<div className="lp-grid lp-grid-4">
{painPoints.map((p, i) => (
<article key={i} className="lp-pain">
<div className="lp-pain-icon"><Icon d={p.d} size={24} /></div>
<h3 className="lp-pain-title">{p.title}</h3>
<p className="lp-pain-desc">{p.desc}</p>
</article>
))}
</div>
</div>
</section>
{/* 平台价值 */}
<section className="lp-section lp-section-alt" id="value">
<div className="lp-inner">
<div className="lp-section-head">
<h2 className="lp-h2">在七虎AI 你能获得</h2>
<p className="lp-sub">降低订阅成本、提供无限 Token、垂直模板与可交易市场</p>
</div>
<div className="lp-grid lp-grid-5">
{valueProps.map((v, i) => (
<article key={i} className="lp-value">
<div className="lp-value-icon"><Icon d={v.d} size={24} /></div>
<h3 className="lp-value-title">{v.kw ? <>{v.title.replace(v.kw, '')}<span className="kw"> {v.kw}</span></> : v.title}</h3>
<p className="lp-value-desc">{v.desc}</p>
</article>
))}
</div>
</div>
</section>
{/* 热门技能榜 Top5 */}
<section className="lp-section" id="top">
<div className="lp-inner">
<div className="lp-section-head">
<h2 className="lp-h2">热门技能榜 · Top 5</h2>
<p className="lp-sub">涵盖 Skills、Agent、MCP Client,按下载 / 安装量排行,看看大家都在用哪些能力</p>
</div>
<ol className="lp-rank">
{topSkills.map((app, i) => (
<li key={app.id} className="lp-rank-item" onClick={goLogin} role="button" tabIndex={0}
onKeyDown={e => e.key === 'Enter' && goLogin()}>
<span className={`lp-rank-no ${i === 0 ? 'top' : ''}`}>{i + 1}</span>
<span className="lp-rank-cover" style={{ background: gradFor(app.id) }}>
<span className={`lp-rank-badge ${typeBadge[app.type]}`}>{typeLabels[app.type]}</span>
</span>
<span className="lp-rank-main">
<span className="lp-rank-name">{app.name}</span>
<span className="lp-rank-desc">{app.description}</span>
</span>
<span className="lp-rank-meta">
<span className="lp-rank-installs"><Icon d={<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />} size={13} /> {app.installCount.toLocaleString()}</span>
<span className="lp-rank-rating">{(app.ratingAvg > 0 ? app.ratingAvg : '—')}</span>
</span>
</li>
))}
</ol>
</div>
</section>
{/* 应用中心预览 */}
<section className="lp-section lp-section-alt" id="market">
<div className="lp-inner">
<div className="lp-section-head">
<h2 className="lp-h2">应用中心</h2>
<p className="lp-sub">平台为订阅会员提供的免费 AI 应用,帮你快速进入创作与工作场景</p>
</div>
<div className="lp-app-grid">
{publishedApps.map(app => (
<article key={app.id} className="lp-app-card" onClick={goLogin} role="button" tabIndex={0}
onKeyDown={e => e.key === 'Enter' && goLogin()}>
<div className="lp-app-cover" style={{ background: gradFor(app.id) }}>
<span className={`lp-app-badge ${typeBadge[app.type]}`}>{typeLabels[app.type]}</span>
<span className="lp-app-price">会员免费</span>
</div>
<div className="lp-app-body">
<h4 className="lp-app-name">{app.name}</h4>
<p className="lp-app-desc">{app.description}</p>
<div className="lp-app-meta">
<span><Icon d={<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />} size={12} /> {app.ratingAvg > 0 ? app.ratingAvg : '-'}</span>
<span>{app.installCount.toLocaleString()} 次安装</span>
</div>
</div>
</article>
))}
</div>
<div className="lp-more">
<button className="lp-btn lp-btn-outline" onClick={goLogin}>登录查看更多应用 <Icon d={<polyline points="9 18 15 12 9 6" />} size={14} /></button>
</div>
</div>
</section>
{/* 平台能力 */}
<section className="lp-section" id="features">
<div className="lp-inner">
<div className="lp-section-head">
<h2 className="lp-h2">平台核心能力</h2>
<p className="lp-sub">从对话到自动化,七虎AI 提供完整的 AI 工作流解决方案</p>
</div>
<div className="lp-grid lp-grid-3">
{features.map((f, i) => (
<article key={i} className="lp-feature">
<div className="lp-feature-icon"><Icon d={f.d} size={26} /></div>
<h3 className="lp-feature-title">{f.title}</h3>
<p className="lp-feature-desc">{f.desc}</p>
</article>
))}
</div>
</div>
</section>
{/* CTA */}
<section className="lp-cta">
<div className="lp-inner">
<h2 className="lp-cta-title">准备好开始了吗?</h2>
<p className="lp-cta-desc">免费注册即可体验全部功能,无需任何技术背景</p>
<button className="lp-btn lp-btn-primary lp-btn-lg" onClick={goLogin}>免费注册,立即体验</button>
</div>
</section>
</main>
{/* Footer(SEO 链接 + 富媒体) */}
<footer className="lp-footer">
<div className="lp-inner">
<div className="lp-footer-grid">
<div className="lp-footer-brand">
<div className="lp-brand" onClick={goTop} role="button" tabIndex={0}
onKeyDown={e => e.key === 'Enter' && goTop()} aria-label="回到顶部">
<svg width="26" height="26" viewBox="0 0 32 32" fill="none" aria-hidden>
<rect width="32" height="32" rx="8" fill="#5B5FED" />
<path d="M8 20V12l4 4 4-4v8" stroke="#fff" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" fill="none" />
</svg>
<span className="brand-name">七虎AI</span>
</div>
<p>个人体验 AI、办公提效与 AI 创收的一站式平台。</p>
</div>
<div className="lp-footer-col"><h4>产品</h4><a href="#features" onClick={anchorClick('features')}>AI 聊天</a><a href="#market" onClick={anchorClick('market')}>应用中心</a><a href="#value" onClick={anchorClick('value')}>技能交易</a></div>
<div className="lp-footer-col"><h4>资源</h4><a href="#top" onClick={anchorClick('top')}>热门技能</a><a href="#positioning" onClick={anchorClick('positioning')}>平台定位</a><a onClick={goLogin} role="button">帮助中心</a></div>
<div className="lp-footer-col"><h4>公司</h4><a onClick={goLogin} role="button">关于我们</a><a onClick={goLogin} role="button">联系我们</a><a onClick={goLogin} role="button">加入我们</a></div>
</div>
<div className="lp-footer-bottom">© 2026 七虎AI · 让每个人都能用 AI 把事做成</div>
</div>
</footer>
</div>
);
};
export default LandingPage;