feat: 开源项目门户站首版(iotLCM / 秀杰 DTU / XiuAdmin 三项目,注册表驱动)

This commit is contained in:
技小云
2026-11-04 11:08:47 +08:00
committed by MiFaZhan
commit fe63dacae2
27 changed files with 3786 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
import { defineConfig } from 'vitepress'
import { projects } from '../data/projects'
/**
* 门户站构建配置
*
* SITE_BASE 由构建参数注入:
* - /www/ 过渡形态:挂在已有网关的 /www/ 路径下(没有独立域名时用)
* - / 独立域名形态:站点独占域名根路径
* 两者内容完全同源,只有资源前缀与路由前缀不同,所以用构建参数而不是改代码。
*/
const SITE_BASE = process.env.SITE_BASE ?? '/www/'
/** 代码仓组织(雪羊科技企业仓) */
const ORG_URL = process.env.ORG_URL ?? 'https://gitee.com/snowgoat'
/** 各项目的文档站地址(按项目 id 覆盖) */
const DOCS_URL: Record<string, string> = {
iotlcm: 'http://open.5iot.com:5051/docs/',
}
export default defineConfig({
srcDir: './pages',
base: SITE_BASE,
title: '雪羊科技开源',
description: '雪羊科技开源项目门户:物联网卡管理、DTU 设备管理、中后台开发框架',
lang: 'zh-CN',
cleanUrls: true,
lastUpdated: false,
head: [
['link', { rel: 'icon', type: 'image/svg+xml', href: `${SITE_BASE}favicon.svg` }],
],
themeConfig: {
nav: [
{ text: '首页', link: '/' },
{ text: '项目', link: '/projects/' },
{ text: '关于', link: '/about' },
],
sidebar: {
'/projects/': [
{
text: '项目',
collapsed: false,
items: projects.map((p) => ({ text: p.name, link: p.page })),
},
],
'/guide/': [
{
text: '门户',
collapsed: false,
items: [{ text: '门户部署', link: '/guide/portal-deploy' }],
},
],
},
socialLinks: [
{ icon: 'github', link: ORG_URL },
],
footer: {
message: '雪羊科技开源 · Apache-2.0',
copyright: 'Copyright © 雪羊科技',
},
search: {
provider: 'local',
},
outline: {
level: [2, 3],
label: '本页目录',
},
docFooter: {
prev: '上一页',
next: '下一页',
},
},
})
+111
View File
@@ -0,0 +1,111 @@
<script setup lang="ts">
import type { Project } from '../../../data/projects'
defineProps<{ project: Project }>()
</script>
<template>
<a :href="project.page" class="project-card">
<div class="project-card-head">
<h3>{{ project.name }}</h3>
<span class="project-status" :data-status="project.status">{{ project.status }}</span>
</div>
<p class="project-tagline">{{ project.tagline }}</p>
<p class="project-summary">{{ project.summary }}</p>
<ul class="project-tech">
<li v-for="t in project.tech" :key="t">{{ t }}</li>
</ul>
<div class="project-foot">
<span class="project-license">{{ project.license }}</span>
<span class="project-link">查看详情 →</span>
</div>
</a>
</template>
<style scoped>
.project-card {
display: block;
padding: 20px 22px;
border: 1px solid var(--vp-c-divider);
border-radius: 12px;
background: var(--vp-c-bg-soft);
color: var(--vp-c-text-1);
transition: border-color 0.2s, transform 0.2s;
}
.project-card:hover {
border-color: var(--vp-c-brand-1);
transform: translateY(-2px);
}
.project-card-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.project-card h3 {
margin: 0;
font-size: 20px;
border: none;
padding: 0;
}
.project-status {
flex: none;
font-size: 12px;
padding: 2px 10px;
border-radius: 999px;
border: 1px solid var(--vp-c-divider);
color: var(--vp-c-text-2);
}
.project-status[data-status='已发布'] {
border-color: var(--vp-c-brand-1);
color: var(--vp-c-brand-1);
}
.project-tagline {
margin: 8px 0 0;
font-weight: 600;
color: var(--vp-c-text-1);
}
.project-summary {
margin: 8px 0 0;
font-size: 14px;
line-height: 1.7;
color: var(--vp-c-text-2);
}
.project-tech {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin: 14px 0 0;
padding: 0;
list-style: none;
}
.project-tech li {
font-size: 12px;
padding: 2px 8px;
border-radius: 6px;
background: var(--vp-c-default-soft);
color: var(--vp-c-text-2);
}
.project-foot {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 16px;
font-size: 13px;
color: var(--vp-c-text-3);
}
.project-link {
color: var(--vp-c-brand-1);
}
</style>
@@ -0,0 +1,19 @@
<script setup lang="ts">
import { projects } from '../../../data/projects'
import ProjectCard from './ProjectCard.vue'
</script>
<template>
<div class="project-list">
<ProjectCard v-for="p in projects" :key="p.id" :project="p" />
</div>
</template>
<style scoped>
.project-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 16px;
margin: 24px 0 0;
}
</style>
+11
View File
@@ -0,0 +1,11 @@
import DefaultTheme from 'vitepress/theme'
import type { Theme } from 'vitepress'
import ProjectList from './components/ProjectList.vue'
export default {
extends: DefaultTheme,
enhanceApp({ app }) {
app.component('ProjectList', ProjectList)
},
} satisfies Theme