gaidy

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

创建超级用户,进入后台

 
 
 
 

分类:

技术点:

相关文章: