diff --git a/frontend/web/public/brand/mobile-download-qr.png b/frontend/web/public/brand/mobile-download-qr.png new file mode 100644 index 00000000..e51d33b3 Binary files /dev/null and b/frontend/web/public/brand/mobile-download-qr.png differ diff --git a/frontend/web/src/component/landing/LandingPage.jsx b/frontend/web/src/component/landing/LandingPage.jsx index ab3be550..07328971 100644 --- a/frontend/web/src/component/landing/LandingPage.jsx +++ b/frontend/web/src/component/landing/LandingPage.jsx @@ -73,10 +73,12 @@ const workflow = [ const faqs = [ { question: "需要准备教材或写好稿子吗?", answer: "不需要。你可以直接选择一个场景开始,AI 老师会根据你的水平和回应自然推进对话。" }, { question: "免费版可以练习什么?", answer: "免费版包含每日自由对话额度、每日普通场景和全部 AI 老师,适合先建立稳定开口的习惯。" }, - { question: "移动端什么时候可以下载?", answer: "移动端正在准备正式发布。商店链接配置完成后,这里会自动显示 iOS 和 Android 下载入口。" }, + { question: "移动端怎么下载安装?", answer: "扫描平台区域的二维码即可打开移动端下载页。也可以点击旁边的 Mobile app 标签,在新页面完成下载安装。" }, { question: "AI 的反馈可以替代老师吗?", answer: "UniSpeaking 用于日常练习和即时反馈,不替代专业教师、考试官方评分或正式语言诊断。" }, ]; +const mobileDownloadUrl = "http://fir.qiniuapi.com/v1zyqajm?utm_source=fir&utm_medium=qr"; + function Brand() { return ( @@ -271,7 +273,7 @@ export function LandingPage({ onStart, onLogin, onWeb, onSpecialty }) {

PRACTICE FOR REAL LIFE

你想说的,
都可以成为练习。

从日常交流到重要目标,选择一个真实场景,马上进入更有方向的对话。

IELTS SPEAKING

IELTS 口语

Part 1、Part 2、Part 3,从回答结构到表达表现,完整练习每一部分。

INTERVIEW PRACTICE

英文面试

用更接近真实面试的方式,练习自我介绍、追问和清晰表达。

-

PRACTICE WHEREVER YOU ARE

电脑前深入练,
手机上随时说。

Web 端适合完整训练和复盘,移动端适合把零碎时间变成开口时间。你的练习路径,会跟着你走。

}>进入 Web 端无需安装,即开即用
app.unispeaking.com
自由对话今天想聊点什么?
{[.25, .5, .8, .43, .68, .32, .58, .92, .44, .7, .35, .62].map((height, index) => )}
开始对话
移动端即将上线把练习放进口袋
Mobile appComing soon
+

PRACTICE WHEREVER YOU ARE

电脑前深入练,
手机上随时说。

Web 端适合完整训练和复盘,移动端适合把零碎时间变成开口时间。扫描二维码,随时把练习带在身边。

}>进入 Web 端Web 与移动端练习同步
app.unispeaking.com
自由对话今天想聊点什么?
{[.25, .5, .8, .43, .68, .32, .58, .92, .44, .7, .35, .62].map((height, index) => )}
开始对话

MEMBERSHIP PREVIEW

先免费开始,
再按你的节奏升级。

免费版足够你建立习惯。需要更长时间、更完整的专项训练时,再选择适合自己的方案。

{plans.map((plan) =>
{plan.id === "pro" ? "最受欢迎" : plan.id === "free" ? "从这里开始" : "目标训练"}

{plan.name}

{plan.id === "pro" && 推荐}

{plan.desc}

{plan.price === "0" ? "免费" : `¥${plan.price}`}{plan.suffix && {plan.suffix}}
    {plan.features.map((feature) =>
  • {feature}
  • )}
}>{plan.id === "free" ? "免费开始" : "加入候补"}
)}

会员支付正在准备中,正式权益和价格以发布版本为准。

diff --git a/frontend/web/src/component/landing/landing.css b/frontend/web/src/component/landing/landing.css index b8346fea..41261767 100644 --- a/frontend/web/src/component/landing/landing.css +++ b/frontend/web/src/component/landing/landing.css @@ -276,13 +276,18 @@ .landing-device--mobile { right: 2%; bottom: 4px; width: 160px; height: 320px; padding: 8px; border: 4px solid #2f2f2d; border-radius: 24px; transform: rotate(4deg); background: #292927; } .landing-device__speaker { position: absolute; z-index: 2; top: 8px; left: 50%; width: 42px; height: 5px; border-radius: 5px; transform: translateX(-50%); background: #30302e; } .landing-device--mobile .landing-device__screen { width: 100%; height: 100%; padding: 44px 14px 22px; display: flex; flex-direction: column; align-items: center; justify-content: center; border-radius: 17px; color: #1c1c1b; text-align: center; background: #f4f4f0; } +.landing-mobile-download { text-decoration: none; } .landing-device--mobile img { width: 42px; height: 42px; margin-bottom: 15px; border-radius: 8px; } +.landing-device--mobile .landing-mobile-download__qr { width: 82px; height: 82px; padding: 6px; object-fit: contain; border: 1px solid #deded8; border-radius: 6px; background: #fff; image-rendering: pixelated; } .landing-device--mobile strong { font-size: 11px; } .landing-device--mobile span { margin-top: 6px; color: #83837d; font-size: 8px; } -.landing-device--mobile .landing-device__screen i { width: 40px; height: 40px; margin-top: 28px; display: grid; place-items: center; border: 1px solid #d6d6d0; border-radius: 50%; background: #fff; } +.landing-device--mobile .landing-device__screen i { width: 40px; height: 40px; margin-top: 18px; display: grid; place-items: center; border: 1px solid #d6d6d0; border-radius: 50%; background: #fff; } .landing-device--mobile svg { width: 18px; height: 18px; } -.landing-devices__badge { position: absolute; z-index: 4; right: 32px; bottom: 22px; padding: 10px 12px; display: flex; align-items: center; gap: 9px; border: 1px solid #d6d6d0; border-radius: 7px; color: #282826; background: #fff; box-shadow: 0 16px 34px rgba(0,0,0,.24); } +.landing-devices__badge { position: absolute; z-index: 4; right: 32px; bottom: 22px; padding: 10px 12px; display: flex; align-items: center; gap: 9px; border: 1px solid #d6d6d0; border-radius: 7px; color: #282826; background: #fff; box-shadow: 0 16px 34px rgba(0,0,0,.24); text-decoration: none; transition: transform .2s ease, box-shadow .2s ease; } +.landing-devices__badge:hover { transform: translateY(-2px); box-shadow: 0 20px 40px rgba(0,0,0,.3); } +.landing-devices__badge:focus-visible, .landing-mobile-download:focus-visible { outline: 3px solid var(--landing-yellow); outline-offset: 3px; } .landing-devices__badge svg { width: 21px; height: 21px; } +.landing-devices__badge > svg:last-child { width: 12px; height: 12px; margin-left: 2px; } .landing-devices__badge strong, .landing-devices__badge small { display: block; } .landing-devices__badge strong { font-size: 9px; } .landing-devices__badge small { margin-top: 3px; color: #898983; font-size: 7px; } @@ -470,8 +475,9 @@ .landing-mini-wave { height: 38px; } .landing-device--mobile { right: -2%; width: 112px; height: 230px; border-radius: 20px; } .landing-device--mobile .landing-device__screen { padding-inline: 8px; } + .landing-device--mobile .landing-mobile-download__qr { width: 58px; height: 58px; padding: 5px; margin-bottom: 10px; } .landing-device--mobile strong { font-size: 8px; } - .landing-device--mobile .landing-device__screen i { width: 32px; height: 32px; margin-top: 20px; } + .landing-device--mobile .landing-device__screen i { width: 32px; height: 32px; margin-top: 12px; } .landing-devices__badge { right: 4px; bottom: 2px; } .landing-plan { min-height: 400px; padding: 24px; } .landing-pricing__footnote { align-items: flex-start; text-align: left; line-height: 1.5; }