客户关系管理系统(一)
客户关系管理系统
项目中各个角色的关系

创建项目

配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'PerfectCRM',
'USER': 'root',
'PASSWORD': 'mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
在数据库中创建 PerfectCRM数据库

在配置文件中配置静态文件的路径
STATICFILES_DIRS = ( os.path.join(BASE_DIR, "statics"), )
创建crm应用
python manage.py startapp crm
把crm应用注册到应用列表中

在crm应用的model.py中创建模型类
from django.db import models from django.contrib.auth.models import User
定义客户信息表
class Customer(models.Model): '''客户信息表''' name = models.CharField(max_length=32,blank=True,null=True) qq = models.CharField(max_length=64,unique=True) qq_name = models.CharField(max_length=64,blank=True,null=True) phone = models.CharField(max_length=64,blank=True,null=True) source_choices = ((0,'转介绍'), (1,'QQ群'), (2,'官网'), (3,'百度推广'), (4,'51CTO'), (5,'知乎'), (6,'市场推广') ) source = models.SmallIntegerField(choices=source_choices) referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True) consult_course = models.ForeignKey("Course",verbose_name="咨询课程") content = models.TextField(verbose_name="咨询详情") tags = models.ManyToManyField("Tag",blank=True,null=True) status_choices = ((0,'已报名'), (1,'未报名'), ) status = models.SmallIntegerField(choices=status_choices,default=1) consultant = models.ForeignKey("UserProfile") memo = models.TextField(blank=True,null=True) date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.qq class Meta: verbose_name ="客户表" verbose_name_plural ="客户表"
定义标签
class Tag(models.Model): name = models.CharField(unique=True,max_length=32) def __str__(self): return self.name class Meta: verbose_name = "标签" verbose_name_plural = "标签"
定义客户跟进表
class CustomerFollowUp(models.Model): '''客户跟进表''' customer = models.ForeignKey("Customer") content = models.TextField(verbose_name="跟进内容") consultant = models.ForeignKey("UserProfile") intention_choices = ((0,'2周内报名'), (1,'1个月内报名'), (2,'近期无报名计划'), (3,'已在其它机构报名'), (4,'已报名'), (5,'已拉黑'), ) intention = models.SmallIntegerField(choices=intention_choices) date = models.DateTimeField(auto_now_add=True) def __str__(self): return "<%s : %s>" %(self.customer.qq,self.intention) class Meta: verbose_name = "客户跟进记录" verbose_name_plural = "客户跟进记录"
定义课程表
class Course(models.Model): '''课程表''' name = models.CharField(max_length=64,unique=True) price = models.PositiveSmallIntegerField() period = models.PositiveSmallIntegerField(verbose_name="周期(月)") outline = models.TextField() def __str__(self): return self.name class Meta: verbose_name = "课程表" verbose_name_plural = "课程表"
定义校区表
class Branch(models.Model): '''校区''' name = models.CharField(max_length=128,unique=True) addr = models.CharField(max_length=128) def __str__(self): return self.name class Meta: verbose_name = "校区" verbose_name_plural = "校区"
定义班级表
class ClassList(models.Model): '''班级表''' branch = models.ForeignKey("Branch",verbose_name="校区") course = models.ForeignKey("Course") class_type_choices = ((0,'面授(脱产)'), (1,'面授(周末)'), (2,'网络班') ) class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="班级类型") semester = models.PositiveSmallIntegerField(verbose_name="学期") teachers = models.ManyToManyField("UserProfile") start_date = models.DateField(verbose_name="开班日期") end_date = models.DateField(verbose_name="结业日期",blank=True,null=True) def __str__(self): return "%s %s %s" %(self.branch,self.course,self.semester) class Meta: unique_together = ('branch','course','semester') verbose_name_plural = "班级" verbose_name = "班级"
定义上课记录表
class CourseRecord(models.Model): '''上课记录''' from_class = models.ForeignKey("ClassList",verbose_name="班级") day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") teacher = models.ForeignKey("UserProfile") has_homework = models.BooleanField(default=True) homework_title = models.CharField(max_length=128,blank=True,null=True) homework_content = models.TextField(blank=True,null=True) outline = models.TextField(verbose_name="本节课程大纲") date = models.DateField(auto_now_add=True) def __str__(self): return "%s %s" %(self.from_class,self.day_num) class Meta: unique_together = ("from_class", "day_num") verbose_name_plural = "上课记录"
定义学习记录表
class StudyRecord(models.Model): '''学习记录''' student = models.ForeignKey("Enrollment") course_record = models.ForeignKey("CourseRecord") attendance_choices = ((0,'已签到'), (1,'迟到'), (2,'缺勤'), (3,'早退'), ) attendance = models.SmallIntegerField(choices=attendance_choices,default=0) score_choices = ((100,"A+"), (90,"A"), (85,"B+"), (80,"B"), (75,"B-"), (70,"C+"), (60,"C"), (40,"C-"), (-50,"D"), (-100,"COPY"), (0,"N/A"), ) score = models.SmallIntegerField(choices=score_choices,default=0) memo = models.TextField(blank=True,null=True) date = models.DateField(auto_now_add=True) def __str__(self): return "%s %s %s" %(self.student,self.course_record,self.score) class Meta: unique_together = ('student','course_record') verbose_name_plural = "学习记录"
定义报名表
class Enrollment(models.Model): '''报名表''' customer = models.ForeignKey("Customer") enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级") consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问") contract_agreed = models.BooleanField(default=False,verbose_name="学员已同意合同条款") contract_approved = models.BooleanField(default=False,verbose_name="合同已审核") date = models.DateTimeField(auto_now_add=True) def __str__(self): return "%s %s" %(self.customer,self.enrolled_class) class Meta: unique_together = ("customer","enrolled_class") verbose_name_plural = "报名表"
定义缴费记录表
class Payment(models.Model): '''缴费记录''' customer = models.ForeignKey("Customer") course = models.ForeignKey("Course",verbose_name="所报课程") amount = models.PositiveIntegerField(verbose_name="数额",default=500) consultant = models.ForeignKey("UserProfile") date = models.DateTimeField(auto_now_add=True) def __str__(self): return "%s %s" %(self.customer,self.amount) class Meta: verbose_name_plural = "缴费记录"
定义账号表
class UserProfile(models.Model): '''账号表''' user = models.OneToOneField(User) name = models.CharField(max_length=32) roles = models.ManyToManyField("Role",blank=True,null=True) def __str__(self): return self.name
定义角色表
class Role(models.Model): '''角色表''' name = models.CharField(max_length=32,unique=True) menus = models.ManyToManyField("Menu",blank=True) def __str__(self): return self.name class Meta: verbose_name_plural = "角色"
定义菜单
class Menu(models.Model): '''菜单''' name = models.CharField(max_length=32) url_name = models.CharField(max_length=64) def __str__(self): return self.name
在crm应用的admin.py中把各个模型类注册到后台管理界面
from django.contrib import admin from crm import models # Register your models here. class CustomerAdmin(admin.ModelAdmin): list_display = ('id','qq','source','consultant','content','status','date') list_filter = ('source','consultant','date') search_fields = ('qq','name') raw_id_fields = ('consult_course',) filter_horizontal = ('tags',) list_editable = ('status',) class UserProfileAdmin(admin.ModelAdmin): list_display = ('user','name') admin.site.register(models.Customer,CustomerAdmin) admin.site.register(models.CustomerFollowUp) admin.site.register(models.Enrollment) admin.site.register(models.Course) admin.site.register(models.ClassList) admin.site.register(models.CourseRecord) admin.site.register(models.Branch) admin.site.register(models.Role) admin.site.register(models.Payment) admin.site.register(models.StudyRecord) admin.site.register(models.Tag) admin.site.register(models.UserProfile,UserProfileAdmin) admin.site.register(models.Menu)
迁移数据库
python manage.py makemigrations
执行迁移
python manage.py migrate
创建超级管理员用户
python manage.py createsuperuser
登陆后台管理界面


在根基路由url.py中把应用crm的应用关联进去
url(r'^crm/', include('crm.urls')),

在crm应用的view.py中定义各个角色访问的首页的视图函数(销售访问的是销售首页和客户首页,学生访问到的是学生首页,总之根据角色的不同,访问到的页面也不相同)
from django.shortcuts import render,HttpResponse from django.views.generic import View
class Index(View): def get(self,request): return render(request,'index.html')
定义各个关系的url
from django.conf.urls import url from crm import views
urlpatterns=[ url(r'^$', views.Index.as_view(),name="sales_index"), ]
默认后台登陆的用户就是当前的用户(当前登陆的用户是zhangbiao,它的默认身份是销售)
在角色表中,销售能访问到的菜单是销售首页和客户库

前端的部分代码如下
当前的用户名
{{ request.user }}
根据当前的用户找到对应的角色,根据角色找到每个角色访问到的不同菜单
{% for role in request.user.userprofile.roles.all %}
{% for menu in role.menus.all %}
<li class=""><a href="#">{{ menu.name }}</a></li>
{% endfor %}
{% endfor %}
在浏览器中输入
http://127.0.0.1:8000/crm/
返回的销售页面如下

为各个菜单添加视图函数
def customer_list(request):
return render(request,"sales/customers.html")
定义其url
url(r'^customers/$', views.customer_list, name="customer_list"),
把前端中的index.html中的各个菜单的url设置如下
<li class=""><a href="{% url menu.url_name %}">{{ menu.name }}</a></li>
它回去找name = {{ menu.url_name }} 中的 url路径

点击客户库菜单返回的页面如下

在后台管理页面中创建学生(zyc)

指定学生能访问到的表是学生首页

创建学生的应用
python manage.py startapp student
把student应用注册到配置文件中

在根基路由url.py中把student应用的url.py与之关联
url(r'^student/', include("student.urls")),
在student应用的view.py中定义学生菜单的视图函数
from django.shortcuts import render
def index(request):
return render(request,"student/index.html")
配置其url
from django.conf.urls import url from student import views urlpatterns = [ url(r'^$', views.index,name="stu_index" ), ]
在后台管理界面登陆学生(zyc)
、
在地址栏中输入
http://127.0.0.1:8000/crm/
返回的是学生首页的菜单

点击学生首页返回的页面如下


浙公网安备 33010602011771号