CRM客户关系管理系统(一) 第一章、CRM介绍和开发流程第二章、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.ForeignKey('ClassList',verbose_name='班级',on_delete=models.CASCADE)

    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

创建超级用户,进入后台

本章节代码   github下载   (commit3: Num1 CRM需求分析和表结构设计(修改了model字段)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

生物分类法(Biological Classification)

昨天,我看到有人提到林奈(Carl von Linné,1707-1778)的著作中对植物有着动人的描写。今天,我就想去找一下,结果查了好几个图书馆的数据库,都...

3007
来自专栏牛客网

【360烤面筋】

【每日一语】生存在我们每个人体内的,一到时候,它就会抖掉身上的尘土,慢慢地萌芽开来。——《穿条纹睡衣的男孩》

762
来自专栏腾讯大讲堂的专栏

1024丨腾讯第一首程序员之歌【Code代码】

“发布总是在半夜 回滚是永远的愁”。 内存泄漏、深夜发布、需求变更,这些熟悉的词语和场景,相信对于每个程序员朋友来说,都有着独特的记忆和感触,在此谨祝全天下的程...

1.1K5
来自专栏阮一峰的网络日志

关于BT下载电影

BT下载的一个注意点,就是你必须认清版本。同一部电影,网上往往有几十个、甚至几百个版本,有的版本质量很糟糕,下载它们就是浪费时间和带宽。

5763
来自专栏牛客网

从0offer到一天谈完薪资,几乎结束秋招,前端面经回馈牛客

个人是双非渣本,没有实习经历,但是自己的项目经验巨多,之前是搞算法的,后来转向前端

2112
来自专栏吉浦迅科技

PGI 2014 编译器即日起提供试用,可支持AMD GPU和APU

为针对高效能运算,并加入全新效能及简易程序功能,并行计算编译器与开发工具 PGI 即日起推出全新 PGI 2014 编译器,新版本针对 NVIDIA 和 AM...

3239
来自专栏牛客网

美团大零售事业群-闪购 一面(已通过)

以前以为坚持就是永不动摇,现在才明白,坚持是犹豫着退缩着心猿意马着,但还在继续往前走。——《意林》

941
来自专栏深度学习之tensorflow实战篇

R语言进行分析,比较详细的一篇,亲测过哦

要分析文本内容,最常见的分析方法是提取文本中的词语,并统计频率。频率能反映词语在文本中的重要性,一般越重要的词语,在文本中出现的次数就会越多。词语提取后,还可以...

36611
来自专栏牛客网

新疆学子的腾讯后台开发的面经

4月26日收到了腾讯的offer,终于安心了,很多小伙伴们要我写面经介绍下,其实自己能拿到腾讯的offer 99%是运气~, 这里就介绍下自己的面经跟总结自己的...

4446
来自专栏日常学python

Python:忽如一夜春风来,千树万树梨花开

我的主人是荷兰人,叫做Guido Van Rossum, 这是个不大容易念的名字,估计很多人现在也不知道怎么去发音。 球迷老刘看到Van ,总是想起范·巴斯滕。

1312

扫码关注云+社区

领取腾讯云代金券