返回顶部

客户关系管理系统(一)

客户关系管理系统

项目中各个角色的关系

 创建项目

 

配置数据库

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 ="客户表"
View Code

 

定义标签

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 = "标签"
View Code

 

定义客户跟进表

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 = "客户跟进记录"
View Code

 

定义课程表

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 = "课程表"
View Code

 

定义校区表

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 = "校区"
View Code

 

定义班级表

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 = "班级"
View Code

 

定义上课记录表

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 = "上课记录"
View Code

 

定义学习记录表

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 = "学习记录"
View Code

 

定义报名表

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 = "报名表"
View Code

 

定义缴费记录表

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 = "缴费记录"
View Code

 

定义账号表

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
View Code

 

定义角色表

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 = "角色"
View Code

 

定义菜单

class Menu(models.Model):
    '''菜单'''
    name = models.CharField(max_length=32)
    url_name = models.CharField(max_length=64)

    def __str__(self):
        return self.name
View Code

在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)
View Code

 

迁移数据库

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/  

 

返回的是学生首页的菜单

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

 

posted @ 2018-01-05 01:08  Crazymagic  阅读(377)  评论(0)    收藏  举报