index.vue 16 KB

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