diff --git a/oms_web/docs/DESIGN_COOKBOOK.md b/oms_web/docs/DESIGN_COOKBOOK.md
new file mode 100644
index 00000000..231a221c
--- /dev/null
+++ b/oms_web/docs/DESIGN_COOKBOOK.md
@@ -0,0 +1,607 @@
+# Nex Design 设计规范指南
+
+> 面向 React + Ant Design + Tailwind CSS 的前端设计语言规范
+
+## 目录
+
+- [概述](#概述)
+- [设计原则](#设计原则)
+- [颜色系统](#颜色系统)
+- [排版规范](#排版规范)
+- [间距系统](#间距系统)
+- [组件规范](#组件规范)
+- [布局规范](#布局规范)
+- [交互规范](#交互规范)
+- [响应式设计](#响应式设计)
+- [页面模板](#页面模板)
+
+---
+
+## 概述
+
+Nex Design 是为开发团队打造的一套标准化设计语言系统,旨在提供统一、高效、易维护的前端设计规范。
+
+### 技术栈
+
+- **框架**: React 18+
+- **组件库**: Ant Design 5.x
+- **样式方案**: Tailwind CSS 3.x
+- **包管理**: Yarn
+- **运行时**: Node.js 16+
+
+### 设计目标
+
+1. **一致性**: 确保所有页面和组件保持视觉与交互的一致性
+2. **高效性**: 提供可复用的设计模式,加快开发速度
+3. **可维护性**: 建立清晰的规范体系,降低维护成本
+4. **用户体验**: 优先考虑用户体验,打造直观易用的界面
+
+---
+
+## 设计原则
+
+### 1. 清晰明确
+界面设计应当清晰直观,避免歧义,让用户能够快速理解和操作。
+
+### 2. 一致性优先
+保持视觉、交互、用词的一致性,减少用户学习成本。
+
+### 3. 效率至上
+优化操作流程,减少用户的操作步骤,提高工作效率。
+
+### 4. 反馈及时
+对用户的每一个操作都应给予明确的反馈,包括成功、失败、加载等状态。
+
+### 5. 容错友好
+预防用户错误,在错误发生时提供清晰的提示和解决方案。
+
+---
+
+## 颜色系统
+
+### 主色调
+
+```css
+/* 品牌主色 - Primary (基于 NEX Logo 紫红色) */
+--primary-50: #fce7f6;
+--primary-100: #f5bae6;
+--primary-200: #ee8dd6;
+--primary-300: #e760c6;
+--primary-400: #e033b6;
+--primary-500: #b8178d; /* 主色 - 匹配 NEX Logo */
+--primary-600: #9c1477;
+--primary-700: #801161;
+--primary-800: #640d4b;
+--primary-900: #480a35;
+```
+
+### 辅助色系
+
+```css
+/* 蓝色 - Blue (用于信息提示) */
+--blue-50: #e6f4ff;
+--blue-100: #bae0ff;
+--blue-200: #91caff;
+--blue-300: #69b1ff;
+--blue-400: #4096ff;
+--blue-500: #1677ff; /* 信息色 */
+--blue-600: #0958d9;
+--blue-700: #003eb3;
+--blue-800: #002c8c;
+--blue-900: #001d66;
+```
+
+### 功能色
+
+```css
+/* 成功 - Success */
+--success: #52c41a;
+--success-bg: #f6ffed;
+--success-border: #b7eb8f;
+
+/* 警告 - Warning */
+--warning: #faad14;
+--warning-bg: #fffbe6;
+--warning-border: #ffe58f;
+
+/* 错误 - Error */
+--error: #ff4d4f;
+--error-bg: #fff2f0;
+--error-border: #ffccc7;
+
+/* 信息 - Info */
+--info: #1677ff;
+--info-bg: #e6f4ff;
+--info-border: #91caff;
+```
+
+### 中性色
+
+```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); /* 辅助文本 */
+--text-disabled: rgba(0, 0, 0, 0.25); /* 禁用文本 */
+
+/* 背景颜色 */
+--bg-primary: #ffffff;
+--bg-secondary: #fafafa;
+--bg-tertiary: #f5f5f5;
+--bg-disabled: #f0f0f0;
+
+/* 边框颜色 */
+--border-primary: #d9d9d9;
+--border-secondary: #f0f0f0;
+```
+
+### 颜色使用规范
+
+1. **主色使用**: 主要用于关键操作按钮、重要信息高亮、链接等
+2. **功能色使用**: 严格按照语义使用,不可混淆
+3. **中性色使用**: 用于文本、背景、边框等基础元素
+4. **对比度**: 确保文本与背景的对比度符合 WCAG 2.0 标准(至少 4.5:1)
+
+---
+
+## 排版规范
+
+### 字体家族
+
+```css
+/* 默认字体栈 */
+font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+
+/* 等宽字体(代码、数字) */
+font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code',
+ 'Fira Mono', 'Droid Sans Mono', 'Source Code Pro', monospace;
+```
+
+### 字号规范
+
+| 用途 | 字号 | 行高 | Tailwind Class | 使用场景 |
+|------|------|------|----------------|----------|
+| 特大标题 | 32px | 1.35 | `text-4xl` | 页面主标题 |
+| 大标题 | 24px | 1.35 | `text-2xl` | 区块标题 |
+| 中标题 | 20px | 1.4 | `text-xl` | 卡片标题 |
+| 小标题 | 16px | 1.5 | `text-base` | 表单标签 |
+| 正文 | 14px | 1.5714 | `text-sm` | 正文内容 |
+| 辅助文字 | 12px | 1.6667 | `text-xs` | 说明文字 |
+
+### 字重规范
+
+- **Regular (400)**: 正文内容
+- **Medium (500)**: 表单标签、列表项
+- **Semibold (600)**: 小标题、强调文本
+- **Bold (700)**: 标题、重要信息
+
+### 文本颜色使用
+
+```jsx
+// 主要文本
+
主要内容
+
+// 次要文本
+次要内容
+
+// 辅助文本
+辅助说明
+
+// 禁用文本
+禁用状态
+```
+
+---
+
+## 间距系统
+
+### 基础间距单位
+
+基于 **8px** 网格系统,所有间距应为 8 的倍数。
+
+| 名称 | 数值 | Tailwind Class | 用途 |
+|------|------|----------------|------|
+| xs | 4px | `space-1` / `p-1` / `m-1` | 紧凑间距 |
+| sm | 8px | `space-2` / `p-2` / `m-2` | 小间距 |
+| md | 16px | `space-4` / `p-4` / `m-4` | 标准间距 |
+| lg | 24px | `space-6` / `p-6` / `m-6` | 大间距 |
+| xl | 32px | `space-8` / `p-8` / `m-8` | 超大间距 |
+| 2xl | 48px | `space-12` / `p-12` / `m-12` | 区块间距 |
+
+### 间距使用场景
+
+1. **组件内边距**: 通常使用 12px (p-3) 或 16px (p-4)
+2. **组件外边距**: 标准使用 16px (m-4) 或 24px (m-6)
+3. **区块间距**: 使用 32px (mb-8) 或 48px (mb-12)
+4. **栅格间距**: 标准使用 16px 或 24px
+
+---
+
+## 组件规范
+
+### 按钮 (Button)
+
+#### 类型与场景
+
+```jsx
+import { Button } from 'antd';
+
+// 主要按钮 - 用于主要操作
+
+
+// 次要按钮 - 用于次要操作
+
+
+// 文本按钮 - 用于辅助操作
+
+
+// 链接按钮 - 用于跳转
+
+
+// 危险按钮 - 用于删除等危险操作
+
+```
+
+#### 尺寸规范
+
+- **Large**: 高度 40px,用于页面主要操作
+- **Middle**: 高度 32px,默认尺寸
+- **Small**: 高度 24px,用于紧凑场景
+
+#### 使用规范
+
+1. 一个操作区域最多只有一个主要按钮
+2. 按钮文字应简洁明确,建议不超过 4 个字
+3. 危险操作必须使用二次确认
+4. 按钮组内按钮间距为 8px
+
+### 表单 (Form)
+
+#### 布局规范
+
+```jsx
+import { Form, Input } from 'antd';
+
+
+
+
+
+```
+
+#### 表单规范
+
+1. **标签对齐**: 默认使用垂直布局 (vertical)
+2. **必填标识**: 使用红色星号 (*) 标识
+3. **字段宽度**: 根据内容长度设置合理宽度
+4. **错误提示**: 实时验证,错误信息显示在字段下方
+5. **表单间距**: 表单项之间间距 24px
+
+### 表格 (Table)
+
+#### 基础配置
+
+```jsx
+import { Table } from 'antd';
+
+ `共 ${total} 条`,
+ }}
+ scroll={{ x: 1200 }}
+/>
+```
+
+#### 表格规范
+
+1. **分页**: 默认每页 10 条,提供分页器
+2. **行高**: 标准行高 54px (middle 模式)
+3. **操作列**: 固定在右侧,宽度根据操作数量调整
+4. **空状态**: 使用统一的空状态提示
+5. **加载状态**: 使用 loading 属性显示加载状态
+
+### 卡片 (Card)
+
+```jsx
+import { Card } from 'antd';
+
+更多}
+ className="mb-4"
+>
+ 卡片内容
+
+```
+
+#### 卡片规范
+
+1. **内边距**: 标准 24px
+2. **圆角**: 8px (rounded-lg)
+3. **阴影**: 默认使用 `shadow-sm`
+4. **间距**: 卡片之间间距 16px
+
+---
+
+## 布局规范
+
+### 页面布局结构
+
+```
+┌─────────────────────────────────────┐
+│ Header (64px) │
+├─────────────────────────────────────┤
+│ Sider │ Content Area │
+│ (200px)│ │
+│ │ │
+│ │ │
+└─────────────────────────────────────┘
+```
+
+### 栅格系统
+
+采用 24 栏栅格系统,基于 Ant Design Grid 组件。
+
+```jsx
+import { Row, Col } from 'antd';
+
+
+
+ 内容
+
+
+```
+
+### 布局规范
+
+1. **页面内边距**: 24px
+2. **内容最大宽度**: 1200px (根据实际需求调整)
+3. **侧边栏宽度**: 200px (收起后 64px)
+4. **顶部导航高度**: 64px
+5. **栅格间距**: 水平 16px,垂直 16px
+
+---
+
+## 交互规范
+
+### 反馈
+
+#### 全局提示 (Message)
+
+```jsx
+import { message } from 'antd';
+
+// 成功提示
+message.success('操作成功');
+
+// 错误提示
+message.error('操作失败,请重试');
+
+// 警告提示
+message.warning('请注意数据安全');
+
+// 加载提示
+const hide = message.loading('加载中...');
+```
+
+#### 通知提醒 (Notification)
+
+```jsx
+import { notification } from 'antd';
+
+notification.open({
+ message: '系统通知',
+ description: '您有新的消息,请及时查看',
+ duration: 4.5,
+});
+```
+
+#### 模态对话框 (Modal)
+
+```jsx
+import { Modal } from 'antd';
+
+// 确认对话框
+Modal.confirm({
+ title: '确认删除',
+ content: '删除后数据无法恢复,确定要删除吗?',
+ okText: '确定',
+ cancelText: '取消',
+ onOk() {
+ // 处理确认
+ },
+});
+```
+
+### 加载状态
+
+1. **局部加载**: 使用 Spin 组件
+2. **按钮加载**: 设置 loading 属性
+3. **页面加载**: 骨架屏 (Skeleton)
+4. **表格加载**: Table 的 loading 属性
+
+### 动画效果
+
+1. **过渡时间**: 标准 300ms
+2. **缓动函数**: ease-in-out
+3. **使用场景**: 展开/收起、显示/隐藏、页面切换
+
+---
+
+## 响应式设计
+
+### 断点定义
+
+| 断点 | 屏幕宽度 | 设备类型 | Tailwind 前缀 |
+|------|----------|----------|---------------|
+| xs | < 576px | 手机竖屏 | - |
+| sm | ≥ 576px | 手机横屏 | `sm:` |
+| md | ≥ 768px | 平板 | `md:` |
+| lg | ≥ 992px | 桌面显示器 | `lg:` |
+| xl | ≥ 1200px | 大桌面显示器 | `xl:` |
+| 2xl | ≥ 1600px | 超大显示器 | `2xl:` |
+
+### 响应式策略
+
+1. **移动优先**: 先设计移动端,再扩展到桌面端
+2. **弹性布局**: 使用 Flexbox 和 Grid
+3. **自适应图片**: 使用相对单位和 max-width
+4. **触摸友好**: 移动端可点击区域不小于 44x44px
+
+---
+
+## 页面模板
+
+### 通用页面结构
+
+```jsx
+import { Layout, Breadcrumb } from 'antd';
+const { Content } = Layout;
+
+function PageTemplate() {
+ return (
+
+ {/* 面包屑导航 */}
+
+ 首页
+ 当前页面
+
+
+ {/* 页面标题区 */}
+
+
+ {/* 主要内容区 */}
+
+ {/* 页面内容 */}
+
+
+ );
+}
+```
+
+### 已实现的页面模板
+
+#### 1. 主框架页面 ✓
+
+完整的应用框架布局,包含:
+- 侧边菜单栏(支持收起/展开,两级菜单)
+- 顶部导航栏(搜索、消息、用户信息)
+- 内容区域(可滚动)
+
+**详细文档**: [主框架页面设计规范](../docs/pages/main-layout.md)
+
+**主要特性**:
+- 基于 NEX Logo 的品牌配色 (#b8178d)
+- 菜单数据 JSON 配置
+- 响应式布局
+- 徽章系统(HOT/NEW)
+- 用户下拉菜单
+
+**使用示例**:
+```jsx
+import MainLayout from './components/MainLayout'
+
+function App() {
+ return (
+
+ {/* 页面内容 */}
+
+ )
+}
+```
+
+#### 2. 概览页 (Dashboard) ✓
+
+数据概览页面,展示:
+- 统计卡片(证书总量、资产数量等)
+- 环形进度图表
+- 数据走势图
+
+**主要组件**:
+- 响应式栅格布局 (Row/Col)
+- 统计卡片 (Statistic)
+- 进度条 (Progress)
+- 图表区域
+
+### 待完善的页面模板
+
+后续将添加以下页面模板:
+
+- [ ] **列表页**: 数据表格、筛选、操作
+- [ ] **详情页**: 信息展示、关联数据
+- [ ] **表单页**: 数据录入、验证、提交
+- [ ] **设置页**: 配置管理、偏好设置
+
+---
+
+## 开发规范
+
+### 代码组织
+
+```
+src/
+├── components/ # 公共组件
+│ ├── Button/
+│ ├── Card/
+│ └── ...
+├── pages/ # 页面组件
+│ ├── Dashboard/
+│ ├── List/
+│ └── ...
+├── styles/ # 样式文件
+│ ├── globals.css
+│ └── variables.css
+├── utils/ # 工具函数
+└── constants/ # 常量定义
+```
+
+### 命名规范
+
+1. **组件命名**: 大驼峰 (PascalCase),如 `UserList`
+2. **文件命名**: 与组件同名,如 `UserList.jsx`
+3. **样式类命名**: 小写短横线 (kebab-case)
+4. **常量命名**: 全大写下划线 (UPPER_SNAKE_CASE)
+
+### CSS 使用规范
+
+1. **优先使用 Tailwind**: 布局、间距、颜色等
+2. **Ant Design 定制**: 通过主题配置实现
+3. **自定义样式**: 仅在必要时使用,放在组件目录下
+
+---
+
+## 版本记录
+
+| 版本 | 日期 | 说明 |
+|------|------|------|
+| 1.0.0 | 2024-11-04 | 初始版本,建立基础设计规范 |
+| 1.1.0 | 2024-11-04 | 更新品牌配色,完成主框架页面和概览页 |
+
+---
+
+## 参考资源
+
+- [Ant Design 官方文档](https://ant.design/)
+- [Tailwind CSS 官方文档](https://tailwindcss.com/)
+- [React 官方文档](https://react.dev/)
+- [Material Design 设计指南](https://material.io/design)
+
+---
+
+**维护者**: Nex Design Team
+**最后更新**: 2024-11-04
diff --git a/oms_web/docs/components/ConfirmDialog.md b/oms_web/docs/components/ConfirmDialog.md
new file mode 100644
index 00000000..ed85f439
--- /dev/null
+++ b/oms_web/docs/components/ConfirmDialog.md
@@ -0,0 +1,330 @@
+# ConfirmDialog 组件
+
+## 组件说明
+
+确认对话框组件,基于 Ant Design Modal 封装,提供统一的确认对话框样式和交互。支持单个删除、批量删除、警告确认和通用确认等多种场景。
+
+## 组件位置
+
+```
+src/components/ConfirmDialog/ConfirmDialog.jsx
+```
+
+## API 方法
+
+组件以静态方法的形式提供,无需实例化,直接调用即可。
+
+### ConfirmDialog.delete()
+
+显示单个项目删除确认对话框。
+
+#### 参数
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| title | string | 否 | '确认删除' | 对话框标题 |
+| itemName | string | 是 | - | 要删除的项目名称 |
+| itemInfo | string | 否 | - | 项目附加信息 |
+| onOk | function | 否 | - | 确认回调,支持返回 Promise |
+| onCancel | function | 否 | - | 取消回调 |
+
+#### 使用示例
+
+```jsx
+import ConfirmDialog from '../components/ConfirmDialog/ConfirmDialog'
+
+const handleDeleteUser = (record) => {
+ ConfirmDialog.delete({
+ itemName: `用户名:${record.userName}`,
+ itemInfo: `姓名:${record.name}`,
+ onOk() {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ // 执行删除操作
+ deleteUser(record.id)
+ resolve()
+ Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
+ }, 1000)
+ })
+ },
+ })
+}
+```
+
+### ConfirmDialog.batchDelete()
+
+显示批量删除确认对话框。
+
+#### 参数
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| count | number | 是 | - | 要删除的项目数量 |
+| items | Array | 是 | - | 项目列表 |
+| onOk | function | 否 | - | 确认回调,支持返回 Promise |
+| onCancel | function | 否 | - | 取消回调 |
+
+##### ItemInfo 对象
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| name | string | 是 | 项目名称 |
+| info | string | 否 | 项目附加信息 |
+
+#### 使用示例
+
+```jsx
+const handleBatchDelete = () => {
+ const selectedUsers = filteredUsers.filter((u) => selectedRowKeys.includes(u.id))
+ const items = selectedUsers.map((user) => ({
+ name: user.userName,
+ info: user.name,
+ }))
+
+ ConfirmDialog.batchDelete({
+ count: selectedRowKeys.length,
+ items,
+ onOk() {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ const count = selectedRowKeys.length
+ const newUsers = filteredUsers.filter((u) => !selectedRowKeys.includes(u.id))
+ setFilteredUsers(newUsers)
+ setSelectedRowKeys([])
+ resolve()
+ Toast.success('批量删除成功', `已成功删除 ${count} 个用户`)
+ }, 1000)
+ })
+ },
+ })
+}
+```
+
+### ConfirmDialog.warning()
+
+显示警告确认对话框。
+
+#### 参数
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| title | string | 是 | - | 对话框标题 |
+| content | string\|ReactNode | 是 | - | 对话框内容 |
+| okText | string | 否 | '确定' | 确认按钮文字 |
+| cancelText | string | 否 | '取消' | 取消按钮文字 |
+| onOk | function | 否 | - | 确认回调 |
+| onCancel | function | 否 | - | 取消回调 |
+
+#### 使用示例
+
+```jsx
+const handleRiskyOperation = () => {
+ ConfirmDialog.warning({
+ title: '操作警告',
+ content: '此操作可能影响系统稳定性,确定要继续吗?',
+ okText: '继续操作',
+ onOk() {
+ // 执行危险操作
+ performRiskyOperation()
+ },
+ })
+}
+```
+
+### ConfirmDialog.confirm()
+
+显示通用确认对话框。
+
+#### 参数
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| title | string | 是 | - | 对话框标题 |
+| content | string\|ReactNode | 是 | - | 对话框内容 |
+| okText | string | 否 | '确定' | 确认按钮文字 |
+| cancelText | string | 否 | '取消' | 取消按钮文字 |
+| okType | string | 否 | 'primary' | 确认按钮类型(primary/danger) |
+| onOk | function | 否 | - | 确认回调 |
+| onCancel | function | 否 | - | 取消回调 |
+
+#### 使用示例
+
+```jsx
+const handleSubmit = () => {
+ ConfirmDialog.confirm({
+ title: '提交确认',
+ content: '确定要提交当前表单吗?',
+ okText: '提交',
+ onOk() {
+ // 执行提交操作
+ submitForm()
+ },
+ })
+}
+```
+
+## 完整使用示例
+
+### 单个删除
+
+```jsx
+import ConfirmDialog from '../components/ConfirmDialog/ConfirmDialog'
+import Toast from '../components/Toast/Toast'
+
+function UserListPage() {
+ const handleDeleteUser = (record) => {
+ ConfirmDialog.delete({
+ itemName: `用户名:${record.userName}`,
+ itemInfo: `姓名:${record.name}`,
+ onOk() {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ const newUsers = filteredUsers.filter((u) => u.id !== record.id)
+ setFilteredUsers(newUsers)
+ resolve()
+ Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
+ }, 1000)
+ })
+ },
+ })
+ }
+
+ return (
+
+ )
+}
+```
+
+### 批量删除
+
+```jsx
+function UserListPage() {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([])
+
+ const handleBatchDelete = () => {
+ const selectedUsers = filteredUsers.filter((u) => selectedRowKeys.includes(u.id))
+ const items = selectedUsers.map((user) => ({
+ name: user.userName,
+ info: user.name,
+ }))
+
+ ConfirmDialog.batchDelete({
+ count: selectedRowKeys.length,
+ items,
+ onOk() {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ const count = selectedRowKeys.length
+ const newUsers = filteredUsers.filter((u) => !selectedRowKeys.includes(u.id))
+ setFilteredUsers(newUsers)
+ setSelectedRowKeys([])
+ resolve()
+ Toast.success('批量删除成功', `已成功删除 ${count} 个用户`)
+ }, 1000)
+ })
+ },
+ })
+ }
+
+ return (
+
+ )
+}
+```
+
+### 自定义内容
+
+```jsx
+ConfirmDialog.confirm({
+ title: '重置密码',
+ content: (
+
+
确定要重置用户 {user.userName} 的密码吗?
+
新密码将发送到用户邮箱
+
+ ),
+ okText: '确认重置',
+ okType: 'primary',
+ onOk() {
+ resetPassword(user.id)
+ },
+})
+```
+
+### 异步操作处理
+
+```jsx
+const handleDeleteUser = (record) => {
+ ConfirmDialog.delete({
+ itemName: `用户名:${record.userName}`,
+ itemInfo: `姓名:${record.name}`,
+ async onOk() {
+ try {
+ // 调用 API 删除用户
+ await api.deleteUser(record.id)
+
+ // 更新本地数据
+ const newUsers = filteredUsers.filter((u) => u.id !== record.id)
+ setFilteredUsers(newUsers)
+
+ Toast.success('删除成功', `用户 "${record.userName}" 已成功删除`)
+ } catch (error) {
+ Toast.error('删除失败', error.message)
+ throw error // 阻止对话框关闭
+ }
+ },
+ })
+}
+```
+
+## 特性说明
+
+### 删除确认样式
+
+- 红色危险图标
+- 高亮显示要删除的项目信息
+- 红色警告提示"此操作不可恢复,请谨慎操作!"
+- 危险样式的确认按钮
+
+### 批量删除列表
+
+- 最多显示 200px 高度的滚动列表
+- 每个项目显示名称和附加信息
+- 项目间用分隔线隔开
+
+### Promise 支持
+
+- `onOk` 回调支持返回 Promise
+- 异步操作进行时,确认按钮显示 loading 状态
+- Promise reject 时,对话框不会关闭
+- 适合调用 API 等异步操作
+
+### 居中显示
+
+- 所有对话框默认垂直居中显示(`centered: true`)
+
+## 使用场景
+
+1. **删除确认** - 删除用户、设备、订单等数据前的确认
+2. **批量删除** - 批量删除多条数据前的确认
+3. **危险操作警告** - 执行可能影响系统的操作前的警告
+4. **通用确认** - 提交表单、保存设置等操作的确认
+5. **重要操作二次确认** - 任何需要用户明确确认的操作
+
+## 注意事项
+
+1. 删除操作统一使用红色危险样式,提醒用户谨慎操作
+2. `onOk` 回调支持同步和异步(返回 Promise)两种方式
+3. 批量删除时,`items` 数组会在对话框中完整展示,注意数量控制
+4. 对话框内容支持字符串和 React 节点,可以自定义复杂内容
+5. 确认按钮文字建议明确操作类型,如"确认删除"、"确认提交"等
+6. 配合 Toast 组件使用,提供操作结果反馈
+7. 异步操作失败时,throw error 可以阻止对话框关闭
diff --git a/oms_web/docs/components/DetailDrawer.md b/oms_web/docs/components/DetailDrawer.md
new file mode 100644
index 00000000..76636668
--- /dev/null
+++ b/oms_web/docs/components/DetailDrawer.md
@@ -0,0 +1,469 @@
+# DetailDrawer 组件
+
+## 组件说明
+
+详情抽屉组件,用于从页面右侧滑出显示详细信息。支持自定义标题、操作按钮、标签页等功能,内容区域可滚动,顶部标题栏固定。
+
+## 组件位置
+
+```
+src/components/DetailDrawer/DetailDrawer.jsx
+src/components/DetailDrawer/DetailDrawer.css
+```
+
+## 参数说明
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| visible | boolean | 是 | - | 是否显示抽屉 |
+| onClose | function | 是 | - | 关闭抽屉回调 |
+| title | TitleConfig | 否 | - | 标题配置对象 |
+| headerActions | Array | 否 | [] | 顶部操作按钮数组 |
+| width | number | 否 | 1080 | 抽屉宽度(像素) |
+| children | ReactNode | 否 | - | 主要内容区域 |
+| tabs | Array | 否 | - | 标签页配置数组 |
+
+### 1. 小型抽屉 (Small) - 480px
+**适用场景:**
+- 简单的信息展示
+- 少量字段的表单(1-3个字段)
+- 快速操作面板
+- 通知详情
+
+**示例:**
+```jsx
+
+```
+
+### 2. 中型抽屉 (Medium) - 720px
+**适用场景:**
+- 详细信息展示(如主机详情)
+- 中等复杂度的表单(4-10个字段)
+- 数据编辑面板
+- 配置设置
+
+**示例:**
+```jsx
+
+```
+**当前主机列表页面使用此宽度模式**
+
+### 3. 大型抽屉 (Large) - 1080px
+**适用场景:**
+- 复杂的多步骤表单
+- 需要并排展示多列信息
+- 包含图表或复杂可视化内容
+- 嵌套子表格或列表
+
+**示例:**
+```jsx
+
+```
+
+### TitleConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| text | string | 是 | 标题文本 |
+| badge | ReactNode | 否 | 状态徽标(如 Tag、Badge 组件) |
+| icon | ReactNode | 否 | 标题图标 |
+
+### ActionConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| key | string | 是 | 按钮唯一标识 |
+| label | string | 是 | 按钮文本 |
+| icon | ReactNode | 否 | 按钮图标 |
+| type | string | 否 | 按钮类型(primary/default/dashed/text/link) |
+| danger | boolean | 否 | 是否为危险按钮 |
+| disabled | boolean | 否 | 是否禁用 |
+| onClick | function | 否 | 点击回调函数 |
+
+### TabConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| key | string | 是 | 标签页唯一标识 |
+| label | ReactNode | 是 | 标签页标题(支持图标+文字) |
+| content | ReactNode | 是 | 标签页内容 |
+
+## 使用示例
+
+### 基础用法
+
+```jsx
+import { useState } from 'react'
+import DetailDrawer from '../components/DetailDrawer/DetailDrawer'
+
+function MyPage() {
+ const [showDrawer, setShowDrawer] = useState(false)
+ const [selectedItem, setSelectedItem] = useState(null)
+
+ return (
+ <>
+
+
+ setShowDrawer(false)}
+ title={{
+ text: selectedItem?.name || '详情',
+ }}
+ >
+
+
+ >
+ )
+}
+```
+
+### 带状态徽标
+
+```jsx
+import { Tag, Badge } from 'antd'
+
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedUser?.userName || '',
+ badge: (
+
+ {selectedUser?.status === 'enabled' ? '启用' : '停用'}
+
+ ),
+ }}
+>
+ {/* 内容 */}
+
+```
+
+### 带操作按钮
+
+```jsx
+import { EditOutlined, DeleteOutlined } from '@ant-design/icons'
+
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedUser?.userName || '',
+ }}
+ headerActions={[
+ {
+ key: 'edit',
+ label: '编辑',
+ icon: ,
+ onClick: () => {
+ setEditMode('edit')
+ setShowEditDrawer(true)
+ setShowDetailDrawer(false)
+ },
+ },
+ {
+ key: 'delete',
+ label: '删除',
+ icon: ,
+ danger: true,
+ onClick: () => {
+ setShowDetailDrawer(false)
+ handleDelete(selectedUser)
+ },
+ },
+ ]}
+>
+ {/* 内容 */}
+
+```
+
+### 使用 InfoPanel 显示信息
+
+```jsx
+import DetailDrawer from '../components/DetailDrawer/DetailDrawer'
+import InfoPanel from '../components/InfoPanel/InfoPanel'
+
+const userFields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ { key: 'group', label: '用户分组', span: 6 },
+ { key: 'name', label: '姓名', span: 6 },
+ { key: 'userType', label: '用户类型', span: 6 },
+ {
+ key: 'status',
+ label: '状态',
+ span: 6,
+ render: (value) => (
+
+ {value === 'enabled' ? '启用' : '停用'}
+
+ ),
+ },
+]
+
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedUser?.userName || '',
+ }}
+>
+ console.log('重置密码') },
+ { key: 'disable', label: '停用', onClick: () => console.log('停用') },
+ ]}
+ />
+
+```
+
+### 带标签页
+
+```jsx
+import { DatabaseOutlined, UserOutlined } from '@ant-design/icons'
+
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedHost?.name || '',
+ badge: (
+
+ ),
+ }}
+ headerActions={[
+ {
+ key: 'edit',
+ label: '编辑',
+ icon: ,
+ onClick: handleEdit,
+ },
+ ]}
+ width={1080}
+ tabs={[
+ {
+ key: 'images',
+ label: (
+
+
+ 终端镜像
+
+ ),
+ content: (
+
+ {/* 镜像列表内容 */}
+
+ ),
+ },
+ {
+ key: 'users',
+ label: (
+
+
+ 终端用户
+
+ ),
+ content: (
+
+ {/* 用户列表内容 */}
+
+ ),
+ },
+ ]}
+>
+
+
+```
+
+### 完整示例
+
+```jsx
+import { useState } from 'react'
+import DetailDrawer from '../components/DetailDrawer/DetailDrawer'
+import InfoPanel from '../components/InfoPanel/InfoPanel'
+import { Tag, Badge, Card } from 'antd'
+import { EditOutlined, DeleteOutlined, DatabaseOutlined, UserOutlined } from '@ant-design/icons'
+
+function UserListPage() {
+ const [showDetailDrawer, setShowDetailDrawer] = useState(false)
+ const [selectedUser, setSelectedUser] = useState(null)
+
+ const userFields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ { key: 'group', label: '用户分组', span: 6 },
+ { key: 'name', label: '姓名', span: 6 },
+ { key: 'grantedImages', label: '授权镜像', span: 6 },
+ { key: 'userType', label: '用户类型', span: 6 },
+ { key: 'grantedTerminals', label: '授权终端', span: 6 },
+ {
+ key: 'status',
+ label: '启停用',
+ span: 6,
+ render: (value) => (
+
+ {value === 'enabled' ? '启用' : '停用'}
+
+ ),
+ },
+ ]
+
+ const detailTabs = [
+ {
+ key: 'terminals',
+ label: (
+
+
+ 授权终端
+
+ ),
+ content: (
+
+ {selectedUser?.terminals?.map((terminal) => (
+
+ {terminal.name}
+ IP: {terminal.ip}
+
+ ))}
+
+ ),
+ },
+ {
+ key: 'images',
+ label: (
+
+
+ 授权镜像
+
+ ),
+ content: (
+
+ {selectedUser?.images?.map((image) => (
+
+ {image.name}
+ 系统: {image.os}
+
+ ))}
+
+ ),
+ },
+ ]
+
+ return (
+ <>
+ {/* 列表页面 */}
+ {
+ setSelectedUser(record)
+ setShowDetailDrawer(true)
+ }}
+ />
+
+ {/* 详情抽屉 */}
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedUser?.userName || '',
+ badge: (
+
+ {selectedUser?.status === 'enabled' ? '启用' : '停用'}
+
+ ),
+ }}
+ headerActions={[
+ {
+ key: 'edit',
+ label: '编辑',
+ icon: ,
+ onClick: () => {
+ setShowDetailDrawer(false)
+ handleEdit(selectedUser)
+ },
+ },
+ {
+ key: 'delete',
+ label: '删除',
+ icon: ,
+ danger: true,
+ onClick: () => {
+ setShowDetailDrawer(false)
+ handleDelete(selectedUser)
+ },
+ },
+ ]}
+ width={1080}
+ tabs={detailTabs}
+ >
+ console.log('转移分组') },
+ { key: 'reset', label: '重置密码', onClick: () => console.log('重置密码') },
+ { key: 'disable', label: '停用', onClick: () => console.log('停用') },
+ ]}
+ />
+
+ >
+ )
+}
+```
+
+## 布局结构
+
+抽屉采用固定头部、可滚动内容的布局:
+
+```
+┌─────────────────────────────────────┐
+│ 标题栏(固定,不滚动) │
+│ [关闭] [标题] [徽标] [操作按钮] │
+├─────────────────────────────────────┤
+│ │
+│ 内容区域(可滚动) │
+│ - children 主要内容 │
+│ - tabs 标签页(可选) │
+│ │
+└─────────────────────────────────────┘
+```
+
+## 样式定制
+
+组件提供以下 CSS 类名供自定义样式:
+
+- `.detail-drawer-content` - 抽屉内容容器
+- `.detail-drawer-header` - 顶部标题栏
+- `.detail-drawer-header-left` - 标题栏左侧区域
+- `.detail-drawer-header-right` - 标题栏右侧区域
+- `.detail-drawer-close-button` - 关闭按钮
+- `.detail-drawer-header-info` - 标题信息容器
+- `.detail-drawer-title-icon` - 标题图标
+- `.detail-drawer-title` - 标题文本
+- `.detail-drawer-badge` - 徽标容器
+- `.detail-drawer-scrollable-content` - 可滚动内容区域
+- `.detail-drawer-tabs` - 标签页容器
+- `.detail-drawer-tab-content` - 标签页内容
+
+## 使用场景
+
+1. **查看详细信息** - 点击列表行显示详细信息
+2. **多标签页详情** - 在详情中展示不同类型的关联数据
+3. **带快捷操作的详情** - 在详情顶部提供编辑、删除等操作
+4. **复杂数据展示** - 配合 InfoPanel、Card 等组件展示复杂信息
+
+## 注意事项
+
+1. 抽屉宽度默认 1080px,可根据内容调整,建议取值范围:720-1200px
+2. 标题栏固定在顶部,不随内容滚动,确保操作按钮始终可见
+3. `children` 内容区域会自动应用内边距,`tabs` 内容需要自行控制样式
+4. 操作按钮数量不宜过多,建议不超过 3 个
+5. 使用 `tabs` 时,第一个标签页默认激活
+6. 关闭抽屉时建议清空选中状态,避免下次打开时显示旧数据
+7. 配合 InfoPanel 使用时,InfoPanel 会自动处理内边距
diff --git a/oms_web/docs/components/InfoPanel.md b/oms_web/docs/components/InfoPanel.md
new file mode 100644
index 00000000..9c928d66
--- /dev/null
+++ b/oms_web/docs/components/InfoPanel.md
@@ -0,0 +1,305 @@
+# InfoPanel 组件
+
+## 组件说明
+
+信息展示面板组件,用于以网格布局展示数据的字段信息,支持自定义字段渲染和操作按钮。常用于详情页面或抽屉中展示结构化数据。
+
+## 组件位置
+
+```
+src/components/InfoPanel/InfoPanel.jsx
+src/components/InfoPanel/InfoPanel.css
+```
+
+## 参数说明
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| data | Object | 是 | - | 数据源对象 |
+| fields | Array | 否 | [] | 字段配置数组 |
+| actions | Array | 否 | [] | 操作按钮配置数组 |
+| gutter | Array | 否 | [24, 16] | Grid 网格间距 [水平, 垂直] |
+
+### FieldConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| key | string | 是 | 数据字段名 |
+| label | string | 是 | 字段显示标签 |
+| span | number | 否 | 网格占位份数(24栅格系统),默认 6 |
+| render | function(value, data) | 否 | 自定义渲染函数 |
+
+### ActionConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| key | string | 是 | 按钮唯一标识 |
+| label | string | 是 | 按钮文本 |
+| icon | ReactNode | 否 | 按钮图标 |
+| type | string | 否 | 按钮类型(primary/default/dashed/text/link) |
+| danger | boolean | 否 | 是否为危险按钮 |
+| disabled | boolean | 否 | 是否禁用 |
+| onClick | function | 否 | 点击回调函数 |
+
+## 使用示例
+
+### 基础用法
+
+```jsx
+import InfoPanel from '../components/InfoPanel/InfoPanel'
+
+function UserDetail() {
+ const userData = {
+ userName: 'admin',
+ name: '系统管理员',
+ group: '管理员组',
+ userType: '管理员',
+ status: 'enabled',
+ grantedTerminals: 8,
+ grantedImages: 21,
+ }
+
+ const userFields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ { key: 'name', label: '姓名', span: 6 },
+ { key: 'group', label: '用户分组', span: 6 },
+ { key: 'userType', label: '用户类型', span: 6 },
+ { key: 'grantedTerminals', label: '授权终端', span: 6 },
+ { key: 'grantedImages', label: '授权镜像', span: 6 },
+ ]
+
+ return
+}
+```
+
+### 自定义字段渲染
+
+```jsx
+import { Tag } from 'antd'
+
+const userFields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ { key: 'name', label: '姓名', span: 6 },
+ {
+ key: 'status',
+ label: '状态',
+ span: 6,
+ render: (value) => (
+
+ {value === 'enabled' ? '启用' : '停用'}
+
+ ),
+ },
+ {
+ key: 'description',
+ label: '描述',
+ span: 18,
+ render: (value) => value || '--', // 空值显示默认占位符
+ },
+]
+
+
+```
+
+### 带操作按钮
+
+```jsx
+import { LockOutlined } from '@ant-design/icons'
+
+ console.log('转移分组'),
+ },
+ {
+ key: 'blacklist',
+ label: '加入黑名单',
+ onClick: () => console.log('加入黑名单'),
+ },
+ {
+ key: 'reset',
+ label: '重置密码',
+ onClick: () => console.log('重置密码'),
+ },
+ {
+ key: 'disable',
+ label: '停用',
+ icon: ,
+ onClick: () => console.log('停用'),
+ },
+ ]}
+/>
+```
+
+### 配合 DetailDrawer 使用
+
+```jsx
+import DetailDrawer from '../components/DetailDrawer/DetailDrawer'
+import InfoPanel from '../components/InfoPanel/InfoPanel'
+import { Tag } from 'antd'
+
+function UserListPage() {
+ const [showDetailDrawer, setShowDetailDrawer] = useState(false)
+ const [selectedUser, setSelectedUser] = useState(null)
+
+ const userFields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ { key: 'group', label: '用户分组', span: 6 },
+ { key: 'name', label: '姓名', span: 6 },
+ { key: 'grantedImages', label: '授权镜像', span: 6 },
+ { key: 'userType', label: '用户类型', span: 6 },
+ { key: 'grantedTerminals', label: '授权终端', span: 6 },
+ {
+ key: 'status',
+ label: '启停用',
+ span: 6,
+ render: (value) => (
+
+ {value === 'enabled' ? '启用' : '停用'}
+
+ ),
+ },
+ { key: 'description', label: '描述', span: 18, render: () => '--' },
+ ]
+
+ return (
+ setShowDetailDrawer(false)}
+ title={{
+ text: selectedUser?.userName || '',
+ }}
+ >
+ console.log('转移分组') },
+ { key: 'blacklist', label: '加入黑名单', onClick: () => console.log('加入黑名单') },
+ { key: 'reset', label: '重置密码', onClick: () => console.log('重置密码') },
+ { key: 'disable', label: '停用', onClick: () => console.log('停用') },
+ ]}
+ />
+
+ )
+}
+```
+
+### 不同 span 值的布局
+
+```jsx
+// 24栅格系统,一行总共24份
+const fields = [
+ { key: 'field1', label: '字段1', span: 6 }, // 占1/4宽度
+ { key: 'field2', label: '字段2', span: 6 }, // 占1/4宽度
+ { key: 'field3', label: '字段3', span: 6 }, // 占1/4宽度
+ { key: 'field4', label: '字段4', span: 6 }, // 占1/4宽度,满一行
+ { key: 'field5', label: '字段5', span: 8 }, // 占1/3宽度
+ { key: 'field6', label: '字段6', span: 8 }, // 占1/3宽度
+ { key: 'field7', label: '字段7', span: 8 }, // 占1/3宽度,满一行
+ { key: 'field8', label: '字段8', span: 12 }, // 占1/2宽度
+ { key: 'field9', label: '字段9', span: 12 }, // 占1/2宽度,满一行
+ { key: 'description', label: '描述', span: 24 }, // 占满整行
+]
+
+
+```
+
+### 访问完整数据对象
+
+```jsx
+const fields = [
+ { key: 'userName', label: '用户名', span: 6 },
+ {
+ key: 'status',
+ label: '状态信息',
+ span: 18,
+ // render 函数的第二个参数是完整的数据对象
+ render: (value, data) => (
+
+
+ {value === 'enabled' ? '启用' : '停用'}
+
+
+ 授权终端:{data.grantedTerminals} 台
+
+
+ ),
+ },
+]
+
+
+```
+
+### 自定义网格间距
+
+```jsx
+// 默认间距 [24, 16]
+
+
+// 紧凑布局
+
+```
+
+## 布局说明
+
+组件使用 Ant Design 的 24 栅格系统:
+
+```
+┌─────────────────────────────────────────────────┐
+│ span=6 span=6 span=6 span=6 │ 一行4列
+├─────────────────────────────────────────────────┤
+│ span=8 span=8 span=8 │ 一行3列
+├─────────────────────────────────────────────────┤
+│ span=12 span=12 │ 一行2列
+├─────────────────────────────────────────────────┤
+│ span=24 │ 占满一行
+└─────────────────────────────────────────────────┘
+```
+
+常用 span 值:
+- `span=6` - 一行 4 列
+- `span=8` - 一行 3 列
+- `span=12` - 一行 2 列
+- `span=24` - 占满整行(适合描述、备注等长文本字段)
+
+## 样式定制
+
+组件提供以下 CSS 类名供自定义样式:
+
+- `.info-panel` - 组件根容器
+- `.info-panel-item` - 单个字段容器
+- `.info-panel-label` - 字段标签
+- `.info-panel-value` - 字段值
+- `.info-panel-actions` - 操作按钮区域
+
+## 使用场景
+
+1. **详情页信息展示** - 在详情抽屉或页面中展示对象的属性信息
+2. **用户信息展示** - 展示用户的基本信息和状态
+3. **设备信息展示** - 展示设备的配置和参数
+4. **订单信息展示** - 展示订单的详细信息
+5. **任何结构化数据展示** - 以标签-值形式展示的数据
+
+## 注意事项
+
+1. `data` 为 `null` 或 `undefined` 时组件不渲染任何内容
+2. 字段 `span` 值总和建议为 24 的倍数以保持布局整齐
+3. 长文本字段(如描述、备注)建议使用 `span=24` 或 `span=18`
+4. `render` 函数可以返回任何 React 节点,包括组件、文本、HTML 等
+5. 操作按钮会显示在所有字段下方,建议不超过 6 个按钮
+6. 使用 `render` 函数时,第一个参数是字段值,第二个参数是完整数据对象
+7. 网格间距 `gutter` 的第一个值是水平间距,第二个值是垂直间距
diff --git a/oms_web/docs/components/ListActionBar.md b/oms_web/docs/components/ListActionBar.md
new file mode 100644
index 00000000..97318465
--- /dev/null
+++ b/oms_web/docs/components/ListActionBar.md
@@ -0,0 +1,249 @@
+# ListActionBar 组件
+
+## 组件说明
+
+列表操作栏组件,提供统一的操作按钮区、搜索框、高级筛选和刷新功能。常用于列表页面的顶部操作区域。
+
+## 组件位置
+
+```
+src/components/ListActionBar/ListActionBar.jsx
+src/components/ListActionBar/ListActionBar.css
+```
+
+## 参数说明
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| actions | Array | 否 | [] | 左侧操作按钮配置数组 |
+| search | SearchConfig | 否 | - | 搜索框配置对象 |
+| filter | FilterConfig | 否 | - | 高级筛选配置对象 |
+| showRefresh | boolean | 否 | false | 是否显示刷新按钮 |
+| onRefresh | function | 否 | - | 刷新按钮点击回调 |
+
+### ActionConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| key | string | 是 | 按钮唯一标识 |
+| label | string | 是 | 按钮文本 |
+| icon | ReactNode | 否 | 按钮图标 |
+| type | string | 否 | 按钮类型(primary/default/dashed/text/link) |
+| disabled | boolean | 否 | 是否禁用 |
+| danger | boolean | 否 | 是否为危险按钮 |
+| onClick | function | 否 | 点击回调函数 |
+
+### SearchConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| placeholder | string | 否 | 搜索框占位文本 |
+| width | number | 否 | 搜索框宽度,默认 280 |
+| value | string | 否 | 搜索框值(受控模式) |
+| onSearch | function(value: string) | 否 | 搜索回调 |
+| onChange | function(value: string) | 否 | 输入变化回调 |
+
+### FilterConfig 配置项
+
+| 属性名 | 类型 | 必填 | 说明 |
+|--------|------|------|------|
+| content | ReactNode | 是 | 筛选面板内容 |
+| title | string | 否 | 筛选面板标题 |
+| visible | boolean | 否 | 控制面板显示/隐藏 |
+| onVisibleChange | function(visible: boolean) | 否 | 显示状态变化回调 |
+| selectedLabel | string | 否 | 筛选按钮显示的标签文本 |
+| isActive | boolean | 否 | 是否处于激活状态(高亮显示) |
+
+## 使用示例
+
+### 基础用法(仅操作按钮)
+
+```jsx
+import ListActionBar from '../components/ListActionBar/ListActionBar'
+import { PlusOutlined, DeleteOutlined } from '@ant-design/icons'
+
+,
+ type: 'primary',
+ onClick: () => console.log('新增'),
+ },
+ {
+ key: 'delete',
+ label: '批量删除',
+ icon: ,
+ danger: true,
+ disabled: selectedRowKeys.length === 0,
+ onClick: handleBatchDelete,
+ },
+ ]}
+/>
+```
+
+### 带搜索功能
+
+```jsx
+import { useState } from 'react'
+
+function MyPage() {
+ const [searchKeyword, setSearchKeyword] = useState('')
+
+ return (
+ ,
+ type: 'primary',
+ onClick: () => console.log('新增'),
+ },
+ ]}
+ search={{
+ placeholder: '搜索用户名或姓名',
+ value: searchKeyword,
+ onSearch: (value) => {
+ console.log('搜索:', value)
+ setSearchKeyword(value)
+ },
+ onChange: (value) => setSearchKeyword(value),
+ }}
+ />
+ )
+}
+```
+
+### 带高级筛选
+
+```jsx
+import { useState } from 'react'
+import TreeFilterPanel from '../components/TreeFilterPanel/TreeFilterPanel'
+
+function MyPage() {
+ const [showFilterPopover, setShowFilterPopover] = useState(false)
+ const [selectedGroup, setSelectedGroup] = useState(null)
+ const [selectedGroupName, setSelectedGroupName] = useState('')
+
+ return (
+ ,
+ type: 'primary',
+ onClick: () => console.log('新增'),
+ },
+ ]}
+ search={{
+ placeholder: '搜索关键词',
+ onSearch: handleSearch,
+ }}
+ filter={{
+ content: (
+
+ ),
+ title: '高级筛选',
+ visible: showFilterPopover,
+ onVisibleChange: setShowFilterPopover,
+ selectedLabel: selectedGroupName,
+ isActive: !!selectedGroup,
+ }}
+ />
+ )
+}
+```
+
+### 完整示例(所有功能)
+
+```jsx
+import { useState } from 'react'
+import ListActionBar from '../components/ListActionBar/ListActionBar'
+import TreeFilterPanel from '../components/TreeFilterPanel/TreeFilterPanel'
+import { PlusOutlined, DeleteOutlined } from '@ant-design/icons'
+
+function UserListPage() {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([])
+ const [searchKeyword, setSearchKeyword] = useState('')
+ const [showFilterPopover, setShowFilterPopover] = useState(false)
+ const [selectedGroup, setSelectedGroup] = useState(null)
+ const [selectedGroupName, setSelectedGroupName] = useState('')
+
+ return (
+ ,
+ type: 'primary',
+ onClick: handleAdd,
+ },
+ {
+ key: 'batchDelete',
+ label: '批量删除',
+ icon: ,
+ danger: true,
+ disabled: selectedRowKeys.length === 0,
+ onClick: handleBatchDelete,
+ },
+ ]}
+ search={{
+ placeholder: '搜索用户名或姓名',
+ value: searchKeyword,
+ onSearch: handleSearch,
+ onChange: handleSearch,
+ }}
+ filter={{
+ content: (
+
+ ),
+ title: '高级筛选',
+ visible: showFilterPopover,
+ onVisibleChange: setShowFilterPopover,
+ selectedLabel: selectedGroupName,
+ isActive: !!selectedGroup,
+ }}
+ showRefresh
+ onRefresh={() => console.log('刷新')}
+ />
+ )
+}
+```
+
+## 样式定制
+
+组件提供以下 CSS 类名供自定义样式:
+
+- `.list-action-bar` - 组件根容器
+- `.list-action-bar-left` - 左侧操作按钮区域
+- `.list-action-bar-right` - 右侧搜索筛选区域
+- `.filter-popover` - 筛选弹出层容器
+
+## 使用场景
+
+1. **列表页面顶部操作区** - 提供新增、批量操作等功能
+2. **带搜索的列表** - 快速搜索列表内容
+3. **带分组筛选的列表** - 通过树形结构筛选数据
+4. **需要刷新的列表** - 提供手动刷新功能
+
+## 注意事项
+
+1. `actions` 数组中的每个按钮必须提供唯一的 `key` 值
+2. 搜索框支持受控和非受控两种模式,推荐使用受控模式以便更好地管理状态
+3. 筛选功能的 `content` 可以是任意 React 组件,常配合 `TreeFilterPanel` 使用
+4. 当筛选激活时(`isActive: true`),筛选按钮会显示为 primary 类型以提示用户
+5. 左侧操作按钮不宜过多,建议不超过 5 个,过多的操作可以通过下拉菜单组织
diff --git a/oms_web/docs/components/ListTable.md b/oms_web/docs/components/ListTable.md
new file mode 100644
index 00000000..6903e5a4
--- /dev/null
+++ b/oms_web/docs/components/ListTable.md
@@ -0,0 +1,385 @@
+# ListTable 组件
+
+## 组件说明
+
+列表表格组件,基于 Ant Design Table 组件封装,提供统一的表格样式、行选择、分页、滚动和行点击等功能。
+
+## 组件位置
+
+```
+src/components/ListTable/ListTable.jsx
+src/components/ListTable/ListTable.css
+```
+
+## 参数说明
+
+| 参数名 | 类型 | 必填 | 默认值 | 说明 |
+|--------|------|------|--------|------|
+| columns | Array | 是 | - | 表格列配置数组 |
+| dataSource | Array