示例应用:CRM -- 客户关系管理

我们通过做一个轻量级的CRM来了解lightning框架的基本用法。

在此,我假设你已经跟随快速开始的指引,成功把lightning库安装到了你的项目中。

创建crm项目#

通过django的 startproject命令,创建一个名为crm的项目:

$./manage.py startproject crm

创建linghtning_crm应用#

通过django 的 startapp命令,我们创建一个名为lightning_crm的app。

$ cd crm
$ ./manage.py startapp lightning_crm

在项目的settings.py的 INSTALL_APPS中加入lightning_crm

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'lightning_crm'
]

编写业务模型#

主要业务模型有三个:

  1. 客户
  2. 联系人
  3. 跟进

嗯。另外有一个图片的数据模型

lightning_crm/models.py 的代码如下:

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from lightning.fields import ImageURLField
class Image(models.Model):
url = ImageURLField('链接')
name = models.CharField('文件名', max_length=200, null=True, blank=True)
create_time = models.DateTimeField('上传时间', auto_now_add=True)
create_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True, blank=True, verbose_name='上传者')
class Meta:
verbose_name = '图片'
verbose_name_plural = '图片'
class GMeta:
title_field = 'name'
creator_field = 'create_by'
class AbstractCustomer(models.Model):
name = models.CharField('名字', max_length=100)
description = models.CharField('简介', max_length=1024, null=True, blank=True)
avatar = ImageURLField('头像', blank=True, null=True)
is_organization = models.BooleanField('是否机构', default=False)
org_name = models.CharField('机构全称', max_length=200, null=True, blank=True)
org_code = models.CharField('机构代码', max_length=200, null=True, blank=True)
phone = models.CharField('电话', max_length=20, null=True, blank=True)
address = models.CharField('地址', max_length=300, null=True, blank=True)
email = models.EmailField('邮箱', max_length=100, null=True, blank=True)
weixin = models.CharField('微信号', max_length=100, null=True, blank=True)
qq = models.CharField('QQ号', max_length=100, null=True, blank=True)
identity_code = models.CharField('身份证号', max_length=100, null=True, blank=True)
stage = models.CharField('阶段', max_length=20, choices=settings.LIGHTNING_CRM_CUSTOMER_STAGES, default='')
source = models.CharField('渠道来源', max_length=100, choices=settings.LIGHTNING_CRM_CUSTOMER_SOURCE, default='')
referrer = models.ForeignKey('self', models.SET_NULL, null=True, blank=True, verbose_name='引荐客户')
follwer = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True, blank=True, verbose_name='跟进人', related_name='following_customers')
create_time = models.DateTimeField('创建时间', auto_now_add=True)
update_time = models.DateTimeField('修改时间', auto_now=True)
create_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True, blank=True, verbose_name='创建人', related_name='created_customers')
def __str__(self):
return self.name
class Meta:
abstract = True
verbose_name = '客户'
verbose_name_plural = '客户'
class GMeta:
title_field = 'name'
creator_field = 'create_by'
class Customer(AbstractCustomer):
class Meta(AbstractCustomer.Meta):
swappable = 'LIGHTNING_CRM_CUSTOMER_MODEL'
class Contact(models.Model):
customer = models.ForeignKey(settings.LIGHTNING_CRM_CUSTOMER_MODEL, models.SET_NULL,
null=True, blank=True, verbose_name='客户')
description = models.CharField('简介', max_length=1024, null=True, blank=True)
name = models.CharField('名字', max_length=100)
title = models.CharField('职位', max_length=100, null=True, blank=True)
avatar = ImageURLField('头像', blank=True, null=True)
phone = models.CharField('电话', max_length=20, null=True, blank=True)
address = models.CharField('地址', max_length=300, null=True, blank=True)
email = models.EmailField('邮箱', max_length=100, null=True, blank=True)
weixin = models.CharField('微信号', max_length=100, null=True, blank=True)
qq = models.CharField('QQ号', max_length=100, null=True, blank=True)
identity_code = models.CharField('身份证号', max_length=100, null=True, blank=True)
create_time = models.DateTimeField('创建时间', auto_now_add=True)
create_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL, null=True,
blank=True, verbose_name='创建人')
class Meta:
verbose_name = '联系人'
verbose_name_plural = '联系人'
class GMeta:
title_field = 'name'
creator_field = 'create_by'
class FollowUp(models.Model):
customer = models.ForeignKey(settings.LIGHTNING_CRM_CUSTOMER_MODEL, models.SET_NULL,
null=True, blank=True, verbose_name='客户')
action_type = models.CharField('跟进类型', max_length=50,
choices=settings.LIGHTNING_CRM_FOLLOWUP_TYPE,default='')
content = models.TextField('跟进内容', null=True, blank=True)
images = models.ManyToManyField(Image, blank=True, verbose_name='图片')
contacts = models.ManyToManyField(Contact, blank=True, verbose_name='联系人')
follow_up_time = models.DateTimeField('创建时间', auto_now_add=True)
follow_up_by = models.ForeignKey(settings.AUTH_USER_MODEL, models.SET_NULL,
null=True, blank=True, verbose_name='跟进人')
class Meta:
verbose_name = '跟进'
verbose_name_plural = '跟进'
class GMeta:
creator_field = 'follow_up_by'

我们除了看到熟悉的Django 模型代码外,还发现多了一个GMeta的类定义,它是lightning专用属性定义的类,后继的文档会展开描述,本例中遇到的几个配置说明如下:

  1. title_field : 声明在界面展示整个对象数据的时候,默认使用的字段。如在列表中显示一个ForeignKey对象,会输出该对象的title_field字段,否则默认输出该对象的主键值。作用类似于__str__函数。
  2. creator_field : 声明创建者字段,该字段必须是用户类型的外键。作用是会自动使用当前登录的用户填充指定的字段,仅发生在数据的第一次保存时。类似DatetimeField的auto_now_add的功能。
  3. updater_field : 声明更新者字段,和creator_field是姐妹属性,要求的字段也是用户类型的外键,作用是会自动使用当前登录的用户填充指定的字段,发生在每一次数据的修改时。类似DatetimeField的auto_now的功能。

以上的模型代码中,有些字段的选项我们做成了可配置项(例如不同行业的客户在销售过程中有不同的阶段定义),需要在settings.py里面进行配置:

LIGHTNING_CRM_CUSTOMER_MODEL = 'lightning_crm.customer' # 客户模型
LIGHTNING_CRM_CUSTOMER_STAGES = ( # 客户阶段
('lead', '销售线索'),
('intention', '有意向'),
('trial', '试用'),
('paid', '付费'),
('repaid', '复购'),
('lost', '丢失')
)
LIGHTNING_CRM_CUSTOMER_SOURCE = ( # 客户来源渠道
('website', '网站'),
('wechat', '公众号'),
('recommand', '朋友推荐'),
)
LIGHTNING_CRM_FOLLOWUP_TYPE = ( # 跟进的类型
('call', '打电话'),
('email', '发邮件'),
('wechat', '微信沟通'),
('visit', '拜访'),
('meetting', '会议'),
)

我们建议你亲自动手创建应用和编写上面的代码来贴身感受lightning,当然也给懒人朋友准备好了完整的代码

应用模型变更#

执行django的migrate命令,为几个模型创建数据库表:

$ ./manage.py makemigrations
$ ./manage.py migrate

生成管理界面#

执行light 命令,为crm应用生成默认的管理界面:

$ ./manage.py light lightning_crm

查看生成的管理界面#

我们以客户管理的界面为例,看一下lightning自动生成的界面:

  1. 客户列表: 客户列表

  2. 添加客户 添加客户

  3. 客户详情 客户详情

调出配置管理界面#

默认生成的样子尚算可用,下面我们动动手,让客户管理的可用性更强,首先,在客户管理界面,我们点击右侧的页面配置按钮,唤出配置面板。

  1. 点击页页配置按钮:

客户列表

  1. 弹出配置界面: 页面配置

  2. 或者从菜单:开发管理 -> 页面配置 打开配置功能,可对每个模型进行页面配置: 页面配置

配置客户管理页面#

客户管理主要配置列表页和详情页

列表页#

列表字段#

列表字段配置,删掉多余的字段,保留下面的字段:

列表配置 其中第一个字段是组合字段,需要点击添加组合字段来开始,这个组合字段使用了图文模板,绑定了三个字段:

组合字段

阶段字段是一个彩虹标签的组件,展开配置如下:

列表配置

筛选字段#

允许用户通过以下条件筛选客户:

筛选条件配置

详情页#

客户详情页分了三个标签页显示:

  1. 标签1,显示客户自身的资料: 客户资料
  2. 标签2,显示客户的联系人列表。 联系人列表
  3. 标签3,显示对该客户的跟进历史。 跟进历史配置

客户管理页面中的联系人及跟进列表默认使用关联模型自身的列表配置,表单默认也是,当我们要调整这两个列表的细节时,我们找到这两个模型的页面配置面板进行调整。

配置联系人页面#

列表页#

保留以下列表字段,多余的可删除: 联系人列表

筛选条件清空或根据需要保留部份字段。

表单页#

表单页保留以下字段: 联系人表单

配置跟进人页面#

列表页#

保留以下列表字段: 跟进列表

筛选条件保留两个: 跟进筛选条件

表单页#

表单页保留以下字段: 跟进表单

关于图片上传#

要使用lightning的图片上传功能,在点击页面右上角的系统设置菜单,找到上传配置页,配置好上传的存储类型,目前支持文件系统、阿里云OSS和腾讯云COS: 上传配置

小结#

好了,到此为止,10分钟左右,一个简易的CRM系统就完成了,使用客户管理这个功能模块就能开始日常的客户管理工作了,以下是配置好的页面效果:

  1. 客户列表页面: 客户列表
  2. 客户详情页,支持多种详情排列样式和分组: 客户详情
  3. 客户详情页,还可以显示关联模型的列表数据: 客户跟进
  4. 客户详情页内,可以快速添加关联模型的数据: 新增跟进

当然距离产品级的CRM还需要更多的配置或开发工作,例如功能与数据权限的配置等,但我想你已经对lightning的威力有所体会了,如果对lightning感兴趣,那就继续往下学习吧!