加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django之路 - 项目实战之<教育行业CRM开发>

发布时间:2020-12-17 00:06:41 所属栏目:Python 来源:网络整理
导读:本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 噢,对了,最后说一下这个项目涉及到的知识点,请确保你以充分掌握了下面所列知识点再学习此项目噢! ol class="ol1" li class="li1" 项目需求讨论 首先给我们的项目起个名字吧,

本节内容

业务痛点分析

项目需求讨论

使用场景分析

表结构设计

业务痛点分析

噢,对了,最后说一下这个项目涉及到的知识点,请确保你以充分掌握了下面所列知识点再学习此项目噢!

<ol class="ol1">
<li class="li1">

  • 项目需求讨论

    首先给我们的项目起个名字吧,这个系统要同时支持销售管理\学员管理\讲师管理等功能,功能比较杂,不能称之为严格意上的CRM,因为CRM一般只包括销售管理,but anyway,who cares,我们就叫它”老男孩crm管理系统”吧,

    起好了名字,开始动手写之前, 肯定要把需求想清楚,需求想不清楚就开始写的话,等于给自己挖坑,你肯定不想出现写了5千行代码后,突然发现,需求搞错了,还要重新推到重来的事情吧。所以,现在静下心,把需求想明白,画好思维导图,跟同事多讨论应用场景,做了各方面论证后,再开始动工噢。

    我们的系统的用户分3种,销售\学生\讲师,这3个角色关注的事情是不同的, 销售只关注招了多少学员,讲师关注自己管理的班级学习成绩怎样,学员只关注自己的学习成绩。 因此在想需求时,你要从每个角色出发,看他关心的是什么, 于是我画出了这个思维导图

    根据思维导图,我们总结出以下具体需求:

    1. 把用户分为销售\学员\讲师3种角色,每个角色关心的事情不同,所以有要不同的用户视图,即销售人员登陆后只需要看他与他工作相关的就可以,讲师关心的事情不需要在销售视图里显示
    2. 销售人员可以录入客户信息,和后续跟进信息,因为一个客户可能要跟进好几次才会报名。 可以多种条件过滤查询用户,可以查看自己的销售业绩报表
    3. 学员主要2个功能,查询成绩\提交作业
    4. 讲师的主要功能是管理班级 批作业\上课点名
    5. 虽然现在只有一个校区,但要考虑到以后的扩展,以后全国可能有好多个校区,不同校区之间的数据应该是隔离的
    6. 这个系统里存放着大量的客户信息\学员数据等,都是公司的机密信息,设计系统时就要考虑到权限问题,不同的角色要有不同的权限,同一角色的不同用户也要允许有不同的权限

    使用场景分析

    为了更加理清我们的项目开发需求,在动手写代码前,建议再有一个业务场景分析的步骤,即从用户角度写出你使用这个项目的具体场景,我们这里分为销售、讲师、学员3个角色,我分别给每个角色列出了几个使用场景:

    一. 销售:

    1. 销售人员张三刚通过qq群聊了一个客户,咨询了"Python全栈开发课程",录入了CRM
    2. 张三 回访了一个 一个月多前咨询的老客户,老客户说最近考虑报名,让张三 下周联系他办报名手续, 张三把这个回访信息 录入了crm
    3. 李四 今天录入了8个新客户,但发现有一个客户在录入时,系统提示,此客户信息已存在,于是就在客户库查了一下,发现 此客户 已被 ?张 三 ?在上周录入了,销售部有规定,在客户被录入一个月内,其它销售是不能抢这个单的,于是就提醒张三,让他跟这个客户主动再跟进一下
    4. 李四今天 有一个客户要报名,李四给客户发了在线报名 链接,要求其填写一些个人信息,上传证件照片等,交了500报名费后,将其正式添加到了报名的 班级里
    5. 销售主管 BigSB ?查看了今天的销售报表, 查看了每个销售的最近一周 咨询的客户量,成单比, 每个课程 分别 报名了多少学员, 这些客户 都是从哪些渠道 过来的

    二. 讲师:

    1. 讲师Alex 今天 要给 Python自动化 周未班上课, 上课前要进行点名, 于是创建了一条生课纪录 ,这条上课记录关联 着每个学员 这节课的 出勤状态,alex 边点名边在系统 中纪录每个学员的状态 ,签到、迟到或缺勤。
    2. 今天的课上完后,ALEX给大家留了作业,在系统 里 找到今天 的上课记录,把作业 需求 写到了 上课纪录 里
    3. 过了一周, Alex 登录 系统 下载了所有学员这节课的作业 , 为每个学员批改了作业 并将学员的成绩纪录在了系统 里

    三. 学员:

    1. 学员小明 报名了“Go语言开发课程第2期周未班”, 交完报名费后,招生老师 给他发了一个报名地址 要求其填写,填写了个人信息 并上传了证件信息, 提交后, 过了一会,就发现自己的qq邮箱里收到了一封 老男孩学校的邮件, 告知他 已为其 生成了 学员账号,他按照邮件 提示 登录 了 老男孩的学员系统 ,看到系统 中可以 ?进入自己的班级,不过现在班级里 还没有上课纪录, 他还能在线查看 他的学员合同
    2. 过了一周, 正式上课了,上了一天课,讲师Alex布置了作业 , 小明过了几天 完成 作业后,登录 学员管理系统 , 发现有一条 自己的上课记录, 他点进去,看到了当节课的 作业 需求,及提交作业的方式 ,他只需要把作业 打包成.zip格式 ,直接拖拽到页面上的交作业区就可以了。
    3. 过了两天, 小明收到邮件提醒 ,说自己作业 得了个A,非常 的开森。
    4. 小明学了几个月好,发现老男孩讲师讲的好,自己学的也不错,于是极力推荐自己的2个朋友也来学习, 于是在自己的学员系统 里录入了2条推荐朋友学习的信息, 没过一会, 小明之前的招生老师就联系他说,已经收到他的推荐名单,很快就会联系 小明的朋友 。?

    ?好啦, 业务场景也分析完了,接下来我们终于可以开始搞事情啦!

    表结构设计

    ?

    Create your models here.

    class Customer(models.Model):
    '''存储所有客户信息'''
    pass

    class Enrollment(models.Model):
    '''存储已报名学员的信息'''
    pass

    class CustomerFollowUp(models.Model):
    '''存储客户的后续跟进信息'''
    pass

    class ClassList(models.Model):
    '''存储班级信息'''
    pass

    class Course(models.Model):
    '''存储所开设课程的信息'''
    pass

    class CourseRecord(models.Model):
    '''存储各班级的上课记录'''
    pass

    class StudyRecord(models.Model):
    '''存储所有学员的详细的学习成绩情况'''
    pass

    class UserProfile(models.Model):
    '''存储所有讲师\销售人员 学员 用户信息'''
    pass

    class Role(models.Model):
    '''角色信息'''
    pass

    class Branch(models.Model):
    '''存储所有校区'''
    pass

    接下来分别解释每张表

    1. Customer表, 主要给销售人员用, 存储所有客户信息,里面要记录客户来源\姓名\qq \客户来源\咨询的内容等?

    qq = models.CharField(max_length=64,unique=True,help_text=u= models.CharField(u,max_length=64,blank=True,null= name = models.CharField(u,max_length=32,null== ((,u),(,u= models.CharField(u,choices=sex_type,default=,max_length=32= models.DateField(u,null=True,help_text== models.BigIntegerField(u,null== models.EmailField(u,null== models.CharField(u,max_length=64= ((,u,u,u,u,u,u,u,u source = models.CharField(u,choices=source_type,default= referral_from = models.ForeignKey(,verbose_name=u,help_text=u,related_name= course = models.ForeignKey(,verbose_name=u= ((,u,u,u= models.CharField(u,choices== models.TextField(u,help_text=u= ((,),(,= models.CharField(u,choices=work_status_choices,default== models.CharField(u,null== models.CharField(u,null== ((,u),(,u= models.CharField(u,choices=status_choices,default=u,help_text=u consultant = models.ForeignKey(,verbose_name=u= models.DateField(u,auto_now_add=</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;QQ:%s -- Name:%s</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt;(self.qq,self.name) </span><span style="color: #0000ff;"&gt;class</span> Meta: <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;这个是用来在admin页面上展示的,因为默认显示的是表名,加上这个就变成中文啦</span> verbose_name = u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;客户信息表</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;客户信息表</span><span style="color: #800000;"&gt;"</span></pre>

    2.?学员报名表,这里为什么要把客户信息表 和 这个学员报名表分开呢? 因内一个学员可以报多个课程 ,每个课程 都需要单独记录学习成绩呀什么的,所以每报一个课程 ,就在这里生成 一条相应的报名记录

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;所有报名的学生 肯定是来源于客户信息表的,先咨询,后报名嘛</span>
    customer =<span style="color: #000000;"&gt; models.ForeignKey(Customer)
    school </span>= models.ForeignKey(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Branch</span><span style="color: #800000;"&gt;'</span>,verbose_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;校区</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;选择他报的班级,班级是关联课程的,比如python开发10期</span>
    course_grade = models.ForeignKey(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ClassList</span><span style="color: #800000;"&gt;"</span>,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;所报班级</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    why_us </span>= models.TextField(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;为什么报名老男孩</span><span style="color: #800000;"&gt;"</span>,max_length=1024,default=None,null=<span style="color: #000000;"&gt;True)
    your_expectation </span>= models.TextField(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;学完想达到的具体期望</span><span style="color: #800000;"&gt;"</span>,null=<span style="color: #000000;"&gt;True)
    contract_agreed </span>= models.BooleanField(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;我已认真阅读完培训协议并同意全部协议内容</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    contract_approved </span>= models.BooleanField(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;审批通过</span><span style="color: #800000;"&gt;"</span>,help_text=u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;在审阅完学员的资料无误后勾选此项,合同即生效</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    enrolled_date </span>= models.DateTimeField(auto_now_add=True,auto_created=<span style="color: #000000;"&gt;True,verbose_name</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;报名日期</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    memo </span>= models.TextField(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;备注</span><span style="color: #800000;"&gt;'</span>,null=<span style="color: #000000;"&gt;True)
    
    </span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
        </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;<%s  课程:%s></span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt;(self.customer,self.course_grade)
    
    </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
        verbose_name </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;学员报名表</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;
        verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;学员报名表</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
        unique_together </span>= (<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;customer</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;course_grade</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
        </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;这里为什么要做个unique_together联合唯一?因为老男孩有很多个课程, 学生学完了一个觉得好的话,以后还可以再报其它班级,</span>
        <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;每报一个班级,就得单独创建一条报名记录,所以这里想避免重复数据的话,就得搞个"客户 + 班级"的联合唯一喽</span></pre>

    3.?客户跟进表,这张表的意义很容易理解, 一个客户今天咨询后,你录入到了客户信息表,但他没报名, 所以过了一段时间,销售还得再跟他聊聊吧,聊完后,结果又没报,那也得纪录下来吧,因为每个销售每天要聊很多人,你不纪录的话, 可能下次再跟这个人聊时,你早已忘记上次聊了什么了, 这样会让客户觉得这个销售不专业,相反,如果把每次跟进的内容都纪录下来, 过了几个月,这个客户再跟你聊时,竟然发现,你还记得他的所有情况,他就觉得你很重视他,说不定一感动就报名了,哈哈。 所以,一条客户信息可能会对应多条跟进记录,是个1对多的关系,必须单独搞张表来记录

    = models.ForeignKey(Customer,verbose_name=u= models.TextField(u= ((1,u2,u3,u4,u5,u6,u7,u8,u= models.IntegerField(u,help_text=uconsultant </span>= models.ForeignKey(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;UserProfile</span><span style="color: #800000;"&gt;"</span>,verbose_name=u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;跟踪人</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) date </span>= models.DateField(u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;跟进日期</span><span style="color: #800000;"&gt;"</span>,auto_now_add=<span style="color: #000000;"&gt;True) </span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s,%s</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt;(self.customer,self.status) </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;客户咨询跟进记录</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;客户咨询跟进记录</span><span style="color: #800000;"&gt;"</span></pre>

    4.?班级表, 学生以班级为单位管理,这个表被学员表反向关联, 即每个学员报名时需要选择班级

    branch = models.ForeignKey(,verbose_name== models.ForeignKey(,verbose_name=u= ((0,),(1,= models.SmallIntegerField(choices=class_type_choices,default== models.PositiveIntegerField(,default=10= models.IntegerField(u= models.IntegerField(u,default=10000= models.DateField(u= models.DateField(u,null= teachers = models.ManyToManyField(,verbose_name=u</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s(%s)</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt; (self.course,self.semester) </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;班级列表</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;班级列表</span><span style="color: #800000;"&gt;"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;为避免重复创建班级,课程名+学期做联合唯一</span> unique_together = (<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;course</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;semester</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;自定义方法,反向查找每个班级学员的数量,在后台admin里 list_display加上这个"get_student_num"就可以看到</span> <span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; get_student_num(self): </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt; self.customer_set.select_related().count() get_student_num.short_description </span>= u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;学员数量</span><span style="color: #800000;"&gt;'</span></pre>

    5. 课程表,存储课程介绍\大纲等基本信息

    = models.CharField(u,unique== models.TextField(= models.TextField(= models.IntegerField(</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> self.name</pre>

    6.?上课纪录表,每个班级都要上很多次课,讲师每上一次课的纪录都要纪录下来,以后可以方便统计讲师工资什么的

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;讲师创建上课纪录时要选择是上哪个班的课</span>
    course = models.ForeignKey(ClassList,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;班级(课程)</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    day_num </span>= models.IntegerField(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;节次</span><span style="color: #800000;"&gt;"</span>,help_text=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;此处填写第几节课或第几天课程...,必须为数字</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    date </span>= models.DateField(auto_now_add=True,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;上课日期</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    teacher </span>= models.ForeignKey(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;UserProfile</span><span style="color: #800000;"&gt;"</span>,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;讲师</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    has_homework </span>= models.BooleanField(default=True,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;本节有作业</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
    homework_title </span>= models.CharField(max_length=128,null=<span style="color: #000000;"&gt;True)
    homework_requirement </span>= models.TextField(blank=True,null=<span style="color: #000000;"&gt;True)
    
    </span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
        </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s 第%s天</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt; (self.course,self.day_num)
    
    </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
        verbose_name </span>= u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;上课纪录</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;
        verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;上课纪录</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
        unique_together </span>= (<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;course</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;day_num</span><span style="color: #800000;"&gt;'</span>)</pre>

    7.?学员学习纪录表,思考一下,如果你想实现纪录每位学员的详细学习纪录,即精确到每节课的成绩\出勤情况,怎么办?其实很简单, 先来看一下此时班级\上课纪录\学员学习纪录的关系图:

    = models.ForeignKey(,verbose_name=u= models.ForeignKey(CourseRecord,verbose_name=u= ((,u,u,u,u= models.CharField(u,choices=record_choices,default=,max_length=64= ((100,),(90,85,),(80,70,),(60,50,),(40,-50,),(0,-100,),(-1000,= models.IntegerField(u,choices=score_choices,default=-1= models.DateTimeField(auto_now_add== models.CharField(u,max_length=255,null=</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s,学员:%s,纪录:%s,成绩:%s</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt;(self.course_record,self.student.name,self.record,self.get_score_display()) </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= u<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;学员学习纪录</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;学员学习纪录</span><span style="color: #800000;"&gt;"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;一个学员,在同一节课只可能出现一次,所以这里把course_record + student 做成联合唯一</span> unique_together = (<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;course_record</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;student</span><span style="color: #800000;"&gt;'</span>)</pre>

    可以看出,一个班级对应多节课,每节课又对应多个学生的出勤和成绩,我们已经通过班级表(”ClassList”)和上课纪录表(”CourseRecord”)存储了班级信息和每节上课纪录,想存学生的每节课学习纪录的话只需要再搞一个表就可以了。

    8. 用户表,存储销售、讲师账户信息

    这里我们用django自带的认证系统,并对其进行自定制

    ===255== models.CharField(_(),max_length=128=mark_safe(is_active </span>= models.BooleanField(default=<span style="color: #000000;"&gt;True) is_admin </span>= models.BooleanField(default=<span style="color: #000000;"&gt;False) is_staff </span>=<span style="color: #000000;"&gt; models.BooleanField( verbose_name</span>=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;staff status</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,default</span>=<span style="color: #000000;"&gt;True,help_text</span>=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Designates whether the user can log into this admin site.</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,) name </span>= models.CharField(max_length=32<span style="color: #000000;"&gt;) </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;role = models.ForeignKey("Role",verbose_name="权限角色")</span> branch = models.ForeignKey(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Branch</span><span style="color: #800000;"&gt;"</span>,verbose_name=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;所属校区</span><span style="color: #800000;"&gt;"</span>,null=<span style="color: #000000;"&gt;True) roles </span>= models.ManyToManyField(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Role</span><span style="color: #800000;"&gt;'</span>,blank=<span style="color: #000000;"&gt;True) memo </span>= models.TextField(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;备注</span><span style="color: #800000;"&gt;'</span>,default=<span style="color: #000000;"&gt;None) date_joined </span>= models.DateTimeField(blank=True,auto_now_add=<span style="color: #000000;"&gt;True) USERNAME_FIELD </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;email</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; REQUIRED_FIELDS = ['name','token','department','tel','mobile','memo']</span> REQUIRED_FIELDS = [<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;] </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; get_full_name(self): </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; The user is identified by their email address</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.email </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; get_short_name(self): </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; The user is identified by their email address</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.email </span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span>(self): <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; __str__ on Python 2</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.email </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; def has_perm(self,perm,obj=None):</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; "Does the user have a specific permission?"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; # Simplest possible answer: Yes,always</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; return True</span> <span style="color: #0000ff;"&gt;def</span> has_perms(self,obj=<span style="color: #000000;"&gt;None): </span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Does the user have a specific permission?</span><span style="color: #800000;"&gt;"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Simplest possible answer: Yes,always</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; True </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; has_module_perms(self,app_label): </span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Does the user have permissions to view the app `app_label`?</span><span style="color: #800000;"&gt;"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Simplest possible answer: Yes,always</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; True @property </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; is_superuser(self): </span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Is the user a member of staff?</span><span style="color: #800000;"&gt;"</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Simplest possible answer: All admins are staff</span> <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; self.is_admin </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;用户信息</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= u<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;用户信息</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt; objects </span>=<span style="color: #000000;"&gt; auth.UserManager() </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;CRM账户</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;CRM账户</span><span style="color: #800000;"&gt;'</span></pre>

    9.?角色表,用于角色划分,用于权限管理,权限功能我们后面会实现,这里只在表里先存个简单的角色名

    = models.CharField(max_length=32,unique== models.ManyToManyField(,blank=</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> self.name</pre>

    10.?校区表,存储不同校区

    = models.CharField(max_length=64,unique= self.name

    11.?菜单表,不同的角色看到的菜单不同, 我们支持动态菜单 ,所以需要把菜单 以及 和角色的关联存下来

    = models.CharField(,max_length=64= ((0,),= models.SmallIntegerField(choices=url_type_choices,default== models.CharField(max_length=64,unique== models.SmallIntegerField(default=0,verbose_name== models.ManyToManyField(,blank=</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> self.name</pre>

    12. 二级菜单表, 还可以支持2级子菜单

    name </span>= models.CharField(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;二层菜单名</span><span style="color: #800000;"&gt;'</span>,verbose_name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;菜单排序</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> self.name</pre>

    13. 缴费记录

    = models.ForeignKey(= ((,u,u,u= models.CharField(,choices=pay_type_choices,default== models.IntegerField(,default== models.TextField(,null== models.DateTimeField(,auto_now_add== models.ForeignKey(UserProfile,verbose_name=,help_text=</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self): </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;%s,类型:%s,数额:%s</span><span style="color: #800000;"&gt;"</span> %<span style="color: #000000;"&gt;(self.enrollment.customer,self.pay_type,self.paid_fee) </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta: verbose_name </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;交款纪录</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt; verbose_name_plural </span>= <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;交款纪录</span><span style="color: #800000;"&gt;"</span></pre>

    好啦,表基本都建完了,接下来同步数据库,不过在同步数据库前,要改一下settings.py,因为我们自定义了django的认证表,所以需要明确的告诉django,用我们改过的过来做默认的认证系统。

    在settings.py中添加以下行,格式为 app.modelname?

      

    最后一步,同步数据库!?

      

    伸个懒腰,出去撸一发,敬请期待下篇....?

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读