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

Avatar of Richard Chen
Richard Chen on

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

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

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

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

销售经理将能够

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

下载演示文件

CRM 的构建块

以下列出了 CRM 的基本组件

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

系统要求

  • PHP 5.3+
  • MySQL 或 MariaDB
  • phpGrid

创建 CRM 数据库

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

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

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

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

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

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

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

完整的数据库模式图

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

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

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

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()函数在屏幕上渲染数据网格。查看基本数据网格演示了解更多详细信息。

潜在客户

潜在客户页面包含销售人员负责的当前潜在客户列表。每个潜在客户可以有一个或多个Notes。我们将使用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 code是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。与潜在客户和商机类似,客户/赢单也可以有Notes。

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表中连接到users表中外键id的连接键。请记住,users存储着我们所有销售人员的信息。

截图

CRM – 销售屏幕
CRM – 经理屏幕

互动演示

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

GitHub 源代码

仓库