本文目录导读:

我来帮你全面介绍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
- 中型项目:基于框架定制开发
- 大型项目:完全自主开发+微服务架构
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播