公司官网
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.

700 lines
21 KiB

7 months ago
7 months ago
4 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
4 months ago
7 months ago
4 months ago
7 months ago
4 months ago
7 months ago
4 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
  1. <script setup>
  2. // 导入视差滚动和动画库
  3. import { onMounted, ref } from 'vue';
  4. import { useRouter } from 'vue-router';
  5. import { initParallax, initAOS } from '../../plugins/animation.js';
  6. import { useConfigStore } from '@/stores/config'
  7. const { configParams } = useConfigStore()
  8. // 导入服务部分组件
  9. import ServiceSection from '../../components/home/ServiceSection.vue';
  10. import CaseSection from '@/components/home/CaseSection.vue';
  11. // 导入CTA组件
  12. import CallToAction from '../../components/CallToAction.vue';
  13. // 导入客户评价组件
  14. import CustomerReviews from '../../components/CustomerReviews.vue';
  15. // 获取路由实例
  16. const router = useRouter();
  17. // 创建服务部分的引用
  18. const serviceSection = ref(null);
  19. import api from '@/api'
  20. const serviceProcess = ref([])
  21. const getServiceProcess = async () => {
  22. const res = await api.getServiceProcess()
  23. serviceProcess.value = res.data
  24. }
  25. // 滚动到服务部分
  26. const scrollToServices = () => {
  27. // 使用服务组件的DOM元素
  28. const element = document.querySelector('.services-section');
  29. if (element) {
  30. element.scrollIntoView({ behavior: 'smooth' });
  31. }
  32. };
  33. // 导航到联系页面
  34. const navigateToContact = () => {
  35. router.push('/contact');
  36. };
  37. onMounted(() => {
  38. // 初始化动画和视差效果
  39. initAOS();
  40. initParallax();
  41. getServiceProcess()
  42. });
  43. </script>
  44. <template>
  45. <div class="home">
  46. <!-- 英雄区域带视差效果 -->
  47. <section class="hero-section parallax-container">
  48. <!-- 添加一个注释确保视差容器不会阻止按钮点击 -->
  49. <div class="parallax-bg"
  50. :style="{ backgroundImage: `url(${configParams.home_banner_bg && configParams.home_banner_bg.split(',')[0]})` }"
  51. data-depth="0.4"></div>
  52. <div class="hero-overlay"></div>
  53. <div class="hero-content hero-content-fixed" data-aos="fade-up" data-aos-duration="1000">
  54. <h1 class="hero-title">数字化转型的<span class="highlight">可靠伙伴</span></h1>
  55. <p class="hero-subtitle" data-aos="fade-up" data-aos-delay="200">{{ configParams.home_banner_subtitle }}</p>
  56. <div class="cta-buttons" data-aos="fade-up" data-aos-delay="400">
  57. <button class="btn primary" @click="scrollToServices">了解更多</button>
  58. <button class="btn secondary" @click="navigateToContact">联系我们</button>
  59. </div>
  60. </div>
  61. </section>
  62. <!-- 我们的服务视差滚动 -->
  63. <!-- <ServiceSection /> -->
  64. <!-- 精选案例展示 -->
  65. <CaseSection />
  66. <!-- 我们的优势视差背景 -->
  67. <section class="advantages-section parallax-container">
  68. <div class="parallax-bg" :style="{ backgroundImage: `url(${configParams.home_advantages_bg})` }" data-depth="0.1"></div>
  69. <div class="overlay-dark"></div>
  70. <div class="container hero-content-fixed">
  71. <div class="section-content">
  72. <div class="section-header" data-aos="fade-up">
  73. <h2 style="color: #fff;">我们的优势</h2>
  74. <p>为什么选择瀚海黎明</p>
  75. </div>
  76. <div class="advantages-grid" data-aos="fade-up" data-aos-delay="100">
  77. <div class="advantage-card" data-aos="fade-right"
  78. v-for="(item, index) in serviceProcess"
  79. :key="item.id"
  80. :data-aos-delay="100 * (index + 1)">
  81. <div class="advantage-number">{{ item.num }}</div>
  82. <h3>{{ item.title }}</h3>
  83. <p>{{ item.info }}</p>
  84. </div>
  85. </div>
  86. <!-- <div class="advantages-grid" data-aos="fade-up" data-aos-delay="100">
  87. <div class="advantage-card" data-aos="fade-right" data-aos-delay="100">
  88. <div class="advantage-number">01</div>
  89. <h3>专业团队</h3>
  90. <p>由经验丰富的开发人员设计师和项目经理组成的精英团队</p>
  91. </div>
  92. <div class="advantage-card" data-aos="fade-right" data-aos-delay="200">
  93. <div class="advantage-number">02</div>
  94. <h3>质量保证</h3>
  95. <p>严格的质量控制流程确保交付高质量的软件产品</p>
  96. </div>
  97. <div class="advantage-card" data-aos="fade-right" data-aos-delay="300">
  98. <div class="advantage-number">03</div>
  99. <h3>按时交付</h3>
  100. <p>高效的项目管理确保项目按时按预算完成</p>
  101. </div>
  102. <div class="advantage-card" data-aos="fade-left" data-aos-delay="400">
  103. <div class="advantage-number">04</div>
  104. <h3>灵活合作模式</h3>
  105. <p>根据客户需求提供灵活的合作方式和定价模式</p>
  106. </div>
  107. <div class="advantage-card" data-aos="fade-left" data-aos-delay="500">
  108. <div class="advantage-number">05</div>
  109. <h3>技术创新</h3>
  110. <p>持续关注最新技术趋势为客户提供创新解决方案</p>
  111. </div>
  112. <div class="advantage-card" data-aos="fade-left" data-aos-delay="600">
  113. <div class="advantage-number">06</div>
  114. <h3>售后支持</h3>
  115. <p>提供全面的售后支持和维护服务确保系统稳定运行</p>
  116. </div>
  117. </div> -->
  118. </div>
  119. </div>
  120. </section>
  121. <!-- 客户评价 -->
  122. <!-- <CustomerReviews /> -->
  123. <!-- 合作流程视差滚动 -->
  124. <section class="process-section" data-aos="fade-up">
  125. <div class="section-header">
  126. <h2>合作流程</h2>
  127. <p>简单高效的项目合作流程</p>
  128. </div>
  129. <div class="process-flow">
  130. <div class="process-step"
  131. data-aos="fade-right"
  132. v-for="(item, index) in serviceProcess"
  133. :key="item.id"
  134. :data-aos-delay="100 * (index + 1)">
  135. <div class="step-number">{{ item.num }}</div>
  136. <div class="step-content">
  137. <h3>{{ item.title }}</h3>
  138. <p>{{ item.info }}</p>
  139. </div>
  140. </div>
  141. <!-- <div class="process-step" data-aos="fade-right" data-aos-delay="100">
  142. <div class="step-number">01</div>
  143. <div class="step-content">
  144. <h3>需求分析</h3>
  145. <p>深入了解您的业务需求和目标确定项目范围和技术方案</p>
  146. </div>
  147. </div>
  148. <div class="process-step" data-aos="fade-right" data-aos-delay="200">
  149. <div class="step-number">02</div>
  150. <div class="step-content">
  151. <h3>方案设计</h3>
  152. <p>制定详细技术方案和项目计划包括功能规格UI设计和技术架构</p>
  153. </div>
  154. </div>
  155. <div class="process-step" data-aos="fade-right" data-aos-delay="300">
  156. <div class="step-number">03</div>
  157. <div class="step-content">
  158. <h3>开发实施</h3>
  159. <p>按照敏捷开发方法迭代开发并定期交付可测试的版本</p>
  160. </div>
  161. </div>
  162. <div class="process-step" data-aos="fade-left" data-aos-delay="400">
  163. <div class="step-number">04</div>
  164. <div class="step-content">
  165. <h3>测试验收</h3>
  166. <p>进行全面的功能测试性能测试和安全测试确保产品质量</p>
  167. </div>
  168. </div>
  169. <div class="process-step" data-aos="fade-left" data-aos-delay="500">
  170. <div class="step-number">05</div>
  171. <div class="step-content">
  172. <h3>交付上线</h3>
  173. <p>系统部署上线提供用户培训和文档确保平稳过渡</p>
  174. </div>
  175. </div>
  176. <div class="process-step" data-aos="fade-left" data-aos-delay="600">
  177. <div class="step-number">06</div>
  178. <div class="step-content">
  179. <h3>持续支持</h3>
  180. <p>提供持续的技术支持和系统维护确保系统稳定运行</p>
  181. </div>
  182. </div> -->
  183. </div>
  184. </section>
  185. <!-- 使用通用的CallToAction组件 -->
  186. <CallToAction
  187. title="准备好开始您的数字化转型了吗?"
  188. description="瀚海黎明为您提供专业的软件开发服务"
  189. primaryButtonText="开始项目咨询"
  190. />
  191. </div>
  192. </template>
  193. <style lang="scss" scoped>
  194. /* 全局样式 */
  195. .section-header {
  196. text-align: center;
  197. margin-bottom: 50px;
  198. h2 {
  199. font-size: 2.5rem;
  200. color: #2c3e50;
  201. margin-bottom: 15px;
  202. }
  203. p {
  204. font-size: 1.2rem;
  205. color: #7f8c8d;
  206. }
  207. }
  208. .btn {
  209. padding: 14px 32px;
  210. border-radius: 30px;
  211. font-weight: 600;
  212. cursor: pointer !important; /* 确保鼠标悬停时显示小手 */
  213. transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
  214. border: none;
  215. margin: 0;
  216. position: relative;
  217. overflow: hidden;
  218. font-size: 1rem;
  219. letter-spacing: 1px;
  220. box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
  221. z-index: 30; /* 确保按钮在最上层 */
  222. pointer-events: auto; /* 确保可以接收鼠标事件 */
  223. &.primary {
  224. background-color: #3498db;
  225. color: white;
  226. &:hover {
  227. background-color: #2980b9;
  228. transform: translateY(-3px);
  229. box-shadow: 0 6px 15px rgba(0, 0, 0, 0.3);
  230. }
  231. &:active {
  232. transform: translateY(-1px);
  233. box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
  234. }
  235. }
  236. &.secondary {
  237. background-color: transparent;
  238. color: white;
  239. border: 2px solid white;
  240. box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
  241. &:hover {
  242. background-color: rgba(255, 255, 255, 0.15);
  243. transform: translateY(-3px);
  244. box-shadow: 0 6px 15px rgba(0, 0, 0, 0.2);
  245. }
  246. &:active {
  247. transform: translateY(-1px);
  248. box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
  249. }
  250. }
  251. }
  252. /* 英雄区域样式 */
  253. .hero-section {
  254. height: 100vh;
  255. position: relative;
  256. overflow: hidden;
  257. display: flex;
  258. align-items: center;
  259. justify-content: center;
  260. color: white;
  261. text-align: center;
  262. }
  263. /* 确保视差容器不会阻止点击事件 */
  264. .parallax-container {
  265. pointer-events: none; /* 默认不接收鼠标事件,让事件穿透到下层元素 */
  266. .hero-content,
  267. .hero-content * {
  268. pointer-events: auto; /* 恢复内容区域的鼠标事件 */
  269. }
  270. }
  271. .parallax-bg {
  272. position: absolute;
  273. top: 0;
  274. left: 0;
  275. width: 100%;
  276. height: 100%;
  277. // background-image: url('https://images.unsplash.com/photo-1451187580459-43490279c0fa?ixlib=rb-1.2.1&auto=format&fit=crop&w=1352&q=80');
  278. background-size: cover;
  279. background-position: center;
  280. z-index: -2;
  281. transform: scale(1.1);
  282. /* 轻微放大背景,增强视差效果 */
  283. transition: transform 0.5s ease;
  284. }
  285. .hero-overlay {
  286. position: absolute;
  287. top: 0;
  288. left: 0;
  289. width: 100%;
  290. height: 100%;
  291. background: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.4));
  292. z-index: -1;
  293. }
  294. .hero-content {
  295. z-index: 1;
  296. padding: 0 20px;
  297. text-align: center;
  298. display: flex;
  299. flex-direction: column;
  300. align-items: center;
  301. justify-content: center;
  302. width: calc(100% - 40px);
  303. /* 使用!important确保transform属性不被AOS动画库覆盖 */
  304. }
  305. /* 添加额外的样式来修复AOS动画结束后的位置问题 */
  306. [data-aos].aos-animate {
  307. transform: none;
  308. }
  309. /* 特定针对hero-content中的元素恢复正确的transform */
  310. .hero-content[data-aos].aos-animate {
  311. transform: translate(-50%, -50%) !important;
  312. }
  313. /* 添加固定定位样式确保hero-content始终居中 */
  314. .hero-content-fixed {
  315. position: absolute !important;
  316. top: 50% !important;
  317. left: 50% !important;
  318. transform: translate(-50%, -50%) !important;
  319. width: calc(100% - 40px) !important;
  320. z-index: 10 !important; /* 提高z-index确保内容在最上层 */
  321. pointer-events: auto !important; /* 确保可以接收鼠标事件 */
  322. }
  323. .hero-title {
  324. font-size: 4rem;
  325. font-weight: 700;
  326. margin-bottom: 20px;
  327. text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
  328. letter-spacing: 1px;
  329. color: #fff;
  330. .highlight {
  331. color: #3498db;
  332. position: relative;
  333. &::after {
  334. content: '';
  335. position: absolute;
  336. bottom: -5px;
  337. left: 0;
  338. width: 100%;
  339. height: 3px;
  340. background-color: #3498db;
  341. }
  342. }
  343. }
  344. .hero-subtitle {
  345. font-size: 1.6rem;
  346. margin-bottom: 40px;
  347. text-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
  348. font-weight: 300;
  349. line-height: 1.5;
  350. }
  351. .cta-buttons {
  352. display: flex;
  353. justify-content: center;
  354. gap: 20px;
  355. position: relative;
  356. z-index: 20; /* 确保按钮在最上层 */
  357. pointer-events: auto; /* 确保可以接收鼠标事件 */
  358. }
  359. /* 优势部分样式 */
  360. .advantages-section {
  361. position: relative;
  362. padding: 100px 20px;
  363. color: white;
  364. overflow: hidden;
  365. text-align: center;
  366. /* 确保文本居中 */
  367. display: flex;
  368. flex-direction: column;
  369. align-items: center;
  370. /* 确保子元素水平居中 */
  371. width: 100%;
  372. /* 确保宽度占满容器 */
  373. box-sizing: border-box;
  374. /* 确保padding不会增加元素总宽度 */
  375. .container {
  376. width: 100%;
  377. max-width: 1200px;
  378. margin: 0 auto;
  379. position: relative;
  380. z-index: 2;
  381. }
  382. .parallax-bg {
  383. // background-image: url('https://images.unsplash.com/photo-1504639725590-34d0984388bd?ixlib=rb-1.2.1&auto=format&fit=crop&w=1500&q=80');
  384. filter: brightness(0.3);
  385. /* 降低亮度以增加对比度 */
  386. }
  387. /* 移动端隐藏优势部分 */
  388. @media (max-width: 768px) {
  389. display: none;
  390. }
  391. }
  392. .overlay-dark {
  393. position: absolute;
  394. top: 0;
  395. left: 0;
  396. width: 100%;
  397. height: 100%;
  398. background: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
  399. z-index: 0;
  400. }
  401. .section-content {
  402. position: relative;
  403. z-index: 2;
  404. /* 提高z-index确保内容在叠加层之上 */
  405. max-width: 1200px;
  406. margin: 0 auto;
  407. width: 100%;
  408. /* 确保宽度占满容器 */
  409. padding: 0 15px;
  410. /* 添加内边距,确保在小屏幕上内容不会贴边 */
  411. display: flex;
  412. flex-direction: column;
  413. align-items: center;
  414. /* 确保子元素水平居中 */
  415. box-sizing: border-box;
  416. /* 确保padding不会增加元素总宽度 */
  417. left: 0;
  418. /* 确保不会有偏移 */
  419. right: 0;
  420. /* 确保不会有偏移 */
  421. margin-left: auto;
  422. margin-right: auto;
  423. text-align: center;
  424. /* 确保文本居中 */
  425. }
  426. .advantages-grid {
  427. display: grid;
  428. gap: 30px;
  429. margin-top: 40px;
  430. justify-content: center;
  431. /* 确保网格居中 */
  432. max-width: 1200px;
  433. margin-left: auto;
  434. margin-right: auto;
  435. width: 100%;
  436. /* 确保宽度占满容器 */
  437. grid-template-columns: repeat(3, 1fr);
  438. /* 固定为3列布局 */
  439. box-sizing: border-box;
  440. /* 确保padding不会增加元素总宽度 */
  441. @media (max-width: 992px) {
  442. grid-template-columns: repeat(2, 1fr);
  443. /* 中等屏幕2列 */
  444. }
  445. @media (max-width: 768px) {
  446. grid-template-columns: 1fr;
  447. /* 小屏幕1列 */
  448. }
  449. }
  450. .advantage-card {
  451. background: rgba(0, 0, 0, 0.5);
  452. /* 更深的背景色以增加对比度 */
  453. backdrop-filter: blur(10px);
  454. border-radius: 8px;
  455. padding: 30px;
  456. transition: transform 0.3s ease;
  457. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  458. /* 添加阴影增强可见性 */
  459. border: 1px solid rgba(255, 255, 255, 0.1);
  460. /* 添加细边框增强可见性 */
  461. &:hover {
  462. transform: translateY(-10px);
  463. background: rgba(0, 0, 0, 0.6);
  464. /* 悬停时背景更深 */
  465. }
  466. .advantage-number {
  467. font-size: 3rem;
  468. font-weight: 700;
  469. color: rgba(52, 152, 219, 0.7);
  470. /* 使用品牌蓝色,增加可见性 */
  471. margin-bottom: 15px;
  472. text-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
  473. /* 添加文字阴影 */
  474. }
  475. h3 {
  476. font-size: 1.5rem;
  477. margin-bottom: 15px;
  478. color: #ffffff;
  479. /* 确保标题为纯白色 */
  480. text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
  481. /* 添加文字阴影增强可读性 */
  482. }
  483. p {
  484. color: rgba(255, 255, 255, 0.9);
  485. /* 段落文字颜色 */
  486. line-height: 1.6;
  487. /* 增加行高提高可读性 */
  488. font-size: 1rem;
  489. /* 设置合适的字体大小 */
  490. text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
  491. /* 轻微文字阴影 */
  492. }
  493. }
  494. /* 客户评价部分样式 */
  495. .testimonials-section {
  496. position: relative;
  497. padding: 100px 20px;
  498. color: white;
  499. overflow: hidden;
  500. .parallax-bg {
  501. //background-image: url('https://images.unsplash.com/photo-1557682250-33bd709cbe85?ixlib=rb-1.2.1&auto=format&fit=crop&w=1500&q=80');
  502. filter: brightness(0.4);
  503. }
  504. .testimonials-slider {
  505. display: flex;
  506. flex-wrap: wrap;
  507. gap: 30px;
  508. justify-content: center;
  509. max-width: 1200px;
  510. margin: 0 auto;
  511. }
  512. }
  513. .testimonial-card {
  514. background: rgba(255, 255, 255, 0.1);
  515. backdrop-filter: blur(10px);
  516. border-radius: 8px;
  517. padding: 30px;
  518. flex: 1;
  519. min-width: 300px;
  520. max-width: 400px;
  521. .testimonial-rating {
  522. color: #f1c40f;
  523. font-size: 1.5rem;
  524. margin-bottom: 20px;
  525. }
  526. .testimonial-text {
  527. font-style: italic;
  528. margin-bottom: 20px;
  529. line-height: 1.6;
  530. }
  531. .testimonial-author {
  532. display: flex;
  533. align-items: center;
  534. .author-avatar {
  535. width: 60px;
  536. height: 60px;
  537. border-radius: 50%;
  538. margin-right: 15px;
  539. object-fit: cover;
  540. }
  541. .author-info {
  542. h4 {
  543. font-size: 1.2rem;
  544. margin-bottom: 5px;
  545. }
  546. p {
  547. opacity: 0.8;
  548. font-size: 0.9rem;
  549. }
  550. }
  551. }
  552. }
  553. /* 合作流程部分样式 */
  554. .process-section {
  555. padding: 100px 20px;
  556. background-color: #f8f9fa;
  557. .process-flow {
  558. display: grid;
  559. grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  560. gap: 30px;
  561. margin-top: 40px;
  562. max-width: 1200px;
  563. margin-left: auto;
  564. margin-right: auto;
  565. }
  566. }
  567. .process-step {
  568. display: flex;
  569. background: white;
  570. border-radius: 8px;
  571. padding: 30px;
  572. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
  573. transition: transform 0.3s ease, box-shadow 0.3s ease;
  574. &:hover {
  575. transform: translateY(-10px);
  576. box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1);
  577. }
  578. .step-number {
  579. font-size: 2.5rem;
  580. font-weight: 700;
  581. color: #3498db;
  582. margin-right: 20px;
  583. line-height: 1;
  584. }
  585. .step-content {
  586. h3 {
  587. font-size: 1.5rem;
  588. margin-bottom: 10px;
  589. color: #2c3e50;
  590. }
  591. p {
  592. color: #7f8c8d;
  593. }
  594. }
  595. }
  596. /* 响应式调整 */
  597. @media (max-width: 768px) {
  598. .hero-content {
  599. h1 {
  600. font-size: 2.5rem;
  601. }
  602. p {
  603. font-size: 1.2rem;
  604. }
  605. }
  606. .cases-grid {
  607. grid-template-columns: 1fr;
  608. }
  609. .process-step {
  610. flex-direction: column;
  611. .step-number {
  612. margin-right: 0;
  613. margin-bottom: 15px;
  614. }
  615. }
  616. }
  617. </style>