第一章、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
創建超級用戶,進入后台
