CRM初识
CRM开发
CRM,客户关系管理系统(Customer Relationship Management)。企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环:新客户的招徕、保留旧客户、提供客户服务及进一步提升企业和客户的关系,并运用市场营销工具,提供创新式的个人化的客户商谈和服务,辅以相应的信息系统或信息技术如数据挖掘和数据库营销来协调所有公司与顾客间在销售、营销以及服务上的交互。
此系统主要是以教育行业为背景,为公司开发的一套客户关系管理系统。考虑到各位童鞋可能处于各行各业,为了扩大的系统使用范围,特此将该项目开发改为组件化开发,让同学们可以日后在自己公司快速搭建类似系统及新功能扩展。系统分为三部分:1. 权限系统,一个独立的rbac组件;2. stark组件,一个独立的curd组件;3. crm业务,以教育行业为背景并整合以上两个组件开发一套系统。
orm中创建表结构
存在的问题
现在的销售管理系统和rbac只是放到了一个project里面,它们两者之间没有一点关系。下一步要干的事情就是把rbac的功能套到这个销售管理系统里面来。
rbac里面的model.py
model.py的作用
通过三个类创建5张表,如下图
知识点1:ManyToManyField
在class Role(models.Model) (角色表中)有 permissions = models.ManyToManyField(verbose_name=‘拥有的所有权限’, to=‘Permission’, blank=True) .ManyToManyField自动创建第三张表,把Permission和Role里面的id加进来,就是那个角色-权限关系表。
roles = models.ManyToManyField(verbose_name=‘拥有的所有角色’, to=‘Role’, blank=True) 就是用户和角色关系表。
from django.db import models
class Permission(models.Model):
"""
权限表
"""
title = models.CharField(verbose_name='标题', max_length=32)
url = models.CharField(verbose_name='含正则的URL', max_length=128)
def __str__(self):
return self.title
class Role(models.Model):
"""
角色
"""
title = models.CharField(verbose_name='角色名称', max_length=32)
permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
def __str__(self):
return self.title
class UserInfo(models.Model):
"""
用户表
"""
name = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=64)
email = models.CharField(verbose_name='邮箱', max_length=32)
roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
def __str__(self):
return self.name
销售管理系统权限信息录入
每一个url其实都对应着一种权限。
两个app的整合
每一个url其实就是对应着一种权![在这里插入图片描GVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjExNTg2,size_16,color_FFFFFF,t_70)
基于djiango的admin进行权限信息的录入
就是将上图中的名字、url(即客户列表 /customer/list等等)录到rbac里面的Permisson表里面(Permisson里面有个title和url)
创建一个超级用户
终端输入 python manage.py createsuperuser
然后输入用户名和密码就行
具体操作
登录进去后其实admin里面是没有表的
所以在rbac的admin里面需要把rbac的models.py的这几张表添加到进来
所以admin.py中的代码如下:
from django.contrib import admin
from rbac import models
admin.site.register(models.Permission)
admin.site.register(models.UserInfo)
admin.site.register(models.Role)
加进来后变成
然后点击Permissions -> 点击ADD PERMISSION,然后把上面的那些名字和url都录入进来
接下就是创建角色 并给这个角色分配权限
点击Role -> 点击Add role 比如创建一个ceo,他应该拥有所有的权限。
然后创建用户 步骤一样 同时注意:一个用户可以多个角色
下一步该干什么
就是让用户登录,每个不同的用户登录获得不同的权限。接下来做一个登录页面,并且登录成功后把用户所有的权限都拿来,拿来之放到一个地方去,接来下用户再登录就要去那个地方去判断这个用户访问url时候有没有权限访问。
快速完成一个基本权限控制
大长方形代表Djiango程序。 DB是数据库。 session默认放到数据库里面,但可以单独拿开。
中间的小长方行代表中间件 用户浏览器发来请求第一个到达中间件 当它穿过所有的中间件时才到达视图函数
第一次请求的流程:
打开页面登录相当于发送一次http请求过来,穿过所有的中间间,最终到达视图函数,将模板(其实就是登录页面)拿走然后给用户返回。
第二次请求的流程:
就是输入用户名和密码提交的流程。穿过所有的中间间,最终到达视图函数,视图函数通过ORM去数据库DB中获取这个人所有的权限,获取这个权限之后把它放到Session中存起来。如果下次再来就在中间件中判断访问的url在不在Session里面,即以后每次都要来Session中校验。
为什么是去Session而不是数据库?
因为每次访问都要查看数据库,数据库的压力就会很大。而且数据库中表和表有关联,当联表查询时,性能会降低。所以为了性能考虑,在用户第一次登录成功后,获取用户所有的权限,把它放到Session中。以后用户再来请求在中间件先去Session中看看这个人对当前的url有没有访问权限。
对于中间件
它可以在一个类里面帮助所有用户的请求做上一个筛选和判断