Ant Design项目实践CRM实用的系统MVP
以 Ant Design(AntD)为核心技术栈,构建一个 CRM 系统的 MVP(最小可行产品)项目,以客户管理和销售机会两大核心模块为例。
核心理念:快、准、稳、可扩展

一、 手艺栈选型 (MVP Focus)
前端框架:
- React:事实标准,生态丰富。
- UI 库: Ant Design (AntD):提供高质量、企业级的 UI 组件,与 React 无缝集成,极大提升构建效率。MVP 阶段避免自研复杂组件。
- 状态管理:
- MVP 推荐: React Context + useReducer / Zustand: 对于 MVP,业务逻辑相对集中,使用 Context 管理全局状态(如用户信息、主题)结合
useReducer管理复杂组件状态,或使用轻量级的 Zustand,比 Redux 更简单,学习成本低。 - 避免:过早引入 Redux Toolkit (除非团队熟悉且项目复杂度预判高)。
- MVP 推荐: React Context + useReducer / Zustand: 对于 MVP,业务逻辑相对集中,使用 Context 管理全局状态(如用户信息、主题)结合
- 路由: React Router v6:最新稳定版本,API 设计优秀。
- HTTP 客户端: Axios: 功能强大,支持拦截器、请求/响应转换,易于与 AntD 的
message组件集成进行全局错误提示。 - 表单管理:
- AntD Form 组件:深度集成,提供强大的校验、布局、数据收集能力。MVP 首选。
- 可选:
react-hook-form(性能更好,但需额外处理与 AntD 组件的集成)。
- 构建工具: Vite:启动和热更新速度极快,显著提升开发体验。
- 代码规范:
- ESLint + Prettier:强制代码风格统一,减少低级错误。
- TypeScript:强烈推荐!提供静态类型检查,减少运行时错误,提升代码可读性和维护性,对 MVP 的稳定性和后期扩展至关重要。

后端 (示意):
- Node.js (Express/NestJS) / Python (Django/FastAPI) / Java (Spring Boot):选择团队最熟悉的。
- 数据库: PostgreSQL / MySQL:关系型数据库,适合 CRM 的结构化数据。
- API:RESTful API 或 GraphQL。MVP 阶段 RESTful 更简便直接。
二、 项目结构组织 (清晰分层)
遵循模块化和关注点分离原则。使用 Vite 创建项目后,建议结构:
src/
├── api/ # API 请求封装 (按模块划分)
│ ├── client.ts # Axios 实例配置 (拦截器)
│ ├── clientApi.ts # 客户相关 API
│ └── opportunityApi.ts # 销售机会相关 API
├── assets/ # 静态资源 (图片、字体)
├── components/ # 通用可复用组件
│ ├── common/ # 通用组件 (如 Loading, EmptyState)
│ ├── layout/ # 布局组件 (Header, Sider, Footer)
│ └── ui/ # 基于 AntD 的二次封装组件 (如 FormItemWithLabel, SearchInput)
├── constants/ # 常量定义 (路由、枚举、权限码)
│ ├── routes.ts
│ ├── clientStatus.ts
│ └── opportunityStage.ts
├── contexts/ # React Contexts (如 AuthContext, ThemeContext)
├── hooks/ # 自定义 Hook (如 useApi, useClientList)
│ ├── useClient.ts
│ └── useOpportunity.ts
├── models/ # TypeScript 类型定义 (与后端接口对齐)
│ ├── Client.ts
│ └── Opportunity.ts
├── pages/ # 页面级组件 (路由直接指向)
│ ├── Clients/ # 客户管理模块
│ │ ├── ClientList.tsx # 客户列表页
│ │ ├── ClientDetail.tsx# 客户详情页
│ │ └── ClientForm.tsx # 客户创建/编辑表单
│ ├── Opportunities/ # 销售机会模块
│ │ ├── OpportunityList.tsx
│ │ ├── OpportunityDetail.tsx
│ │ └── OpportunityForm.tsx
│ └── Dashboard.tsx # 仪表盘 (MVP 可简化)
├── services/ # 业务逻辑服务层 (可选,MVP 可简化到 hooks 或组件内)
├── styles/ # 全局样式、AntD 主题定制
│ ├── global.less
│ └── theme.less # AntD 主题变量覆盖
├── utils/ # 工具函数 (日期格式化、金额格式化)
│ ├── dateUtils.ts
│ └── numberUtils.ts
└── App.tsx # 根组件
└── main.tsx # 入口文件

关键点:
api/: 集中管理所有网络请求,便于维护和 Mock。models/: 定义清晰的 TypeScript 接口,保证前后端数据类型一致。hooks/: 将数据获取、状态管理逻辑抽离,提高组件复用性。components/: 封装高频使用的 UI 组件,保持一致性。pages/: 聚合页面逻辑,应尽量“瘦”,主要负责数据获取和 UI 组合。
三、 核心功能实现 (客户管理 & 销售机会)
1. 客户管理 (Client Management)
列表页 (
ClientList.tsx):- 布局: 使用
Layout,Sider(可选菜单),Content。 - 搜索与筛选:
- 使用
Card包裹搜索区。 - 使用
Form(内联布局layout="inline") 包含输入框 (Input)、下拉选择 (Select- 如客户状态)、日期选择器 (DatePicker)。 - 搜索按钮 (
Button type="primary") 和重置按钮。 - 实践: 将筛选条件存储在
useState或自定义 Hook 中,变化时调用useClientListHook 重新获取数据。
- 使用
- 表格 (
Table):- 展示核心字段:客户名称、联系人、电话、邮箱、客户状态、创建时间、运行 (查看、编辑、删除)。
- 使用
useClientListHook 获取数据 (loading状态绑定到 Table 的loading属性)。 - 分页:
Table的pagination属性,与后端分页 API 对接。 - 操作列:
- “查看” 按钮:跳转到
ClientDetail。 - “编辑” 按钮:跳转到
ClientForm并传入客户 ID。 - “删除” 按钮:使用
Popconfirm组件确认,调用删除 API,成功后刷新列表。
- “查看” 按钮:跳转到
- 新增按钮: 固定在表格上方右侧,点击跳转到
ClientForm。
- 布局: 使用
详情页 (
ClientDetail.tsx):- 布局:
Card分组展示信息(基本信息、联系人信息、销售机会列表等)。 - 数据获取: 使用
useClientHook 根据 URL 参数 (客户 ID) 获取详情。 - 关联展示: 在详情页下方,使用
Table展示该客户关联的所有销售机会 (调用useOpportunityList并传入客户 ID 过滤)。 - 操作:“编辑” 和 “返回列表” 按钮。
- 布局:
表单页 (
ClientForm.tsx):- 使用
Form组件:这是 AntD 的核心优势。 - 布局:
Form layout="vertical"或horizontal。 - 字段与校验:
Form.Item包裹每个输入控件。- 使用
rules属性定义校验规则 (如required,type: 'email',pattern手机号)。 - 利用
getFieldDecorator(旧) 或name属性 (新) 与initialValues绑定。
- 提交:
Button htmlType="submit",提交时Form会自动触发育验。成功后跳转到详情页或列表页,并用message.success()提示。 - 取消:返回上一页。
- 使用
2. 销售机会 (Opportunity Management)
列表页 (
OpportunityList.tsx):- 类似客户列表,但筛选条件可能包含:机会名称、客户 (可关联选择
Selectwithoptionsfrom client API)、销售阶段 (Select- 使用constants/opportunityStage.ts定义)、预计成交金额、创建人。 - 表格字段:机会名称、客户、销售阶段、预计金额、预计成交日期、负责人、创建时间、操作。
- 阶段可视化: 在“销售阶段”列,可以根据阶段值使用不同颜色的
Tag组件 (<Tag color="blue">/green/red) 直观展示。 - 操作:查看、编辑、删除、推进阶段(重要!)。
- 新增按钮: 跳转到
OpportunityForm。
- 类似客户列表,但筛选条件可能包含:机会名称、客户 (可关联选择
详情页 (
OpportunityDetail.tsx):- 展示机会所有信息。
- 关键:展示该机会关联的客户详情(可链接到客户详情页)。
- 操作:“编辑”、“推进阶段”、“返回列表”。
- 推进阶段:
- 可以是一个
Button或Dropdown。 - 点击弹出
Modal,包含一个Form,让用户选择下一个阶段。 - 提交后调用更新 API,成功后刷新详情页。
- 可以是一个
表单页 (
OpportunityForm.tsx):- 核心字段:机会名称、关联客户 (
Select组件,异步加载客户列表 - 使用Select的showSearch,filterOption,onSearch实现)、销售阶段 (Select)、预计金额 (InputNumber)、预计成交日期 (DatePicker)、负责人 (Select- 假设有用户系统)。 - 客户选择: 实现搜索功能,避免加载全部客户。使用
useClientListHook 并支持name参数搜索。 - 金额输入: 使用
InputNumber,配合numberUtils格式化显示。
- 核心字段:机会名称、关联客户 (
四、 Ant Design 最佳实践要点
- 遵循设计规范:使用 AntD 的组件和设计语言,保持 UI 一致性。不要过度自定义破坏整体感。
- 善用
Form:这是 MVP 开发效率的关键。利用其布局、校验、数据收集能力。 - 合理使用
Modal,Drawer,Message,Notification:- 删除确认用
Popconfirm。 - 复杂表单或详情查看用
Modal。 - 编辑侧边栏或筛选面板可用
Drawer。 - 操作反馈用
message.success/error/info()。 - 重要系统通知用
notification。
- 删除确认用
- 表格 (
Table) 性能: 对于大数据量,考虑virtualized(虚拟滚动),但 MVP 通常数据量不大。 - 主题定制: 通过
less变量覆盖或ConfigProvider动态修改主题色,快速匹配品牌色。 - 国际化 (i18n): 如果需要,MVP 阶段可引入
react-intl或i18next,AntD 支持良好。
五、 MVP 开发流程与注意事项
- 需求聚焦:MVP 只做最核心的增删改查 (CRUD) 和主要筛选。砍掉非必要特性(如复杂报表、审批流、邮件集成)。
- 快速原型:先用 AntD 组件搭出静态页面,确认 UI/UX 流程。
- Mock 数据: 在后端未完成时,使用
Mock.js或MSW模拟 API,前端并行开发。 - 优先实现核心路径:先打通“创建客户 -> 创建机会 -> 查看列表 -> 编辑”的主流程。
- 错误处理:
- API 请求失败:在
axios拦截器中统一处理,使用message.error()提示。 - 表单校验失败:AntD Form 会自动高亮。
- 网络错误、404 等:提供友好的提示页面 (
components/common/ErrorPage)。
- API 请求失败:在
- 代码质量:
- TypeScript: 严格定义
models和函数参数/返回值。 - Linting:开发时实时检查。
- 组件复用:将公共部分(如搜索表单、处理按钮组)抽离成组件。
- TypeScript: 严格定义
- 部署: MVP 可部署到 Vercel, Netlify, 或简单的 Nginx 服务器。确保构建 (
vite build) 成功。
六、 未来扩展性考虑
- 状态管理升级:当业务复杂时,可平滑迁移到 Zustand 或 Redux Toolkit。
- 权限控制: 在
routes.ts中定义路由权限,在App或Layout中根据用户角色 (AuthContext) 控制路由访问和按钮显示。 - 模块化: 项目结构已按模块划分,新增“合同管理”、“任务管理”等模块可直接在
pages/下创建新目录。 - 微前端:倘若未来系统庞大,当前的模块化结构有利于拆分。
总结:
启用 Ant Design 构建 CRM MVP,核心在于利用其成熟的组件库加速开发,借助合理的项目结构保持代码清晰,聚焦核心功能,并利用 TypeScript 和工具链保证质量。遵循以上实践,你可以在短时间内交付一个功能完整、界面专业、易于维护和扩展的 CRM MVP。
浙公网安备 33010602011771号