瀏覽代碼

feat(about): 添加移动端关于页面的完整实现

新增关于页面的主要组件和布局,包括:
- 关于页面的背景、标题和介绍文本
- 安全防护矩阵卡片组件
- 产品流程图组件
- 防御能力展示卡片组件
实现页面交互效果和响应式布局
piks 3 周之前
父節點
當前提交
6999b1e0fe
共有 3 個文件被更改,包括 829 次插入9 次删除
  1. 142 0
      app/components/mobile/about/DCard.vue
  2. 383 0
      app/components/mobile/about/Flowchart.vue
  3. 304 9
      app/pages/mobile/about.vue

+ 142 - 0
app/components/mobile/about/DCard.vue

@@ -0,0 +1,142 @@
+<template>
+  <section class="mb-about-dcard">
+    <div class="mb-dcard-item" v-for="item in dcards" :key="item.icon">
+      <div class="mb-icon-wrapper">
+        <img :src="item.icon" alt="icon" class="mb-dcard-icon" />
+      </div>
+      <div class="mb-dcard-title">{{ item.title }}</div>
+      <div class="mb-dcard-subtitle">{{ item.subTitle }}</div>
+      <div class="mb-dcard-desc">{{ item.desc }}</div>
+    </div>
+  </section>
+</template>
+<script setup>
+const dcards = [
+  {
+    icon: '/images/about/icon-dc1.png',
+    title: '黑洞级流量清洗',
+    subTitle: '清洗能力:T级+',
+    desc: ' 自研分布式清洗架构,多节点协同作战,从网络层到应用层全方位识别并拦截恶意流量,确保正常业务零损耗通过。 '
+  },
+  {
+    icon: '/images/about/icon-dc2.png',
+    title: '五重防线联防',
+    subTitle: '防护覆盖:100%',
+    desc: 'CDN · 游戏盾 · 高防服务器 · 高防IP · SDK五大产品不是各自为战,而是智能协同、实时联动,构建无死角立体防御体系。'
+  },
+  {
+    icon: '/images/about/icon-dc3.png',
+    title: '毫秒级智能调度',
+    subTitle: '切换响应:<50ms',
+    desc: '基于实时流量分析的智能调度系统,攻击发生时自动识别、秒级切换防御节点,业务端完全无感知。'
+  },
+  {
+    icon: '/images/about/icon-dc4.png',
+    title: '全天候安全值守',
+    subTitle: '服务响应:7×24h',
+    desc: '7×24小时专业安全团队在线,攻击告警秒级推送,VIP客户专属技术通道,确保任何时刻都有人为你的业务兜底。'
+  }
+]
+</script>
+<style lang="scss" scoped>
+.mb-about-dcard {
+  width: 100%;
+  position: relative;
+  box-sizing: border-box;
+  margin: 20px auto 32px;
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 8px;
+
+  .mb-icon-wrapper {
+    position: relative;
+
+    .mb-dcard-icon {
+      position: relative;
+      width: 48px;
+      height: auto;
+      display: block;
+      z-index: 1;
+    }
+  }
+
+  .mb-icon-wrapper {
+    &::before {
+      content: '';
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+      width: 40px;
+      height: 40px;
+      background: #7D46FF;
+      filter: blur(20px);
+      z-index: 0;
+    }
+  }
+
+  .mb-dcard-item {
+    overflow: hidden;
+    position: relative;
+    box-sizing: border-box;
+    width: 168px;
+    min-height: 242px;
+    border-radius: 16px;
+    border: 1px solid #ADA8FF;
+    background: #030014;
+    padding: 8px 14px 16px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    color: #FFF;
+    transition: border-color 0.3s ease;
+
+    &::after {
+      content: "";
+      position: absolute;
+      bottom: 0px;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 100%;
+      height: 20px;
+      background: linear-gradient(90deg,
+          rgba(125, 70, 255, 1) 30%,
+          rgba(82, 229, 255, 1) 30%);
+      filter: blur(50px);
+      transition: opacity 0.3s ease;
+    }
+
+
+    .mb-dcard-title {
+      margin-top: 16px;
+      font-size: 14px;
+      font-weight: 500;
+      text-align: center;
+    }
+
+    .mb-dcard-subtitle {
+      margin-top: 8px;
+      display: inline-flex;
+      height: 24px;
+      width: auto;
+      padding: 0 10px;
+      justify-content: center;
+      align-items: center;
+      font-size: 12px;
+      font-weight: 400;
+      border-radius: 12px;
+      background: linear-gradient(180deg, rgba(32, 0, 84, 0.00) 0%, #4905B7 100%);
+      box-shadow: 0 4px 4px 0 rgba(98, 0, 255, 0.30) inset;
+    }
+
+    .mb-dcard-desc {
+      margin-top: 12px;
+      font-size: 10px;
+      font-weight: 400;
+      line-height: 18px;
+      text-align: center;
+    }
+  }
+
+}
+</style>

+ 383 - 0
app/components/mobile/about/Flowchart.vue

@@ -0,0 +1,383 @@
+<template>
+  <section class="mb-about-flow">
+    <div class="mb-flow-title">
+      <div class="mb-flow-title-text">
+        全线产品自主研发
+      </div>
+      <div class="mb-flow-title-subtext">
+        全线产品自主研发,从高防IP、CDN到游戏盾SDK,核心技术完全自控,安全能力不受制于人,防护效果快人一步。
+      </div>
+    </div>
+    <div class="mb-flow-content">
+      <div class="mb-flow-content-left">
+        <div class="mb-left-user">
+          <NuxtImg class="mb-flow-icon" src="/images/about/icon-user.png" alt="icon" />
+          <div class="mb-flow-text">用户</div>
+        </div>
+        <div class="mb-left-sdk">
+          <NuxtImg class="mb-flow-icon" src="/images/about/icon-sdk.png" alt="icon" />
+          <div class="mb-flow-text">终端设备/SDK</div>
+        </div>
+      </div>
+      <div class="mb-flow-content-con">
+        <div class="mb-con-item">高仿IP</div>
+        <div class="mb-con-item">CDN</div>
+        <div class="mb-con-item">游戏盾</div>
+      </div>
+      <div class="mb-flow-content-right">
+        <div class="mb-right-item">硬扛攻击,业务稳赢</div>
+        <div class="mb-right-item">就近分发<br />访问快人一步</div>
+        <div class="mb-right-item">端上智能调度+<br />加密隧道/大陆加速</div>
+      </div>
+    </div>
+    <div class="mb-flow-bottom">
+      <div class="mb-btm-left">高防服务器</div>
+      <div class="mb-btm-con">
+        <span>互联网基础设施</span><span>高防DNSSSL节点池</span>
+      </div>
+      <div class="mb-btm-right">源站服务器</div>
+    </div>
+  </section>
+</template>
+<script setup>
+</script>
+<style lang="scss" scoped>
+.mb-about-flow {
+  width: 100%;
+  margin: 25px auto 0;
+  box-sizing: border-box;
+
+  .mb-flow-title {
+    position: relative;
+    border-radius: 4px;
+    border: 1px solid #8B74FF;
+    background: rgba(63, 51, 125, 0.30);
+    color: #FFF;
+
+    .mb-flow-title-text {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 20px;
+      font-size: 12px;
+      font-weight: 400;
+      background: rgba(128, 119, 255, .5);
+    }
+
+    .mb-flow-title-subtext {
+      padding: 4px 10px;
+      font-size: 10px;
+      font-weight: 400;
+    }
+
+    &::before {
+      content: '';
+      position: absolute;
+      bottom: -16px;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 1px;
+      height: 16px;
+      background: #8B74FF;
+    }
+
+    &::after {
+      content: '';
+      position: absolute;
+      bottom: -16px;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 0;
+      height: 0;
+      border-left: 4px solid transparent;
+      border-right: 4px solid transparent;
+      border-top: 4px solid #8B74FF;
+    }
+  }
+
+
+  .mb-flow-content {
+    width: 100%;
+    box-sizing: border-box;
+    display: flex;
+    align-items: center;
+
+    .mb-flow-content-left {
+      display: flex;
+      gap: 10px;
+    }
+
+    .mb-flow-icon {
+      width: 24px;
+      height: 24px;
+    }
+
+    .mb-left-user,
+    .mb-left-sdk {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      color: #FFF;
+
+      .mb-flow-text {
+        position: relative;
+        box-sizing: border-box;
+        width: 45px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border-radius: 2px;
+        border: 1px solid #A39DFF;
+        background: #3F337D;
+        font-size: 10px;
+
+        &::before {
+          content: '';
+          position: absolute;
+          right: -10px;
+          top: 50%;
+          transform: translateY(-50%);
+          width: 8px;
+          height: 1px;
+          background: #8B74FF;
+        }
+
+        &::after {
+          content: '';
+          position: absolute;
+          right: -10px;
+          top: 50%;
+          transform: translateY(-50%);
+          width: 0;
+          height: 0;
+          border-top: 4px solid transparent;
+          border-bottom: 4px solid transparent;
+          border-left: 4px solid #8B74FF;
+        }
+      }
+
+    }
+
+    .mb-left-sdk {
+      .mb-flow-text {
+        width: 70px;
+        height: 20px;
+        text-align: center;
+
+        &::before {
+          right: -12px;
+          width: 12px;
+
+        }
+
+        &::after {
+          right: -12px;
+        }
+      }
+    }
+
+    .mb-flow-content-con {
+      position: relative;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      gap: 10px;
+      width: 106px;
+      height: 98px;
+      box-sizing: border-box;
+      border-radius: 10px;
+      border: 1px solid #8B74FF;
+      margin: 16px 18px 16px 12px;
+      background: rgba(63, 51, 125, 0.30);
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: 50%;
+        bottom: -16px;
+        transform: translateX(-50%);
+        width: 1px;
+        height: 16px;
+        background: #8B74FF;
+      }
+
+      &::after {
+        content: '';
+        position: absolute;
+        left: 50%;
+        bottom: -16px;
+        transform: translateX(-50%);
+        width: 0;
+        height: 0;
+        border-left: 4px solid transparent;
+        border-right: 4px solid transparent;
+        border-top: 4px solid #8B74FF;
+      }
+
+      .mb-con-item {
+        color: #FFF;
+        font-size: 10px;
+        font-weight: 400;
+        display: flex;
+        height: 20px;
+        width: 62px;
+        justify-content: center;
+        align-items: center;
+        border-radius: 4px;
+        border: 1px solid #A39DFF;
+        background: #3F337D;
+      }
+    }
+
+    .mb-flow-content-right {
+      display: flex;
+      flex-direction: column;
+      gap: 4px;
+      align-items: center;
+
+      .mb-right-item {
+        position: relative;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        box-sizing: border-box;
+        width: 102px;
+        border-radius: 4px;
+        padding: 0 4px;
+        border: 1px solid #A39DFF;
+        background: #3F337D;
+        color: #FFF;
+        font-size: 10px;
+        font-weight: 400;
+
+        &:nth-of-type(1) {
+          height: 25px;
+        }
+
+        &:nth-of-type(2) {
+          height: 32px;
+        }
+
+        &:nth-of-type(3) {
+          height: 32px;
+        }
+
+        &::before {
+          content: '';
+          position: absolute;
+          left: -14px;
+          top: 50%;
+          transform: translateY(-50%);
+          width: 14px;
+          height: 1px;
+          background: #8B74FF;
+        }
+
+        &::after {
+          content: '';
+          position: absolute;
+          left: -14px;
+          top: 50%;
+          transform: translateY(-50%);
+          width: 0;
+          height: 0;
+          border-top: 4px solid transparent;
+          border-bottom: 4px solid transparent;
+          border-right: 4px solid #8B74FF;
+        }
+      }
+    }
+  }
+
+  .mb-flow-bottom {
+    display: flex;
+    gap: 22px;
+    color: #FFF;
+    align-items: center;
+    font-size: 10px;
+
+    .mb-btm-left,
+    .mb-btm-con,
+    .mb-btm-right {
+      border: 1px solid #A39DFF;
+      background: #3F337D;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      border-radius: 4px;
+
+    }
+
+    .mb-btm-left {
+      position: relative;
+      margin-left: 26px;
+      width: 70px;
+      height: 25px;
+
+      &::before {
+        content: '';
+        position: absolute;
+        right: -24px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 18px;
+        height: 1px;
+        background: #8B74FF;
+      }
+
+      &::after {
+        content: '';
+        position: absolute;
+        right: -8px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 0;
+        height: 0;
+        border-top: 4px solid transparent;
+        border-bottom: 4px solid transparent;
+        border-right: 4px solid #8B74FF;
+      }
+    }
+
+    .mb-btm-con {
+      width: 108px;
+      height: 40px;
+      gap: 4px;
+    }
+
+    .mb-btm-right {
+      position: relative;
+      width: 94px;
+      height: 25px;
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: -24px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 18px;
+        height: 1px;
+        background: #8B74FF;
+      }
+
+      &::after {
+        content: '';
+        position: absolute;
+        left: -8px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 0;
+        height: 0;
+        border-top: 4px solid transparent;
+        border-bottom: 4px solid transparent;
+        border-left: 4px solid #8B74FF;
+      }
+    }
+  }
+}
+</style>

+ 304 - 9
app/pages/mobile/about.vue

@@ -1,21 +1,316 @@
 <template>
-  <div class="mb-about">
-    <h1>关于(H5)</h1>
-  </div>
+  <section class="mb-about">
+    <NuxtImg class="mb-about-bg" src="/images/about/bg.png" alt="about" />
+    <section class="mb-about-content">
+      <div class="mb-about-title">
+        <h1>层层设防,步步为盾,全产品矩阵协同打造零穿透安全体系</h1>
+        <p>A collaborative approach across the entire product portfolio creates a zero-penetration security system.</p>
+      </div>
+      <div class="mb-about-box">
+        <div class="mb-about-box-text">
+          <p><span style="color: #D2AEFF;">盾网络 — 专注于企业级DDoS/CC防护与安全加速的网络安全服务商。
+            </span>我们以自研流量清洗架构为核心,构建了覆盖高防CDN、游戏盾、高防服务器、高防IP、SDK防护的全链路安全产品体系。依托全国多节点分布式防御网络,为游戏、电商、金融、直播等行业客户提供T级攻击防御与毫秒级响应保障。技术是我们的信仰,稳定是我们的承诺。1盾,让每一次攻击都徒劳无功。
+          </p>
+        </div>
+      </div>
+    </section>
+    <section class="mb-about-subtitle">
+      <h2>全维度安全防护矩阵</h2>
+      <p>体系化安全能力,全场景多维联动防护,筑牢企业风</p>
+      <p>险抵御与运营保障</p>
+    </section>
+    <Flowchart />
+    <section class="mb-about-matrix">
+      <h2>驱动业务持续稳定运行的全域安全产品矩阵</h2>
+      <p>以全球节点、智能调度与多层防护为底座,构建覆盖业务接入、传</p>
+      <p>输、抗攻击与终端安全的全链路产品体系,为企业提供可扩展、可</p>
+      <p>进化的稳态安全能力。</p>
+    </section>
+    <section class="mb-matrix-card">
+      <div v-for="(item, index) in accordionItems" :key="item.title" class="mb-card-item"
+        :class="{ 'mb-is-open': openIndices.includes(index) }" @click="togglecard(index)">
+        <div class="mb-card-header">
+          <div class="mb-card-left">
+            <img :src="item.icon" alt="icon">
+            <span class="mb-card-title">{{ item.title }}</span>
+          </div>
+          <Icon name="line-md:chevron-right" class="mb-card-icon" />
+        </div>
+        <Transition name="mb-card-expand">
+          <div v-show="openIndices.includes(index)" class="mb-card-body">
+            <p class="mb-card-text">{{ item.text }}</p>
+            <p :style="{ color: item.color }" class="mb-card-text">{{ item.desc }}</p>
+          </div>
+        </Transition>
+      </div>
+    </section>
+    <section class="mb-about-text">
+      <h2>万千攻击,1盾尽消</h2>
+      <p>"T级清洗能力×智能流量调度×全链路产品联防—这就是1盾的底气"</p>
+    </section>
+    <DCard />
+  </section>
 </template>
-
 <script setup>
+import Flowchart from '~/components/mobile/about/Flowchart.vue';
+import DCard from '~/components/mobile/about/DCard.vue';
+import cardIcon1 from '@/assets/svg/about/card-icon1.svg'
+import cardIcon2 from '@/assets/svg/about/card-icon2.svg'
+import cardIcon3 from '@/assets/svg/about/card-icon3.svg'
+import cardIcon4 from '@/assets/svg/about/card-icon4.svg'
+import cardIcon5 from '@/assets/svg/about/card-icon5.svg'
+
+
+const accordionItems = [
+  {
+    title: 'CDN加速',
+    icon: cardIcon1,
+    text: '球加速节点分发,降低延迟提升用户访问体验。',
+    desc: '全球200+节点',
+    color: '#A39DFF'
+  },
+  {
+    title: '游戏盾',
+    icon: cardIcon2,
+    text: '专为游戏业务定制,智能调度抗DDoS,隐藏源站。',
+    desc: 'T级防御能力',
+    color: '#4696FF'
+  },
+  {
+    title: '高防服务器',
+    icon: cardIcon3,
+    text: '物理级高防机房,大带宽大防御,稳定业务运行。',
+    desc: '单节点500G+',
+    color: '#B546FF'
+  },
+  {
+    title: '高防IP',
+    icon: cardIcon4,
+    text: '弹性IP防护,精准流量清洗,零影响转发正常业务。',
+    desc: '弹性扩展1T+',
+    color: '#616EFF'
+  },
+  {
+    title: 'SDK防护',
+    icon: cardIcon5,
+    text: '端侧安全加固,链路加密通信,防篡改防抓包。',
+    desc: '端到端加密',
+    color: '#46ECFF'
 
+  }
+]
+const openIndices = ref([0])
+
+const togglecard = (index) => {
+  const i = openIndices.value.indexOf(index)
+  if (i > -1) {
+    openIndices.value.splice(i, 1)
+  } else {
+    openIndices.value.push(index)
+  }
+}
 </script>
 
 <style scoped lang="scss">
 .mb-about {
-  color: #fff;
-  text-align: center;
-  padding-top: 40px;
+  width: 100%;
+  position: relative;
+
+  .mb-about-bg {
+    position: absolute;
+    top: 0;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 375px;
+    height: auto;
+    z-index: 1;
+  }
+
+  .mb-about-content {
+    padding-top: 40px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+
+    .mb-about-title {
+      position: relative;
+      z-index: 2;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      color: #FFF;
+      gap: 6px;
+
+      h1 {
+        font-size: 12px;
+        font-weight: 400;
+      }
+
+      p {
+        font-size: 6px;
+        font-weight: 400;
+      }
+    }
+
+    .mb-about-box {
+      position: relative;
+      margin-top: 72px;
+      border-radius: 10px;
+      border: 1px solid rgba(13, 0, 34, 0.00);
+      background: linear-gradient(179deg, rgba(3, 0, 20, 0.50) 1.22%, rgba(151, 87, 255, 0.10) 41.19%);
+      box-shadow: 0 4px 4px 0 rgba(98, 0, 255, 0.30) inset;
+      backdrop-filter: blur(7px);
+      padding: 16px;
+
+      .mb-about-box-text {
+        color: #FFF;
+        font-size: 12px;
+        font-weight: 400;
+        line-height: 20px;
+      }
+
+    }
+  }
+
+  .mb-about-subtitle {
+    margin-top: 34px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    color: #FFF;
+
+    h2 {
+      font-size: 16px;
+      font-weight: 700;
+      margin-bottom: 12px;
+    }
+
+    p {
+      font-size: 12px;
+      font-weight: 400;
+      line-height: 20px;
+    }
+  }
+
+  .mb-about-matrix {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    color: #FFF;
+    margin-top: 56px;
+    gap: 10px;
+
+    h2 {
+      font-size: 16px;
+      font-weight: 700;
+    }
+
+    p {
+      font-size: 10px;
+      font-weight: 400;
+      line-height: 14px;
+    }
+  }
+
+  .mb-matrix-card {
+    margin-top: 14px;
+    display: flex;
+    flex-direction: column;
+    gap: 10px;
+
+    .mb-card-item {
+      padding: 20px;
+      border-radius: 10px;
+      border: 1px solid rgba(255, 255, 255, 0.10);
+      background: #1C192B;
+      backdrop-filter: blur(9px);
+      transition: border-color 0.2s ease, background 0.2s ease;
+    }
+
+    .mb-card-header {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+    }
+
+    .mb-card-left {
+      display: flex;
+      align-items: start;
+
+      img {
+        width: 30px;
+        height: 30px;
+      }
+    }
+
+    .mb-card-title {
+      color: #FFF;
+      font-size: 14px;
+      font-weight: 500;
+    }
+
+    .mb-card-icon {
+      color: #fff;
+      font-size: 20px;
+      transition: transform 0.2s ease;
+    }
+
+    .mb-card-item.mb-is-open .mb-card-icon {
+      transform: rotate(90deg);
+    }
+
+    .mb-card-body {
+      margin-top: 10px;
+    }
+
+    .mb-card-text {
+      color: rgba(255, 255, 255, 0.50);
+      font-size: 12px;
+      font-weight: 400;
+      line-height: 20px;
+    }
+
+    .mb-card-expand-enter-active,
+    .mb-card-expand-leave-active {
+      transition: all 0.2s ease;
+      overflow: hidden;
+    }
+
+    .mb-accordion-expand-enter-from,
+    .mb-accordion-expand-leave-to {
+      opacity: 0;
+      max-height: 0;
+    }
+
+    .mb-accordion-expand-enter-to,
+    .mb-accordion-expand-leave-from {
+      opacity: 1;
+      max-height: 200px;
+    }
+  }
+
+  .mb-about-text {
+    margin-top: 40px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+    color: #fff;
+
+    h2 {
+      font-size: 16px;
+      font-weight: 700;
+    }
 
-  h1 {
-    font-size: 32px;
+    p {
+      font-size: 10px;
+      font-weight: 400;
+    }
   }
 }
 </style>