1. 项目概述:带工作流审批的CRM系统源码解析
这套基于ThinkPHP+Uniapp开发的CRM系统源码,最核心的价值在于内置了完整的工作流审批引擎。不同于市面上大多数需要额外集成BPM系统的方案,它原生支持从销售线索分配到合同审批的全流程自定义配置。我实测发现其审批流设计尤其适合中小企业的灵活需求——比如可以设置多级审批人、条件分支路由,甚至支持会签/或签等复杂场景。
系统采用前后端分离架构,后端基于ThinkPHP 8.0(兼容7.x),前端使用Uniapp实现跨平台运行。这种技术选型使得二次开发门槛大幅降低:PHP开发者可以快速理解后端逻辑,而熟悉Vue的工程师能无缝接手前端适配。特别值得注意的是,源码中已经处理好ThinkPHP的Nginx伪静态配置,这在很多开源项目中往往需要开发者自行摸索。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块拆解
2.1 工作流审批引擎实现
审批流的核心代码位于/application/workflow目录,采用状态机模式设计。其亮点在于可视化流程设计器(基于jsPlumb库实现),允许非技术人员通过拖拽方式配置:
- 多级审批人规则(支持按部门、角色、特定人员指定)
- 条件分支(如合同金额>50万需财务总监加签)
- 退回规则(可设置退回至指定节点)
- 审批时限预警
数据库层面使用workflow_definition和workflow_instance两张主表实现流程定义与运行时分离。这种设计使得运行中的审批流可以独立于流程模板更新,避免出现"修改审批流程影响已发起申请"的常见问题。
2.2 CRM业务模块架构
系统采用模块化设计,主要业务模块包括:
bash复制/module
├── customer # 客户管理
├── contract # 合同管理
├── product # 产品库
├── marketing # 营销活动
└── report # 数据分析
每个模块都遵循Yudao-CRM的标准化结构:
controller处理API请求service业务逻辑层dao数据访问层model实体定义
这种结构特别适合二次开发时的功能扩展,新增模块只需复制现有结构并修改对应配置。
3. 关键技术实现细节
3.1 ThinkPHP后端关键技术点
路由配置中特别处理了API版本控制:
php复制// config/route.php
Route::group('api/:version', function(){
Route::resource('customer', 'api/:version.Customer');
})->allowCrossDomain();
这种设计方便后续升级时维护多版本API兼容性。
数据库操作使用了TP的模型关联功能:
php复制// 模型定义
class ContractModel extends Model
{
protected $with = ['customer','product'];
public function customer()
{
return $this->belongsTo(CustomerModel::class);
}
}
通过with属性预加载关联数据,有效解决N+1查询问题。
3.2 Uniapp前端特殊处理方案
针对常见的白屏问题,源码中提供了多重解决方案:
- 路由拦截处理iOS白屏:
javascript复制// main.js
router.beforeEach((to, from, next) => {
if (!to.matched.length) {
uni.redirectTo({ url: '/pages/error/404' })
} else {
next()
}
})
- 图片加载优化采用base64转码方案,解决分包后图片路径问题
- 地理位置权限被拒后的降级处理:
javascript复制function getLocation() {
uni.getLocation({
success: () => {},
fail: () => {
uni.showModal({
content: '请手动开启定位权限',
success: (res) => {
if (res.confirm) {
uni.openSetting() // 跳转系统设置页
}
}
})
}
})
}
4. 二次开发实战指南
4.1 开发环境搭建要点
- PHP环境推荐使用PHPStudy集成环境:
- 必须开启PDO、mbstring等扩展
- Nginx配置需特别注意伪静态规则:
nginx复制location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?s=$1 last; } } - 前端开发需安装HBuilderX 3.4+版本
- 数据库初始化时注意字符集设置为utf8mb4
4.2 典型功能扩展案例
场景:增加采购审批流程
- 在
workflow_definition表新增流程模板 - 前端添加流程设计器配置项:
vue复制<flow-designer
:node-types="['start','end','approval','condition']"
:line-types="['solid','dashed']"
/>
- 后端实现审批回调接口:
php复制class PurchaseController extends BaseController
{
public function approveCallback($instanceId)
{
$status = WorkflowService::getInstanceStatus($instanceId);
if ($status == 'approved') {
PurchaseModel::where('flow_id',$instanceId)
->update(['status' => 2]);
}
}
}
5. 部署与运维关键点
5.1 生产环境部署方案
推荐使用Docker-compose编排:
yaml复制version: '3'
services:
app:
image: php:8.0-fpm
volumes:
- ./:/var/www/html
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: yourpassword
5.2 常见问题排查手册
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| iOS白屏 | 路由未正确捕获 | 检查uni-app的pages.json配置 |
| 审批流卡住 | workflow_instance表状态异常 | 手动执行php think workflow:recover |
| 上传失败 | PHP上传限制 | 修改php.ini中upload_max_filesize |
| 跨域问题 | Nginx未正确配置 | 添加add_header Access-Control-Allow-Origin * |
6. 二次开发深度优化建议
-
性能优化:
- 开启OPcache加速PHP
- 使用Redis缓存热点数据(客户基本信息、审批模板等)
php复制// config/cache.php 'default' => env('cache.driver', 'redis'), 'stores' => [ 'redis' => [ 'driver' => 'redis', 'connection' => 'default', ], ] -
移动端体验提升:
- 实现Uniapp原生插件保活机制(Android可用JobService)
- 采用差分更新策略减少OTA升级包体积
-
审批流增强:
javascript复制// 添加审批委托功能 function delegateApproval(originalUser, delegateUser, period) { db.collection('approval_delegate').add({ data: { from: originalUser, to: delegateUser, start: new Date(), end: new Date(Date.now() + period*24*60*60*1000) } }) }
这套源码在实际企业环境中使用时,建议重点关注审批流与业务单据的关联设计。我们团队在实施过程中发现,提前规划好business_type和business_id的关联规则,可以避免后期出现审批流与业务脱节的情况。另外,ThinkPHP的模型事件(如afterUpdate)非常适合用来触发审批状态变更通知,这比在控制器中硬编码要优雅得多。
