|
- <template>
- <div class="overflow-hidden">
- <!-- ==================== 1. Hero ==================== -->
- <section class="relative border-b border-[var(--c-e8eef7)] bg-gradient-to-br from-[var(--c-ffffff)] via-[var(--c-eef6ff)] to-[var(--c-f3fbf9)]">
- <div class="pointer-events-none absolute -right-32 -top-40 size-[420px] rounded-full bg-[var(--c-0b8cff)]/10 blur-3xl" />
- <div class="pointer-events-none absolute -bottom-40 -left-24 size-[360px] rounded-full bg-[var(--c-20d3a2)]/10 blur-3xl" />
-
- <div class="relative mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8 lg:py-24">
- <div class="grid items-center gap-12 lg:grid-cols-2 lg:gap-16">
- <!-- 左:文案 -->
- <div>
- <span class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-ffffff)] px-3.5 py-1.5 text-xs font-extrabold text-[var(--c-0b8cff)] shadow-[0_4px_14px_var(--sh-11-140-255-120)]">
- <UIcon name="i-lucide-sparkles" class="size-3.5" />
- 一站式 AI 创作平台
- </span>
-
- <h1 class="mt-5 text-4xl font-extrabold leading-[1.15] tracking-tight text-[var(--c-172033)] sm:text-5xl lg:text-[56px]">
- 解放你的<br>
- <span class="bg-gradient-to-r from-[var(--c-0b8cff)] via-[var(--c-3aa9ff)] to-[var(--c-20d3a2)] bg-clip-text text-transparent">生产力</span>
- </h1>
-
- <p class="mt-5 max-w-xl text-base leading-relaxed text-[var(--c-66758a)] sm:text-lg">
- AI 取名、动漫头像、证件照、AI 绘画……把重复又费时的创作交给 AI,
- 几秒钟拿到可直接用的结果。按点数计费,多端通用。
- </p>
-
- <div class="mt-8 flex flex-col gap-3 sm:flex-row sm:items-center">
- <NuxtLink
- to="/writing/naming/"
- class="inline-flex h-13 items-center justify-center gap-2 rounded-full bg-gradient-to-r from-[var(--c-0b8cff)] to-[var(--c-3aa9ff)] px-8 text-base font-bold text-white shadow-[0_14px_30px_var(--sh-11-140-255-280)] transition-all hover:-translate-y-0.5 hover:shadow-[0_18px_36px_var(--sh-11-140-255-360)]"
- >
- <UIcon name="i-lucide-zap" class="size-5" />
- 免费开始创作
- </NuxtLink>
- <a
- href="#tools"
- class="inline-flex h-13 items-center justify-center gap-2 rounded-full bg-[var(--c-ffffff)] px-8 text-base font-bold text-[var(--c-172033)] shadow-[0_8px_20px_var(--sh-23-32-51-60)] transition-colors hover:bg-[var(--c-f7faff)]"
- >
- 查看全部工具
- <UIcon name="i-lucide-arrow-down" class="size-4" />
- </a>
- </div>
-
- </div>
-
- <!-- 右:动漫头像示例(原图 / 生成图 对照) -->
- <div class="relative mx-auto w-full max-w-lg lg:max-w-none">
- <div class="grid grid-cols-2 gap-4 sm:gap-5">
- <!-- 原图 -->
- <figure class="group relative overflow-hidden rounded-3xl bg-[var(--c-e7eef8)] shadow-[0_18px_44px_var(--sh-23-58-110-120)]">
- <img
- :src="demo.original"
- alt="上传的原始照片示例"
- class="aspect-[3/4] w-full object-cover"
- loading="eager"
- >
- <figcaption class="absolute left-3 top-3 rounded-full bg-[var(--c-0f172a)]/55 px-2.5 py-1 text-[11px] font-bold text-white backdrop-blur">
- 原图
- </figcaption>
- </figure>
-
- <!-- 生成图 -->
- <figure class="group relative overflow-hidden rounded-3xl bg-[var(--c-e7eef8)] shadow-[0_24px_54px_var(--sh-11-140-255-220)] ring-2 ring-[var(--c-0b8cff)] sm:translate-y-6">
- <img
- :src="demo.anime"
- alt="AI 生成的动漫头像示例"
- class="aspect-[3/4] w-full object-cover"
- loading="eager"
- >
- <figcaption class="absolute left-3 top-3 rounded-full bg-[var(--c-0b8cff)] px-2.5 py-1 text-[11px] font-bold text-white">
- AI 动漫头像
- </figcaption>
- </figure>
- </div>
-
- <!-- 浮标 -->
- <div class="absolute -top-4 right-2 flex items-center gap-1.5 rounded-full bg-[var(--c-ffffff)] px-3.5 py-2 shadow-[0_10px_24px_var(--sh-23-58-110-160)]">
- <UIcon name="i-lucide-sparkles" class="size-4 text-[var(--c-ff8a00)]" />
- <span class="text-xs font-extrabold text-[var(--c-172033)]">10 秒出图</span>
- </div>
- </div>
- </div>
- </div>
- </section>
-
- <!-- ==================== 2. 工具(Services) ==================== -->
- <section id="tools" class="mx-auto max-w-7xl scroll-mt-20 px-4 py-16 sm:px-6 lg:px-8 lg:py-24">
- <div class="mx-auto max-w-2xl text-center">
- <span class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-eef7ff)] px-3 py-1 text-xs font-extrabold text-[var(--c-0b8cff)]">
- <UIcon name="i-lucide-layout-grid" class="size-3.5" />
- AI 工具箱
- </span>
- <h2 class="mt-4 text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">开箱即用的 AI 能力</h2>
- <p class="mt-4 text-base leading-relaxed text-[var(--c-66758a)]">
- 不用学提示词、不用配环境,选好参数点一下就出结果。
- </p>
- </div>
-
- <div class="mt-12 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
- <template v-for="tool in tools" :key="tool.title">
- <!-- 已上线:可点击卡片 -->
- <NuxtLink
- v-if="!tool.soon"
- :to="tool.to"
- class="group relative flex cursor-pointer flex-col overflow-hidden rounded-3xl border border-[var(--c-eef2f7)] bg-[var(--c-ffffff)] p-6 transition-all duration-300 hover:-translate-y-1 hover:border-[var(--c-0b8cff)]/30 hover:shadow-[0_20px_44px_var(--sh-23-58-110-120)]"
- >
- <span
- v-if="tool.hot"
- class="absolute right-5 top-5 rounded-full bg-[var(--c-fff4ec)] px-2.5 py-1 text-[10px] font-extrabold text-[var(--c-ff681f)]"
- >热门</span>
-
- <div
- class="flex size-14 items-center justify-center rounded-2xl transition-transform duration-300 group-hover:scale-105"
- :class="tool.iconBg"
- >
- <UIcon :name="tool.icon" class="size-7" :class="tool.iconColor" />
- </div>
-
- <h3 class="mt-5 text-lg font-extrabold text-[var(--c-172033)]">{{ tool.title }}</h3>
- <p class="mt-2 flex-1 text-sm leading-relaxed text-[var(--c-66758a)]">{{ tool.desc }}</p>
-
- <div class="mt-5 flex items-center justify-between border-t border-[var(--c-f1f5fa)] pt-4">
- <span class="text-sm font-extrabold text-[var(--c-0b8cff)]">{{ toolPrice(tool) }}</span>
- <span class="inline-flex items-center gap-1 text-sm font-bold text-[var(--c-172033)] transition-colors group-hover:text-[var(--c-0b8cff)]">
- 立即使用
- <UIcon name="i-lucide-arrow-right" class="size-4 transition-transform group-hover:translate-x-0.5" />
- </span>
- </div>
- </NuxtLink>
-
- <!-- 未上线:静态卡片 -->
- <div
- v-else
- class="relative flex cursor-default flex-col overflow-hidden rounded-3xl border border-[var(--c-eef2f7)] bg-[var(--c-ffffff)] p-6 opacity-70"
- >
- <span class="absolute right-5 top-5 rounded-full bg-[var(--c-f1f5fa)] px-2.5 py-1 text-[10px] font-bold text-[var(--c-8a97a8)]">
- 即将上线
- </span>
-
- <div class="flex size-14 items-center justify-center rounded-2xl" :class="tool.iconBg">
- <UIcon :name="tool.icon" class="size-7" :class="tool.iconColor" />
- </div>
-
- <h3 class="mt-5 text-lg font-extrabold text-[var(--c-172033)]">{{ tool.title }}</h3>
- <p class="mt-2 flex-1 text-sm leading-relaxed text-[var(--c-66758a)]">{{ tool.desc }}</p>
-
- <div class="mt-5 flex items-center justify-between border-t border-[var(--c-f1f5fa)] pt-4">
- <span class="text-sm font-extrabold text-[var(--c-0b8cff)]">{{ tool.price }}</span>
- <span class="text-sm text-[var(--c-a0aabb)]">敬请期待</span>
- </div>
- </div>
- </template>
- </div>
- </section>
-
- <!-- ==================== 4. 点数套餐(Pricing) ==================== -->
- <section id="pricing" class="mx-auto max-w-7xl scroll-mt-20 px-4 py-16 sm:px-6 lg:px-8 lg:py-24">
- <div class="mx-auto max-w-2xl text-center">
- <span class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-fff4ec)] px-3 py-1 text-xs font-extrabold text-[var(--c-ff681f)]">
- <UIcon name="i-lucide-coins" class="size-3.5" />
- 点数套餐
- </span>
- <h2 class="mt-4 text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">按需付费,没有订阅</h2>
- <p class="mt-4 text-base text-[var(--c-66758a)]">点数长期有效,小程序、H5、PC 端共享同一份余额。</p>
- </div>
-
- <!-- 加载中骨架 -->
- <div v-if="pkgLoading" class="mx-auto mt-12 grid max-w-4xl gap-6 sm:grid-cols-3">
- <div v-for="i in 3" :key="i" class="h-[380px] animate-pulse rounded-3xl bg-[var(--c-eef2f7)]" />
- </div>
-
- <div v-else-if="packages.length" class="mx-auto mt-12 grid max-w-5xl items-start gap-6 sm:grid-cols-3">
- <div
- v-for="(pkg, idx) in packages"
- :key="pkg.id"
- class="relative rounded-3xl border-2 bg-[var(--c-ffffff)] p-7 transition-all duration-300"
- :class="isFeatured(pkg, idx)
- ? 'border-[var(--c-0b8cff)] shadow-[0_24px_50px_var(--sh-11-140-255-180)] sm:-mt-4 sm:pb-10'
- : 'border-[var(--c-eef2f7)] hover:border-[var(--c-0b8cff)]/30 hover:shadow-[0_16px_36px_var(--sh-23-58-110-100)]'"
- >
- <span
- v-if="isFeatured(pkg, idx)"
- class="absolute -top-3.5 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-full bg-gradient-to-r from-[var(--c-0b8cff)] to-[var(--c-3aa9ff)] px-4 py-1.5 text-[11px] font-extrabold text-white shadow-[0_8px_18px_var(--sh-11-140-255-300)]"
- >
- {{ pkg.badge || '最受欢迎' }}
- </span>
-
- <div class="flex size-12 items-center justify-center rounded-2xl bg-[var(--c-eef7ff)]">
- <UIcon :name="pkgIcon(idx)" class="size-6 text-[var(--c-0b8cff)]" />
- </div>
-
- <h3 class="mt-4 text-lg font-extrabold text-[var(--c-172033)]">{{ pkg.title }}</h3>
- <p class="mt-1 text-xs text-[var(--c-8a97a8)]">{{ pkgSubtitle(pkg) }}</p>
-
- <div class="mt-5 flex items-end gap-1">
- <span class="text-4xl font-extrabold text-[var(--c-172033)]">¥{{ pkg.price_yuan }}</span>
- </div>
- <div v-if="pkg.old_price_yuan || pkgBonusPercent(pkg)" class="mt-1 flex min-h-5 items-center gap-2 text-xs">
- <span v-if="pkg.old_price_yuan" class="text-[var(--c-a0aabb)] line-through">¥{{ pkg.old_price_yuan }}</span>
- <span
- v-if="pkgBonusPercent(pkg)"
- class="rounded-full bg-[var(--c-edfdf4)] px-2 py-0.5 font-extrabold text-[var(--c-159a54)]"
- >
- 多送{{ pkgBonusPercent(pkg) }}%
- </span>
- </div>
-
- <ul class="mt-6 space-y-2.5">
- <li v-for="f in pkgFeatures(pkg)" :key="f" class="flex items-start gap-2 text-sm text-[var(--c-4b5b70)]">
- <UIcon name="i-lucide-check" class="mt-0.5 size-4 shrink-0 text-[var(--c-17a65a)]" />
- <span>{{ f }}</span>
- </li>
- </ul>
-
- <NuxtLink
- to="/recharge"
- class="mt-7 flex h-11 items-center justify-center rounded-full text-sm font-bold transition-all"
- :class="isFeatured(pkg, idx)
- ? 'bg-gradient-to-r from-[var(--c-0b8cff)] to-[var(--c-3aa9ff)] text-white shadow-[0_10px_22px_var(--sh-11-140-255-250)] hover:opacity-90'
- : 'bg-[var(--c-eef7ff)] text-[var(--c-0b8cff)] hover:bg-[var(--c-e0f0ff)]'"
- >
- 立即充值
- </NuxtLink>
- </div>
- </div>
-
- <p class="mt-8 text-center text-xs text-[var(--c-a0aabb)]">* 点数购买后长期有效,不支持退款</p>
- </section>
-
- <!-- ==================== 4.5 热门资讯(移植原 PC 首页) ==================== -->
- <section v-if="news.length" class="border-y border-[var(--c-e8eef7)] bg-[var(--c-ffffff)] py-16 lg:py-24">
- <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
- <div class="flex flex-wrap items-end justify-between gap-4">
- <div>
- <span class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-eef7ff)] px-3 py-1 text-xs font-extrabold text-[var(--c-0b8cff)]">
- <UIcon name="i-lucide-newspaper" class="size-3.5" />
- AI 资讯
- </span>
- <h2 class="mt-4 text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">热门资讯</h2>
- <p class="mt-3 text-base text-[var(--c-66758a)]">AI 前沿动态、使用教程与常见问题解答</p>
- </div>
- <NuxtLink
- to="/info"
- class="inline-flex items-center gap-1.5 text-sm font-bold text-[var(--c-0b8cff)] hover:underline"
- >
- 查看全部资讯
- <UIcon name="i-lucide-arrow-right" class="size-4" />
- </NuxtLink>
- </div>
-
- <!-- 栏目快捷入口 -->
- <div class="mt-6 flex flex-wrap gap-2">
- <NuxtLink
- v-for="col in COLUMNS"
- :key="col.colId"
- :to="col.path"
- class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-f7f9fd)] px-4 py-2 text-sm font-bold text-[var(--c-5b6b80)] transition-colors hover:bg-[var(--c-eef7ff)] hover:text-[var(--c-0b8cff)]"
- >
- <UIcon :name="col.icon" class="size-4" />
- {{ col.name }}
- </NuxtLink>
- </div>
-
- <!-- 头条大卡 + 列表 -->
- <div class="mt-8 grid gap-6 lg:grid-cols-12 lg:gap-8">
- <!-- 头条:图片铺满 + 底部渐变压字 -->
- <article v-if="topNews" class="lg:col-span-5">
- <NuxtLink
- :to="topNews.url"
- class="group relative block h-full min-h-[320px] overflow-hidden rounded-3xl bg-[var(--c-0f172a)] shadow-[0_14px_36px_var(--sh-23-58-110-140)]"
- >
- <img
- v-if="topNews.cover"
- :src="topNews.cover"
- :alt="topNews.title"
- class="absolute inset-0 size-full object-cover transition-transform duration-700 group-hover:scale-105"
- loading="lazy"
- >
- <div class="absolute inset-0 bg-gradient-to-t from-[var(--c-0b1324)]/92 via-[var(--c-0b1324)]/45 to-transparent" />
-
- <div class="absolute left-5 top-5">
- <span class="rounded-full bg-[var(--c-ffffff)]/95 px-2.5 py-1 text-[11px] font-extrabold text-[var(--c-0b8cff)]">
- {{ colName(topNews.col_id) }}
- </span>
- </div>
-
- <div class="relative flex h-full min-h-[320px] flex-col justify-end p-5 sm:p-6">
- <h3 class="line-clamp-2 text-xl font-extrabold leading-snug text-white sm:text-2xl">
- {{ topNews.title }}
- </h3>
- <p v-if="topNews.info" class="mt-2.5 line-clamp-2 text-sm leading-relaxed text-white/75">
- {{ topNews.info }}
- </p>
- <div class="mt-4 flex items-center gap-4 text-xs text-white/60">
- <span>{{ topNews.time }}</span>
- <span class="inline-flex items-center gap-1">
- <UIcon name="i-lucide-eye" class="size-3.5" />
- {{ formatViews(topNews.view_num) }}
- </span>
- <span class="ml-auto inline-flex items-center gap-1 font-bold text-white/85 transition-transform group-hover:translate-x-0.5">
- 阅读全文
- <UIcon name="i-lucide-arrow-right" class="size-3.5" />
- </span>
- </div>
- </div>
- </NuxtLink>
- </article>
-
- <!-- 列表:统一缩略图 + 序号,桌面两列 -->
- <div class="lg:col-span-7">
- <div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2">
- <article v-for="(item, idx) in restNews" :key="item.id">
- <NuxtLink
- :to="item.url"
- class="group flex h-full gap-3.5 rounded-2xl border border-[var(--c-eef2f7)] bg-[var(--c-ffffff)] p-3 transition-all hover:-translate-y-0.5 hover:border-[var(--c-0b8cff)]/30 hover:shadow-[0_12px_28px_var(--sh-23-58-110-100)]"
- >
- <!-- 缩略图(无封面时用序号占位,保证排版整齐) -->
- <div class="relative size-[74px] shrink-0 overflow-hidden rounded-xl bg-gradient-to-br from-[var(--c-eef6ff)] to-[var(--c-f3fbf9)]">
- <img
- v-if="item.cover"
- :src="item.cover"
- :alt="item.title"
- class="size-full object-cover transition-transform duration-500 group-hover:scale-110"
- loading="lazy"
- >
- <span
- v-else
- class="flex size-full items-center justify-center text-lg font-extrabold text-[var(--c-0b8cff)]/45"
- >{{ idx + 2 }}</span>
- </div>
-
- <div class="flex min-w-0 flex-1 flex-col">
- <h3 class="line-clamp-2 text-sm font-bold leading-snug text-[var(--c-172033)] transition-colors group-hover:text-[var(--c-0b8cff)]">
- {{ item.title }}
- </h3>
- <div class="mt-auto flex items-center gap-2.5 pt-2 text-[11px] text-[var(--c-a0aabb)]">
- <span class="rounded bg-[var(--c-f7f9fd)] px-1.5 py-0.5 font-bold text-[var(--c-7b8797)]">
- {{ colName(item.col_id) }}
- </span>
- <span>{{ item.time }}</span>
- <span class="inline-flex items-center gap-0.5">
- <UIcon name="i-lucide-eye" class="size-3" />
- {{ formatViews(item.view_num) }}
- </span>
- </div>
- </div>
- </NuxtLink>
- </article>
- </div>
- </div>
- </div>
- </div>
- </section>
-
- <!-- ==================== 5. AI 绘画作品(数据源:/art/getlist) ==================== -->
- <section class="border-y border-[var(--c-e8eef7)] bg-[var(--c-ffffff)] py-16 lg:py-24">
- <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
- <div class="flex flex-wrap items-end justify-between gap-5">
- <div>
- <span class="inline-flex items-center gap-1.5 rounded-full bg-[var(--c-f3f0ff)] px-3 py-1 text-xs font-extrabold text-[var(--c-7a5af8)]">
- <UIcon name="i-lucide-images" class="size-3.5" />
- 作品广场
- </span>
- <h2 class="mt-4 text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">看看大家用 AI 画出了什么</h2>
- <p class="mt-3 text-base text-[var(--c-66758a)]">来自 AI 在线用户的公开作品,鼠标悬停可查看生成提示词</p>
- </div>
- <NuxtLink
- to="/pic/"
- class="inline-flex h-11 items-center gap-1.5 rounded-full bg-[var(--c-f7f9fd)] px-6 text-sm font-bold text-[var(--c-5b6b80)] transition-colors hover:bg-[var(--c-eef7ff)] hover:text-[var(--c-0b8cff)]"
- >
- 浏览全部作品
- <UIcon name="i-lucide-arrow-right" class="size-4" />
- </NuxtLink>
- </div>
-
- <!--
- 12 张作品的马赛克排布(各断点都能整行铺满,不留空格):
- 桌面 5 列:首图占 2×2 + 右侧 6 小图(2 行 × 3 个) + 第 3 行 5 小图
- 平板 3 列:首图占 2×2 + 右侧 2 小图 + 后续 3 行 × 3 个
- 移动 2 列:全部等大,6 行
- -->
- <div v-if="artworks.length" class="mt-10 grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-5 lg:gap-4">
- <NuxtLink
- v-for="(item, idx) in artworks"
- :key="`${item.chat_open_id}_${item.img_index}`"
- :to="`/pic/${item.chat_open_id}_${item.img_index || 0}.html`"
- class="group relative aspect-square overflow-hidden rounded-2xl bg-[var(--c-eef3f8)] ring-1 ring-[var(--c-eef2f7)] transition-all hover:ring-2 hover:ring-[var(--c-0b8cff)]/50 hover:shadow-[0_14px_32px_var(--sh-23-58-110-140)]"
- :class="idx === 0 ? 'sm:col-span-2 sm:row-span-2' : ''"
- >
- <img
- :src="item.img"
- :alt="item.prompts || 'AI 绘画作品'"
- class="size-full object-cover transition-transform duration-700 group-hover:scale-105"
- loading="lazy"
- >
-
- <!-- 常驻的类型角标 -->
- <span class="absolute left-3 top-3 rounded-full bg-[var(--c-ffffff)]/90 px-2 py-0.5 text-[10px] font-bold text-[var(--c-4b5b70)] backdrop-blur">
- {{ artTypeName(item.ai_type) }}
- </span>
-
- <!-- hover 提示词浮层 -->
- <div class="absolute inset-0 flex flex-col justify-end bg-gradient-to-t from-black/80 via-black/20 to-transparent opacity-0 transition-opacity duration-300 group-hover:opacity-100">
- <div class="p-3 lg:p-4">
- <p
- v-if="item.prompts"
- class="line-clamp-3 text-xs leading-relaxed text-white/95"
- :class="idx === 0 && 'lg:text-sm'"
- >
- {{ item.prompts }}
- </p>
- <p v-else class="text-xs text-white/80">AI 生成作品</p>
- <div class="mt-2 flex items-center gap-3 text-[10px] text-white/70">
- <span v-if="item.resolution">{{ item.resolution }}</span>
- <span class="inline-flex items-center gap-1">
- <UIcon name="i-lucide-heart" class="size-3" />
- {{ item.like_num || 0 }}
- </span>
- <span class="ml-auto inline-flex items-center gap-1 font-bold text-white">
- 查看
- <UIcon name="i-lucide-arrow-up-right" class="size-3" />
- </span>
- </div>
- </div>
- </div>
- </NuxtLink>
- </div>
-
- <!-- 无数据兜底 -->
- <div v-else class="mt-10 rounded-3xl bg-[var(--c-f7f9fd)] py-16 text-center">
- <UIcon name="i-lucide-image-off" class="mx-auto mb-4 size-12 text-[var(--c-a0aabb)]" />
- <div class="text-base font-extrabold text-[var(--c-172033)]">还没有公开作品</div>
- <div class="mt-2 text-sm text-[var(--c-8a95a6)]">成为第一个分享 AI 作品的人</div>
- </div>
- </div>
- </section>
-
- <!-- ==================== 6. 结尾 CTA ==================== -->
- <section class="relative overflow-hidden bg-[var(--c-f3f7fb)] py-16 lg:py-24">
- <div class="pointer-events-none absolute -right-20 top-0 size-72 rounded-full bg-[var(--c-0b8cff)]/10 blur-3xl" />
- <div class="relative mx-auto max-w-3xl px-4 text-center sm:px-6">
- <h2 class="text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">现在就开始,几秒钟拿到结果</h2>
- <p class="mt-4 text-base text-[var(--c-66758a)]">注册即可体验,按点数付费,不用订阅、不绑定套餐。</p>
-
- <div class="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
- <NuxtLink
- to="/writing/naming/"
- class="inline-flex h-13 w-full items-center justify-center gap-2 rounded-full bg-gradient-to-r from-[var(--c-0b8cff)] to-[var(--c-3aa9ff)] px-8 text-base font-bold text-white shadow-[0_14px_30px_var(--sh-11-140-255-280)] transition-all hover:-translate-y-0.5 sm:w-auto"
- >
- <UIcon name="i-lucide-zap" class="size-5" />
- 开始创作
- </NuxtLink>
- <NuxtLink
- to="/recharge"
- class="inline-flex h-13 w-full items-center justify-center rounded-full bg-[var(--c-ffffff)] px-8 text-base font-bold text-[var(--c-0b8cff)] shadow-[0_8px_20px_var(--sh-23-32-51-60)] transition-colors hover:bg-[var(--c-f7faff)] sm:w-auto"
- >
- 查看套餐
- </NuxtLink>
- </div>
-
- <div class="mt-10 flex flex-wrap items-center justify-center gap-x-8 gap-y-3 text-sm text-[var(--c-66758a)]">
- <span v-for="p in promises" :key="p" class="inline-flex items-center gap-1.5">
- <UIcon name="i-lucide-circle-check" class="size-4 text-[var(--c-17a65a)]" />
- {{ p }}
- </span>
- </div>
- </div>
- </section>
- </div>
- </template>
-
- <script setup>
- useSeoMeta({
- title: 'AI在线网站-你的AI伙伴让创作更简单',
- description: 'AI在线是一个 AI 工具的集合地,可以找到各种各样的 AI 工具,满足你的不同需求。无论你是想翻译一段文字,还是想生成一篇文章,或者是想制作一张图片,AI在线都能为你提供帮助, AI 工具大全宝库!',
- keywords: 'AI,AI在线,AI伙伴,免费AI网站',
- })
- useHead({
- link: [{ rel: 'canonical', href: 'https://tool.aionline.cc/' }],
- })
-
- import { COLUMNS, articleUrl, colName, formatTime } from '~/composables/useArticle'
-
- const { post } = useApi()
- const { isLogin } = useUser()
-
- // ==================== 首屏动漫头像示例(后台可配,带兜底) ====================
- const demo = ref({
- original: 'https://cdn.aionline.cc/ai/anime/original_1.png',
- anime: 'https://cdn.aionline.cc/ai/anime/anime_1.png',
- })
-
- async function loadDemo() {
- try {
- const res = await post('/common/getconfig', { keys: 'anime_demo_v2,anime_demo' })
- const rows = res.list || []
- const v2 = rows.find(i => i.key === 'anime_demo_v2')
- if (v2?.value) {
- const data = typeof v2.value === 'string' ? JSON.parse(v2.value) : v2.value
- const first = Array.isArray(data) ? data[0] : data
- if (first?.original && first?.anime) {
- demo.value = { original: first.original, anime: first.anime }
- return
- }
- }
- const old = rows.find(i => i.key === 'anime_demo')
- if (old?.value) {
- const pics = String(old.value).split(',').map(s => s.trim()).filter(Boolean)
- if (pics.length >= 2) demo.value = { original: pics[0], anime: pics[1] }
- }
- } catch {
- // 保留兜底图
- }
- }
-
- // ==================== 静态内容 ====================
- const tools = [
- {
- title: 'AI 取名',
- desc: '结合姓氏、性别、出生信息,从诗经楚辞典故中生成有出处的好名字,含寓意与音律解析。',
- to: '/writing/naming/',
- icon: 'i-lucide-signature',
- iconBg: 'bg-[var(--c-eef7ff)]',
- iconColor: 'text-[var(--c-0b8cff)]',
- appKey: 'ai-name',
- price: '点数计费',
- hot: true,
- },
- {
- title: '动漫头像',
- desc: '上传一张自拍,一键生成专属动漫风格头像,多种画风可选,支持原图对比。',
- to: '/draw/anime/',
- icon: 'i-lucide-user-round',
- iconBg: 'bg-[var(--c-f3f0ff)]',
- iconColor: 'text-[var(--c-7a5af8)]',
- appKey: 'anime-avatar',
- billingParams: { model: 'tencent_anime' },
- price: '点数计费',
- hot: true,
- },
- {
- title: '证件照',
- desc: '一键生成标准证件照,自动换底色、智能裁剪,满足各类办证尺寸要求。',
- to: '/id-photo',
- icon: 'i-lucide-id-card',
- iconBg: 'bg-[var(--c-edfdf4)]',
- iconColor: 'text-[var(--c-17a65a)]',
- appKey: 'id-photo',
- price: '按张计费',
- soon: false,
- },
- {
- title: '形象照 / 写真',
- desc: '上传一张人像,生成商务形象照、日常职业照,或古风、港风等艺术写真,一次最多 4 张。',
- to: '/portrait-photo',
- icon: 'i-lucide-camera',
- iconBg: 'bg-[var(--c-fff4ec)]',
- iconColor: 'text-[var(--c-ff681f)]',
- appKey: 'portrait-photo',
- billingParams: { model: 'standard', count: 1 },
- price: '按张计费',
- soon: false,
- },
- {
- title: '老照片修复',
- desc: '黑白、泛黄、有划痕的老照片,一键修复破损并自然上色,支持前后对比。',
- to: '/old-photo',
- icon: 'i-lucide-wand-sparkles',
- iconBg: 'bg-[var(--c-fff4ec)]',
- iconColor: 'text-[var(--c-e85f1c)]',
- appKey: 'old-photo',
- billingParams: { mode: 'colorize' },
- price: '按张计费',
- soon: false,
- },
- {
- title: '更多能力',
- desc: '文本转语音、AI 装修设计等更多 AI 能力持续上线,敬请期待。',
- to: '#',
- icon: 'i-lucide-layout-grid',
- iconBg: 'bg-[var(--c-f1f5fa)]',
- iconColor: 'text-[var(--c-8a97a8)]',
- price: '持续更新',
- soon: true,
- },
- ]
-
- const { data: toolBillingData } = await useAsyncData('home-tool-billing', async () => {
- const billableTools = tools.filter(tool => tool.appKey)
- const entries = await Promise.all(billableTools.map(async (tool) => {
- try {
- const res = await post('/billing/config', {
- app_key: tool.appKey,
- ...(tool.billingParams || {}),
- })
- const rawPoints = res?.data?.quote?.points ?? res?.data?.points
- const points = Number(rawPoints)
- return [tool.appKey, Number.isFinite(points) ? points : null]
- } catch {
- return [tool.appKey, null]
- }
- }))
- return Object.fromEntries(entries)
- })
-
- function toolPrice(tool) {
- const points = toolBillingData.value?.[tool.appKey]
- return points === 0 ? '免费使用' : tool.price
- }
-
- const promises = ['点数长期有效', '多端共享余额', '结果可下载复制', '生成失败不扣点']
-
- // ==================== 点数套餐(真实数据) ====================
- const packages = ref([])
- const pkgLoading = ref(true)
-
- async function loadPackages() {
- try {
- const res = await post('/point/packagelist')
- packages.value = (res.list || []).slice(0, 3)
- } catch {
- packages.value = []
- } finally {
- pkgLoading.value = false
- }
- }
-
- // 中间一档或带「推荐」角标的高亮
- function isFeatured(pkg, idx) {
- const hasRecommend = packages.value.some(p => p.badge === '推荐')
- return hasRecommend ? pkg.badge === '推荐' : idx === 1
- }
- function pkgIcon(idx) {
- return ['i-lucide-sprout', 'i-lucide-rocket', 'i-lucide-crown'][idx] || 'i-lucide-coins'
- }
- function pkgSubtitle(pkg) {
- const p = Number(pkg.points || 0)
- if (p <= 200) return '轻量体验,先试试手感'
- if (p <= 1500) return '日常创作,性价比最高'
- return '高频创作,一次买够'
- }
- function pkgBonusPercent(pkg) {
- const provided = Number(pkg.bonus_percent || 0)
- if (Number.isFinite(provided) && provided > 0) return Math.round(provided)
-
- const price = Number(pkg.price || 0) || Number(pkg.price_yuan || 0) * 100
- const oldPrice = Number(pkg.old_price || 0) || Number(pkg.old_price_yuan || 0) * 100
- if (!Number.isFinite(price) || !Number.isFinite(oldPrice) || price <= 0 || oldPrice <= price) return 0
- return Math.max(0, Math.round((oldPrice / price - 1) * 100))
- }
- function pkgFeatures(pkg) {
- return [
- `获得 ${pkg.points} 点数`,
- '点数长期有效,不过期',
- '小程序 / H5 / PC 通用',
- '可用于全部 AI 工具',
- ]
- }
-
- // ==================== 热门资讯(移植原 PC 首页,SSR 渲染利于 SEO) ====================
- const { data: newsData } = await useAsyncData('home-news', () =>
- post('/article/getlist', { page_no: 1, page_size: 7, is_recommend: 1 })
- .catch(() => ({ list: [] })))
-
- const news = computed(() =>
- (newsData.value?.list || []).map(i => ({ ...i, url: articleUrl(i), time: formatTime(i.publish_time, 'YYYY-MM-DD') })))
- const topNews = computed(() => news.value[0] || null)
- const restNews = computed(() => news.value.slice(1, 7))
-
- /** 阅读量简写:1280 → 1.3k */
- function formatViews(n) {
- const v = Number(n || 0)
- return v >= 1000 ? `${(v / 1000).toFixed(1)}k` : String(v)
- }
-
- // ==================== AI 绘画作品(数据源同原 PC 首页:/art/getlist) ====================
- // ai_type:2 MJ绘画 3/7/8 AI画头像 4 变年龄 5 变性别 6 AI绘画
- const ART_TYPE_MAP = {
- 2: 'MJ 绘画', 3: 'AI 头像', 4: 'AI 变年龄',
- 5: 'AI 变性别', 6: 'AI 绘画', 7: 'AI 头像', 8: 'AI 头像',
- }
- function artTypeName(type) {
- return ART_TYPE_MAP[Number(type)] || 'AI 作品'
- }
-
- const { data: artData } = await useAsyncData('home-art', () =>
- post('/art/getlist', { page_no: 1, page_size: 30 }).catch(() => ({ list: [] })))
-
- // 展示 12 张:首图占 2×2,其余 1×1,桌面 5 列共 3 行正好铺满
- const artworks = computed(() => (artData.value?.list || []).filter(i => i.img).slice(0, 12))
-
- onMounted(() => {
- loadDemo()
- loadPackages()
- })
-
- watch(isLogin, () => loadPackages())
- </script>
-
- <style scoped>
- /* Tailwind 没有 h-13,这里补一个统一的按钮高度 */
- .h-13 {
- height: 3.25rem;
- }
- </style>
|