Files
website/.vitepress/theme/components/HomePage.vue
T
Dai0814 ea47bab100
mirror-to-gitee / mirror (push) Successful in 4s
style(portal): 核心能力改为深色强调区块,并前移到产品功能之前
用户反馈"上方没有核心能力重点突出"。原因是原实现里
核心能力用的是 p-section--alt(浅灰底),而它相邻的产品功能是白底、
项目列表也是浅灰底,三者色阶接近,深色上没有形成视觉断点,
区块在页面里读起来和普通段落没有区别。

改动
- 新增 .p-section--deep 变体:浅色主题下用 #0d1220 近黑底 +
  顶部靛蓝径向光晕 + 一道渐变高光线,卡片改半透明白
- 核心能力改用该变体,并从产品功能之后移到之前:
  项目 → 核心能力(深色)→ 产品功能 → 界面预览
  深色块夹在项目列表与产品功能之间,形成明显的节奏断点
- 产品功能改用 p-section--alt,与前后白底交替
- 暗色主题下强调区不能用"压深"(页面底已是 #0c0f16),
  改用 #161b2c 冷灰蓝 + 更强光晕,靠提亮形成层次

验证
- 构建 13 页,256 条引用 0 失效
- 浏览器实测区块顺序:hero → projects → core → features → preview
  → foundation → howtheyfit → docs → cta
- 浅色 / 暗色两套主题均截图核对,强调区都能跳出来
2026-11-04 14:34:53 +08:00

239 lines
9.1 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,
} 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">官方文档</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 p-section--deep" 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>
<div class="p-grid p-grid--4">
<div v-for="a in coreAbilities" :key="a.title" class="p-card ca-card">
<span class="ca-tag">{{ a.tag }}</span>
<h3 class="p-card-title">{{ a.title }}</h3>
<p class="p-card-text">{{ a.text }}</p>
</div>
</div>
</div>
</section>
<!-- 产品功能 -->
<section class="p-section p-section--alt" 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" 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="'http://open.5iot.com:5051/docs/'" target="_blank" rel="noopener">http://open.5iot.com:5051/docs/</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>