CRM客户关系管理系统知识点总结
一、项目需求(使用PrecessOn)
二、models.py
from django.db import models from django.contrib.auth.models import User # Create your models here. 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
三、开发中使用的相关技术:
DjangoBootstrapJquery等
四、项目各个功能的实现以及知识点:
1、自定义数据库表显示页面
- 页面模板使用:Bootstarp: http://v3.bootcss.com/examples/dashboard/
- base.htmlindex.html
<!DOCTYPE html> <!-- saved from url=(0041)http://v3.bootcss.com/examples/dashboard/ --> <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <!--link rel="icon" href="http://v3.bootcss.com/favicon.ico"--> <title>Oldboy PerfectCRM</title> <!-- Bootstrap core CSS --> <link href="/static/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template --> <link href="/static/css/dashboard.css" rel="stylesheet"> <!-- Just for debugging purposes. Don't actually copy these 2 lines! --> <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]--> <script src="/static/js/ie-emulation-modes-warning.js"></script> </head> {% block body %} {% endblock %} <!-- Bootstrap core JavaScript ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="/static/js/jquery.min.js"></script> <script src="/static/js/bootstrap.min.js"></script> <script src="/static/js/docs.min.js"></script> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> <script src="/static/js/ie10-viewport-bug-workaround.js"></script> </html>