# 主框架页面设计规范 > 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 - 对齐:居中 **展开状态**: - 显示完整 Logo(logo-full.png) - Logo 高度:40px,宽度自适应 **收起状态**: - 显示方形 Logo(logo-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) | | 位置 | sticky,top: 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 圆形 - 用户名:14px,Medium 字重 - 颜色: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