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
创建超级用户,进入后台
皮豆设计(logo设计神器):http://pidou.cn