国外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.

656 lines
23 KiB

1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week 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. const { getConfigImage } = useConfig();
  12. import { queryTechnologyList } from '@/api/modules/technology';
  13. import { queryAppList } from '@/api/modules/ecosystem';
  14. import { querySummaryList } from '@/api/modules/config';
  15. import { useSummary } from '@/utils/config';
  16. const { getSummaryDescription } = useSummary();
  17. // 返回的是富文本 还需要分段
  18. const tecDesList = computed(() => {
  19. return getSummaryDescription('config_structural_of_technology').split('\n');
  20. });
  21. const { t } = useI18n();
  22. // 轮播控制
  23. const currentAppIndex = ref(0);
  24. const totalApps = 8; // 假设有8个应用
  25. // 显示下一个应用
  26. const showNextApp = () => {
  27. currentAppIndex.value = (currentAppIndex.value + 1) % totalApps;
  28. };
  29. // 显示上一个应用
  30. const showPrevApp = () => {
  31. currentAppIndex.value = (currentAppIndex.value - 1 + totalApps) % totalApps;
  32. };
  33. // 技术架构数据
  34. const architectures = [
  35. {
  36. title: '聚合层',
  37. description: '负责汇总并优化来自各个区块链的交易请求,提高系统整体处理效率。',
  38. icon: 'carbon:data-1',
  39. color: 'primary',
  40. image: '/LOGO.png' // 这里替换为实际图片路径
  41. },
  42. {
  43. title: '跨链层',
  44. description: '实现不同区块链之间资产和信息的互通互联,支持多链生态系统整合。',
  45. icon: 'carbon:connect',
  46. color: 'secondary',
  47. image: '/LOGO.png' // 这里替换为实际图片路径
  48. },
  49. {
  50. title: '路由层',
  51. description: '提供智能路径规划和优化,确定交易的最佳执行路径,降低成本并提高效率。',
  52. icon: 'carbon:path-finder',
  53. color: 'accent',
  54. image: '/LOGO.png' // 这里替换为实际图片路径
  55. },
  56. {
  57. title: '应用层',
  58. description: '提供各类去中心化应用接口和服务,支持第三方开发者基于平台构建创新应用。',
  59. icon: 'carbon:application',
  60. color: 'primary',
  61. image: '/LOGO.png' // 这里替换为实际图片路径
  62. }
  63. ];
  64. // 从API获取核心技术数据
  65. const technologies = ref([]);
  66. // 获取核心技术列表
  67. const fetchTechnologies = async () => {
  68. try {
  69. const result = await queryTechnologyList({
  70. pageSize: 10,
  71. pageNo: 1
  72. });
  73. if (result && result.length > 0) {
  74. // 为每个技术项添加颜色和图标属性
  75. technologies.value = result.map((item, index) => {
  76. const colors = ['primary', 'secondary', 'accent', 'primary'];
  77. const icons = ['carbon:security', 'carbon:growth', 'carbon:currency', 'carbon:bridge'];
  78. return {
  79. ...item,
  80. color: colors[index % colors.length],
  81. icon: icons[index % icons.length]
  82. };
  83. });
  84. } else {
  85. // 使用默认数据
  86. technologies.value = defaultTechnologies;
  87. }
  88. } catch (error) {
  89. console.error('获取核心技术列表失败:', error);
  90. technologies.value = defaultTechnologies;
  91. }
  92. };
  93. // 默认核心技术数据(当API数据不可用时使用)
  94. const defaultTechnologies = [
  95. {
  96. id: '1',
  97. title: '技术壁垒',
  98. description: 'MOSE采用创新的多层零知识证明协议,确保交易隐私性的同时保持可验证性和安全性。该技术已申请多项国际专利,形成独特的技术壁垒。',
  99. icon: 'carbon:security',
  100. color: 'primary',
  101. image: '/LOGO.png' // 这里替换为实际图片路径
  102. },
  103. {
  104. id: '2',
  105. title: '生态优势',
  106. description: '基于创新的跨链技术,MOSE能够无缝连接多种主流区块链,使用户可以在不同链上自由转移和交易资产,同时保持完全隐私。',
  107. icon: 'carbon:growth',
  108. color: 'secondary',
  109. image: '/LOGO.png' // 这里替换为实际图片路径
  110. },
  111. {
  112. id: '3',
  113. title: '混币器',
  114. description: 'MOSE独创的"混币器"技术,将用户闲置的资产通过智能合约自动参与DeFi流动性挖矿,为用户创造被动收益,同时增强整个生态系统的流动性。',
  115. icon: 'carbon:currency',
  116. color: 'accent',
  117. image: '/LOGO.png' // 这里替换为实际图片路径
  118. },
  119. {
  120. id: '4',
  121. title: '跨链桥',
  122. description: 'MOSE跨链桥采用创新的多重签名和状态验证机制,实现资产在不同链间的安全高效转移,并保持交易隐私,解决了传统跨链桥容易成为黑客攻击目标的问题。',
  123. icon: 'carbon:bridge',
  124. color: 'primary',
  125. image: '/LOGO.png' // 这里替换为实际图片路径
  126. }
  127. ];
  128. // 应用数据
  129. const apps = reactive([
  130. {
  131. id: 1,
  132. name: 'MOSE Wallet',
  133. description: '多链资产管理钱包,支持所有主流区块链,内置隐私保护功能。',
  134. image: '/LOGO.png',
  135. color: 'from-blue-600 to-indigo-900',
  136. icon: 'carbon:wallet'
  137. },
  138. {
  139. id: 2,
  140. name: 'MOSE Exchange',
  141. description: '去中心化交易所,支持跨链交易与隐私交易,流动性共享。',
  142. image: '/LOGO.png',
  143. color: 'from-purple-600 to-indigo-900',
  144. icon: 'carbon:chart-line'
  145. },
  146. {
  147. id: 3,
  148. name: 'MOSE Bridge',
  149. description: '安全高效的跨链桥,支持资产在不同区块链之间的无缝转移。',
  150. image: '/LOGO.png',
  151. color: 'from-green-600 to-teal-900',
  152. icon: 'carbon:bridge'
  153. },
  154. {
  155. id: 4,
  156. name: 'MOSE Pay',
  157. description: '隐私支付解决方案,为商家和用户提供安全、快速的支付服务。',
  158. image: '/LOGO.png',
  159. color: 'from-orange-600 to-red-900',
  160. icon: 'carbon:purchase'
  161. },
  162. {
  163. id: 5,
  164. name: 'MOSE DAO',
  165. description: '去中心化自治组织工具,支持社区治理和决策。',
  166. image: '/LOGO.png',
  167. color: 'from-amber-600 to-orange-900',
  168. icon: 'carbon:group'
  169. },
  170. {
  171. id: 6,
  172. name: 'MOSE NFT',
  173. description: '隐私NFT市场,支持创作者版权保护和数字资产交易。',
  174. image: '/LOGO.png',
  175. color: 'from-pink-600 to-rose-900',
  176. icon: 'carbon:image'
  177. },
  178. {
  179. id: 7,
  180. name: 'MOSE DeFi',
  181. description: '去中心化金融套件,包括借贷、质押、流动性挖矿等功能。',
  182. image: '/LOGO.png',
  183. color: 'from-cyan-600 to-blue-900',
  184. icon: 'carbon:money'
  185. },
  186. {
  187. id: 8,
  188. name: 'MOSE ID',
  189. description: '去中心化身份认证系统,保护用户隐私的同时满足合规要求。',
  190. image: '/LOGO.png',
  191. color: 'from-emerald-600 to-green-900',
  192. icon: 'carbon:user'
  193. }
  194. ]);
  195. // 从API获取应用列表
  196. const appList = ref([]);
  197. // 获取应用列表
  198. const fetchAppList = async () => {
  199. try {
  200. const result = await queryAppList({
  201. pageSize: 10,
  202. pageNo: 1
  203. });
  204. if (result && result.length > 0) {
  205. appList.value = result;
  206. } else {
  207. appList.value = apps;
  208. }
  209. } catch (error) {
  210. console.error('获取应用列表失败:', error);
  211. appList.value = apps;
  212. }
  213. };
  214. // 轮播控制
  215. const currentSlide = ref(0);
  216. const autoplayInterval = ref(null);
  217. // 切换到下一张
  218. const nextSlide = () => {
  219. if (appList.value.length > 0) {
  220. currentSlide.value = (currentSlide.value + 1) % appList.value.length;
  221. }
  222. };
  223. // 切换到上一张
  224. const prevSlide = () => {
  225. if (appList.value.length > 0) {
  226. currentSlide.value = (currentSlide.value - 1 + appList.value.length) % appList.value.length;
  227. }
  228. };
  229. // 切换到指定幻灯片
  230. const goToSlide = (index: number) => {
  231. currentSlide.value = index;
  232. };
  233. // 开始自动播放
  234. const startAutoplay = () => {
  235. autoplayInterval.value = setInterval(() => {
  236. nextSlide();
  237. }, 5000);
  238. };
  239. // 停止自动播放
  240. const stopAutoplay = () => {
  241. if (autoplayInterval.value) {
  242. clearInterval(autoplayInterval.value);
  243. autoplayInterval.value = null;
  244. }
  245. };
  246. // Swiper实例
  247. let swiper = null;
  248. // 初始化
  249. onMounted(() => {
  250. // 初始化WOW.js动画
  251. try {
  252. const WOW = window.WOW;
  253. if (WOW) {
  254. new WOW({
  255. boxClass: 'wow',
  256. animateClass: 'animate__animated',
  257. offset: 100,
  258. mobile: true,
  259. live: true
  260. }).init();
  261. }
  262. } catch (error) {
  263. console.error('Failed to initialize WOW.js:', error);
  264. }
  265. // 获取核心技术数据
  266. fetchTechnologies();
  267. // 获取应用列表
  268. fetchAppList();
  269. // 开始自动播放
  270. startAutoplay();
  271. });
  272. // 初始化Swiper
  273. const initSwiper = () => {
  274. // 动态加载Swiper
  275. import('swiper/bundle').then(({ Swiper }) => {
  276. import('swiper/css/bundle').then(() => {
  277. // 等待DOM更新
  278. setTimeout(() => {
  279. swiper = new Swiper('.swiper-container', {
  280. effect: 'coverflow',
  281. grabCursor: true,
  282. centeredSlides: true,
  283. slidesPerView: 'auto',
  284. loop: true,
  285. speed: 800,
  286. autoplay: {
  287. delay: 3000,
  288. disableOnInteraction: false,
  289. },
  290. coverflowEffect: {
  291. rotate: 0,
  292. stretch: 80,
  293. depth: 200,
  294. modifier: 1,
  295. slideShadows: true,
  296. },
  297. pagination: {
  298. el: '.swiper-pagination',
  299. clickable: true,
  300. dynamicBullets: true,
  301. },
  302. navigation: {
  303. nextEl: '.swiper-button-next',
  304. prevEl: '.swiper-button-prev',
  305. },
  306. });
  307. }, 500);
  308. });
  309. }).catch(err => {
  310. console.error('Failed to load Swiper:', err);
  311. });
  312. };
  313. </script>
  314. <template>
  315. <div class="bg-background min-h-screen">
  316. <!-- Hero Section -->
  317. <section class="relative py-24 px-6 md:px-12 lg:px-24 bg-background-dark overflow-hidden">
  318. <div class="container mx-auto relative z-10">
  319. <div class="max-w-3xl mx-auto text-center">
  320. <h1 class="text-4xl md:text-5xl lg:text-6xl font-bold text-text mb-6 wow animate__animated animate__fadeInDown animate__duration-fast">
  321. 领先的区块链隐私技术
  322. </h1>
  323. <p class="text-lg md:text-xl text-text-secondary mb-8 wow animate__animated animate__fadeIn animate__delay-xs animate__duration-fast">
  324. MOSE通过创新的密码学和跨链技术为区块链世界构建隐私保护的基础设施
  325. </p>
  326. <div class="flex justify-center gap-4">
  327. <a href="#architecture" class="inline-flex items-center gap-2 bg-primary hover:bg-primary-dark text-white font-medium py-3 px-6 rounded-lg transition-colors duration-200">
  328. 了解技术架构
  329. <Icon icon="carbon:arrow-down" />
  330. </a>
  331. <a href="#innovation" class="inline-flex items-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">
  332. 核心创新
  333. <Icon icon="carbon:launch" />
  334. </a>
  335. </div>
  336. </div>
  337. </div>
  338. <!-- Background Decoration -->
  339. <div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-10">
  340. <div class="absolute -top-24 -left-24 w-64 h-64 rounded-full bg-primary-light blur-3xl wow animate__animated animate__pulse animate__infinite"></div>
  341. <div class="absolute top-1/2 right-0 w-80 h-80 rounded-full bg-secondary blur-3xl wow animate__animated animate__pulse animate__infinite animate__delay-sm"></div>
  342. <div class="absolute -bottom-24 left-1/3 w-72 h-72 rounded-full bg-accent blur-3xl wow animate__animated animate__pulse animate__infinite animate__delay-md"></div>
  343. </div>
  344. </section>
  345. <!-- 技术架构模块 - 4列布局 带底图 -->
  346. <section id="architecture" class="py-54 px-6 md:px-12 lg:px-32 bg-background-light" :style="{ backgroundImage: `url(${getConfigImage('tec_summary_bg')})` }">
  347. <div class=" w-full">
  348. <h2 class="text-3xl md:text-4xl font-bold text-text mb-16 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
  349. 技术架构
  350. </h2>
  351. <div class="flex flex-wrap justify-between w-full">
  352. <!-- 动态生成技术架构卡片 -->
  353. <div
  354. v-for="(arch, index) in tecDesList"
  355. :key="index"
  356. class="w-full sm:w-1/2 lg:w-1/4 px-4 mb-8 wow animate__animated animate__fadeInUp"
  357. :class="[`animate__delay-${index}00ms`]"
  358. >
  359. <!-- 内容 -->
  360. <div class="flex flex-col items-center text-center">
  361. <p class="text-white text-xl font-medium mb-6" v-html="arch"></p>
  362. <!-- 按钮 -->
  363. <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">
  364. 了解更多
  365. <Icon icon="carbon:arrow-right" />
  366. </button>
  367. </div>
  368. </div>
  369. </div>
  370. </div>
  371. </section>
  372. <!-- 核心技术模块 - 全屏垂直布局 -->
  373. <section id="innovation" class="relative">
  374. <!-- 核心技术卡片 - 全屏垂直布局 -->
  375. <div
  376. v-for="(tech, index) in technologies"
  377. :key="tech.id"
  378. class="relative w-full h-screen flex items-center justify-center overflow-hidden wow animate__animated animate__fadeInUp"
  379. :class="[`animate__delay-${index}00ms`]"
  380. >
  381. <!-- 背景图片 -->
  382. <div class="absolute inset-0 w-full h-full">
  383. <img :src="tech.image" :alt="tech.title" class="w-full h-full object-cover" />
  384. <div
  385. class="absolute inset-0"
  386. :class="{
  387. 'bg-gradient-to-r from-indigo-900/90 via-indigo-900/50 to-transparent': tech.color === 'primary' && index % 2 === 0,
  388. 'bg-gradient-to-l from-indigo-900/90 via-indigo-900/50 to-transparent': tech.color === 'primary' && index % 2 === 1,
  389. 'bg-gradient-to-r from-emerald-900/90 via-emerald-900/50 to-transparent': tech.color === 'secondary' && index % 2 === 0,
  390. 'bg-gradient-to-l from-emerald-900/90 via-emerald-900/50 to-transparent': tech.color === 'secondary' && index % 2 === 1,
  391. 'bg-gradient-to-r from-amber-900/90 via-amber-900/50 to-transparent': tech.color === 'accent' && index % 2 === 0,
  392. 'bg-gradient-to-l from-amber-900/90 via-amber-900/50 to-transparent': tech.color === 'accent' && index % 2 === 1,
  393. 'bg-gradient-to-r from-blue-900/90 via-blue-900/50 to-transparent': tech.color === 'primary' && index === 3 && index % 2 === 0,
  394. 'bg-gradient-to-l from-blue-900/90 via-blue-900/50 to-transparent': tech.color === 'primary' && index === 3 && index % 2 === 1
  395. }"
  396. ></div>
  397. </div>
  398. <!-- 内容 - 左右交替布局 -->
  399. <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">
  400. <!-- 左侧内容 (偶数索引) 右侧内容 (奇数索引) -->
  401. <div
  402. class="md:w-1/2 mb-8 md:mb-0"
  403. :class="{ 'order-1': index % 2 === 0, 'order-2': index % 2 === 1 }"
  404. >
  405. <div class="flex items-center mb-6">
  406. <div class="w-16 h-16 rounded-full bg-white/20 backdrop-blur-sm flex items-center justify-center mr-4">
  407. <Icon :icon="tech.icon" class="h-8 w-8" :class="`text-${tech.color}`" />
  408. </div>
  409. <h3 class="text-3xl md:text-4xl lg:text-5xl font-bold text-white">{{ tech.title }}</h3>
  410. </div>
  411. <div class="text-white/90 text-lg md:text-xl leading-relaxed mb-6" v-html="tech.description">
  412. </div>
  413. <!-- 按钮 -->
  414. <div>
  415. <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">
  416. 了解更多
  417. <Icon icon="carbon:arrow-right" />
  418. </button>
  419. </div>
  420. </div>
  421. <!-- 右侧装饰元素 (偶数索引) 左侧装饰元素 (奇数索引) -->
  422. <div
  423. class="md:w-1/2 md:px-12 flex justify-center"
  424. :class="{
  425. 'order-2 md:justify-end': index % 2 === 0,
  426. 'order-1 md:justify-start': index % 2 === 1
  427. }"
  428. >
  429. <div
  430. 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"
  431. :class="{
  432. 'bg-indigo-900/20': tech.color === 'primary',
  433. 'bg-emerald-900/20': tech.color === 'secondary',
  434. 'bg-amber-900/20': tech.color === 'accent',
  435. 'bg-blue-900/20': tech.color === 'primary' && index === 3
  436. }"
  437. >
  438. <!-- 内圈 -->
  439. <div class="w-32 h-32 md:w-40 md:h-40 rounded-full border border-white/40 absolute animate-spin-slow"></div>
  440. <!-- 技术图标 -->
  441. <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">
  442. <Icon :icon="tech.icon" class="h-10 w-10 md:h-12 md:w-12" :class="`text-${tech.color}`" />
  443. </div>
  444. <!-- 装饰点 -->
  445. <div class="absolute top-1/4 right-1/4 w-3 h-3 rounded-full bg-white"></div>
  446. <div class="absolute bottom-1/4 left-1/4 w-3 h-3 rounded-full bg-white"></div>
  447. </div>
  448. </div>
  449. </div>
  450. <!-- 序号装饰 -->
  451. <div
  452. class="absolute bottom-8"
  453. :class="{ 'right-12': index % 2 === 0, 'left-12': index % 2 === 1 }"
  454. >
  455. <span class="text-9xl font-bold text-white opacity-10">0{{ index + 1 }}</span>
  456. </div>
  457. <!-- 滚动提示 -->
  458. <div class="absolute bottom-8 left-1/2 transform -translate-x-1/2 text-white/60 animate-bounce">
  459. <Icon icon="carbon:arrow-down" class="h-6 w-6" />
  460. </div>
  461. </div>
  462. </section>
  463. <!-- 应用程序模块 - Swiper轮播 -->
  464. <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')})` }">
  465. <div class="container mx-auto relative z-10">
  466. <h2 class="text-3xl md:text-4xl font-bold text-text mb-12 text-center wow animate__animated animate__fadeInUp animate__duration-fast">
  467. 生态应用
  468. </h2>
  469. <div class="relative wow animate__animated animate__fadeIn animate__duration-fast">
  470. <!-- 简单轮播 -->
  471. <div class="relative overflow-hidden rounded-2xl shadow-lg h-96">
  472. <div class="relative w-full h-full">
  473. <div
  474. v-for="(app, index) in appList"
  475. :key="app.id"
  476. class="absolute inset-0 transition-opacity duration-500"
  477. :class="{ 'opacity-100': index === currentSlide, 'opacity-0': index !== currentSlide }"
  478. >
  479. <img
  480. :src="app.image"
  481. :alt="app.title"
  482. class="w-full h-full object-cover"
  483. />
  484. <!-- 应用信息覆盖层 -->
  485. <div class="absolute inset-0 bg-gradient-to-t from-black/70 via-transparent to-transparent flex items-end">
  486. <div class="p-8 text-white">
  487. <h3 class="text-2xl font-bold mb-2">{{ app.title }}</h3>
  488. <p class="text-white/90 mb-4">{{ app.description }}</p>
  489. <a
  490. :href="app.link"
  491. target="_blank"
  492. class="inline-flex items-center gap-2 bg-white/20 hover:bg-white/30 backdrop-blur-sm rounded-full text-white text-sm px-4 py-2 transition-all duration-300 border border-white/30"
  493. >
  494. 立即体验
  495. <Icon icon="carbon:launch" />
  496. </a>
  497. </div>
  498. </div>
  499. </div>
  500. </div>
  501. <!-- 导航按钮 -->
  502. <button
  503. @click="prevSlide"
  504. class="absolute left-4 top-1/2 transform -translate-y-1/2 w-10 h-10 rounded-full bg-black bg-opacity-30 hover:bg-opacity-50 text-white flex items-center justify-center transition-all duration-300"
  505. >
  506. <Icon icon="carbon:chevron-left" />
  507. </button>
  508. <button
  509. @click="nextSlide"
  510. class="absolute right-4 top-1/2 transform -translate-y-1/2 w-10 h-10 rounded-full bg-black bg-opacity-30 hover:bg-opacity-50 text-white flex items-center justify-center transition-all duration-300"
  511. >
  512. <Icon icon="carbon:chevron-right" />
  513. </button>
  514. <!-- 分页器 -->
  515. <div class="absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2">
  516. <button
  517. v-for="(app, index) in appList"
  518. :key="index"
  519. @click="goToSlide(index)"
  520. class="w-3 h-3 rounded-full transition-all duration-300"
  521. :class="index === currentSlide ? 'bg-white' : 'bg-white bg-opacity-50'"
  522. ></button>
  523. </div>
  524. </div>
  525. </div>
  526. </div>
  527. <!-- 背景装饰 -->
  528. <div class="absolute top-0 left-0 w-full h-full overflow-hidden opacity-5 pointer-events-none">
  529. <div class="absolute top-1/4 left-1/4 w-64 h-64 rounded-full border border-primary"></div>
  530. <div class="absolute bottom-1/4 right-1/4 w-96 h-96 rounded-full border border-secondary"></div>
  531. <div class="absolute top-3/4 left-3/4 w-48 h-48 rounded-full border border-accent"></div>
  532. </div>
  533. </section>
  534. <!-- 保留原有模块 -->
  535. <!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background">
  536. <ArchitectureModule />
  537. </div> -->
  538. <!-- 保留原有模块 -->
  539. <!-- <div class="py-16 px-6 md:px-12 lg:px-24 bg-background-light">
  540. <InnovationModule />
  541. </div> -->
  542. <!-- 保留原有模块 -->
  543. <!-- <div class="py-16 px-6 md:px-12 lg:px-24">
  544. <EcosystemIntegrationModule />
  545. </div> -->
  546. </div>
  547. </template>
  548. <style scoped>
  549. /* 动画延迟类 */
  550. .animate__delay-0ms {
  551. animation-delay: 0ms;
  552. }
  553. .animate__delay-100ms {
  554. animation-delay: 100ms;
  555. }
  556. .animate__delay-200ms {
  557. animation-delay: 200ms;
  558. }
  559. .animate__delay-300ms {
  560. animation-delay: 300ms;
  561. }
  562. /* 慢速旋转 */
  563. @keyframes spin-slow {
  564. from {
  565. transform: rotate(0deg);
  566. }
  567. to {
  568. transform: rotate(360deg);
  569. }
  570. }
  571. .animate-spin-slow {
  572. animation: spin-slow 20s linear infinite;
  573. }
  574. /* Swiper样式覆盖 */
  575. :deep(.swiper-container) {
  576. padding: 30px 0;
  577. overflow: visible;
  578. }
  579. :deep(.swiper-slide) {
  580. width: 350px;
  581. transition: transform 0.3s;
  582. }
  583. :deep(.swiper-slide-active) {
  584. transform: scale(1.05);
  585. z-index: 2;
  586. }
  587. :deep(.swiper-pagination-bullet) {
  588. width: 10px;
  589. height: 10px;
  590. background: rgba(255, 255, 255, 0.5);
  591. opacity: 1;
  592. }
  593. :deep(.swiper-pagination-bullet-active) {
  594. background: var(--color-primary);
  595. transform: scale(1.2);
  596. }
  597. </style>