Files
website/.vitepress/theme/components/HomePage.vue
T
Dai0814 6944652966
mirror-to-gitee / mirror (push) Successful in 3s
fix(portal): 官方文档导航直接跳文档站,不再停在本站锚点
原先导航「官方文档」指向 /#docs(首页内的文档区块),
用户期望点它直接进 http://open.5iot.com:5051/docs/。

改动
- 导航项改为外链 http://open.5iot.com:5051/docs/,
  带 target=_blank 与 rel=noopener,新开标签页不打断阅读
- 首页 hero 的「官方文档」按钮同样改为外链直跳
- 文档站地址收敛为单一来源:data/content.ts 导出 DOCS_BASE / DOCS_HOME,
  可用环境变量 DOCS_BASE 覆盖;config.mts 与 HomePage.vue 都引用它,
  消除原先三处硬编码
- 首页的「官方文档」区块(#docs)保留,仍是各手册入口的聚合卡片

验证
- 导航渲染实测:href=http://open.5iot.com:5051/docs/, target=_blank
- 点击实测:新开标签页到目标地址,原页面 URL 不变
- 锚点项高亮不受影响(点「产品功能」仍正常变蓝)
- 构建 13 页 262 引用 0 失效
2026-11-04 15:36:04 +08:00

241 lines
8.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup lang="ts">
import { projects } from '../../../data/projects'
import {
stats,
foundations,
productLines,
coreAbilities,
docs,
DOCS_HOME,
} from '../../../data/content'
</script>
<template>
<div class="portal">
<!-- Hero -->
<section class="p-hero">
<div class="p-wrap">
<span class="p-eyebrow">APACHE-2.0 · 开源运营平台</span>
<h1 class="p-hero-title">雪羊科技物联网<em>卡与设备</em>管理平台</h1>
<p class="p-hero-sub">
我们对外开源的项目集合。物联网卡管理、DTU 设备管理、中后台开发底座,
同一套工程规范,同一个许可证,clone 之后就能跑起来。
</p>
<div class="p-hero-actions">
<a class="p-btn p-btn--primary" href="/projects/">
浏览全部项目
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</a>
<a
class="p-btn p-btn--ghost"
:href="DOCS_HOME"
target="_blank"
rel="noopener"
>官方文档</a>
</div>
<div class="p-stats">
<div v-for="s in stats" :key="s.label" class="p-stat">
<span class="p-stat-num">{{ s.num }}<span v-if="s.unit">{{ s.unit }}</span></span>
<span class="p-stat-label">{{ s.label }}</span>
</div>
</div>
</div>
</section>
<!-- 项目 -->
<section class="p-section p-section--alt" id="projects">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">PROJECTS</span>
<h2 class="p-title">三个可直接投入使用的项目</h2>
<p class="p-desc">
都已在生产环境验证,都能单机一条命令启动。按需取用,也可以组合成一套完整方案。
</p>
</header>
<div class="p-grid p-grid--3">
<a v-for="p in projects" :key="p.id" :href="p.page" class="p-proj">
<div class="p-proj-top">
<h3 class="p-proj-name">{{ p.name }}</h3>
<span class="p-badge">{{ p.status }}</span>
</div>
<p class="p-proj-tagline">{{ p.tagline }}</p>
<p class="p-proj-summary">{{ p.summary }}</p>
<ul class="p-tags">
<li v-for="t in p.tech.slice(0, 4)" :key="t">{{ t }}</li>
</ul>
<div class="p-proj-foot">
<span>{{ p.license }}</span>
<span class="p-proj-more">查看详情 →</span>
</div>
</a>
</div>
</div>
</section>
<!-- 产品功能 -->
<section class="p-section" id="features">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">PRODUCT FEATURES</span>
<h2 class="p-title">产品功能:一套系统覆盖完整业务</h2>
<p class="p-desc">
iotLCM 管卡、秀杰 DTU 管设备、XiuAdmin 提供中后台底座。按业务域拆开,每一块都在生产环境跑过。
</p>
</header>
<div class="p-grid p-grid--3">
<div v-for="line in productLines" :key="line.id" class="p-card pf-card">
<h3 class="p-card-title pf-name">{{ line.name }}</h3>
<p class="pf-tagline">{{ line.tagline }}</p>
<ul class="pf-list">
<li v-for="f in line.features" :key="f">{{ f }}</li>
</ul>
<a :href="line.page" class="pf-more">功能详情 →</a>
</div>
</div>
</div>
</section>
<!-- 核心能力 -->
<section class="p-section p-section--alt" id="core">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">CORE CAPABILITIES</span>
<h2 class="p-title">核心能力:凭什么用得稳</h2>
<p class="p-desc">
功能列表谁都能写。这些是真正决定能不能上线、好不好维护的部分。按产品切换查看。
</p>
</header>
<CapabilityTabs source="home" />
</div>
</section>
<!-- 界面预览 -->
<section class="p-section" id="preview">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">SCREENSHOTS</span>
<h2 class="p-title">界面预览</h2>
<p class="p-desc">
管理端与用户端的实际界面。功能项远不止这些,完整清单见各项目详情页与文档站。
</p>
</header>
<ScreenshotPreview />
</div>
</section>
<!-- 通用能力底座 -->
<section class="p-section p-section--alt">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">FOUNDATION</span>
<h2 class="p-title">三个项目共享同一套工程底座</h2>
<p class="p-desc">
不是各自为战的三个仓库。技术栈、部署方式、权限模型与文档规范保持一致,
学会一个就大致知道另外两个怎么用。
</p>
</header>
<div class="p-grid p-grid--3">
<div v-for="(f, i) in foundations" :key="f.title" class="p-card">
<span class="p-card-index">{{ String(i + 1).padStart(2, '0') }}</span>
<h3 class="p-card-title">{{ f.title }}</h3>
<p class="p-card-text">{{ f.text }}</p>
</div>
</div>
</div>
</section>
<!-- 组合方式 -->
<section class="p-section">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">HOW THEY FIT</span>
<h2 class="p-title">三者可以单独用,也可以拼起来用</h2>
<p class="p-desc">按你的业务起点选一个入口,需要时再引入其它两个。</p>
</header>
<div class="p-steps">
<div class="p-step">
<span class="p-step-num">场景一</span>
<h3>只做物联网卡管理</h3>
<p>直接部署 iotLCM。它自带管理端与用户端,运营商协议内置,不需要额外组件。</p>
<code>cd iotlcm/deploy && docker compose up -d</code>
</div>
<div class="p-step">
<span class="p-step-num">场景二</span>
<h3>要管硬件设备</h3>
<p>部署秀杰 DTU。卡 + 设备的组合场景,两个平台可并存,数据各自独立。</p>
<code>cd xiu-dtu && 按 README 初始化</code>
</div>
<div class="p-step">
<span class="p-step-num">场景三</span>
<h3>自建业务系统</h3>
<p>以 XiuAdmin 作底座。租户、权限、代码生成、定时任务开箱可用,专注写业务。</p>
<code>从 xiu-admin 拉分支开始</code>
</div>
</div>
</div>
</section>
<!-- 官方文档 -->
<section class="p-section p-section--alt" id="docs">
<div class="p-wrap">
<header class="p-head">
<span class="p-eyebrow">DOCUMENTATION</span>
<h2 class="p-title">官方文档</h2>
<p class="p-desc">
使用手册、部署手册与接口合同随平台一起发布,与代码同仓维护。
下面是各册入口,点击直接跳转。
</p>
</header>
<div class="p-grid p-grid--3 doc-grid">
<a
v-for="d in docs"
:key="d.name"
:href="d.url"
class="p-card doc-card"
:target="d.url.startsWith('http') ? '_blank' : undefined"
:rel="d.url.startsWith('http') ? 'noopener' : undefined"
>
<div class="doc-top">
<h3 class="p-card-title">{{ d.name }}</h3>
<svg class="doc-arrow" width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M5 11L11 5M11 5H6M11 5v5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<p class="p-card-text">{{ d.desc }}</p>
<span class="doc-project">{{ d.project }}</span>
</a>
</div>
<p class="doc-note">
文档站地址:<a :href="DOCS_HOME" target="_blank" rel="noopener">{{ DOCS_HOME }}</a>
</p>
</div>
</section>
<!-- CTA -->
<section class="p-cta">
<div class="p-wrap">
<h2 class="p-title">从源码开始,不依赖任何商业授权</h2>
<p class="p-desc">全部项目以 Apache-2.0 发布,可自由使用、修改、商用与再分发。</p>
<div class="p-hero-actions">
<a class="p-btn p-btn--primary" href="/projects/">开始浏览项目</a>
<a class="p-btn p-btn--ghost" href="/about">许可证与贡献</a>
</div>
</div>
</section>
</div>
</template>