# System-Info 页面 Sider/SubSider 不显示 - 诊断报告

## ✅ 检查清单结果

按照 ADMIN_SIDEBAR_COMPLETE_GUIDE.md 的标准进行诊断：

### 1️⃣ 文件配置 - ✅ 通过

- ✅ 文件位置正确: `pages/mall/admin/maintain/system-info.uvue`
- ✅ 编码正确: UTF-8 without BOM
- ✅ SFC 结构正确: `<template>` → `<script>` → `<style>`
- ✅ 导入了 AdminLayout

### 2️⃣ 路由配置 - ✅ 通过

**pages.json (line 603)**:

```json
{
  "path": "maintain/system-info",
  "style": {
    "navigationBarTitleText": "系统信息",
    "navigationStyle": "custom"
  }
}
```

- ✅ `navigationStyle: "custom"` 正确
- ✅ `path` 与文件匹配

### 3️⃣ 菜单配置 - ❌ 关键问题发现！

**menu.uts (line 724-729)**:

```typescript
{
  id: 'system-info',
  title: '系统信息',
  path: '/pages/mall/admin/maintain/system-info',
  children: []
}
```

**❌ 问题**:

- `system-info` 定义为**菜单项本身**，不是一个 MenuGroup
- 它应该是某个一级菜单（如 'maintain'）下的 **二级组（group）**
- 当前结构：顶级数组中的菜单项 → 没有任何分组

**对比工作正常的结构**:

```typescript
// refresh-cache 的结构（工作正常）
{
  id: 'maintain',  // ← 一级菜单
  title: '维护',
  groups: [
    {
      id: 'security-maintain',  // ← 二级组
      title: '安全维护',
      children: [
        {
          id: 'security-refresh-cache',  // ← 三级菜单
          title: '刷新缓存',
          path: '/pages/mall/admin/maintain/security/refresh-cache'
        }
      ]
    }
  ]
}
```

### 4️⃣ 页面文件 - ✅ 通过

```uvue
<AdminLayout currentPage="system-info">
  <!--  页面内容 -->
</AdminLayout>
```

- ✅ `currentPage="system-info"` 设置正确

---

## 🔍 根本原因分析

### 为什么没有 Sider/SubSider？

根据 AdminLayout.uvue 的计算逻辑：

```typescript
const activeGroups = computed(() => {
  const m = menuList.value.find((it) => it.id === activeMenuId.value);
  return m?.groups ?? []; // ← 从菜单项中获取 groups 数组
});
```

**流程追踪**:

1. `currentPage="system-info"`
2. nav.uts 的 `findActiveByCurrentPage()` 无法匹配（因为 system-info 不在任何一级菜单的 groups 中）
3. **降级到默认**: `{ activeMenuId: 'home', activeSubId: '' }`
4. `activeGroups` 获取的是 'home' 菜单的 groups（为空）
5. **条件判断失败**: `v-if="activeGroups.length > 0"` → SubSider 不显示！

---

## 🛠️ 诊断步骤

### 第一步：验证菜单配置

**menu.uts 中检查 maintain 菜单**:

```typescript
{
  id: 'maintain',
  title: '维护',
  icon: '/static/maintain.svg',
  groups: [
    // ... 其他组 ...
    {
      id: 'system-info',  // ← 必须确保 system-info 在 groups 数组中
      title: '系统信息',
      path: '/pages/mall/admin/maintain/system-info',
      children: []
    }
  ]
}
```

**检查清单**:

- [ ] `system-info` 在 `maintain.groups` 数组中
- [ ] `system-info.id === 'system-info'`
- [ ] `system-info.path` 正确
- [ ] `system-info.children` 设置为 `[]`

### 第二步：在浏览器中运行诊断脚本

打开浏览器 DevTools (F12)，在 Console 标签中粘贴运行:

```javascript
// 复制 debug-runtime-status.js 的内容到控制台
```

**关键输出指标**:

- `activeMenuId` 应该是 `"maintain"`（不是 `"home"`）
- `activeSubId` 应该是 `"system-info"`
- `activeGroups` 应该有长度 > 0
- `.sub-sider` DOM 应该存在且 `display !== 'none'`

### 第三步：验证 nav.uts 匹配逻辑

运行导航测试脚本:

```powershell
node test-system-info-nav.js
```

**预期输出**:

```
✅ PASS - 正确匹配到 maintain/system-info
```

如果显示 `maintain/system-info` 匹配失败，说明菜单配置有问题。

---

## 🛠️ 可能的根本原因

### 原因 1: system-info 在错误的位置

❌ **错误** - 顶级菜单项（没有分组）:

```typescript
// menuList 的顶层
[
  { id: 'home', ... },
  { id: 'system-info', ... },  // ← 错误位置！
  { id: 'maintain', groups: [...] }
]
```

✅ **正确** - maintain 菜单的 groups 内:

```typescript
{
  id: 'maintain',
  groups: [
    { id: 'system-info', ... }  // ← 正确位置
  ]
}
```

### 原因 2: nav.uts 未正确检查 group 叶子节点

**必须包含此逻辑**:

```typescript
for (const g of groups) {
  // ⚠️ 关键：先检查 group 本身
  if (g.id === page) {
    return { activeMenuId: m.id, activeSubId: g.id };
  }
  if (g.path && normalize(g.path) === pageNorm) {
    return { activeMenuId: m.id, activeSubId: g.id };
  }
  // 然后才检查 children
  const cs = g.children ?? [];
  // ...
}
```

### 原因 3: AdminLayout 未正确同步状态

**必须在多个生命周期调用 syncActiveByCurrentPage**:

```typescript
watch(
  () => props.currentPage,
  () => syncActiveByCurrentPage(),
  { immediate: true },
);
onMounted(() => syncActiveByCurrentPage());
onShow(() => syncActiveByCurrentPage());
```

---

## 🔧 修复方案

根据诊断结果选择以下方案之一:

**方案 A: 如果 nav 测试失败**
→ 修复 menu.uts，确保 system-info 在 maintain.groups 中

**方案 B: 如果 nav 测试通过但 subsider 仍不显示**
→ 检查浏览器 Vue DevTools:

- activeMenuId 是否为 "maintain"
- activeSubId 是否为 "system-info"
- activeGroups 是否有内容

**方案 C: 如果一切看起来都正确**
→ 清理缓存:

```powershell
Remove-Item -Recurse -Force unpackage\dist
Remove-Item -Recurse -Force .hbuilderx\cache
npm run dev:h5
# 浏览器: Ctrl+Shift+Delete 清理，Ctrl+Shift+R 强制刷新
```

---

## 📊 对比表

| 项目          | system-info (❌ 当前) | refresh-cache (✅ 工作)      |
| ------------- | --------------------- | ---------------------------- |
| 菜单结构      | 顶级菜单项            | 一级 > 二级组 > 三级         |
| 所属分组      | 无                    | maintain > security-maintain |
| nav 匹配结果  | home (默认)           | maintain                     |
| activeGroups  | [] (empty)            | security-maintain's children |
| SubSider 显示 | ❌ 隐藏               | ✅ 显示                      |

---

## ✨ 修复步骤

1. **编辑 menu.uts**
   - 找到 `system-info` 菜单项（line 724-729）
   - 删除或修改它
   - 将其添加到 `maintain` > `groups` 中（建议在最后）

2. **验证菜单 ID 一致性**
   - `menu.uts` 中: `id: 'system-info'`
   - `system-info.uvue` 中: `currentPage="system-info"`
   - ✅ 保持一致

3. **清理缓存**

   ```powershell
   Remove-Item -Recurse -Force unpackage\dist
   Remove-Item -Recurse -Force .hbuilderx\cache
   ```

4. **重启开发服务器 & 清理浏览器缓存**
   - Ctrl+Shift+Delete 清理浏览器
   - Ctrl+Shift+R 强制刷新

---

## 📌 关键学习点

根据 ADMIN_SIDEBAR_COMPLETE_GUIDE.md:

> **第二部分 2.1**: 菜单必须遵循以下结构之一：
>
> - 选项 A: 有子菜单的菜单组（**推荐**）
> - 选项 B: 没有子菜单的菜单组（叶子节点）
>
> **关键**: 子菜单项必须在某个一级菜单的 `groups` 数组内

system-info 当前的结构违反了这一原则，它被定义为顶级菜单项，而不是某个分组下的项。
