feat(frontend): 实现仪表盘和子系统导航

页面:
- views/dashboard/Index.vue,首页仪表盘(资源大盘、集群拓扑、最近任务)
- views/subsystem/Navigation.vue,子系统导航页(6 个卡片网格展示)

组件:
- components/SubsystemCard.vue,子系统卡片组件(图标、名称、状态、SSO 跳转)

API:
- api/subsystem.ts,子系统相关接口(获取列表、SSO URL)

子系统:Wayne、CloudDM、CacheCloud、Apollo、qpass、Grafana
This commit is contained in:
2026-07-14 15:39:44 +08:00
parent a4a0f84bf4
commit 35e626971c
4 changed files with 692 additions and 0 deletions
@@ -0,0 +1,58 @@
<template>
<div>
<div class="page-head">
<div>
<h1>子系统导航</h1>
<p>统一 LDAP 账号,点击即用免二次登录(同账号同密码)</p>
</div>
</div>
<div class="ext-grid">
<SubsystemCard
v-for="system in subsystems"
:key="system.id"
:system="system"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { subsystemApi, type Subsystem } from '@/api/subsystem'
import SubsystemCard from '@/components/SubsystemCard.vue'
const subsystems = ref<Subsystem[]>([])
onMounted(async () => {
const { data } = await subsystemApi.getSubsystems()
subsystems.value = data
})
</script>
<style scoped>
.page-head {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin-bottom: 18px;
}
.page-head h1 {
font-size: 19px;
margin: 0 0 4px;
font-weight: 700;
letter-spacing: 0.2px;
}
.page-head p {
margin: 0;
color: var(--text-dim);
font-size: 12.5px;
}
.ext-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 14px;
}
</style>