Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部部门之间的业务。
model 认证方式继承于 django 自带认证
from django.contrib.auth.models import User
from django.db import models
from django.contrib.auth.models import User
CRM 项目表结构设计
class Role(models.Model):
'''角色表'''
name = models.CharField(max_length=64,unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name = "角色表"
verbose_name_plural = verbose_name
class UserProfile(models.Model):
'''用户信息表'''
# 关联django自带的User,可以自己扩展字段
user = models.ForeignKey(User,on_delete=models.CASCADE)
name = models.CharField(verbose_name='姓名',max_length=64)
# 一个用户可以有多个角色,一个角色可以对应多个用户
role = models.ManyToManyField(Role,blank=True,null=True)
def __str__(self):
return self.name
class Meta:
verbose_name = "用户信息表"
verbose_name_plural = verbose_name
class CustomerInfo(models.Model):
'''客户信息表'''
name = models.CharField(verbose_name='姓名',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(verbose_name='联系方式',max_length=64,unique=True)
source_choices = ((0,'qq群'),(1,'51CTO'),(2,'百度推广'),(3,'知乎'),(4,'转介绍'),(5,'其它'),)
source = models.SmallIntegerField(verbose_name='客户来源',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(verbose_name='咨询内容')
status_choices = ((0,'未报名'),(1,'已报名'),(2,'已经退学'))
status = models.SmallIntegerField(verbose_name='客户状态',choices=status_choices)
consultant = models.ForeignKey('UserProfile',verbose_name='课程顾问',on_delete=models.CASCADE)
date = models.DateField(verbose_name='创建的时间',auto_now_add=True)
class Meta:
verbose_name = "客户信息表"
verbose_name_plural = verbose_name
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 Meta:
verbose_name = "学员表"
verbose_name_plural = verbose_name
class CustomerFollowUp(models.Model):
'''客户跟踪记录表'''
customer = models.ForeignKey('CustomerInfo',on_delete=models.CASCADE)
content = models.TextField(verbose_name='跟踪内容')
user = models.ForeignKey('UserProfile',verbose_name='跟进人',on_delete=models.CASCADE)
status_choices = ((0,'近期无报名计划'),(1,'一个月内报名'),(2,'半个月报名'),(3,'已报名'),)
status = models.SmallIntegerField(verbose_name='客户状态',choices=status_choices)
date = models.DateField(verbose_name='创建的时间', auto_now_add=True)
class Meta:
verbose_name = "客户跟踪记录表"
verbose_name_plural = verbose_name
class Course(models.Model):
'''课程表'''
name = models.CharField(verbose_name='课程名称',max_length=64,unique=True)
# 价格必须为整数
price = models.PositiveSmallIntegerField(verbose_name='价格')
period = models.PositiveSmallIntegerField(verbose_name='课程周期(月)',default=5)
outline = models.TextField(verbose_name='大纲')
def __str__(self):
return self.name
class Meta:
verbose_name = "课程表"
verbose_name_plural = verbose_name
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 = verbose_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(verbose_name='班级类型',choices=class_type_choices,default=0)
semester = models.SmallIntegerField(verbose_name='学期')
teachers = models.ManyToManyField('UserProfile',verbose_name='讲师')
start_date = models.DateField(verbose_name='开班日期')
# 毕业日期因为不固定,所以可以为空
graduate_date = models.DateField('毕业日期',blank=True,null=True)
def __str__(self):
# 班级名是课程名+第几期拼接起来的
return "%s(%s)期"%(self.course.name,self.semester)
class Meta:
verbose_name = "班级列表"
verbose_name_plural = verbose_name
# 联合唯一,班级不能重复
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(verbose_name='课程节次',)
teacher = models.ForeignKey('UserProfile',verbose_name='讲师',on_delete=models.CASCADE)
title = models.CharField(verbose_name='本节主题',max_length=64)
content = models.TextField(verbose_name='本节内容')
has_homework = models.BooleanField(verbose_name='本节有作业',default=True)
homework = models.TextField(verbose_name='作业需求',blank=True,null=True)
date = models.DateField(verbose_name='创建的时间', auto_now_add=True)
def __str__(self):
# 上课班级+课程节次
return "%s第(%s)节"%(self.class_grade,self.day_num)
class Meta:
verbose_name = "上课记录"
verbose_name_plural = verbose_name
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(verbose_name='得分',choices=score_choices,default= 0)
show_choices = ((0,'缺勤'),
(1,'已签到'),
(2,'迟到'),
(3,'早退'),
)
show_status = models.SmallIntegerField(verbose_name='出勤',choices=show_choices,default=1)
note = models.TextField(verbose_name='成绩备注',blank=True,null=True)
date = models.DateField(verbose_name='创建的时间', auto_now_add=True)
def __str__(self):
return "%s %s %s"%(self.course_record,self.student,self.score)
class Meta:
verbose_name = "学习记录表"
verbose_name_plural = "学习记录表"