本文目录导读:

我来帮你全面介绍PHP CRM(客户关系管理系统)的开发方法:
选择合适的框架
主流PHP框架推荐
// Laravel - 最流行 composer create-project laravel/laravel crm // Symfony - 企业级 composer create-project symfony/skeleton crm // ThinkPHP - 国内常用 composer create-project topthink/think crm
核心功能模块设计
基本模块结构
// 1. 客户管理模块
class CustomerController extends Controller
{
public function index()
{
// 客户列表
$customers = Customer::with('contacts')
->where('company_id', auth()->user()->company_id)
->paginate(15);
return view('crm.customers.index', compact('customers'));
}
public function store(Request $request)
{
// 创建客户
$data = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email',
'phone' => 'required|string',
'company' => 'required|string'
]);
$customer = Customer::create($data);
// 记录活动日志
ActivityLog::create([
'user_id' => auth()->id(),
'action' => 'created_customer',
'target_id' => $customer->id
]);
return redirect()->route('customers.show', $customer);
}
}
// 2. 销售管理
class SalesPipelineController extends Controller
{
public function updateStage(Request $request)
{
$deal = Deal::find($request->deal_id);
$deal->stage = $request->stage;
$deal->save();
// 更新预计收入
$this->updateForecast($deal);
return response()->json(['success' => true]);
}
}
// 3. 跟进记录
class FollowUpController extends Controller
{
public function store(Request $request)
{
$followUp = FollowUp::create([
'customer_id' => $request->customer_id,
'user_id' => auth()->id(),
'note' => $request->note,
'next_followup_date' => $request->next_date
]);
// 设置提醒
if ($request->reminder_date) {
Reminder::create([
'user_id' => auth()->id(),
'followup_id' => $followUp->id,
'reminder_at' => $request->reminder_date
]);
}
}
}
数据库设计
核心表结构
-- 客户表
CREATE TABLE customers (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255),
phone VARCHAR(50),
company VARCHAR(255),
address TEXT,
source VARCHAR(50), -- 获客渠道
status ENUM('active', 'inactive', 'lost') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 联系人表
CREATE TABLE contacts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
customer_id BIGINT,
name VARCHAR(255),
position VARCHAR(100),
email VARCHAR(255),
phone VARCHAR(50),
is_primary BOOLEAN DEFAULT FALSE
);
-- 销售机会表
CREATE TABLE deals (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
customer_id BIGINT,
name VARCHAR(255),
amount DECIMAL(15,2),
stage VARCHAR(50),
probability INT DEFAULT 0,
expected_close_date DATE,
owner_id BIGINT
);
-- 跟进记录表
CREATE TABLE follow_ups (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
customer_id BIGINT,
user_id BIGINT,
note TEXT,
next_followup_date DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
关键功能实现
客户搜索与筛选
class CustomerSearch
{
public function search(array $filters)
{
$query = Customer::query();
// 关键词搜索
if (isset($filters['keyword'])) {
$query->where(function($q) use ($filters) {
$q->where('name', 'like', "%{$filters['keyword']}%")
->orWhere('email', 'like', "%{$filters['keyword']}%")
->orWhere('phone', 'like', "%{$filters['keyword']}%");
});
}
// 状态筛选
if (isset($filters['status'])) {
$query->where('status', $filters['status']);
}
// 日期范围
if (isset($filters['date_from'])) {
$query->whereDate('created_at', '>=', $filters['date_from']);
}
return $query->paginate(20);
}
}
图表统计
class DashboardController extends Controller
{
public function statistics()
{
// 销售漏斗数据
$pipeline = Deal::selectRaw('stage, COUNT(*) as count, SUM(amount) as total')
->groupBy('stage')
->get();
// 月度销售趋势
$monthlyRevenue = Deal::whereYear('created_at', now()->year)
->selectRaw('MONTH(created_at) as month, SUM(amount) as total')
->groupBy('month')
->get();
// 客户来源分析
$customerSources = Customer::selectRaw('source, COUNT(*) as count')
->groupBy('source')
->get();
return response()->json([
'pipeline' => $pipeline,
'monthly_revenue' => $monthlyRevenue,
'sources' => $customerSources
]);
}
}
权限管理
RBAC权限控制
class PermissionMiddleware
{
public function handle($request, Closure $next)
{
$user = auth()->user();
$permission = $request->route()->getName();
if (!$user->hasPermission($permission)) {
abort(403, '无权限访问');
}
return $next($request);
}
}
// 角色与权限关联
$adminRole = Role::create(['name' => 'admin']);
$adminRole->permissions()->attach(Permission::all());
$managerRole = Role::create(['name' => 'manager']);
$managerRole->permissions()->attach([
Permission::where('name', 'view_customers')->first(),
Permission::where('name', 'manage_deals')->first()
]);
数据导入导出
use Maatwebsite\Excel\Facades\Excel;
class CustomerImportExport
{
// 导出
public function export()
{
return Excel::download(new CustomersExport, 'customers.xlsx');
}
// 导入
public function import(Request $request)
{
Excel::import(new CustomersImport, $request->file('file'));
return redirect()->back()->with('success', '导入成功');
}
}
class CustomersExport implements FromCollection
{
public function collection()
{
return Customer::all();
}
}
邮件通知与提醒
class EmailNotification
{
public function sendWelcomeEmail(Customer $customer)
{
Mail::to($customer->email)
->send(new WelcomeCustomer($customer));
}
public function sendFollowUpReminder()
{
// 查询今日需要跟进的客户
$customers = Customer::whereHas('followUps', function($query) {
$query->whereDate('next_followup_date', today());
})->get();
foreach ($customers as $customer) {
// 发送提醒邮件
Mail::to($customer->email)
->send(new FollowUpReminder($customer));
}
}
}
最佳实践建议
性能优化
// 1. 使用缓存
Cache::remember('customers_list', 3600, function() {
return Customer::all();
});
// 2. 索引优化
Schema::table('customers', function ($table) {
$table->index(['name', 'email']);
$table->index('status');
});
// 3. 数据分页
$customers = Customer::paginate(15);
安全考虑
// 数据验证
$request->validate([
'email' => 'required|email',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10'
]);
// SQL注入防护
$query->where('name', 'like', '%' . $request->keyword . '%');
// XSS防护
echo e($customer->name); // 转义输出
推荐的开源CRM
如果你想使用现成的CMS系统:
- SuiteCRM - 功能完善,开源免费
- YetiForce - 基于Vtiger,界面现代
- EspoCRM - 轻量级,易于定制
- PartKeepr - 适合小型团队
如果需要定制化开发,建议从Laravel + Vue.js/React开始搭建,这样能快速构建现代化的CRM系统,根据项目规模和需求,可以选择不同方案:
- 小型项目:使用现成开源CRM
- 中型项目:基于框架定制开发
- 大型项目:完全自主开发+微服务架构