PHP 初学者:从零开始构建简单的 CRM

Avatar of Richard Chen
Richard Chen

DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费信用额度!

客户关系管理 (CRM) 是一个系统,它管理客户与公司之间跨不同渠道的整个客户生命周期中的客户交互和数据。在本教程中,我们将构建一个自定义 CRM 使用 PHP,销售团队可以使用它在整个销售周期中跟踪客户。

我们将为销售人员创建一个简单的 CRM 系统

  • 访问他们的任务
  • 查看他们的潜在客户
  • 为每个潜在客户创建新的任务
  • 创建新的商机
  • 失去销售

销售经理将能够

  • 管理所有客户
  • 管理销售团队
  • 查看当前的销售活动

下载演示文件

CRM 的构建模块

以下是 CRM 的基本组件列表

  • 潜在客户:初始联系人
  • 帐户:有关您与之进行业务往来的公司的信息
  • 联系人:有关您认识和与之合作的人员的信息。 通常,一个帐户有多个联系人
  • 商机:合格的潜在客户
  • 活动:任务、会议、电话、电子邮件以及任何其他允许您与客户互动的活动
  • 销售:您的销售团队
  • 仪表板:CRM 仪表板不仅仅是漂亮的界面。 它们应该一目了然地提供关键信息,并提供链接以深入了解更多详细信息。
  • 登录:销售人员和经理在系统中具有不同的角色。 经理可以访问报告和销售管道信息。
销售流程概述

系统要求

  • PHP 5.3+,
  • MySQL 或 MariaDB
  • phpGrid

创建 CRM 数据库

我们将从创建自定义 CRM 数据库开始。 我们将使用的主要表是

  • 联系 – 包含基本客户数据
  • 备注 – 保存销售人员从联系人处收集的信息。
  • 用户 – 有关销售人员的信息
主要数据库表

联系 表包含基本客户信息,包括姓名、公司地址、项目信息等。

备注 表用于存储所有销售活动信息,例如会议和电话。

用户 表保存有关系统用户(例如用户名和密码)的登录信息。 用户还可以具有角色,可以是销售人员或经理。

所有其他表都是简单的 查找表,用于连接到上述三个主要关系数据库表。

  • contact_status – 包含联系状态,例如潜在客户和商机,每个状态都表示典型销售周期中的不同阶段
  • task_status – 任务状态可以是待处理或已完成
  • user_status – 销售人员可以是活跃的或非活跃的
  • todo_type – 一种任务类型,可以是任务或会议
  • todo_desc – 任务的描述,例如跟进电子邮件、电话和会议等。
  • 角色 – 用户可以是销售代表或经理

完整的数据库模式图

数据库模式是代表整个数据库的逻辑视图(表、视图、主键和外键)的结构。 数据库模式包括实体及其之间的关系。

在关系数据库中,每个表都应该有一个主键是一个很好的做法。 主键是每条记录的唯一标识符。 它可以是社会安全号码 (SSN)、车辆识别号码 (VIN),或者只是自动递增的数字(在向表中插入新记录时生成的唯一数字)。

以下是我们简单 CRM 的数据库图。 每个表中的关键符号代表表的 PRIMARY KEY。 放大镜表示连接到数据库中另一个表的 FOREIGN KEY。 有时我们称之为“查找”表。

install.sql

一旦您了解了数据库表结构,请在 db 文件夹中找到 install.sql 脚本,并使用 MySQL 工具(例如 MySQL WorkbenchSequel Pro)来运行 SQL 脚本。 它应该创建一个名为 custom_crm 的新关系数据库及其数据库表。

设置 phpGrid

我们简单的 CRM 包含许多数据网格。 数据网格是一个类似电子表格的数据表,它显示表示数据库表中记录和字段的行和列。 数据网格使最终用户能够在网页上读取和写入数据库表。

我们选择来自 phpGrid 的数据网格工具来创建数据网格。 使用工具而不是从头开始构建的原因是,开发数据网格通常非常繁琐且容易出错。 数据网格库将为我们处理所有内部数据库 CRUD(创建、删除、更新和删除)操作,并以更少代码实现更好更快的结果。

要安装 phpGrid,请按照以下步骤操作

  1. 解压缩 phpGrid 下载文件
  2. 将 phpGrid 文件夹上传到 phpGrid 文件夹
  3. 通过配置 conf.php 文件来完成安装

在我们开始编码之前,必须在 conf.php(phpGrid 配置文件)中指定数据库信息。 以下是一些数据库连接设置示例

define('PHPGRID_DB_HOSTNAME', 'localhost'); 
define('PHPGRID_DB_USERNAME', 'root');     
define('PHPGRID_DB_PASSWORD', ''); 
define('PHPGRID_DB_NAME', 'custom_crm'); 
define('PHPGRID_DB_TYPE', 'mysql');  
define('PHPGRID_DB_CHARSET','utf8');
  • PHPGRID_DB_HOSTNAME – Web 服务器 IP 或主机名
  • PHPGRID_DB_USERNAME – 数据库用户名
  • PHPGRID_DB_PASSWORD – 数据库密码
  • PHPGRID_DB_NAME – 我们 CRM 的数据库名称
  • PHPGRID_DB_TYPE – 数据库类型
  • PHPGRID_DB_CHARSET – 在 MySQL 中始终为“utf8”

页面模板

CRM 页面模板

在我们开始构建 CRM 的第一页之前,最好使页面项(例如页眉和页脚)可重复使用。

页面将包含页眉、菜单、正文和页脚。 我们将从创建一个可重复使用的页面模板开始。

head.php

这是一个基本的 HTML5 模板页眉。 它包含一个指向自定义样式表的链接,该样式表将在后面的步骤中创建。




  
  
  

menu.php

顶部菜单栏

请注意 $_GET['currentPage'] 的使用。 每个页面都将设置一个值,该值将突出显示顶部菜单栏中当前页面的名称。

style.css 中包含以下代码以进行菜单样式设置。 它将把上面的无序列表转换为菜单。

#menu ul { 
  list-style-type: none; 
  margin: 0; 
  padding: 0; 
  overflow: hidden; 
  background-color: #1590C2;
} 
#menu ul li { 
  float: left; 
}
#menu ul li a { 
  display: block; 
  color: white;
  text-align: center; 
  padding: 14px 16px; 
  text-decoration: none; 
}
#menu ul li a:hover, 
#menu .active { 
  background-color: #ddd; 
  color: black; 
}

footer.php

我们在头部打开的元素的结束标签

我们完整的可复用页面模板

这是完整的页面模板。主要内容将在Section Title之后。

我的自定义 CRM


标题




CRM 主页

你还在吗?很好!现在我们可以最终开发 CRM 中的第一个页面了。

我们的销售团队成员 CRM 有四个页面

  • 任务
  • 潜在客户
  • 商机
  • 客户/已赢得

每个页面都表示典型销售周期中的不同阶段。

设计样机

这是我们为销售人员提供的 CRM 设计样机。

销售团队 CRM 屏幕

任务

当销售团队成员登录时,他看到的第一个页面是当前任务列表。

您可能还记得,我们的notes表格包含所有销售活动信息。我们可以使用phpGrid创建一个数据网格,并使用它从Notes表格中填充数据。

任务页面主要内容是一个数据网格。以下两行将为我们提供当前销售人员的任务列表。

 display();
?>
  • 第一行通过传递SELECT SQL 语句、它的主键 - ID,以及数据库表名 - notes 来创建一个phpGrid对象。
  • 第二行也是最后一行调用 display() 函数以在屏幕上呈现数据网格。查看 基本数据网格演示以获取更多详细信息。

潜在客户

潜在客户页面包含销售人员负责的当前潜在客户列表。每个潜在客户可以有一个或多个笔记。我们将为此使用 phpGrid 子网格 功能。

我们还需要使用 set_query_filter() 来仅显示潜在客户,Status = 1,并且仅针对当前销售人员。

联系人状态表

联系人状态表
set_query_filter(" Status = 1 && sales_rep = 1 ");

  // the detail grid displays notes about a lead
  $sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
  $sdg->set_query_filter(" Sales_Rep = 1 ");
  $sdg->enable_edit();

  $dg->set_subgrid($sdg, 'Contact', 'id');
  $dg -> display();
?>

商机

一旦潜在客户获得资格,它就会成为商机。商机页面类似于潜在客户页面。唯一的区别是set_query_filter中过滤的 状态代码是Status = 2

set_query_filter(" Status = 2 && sales_rep = 1 ");

  $sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
  $sdg->set_query_filter(" Sales_Rep = 1 ");
  $sdg->enable_edit();

  $dg->set_subgrid($sdg, 'Contact', 'id');
  $dg -> display();
?>

客户/已赢得

客户/已赢得的Status = 3。与潜在客户和商机类似,客户/已赢得也可以有笔记。

set_query_filter(" Status = 3 && sales_rep = 1 ");

  $sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
  $sdg->set_query_filter(" Sales_Rep = 1 ");
  $sdg->enable_edit();

  $dg->set_subgrid($sdg, 'Contact', 'id');
  $dg -> display();
?>

这就是我们简单 CRM 中销售人员需要了解的全部内容。

经理仪表板

销售经理可以访问销售管道中的所有记录,以及管理销售团队和客户数据的权限。

以下是设计样机

我的销售代表

菜单

经理仪表板有三个菜单项。

主要内容

每个菜单项代表 CRM 数据库中的一个表。$_GET['gn']将存储表名。它根据传递的表名动态生成数据网格。

set_subgrid($sdg, 'sales_rep', 'id');
        break;

    case "notes":
        $dg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
        break;

    case "contact":
        $dg = new C_DataGrid("SELECT * FROM contact", "id", "contact");

        $sdg = new C_DataGrid("SELECT * FROM notes", "id", "notes");
        $sdg->enable_edit();

        $dg->set_subgrid($sdg, 'Contact', 'id');
        break;
}

  $dg->enable_edit();
  $dg->display();
?>

我的销售代表

由于销售经理需要快速了解销售人员正在与谁合作,因此我们添加了一个从联系人表填充并与父网格链接的详细信息网格$sdg

$sdg = new C_DataGrid("SELECT * FROM contact", "id", "contact");
$dg->set_subgrid($sdg, 'sales_rep', 'id');

sales_repcontact表中连接到id的键,而idusers表中的外键。请记住,users存储了我们所有销售人员的信息。

屏幕截图

CRM - 销售屏幕
CRM - 经理屏幕

互动演示

CRM 销售代表屏幕
CRM 经理屏幕

GitHub 源代码

仓库