目录html
session
中?rbac
组件应用到一个新项目中.rbac
组件中有哪些技术点, 用于作什么?CRM系统是提供给销售, 班主任, 财务等人员使用的.python
在CRM系统中, 将没有绑定销售的客户称为公户, 绑定销售的客户称为私户.git
销售人员各自维护本身的客户(私户), 不能够查看或者跟进其余人的客户, 避免产生纠纷.web
对象.字段名
对象.get_字段名_display
对象.外键字段.属性
对象.自定义方法
modelform
(1)定义一个modelform
:数据库
class CustomerForm(forms.ModelForm): """这里能够重写某些字段""" class Meta: model = models.Customer fields = "__all__" exclude = wegits =
(2)视图中:json
form_obj = CustomerForm() form_obj = CustomerForm(request.POST) from_obj.is_valid()
(3)模板中:网络
{% for field in form_obj %} {{ field }} {% endfor %}
销售能够经过我的渠道获取客户信息, 本身录入到系统中, 或者销售主管或网络咨询师将已经录入系统的客户分配给销售.session
销售须要在规定时间间隔内对客户进行跟进或回访, 将跟进信息记录到系统中, 根据不一样的状况标记客户的报名意向.数据结构
当客户肯定报名时须要让客户本人或者销售帮忙添加报名表.app
当销售收到客户缴纳的费用时, 须要填写缴费记录, 并将费用转交财务进行审批.
班主任对班级信息进行管理, 对班级信息进行增删改查.
建立好班级信息后, 能够对某一班级建立课程记录, 记录上课的状况, 做业要求等信息.
建立好班级信息后, 可根据某节上课记录来生成学习的上课记录(学习记录), 该操做做为批量操做, 批量生成该课程所对应班级的全部学生的学习记录. 使用modelformset
来展现和编辑这些学习记录.
QueryDict
对象, 详细说说它的用法分页保留搜索条件时: 搜索条件在request.GET
中, request.GET
就是QueryDict
对象, 将该对象复制后可给该字典中添加页码的相关参数, 使用QueryDict
的urlencode()
方法, 将结果拼接到生成的URL上.
添加或编辑后跳转至原页面: 本身生成一个QueryDict
对象, 将当前访问的完整路径添加到该字典中复制给next
, 使用QueryDict
的urlencode()
方法, 将结果拼接到生成的添加或编辑的URL上. 添加或编辑后从request.GET
中获取到next
的值, 跳转到该地址便可.
技术点 | 做用 |
---|---|
auth模块 | 认证 |
modelform | 对表进行增删改查 |
分页 | 对数据进行分页显示 |
Q对象 | 查询条件==或==的关系 |
QueryDict | 保留搜索条件 |
url的命名和反向解析 | ---- |
事务 + 行级锁 | 加入私户 |
批量建立对象 | ---- |
modelformset | ---- |
表 | 字段 |
---|---|
菜单表Menu |
id 、 name |
权限表Permission |
id 、 title 、 url 、 name 、 parent_id 、 menu_id |
角色表Role |
id 、 name |
用户表User |
id 、 username 、 password |
角色和权限关系表 | id 、 role_id 、 permission_id |
用户和角色关系表 | id 、 user_id 、 role_id |
在web应用中, 一个URL
表明一个权限, 能够访问某一URL
则说明有该权限. 该权限系统中URL
被分为两种, 一种是能够作二级菜单的父权限, 一种是不能作菜单的子权限. Menu
表中的数据称之为一级菜单, 二级菜单被分配给一级菜单. 子权限分配给父权限.
当用户登陆成功时, 根据用户全部的角色查询出所具备的权限, 将权限信息和菜单信息存放在session
中. 登陆成功后跳转至其余URL
时, 请求通过中间件时进行权限的校验, 根据当前访问的url
和session
中存放的权限信息进行正则匹配. 都匹配不成功, 则拒绝访问. 匹配成功则继续走正常的流程获得相应的响应.
页面中的可点击的按钮也是权限, 在模板渲染时使用自定义filter
判断该按钮所表明的权限是否在该用户所拥有的权限中, 若是是则显示该按钮, 不然不显示.
session
中?permission_dict = { '权限的URL别名':{ 'url': 'url路径', 'id': '权限的id', 'pid': '父权限的id', 'title': '权限的标题', 'pname': '父权限的URL别名', } }
menu_dict = { 'title': '客户管理', 'icon': 'fa-address-book-o', 'weight': 10, 'children': [{ 'title': '客户列表', 'url': '/customer/list/', 'id': 1, },] }
将权限和菜单的字典存放在session
中是为了给不一样用户存放不一样的权限和菜单, 而且session
能够存放在Redis
中, 读取速度快.
(1)获取当前访问的URL
, 判断是否在不须要权限校验的白名单中, 若是在则再也不进行校验.
(2)从session
中获取到该用户的权限信息.
(3)循环出每个权限进行正则匹配, 匹配成功则改变flag
标志位为True
, 而且获取到须要默认展开菜单的权限id和要展现的路径导航信息.
(4)循环结束后, flag
还未False
则拒绝访问.
二级菜单是经过inclusion_tag
实现的, 将request
看成参数传给menu
函数, 函数中从request
中获取到menu_dict
. 循环menu_dict
给一级菜单都添加了一个hide
的class
, 默认一级菜单下的二级菜单(父权限)是不是要默认选中的二级菜单, 若是是的话, 给该二级菜单添加一个active
的class
, 给该二级菜单对应的一级菜单的class
从新赋值为空.
模板中生成二级菜单时添加上对应的class
, 则显示出相应的状态. class
为hide
则是隐藏状态, class
为active
则是选中状态.
session
中存放着一个有关权限信息的字典, 字典的key
为权限的URL
别名, value
为一个权限的具体信息.
自定义了一个filter
, 用来判断某一个权限是否在该用户的权限字典中, 在的话返回True
, 不在返回False
.
模板中使用该filter
来对每一个要生成按钮的部分作判断, 有权限则会显示按钮, 没有权限则不显示.
新增的: 路由系统中有, 数据库中没有的.
删除: 路由系统中没有, 数据库中有的
可更新: 路由系统和数据库中都有的
rbac
组件应用到一个新项目中.rbac
组件到新的项目中, 注册apprbac
中的User
表rbac
下migrations
中的记录admin
中的User
表roles=models.ManyToManyField(to=Role, verbose_name='用户拥有的角色', blank=True)
注意: 关联的字段不要写成字符串形式(4)设置rbac
的url
url
要有name
rbac
的namespace
url
和别名的长度rbac
中的User
settings.py
中写上权限的配置(12)权限控制到按钮级别
rbac
组件中有哪些技术点, 用于作什么?技术点 | 做用 |
---|---|
中间件 | 进行访问权限校验 |
inclusion_tag |
动态生成二级菜单和路径导航 |
filter |
权限控制到按钮级别 |
modelformset |
权限的批量操做 |
session |
保存权限和菜单的数据结构 |