<script setup lang="ts">
|
|
import { Icon } from '@iconify/vue';
|
|
import { ref, onMounted, reactive, computed } from 'vue';
|
|
import ArchitectureModule from '@/components/technology/ArchitectureModule.vue';
|
|
import InnovationModule from '@/components/technology/InnovationModule.vue';
|
|
import EcosystemIntegrationModule from '@/components/technology/EcosystemIntegrationModule.vue';
|
|
import AppListModule from '@/components/ecosystem/AppListModule.vue';
|
|
import { useI18n } from 'vue-i18n';
|
|
import { useConfig } from '@/utils/config';
|
|
// 导入Swiper相关组件和模块
|
|
import { Swiper, SwiperSlide } from 'swiper/vue';
|
|
import { Pagination, Navigation, Autoplay } from 'swiper/modules';
|
|
import 'swiper/css';
|
|
import 'swiper/css/pagination';
|
|
import 'swiper/css/navigation';
|
|
|
|
import type {TechnologyItem } from '@/api/modules/technology'
|
|
|
|
const { getConfigImage } = useConfig();
|
|
|
|
import { queryTechnologyList, queryStructuralList } from '@/api/modules/technology';
|
|
import { queryAppList } from '@/api/modules/ecosystem';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { t } = useI18n();
|
|
|
|
|
|
|
|
|
|
|
|
// 从API获取核心技术数据
|
|
const technologies = ref([]);
|
|
|
|
|
|
|
|
// 获取核心技术列表
|
|
const fetchTechnologies = async () => {
|
|
try {
|
|
const result = await queryTechnologyList({
|
|
pageSize: 10,
|
|
pageNo: 1
|
|
});
|
|
if (result && result.length > 0) {
|
|
// 只使用API返回的图片数据,文本全部使用i18n
|
|
technologies.value = result.map((item, index) => {
|
|
const colors = ['primary', 'secondary', 'accent', 'primary'];
|
|
const icons = ['carbon:security', 'carbon:growth', 'carbon:currency', 'carbon:bridge'];
|
|
return {
|
|
id: item.id || `${index + 1}`,
|
|
title: t(`technology.core.tech${index + 1}.title`),
|
|
description: t(`technology.core.tech${index + 1}.description`),
|
|
image: item.image || '/LOGO.png',
|
|
color: colors[index % colors.length],
|
|
icon: icons[index % icons.length]
|
|
};
|
|
});
|
|
} else {
|
|
// 使用默认数据
|
|
technologies.value = defaultTechnologies.value;
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to load technologies:', error);
|
|
technologies.value = defaultTechnologies.value;
|
|
}
|
|
};
|
|
|
|
// 默认核心技术数据(当API数据不可用时使用)
|
|
const defaultTechnologies = computed(() => [
|
|
{
|
|
id: '1',
|
|
title: t('technology.core.tech_barrier.title'),
|
|
description: t('technology.core.tech_barrier.description'),
|
|
icon: 'carbon:security',
|
|
color: 'primary',
|
|
image: '/LOGO.png' // 这里替换为实际图片路径
|
|
},
|
|
{
|
|
id: '2',
|
|
title: t('technology.core.ecosystem_advantage.title'),
|
|
description: t('technology.core.ecosystem_advantage.description'),
|
|
icon: 'carbon:growth',
|
|
color: 'secondary',
|
|
image: '/LOGO.png' // 这里替换为实际图片路径
|
|
},
|
|
{
|
|
id: '3',
|
|
title: t('technology.core.mixer.title'),
|
|
description: t('technology.core.mixer.description'),
|
|
icon: 'carbon:currency',
|
|
color: 'accent',
|
|
image: '/LOGO.png' // 这里替换为实际图片路径
|
|
},
|
|
{
|
|
id: '4',
|
|
title: t('technology.core.crosschain_bridge.title'),
|
|
description: t('technology.core.crosschain_bridge.description'),
|
|
icon: 'carbon:bridge',
|
|
color: 'primary',
|
|
image: '/LOGO.png' // 这里替换为实际图片路径
|
|
}
|
|
]);
|
|
|
|
|
|
|
|
// 应用数据
|
|
const apps = computed(() => [
|
|
{
|
|
id: 1,
|
|
name: t('technology.apps.wallet.name'),
|
|
description: t('technology.apps.wallet.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-blue-600 to-indigo-900',
|
|
icon: 'carbon:wallet'
|
|
},
|
|
{
|
|
id: 2,
|
|
name: t('technology.apps.exchange.name'),
|
|
description: t('technology.apps.exchange.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-purple-600 to-indigo-900',
|
|
icon: 'carbon:chart-line'
|
|
},
|
|
{
|
|
id: 3,
|
|
name: t('technology.apps.bridge.name'),
|
|
description: t('technology.apps.bridge.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-green-600 to-teal-900',
|
|
icon: 'carbon:bridge'
|
|
},
|
|
{
|
|
id: 4,
|
|
name: t('technology.apps.pay.name'),
|
|
description: t('technology.apps.pay.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-orange-600 to-red-900',
|
|
icon: 'carbon:purchase'
|
|
},
|
|
{
|
|
id: 5,
|
|
name: t('technology.apps.dao.name'),
|
|
description: t('technology.apps.dao.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-amber-600 to-orange-900',
|
|
icon: 'carbon:group'
|
|
},
|
|
{
|
|
id: 6,
|
|
name: t('technology.apps.nft.name'),
|
|
description: t('technology.apps.nft.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-pink-600 to-rose-900',
|
|
icon: 'carbon:image'
|
|
},
|
|
{
|
|
id: 7,
|
|
name: t('technology.apps.defi.name'),
|
|
description: t('technology.apps.defi.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-cyan-600 to-blue-900',
|
|
icon: 'carbon:money'
|
|
},
|
|
{
|
|
id: 8,
|
|
name: t('technology.apps.id.name'),
|
|
description: t('technology.apps.id.description'),
|
|
image: '/LOGO.png',
|
|
color: 'from-emerald-600 to-green-900',
|
|
icon: 'carbon:user'
|
|
}
|
|
]);
|
|
|
|
// 从API获取应用列表
|
|
const appList = ref([]);
|
|
|
|
// 获取应用列表
|
|
const fetchAppList = async () => {
|
|
try {
|
|
const result = await queryAppList({
|
|
pageSize: 10,
|
|
pageNo: 1
|
|
});
|
|
if (result && result.length > 0) {
|
|
// 只使用API返回的图片数据,文本全部使用i18n
|
|
appList.value = result.map((item, index) => {
|
|
const colors = [
|
|
'from-blue-600 to-indigo-900',
|
|
'from-purple-600 to-indigo-900',
|
|
'from-green-600 to-teal-900',
|
|
'from-orange-600 to-red-900',
|
|
'from-amber-600 to-orange-900',
|
|
'from-pink-600 to-rose-900',
|
|
'from-cyan-600 to-blue-900',
|
|
'from-emerald-600 to-green-900'
|
|
];
|
|
const icons = [
|
|
'carbon:wallet', 'carbon:chart-line', 'carbon:bridge', 'carbon:purchase',
|
|
'carbon:group', 'carbon:image', 'carbon:money', 'carbon:user'
|
|
];
|
|
const appKeys = ['wallet', 'exchange', 'bridge', 'pay', 'dao', 'nft', 'defi', 'id'];
|
|
const appKey = appKeys[index] || `app${index + 1}`;
|
|
return {
|
|
id: item.id || index + 1,
|
|
name: t(`technology.apps.${appKey}.name`),
|
|
description: t(`technology.apps.${appKey}.description`),
|
|
image: item.image || '/LOGO.png',
|
|
color: colors[index % colors.length],
|
|
icon: icons[index % icons.length]
|
|
};
|
|
});
|
|
} else {
|
|
appList.value = apps.value;
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to load app list:', error);
|
|
appList.value = apps.value;
|
|
}
|
|
};
|
|
|
|
// 加载状态
|
|
const loading = ref(false);
|
|
|
|
const structural = ref<TechnologyItem[]>([]);
|
|
|
|
// 从API获取创新技术数据
|
|
const fetchInnovation = async () => {
|
|
try {
|
|
const result = await queryStructuralList({
|
|
pageSize: 10,
|
|
pageNo: 1
|
|
});
|
|
if (result && result.length > 0) {
|
|
// 只使用API返回的图片数据,文本全部使用i18n
|
|
structural.value = result.map((item, index) => ({
|
|
id: item.id || `${index + 1}`,
|
|
title: t(`technology.architecture.layers.layer${index + 1}.title`),
|
|
description: t(`technology.architecture.layers.layer${index + 1}.description`),
|
|
image: item.image || '/LOGO.png'
|
|
}));
|
|
console.log('Structural data with i18n:', structural.value);
|
|
} else {
|
|
// 使用默认的i18n数据
|
|
structural.value = Array.from({ length: 4 }, (_, index) => ({
|
|
id: `${index + 1}`,
|
|
title: t(`technology.architecture.layers.layer${index + 1}.title`),
|
|
description: t(`technology.architecture.layers.layer${index + 1}.description`),
|
|
image: '/LOGO.png'
|
|
}));
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to load innovation data:', error);
|
|
// 使用默认的i18n数据作为fallback
|
|
structural.value = Array.from({ length: 4 }, (_, index) => ({
|
|
id: `${index + 1}`,
|
|
title: t(`technology.architecture.layers.layer${index + 1}.title`),
|
|
description: t(`technology.architecture.layers.layer${index + 1}.description`),
|
|
image: '/LOGO.png'
|
|
}));
|
|
}
|
|
}
|
|
|
|
// Swiper配置
|
|
const swiperOptions = {
|
|
modules: [Pagination, Navigation, Autoplay],
|
|
slidesPerView: 1,
|
|
spaceBetween: 0,
|
|
loop: true,
|
|
grabCursor: true,
|
|
pagination: {
|
|
clickable: true,
|
|
},
|
|
navigation: {
|
|
nextEl: '.swiper-button-next',
|
|
prevEl: '.swiper-button-prev',
|
|
},
|
|
autoplay: {
|
|
delay: 3000,
|
|
disableOnInteraction: false,
|
|
},
|
|
};
|
|
|
|
// 初始化
|
|
onMounted(() => {
|
|
// 初始化WOW.js动画
|
|
try {
|
|
const WOW = window.WOW;
|
|
if (WOW) {
|
|
new WOW({
|
|
boxClass: 'wow',
|
|
animateClass: 'animate__animated',
|
|
offset: 100,
|
|
mobile: true,
|
|
live: true
|
|
}).init();
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to initialize WOW.js:', error);
|
|
}
|
|
|
|
// 获取核心技术数据
|
|
fetchTechnologies();
|
|
|
|
// 获取应用列表
|
|
fetchAppList();
|
|
|
|
// 获取创新技术数据
|
|
fetchInnovation();
|
|
});
|
|
|
|
|
|
</script>
|
|
|
|
<template>
|
|
<div class="bg-background min-h-screen">
|
|
<!-- Hero Section -->
|
|
<section class="relative py-16 md:py-24 px-4 md:px-12 lg:px-24 bg-background-dark overflow-hidden">
|
|
<div class="container mx-auto relative z-10">
|
|
<div class="max-w-4xl mx-auto text-center">
|
|
<!-- 移动端优化的标题 -->
|
|
<h1 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-4 md:mb-6 leading-tight wow animate__animated animate__fadeInDown animate__duration-fast">
|
|
{{ t('technology.hero.title') }}
|
|
</h1>
|
|
|
|
<!-- 移动端优化的副标题 -->
|
|
<p class="text-base sm:text-lg md:text-xl text-text-secondary mb-8 md:mb-10 leading-relaxed px-2 wow animate__animated animate__fadeIn animate__delay-xs animate__duration-fast">
|
|
{{ t('technology.hero.description') }}
|
|
</p>
|
|
|
|
<!-- 移动端优化的按钮组 -->
|
|
<div class="flex flex-col sm:flex-row justify-center gap-3 sm:gap-4 px-4 sm:px-0">
|
|
<a href="#architecture" class="inline-flex items-center justify-center gap-2 bg-primary hover:bg-primary-dark text-white font-medium py-3 px-6 rounded-lg transition-colors duration-200">
|
|
<Icon icon="carbon:arrow-down" />
|
|
{{ t('technology.buttons.learn_architecture') }}
|
|
</a>
|
|
<a href="#innovation" class="inline-flex items-center justify-center gap-2 bg-transparent border border-primary hover:bg-primary-light/10 text-primary font-medium py-3 px-6 rounded-lg transition-colors duration-200">
|
|
<Icon icon="carbon:launch" />
|
|
{{ t('technology.buttons.core_innovation') }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 优化的背景装饰 -->
|
|
<div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-20">
|
|
<!-- 移动端优化的装饰球 -->
|
|
<div class="absolute -top-16 -left-16 w-32 h-32 md:w-64 md:h-64 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 blur-3xl wow animate__animated animate__pulse animate__infinite"></div>
|
|
<div class="absolute top-1/2 -right-8 w-24 h-24 md:w-80 md:h-80 rounded-full bg-gradient-to-br from-purple-500 to-cyan-500 blur-3xl wow animate__animated animate__pulse animate__infinite animate__delay-sm"></div>
|
|
<div class="absolute -bottom-12 left-1/4 w-28 h-28 md:w-72 md:h-72 rounded-full bg-gradient-to-br from-cyan-500 to-blue-500 blur-3xl wow animate__animated animate__pulse animate__infinite animate__delay-md"></div>
|
|
|
|
<!-- 移动端新增的小装饰点 -->
|
|
<div class="absolute top-1/4 right-1/4 w-2 h-2 md:w-4 md:h-4 rounded-full bg-white opacity-60 animate-ping"></div>
|
|
<div class="absolute bottom-1/3 left-1/3 w-1 h-1 md:w-3 md:h-3 rounded-full bg-blue-400 opacity-80 animate-pulse"></div>
|
|
</div>
|
|
|
|
<!-- 移动端新增的网格背景 -->
|
|
<div class="absolute inset-0 opacity-5">
|
|
<div class="absolute inset-0" style="background-image: radial-gradient(circle at 1px 1px, rgba(255,255,255,0.3) 1px, transparent 0); background-size: 20px 20px;"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 技术架构模块 - 4列布局 带底图 (优化移动端显示) -->
|
|
<section id="architecture" class="bg-background-light">
|
|
<div class="w-full bg-background-dark">
|
|
<h2 class="text-3xl md:text-4xl font-bold text-white pt-8 mb-8 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
|
|
{{ t('technology.architecture.title') }}
|
|
</h2>
|
|
|
|
<!-- 移动端自然流动展示 -->
|
|
<div class="md:hidden architecture-gallery">
|
|
<div
|
|
v-for="(arch, index) in structural"
|
|
:key="index"
|
|
class="architecture-section h-[80vh] relative overflow-hidden bg-cover bg-center flex items-center"
|
|
:style="{backgroundImage: `url(${arch.image})`}"
|
|
>
|
|
<!-- 背景遮罩 -->
|
|
<div class="absolute inset-0 bg-black/40"></div>
|
|
|
|
<!-- 内容区域 -->
|
|
<div class="relative z-10 px-8 py-12 text-left max-w-md">
|
|
<h3 class="text-3xl font-bold text-white mb-6">{{ t(`technology.architecture.layers.layer${index + 1}.title`) }}</h3>
|
|
<div class="text-white/90 text-lg leading-relaxed mb-8" v-html="t(`technology.architecture.layers.layer${index + 1}.description`)"></div>
|
|
|
|
<!-- 特性列表 -->
|
|
<div v-if="arch.features" class="space-y-3 mb-8">
|
|
<div v-for="(feature, idx) in arch.features" :key="idx" class="flex items-center text-white/80">
|
|
<div class="w-2 h-2 bg-white rounded-full mr-3"></div>
|
|
<span>{{ feature }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 按钮 -->
|
|
<button class="px-6 py-3 bg-white/20 backdrop-blur-sm border border-white/30 text-white rounded-lg hover:bg-white/30 transition-all duration-300 flex items-center gap-2">
|
|
{{ t('common.buttons.learn_more') }}
|
|
<Icon icon="carbon:arrow-right" />
|
|
</button>
|
|
</div>
|
|
|
|
<!-- 装饰元素 -->
|
|
<div class="absolute inset-0 pointer-events-none">
|
|
<!-- 随机位置的装饰圆圈 -->
|
|
<div
|
|
v-for="i in 3"
|
|
:key="i"
|
|
class="absolute w-20 h-20 rounded-full border border-white/20"
|
|
:class="`animate-float${i % 2 === 0 ? '-reverse' : ''}`"
|
|
:style="{
|
|
top: `${20 + (i * 25)}%`,
|
|
right: `${10 + (i * 15)}%`,
|
|
animationDelay: `${i * 2}s`
|
|
}"
|
|
></div>
|
|
|
|
<!-- 渐变装饰 -->
|
|
<div class="absolute top-1/4 right-1/4 w-32 h-32 bg-gradient-to-br from-blue-500/20 to-purple-500/20 rounded-full blur-xl animate-float"></div>
|
|
<div class="absolute bottom-1/3 right-1/3 w-24 h-24 bg-gradient-to-br from-green-500/20 to-blue-500/20 rounded-full blur-xl animate-float-reverse" style="animation-delay: 4s;"></div>
|
|
</div>
|
|
|
|
<!-- 序号装饰 -->
|
|
<div class="absolute bottom-8 right-8">
|
|
<span class="text-6xl font-bold text-white/10">0{{ index + 1 }}</span>
|
|
</div>
|
|
|
|
<!-- 滚动提示 -->
|
|
<div v-if="index < structural.length - 1" class="absolute bottom-8 left-1/2 transform -translate-x-1/2 text-white/60 animate-bounce">
|
|
<Icon icon="carbon:arrow-down" class="h-6 w-6" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 桌面端网格布局 -->
|
|
<div class="hidden md:flex flex-wrap justify-between w-full">
|
|
<!-- 动态生成技术架构卡片 (桌面端) -->
|
|
<div
|
|
v-for="(arch, index) in structural"
|
|
:key="index"
|
|
class="sm:w-1/2 lg:w-1/4 px-4 mb-8 wow animate__animated animate__fadeInUp flex-1 bg-background-dark py-64 relative"
|
|
:style="{backgroundImage: `url(${arch.image})`}"
|
|
:class="[`delay-${index*100}`]"
|
|
>
|
|
<!-- 内容 -->
|
|
<div class="flex flex-col items-center text-center">
|
|
<h4 class="text-white text-xl font-medium mb-6">{{ t(`technology.architecture.layers.layer${index + 1}.title`) }}</h4>
|
|
<p class="text-white text-sm font-medium mb-6 px-14" v-html="t(`technology.architecture.layers.layer${index + 1}.description`)"></p>
|
|
|
|
<!-- 按钮 -->
|
|
<button class="px-6 py-2 bg-red-600 hover:bg-red-700 rounded-sm text-white text-sm flex items-center gap-2 transition-all duration-300 absolute bottom-40 transform %">
|
|
{{ t('common.buttons.learn_more') }}
|
|
<Icon icon="carbon:arrow-right" />
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 核心技术模块 - 优化移动端显示 -->
|
|
<section id="innovation" class="relative">
|
|
<!-- 移动端垂直排列布局 -->
|
|
<div class="md:hidden bg-background-dark py-12 px-4">
|
|
<h2 class="text-3xl font-bold text-white mb-8 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
|
|
{{ t('technology.innovation.title') }}
|
|
</h2>
|
|
|
|
<!-- 移动端垂直滚动列表 -->
|
|
<div class="space-y-6">
|
|
<div
|
|
v-for="(tech, index) in technologies"
|
|
:key="tech.id"
|
|
class="bg-background rounded-xl overflow-hidden shadow-lg wow animate__animated animate__fadeInUp"
|
|
:class="[`animate__delay-${index}s`]"
|
|
>
|
|
<!-- 图片部分 -->
|
|
<div class="h-48 relative">
|
|
<img :src="tech.image" :alt="tech.title" class="w-full h-full object-cover" />
|
|
<div
|
|
class="absolute inset-0"
|
|
:class="{
|
|
'bg-gradient-to-b from-transparent to-indigo-900/90': tech.color === 'primary',
|
|
'bg-gradient-to-b from-transparent to-emerald-900/90': tech.color === 'secondary',
|
|
'bg-gradient-to-b from-transparent to-amber-900/90': tech.color === 'accent',
|
|
'bg-gradient-to-b from-transparent to-blue-900/90': tech.color === 'primary' && index === 3
|
|
}"
|
|
></div>
|
|
|
|
<!-- 图标 -->
|
|
<div class="absolute bottom-4 left-4 flex items-center">
|
|
<div class="w-12 h-12 rounded-full bg-white/20 backdrop-blur-sm flex items-center justify-center mr-3">
|
|
<Icon :icon="tech.icon" class="h-6 w-6" :class="`text-${tech.color}`" />
|
|
</div>
|
|
<h3 class="text-2xl font-bold text-white">{{ tech.title }}</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 内容部分 -->
|
|
<div class="p-6">
|
|
<div class="text-text-secondary text-sm leading-relaxed mb-6" v-html="tech.description"></div>
|
|
|
|
<!-- 按钮 -->
|
|
<button class="w-full py-3 bg-primary hover:bg-primary-dark text-white text-sm font-medium rounded-lg flex items-center justify-center gap-2 transition-all duration-300">
|
|
{{ t('common.buttons.learn_more') }}
|
|
<Icon icon="carbon:arrow-right" />
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 桌面端全屏垂直布局 -->
|
|
<div class="hidden md:block">
|
|
<div
|
|
v-for="(tech, index) in technologies"
|
|
:key="tech.id"
|
|
class="relative w-full h-screen flex items-center justify-center overflow-hidden wow animate__animated animate__fadeInUp"
|
|
:class="[`delay-${index*100}`]"
|
|
>
|
|
<!-- 背景图片 -->
|
|
<div class="absolute inset-0 w-full h-full">
|
|
<img :src="tech.image" :alt="tech.title" class="w-full h-full object-cover" />
|
|
<div
|
|
class="absolute inset-0"
|
|
|
|
></div>
|
|
</div>
|
|
|
|
<!-- 内容 - 左右交替布局 -->
|
|
<div class="relative z-10 w-full max-w-7xl mx-auto px-8 md:px-12 lg:px-24 flex flex-col md:flex-row items-center">
|
|
<!-- 左侧内容 (偶数索引) 或 右侧内容 (奇数索引) -->
|
|
<div
|
|
class="md:w-1/2 mb-8 md:mb-0"
|
|
:class="{ 'order-1': index % 2 === 0, 'order-2': index % 2 === 1 }"
|
|
>
|
|
<div class="flex items-center mb-6">
|
|
<div class="w-16 h-16 rounded-full bg-white/20 backdrop-blur-sm flex items-center justify-center mr-4">
|
|
<Icon :icon="tech.icon" class="h-8 w-8" :class="`text-${tech.color}`" />
|
|
</div>
|
|
<h3 class="text-3xl md:text-4xl lg:text-5xl font-bold text-white">{{ tech.title }}</h3>
|
|
</div>
|
|
<div class="text-white/90 text-lg md:text-xl leading-relaxed mb-6" v-html="tech.description">
|
|
</div>
|
|
|
|
<!-- 按钮 -->
|
|
<div>
|
|
<button class="px-6 py-3 bg-white/20 hover:bg-white/30 backdrop-blur-sm rounded-full text-white text-base flex items-center gap-2 transition-all duration-300 border border-white/30">
|
|
{{ t('common.buttons.learn_more') }}
|
|
<Icon icon="carbon:arrow-right" />
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 右侧装饰元素 (偶数索引) 或 左侧装饰元素 (奇数索引) -->
|
|
<div
|
|
class="md:w-1/2 md:px-12 flex justify-center"
|
|
:class="{
|
|
'order-2 md:justify-end': index % 2 === 0,
|
|
'order-1 md:justify-start': index % 2 === 1
|
|
}"
|
|
>
|
|
<div
|
|
class="w-48 h-48 md:w-64 md:h-64 rounded-full border-2 border-white/20 flex items-center justify-center relative overflow-hidden"
|
|
:class="{
|
|
'bg-indigo-900/20': tech.color === 'primary',
|
|
'bg-emerald-900/20': tech.color === 'secondary',
|
|
'bg-amber-900/20': tech.color === 'accent',
|
|
'bg-blue-900/20': tech.color === 'primary' && index === 3
|
|
}"
|
|
>
|
|
<!-- 内圈 -->
|
|
<div class="w-32 h-32 md:w-40 md:h-40 rounded-full border border-white/40 absolute animate-spin-slow"></div>
|
|
|
|
<!-- 技术图标 -->
|
|
<div class="w-20 h-20 md:w-24 md:h-24 rounded-full bg-white/10 backdrop-blur-md flex items-center justify-center">
|
|
<Icon :icon="tech.icon" class="h-10 w-10 md:h-12 md:w-12" :class="`text-${tech.color}`" />
|
|
</div>
|
|
|
|
<!-- 装饰点 -->
|
|
<div class="absolute top-1/4 right-1/4 w-3 h-3 rounded-full bg-white"></div>
|
|
<div class="absolute bottom-1/4 left-1/4 w-3 h-3 rounded-full bg-white"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 序号装饰 -->
|
|
<div
|
|
class="absolute bottom-8"
|
|
:class="{ 'right-12': index % 2 === 0, 'left-12': index % 2 === 1 }"
|
|
>
|
|
<span class="text-9xl font-bold text-white opacity-10">0{{ index + 1 }}</span>
|
|
</div>
|
|
|
|
<!-- 滚动提示 -->
|
|
<div class="absolute bottom-8 left-1/2 transform -translate-x-1/2 text-white/60 animate-bounce">
|
|
<Icon icon="carbon:arrow-down" class="h-6 w-6" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 应用程序模块 - Swiper轮播 (重新实现) -->
|
|
<section class="py-16 px-6 md:px-12 lg:px-24 bg-background-light relative overflow-hidden" :style="{ backgroundImage: `url(${getConfigImage('eco_app_bg')})` }">
|
|
<div class="container mx-auto relative z-10">
|
|
<h2 class="text-3xl md:text-4xl font-bold text-text mb-12 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
|
|
{{ t('technology.integration.title') }}
|
|
</h2>
|
|
|
|
<div v-if="loading" class="flex justify-center py-20">
|
|
<div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary"></div>
|
|
</div>
|
|
|
|
<div v-else class="relative overflow-hidden rounded-2xl shadow-lg">
|
|
<!-- 重新实现的Swiper轮播 (单图模式) -->
|
|
<Swiper
|
|
v-bind="swiperOptions"
|
|
class="mySwiper"
|
|
>
|
|
<SwiperSlide v-for="app in appList" :key="app.id" class="flex justify-center items-center">
|
|
<div class="w-full h-full rounded-xl overflow-hidden shadow-xl flex flex-col p-5 transition-transform duration-300 hover:translate-y-[-10px] bg-cover bg-center relative" :style="{ backgroundImage: `url(${app.image})` }">
|
|
<div class="absolute inset-0 bg-gradient-to-b from-black/30 to-black/80 z-[1]"></div>
|
|
<div class="w-[60px] h-[60px] rounded-full bg-white/20 flex justify-center items-center mb-5 relative z-[2]">
|
|
<img :src="app.image" alt="" />
|
|
</div>
|
|
<div class="flex-1 flex flex-col relative z-[2]">
|
|
<h3 class="text-2xl font-bold text-white mb-2.5">{{ app.name }}</h3>
|
|
<p class="text-base text-white/80 mb-5 flex-1" v-html="app.description"></p>
|
|
<a
|
|
:href="app.link"
|
|
target="_blank"
|
|
class="inline-flex items-center gap-2 bg-white/20 text-white py-2 px-4 rounded-full text-sm transition-colors duration-300 border border-white/30 hover:bg-white/30 w-fit"
|
|
>
|
|
{{ t('common.buttons.try_now') }}
|
|
<Icon icon="carbon:launch" />
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</SwiperSlide>
|
|
|
|
<!-- 自定义导航按钮 -->
|
|
<div class="swiper-button-prev"></div>
|
|
<div class="swiper-button-next"></div>
|
|
|
|
<!-- 自定义分页器 -->
|
|
<div class="swiper-pagination"></div>
|
|
</Swiper>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 背景装饰 -->
|
|
<div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-5 pointer-events-none">
|
|
<div class="absolute top-1/4 left-1/4 w-64 h-64 rounded-full border border-primary"></div>
|
|
<div class="absolute bottom-1/4 right-1/4 w-96 h-96 rounded-full border border-secondary"></div>
|
|
<div class="absolute top-3/4 left-3/4 w-48 h-48 rounded-full border border-accent"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 保留原有模块 -->
|
|
<!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background">
|
|
<ArchitectureModule />
|
|
</div> -->
|
|
|
|
<!-- 保留原有模块 -->
|
|
<!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background-light">
|
|
<InnovationModule />
|
|
</div> -->
|
|
|
|
<!-- 保留原有模块 -->
|
|
<!-- <div class="py-16 px-6 md:px-12 lg:px-24">
|
|
<EcosystemIntegrationModule />
|
|
</div> -->
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
@reference "tailwindcss";
|
|
|
|
/* 自定义动画 - 只保留无法用Tailwind实现的部分 */
|
|
@keyframes spin-slow {
|
|
from {
|
|
transform: rotate(0deg);
|
|
}
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
.animate-spin-slow {
|
|
animation: spin-slow 20s linear infinite;
|
|
}
|
|
|
|
/* 隐藏滚动条但保留功能 */
|
|
.hide-scrollbar {
|
|
-ms-overflow-style: none; /* IE and Edge */
|
|
scrollbar-width: none; /* Firefox */
|
|
}
|
|
|
|
.hide-scrollbar::-webkit-scrollbar {
|
|
display: none; /* Chrome, Safari, Opera */
|
|
}
|
|
|
|
/* Swiper相关样式 - 这部分需要保留,因为Swiper组件需要特定样式 */
|
|
:deep(.tech-swiper .swiper-pagination) {
|
|
@apply bottom-0;
|
|
}
|
|
|
|
:deep(.tech-swiper .swiper-pagination-bullet) {
|
|
@apply w-2 h-2 bg-white/50 opacity-100 transition-all duration-300;
|
|
}
|
|
|
|
:deep(.tech-swiper .swiper-pagination-bullet-active) {
|
|
@apply bg-white scale-110;
|
|
}
|
|
|
|
:deep(.mySwiper) {
|
|
@apply w-full pt-5 pb-10;
|
|
}
|
|
|
|
:deep(.swiper-slide) {
|
|
@apply bg-center bg-cover h-[400px];
|
|
}
|
|
|
|
:deep(.swiper-button-next),
|
|
:deep(.swiper-button-prev) {
|
|
@apply text-white w-10 h-10 rounded-full bg-black/50 transition-colors duration-300;
|
|
}
|
|
|
|
:deep(.swiper-button-next:hover),
|
|
:deep(.swiper-button-prev:hover) {
|
|
@apply bg-black/70;
|
|
}
|
|
|
|
:deep(.swiper-button-next:after),
|
|
:deep(.swiper-button-prev:after) {
|
|
@apply text-lg;
|
|
}
|
|
|
|
:deep(.swiper-pagination-bullet) {
|
|
@apply w-2.5 h-2.5 bg-white/50 opacity-100 transition-all duration-300;
|
|
}
|
|
|
|
:deep(.swiper-pagination-bullet-active) {
|
|
@apply bg-white scale-110;
|
|
}
|
|
|
|
:deep(.swiper-pagination) {
|
|
@apply bottom-2.5;
|
|
}
|
|
|
|
/* 移动端隐藏导航按钮 */
|
|
@media (max-width: 640px) {
|
|
:deep(.swiper-button-next),
|
|
:deep(.swiper-button-prev) {
|
|
@apply hidden;
|
|
}
|
|
}
|
|
</style>
|