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

496 lines
11 KiB
Markdown
Raw Normal View History

# 主框架页面设计规范
> 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