# Layout结构优化设计文档 **日期**: 2026-03-30 **项目**: 物业缴费管理系统后台 **目标**: 优化现有layout布局,改为左右结构,白色主题风格 ## 1. 项目背景 当前系统使用UmiJS + Ant Design Pro Layout,采用`mix`混合布局模式。需要优化为更现代、清晰的左右分栏布局,以白色为主色调,提升用户体验。 ## 2. 需求概述 ### 2.1 布局结构要求 - **左侧区域**(垂直分割): - 上方:Logo区域(Logo + 项目名称) - 下方:导航菜单 - **右侧区域**(垂直分割): - 上方:Header(用户信息、操作按钮) - 下方:页面内容区域 ### 2.2 功能要求 - 侧边栏固定宽度220px,支持折叠收起(折叠至64px) - Logo区域智能显示:展开时显示Logo+文字,折叠时仅显示Logo - 白色为主色调,整体风格干净整洁 - 保持现有菜单权限系统不变 - 响应式设计支持 ## 3. 设计方案 ### 3.1 整体架构 ``` ┌─────────────────────────────────────────────────────┐ │ Layout (side mode) │ │ ┌──────────┬─────────────────────────────────────┐ │ │ │ │ Header (64px, white background) │ │ │ │ Left │ ┌───────────────────────────────┐ │ │ │ │ Sidebar │ │ 用户信息区 + 操作按钮 │ │ │ │ │ │ └───────────────────────────────┘ │ │ │ │ ┌──────┐│ ┌───────────────────────────────┐ │ │ │ │ │ Logo ││ │ │ │ │ │ │ │+Text ││ │ 页面内容区域 │ │ │ │ │ │64px ││ │ (children渲染) │ │ │ │ │ ├──────┤│ │ padding: 24px │ │ │ │ │ │ Menu ││ │ │ │ │ │ │ │ ││ │ │ │ │ │ │ └──────┘│ └───────────────────────────────┘ │ │ │ └──────────┴─────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘ ``` ### 3.2 侧边栏设计(左侧) #### Logo区域 - **高度**: 64px - **背景色**: `#ffffff` - **边框**: 底部 1px solid `#f0f0f0` - **展开状态**: Logo图标(32px) + 项目名称文字 - **折叠状态**: 仅显示Logo图标,居中显示 - **动画**: 平滑过渡 200ms #### 菜单区域 - **背景色**: `#ffffff` - **菜单项高度**: 40px - **菜单文字颜色**: - 默认: `#595959` - 悬停: `#1890ff` - 激活: `#1890ff` (背景 `#e6f7ff`) - **图标颜色**: 跟随文字颜色 - **层级缩进**: 每级 20px - **激活指示器**: 左侧蓝色竖线 3px宽 #### 配置参数 ```typescript siderWidth: 220, collapsedWidth: 64, breakpoint: 'lg', collapsible: true ``` ### 3.3 Header设计(右侧上方) #### 布局规格 - **高度**: 64px - **背景色**: `#ffffff` - **边框**: 底部 1px solid `#f0f0f0` - **内边距**: 0 24px - **布局**: flex左右分布 #### 内容区域 **左侧区域**(可选): - 面包屑导航或页面标题 **右侧区域**: - 用户头像(32px圆形) - 用户名(悬停显示下拉菜单) - 下拉菜单项: - 个人资料 - 修改密码 - 退出登录 ### 3.4 内容区域设计(右侧下方) #### 容器规格 - **背景色**: `#f5f5f5` - **内边距**: 24px - **最小高度**: `calc(100vh - 64px)` #### 页面内容(可选包裹) 如果需要卡片包裹: - **背景色**: `#ffffff` - **圆角**: 8px - **阴影**: `0 1px 2px 0 rgba(0, 0, 0, 0.03)` - **内边距**: 24px ### 3.5 颜色主题规范 #### 主色调 - 主色: `#1890ff` - 成功: `#52c41a` - 警告: `#faad14` - 错误: `#ff4d4f` - 信息: `#1890ff` #### 中性色 - 标题文字: `#262626` - 正文文字: `#595959` - 次要文字: `#8c8c8c` - 禁用文字: `#bfbfbf` - 边框: `#d9d9d9` - 分割线: `#f0f0f0` #### 背景色 - 布局背景: `#f5f5f5` - 侧边栏: `#ffffff` - Header: `#ffffff` - 内容卡片: `#ffffff` ### 3.6 字体规范 - **字号**: 14px(基准) - **行高**: 1.5715 - **字体族**: `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial` ### 3.7 交互和动画 #### 侧边栏折叠 - **动画时长**: 200ms - **动画曲线**: `cubic-bezier(0.645, 0.045, 0.355, 1.000)` - **折叠时**: - Logo文字淡出 - 菜单文字隐藏,图标居中 - Tooltip显示完整菜单项文字 - **展开时**: - Logo文字淡入 - 菜单文字从左侧滑入 #### 菜单交互 - 悬停效果:背景色变化 0.2s - 子菜单展开:平滑动画 - 激活状态:左侧蓝色竖线指示器 #### Header交互 - 下拉菜单:淡入动画 - 按钮悬停:背景色变化 ## 4. 技术实现 ### 4.1 核心配置修改 修改 `src/common/libs/umi/layoutConfig.tsx`: ```typescript export const LayoutConfig: RuntimeConfig['layout'] = () => { return { // 从 'mix' 改为 'side' layout: 'side', title: '物业管理系统', logo: false, // 禁用默认logo,使用自定义 // 侧边栏配置 siderWidth: 220, collapsedWidth: 64, breakpoint: 'lg', // 主题token配置 token: { bgLayout: '#f5f5f5', header: { colorBgHeader: '#ffffff', colorHeaderTitle: '#262626', colorTextRightActionsItem: '#595959', heightLayoutHeader: 64, }, sider: { colorMenuBackground: '#ffffff', colorMenuText: '#595959', colorMenuTextSelected: '#1890ff', colorMenuItemBgSelected: '#e6f7ff', colorMenuDivider: '#f0f0f0', }, }, // 自定义Header渲染 headerRender: (props) => { return ; }, // 自定义Logo渲染 logoRenderer: (collapsed) => { return ; }, // 菜单配置保持不变 menu: { params: snap.session.permissions, request: async () => { // 现有菜单权限逻辑 }, }, // 其他配置保持不变 avatarProps: { render: () => , }, }; }; ``` ### 4.2 新增组件 #### CustomHeader.tsx ```typescript import { Layout, Dropdown, Avatar } from 'antd'; import type { MenuProps } from 'antd'; const { Header } = Layout; export const CustomHeader = (props: any) => { const menuItems: MenuProps['items'] = [ { key: 'profile', label: '个人资料' }, { key: 'password', label: '修改密码' }, { type: 'divider' }, { key: 'logout', label: '退出登录' }, ]; return (
{/* 左侧:面包屑或页面标题 */}
{/* 可选:面包屑导航 */}
{/* 右侧:用户信息 */}
); }; ``` #### CustomLogo.tsx ```typescript import { MyIcons } from '@/common'; export const CustomLogo = ({ collapsed }: { collapsed: boolean }) => { return (
{/* Logo图标或图片 */}
{!collapsed && (
物业管理系统
)}
); }; ``` ### 4.3 样式文件 在 `src/global.less` 或组件内部添加: ```less .custom-header { display: flex; justify-content: space-between; align-items: center; padding: 0 24px; background: #ffffff; border-bottom: 1px solid #f0f0f0; .header-left { flex: 1; } .header-right { display: flex; align-items: center; gap: 16px; } } .custom-logo { display: flex; align-items: center; height: 64px; padding: 0 16px; border-bottom: 1px solid #f0f0f0; transition: all 0.2s; .logo-icon { font-size: 32px; min-width: 32px; } .logo-text { margin-left: 12px; font-size: 16px; font-weight: 600; color: #262626; white-space: nowrap; opacity: 1; transition: opacity 0.2s; } } ``` ## 5. 实施计划 ### 5.1 实施步骤 1. 备份当前 `layoutConfig.tsx` 文件 2. 修改 layout 模式:`'mix'` → `'side'` 3. 更新 token 配置为白色主题 4. 创建 `CustomHeader.tsx` 组件 5. 创建 `CustomLogo.tsx` 组件 6. 在 `layoutConfig.tsx` 中集成自定义组件 7. 测试侧边栏折叠/展开功能 8. 测试菜单导航和权限控制 9. 测试响应式布局 10. 调整细节样式和动画 ### 5.2 文件修改清单 **需要修改**: - `src/common/libs/umi/layoutConfig.tsx` - 主要配置修改 **需要新建**: - `src/common/components/layout/CustomHeader.tsx` - `src/common/components/layout/CustomLogo.tsx` **可能修改**: - `src/global.less` - 全局样式调整 **无需修改**: - 菜单权限逻辑(`loopMenu` 函数) - 用户信息组件(`AvatarProps`) - 页面路由和业务组件 - `src/app.tsx` 配置 ### 5.3 兼容性保证 **保持不变的功能**: - ✅ 菜单权限系统 - ✅ 用户登录状态 - ✅ 路由跳转逻辑 - ✅ 页面内容渲染 - ✅ 现有业务组件 **优化改进的功能**: - 🎨 布局结构和视觉风格 - 🎨 主题色和配色方案 - 🎨 交互体验和动画效果 ## 6. 测试要点 ### 6.1 功能测试 - [ ] 侧边栏折叠/展开正常工作 - [ ] 菜单项点击导航正确 - [ ] 菜单激活状态正确显示 - [ ] 用户信息下拉菜单功能正常 - [ ] 所有页面路由可正常访问 ### 6.2 样式测试 - [ ] 白色主题在所有页面正常显示 - [ ] Logo展开/折叠切换流畅 - [ ] 菜单悬停和激活状态样式正确 - [ ] Header样式和布局正确 - [ ] 内容区域内边距和背景正确 ### 6.3 响应式测试 - [ ] 桌面端(>1024px)显示正常 - [ ] 平板端(768px-1024px)显示正常 - [ ] 移动端(<768px)侧边栏自动收起 - [ ] 各断点下布局无错位 ### 6.4 兼容性测试 - [ ] 表单页面显示正常 - [ ] 表格页面显示正常 - [ ] 弹窗和抽屉组件正常 - [ ] 现有业务功能无异常 ## 7. 风险和注意事项 ### 7.1 潜在风险 - **样式冲突**: Ant Design版本升级可能导致样式变化 - **浏览器兼容**: CSS动画在旧浏览器可能不支持 - **性能影响**: 过多动画可能影响低端设备性能 ### 7.2 缓解措施 - 在主流浏览器中测试(Chrome, Firefox, Safari, Edge) - 使用CSS `@supports`检测动画支持 - 优化动画性能,使用 `transform` 和 `opacity` - 提供关闭动画的选项(如果需要) ### 7.3 回滚方案 - 保留原 `layoutConfig.tsx` 备份 - 使用git版本控制,可随时回退 - 分阶段发布,先在测试环境验证 ## 8. 后续优化建议 ### 8.1 短期优化 - 添加暗色模式切换(可选) - 优化移动端触摸体验 - 添加快捷键支持 ### 8.2 长期优化 - 考虑使用ProLayout替代UmiJS Layout(如需要更多功能) - 添加主题定制功能 - 实现布局配置持久化(记住用户的折叠状态等) ## 9. 验收标准 项目完成需满足以下标准: 1. ✅ 布局结构符合设计要求(左右分栏) 2. ✅ 侧边栏可正常折叠和展开 3. ✅ 白色主题在所有页面正确显示 4. ✅ 菜单权限系统正常工作 5. ✅ 所有页面路由和功能无异常 6. ✅ 响应式布局在不同设备正常 7. ✅ 交互动画流畅自然 8. ✅ 通过所有测试要点 ## 10. 附录 ### 10.1 参考文档 - [UmiJS Layout配置](https://umijs.org/docs/max/layout-menu) - [Ant Design Layout组件](https://ant.design/components/layout-cn) - [Ant Design 主题定制](https://ant.design/docs/react/customize-theme-cn) ### 10.2 设计原则 - **简洁**: 去除不必要的装饰和元素 - **一致**: 保持整体风格统一 - **高效**: 快速加载和响应 - **易用**: 直观的交互和导航