unis_sip/oms_web/docs/pages/main-layout.md

496 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 主框架页面设计规范
> Nex Design 主框架布局设计文档
## 概述
主框架页面是应用的基础布局结构,包含侧边菜单栏、顶部导航栏和内容区域。本文档详细说明了主框架的设计规范、交互逻辑和实现要点。
---
## 页面结构
```
┌─────────────────────────────────────────────────────┐
│ 顶部导航栏 (64px) │
├──────────┬──────────────────────────────────────────┤
│ │ │
│ 侧边栏 │ 内容区域 │
│ (200px) │ (可向下滚动) │
│ │ │
│ │ │
└──────────┴──────────────────────────────────────────┘
```
---
## 1. 侧边栏 (Sider)
### 1.1 基础规范
| 属性 | 展开状态 | 收起状态 |
|------|---------|---------|
| 宽度 | 200px | 64px |
| 背景色 | #001529 (深色) | #001529 |
| 位置 | 固定左侧 | 固定左侧 |
| 层级 | z-index: 10 | z-index: 10 |
### 1.2 Logo 区域
**设计规范**
- 高度64px
- 背景rgba(255, 255, 255, 0.05)
- 底部边框1px solid rgba(255, 255, 255, 0.05)
- 内边距12px 16px
- 对齐:居中
**展开状态**
- 显示完整 Logologo-full.png
- Logo 高度40px宽度自适应
**收起状态**
- 显示方形 Logologo-small.png
- Logo 尺寸40px × 40px
- 圆角8px
### 1.3 菜单系统
#### 菜单层级
支持**两级菜单**结构:
- **一级菜单**:带图标,可展开/收起
- **二级菜单**:文字列表,可带徽章标识
#### 菜单数据格式
```json
[
{
"key": "overview",
"label": "概览",
"icon": "DashboardOutlined",
"path": "/overview"
},
{
"key": "certificate",
"label": "证书管理",
"icon": "SafetyCertificateOutlined",
"children": [
{
"key": "ssl-cert",
"label": "SSL证书管理",
"path": "/certificate/ssl"
}
]
}
]
```
#### 菜单状态
**正常状态**
- 背景色:透明
- 文字颜色rgba(255, 255, 255, 0.65)
**悬停状态**
- 背景色rgba(184, 23, 141, 0.2)
- 文字颜色:#fff
**选中状态**
- 背景色:#b8178d (品牌主色)
- 文字颜色:#fff
- 左侧边框3px solid #b8178d
**展开状态**
- 二级菜单背景rgba(0, 0, 0, 0.15)
- 二级菜单内边距:左侧 48px
#### 徽章系统
支持在菜单项上显示徽章标识:
- **HOT 徽章**
- 背景色:#ff4d4f (红色)
- 文字:白色
- 尺寸18px 高度,圆角 9px
- **NEW 徽章**
- 背景色:#52c41a (绿色)
- 文字:白色
- 尺寸18px 高度,圆角 9px
**注意**:收起状态下徽章自动隐藏。
#### 收起状态行为
- 仅显示一级菜单图标
- 鼠标悬停时不展开子菜单
- 点击跳转到该分类的默认页面
### 1.4 滚动条样式
```css
宽度:6px
轨道:透明
滑块:rgba(255, 255, 255, 0.2)
滑块悬停:rgba(255, 255, 255, 0.3)
圆角:3px
```
---
## 2. 顶部导航栏 (Header)
### 2.1 基础规范
| 属性 | 值 |
|------|---|
| 高度 | 64px |
| 背景色 | #ffffff |
| 阴影 | 0 1px 4px rgba(0, 21, 41, 0.08) |
| 位置 | stickytop: 0 |
| 层级 | z-index: 9 |
| 内边距 | 0 24px |
### 2.2 左侧区域
**折叠按钮**
- 图标尺寸18px
- 颜色rgba(0, 0, 0, 0.65)
- 悬停色:#b8178d (品牌主色)
- 悬停背景rgba(0, 0, 0, 0.03)
- 内边距8px
- 圆角4px
- 功能:切换侧边栏展开/收起状态
**工作台标识**
- 字号14px
- 字重500 (Medium)
- 颜色rgba(0, 0, 0, 0.88)
- 左侧间距16px
### 2.3 右侧区域
从左到右依次包含:
1. **搜索框**
- 宽度200px
- 高度32px
- 圆角16px (胶囊形)
- 占位文字:"搜索..."
- 前缀图标SearchOutlined
2. **帮助图标**
- 图标QuestionCircleOutlined
- 尺寸16px
- 颜色rgba(0, 0, 0, 0.65)
- 悬停色:#b8178d
3. **功能链接**ICP 备案、企业、支持)
- 字号14px
- 颜色rgba(0, 0, 0, 0.65)
- 悬停色:#b8178d
- 悬停背景rgba(0, 0, 0, 0.03)
- 内边距4px 8px
- 圆角4px
4. **工单图标**
- 图标SettingOutlined
- 样式同帮助图标
5. **消息中心**
- 图标BellOutlined
- 带徽章Badge count={5}
- 徽章位置右上角offset: [-3, 3]
- 徽章尺寸small
6. **用户信息**
- 头像32px × 32px 圆形
- 用户名14pxMedium 字重
- 颜色rgba(0, 0, 0, 0.88)
- 整体内边距4px 8px
- 悬停背景rgba(0, 0, 0, 0.03)
- 点击显示下拉菜单
**间距**:各元素之间间距 16-20px
---
## 3. 内容区域 (Content)
### 3.1 基础规范
| 属性 | 值 |
|------|---|
| 背景色 | #f5f5f5 |
| 内边距 | 24px |
| 高度 | calc(100vh - 64px) |
| 滚动 | overflow-y: auto |
### 3.2 内容容器
- 最大宽度:根据业务需求,建议 1200-1600px
- 内边距24px
- 背景色:根据内容类型,卡片为 #fff
### 3.3 滚动行为
- 仅内容区域可滚动
- 顶部导航栏和侧边栏保持固定
- 滚动条样式与全局一致
---
## 4. 响应式适配
### 4.1 断点规则
| 断点 | 行为 |
|------|------|
| < 768px | 侧边栏默认收起,通过遮罩层展开 |
| 768px | 侧边栏可正常展开/收起 |
| 1200px | 建议默认展开侧边栏 |
### 4.2 移动端优化
- 侧边栏改为抽屉模式 (Drawer)
- 顶部搜索框宽度减小或移至下拉菜单
- 功能链接收起至"更多"菜单
- 用户信息简化显示
---
## 5. 主题配色
### 5.1 品牌主色
基于 NEX Logo 的紫红色:
```css
--primary-color: #b8178d;
--primary-hover: #9c1477;
--primary-active: #801161;
```
### 5.2 辅助色
- **蓝色**(信息色):#1677ff
- **绿色**(成功):#52c41a
- **红色**(错误/警告):#ff4d4f
- **橙色**(警告):#faad14
### 5.3 中性色
```css
--text-primary: rgba(0, 0, 0, 0.88);
--text-secondary: rgba(0, 0, 0, 0.65);
--text-tertiary: rgba(0, 0, 0, 0.45);
--bg-primary: #ffffff;
--bg-secondary: #fafafa;
--bg-tertiary: #f5f5f5;
--border-color: #d9d9d9;
```
---
## 6. 交互规范
### 6.1 侧边栏折叠
**触发方式**
- 点击顶部折叠按钮
- 可选:在设置中保存用户偏好
**动画**
- 过渡时间:200ms
- 缓动函数:ease-in-out
- 影响元素:侧边栏宽度、Logo、菜单文字
**状态保持**
- 使用 localStorage 保存用户折叠状态
- 页面刷新后保持用户选择
### 6.2 菜单导航
**展开逻辑**
- 点击一级菜单展开/收起二级菜单
- 默认展开当前路由所在的菜单组
- 支持手风琴模式(可选)
**高亮逻辑**
- 根据当前路由自动高亮对应菜单项
- 二级菜单选中时,一级菜单也显示激活状态
**跳转方式**
- 使用 React Router 进行路由跳转
- 支持浏览器前进/后退
### 6.3 用户下拉菜单
**菜单项**
- 个人中心
- 账户设置
- 分割线
- 退出登录
**交互**
- 点击用户信息区域展开
- 点击菜单项执行对应操作
- 点击外部区域关闭
---
## 7. 代码实现
### 7.1 组件结构
```
MainLayout/
├── MainLayout.jsx # 主布局组件
├── MainLayout.css # 布局样式
├── AppSider.jsx # 侧边栏组件
├── AppSider.css # 侧边栏样式
├── AppHeader.jsx # 顶部栏组件
├── AppHeader.css # 顶部栏样式
└── index.js # 导出文件
```
### 7.2 菜单数据配置
菜单数据独立维护在 `src/constants/menuData.json`,便于更新和管理。
### 7.3 关键技术点
1. **状态管理**
- collapsed 状态通过 props 传递
- 菜单展开状态 (openKeys) AppSider 内部管理
2. **路由集成**
- 使用 useNavigate 进行路由跳转
- 使用 useLocation 获取当前路由
3. **图标映射**
- 通过 iconMap 对象将字符串转换为图标组件
4. **主题定制**
- src/main.jsx 中配置 Ant Design 主题
- 使用 ConfigProvider 包裹应用
---
## 8. 示例页面
### 8.1 概览页 (Overview)
作为主框架的示例页面,展示了:
- 统计卡片布局
- 图表展示
- 数据可视化
- 响应式栅格系统
详细设计见:[概览页设计文档](./overview.md)
---
## 9. 可访问性
### 9.1 键盘导航
- 支持 Tab 键在可交互元素间切换
- 支持 Enter 键激活菜单项
- 支持方向键在菜单间导航
### 9.2 语义化标签
- 使用 nav 标签包裹导航菜单
- 使用 header 标签包裹顶部栏
- 使用 main 标签包裹主内容区
### 9.3 对比度
- 所有文本与背景对比度 4.5:1
- 图标与背景对比度 3:1
---
## 10. 性能优化
### 10.1 懒加载
- 页面组件使用 React.lazy 懒加载
- 减少首屏加载时间
### 10.2 防抖优化
- 搜索框输入使用防抖处理
- 窗口大小变化使用节流处理
### 10.3 虚拟滚动
- 菜单项较多时考虑虚拟滚动
- 长列表使用虚拟化技术
---
## 11. 开发指南
### 11.1 添加新菜单
1. 编辑 `src/constants/menuData.json`
2. 添加菜单项配置
3. 如需新图标,在 `AppSider.jsx` iconMap 中添加映射
4. 创建对应的页面组件
5. `App.jsx` 中添加路由
### 11.2 自定义主题
1. 编辑 `src/main.jsx` 中的 theme 配置
2. 修改 `tailwind.config.js` 中的颜色系统
3. 更新 `src/styles/globals.css` 中的 CSS 变量
### 11.3 扩展功能
- 添加面包屑导航
- 添加页签 (Tabs) 功能
- 添加全局设置抽屉
- 添加主题切换(亮色/暗色)
---
## 12. 常见问题
### Q1: 如何修改侧边栏默认展开状态?
`MainLayout.jsx` 中修改 `collapsed` 的初始值:
```jsx
const [collapsed, setCollapsed] = useState(false) // false 为展开
```
### Q2: 如何添加三级菜单?
当前设计仅支持两级菜单。如需三级菜单,需要:
1. 修改 menuData.json 数据结构
2. 修改 AppSider.jsx 中的 getMenuItems 函数
3. 考虑 UI 空间和用户体验
### Q3: 如何实现菜单权限控制?
建议:
1. 在菜单数据中添加 `roles` `permissions` 字段
2. 在渲染菜单前根据用户权限过滤
3. 在路由层面也要做权限校验
---
## 版本记录
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0 | 2024-11-04 | 初始版本,完成主框架设计 |
---
**维护者**: Nex Design Team
**最后更新**: 2024-11-04