index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. <template>
  2. <section>
  3. <section class="hero-section">
  4. <video ref="videoRef" class="hero-video-bg" preload="auto" :src="homeVideo" autoplay loop muted playsinline
  5. @loadedmetadata="onVideoLoaded"></video>
  6. <ParticlesCanvas class="canvas-overlay" />
  7. <div class="hero-content">
  8. <h2 class="hero-title">您专注业务,我们守护安全&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再强的攻击,也有攻不破的防线
  9. </h2>
  10. <div class="hero-subtitle">
  11. <p>高防服务器&nbsp;|&nbsp;高防DNS&nbsp;|&nbsp;游戏盾SDK&nbsp;|&nbsp;高防CDN&nbsp;全方位守护您的业务</p>
  12. </div>
  13. </div>
  14. </section>
  15. <ProductTabs />
  16. <!-- 安全洞见标题 -->
  17. <section class="insight-header">
  18. <h2 class="insight-title">安全洞见&nbsp;&nbsp;&nbsp;全网感知</h2>
  19. <p class="insight-subtitle">实时攻防态势数据</p>
  20. </section>
  21. <!-- 数据展示区域 -->
  22. <StatsSection />
  23. <!-- 安全运营与方案模块 -->
  24. <PlansSection />
  25. <!-- 安全漏洞 / 全景技术架构上方模块 -->
  26. <section class="security-arch-section">
  27. <NuxtImg alt="安全架构" src="/images/home/home-bg2.png" class="security-arch-img" />
  28. <div class="security-arch-animate">
  29. <SecurityParticles />
  30. </div>
  31. <div class="security-arch-desc">
  32. <h3 class="security-arch-title">
  33. 全景技术架构,让技术成为增长引擎
  34. </h3>
  35. <div class="security-arch-subtitle">
  36. <p>
  37. 从基础设施、数据引擎、服务中台到业务应用,层层协同,将算力、数据与能力统一管理,
  38. </p>
  39. <p>
  40. 保证系统在高并发、高复杂度场景下依然稳定运行。
  41. </p>
  42. </div>
  43. </div>
  44. </section>
  45. <section class="security-flowchart">
  46. <NuxtImg width="1918" loading="eager" src="/images/home/flowchart.png" alt="流程" />
  47. </section>
  48. <!-- 助力各行业客户成功 -->
  49. <section class="cain-section">
  50. <NuxtImg alt="助力各行业客户成功" src="/images/home/home-bg3.png" class="cain-section-img" />
  51. <div class="cain-section-animate">
  52. <SecurityParticles />
  53. </div>
  54. <div class="cain-section-desc">
  55. <h3 class="cain-section-title">
  56. 助力各行业客户成功
  57. </h3>
  58. </div>
  59. </section>
  60. <section class="industry">
  61. <div class="industry-content">
  62. <div class="industry-item">
  63. <div class="industry-text">金融</div>
  64. <NuxtImg src="/images/home/icon.png" alt="金融" class="industry-icon" />
  65. </div>
  66. <div class="industry-item">
  67. <div class="industry-text">互联网</div>
  68. <NuxtImg src="/images/home/icon2.png" alt="互联网" class="industry-icon" />
  69. </div>
  70. <div class="industry-item">
  71. <div class="industry-text">医疗健康</div>
  72. <NuxtImg src="/images/home/icon3.png" alt="医疗健康" class="industry-icon" />
  73. </div>
  74. <div class="industry-item">
  75. <div class="industry-text">制造</div>
  76. <NuxtImg src="/images/home/icon4.png" alt="制造" class="industry-icon" />
  77. </div>
  78. <div class="industry-item">
  79. <div class="industry-text">教育</div>
  80. <NuxtImg src="/images/home/icon5.png" alt="教育" class="industry-icon" />
  81. </div>
  82. </div>
  83. <div class="industry-other">
  84. <div class="other-item">
  85. <NuxtImg src="/images/home/icon6.png" alt="卓越教育" />
  86. </div>
  87. <div class="other-item">
  88. <NuxtImg src="/images/home/icon7.png" alt="华福证券" />
  89. </div>
  90. <div class="other-item">
  91. <NuxtImg src="/images/home/icon8.png" alt="汉王" />
  92. </div>
  93. <div class="other-item">
  94. <NuxtImg src="/images/home/icon9.png" alt="隧道股份" />
  95. </div>
  96. <div class="other-item">
  97. <NuxtImg src="/images/home/icon10.png" alt="岳阳医院" />
  98. </div>
  99. <div class="other-item">
  100. <NuxtImg src="/images/home/icon11.png" alt="杉德" />
  101. </div>
  102. <div class="other-item">
  103. <NuxtImg src="/images/home/icon12.png" alt="易班" />
  104. </div>
  105. <div class="other-item">
  106. <NuxtImg src="/images/home/icon13.png" alt="银联商务" />
  107. </div>
  108. <div class="other-item">
  109. <NuxtImg src="/images/home/icon14.png" alt="长海医院" />
  110. </div>
  111. <div class="other-item">
  112. <NuxtImg src="/images/home/icon15.png" alt="斗象科技" />
  113. </div>
  114. <div class="other-item">
  115. <NuxtImg src="/images/home/icon16.png" alt="瑞金" />
  116. </div>
  117. <div class="other-item">
  118. <NuxtImg src="/images/home/icon17.png" alt="3L" />
  119. </div>
  120. <div class="other-item">
  121. <NuxtImg src="/images/home/icon18.png" alt="宝付" />
  122. </div>
  123. <div class="other-item">
  124. <NuxtImg src="/images/home/icon19.png" alt="新华医院" />
  125. </div>
  126. <div class="other-item">
  127. <NuxtImg src="/images/home/icon20.png" alt="中船重工物贸集团" />
  128. </div>
  129. </div>
  130. <div class="industry-box">
  131. <div class="industry-radar">
  132. <NuxtImg src="/images/home/home-bg4.png" alt="radar" class="radar-bg-img" />
  133. <div class="radar-dots">
  134. <span class="radar-dot radar-dot-1" />
  135. <span class="radar-dot radar-dot-2" />
  136. <span class="radar-dot radar-dot-3" />
  137. <span class="radar-dot radar-dot-4" />
  138. </div>
  139. </div>
  140. <img src="~/assets/svg/home/protect.svg" alt="防护箱" class="box-icon" />
  141. </div>
  142. <div class="industry-title">
  143. <h3><span>立即加入</span> <span>安全之旅</span></h3>
  144. <div class="industry-subtitle">完成注册,即可免费体验 DDoS防护、CC防护、DNS解析等多款安全产品</div>
  145. </div>
  146. </section>
  147. <section class="bottom-video">
  148. <!-- 视频背景 -->
  149. <video ref="videoRef" style="clip-path: inset(0 0 50% 0);" class="hero-video-bg" src="~/assets/video/home.webm"
  150. autoplay loop muted playsinline @loadedmetadata="onVideoLoaded"></video>
  151. <!-- Canvas动画组件 -->
  152. <ParticlesCanvas class="canvas-overlay" />
  153. </section>
  154. </section>
  155. </template>
  156. <script setup>
  157. definePageMeta({
  158. layout: 'pc'
  159. })
  160. import { ref } from 'vue'
  161. import StatsSection from '~/components/home/StatsSection.vue'
  162. import ProductTabs from '~/components/home/ProductTabs.vue'
  163. import PlansSection from '~/components/PlansSection.vue'
  164. import ParticlesCanvas from '~/components/ParticlesCanvas.vue'
  165. import SecurityParticles from '~/components/SecurityParticles.vue'
  166. import homeVideo from '~/assets/video/home.webm'
  167. const videoRef = ref(null)
  168. const onVideoLoaded = () => {
  169. if (videoRef.value) {
  170. videoRef.value.play().catch(() => {
  171. })
  172. }
  173. }
  174. useHead(() => ({
  175. title: 'DDAC',
  176. meta: [
  177. { name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' },
  178. { name: 'description', content: 'DDAC - 游戏盾防御' },
  179. { name: 'keywords', content: '高防服务器 | 高防DNS | 游戏盾SDK | 高防CDN' }
  180. ],
  181. link: [
  182. { rel: 'icon', href: '/favicon.ico' },
  183. // { rel: 'preload', as: 'video', href: homeVideo }
  184. ],
  185. htmlAttrs: {
  186. lang: 'en'
  187. }
  188. }))
  189. </script>
  190. <style scoped lang="scss">
  191. .main-content {
  192. width: 100%;
  193. max-width: 1920px;
  194. margin: 0 auto;
  195. padding: 0;
  196. }
  197. .hero-section,
  198. .bottom-video {
  199. width: 100%;
  200. height: 497px;
  201. position: relative;
  202. display: flex;
  203. align-items: center;
  204. justify-content: center;
  205. box-sizing: border-box;
  206. .hero-video-bg {
  207. position: absolute;
  208. top: 32%;
  209. left: 50%;
  210. width: 1200px;
  211. transform: translate(-50%);
  212. object-fit: cover;
  213. clip-path: inset(0 0 40% 0);
  214. z-index: 0;
  215. }
  216. .canvas-overlay {
  217. position: absolute;
  218. top: 260px;
  219. left: 0;
  220. width: 100%;
  221. height: 50%; // 只显示上半部分
  222. pointer-events: none;
  223. z-index: 1; // 层级不要太高
  224. }
  225. .hero-content {
  226. width: 100%;
  227. max-width: 1568px;
  228. padding: 0 20px;
  229. box-sizing: border-box;
  230. display: flex;
  231. flex-direction: column;
  232. align-items: center;
  233. position: relative;
  234. z-index: 2; // 内容在视频和canvas之上
  235. margin: 0 auto;
  236. .hero-title {
  237. font-size: 30px;
  238. font-weight: 400;
  239. line-height: 30px;
  240. // color: #7c4dff;
  241. margin: 0;
  242. white-space: normal;
  243. text-align: center;
  244. word-break: break-word;
  245. max-width: 100%;
  246. background: linear-gradient(90deg, #7C4DFF 0.24%, #DEB9FF 45.03%, #617FFF 132.52%);
  247. background-clip: text;
  248. -webkit-background-clip: text;
  249. -webkit-text-fill-color: transparent;
  250. }
  251. .hero-subtitle {
  252. margin-top: 28px;
  253. width: 100%;
  254. max-width: 918.27px;
  255. // min-height: 341.49px;
  256. position: relative;
  257. display: flex;
  258. justify-content: center;
  259. align-items: flex-start;
  260. p {
  261. font-size: 20px;
  262. font-weight: 400;
  263. line-height: normal;
  264. color: #ffffff;
  265. margin: 0;
  266. text-align: center;
  267. white-space: normal;
  268. word-break: break-word;
  269. max-width: 100%;
  270. }
  271. }
  272. }
  273. }
  274. .bottom-video {
  275. height: 352px;
  276. .hero-video-bg {
  277. top: 4%;
  278. }
  279. .canvas-overlay {
  280. top: 50%;
  281. }
  282. }
  283. // 安全洞见标题
  284. .insight-header {
  285. width: 313px;
  286. margin: 100px auto 0;
  287. display: flex;
  288. flex-direction: column;
  289. align-items: center;
  290. .insight-title {
  291. font-size: 36px;
  292. font-weight: 400;
  293. line-height: 36px;
  294. color: #ffffff;
  295. margin: 0;
  296. white-space: nowrap;
  297. }
  298. .insight-subtitle {
  299. font-size: 24px;
  300. font-weight: 400;
  301. line-height: 24px;
  302. color: #a39dff;
  303. margin: 24px 0 0 0;
  304. text-align: center;
  305. }
  306. }
  307. // 安全架构展示(到全景技术架构上方)
  308. .security-arch-section {
  309. position: relative;
  310. padding-top: 496px;
  311. padding-bottom: 60px;
  312. box-sizing: border-box;
  313. .security-arch-img {
  314. left: 50%;
  315. position: absolute;
  316. top: 56px;
  317. transform: translate(-50%);
  318. height: 700px;
  319. width: 806px;
  320. }
  321. .security-arch-animate {
  322. height: 212px;
  323. left: 50%;
  324. mask-size: cover;
  325. position: absolute;
  326. top: 234px;
  327. transform: translate(-50%);
  328. width: 750px;
  329. opacity: .7;
  330. pointer-events: none;
  331. }
  332. .security-arch-desc {
  333. color: #fff;
  334. position: absolute;
  335. left: 50%;
  336. top: 500px;
  337. transform: translate(-50%, -50%);
  338. .security-arch-title {
  339. font-size: 40px;
  340. font-style: normal;
  341. font-weight: 400;
  342. line-height: 40px;
  343. margin: 0 auto;
  344. text-align: center;
  345. }
  346. .security-arch-subtitle {
  347. margin-top: 20px;
  348. color: rgba(255, 255, 255, 0.80);
  349. font-size: 18px;
  350. font-style: normal;
  351. font-weight: 400;
  352. line-height: 24px;
  353. white-space: normal;
  354. word-break: break-word;
  355. text-align: center;
  356. }
  357. }
  358. }
  359. .security-flowchart {
  360. position: relative;
  361. display: flex;
  362. justify-content: center;
  363. margin-top: 40px;
  364. }
  365. //彩虹部分
  366. .cain-section {
  367. position: relative;
  368. padding-top: 380px;
  369. box-sizing: border-box;
  370. .cain-section-img {
  371. left: 50%;
  372. position: absolute;
  373. top: 0;
  374. transform: translate(-50%);
  375. height: 400px;
  376. width: 1200px;
  377. }
  378. .cain-section-animate {
  379. height: 212px;
  380. left: 50%;
  381. mask-size: cover;
  382. position: absolute;
  383. top: 10%;
  384. transform: translate(-50%);
  385. width: 750px;
  386. opacity: .7;
  387. pointer-events: none;
  388. }
  389. .cain-section-desc {
  390. position: absolute;
  391. left: 50%;
  392. top: 80%;
  393. transform: translate(-50%, -50%);
  394. width: 100%;
  395. text-align: center;
  396. .cain-section-title {
  397. font-size: 45px;
  398. color: #ffffff;
  399. font-weight: 400;
  400. }
  401. }
  402. }
  403. $Diameter :890px;
  404. .industry {
  405. position: relative;
  406. display: flex;
  407. flex-direction: column;
  408. align-items: center;
  409. gap: 40px;
  410. z-index: 2;
  411. .industry-content {
  412. display: flex;
  413. gap: 16px;
  414. }
  415. .industry-item {
  416. display: flex;
  417. justify-content: space-between;
  418. width: 240px;
  419. height: 100px;
  420. border-radius: 10px;
  421. background: linear-gradient(118deg, #C9C5FF -25.53%, #5704FF 110.12%);
  422. }
  423. .industry-icon {
  424. width: 150px;
  425. height: 100px;
  426. }
  427. .industry-text {
  428. padding: 16px 0 0 16px;
  429. font-size: 18px;
  430. font-weight: 400;
  431. line-height: 18px;
  432. color: #fff;
  433. }
  434. .industry-other {
  435. display: grid;
  436. gap: 16px;
  437. grid-template-columns: repeat(5, 1fr);
  438. grid-template-rows: repeat(3, auto);
  439. }
  440. .other-item {
  441. display: flex;
  442. justify-content: center;
  443. align-items: center;
  444. width: 240px;
  445. height: 100px;
  446. border-radius: 10px;
  447. border: 1px solid #B2A1FF;
  448. background: #1C192B;
  449. }
  450. .industry-title {
  451. h3 {
  452. padding: 40px 0;
  453. text-align: center;
  454. color: #FFF;
  455. font-size: 45px;
  456. font-style: normal;
  457. font-weight: 400;
  458. line-height: 45px;
  459. span {
  460. margin: 0 20px
  461. }
  462. }
  463. .industry-subtitle {
  464. text-align: center;
  465. color: #FFF;
  466. font-size: 26px;
  467. font-style: normal;
  468. font-weight: 400;
  469. line-height: 26px;
  470. }
  471. }
  472. .industry-box,
  473. .industry-radar {
  474. position: relative;
  475. width: $Diameter;
  476. height: calc($Diameter / 2);
  477. }
  478. .industry-radar {
  479. overflow: hidden;
  480. }
  481. .radar-bg-img {
  482. position: absolute;
  483. left: 50%;
  484. top: 0;
  485. transform: translateX(-50%);
  486. width: 100%;
  487. height: $Diameter;
  488. object-fit: contain;
  489. object-position: center top;
  490. opacity: 0.95;
  491. z-index: 1;
  492. }
  493. .industry-radar::before {
  494. content: '';
  495. position: absolute;
  496. left: 0;
  497. top: 0;
  498. width: $Diameter;
  499. height: $Diameter;
  500. border-radius: 50%;
  501. transform-origin: 50%;
  502. background: conic-gradient(from 0deg at center,
  503. rgba(99, 102, 241, 0) 0deg,
  504. rgba(99, 102, 241, 0.05) 10deg,
  505. rgba(99, 102, 241, 0.1) 20deg,
  506. rgba(99, 102, 241, 0.2) 25deg,
  507. rgba(99, 102, 241, 0.3) 28deg,
  508. rgba(99, 102, 241, 0.4) 30deg,
  509. transparent 30deg 360deg);
  510. filter: blur(1px);
  511. animation: radarScan 6s linear infinite;
  512. z-index: 2;
  513. opacity: 0.7;
  514. }
  515. .industry-box::before {
  516. content: "";
  517. position: absolute;
  518. left: 50%;
  519. top: 100%;
  520. transform: translate(-50%, -50%);
  521. width: 64px;
  522. height: 64px;
  523. background: linear-gradient(114deg, #C9C5FF -44.49%, #5704FF 140.15%);
  524. stroke: #AE80FF;
  525. border-radius: 50%;
  526. z-index: 3;
  527. }
  528. .box-icon {
  529. position: absolute;
  530. left: 50%;
  531. top: 100%;
  532. width: 32px;
  533. height: 32px;
  534. transform: translate(-50%, -50%);
  535. z-index: 4;
  536. }
  537. .radar-dots {
  538. position: absolute;
  539. width: 100%;
  540. height: 100%;
  541. left: 0;
  542. top: 0;
  543. z-index: 4;
  544. }
  545. .radar-dot {
  546. position: absolute;
  547. width: 8px;
  548. height: 8px;
  549. border-radius: 50%;
  550. background-color: rgba(99, 102, 241, 0.8);
  551. box-shadow: 0 0 8px rgba(99, 102, 241, 0.8);
  552. }
  553. .radar-dot-1 {
  554. left: 45%;
  555. top: 35%;
  556. animation: radarBlink 1.5s ease-in-out infinite;
  557. }
  558. .radar-dot-2 {
  559. left: 60%;
  560. top: 62%;
  561. animation: radarBlink 1.5s ease-in-out infinite 0.375s;
  562. }
  563. .radar-dot-3 {
  564. left: 30%;
  565. top: 66%;
  566. animation: radarBlink 1.5s ease-in-out infinite 0.75s;
  567. }
  568. .radar-dot-4 {
  569. left: 70%;
  570. top: 35%;
  571. animation: radarBlink 1.5s ease-in-out infinite 1.125s;
  572. }
  573. }
  574. @keyframes radarScan {
  575. 0% {
  576. transform: rotateZ(0deg);
  577. }
  578. 100% {
  579. transform: rotateZ(360deg);
  580. }
  581. }
  582. @keyframes radarBlink {
  583. 0% {
  584. transform: scale(0.6);
  585. opacity: 0.2;
  586. }
  587. 50% {
  588. transform: scale(1.2);
  589. opacity: 1;
  590. }
  591. 100% {
  592. transform: scale(0.6);
  593. opacity: 0.2;
  594. }
  595. }
  596. </style>