Files
jczxw-pc/app/pages/index.vue
2026-04-23 16:30:57 +08:00

327 lines
13 KiB
Vue

<template>
<div>
<section class="relative overflow-hidden bg-gradient-to-b from-gray-950 to-gray-900 text-white">
<div class="pointer-events-none absolute left-1/2 top-[-140px] h-[420px] w-[900px] -translate-x-1/2 rounded-full bg-green-500/20 blur-3xl" />
<div class="mx-auto max-w-screen-xl px-4 py-16 sm:py-24 relative">
<a-tag color="orange" class="mb-6">
<span class="flex items-center gap-1">
<span class="text-lg">🦞</span>
{{ $t('home.heroTag') }}
</span>
</a-tag>
<a-typography-title :level="1" class="!text-white !mb-4">
{{ $t('home.heroTitle') }}
</a-typography-title>
<a-typography-paragraph class="!text-gray-300 !text-lg !mb-8">
{{ $t('home.heroDesc') }}
</a-typography-paragraph>
<a-space size="middle" wrap>
<a-button type="primary" size="large" @click="navigateTo('/contact')">{{ $t('home.bookDemo') }}</a-button>
<a-button size="large" @click="navigateTo('/flow')">{{ $t('home.viewFlow') }}</a-button>
<a-button size="large" @click="navigateTo('/deploy')">{{ $t('home.deploy') }}</a-button>
</a-space>
<a-row class="mt-10" :gutter="[16, 16]">
<a-col :xs="12" :md="6">
<!-- <a-statistic title="平台定位" value="SaaS" />-->
</a-col>
<a-col :xs="12" :md="6">
<!-- <a-statistic title="交付模式" value="私有化" />-->
</a-col>
<a-col :xs="12" :md="6">
<!-- <a-statistic title="能力" value="模板/插件" />-->
</a-col>
<a-col :xs="12" :md="6">
<!-- <a-statistic title="开通" value="自动化" />-->
</a-col>
</a-row>
<!-- 平台介绍视频 -->
<div class="mt-12 rounded-2xl overflow-hidden shadow-2xl border border-gray-700/50 bg-gray-900/50">
<ClientOnly>
<video
class="w-full aspect-video"
:src="videoSrc"
poster="/images/video-poster.jpg"
controls
preload="metadata"
playsinline
@error="handleVideoError"
>
<p class="text-white text-center py-8">{{ $t('home.videoNotSupported') }}</p>
</video>
<template #fallback>
<div class="w-full aspect-video bg-gray-800 flex items-center justify-center">
<span class="text-gray-400">{{ $t('common.loading') }}</span>
</div>
</template>
</ClientOnly>
</div>
</div>
</section>
<!-- OpenClaw AI 智能体生态 -->
<section class="relative overflow-hidden bg-gradient-to-r from-orange-50 via-orange-100/50 to-orange-50">
<div class="pointer-events-none absolute left-1/4 top-0 h-[300px] w-[300px] rounded-full bg-orange-200/50 blur-3xl" />
<div class="pointer-events-none absolute right-1/4 bottom-0 h-[200px] w-[250px] rounded-full bg-red-200/50 blur-3xl" />
<div class="mx-auto max-w-screen-xl px-4 py-16 relative">
<div class="text-center mb-10">
<div class="inline-flex items-center gap-2 px-4 py-2 bg-orange-500 rounded-full text-white text-sm font-medium mb-4">
<span class="text-xl">🦞</span>
{{ $t('home.openclawTitle') }}
</div>
<a-typography-title :level="2" class="!text-gray-900 !mb-2">
{{ $t('home.openclawSubtitle') }}
</a-typography-title>
<a-typography-paragraph class="!text-gray-600 !mb-0 !text-base">
{{ $t('home.openclawDesc') }}
</a-typography-paragraph>
</div>
<a-row :gutter="[24, 24]" class="px-4">
<a-col :xs="24" :md="8">
<div class="text-center p-6 rounded-xl bg-white border border-orange-200 shadow-sm hover:shadow-md hover:border-orange-300 transition-all">
<div class="text-4xl mb-4">🔗</div>
<div class="text-gray-900 font-semibold mb-2">{{ $t('home.multiPlatform') }}</div>
<div class="text-gray-600 text-sm">{{ $t('home.multiPlatformDesc') }}</div>
</div>
</a-col>
<a-col :xs="24" :md="8">
<div class="text-center p-6 rounded-xl bg-white border border-orange-200 shadow-sm hover:shadow-md hover:border-orange-300 transition-all">
<div class="text-4xl mb-4">🧠</div>
<div class="text-gray-900 font-semibold mb-2">{{ $t('home.multiModel') }}</div>
<div class="text-gray-600 text-sm">{{ $t('home.multiModelDesc') }}</div>
</div>
</a-col>
<a-col :xs="24" :md="8">
<div class="text-center p-6 rounded-xl bg-white border border-orange-200 shadow-sm hover:shadow-md hover:border-orange-300 transition-all">
<div class="text-4xl mb-4"></div>
<div class="text-gray-900 font-semibold mb-2">{{ $t('home.autoWorkflow') }}</div>
<div class="text-gray-600 text-sm">{{ $t('home.autoWorkflowDesc') }}</div>
</div>
</a-col>
</a-row>
<div class="text-center mt-10">
<a-space size="middle">
<a-button type="primary" @click="navigateTo('/ai-agent')">
<span class="flex items-center gap-2">
<span>🦞</span> {{ $t('home.experienceAI') }}
</span>
</a-button>
<a-button @click="navigateTo('/openclaw')">{{ $t('common.learnMore') }}</a-button>
</a-space>
</div>
</div>
</section>
<section class="mx-auto max-w-screen-xl px-4 py-14">
<a-typography-title :level="2" class="!mb-2">{{ $t('home.productMatrix') }}</a-typography-title>
<a-typography-paragraph class="!text-gray-500 !mb-8">
{{ $t('home.productMatrixDesc') }}
</a-typography-paragraph>
<a-row :gutter="[16, 16]">
<a-col v-for="p in products" :key="p.title" :xs="24" :md="12" :lg="8">
<a-card :title="p.title">
<template #extra>
<a-tag v-if="p.recommend" color="green">{{ $t('home.recommend') }}</a-tag>
</template>
<a-typography-paragraph class="!text-gray-600">
{{ p.desc }}
</a-typography-paragraph>
<div class="flex flex-wrap gap-2">
<a-tag v-for="t in p.tags" :key="t">{{ t }}</a-tag>
</div>
<div class="mt-5 flex justify-between items-center">
<a-tag color="green">{{ p.domain }}</a-tag>
<a-button type="primary" @click="go(p.adminUrl)">{{ $t('common.goNow') }}</a-button>
</div>
</a-card>
</a-col>
</a-row>
<div class="mt-6">
<a-button @click="navigateTo('/products')">{{ $t('home.viewAll') || $t('common.viewAll') }}</a-button>
</div>
</section>
<section class="bg-gray-50">
<div class="mx-auto max-w-screen-xl px-4 py-14">
<a-typography-title :level="2" class="!mb-2">{{ $t('home.coreCapabilities') }}</a-typography-title>
<a-typography-paragraph class="!text-gray-500 !mb-8">
{{ $t('home.coreCapabilitiesDesc') }}
</a-typography-paragraph>
<a-row :gutter="[16, 16]">
<a-col v-for="item in capabilities" :key="item.title" :xs="24" :md="12" :lg="8">
<a-card :title="item.title">
<template #extra>
<a-tag color="green">{{ item.badge }}</a-tag>
</template>
<a-typography-paragraph class="!mb-0 !text-gray-600">
{{ item.desc }}
</a-typography-paragraph>
</a-card>
</a-col>
</a-row>
</div>
</section>
<section>
<div class="mx-auto max-w-screen-xl px-4 py-14">
<a-row :gutter="[24, 24]">
<a-col :xs="24" :lg="12">
<a-typography-title :level="2" class="!mb-2">{{ $t('home.payToActivate') }}</a-typography-title>
<a-typography-paragraph class="!text-gray-600 !mb-6">
{{ $t('home.payToActivateDesc') }}
</a-typography-paragraph>
<a-button type="primary" @click="navigateTo('/flow')">{{ $t('home.viewFullFlow') }}</a-button>
</a-col>
<a-col :xs="24" :lg="12">
<a-card>
<a-steps direction="vertical" :current="-1" size="small">
<a-step :title="$t('home.selectProduct')" :description="$t('home.selectProductDesc')" />
<a-step :title="$t('home.placeOrder')" :description="$t('home.placeOrderDesc')" />
<a-step :title="$t('home.createTenant')" :description="$t('home.createTenantDesc')" />
<a-step :title="$t('home.initModules')" :description="$t('home.initModulesDesc')" />
<a-step :title="$t('home.deliverOnline')" :description="$t('home.deliverOnlineDesc')" />
</a-steps>
</a-card>
</a-col>
</a-row>
</div>
</section>
<section class="bg-gray-50">
<div class="mx-auto max-w-screen-xl px-4 py-14">
<a-typography-title :level="2" class="!mb-2">{{ $t('home.templatePluginEcosystem') }}</a-typography-title>
<a-typography-paragraph class="!text-gray-500 !mb-8">
{{ $t('home.templatePluginDesc') }}
</a-typography-paragraph>
<a-tabs>
<a-tab-pane key="template" :tab="$t('home.template')">
<a-row :gutter="[16, 16]">
<a-col :xs="24" :md="12">
<a-card :title="$t('home.industryTemplate')">
<a-typography-paragraph class="!mb-0 !text-gray-600">
{{ $t('home.industryTemplateDesc') }}
</a-typography-paragraph>
</a-card>
</a-col>
<a-col :xs="24" :md="12">
<a-card :title="$t('home.deliveryStandard')">
<a-typography-paragraph class="!mb-0 !text-gray-600">
{{ $t('home.deliveryStandardDesc') }}
</a-typography-paragraph>
</a-card>
</a-col>
</a-row>
</a-tab-pane>
<a-tab-pane key="plugin" :tab="$t('home.plugin')">
<a-row :gutter="[16, 16]">
<a-col :xs="24" :md="12">
<a-card :title="$t('home.capabilityExtend')">
<a-typography-paragraph class="!mb-0 !text-gray-600">
{{ $t('home.capabilityExtendDesc') }}
</a-typography-paragraph>
</a-card>
</a-col>
<a-col :xs="24" :md="12">
<a-card :title="$t('home.upgradeAuth')">
<a-typography-paragraph class="!mb-0 !text-gray-600">
{{ $t('home.upgradeAuthDesc') }}
</a-typography-paragraph>
</a-card>
</a-col>
</a-row>
</a-tab-pane>
</a-tabs>
<div class="mt-6">
<a-button @click="navigateTo('/market')">{{ $t('home.exploreMarket') }}</a-button>
</div>
</div>
</section>
<section class="bg-white">
<div class="mx-auto max-w-screen-xl px-4 py-12 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
<div>
<div class="text-xl font-semibold">{{ $t('home.ctaTitle') }}</div>
<div class="mt-1 text-gray-500">{{ $t('home.ctaDesc') }}</div>
</div>
<a-space>
<a-button size="large" @click="navigateTo('/products')">{{ $t('home.viewProducts') }}</a-button>
<a-button type="primary" size="large" @click="navigateTo('/contact')">{{ $t('home.contactNow') }}</a-button>
</a-space>
</div>
</section>
</div>
</template>
<script setup lang="ts">
import { usePageSeo } from '@/composables/usePageSeo'
import { productMatrix } from '@/config/products'
const { t } = useI18n()
// 视频路径(使用 public 目录,可直接通过 URL 访问)
const videoSrc = '/videos/websopy-intro.mp4'
usePageSeo({
title: t('pageTitle.homeTitle'),
description: t('pageTitle.homeDescription')
})
const go = (url?: string) => {
if (!url) return
if (/^https?:\/\//i.test(url)) {
if (import.meta.client) window.open(url, '_blank', 'noopener,noreferrer')
return
}
return navigateTo(url)
}
// 视频加载错误处理
const handleVideoError = (e: Event) => {
console.error('视频加载失败:', e)
}
const products = productMatrix
const capabilities = [
{
title: t('home.openclawAI'),
badge: 'NEW',
desc: t('home.openclawAIDesc')
},
{
title: t('home.ragKnowledge'),
badge: 'AI',
desc: t('home.ragKnowledgeDesc')
},
{
title: t('home.saasMultiTenant'),
badge: '核心',
desc: t('home.saasMultiTenantDesc')
},
{
title: t('home.privateDeploy'),
badge: '可选',
desc: t('home.privateDeployDesc')
},
{
title: t('home.templateMarket'),
badge: '生态',
desc: t('home.templateMarketDesc')
},
{
title: t('home.autoActivate'),
badge: '交付',
desc: t('home.autoActivateDesc')
}
]
</script>