feat(subsystem): 子系统导航增加可展开子 Tab 与详情页
- AppSidebar: 统一入口组下子系统导航改为可展开列表,展示 6 个子系统子 Tab - 每个子 Tab 带功能描述前缀(如 多集群发布平台 Wayne)便于用户定位 - 新建 SubsystemDetail.vue 统一详情模板(统计卡片 + 门户卡片 + 打开按钮) - 新增路由 /subsystem/detail/:name - subsystem API mock 数据补充 label、domain、category 字段 - SubsystemCard 概览卡片同步显示 label + name 格式
This commit is contained in:
@@ -35,9 +35,28 @@
|
||||
</div>
|
||||
<div class="nav-group">
|
||||
<div class="nav-label">统一入口</div>
|
||||
<router-link to="/subsystem" class="nav-item" active-class="active">
|
||||
<span class="ic">↗</span>子系统导航
|
||||
</router-link>
|
||||
<div class="nav-item nav-expand" :class="{ active: isPortalActive }">
|
||||
<router-link to="/subsystem" class="expand-label">
|
||||
<span class="ic">↗</span>子系统导航
|
||||
</router-link>
|
||||
<span class="expand-toggle" @click="portalExpanded = !portalExpanded">
|
||||
{{ portalExpanded ? '▾' : '▸' }}
|
||||
</span>
|
||||
</div>
|
||||
<div v-show="portalExpanded" class="nav-children">
|
||||
<router-link
|
||||
v-for="sys in subsystems"
|
||||
:key="sys.name"
|
||||
:to="`/subsystem/detail/${sys.name.toLowerCase()}`"
|
||||
class="nav-item nav-child"
|
||||
active-class="active"
|
||||
>
|
||||
<span class="child-dot" :style="{ background: dotColor(sys.icon) }"></span>{{ sys.label }} {{ sys.name }}
|
||||
</router-link>
|
||||
<router-link to="/subsystem" class="nav-item nav-child" active-class="active">
|
||||
<span class="ic" style="font-size:12px;">▦</span>全部总览
|
||||
</router-link>
|
||||
</div>
|
||||
<router-link to="/subsystem/authz" class="nav-item" active-class="active">
|
||||
<span class="ic">▦</span>子系统赋权
|
||||
</router-link>
|
||||
@@ -58,6 +77,36 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
const route = useRoute()
|
||||
const portalExpanded = ref(true)
|
||||
|
||||
const subsystems = [
|
||||
{ name: 'Wayne', label: '多集群发布平台', icon: 'W' },
|
||||
{ name: 'CloudDM', label: 'SQL 审核平台', icon: 'DM' },
|
||||
{ name: 'CacheCloud', label: 'Redis 管理平台', icon: 'CC' },
|
||||
{ name: 'Apollo', label: '配置中心', icon: 'AP' },
|
||||
{ name: 'qpass', label: '七牛统一运维平台', icon: 'QP' },
|
||||
{ name: 'Grafana', label: '指标可视化平台', icon: 'GF' },
|
||||
]
|
||||
|
||||
const isPortalActive = computed(() => {
|
||||
return route.path.startsWith('/subsystem/detail/') || route.path === '/subsystem'
|
||||
})
|
||||
|
||||
function dotColor(icon: string): string {
|
||||
const colors: Record<string, string> = {
|
||||
W: 'var(--tag-blue-text)',
|
||||
DM: 'var(--tag-green-text)',
|
||||
CC: 'var(--err)',
|
||||
AP: 'var(--tag-blue-text)',
|
||||
QP: 'var(--tag-amber-text)',
|
||||
GF: 'var(--warn)',
|
||||
}
|
||||
return colors[icon] || 'var(--text-dim)'
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@@ -117,6 +166,10 @@
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.nav-item.active .expand-label {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.nav-item .badge {
|
||||
margin-left: auto;
|
||||
font-family: var(--mono);
|
||||
@@ -142,4 +195,50 @@
|
||||
color: var(--text-dim);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.nav-expand {
|
||||
justify-content: flex-start;
|
||||
padding: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.expand-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
flex: 1;
|
||||
padding: 10px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.expand-toggle {
|
||||
padding: 10px;
|
||||
font-size: 12px;
|
||||
opacity: 0.6;
|
||||
cursor: pointer;
|
||||
border-radius: 0 6px 6px 0;
|
||||
}
|
||||
|
||||
.expand-toggle:hover {
|
||||
opacity: 1;
|
||||
background: var(--bg-panel-2);
|
||||
}
|
||||
|
||||
.nav-children {
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
.nav-child {
|
||||
padding: 7px 10px 7px 26px;
|
||||
font-size: 14px;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.child-dot {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
{{ system.icon }}
|
||||
</div>
|
||||
<div>
|
||||
<h4>{{ system.name }}</h4>
|
||||
<div class="ext-sub">{{ system.description }}</div>
|
||||
<h4>{{ system.label }} {{ system.name }}</h4>
|
||||
<div class="ext-sub">{{ system.domain }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>{{ description }}</p>
|
||||
<p>{{ system.description }}</p>
|
||||
<div class="sso-row">
|
||||
<span class="sso-dot" :class="{ warn: system.status === 'integrating' }"></span>
|
||||
{{ system.status === 'integrated' ? 'LDAP 原生配置接入 · 零代码' : 'LDAP 接入改造中' }}
|
||||
@@ -49,18 +49,6 @@ const iconColor = computed(() => {
|
||||
return colors[props.system.icon] || 'var(--text-mid)'
|
||||
})
|
||||
|
||||
const description = computed(() => {
|
||||
const descs: Record<string, string> = {
|
||||
Wayne: '业务容器发布、命名空间与配额管理,复用 Wayne 原生多租户能力。',
|
||||
CloudDM: '数据库 SQL 上线统一审核,支持 LDAP 用户组到角色的自动映射。',
|
||||
CacheCloud: 'Redis 实例全生命周期管理,登录与监控运维统一入口。',
|
||||
Apollo: '统一配置管理,按机房 Cluster 隔离,支持灰度发布、版本回滚与变更审计。',
|
||||
qpass: '夜莺、Zabbix、VictoriaMetrics 告警统一收敛与值班通知,按 P0/P1 分级推送。',
|
||||
Grafana: '对接 VictoriaMetrics 数据源,K8s / 容器 / 业务指标统一仪表盘展示。',
|
||||
}
|
||||
return descs[props.system.name] || ''
|
||||
})
|
||||
|
||||
const handleClick = async () => {
|
||||
if (props.system.sso_enabled) {
|
||||
const { data } = await subsystemApi.getSSOUrl(props.system.id)
|
||||
|
||||
Reference in New Issue
Block a user