一、CRM系统需求分析
本篇内容
-
业务痛点分析
-
项目需求讨论
-
使用场景分析
-
表结构设计
1.业务痛点分析
刚加入XX教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每月算工资时,就按这个表来统计招生提成.
后来学校大了点,教室变成了3间,招生老师变成了4个人,招的学生也开始多了起来,不过大家依然是招了学生就纪录在自己的excel里,但问题开始出现了,我们的招生多是通过网络qq聊天在线咨询,好多客户需要聊很久才能转化成学员,经常会出现一个客户跟一个招生老师聊过后,过了一段时间却在另一个招生老师那报名了。
于是争执就出现了,A销售说这个人是先找我咨询的,我帮他回答了大多数问题,报名提成却算成B的,不公平。B销售也会讲,这个客户找他咨询时并未说自己之前跟其它销售聊过呀,所以对B来讲,这就是个新客户呀,并且是在B这报的名, 凭什么要分提成给A呀。
为了解决这个问题,于是想出一个办法,搞了一个机器做共享服务器,共享服务器上搞了个统一的客户信息excel表,大家每人聊过的客户都在这个表里纪录, 这样每个人录入前,先在表格里全局查一下,这个客户的qq号是不是已经在表里了,这样就能避免冲突了。
但用过共享文件的应该都遇到过一个问题就是,为保证数据一致性,同一时间系统只允许一个用户修改数据, 但我们的每个招生老师一上班,就会打开这个共享文件,随时聊的学生,随时会录入到表里。但这个限制使的大家,只要一有人录入信息,就得要求其它销售人员都把文件先关闭,录入信息后其它人才能再用,这搞的大家很难受。 所以销售人员经常让我帮开发个系统,可以解决一些类似这样的问题。
另外, 我们在讲课时, 为了保证和检验学员的学习效果, 每节课讲完时都会给学生部置一个作业,要求他必须在下节上课前完成并提交作业,老师会给学员统一批作业,作业成绩也纪录在excel表中,就像下图一样。每个老师维护自己班级的作业,校长如果想看各个班级的成绩,还要跟每个老师要学员成绩表,很不方便, 当时校长就跟我讲,学员的成绩/出勤情况等要是也能统一管理就好了。
于是我心里也一直纪着这个事,想帮学校开发一个学员开发一个类似CRM(客户关系管理软件)的系统,集销售管理/学员管理等功能于一体。到现在,这个系统在公司已经用了一年多了,大家每天都在使用,之前的痛点都解决了,特别是销售人员, 工作已经离不开这个系统了,自己做的东西帮别人解决具体问题,心里还是蛮开森的!
个人觉得这个学员管理系统的挺适合新手练习的,难度适中,用户的知识点也比较综合,所以把学校里的系统简化了一下,提练成了一个教学项目,下面我们就一起来做一个喽。
噢,对了,最后说一下这个项目涉及到的知识点,请确保你以充分掌握了下面所列知识点再学习此项目噢!
- Django
- JQuery
- BootStrap
- Ajax
- HTMS\CSS
2.项目需求讨论
首先给我们的项目起个名字吧,这个系统要同时支持销售管理、学员管理、讲师管理以及权限管理等功能,功能比较杂,不能称之为严格意上的CRM,因为CRM一般只包括销售管理,but anyway, who cares,我们就叫它”Obcrm管理系统”吧。
起好了名字,开始动手写之前, 肯定要把需求想清楚,需求想不清楚就开始写的话,等于给自己挖坑,你肯定不想出现写了5千行代码后,突然发现,需求搞错了,还要重新推到重来的事情吧。
所以,现在静下心,把需求想明白,画好思维导图,跟同事多讨论应用场景,做了各方面论证后,再开始动工噢。
我们的系统的用户分3种,销售\学生\讲师,这3个角色关注的事情是不同的, 销售只关注招了多少学员,讲师关注自己管理的班级学习成绩怎样,学员只关注自己的学习成绩。 因此在想需求时,你要从每个角色出发,看他关心的是什么, 于是我画出了这个思维导图。
根据思维导图,我们总结出以下具体需求:
- 把用户分为销售\学员\讲师3种角色,每个角色关心的事情不同,所以有要不同的用户视图,即销售人员登陆后只需要看他与他工作相关的就可以,讲师关心的事情不需要在销售视图里显示
- 销售人员可以录入客户信息,和后续跟进信息,因为一个客户可能要跟进好几次才会报名。 可以多种条件过滤查询用户,可以查看自己的销售业绩报表
- 学员主要2个功能,查询成绩\提交作业
- 讲师的主要功能是管理班级\ 批作业\上课点名
- 虽然现在只有一个校区,但要考虑到以后的扩展,以后全国可能有好多个校区,不同校区之间的数据应该是隔离的
- 这个系统里存放着大量的客户信息\学员数据等,都是公司的机密信息,设计系统时就要考虑到权限问题,不同的角色要有不同的权限,同一角色的不同用户也要允许有不同的权限。
3.使用场景分析
为了更加理清我们的项目开发需求,在动手写代码前,建议再有一个业务场景分析的步骤,即从用户角度写出你使用这个项目的具体场景,我们这里分为销售、讲师、学员3个角色,我分别给每个角色列出了几个使用场景:
1.销售
- 销售人员张三刚通过qq群聊了一个客户,咨询了"XX课程",录入了CRM
- 张三 回访了一个 一个月多前咨询的老客户,老客户说最近考虑报名,让张三 下周联系他办报名手续, 张三把这个回访信息 录入了crm
- 李四 今天录入了8个新客户,但发现有一个客户在录入时,系统提示,此客户信息已存在,于是就在客户库查了一下,发现 此客户 已被 张 三 在上周录入了,销售部有规定,在客户被录入一个月内,其它销售是不能抢这个单的,于是就提醒张三,让他跟这个客户主动再跟进一下
- 李四今天 有一个客户要报名,李四给客户发了在线报名 链接,要求其填写一些个人信息,上传证件照片等,交了500报名费后,将其正式添加到了报名的 班级里
- 销售主管 BigSB 查看了今天的销售报表, 查看了每个销售的最近一周 咨询的客户量,成单比, 每个课程 分别 报名了多少学员, 这些客户 都是从哪些渠道 过来的
2.讲师
- 讲师老李今天 要给2班上课, 上课前要进行点名, 于是创建了一条生课纪录 ,这条上课记录关联 着每个学员 这节课的 出勤状态,Alex 边点名边在系统 中纪录每个学员的状态 ,签到、迟到或缺勤。
- 今天的课上完后,老李给大家留了作业,在系统 里 找到今天 的上课记录,把作业 需求 写到了 上课纪录 里
- 过了一周, 老李 登录 系统 下载了所有学员这节课的作业 , 为每个学员批改了作业 并将学员的成绩纪录在了系统 里
3.学员:
- 学员小明 报名了“xx”课程, 交完报名费后,招生老师 给他发了一个报名地址 要求其填写,填写了个人信息 并上传了证件信息, 提交后, 过了一会,就发现自己的qq邮箱里收到了一封 OB学校的邮件, 告知他 已为其 生成了 学员账号,他按照邮件 提示 登录 了 的学员系统 ,看到系统 中可以 进入自己的班级,不过现在班级里 还没有上课纪录, 他还能在线查看他的学员合同
- 过了一周, 正式上课了,上了一天课,讲师 老李 布置了作业 , 小明过了几天 完成 作业后,登录 学员管理系统 , 发现有一条 自己的上课记录, 他点进去,看到了当节课的 作业 需求,及提交作业的方式 ,他只需要把作业 打包成.zip格式 ,直接拖拽到页面上的交作业区就可以了。
- 过了两天, 小明收到邮件提醒 ,说自己作业 得了个A,非常 的开森。
- 小明学了几个月好,发现OB讲师讲的好,自己学的也不错,于是极力推荐自己的2个朋友也来学习, 于是在自己的学员系统 里录入了2条推荐朋友学习的信息, 没过一会, 小明之前的招生老师就联系他说,已经收到他的推荐名单,很快就会联系 小明的朋友 。
好啦, 业务场景也分析完了,接下来我们终于可以开始搞事情啦!
二、表结构设计
1.项目的创建
既然要写一个crm项目,必然需要创建一个项目,这个项目我们使用的是django框架,我们给项目随便取个名字把,如我这里就叫ObCRM。第一个应用就叫customer。
2.表结构模型创建
业务需求分析好了,项目也创建好了,就要开始设计表结构,表结构应该包含所有业务涉及到的数据需求,一般来说,表结构的设计是重要的,一个项目的开展,运行,很大程度上都取决于这个项目对于数据表结构的设计如何。
这里我列出大概需要的表结构,
from django.db import models
# Create your models here.
class Customer(models.Model):
'''存储所有客户信息'''
pass
class ConsultRecord(models.Model):
'''存储客户的后续跟进信息'''
pass
class Enrollment(models.Model):
'''存储已报名学员的信息'''
pass
class cumpass(models.Model):
'''存储所有校区'''
pass
class ClassList(models.Model):
'''存储班级信息'''
pass
class Course(models.Model):
'''存储所开设课程的信息'''
pass
class CourseRecord(models.Model):
'''存储各班级的上课记录'''
pass
class StudyRecord(models.Model):
'''存储所有学员的详细的学习成绩情况'''
pass
class Userinfo(models.Model):
'''存储所有讲师\销售人员\学员 用户信息'''
pass
class Role(models.Model):
'''角色信息'''
pass
class Permission(models.Model)
pass
"""存储权限信息表"""
class Menu(models.Model):
"""存储菜单展示信息"""
pass
接下来分别解释每张表
- Customer表, 主要给销售人员用, 存储所有客户信息,里面要记录客户来源/姓名/qq/客户来源/咨询的内容等
- Enrollment学员报名表,这里为什么要把客户信息表 和 这个学员报名表分开呢? 因内一个学员可以报多个课程 ,每个课程 都需要单独记录学习成绩呀什么的,所以每报一个课程 ,就在这里生成 一条相应的报名记录。
- ConsultRecord:客户跟进表,这张表的意义很容易理解, 一个客户今天咨询后,你录入到了客户信息表,但他没报名, 所以过了一段时间,销售还得再跟他聊聊吧,聊完后,结果又没报,那也得纪录下来吧,因为每个销售每天要聊很多人,你不纪录的话, 可能下次再跟这个人聊时,你早已忘记上次聊了什么了, 这样会让客户觉得这个销售不专业,相反,如果把每次跟进的内容都纪录下来, 过了几个月,这个客户再跟你聊时,竟然发现,你还记得他的所有情况,他就觉得你很重视他,说不定一感动就报名了,哈哈。 所以,一条客户信息可能会对应多条跟进记录,是个1对多的关系,必须单独搞张表来记录
- ClassList班级表, 学生以班级为单位管理,这个表被学员表反向关联, 即每个学员报名时需要选择班级
- Course课程表,存储课程介绍\大纲等基本信息
- CourseRecord上课纪录表,每个班级都要上很多次课,讲师每上一次课的纪录都要纪录下来,以后可以方便统计讲师工资什么的
- StudyRecord学员学习纪录表,思考一下,如果你想实现纪录每位学员的详细学习纪录,即精确到每节课的成绩/出勤情况,怎么办?其实很简单, 先来看一下此时班级/上课纪录/学员学习纪录的关系图:
[
可以看出,一个班级对应多节课,每节课又对应多个学生的出勤和成绩,我们已经通过班级表(”ClassList”)和上课纪录表(”CourseRecord”)存储了班级信息和每节上课纪录,想存学生的每节课学习纪录的话只需要再搞一个表就可以了。
- Userinfo用户表,存储销售、讲师账户信息这里我们用django自带的认证系统,并对其进行自定制
- Role角色表,用于角色划分,用于权限管理,权限功能我们后面会实现,这里只在表里先存个简单的角色名
- Cumpass校区表,存储不同校区
- Menu菜单表,不同的角色看到的菜单不同, 我们支持动态菜单 ,所以需要把菜单 以及 和角色的关联存下来
- PaymentRecord缴费记录
好啦,表基本都建完了,接下来同步数据库,在同步数据库之前,我们思考一下,实际开发项目中,应该涉及到不同的应用,如权限管理、客户管理,学员管理等等。这就涉及到应用的分离,表结构的跨应用关联等等,一系列处理好后,再同步数据库,关于项目应用分离解耦合,下一章详述。