国外MOSE官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

758 lines
28 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. <script setup lang="ts">
  2. import { Icon } from '@iconify/vue';
  3. import { ref, onMounted, reactive, computed } from 'vue';
  4. import ArchitectureModule from '@/components/technology/ArchitectureModule.vue';
  5. import InnovationModule from '@/components/technology/InnovationModule.vue';
  6. import EcosystemIntegrationModule from '@/components/technology/EcosystemIntegrationModule.vue';
  7. import AppListModule from '@/components/ecosystem/AppListModule.vue';
  8. import { useI18n } from 'vue-i18n';
  9. import { useConfig } from '@/utils/config';
  10. // 导入Swiper相关组件和模块
  11. import { Swiper, SwiperSlide } from 'swiper/vue';
  12. import { Pagination, Navigation, Autoplay } from 'swiper/modules';
  13. import 'swiper/css';
  14. import 'swiper/css/pagination';
  15. import 'swiper/css/navigation';
  16. import type {TechnologyItem } from '@/api/modules/technology'
  17. const { getConfigImage } = useConfig();
  18. import { queryTechnologyList, queryStructuralList } from '@/api/modules/technology';
  19. import { queryAppList } from '@/api/modules/ecosystem';
  20. const { t } = useI18n();
  21. // 从API获取核心技术数据
  22. const technologies = ref([]);
  23. // 获取核心技术列表
  24. const fetchTechnologies = async () => {
  25. try {
  26. const result = await queryTechnologyList({
  27. pageSize: 10,
  28. pageNo: 1
  29. });
  30. if (result && result.length > 0) {
  31. // 只使用API返回的图片数据,文本全部使用i18n
  32. technologies.value = result.map((item, index) => {
  33. const colors = ['primary', 'secondary', 'accent', 'primary'];
  34. const icons = ['carbon:security', 'carbon:growth', 'carbon:currency', 'carbon:bridge'];
  35. return {
  36. id: item.id || `${index + 1}`,
  37. title: t(`technology.core.tech${index + 1}.title`),
  38. description: t(`technology.core.tech${index + 1}.description`),
  39. image: item.image || '/LOGO.png',
  40. color: colors[index % colors.length],
  41. icon: icons[index % icons.length]
  42. };
  43. });
  44. } else {
  45. // 使用默认数据
  46. technologies.value = defaultTechnologies.value;
  47. }
  48. } catch (error) {
  49. console.error('Failed to load technologies:', error);
  50. technologies.value = defaultTechnologies.value;
  51. }
  52. };
  53. // 默认核心技术数据(当API数据不可用时使用)
  54. const defaultTechnologies = computed(() => [
  55. {
  56. id: '1',
  57. title: t('technology.core.tech_barrier.title'),
  58. description: t('technology.core.tech_barrier.description'),
  59. icon: 'carbon:security',
  60. color: 'primary',
  61. image: '/LOGO.png' // 这里替换为实际图片路径
  62. },
  63. {
  64. id: '2',
  65. title: t('technology.core.ecosystem_advantage.title'),
  66. description: t('technology.core.ecosystem_advantage.description'),
  67. icon: 'carbon:growth',
  68. color: 'secondary',
  69. image: '/LOGO.png' // 这里替换为实际图片路径
  70. },
  71. {
  72. id: '3',
  73. title: t('technology.core.mixer.title'),
  74. description: t('technology.core.mixer.description'),
  75. icon: 'carbon:currency',
  76. color: 'accent',
  77. image: '/LOGO.png' // 这里替换为实际图片路径
  78. },
  79. {
  80. id: '4',
  81. title: t('technology.core.crosschain_bridge.title'),
  82. description: t('technology.core.crosschain_bridge.description'),
  83. icon: 'carbon:bridge',
  84. color: 'primary',
  85. image: '/LOGO.png' // 这里替换为实际图片路径
  86. }
  87. ]);
  88. // 应用数据
  89. const apps = computed(() => [
  90. {
  91. id: 1,
  92. name: t('technology.apps.wallet.name'),
  93. description: t('technology.apps.wallet.description'),
  94. image: '/LOGO.png',
  95. color: 'from-blue-600 to-indigo-900',
  96. icon: 'carbon:wallet'
  97. },
  98. {
  99. id: 2,
  100. name: t('technology.apps.exchange.name'),
  101. description: t('technology.apps.exchange.description'),
  102. image: '/LOGO.png',
  103. color: 'from-purple-600 to-indigo-900',
  104. icon: 'carbon:chart-line'
  105. },
  106. {
  107. id: 3,
  108. name: t('technology.apps.bridge.name'),
  109. description: t('technology.apps.bridge.description'),
  110. image: '/LOGO.png',
  111. color: 'from-green-600 to-teal-900',
  112. icon: 'carbon:bridge'
  113. },
  114. {
  115. id: 4,
  116. name: t('technology.apps.pay.name'),
  117. description: t('technology.apps.pay.description'),
  118. image: '/LOGO.png',
  119. color: 'from-orange-600 to-red-900',
  120. icon: 'carbon:purchase'
  121. },
  122. {
  123. id: 5,
  124. name: t('technology.apps.dao.name'),
  125. description: t('technology.apps.dao.description'),
  126. image: '/LOGO.png',
  127. color: 'from-amber-600 to-orange-900',
  128. icon: 'carbon:group'
  129. },
  130. {
  131. id: 6,
  132. name: t('technology.apps.nft.name'),
  133. description: t('technology.apps.nft.description'),
  134. image: '/LOGO.png',
  135. color: 'from-pink-600 to-rose-900',
  136. icon: 'carbon:image'
  137. },
  138. {
  139. id: 7,
  140. name: t('technology.apps.defi.name'),
  141. description: t('technology.apps.defi.description'),
  142. image: '/LOGO.png',
  143. color: 'from-cyan-600 to-blue-900',
  144. icon: 'carbon:money'
  145. },
  146. {
  147. id: 8,
  148. name: t('technology.apps.id.name'),
  149. description: t('technology.apps.id.description'),
  150. image: '/LOGO.png',
  151. color: 'from-emerald-600 to-green-900',
  152. icon: 'carbon:user'
  153. }
  154. ]);
  155. // 从API获取应用列表
  156. const appList = ref([]);
  157. // 获取应用列表
  158. const fetchAppList = async () => {
  159. try {
  160. const result = await queryAppList({
  161. pageSize: 10,
  162. pageNo: 1
  163. });
  164. if (result && result.length > 0) {
  165. // 只使用API返回的图片数据,文本全部使用i18n
  166. appList.value = result.map((item, index) => {
  167. const colors = [
  168. 'from-blue-600 to-indigo-900',
  169. 'from-purple-600 to-indigo-900',
  170. 'from-green-600 to-teal-900',
  171. 'from-orange-600 to-red-900',
  172. 'from-amber-600 to-orange-900',
  173. 'from-pink-600 to-rose-900',
  174. 'from-cyan-600 to-blue-900',
  175. 'from-emerald-600 to-green-900'
  176. ];
  177. const icons = [
  178. 'carbon:wallet', 'carbon:chart-line', 'carbon:bridge', 'carbon:purchase',
  179. 'carbon:group', 'carbon:image', 'carbon:money', 'carbon:user'
  180. ];
  181. const appKeys = ['wallet', 'exchange', 'bridge', 'pay', 'dao', 'nft', 'defi', 'id'];
  182. const appKey = appKeys[index] || `app${index + 1}`;
  183. return {
  184. id: item.id || index + 1,
  185. name: t(`technology.apps.${appKey}.name`),
  186. description: t(`technology.apps.${appKey}.description`),
  187. image: item.image || '/LOGO.png',
  188. color: colors[index % colors.length],
  189. icon: icons[index % icons.length]
  190. };
  191. });
  192. } else {
  193. appList.value = apps.value;
  194. }
  195. } catch (error) {
  196. console.error('Failed to load app list:', error);
  197. appList.value = apps.value;
  198. }
  199. };
  200. // 加载状态
  201. const loading = ref(false);
  202. const structural = ref<TechnologyItem[]>([]);
  203. // 从API获取创新技术数据
  204. const fetchInnovation = async () => {
  205. try {
  206. const result = await queryStructuralList({
  207. pageSize: 10,
  208. pageNo: 1
  209. });
  210. if (result && result.length > 0) {
  211. // 只使用API返回的图片数据,文本全部使用i18n
  212. structural.value = result.map((item, index) => ({
  213. id: item.id || `${index + 1}`,
  214. title: t(`technology.architecture.layers.layer${index + 1}.title`),
  215. description: t(`technology.architecture.layers.layer${index + 1}.description`),
  216. image: item.image || '/LOGO.png'
  217. }));
  218. console.log('Structural data with i18n:', structural.value);
  219. } else {
  220. // 使用默认的i18n数据
  221. structural.value = Array.from({ length: 4 }, (_, index) => ({
  222. id: `${index + 1}`,
  223. title: t(`technology.architecture.layers.layer${index + 1}.title`),
  224. description: t(`technology.architecture.layers.layer${index + 1}.description`),
  225. image: '/LOGO.png'
  226. }));
  227. }
  228. } catch (error) {
  229. console.error('Failed to load innovation data:', error);
  230. // 使用默认的i18n数据作为fallback
  231. structural.value = Array.from({ length: 4 }, (_, index) => ({
  232. id: `${index + 1}`,
  233. title: t(`technology.architecture.layers.layer${index + 1}.title`),
  234. description: t(`technology.architecture.layers.layer${index + 1}.description`),
  235. image: '/LOGO.png'
  236. }));
  237. }
  238. }
  239. // Swiper配置
  240. const swiperOptions = {
  241. modules: [Pagination, Navigation, Autoplay],
  242. slidesPerView: 1,
  243. spaceBetween: 0,
  244. loop: true,
  245. grabCursor: true,
  246. pagination: {
  247. clickable: true,
  248. },
  249. navigation: {
  250. nextEl: '.swiper-button-next',
  251. prevEl: '.swiper-button-prev',
  252. },
  253. autoplay: {
  254. delay: 3000,
  255. disableOnInteraction: false,
  256. },
  257. };
  258. // 初始化
  259. onMounted(() => {
  260. // 初始化WOW.js动画
  261. try {
  262. const WOW = window.WOW;
  263. if (WOW) {
  264. new WOW({
  265. boxClass: 'wow',
  266. animateClass: 'animate__animated',
  267. offset: 100,
  268. mobile: true,
  269. live: true
  270. }).init();
  271. }
  272. } catch (error) {
  273. console.error('Failed to initialize WOW.js:', error);
  274. }
  275. // 获取核心技术数据
  276. fetchTechnologies();
  277. // 获取应用列表
  278. fetchAppList();
  279. // 获取创新技术数据
  280. fetchInnovation();
  281. });
  282. </script>
  283. <template>
  284. <div class="bg-background min-h-screen">
  285. <!-- Hero Section -->
  286. <section class="relative py-16 md:py-24 px-4 md:px-12 lg:px-24 bg-background-dark overflow-hidden">
  287. <div class="container mx-auto relative z-10">
  288. <div class="max-w-4xl mx-auto text-center">
  289. <!-- 移动端优化的标题 -->
  290. <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">
  291. {{ t('technology.hero.title') }}
  292. </h1>
  293. <!-- 移动端优化的副标题 -->
  294. <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">
  295. {{ t('technology.hero.description') }}
  296. </p>
  297. <!-- 移动端优化的按钮组 -->
  298. <div class="flex flex-col sm:flex-row justify-center gap-3 sm:gap-4 px-4 sm:px-0">
  299. <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">
  300. <Icon icon="carbon:arrow-down" />
  301. {{ t('technology.buttons.learn_architecture') }}
  302. </a>
  303. <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">
  304. <Icon icon="carbon:launch" />
  305. {{ t('technology.buttons.core_innovation') }}
  306. </a>
  307. </div>
  308. </div>
  309. </div>
  310. <!-- 优化的背景装饰 -->
  311. <div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-20">
  312. <!-- 移动端优化的装饰球 -->
  313. <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>
  314. <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>
  315. <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>
  316. <!-- 移动端新增的小装饰点 -->
  317. <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>
  318. <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>
  319. </div>
  320. <!-- 移动端新增的网格背景 -->
  321. <div class="absolute inset-0 opacity-5">
  322. <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>
  323. </div>
  324. </section>
  325. <!-- 技术架构模块 - 4列布局 带底图 (优化移动端显示) -->
  326. <section id="architecture" class="bg-background-light">
  327. <div class="w-full bg-background-dark">
  328. <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">
  329. {{ t('technology.architecture.title') }}
  330. </h2>
  331. <!-- 移动端自然流动展示 -->
  332. <div class="md:hidden architecture-gallery">
  333. <div
  334. v-for="(arch, index) in structural"
  335. :key="index"
  336. class="architecture-section h-[80vh] relative overflow-hidden bg-cover bg-center flex items-center"
  337. :style="{backgroundImage: `url(${arch.image})`}"
  338. >
  339. <!-- 背景遮罩 -->
  340. <div class="absolute inset-0 bg-black/40"></div>
  341. <!-- 内容区域 -->
  342. <div class="relative z-10 px-8 py-12 text-left max-w-md">
  343. <h3 class="text-3xl font-bold text-white mb-6">{{ t(`technology.architecture.layers.layer${index + 1}.title`) }}</h3>
  344. <div class="text-white/90 text-lg leading-relaxed mb-8" v-html="t(`technology.architecture.layers.layer${index + 1}.description`)"></div>
  345. <!-- 特性列表 -->
  346. <div v-if="arch.features" class="space-y-3 mb-8">
  347. <div v-for="(feature, idx) in arch.features" :key="idx" class="flex items-center text-white/80">
  348. <div class="w-2 h-2 bg-white rounded-full mr-3"></div>
  349. <span>{{ feature }}</span>
  350. </div>
  351. </div>
  352. <!-- 按钮 -->
  353. <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">
  354. {{ t('common.buttons.learn_more') }}
  355. <Icon icon="carbon:arrow-right" />
  356. </button>
  357. </div>
  358. <!-- 装饰元素 -->
  359. <div class="absolute inset-0 pointer-events-none">
  360. <!-- 随机位置的装饰圆圈 -->
  361. <div
  362. v-for="i in 3"
  363. :key="i"
  364. class="absolute w-20 h-20 rounded-full border border-white/20"
  365. :class="`animate-float${i % 2 === 0 ? '-reverse' : ''}`"
  366. :style="{
  367. top: `${20 + (i * 25)}%`,
  368. right: `${10 + (i * 15)}%`,
  369. animationDelay: `${i * 2}s`
  370. }"
  371. ></div>
  372. <!-- 渐变装饰 -->
  373. <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>
  374. <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>
  375. </div>
  376. <!-- 序号装饰 -->
  377. <div class="absolute bottom-8 right-8">
  378. <span class="text-6xl font-bold text-white/10">0{{ index + 1 }}</span>
  379. </div>
  380. <!-- 滚动提示 -->
  381. <div v-if="index < structural.length - 1" class="absolute bottom-8 left-1/2 transform -translate-x-1/2 text-white/60 animate-bounce">
  382. <Icon icon="carbon:arrow-down" class="h-6 w-6" />
  383. </div>
  384. </div>
  385. </div>
  386. <!-- 桌面端网格布局 -->
  387. <div class="hidden md:flex flex-wrap justify-between w-full">
  388. <!-- 动态生成技术架构卡片 (桌面端) -->
  389. <div
  390. v-for="(arch, index) in structural"
  391. :key="index"
  392. 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"
  393. :style="{backgroundImage: `url(${arch.image})`}"
  394. :class="[`delay-${index*100}`]"
  395. >
  396. <!-- 内容 -->
  397. <div class="flex flex-col items-center text-center">
  398. <h4 class="text-white text-xl font-medium mb-6">{{ t(`technology.architecture.layers.layer${index + 1}.title`) }}</h4>
  399. <p class="text-white text-sm font-medium mb-6 px-14" v-html="t(`technology.architecture.layers.layer${index + 1}.description`)"></p>
  400. <!-- 按钮 -->
  401. <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 %">
  402. {{ t('common.buttons.learn_more') }}
  403. <Icon icon="carbon:arrow-right" />
  404. </button>
  405. </div>
  406. </div>
  407. </div>
  408. </div>
  409. </section>
  410. <!-- 核心技术模块 - 优化移动端显示 -->
  411. <section id="innovation" class="relative">
  412. <!-- 移动端垂直排列布局 -->
  413. <div class="md:hidden bg-background-dark py-12 px-4">
  414. <h2 class="text-3xl font-bold text-white mb-8 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
  415. {{ t('technology.innovation.title') }}
  416. </h2>
  417. <!-- 移动端垂直滚动列表 -->
  418. <div class="space-y-6">
  419. <div
  420. v-for="(tech, index) in technologies"
  421. :key="tech.id"
  422. class="bg-background rounded-xl overflow-hidden shadow-lg wow animate__animated animate__fadeInUp"
  423. :class="[`animate__delay-${index}s`]"
  424. >
  425. <!-- 图片部分 -->
  426. <div class="h-48 relative">
  427. <img :src="tech.image" :alt="tech.title" class="w-full h-full object-cover" />
  428. <div
  429. class="absolute inset-0"
  430. :class="{
  431. 'bg-gradient-to-b from-transparent to-indigo-900/90': tech.color === 'primary',
  432. 'bg-gradient-to-b from-transparent to-emerald-900/90': tech.color === 'secondary',
  433. 'bg-gradient-to-b from-transparent to-amber-900/90': tech.color === 'accent',
  434. 'bg-gradient-to-b from-transparent to-blue-900/90': tech.color === 'primary' && index === 3
  435. }"
  436. ></div>
  437. <!-- 图标 -->
  438. <div class="absolute bottom-4 left-4 flex items-center">
  439. <div class="w-12 h-12 rounded-full bg-white/20 backdrop-blur-sm flex items-center justify-center mr-3">
  440. <Icon :icon="tech.icon" class="h-6 w-6" :class="`text-${tech.color}`" />
  441. </div>
  442. <h3 class="text-2xl font-bold text-white">{{ tech.title }}</h3>
  443. </div>
  444. </div>
  445. <!-- 内容部分 -->
  446. <div class="p-6">
  447. <div class="text-text-secondary text-sm leading-relaxed mb-6" v-html="tech.description"></div>
  448. <!-- 按钮 -->
  449. <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">
  450. {{ t('common.buttons.learn_more') }}
  451. <Icon icon="carbon:arrow-right" />
  452. </button>
  453. </div>
  454. </div>
  455. </div>
  456. </div>
  457. <!-- 桌面端全屏垂直布局 -->
  458. <div class="hidden md:block">
  459. <div
  460. v-for="(tech, index) in technologies"
  461. :key="tech.id"
  462. class="relative w-full h-screen flex items-center justify-center overflow-hidden wow animate__animated animate__fadeInUp"
  463. :class="[`delay-${index*100}`]"
  464. >
  465. <!-- 背景图片 -->
  466. <div class="absolute inset-0 w-full h-full">
  467. <img :src="tech.image" :alt="tech.title" class="w-full h-full object-cover" />
  468. <div
  469. class="absolute inset-0"
  470. ></div>
  471. </div>
  472. <!-- 内容 - 左右交替布局 -->
  473. <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">
  474. <!-- 左侧内容 (偶数索引) 右侧内容 (奇数索引) -->
  475. <div
  476. class="md:w-1/2 mb-8 md:mb-0"
  477. :class="{ 'order-1': index % 2 === 0, 'order-2': index % 2 === 1 }"
  478. >
  479. <div class="flex items-center mb-6">
  480. <div class="w-16 h-16 rounded-full bg-white/20 backdrop-blur-sm flex items-center justify-center mr-4">
  481. <Icon :icon="tech.icon" class="h-8 w-8" :class="`text-${tech.color}`" />
  482. </div>
  483. <h3 class="text-3xl md:text-4xl lg:text-5xl font-bold text-white">{{ tech.title }}</h3>
  484. </div>
  485. <div class="text-white/90 text-lg md:text-xl leading-relaxed mb-6" v-html="tech.description">
  486. </div>
  487. <!-- 按钮 -->
  488. <div>
  489. <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">
  490. {{ t('common.buttons.learn_more') }}
  491. <Icon icon="carbon:arrow-right" />
  492. </button>
  493. </div>
  494. </div>
  495. <!-- 右侧装饰元素 (偶数索引) 左侧装饰元素 (奇数索引) -->
  496. <div
  497. class="md:w-1/2 md:px-12 flex justify-center"
  498. :class="{
  499. 'order-2 md:justify-end': index % 2 === 0,
  500. 'order-1 md:justify-start': index % 2 === 1
  501. }"
  502. >
  503. <div
  504. 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"
  505. :class="{
  506. 'bg-indigo-900/20': tech.color === 'primary',
  507. 'bg-emerald-900/20': tech.color === 'secondary',
  508. 'bg-amber-900/20': tech.color === 'accent',
  509. 'bg-blue-900/20': tech.color === 'primary' && index === 3
  510. }"
  511. >
  512. <!-- 内圈 -->
  513. <div class="w-32 h-32 md:w-40 md:h-40 rounded-full border border-white/40 absolute animate-spin-slow"></div>
  514. <!-- 技术图标 -->
  515. <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">
  516. <Icon :icon="tech.icon" class="h-10 w-10 md:h-12 md:w-12" :class="`text-${tech.color}`" />
  517. </div>
  518. <!-- 装饰点 -->
  519. <div class="absolute top-1/4 right-1/4 w-3 h-3 rounded-full bg-white"></div>
  520. <div class="absolute bottom-1/4 left-1/4 w-3 h-3 rounded-full bg-white"></div>
  521. </div>
  522. </div>
  523. </div>
  524. <!-- 序号装饰 -->
  525. <div
  526. class="absolute bottom-8"
  527. :class="{ 'right-12': index % 2 === 0, 'left-12': index % 2 === 1 }"
  528. >
  529. <span class="text-9xl font-bold text-white opacity-10">0{{ index + 1 }}</span>
  530. </div>
  531. <!-- 滚动提示 -->
  532. <div class="absolute bottom-8 left-1/2 transform -translate-x-1/2 text-white/60 animate-bounce">
  533. <Icon icon="carbon:arrow-down" class="h-6 w-6" />
  534. </div>
  535. </div>
  536. </div>
  537. </section>
  538. <!-- 应用程序模块 - Swiper轮播 (重新实现) -->
  539. <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')})` }">
  540. <div class="container mx-auto relative z-10">
  541. <h2 class="text-3xl md:text-4xl font-bold text-text mb-12 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
  542. {{ t('technology.integration.title') }}
  543. </h2>
  544. <div v-if="loading" class="flex justify-center py-20">
  545. <div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary"></div>
  546. </div>
  547. <div v-else class="relative overflow-hidden rounded-2xl shadow-lg">
  548. <!-- 重新实现的Swiper轮播 (单图模式) -->
  549. <Swiper
  550. v-bind="swiperOptions"
  551. class="mySwiper"
  552. >
  553. <SwiperSlide v-for="app in appList" :key="app.id" class="flex justify-center items-center">
  554. <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})` }">
  555. <div class="absolute inset-0 bg-gradient-to-b from-black/30 to-black/80 z-[1]"></div>
  556. <div class="w-[60px] h-[60px] rounded-full bg-white/20 flex justify-center items-center mb-5 relative z-[2]">
  557. <img :src="app.image" alt="" />
  558. </div>
  559. <div class="flex-1 flex flex-col relative z-[2]">
  560. <h3 class="text-2xl font-bold text-white mb-2.5">{{ app.name }}</h3>
  561. <p class="text-base text-white/80 mb-5 flex-1" v-html="app.description"></p>
  562. <a
  563. :href="app.link"
  564. target="_blank"
  565. 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"
  566. >
  567. {{ t('common.buttons.try_now') }}
  568. <Icon icon="carbon:launch" />
  569. </a>
  570. </div>
  571. </div>
  572. </SwiperSlide>
  573. <!-- 自定义导航按钮 -->
  574. <div class="swiper-button-prev"></div>
  575. <div class="swiper-button-next"></div>
  576. <!-- 自定义分页器 -->
  577. <div class="swiper-pagination"></div>
  578. </Swiper>
  579. </div>
  580. </div>
  581. <!-- 背景装饰 -->
  582. <div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-5 pointer-events-none">
  583. <div class="absolute top-1/4 left-1/4 w-64 h-64 rounded-full border border-primary"></div>
  584. <div class="absolute bottom-1/4 right-1/4 w-96 h-96 rounded-full border border-secondary"></div>
  585. <div class="absolute top-3/4 left-3/4 w-48 h-48 rounded-full border border-accent"></div>
  586. </div>
  587. </section>
  588. <!-- 保留原有模块 -->
  589. <!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background">
  590. <ArchitectureModule />
  591. </div> -->
  592. <!-- 保留原有模块 -->
  593. <!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background-light">
  594. <InnovationModule />
  595. </div> -->
  596. <!-- 保留原有模块 -->
  597. <!-- <div class="py-16 px-6 md:px-12 lg:px-24">
  598. <EcosystemIntegrationModule />
  599. </div> -->
  600. </div>
  601. </template>
  602. <style scoped>
  603. @reference "tailwindcss";
  604. /* 自定义动画 - 只保留无法用Tailwind实现的部分 */
  605. @keyframes spin-slow {
  606. from {
  607. transform: rotate(0deg);
  608. }
  609. to {
  610. transform: rotate(360deg);
  611. }
  612. }
  613. .animate-spin-slow {
  614. animation: spin-slow 20s linear infinite;
  615. }
  616. /* 隐藏滚动条但保留功能 */
  617. .hide-scrollbar {
  618. -ms-overflow-style: none; /* IE and Edge */
  619. scrollbar-width: none; /* Firefox */
  620. }
  621. .hide-scrollbar::-webkit-scrollbar {
  622. display: none; /* Chrome, Safari, Opera */
  623. }
  624. /* Swiper相关样式 - 这部分需要保留,因为Swiper组件需要特定样式 */
  625. :deep(.tech-swiper .swiper-pagination) {
  626. @apply bottom-0;
  627. }
  628. :deep(.tech-swiper .swiper-pagination-bullet) {
  629. @apply w-2 h-2 bg-white/50 opacity-100 transition-all duration-300;
  630. }
  631. :deep(.tech-swiper .swiper-pagination-bullet-active) {
  632. @apply bg-white scale-110;
  633. }
  634. :deep(.mySwiper) {
  635. @apply w-full pt-5 pb-10;
  636. }
  637. :deep(.swiper-slide) {
  638. @apply bg-center bg-cover h-[400px];
  639. }
  640. :deep(.swiper-button-next),
  641. :deep(.swiper-button-prev) {
  642. @apply text-white w-10 h-10 rounded-full bg-black/50 transition-colors duration-300;
  643. }
  644. :deep(.swiper-button-next:hover),
  645. :deep(.swiper-button-prev:hover) {
  646. @apply bg-black/70;
  647. }
  648. :deep(.swiper-button-next:after),
  649. :deep(.swiper-button-prev:after) {
  650. @apply text-lg;
  651. }
  652. :deep(.swiper-pagination-bullet) {
  653. @apply w-2.5 h-2.5 bg-white/50 opacity-100 transition-all duration-300;
  654. }
  655. :deep(.swiper-pagination-bullet-active) {
  656. @apply bg-white scale-110;
  657. }
  658. :deep(.swiper-pagination) {
  659. @apply bottom-2.5;
  660. }
  661. /* 移动端隐藏导航按钮 */
  662. @media (max-width: 640px) {
  663. :deep(.swiper-button-next),
  664. :deep(.swiper-button-prev) {
  665. @apply hidden;
  666. }
  667. }
  668. </style>