PHP 怎么PHP CRM

wen PHP项目 2

本文目录导读:

PHP 怎么PHP CRM

  1. 选择合适的框架
  2. 核心功能模块设计
  3. 数据库设计
  4. 关键功能实现
  5. 权限管理
  6. 数据导入导出
  7. 邮件通知与提醒
  8. 最佳实践建议
  9. 推荐的开源CRM

我来帮你全面介绍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系统:

  1. SuiteCRM - 功能完善,开源免费
  2. YetiForce - 基于Vtiger,界面现代
  3. EspoCRM - 轻量级,易于定制
  4. PartKeepr - 适合小型团队

如果需要定制化开发,建议从Laravel + Vue.js/React开始搭建,这样能快速构建现代化的CRM系统,根据项目规模和需求,可以选择不同方案:

  • 小型项目:使用现成开源CRM
  • 中型项目:基于框架定制开发
  • 大型项目:完全自主开发+微服务架构

抱歉,评论功能暂时关闭!