CRM客户关系管理系统(一)
第一章、CRM介绍和开发流程
1.1.CRM简介
客户关系管理(CRM)
客户关系管理(customer relationship management)的定义是:企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互,从而提升其管理方式,向客户提供创新式的个性化的客户交互和服务的过程。其最终目标是吸引新客户、保留老客户以及将已有客户转为忠实客户,增加市场。
作用
1.提高市场营销效果
2.为生产研发提供决策支持
3.提供技术支持的重要手段
4.为财务金融策略提供决策支持
5.为适时调整内部管理提供依据
6.使企业的资源得到合理利用
7.优化企业业务流程
8.提高企业的快速响应和应变能力
9.改善企业服务,提高客户满意度
10.提高企业的销售收入
11.推动了企业文化的变革
12.与QQ集成,可以快速与客户沟通
1.2.CRM项目开发流程
(1)需求分析
- 存储所有的客户咨询信息
- 避免重复数据
- 客户的多次跟踪记录
- 客户来源、成单率分析
- 每个销售只能修改自己的客户信息
- 报名流程开发
班级管理
- 学员成绩,出勤管理
- 问卷调查
校区管理
课程管理
- 课程大纲管理,周期,价格,代课老师
讲师的上课记录
学员就业情况
知识库
权限管理
角色
- 销售
- 讲师
- 学员
- 管理员
(2)思维导图
(3)业务场景分析(用户使用场景)
销售
- 销售A 刚从 百度推广 聊了一个客户,录入了CRM系统,咨询了python全栈开发课程,但是没报名
- 销售B 从 qq群聊了客户,且报名了python全栈9期课程,给用户发送了报名连接,待用户填写完毕后,把他添加到了python fullstack s9的班级里
- 销售C 打电话给之前的一个客户,说服他报名linux40期,但是没说服成功,更新了跟踪记录
- 销售D 聊了一个客户,录入时发现,此客户已存在,不能录入,随后通知相应的客户负责人跟进
- 销售B 从客户库里过滤出了 所有超过一个月未跟踪的客户,然后进行跟踪(如果成了,这客户就算B的)
- 销售主管 查看了部门 本月的销售报表, 包括来源分析,成单率分析,班级报名数量分析,销售额同比
学员
- 客户A 填写了销售发来的报名链接,上传了个人的证件信息,并提交,过了一会儿,发现收到一个邮件,告知他报名python9期课程成功,并帮他开通了学员账号
- 学员A 登录了学员系统,看到了 自己的合同,报名的班级,以及课程大纲
- 学员A 提交了python9期的 第1节课的作业
- 学员A 查看了自己在python9期的学习成绩和排名
- 学员A 在线搜索一个问题,发现没有答案,于是提交了一个问题
讲师
- 登录了CRM,查看自己管理的班级列表
- 进入了python9期,创建了第一节的上课记录,填入了本节内容,作业需求
- 为python9期的第一节课,进行点名,发现科比迟到了,标记他为迟到状态
- 批量下载了所有学员的python9期第一节的作业,给每个学生在线 打成绩+批注
管理员
- 创建了 课程(linux,python)
- 创建了 校区(北京,上海)
- 创建了 班级(python fullstacks9和linux40)
- 创建了 账号(A,B,C,D)
- 创建了 销售,讲师,学员三个角色,并把ABCD分配到了销售角色里
- 设置了销售可以操作的权限
(4)原型图
产品经理画
(5)开发工具选型
开发工具
- pycharm
- python
- django
- mysql
- jquery
- bootstrap
- linux
- nginx
(6)创建项目
创建项目
- 设计表结构
- 开始写代码
第二章、CRM项目表结构设计
2.1.创建项目和app
workon CRM #虚拟环境 pip install django==1.11.6 #创建项目 项目名:PerfectCRM app名:crm
2.2.项目表结构设计
# crm/model.py __author__ = \'derek\' from django.db import models from django.contrib.auth.models import User class Role(models.Model): \'\'\'角色表\'\'\' name = models.CharField(max_length=64,unique=True) #不能重 class UserProfile(models.Model): \'\'\'用户信息表\'\'\' #关联django自带的User,可以自己扩展字段 user = models.ForeignKey(User,on_delete=models.CASCADE) name = models.CharField(\'姓名\',max_length=64) #一个用户可以有多个角色,一个角色可以对应多个用户 role = models.ManyToManyField(Role,blank=True,null=True) def __str__(self): return self.name class CustomerInfo(models.Model): \'\'\'客户信息表\'\'\' name = models.CharField(\'姓名\',max_length=64,default=None) contact_type_choices = ((0,\'qq\'),(1,\'微信\'),(2,\'手机\')) contact_type = models.SmallIntegerField(choices=contact_type_choices,default=0) contact = models.CharField(\'联系方式\',max_length=64,unique=True) source_choices = ((0,\'qq群\'),(1,\'51CTO\'),(2,\'百度推广\'),(3,\'知乎\'),(4,\'转介绍\'),(5,\'其它\'),) source = models.SmallIntegerField(\'客户来源\',choices=source_choices) #关联自己,如果是转介绍(介绍人已经是学员,然后介绍别人过来学习),需要填写转介绍人的信息,不是转介绍,这里就可以为空 referral_from = models.ForeignKey(\'self\',blank=True,null=True,verbose_name=\'转介绍\',on_delete=models.CASCADE) #可以咨询多个课程 consult_courses = models.ManyToManyField(\'Course\',verbose_name=\'咨询课程\') consult_content = models.TextField(\'咨询内容\',) status_choices = ((0,\'未报名\'),(1,\'已报名\'),(2,\'已经退学\')) status = models.SmallIntegerField(\'客户状态\',choices=status_choices) consultant = models.ForeignKey(\'UserProfile\',verbose_name=\'课程顾问\',on_delete=models.CASCADE) date = models.DateField(\'创建的时间\',auto_now_add=True) class Student(models.Model): \'\'\'学员表\'\'\' customer = models.ForeignKey(\'CustomerInfo\',verbose_name=\'客户\',on_delete=models.CASCADE) class_grades = models.ManyToManyField(\'ClassList\',verbose_name=\'班级\') def __str__(self): return self.customer class CustomerFollowUp(models.Model): \'\'\'客户跟踪记录表\'\'\' customer = models.ForeignKey(\'CustomerInfo\',on_delete=models.CASCADE) content = models.TextField(\'跟踪内容\',) user = models.ForeignKey(\'UserProfile\',verbose_name=\'跟进人\',on_delete=models.CASCADE) status_choices = ((0,\'近期无报名计划\'),(1,\'一个月内报名\'),(2,\'半个月报名\'),(3,\'已报名\'),) status = models.SmallIntegerField(\'客户状态\',choices=status_choices) date = models.DateField(\'创建的时间\', auto_now_add=True) class Course(models.Model): \'\'\'课程表\'\'\' name = models.CharField(\'课程名称\',max_length=64,unique=True) #价格必须为整数 price = models.PositiveSmallIntegerField(\'价格\',) period = models.PositiveSmallIntegerField(\'课程周期(月)\',default=5) outline = models.TextField(\'大纲\',) def __str__(self): return self.name class ClassList(models.Model): \'\'\'班级列表\'\'\' branch = models.ForeignKey(\'Branch\',verbose_name=\'校区\',on_delete=models.CASCADE) #一个班级只能有一个课程,一个课程可以有多个班级 course = models.ForeignKey(\'Course\',verbose_name=\'课程\',on_delete=models.CASCADE) class_type_choices = ((0,\'脱产\'),(1,\'周末\'),(2,\'网络班\')) class_type = models.SmallIntegerField(\'班级类型\',choices=class_type_choices,default=0) semester = models.SmallIntegerField(\'学期\',) teachers = models.ManyToManyField(\'UserProfile\',verbose_name=\'讲师\') start_date = models.DateField(\'开班日期\',) #毕业日期因为不固定,所以可以为空 graduate_date = models.DateField(\'毕业日期\',blank=True,null=True) def __str__(self): #班级名是课程名+第几期拼接起来的 return "%s(%s)期"%(self.course.name,self.semester) class Meta: #联合唯一,班级不能重复 unique_together = (\'branch\',\'class_type\',\'course\',\'semester\') class CourseRecord(models.Model): \'\'\'上课记录\'\'\' class_grade = models.ForeignKey(\'ClassList\',verbose_name=\'上课班级\',on_delete=models.CASCADE) day_num = models.PositiveSmallIntegerField(\'课程节次\',) teacher = models.ForeignKey(\'UserProfile\',verbose_name=\'讲师\',on_delete=models.CASCADE) title = models.CharField(\'本节主题\',max_length=64) content = models.TextField(\'本节内容\',) has_homework = models.BooleanField(\'本节有作业\',default=True) homework = models.TextField(\'作业需求\',blank=True,null=True) date = models.DateField(\'创建的时间\', auto_now_add=True) def __str__(self): #上课班级+课程节次 return "%s第(%s)节"%(self.class_grade,self.day_num) class Meta: unique_together = (\'class_grade\',\'day_num\') class StudyRecord(models.Model): \'\'\'学习记录表\'\'\' #一节课对应多个学生 course_record = models.ForeignKey(\'CourseRecord\',verbose_name=\'课程\') #一个学生有多个上课记录 student = models.ForeignKey(\'Student\',verbose_name=\'学生\',on_delete=models.CASCADE) score_choices = ((100,\'A+\'), (90,\'A\'), (85,\'B+\'), (80,\'B\'), (75,\'B-\'), (70,\'C+\'), (60,\'C\'), (40,\'C-\'), (-50,\'D\'), (0,\'N/A\'), #not avaliable (-100,\'COPY\'), #抄作业 ) score = models.SmallIntegerField(\'得分\',choices=score_choices,default= 0) show_choices = ((0,\'缺勤\'), (1,\'已签到\'), (2,\'迟到\'), (3,\'早退\'), ) show_status = models.SmallIntegerField(\'出勤\',choices=show_choices,default=1) note = models.TextField(\'成绩备注\',blank=True,null=True) date = models.DateField(\'创建的时间\', auto_now_add=True) def __str__(self): return "%s %s %s"%(self.course_record,self.student,self.score) class Branch(models.Model): \'\'\'校区分支\'\'\' name = models.CharField(\'校区名\',max_length=64,unique=True) addr = models.CharField(\'地址\',max_length=128,blank=True,null=True) def __str__(self): return self.name
注册models
# crm/admin.py from django.contrib import admin from crm import models admin.site.register(models.Role) admin.site.register(models.CustomerInfo) admin.site.register(models.Student) admin.site.register(models.CustomerFollowUp) admin.site.register(models.Course) admin.site.register(models.ClassList) admin.site.register(models.CourseRecord) admin.site.register(models.StudyRecord) admin.site.register(models.Branch)
2.3.生成表
(1)mysql
DATABASES = { \'default\': { \'ENGINE\': \'django.db.backends.mysql\', \'NAME\': \'perfectcrm\', #数据库名字 \'USER\': \'root\', #账号 \'PASSWORD\': \'123456\', #密码 \'HOST\': \'127.0.0.1\', #IP \'PORT\': \'3306\', #端口 } }
(2)pymysql
pip install pymysql 下载 mysqlclient-1.3.12-cp36-cp36m-win_amd64 下载地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装 pip install mysqlclient-1.3.12-cp36-cp36m-win_amd64
(3)_init__.py添加代码:
import pymysql pymysql.install_as_MySQLdb()
(4)设置中文
LANGUAGE_CODE = \'zh-hans\' TIME_ZONE = \'Asia/Shanghai\' USE_I18N = True USE_L10N = True USE_TZ = False
创建超级用户,进入后台