zoukankan      html  css  js  c++  java
  • 权限部分

    crm 部分

    1. 权限基本流程

    #用户登录成功后获取权限信息,将【权限和菜单】信息写入到session。
    #以后用户在来访问,在中间件中进行权限校验。
    #为了提升用户体验友好度,在后台通过inclusion_tag动态生成一个二级菜单。

    2. 使用权限

    #- 用户登陆:权限和菜单的初始化; init_permission
    #- 配置中间件
    #- 配置白名单
    #- 配置session中使用到的key
    #- load rbac
    #- menu ,inclusion_tag 生成菜单
    #- filter,可以在if后做条件,粒度控制到按钮。

    一、问题:

    1. 为什么程序需要权限控制?

    2. 为什么要开发权限组件? 

    3. web开发中权限指的是什么?

    #一个权限 约等于 URL

    二、设计权限系统表结构

    第一版设计:

    #用户表:
    #ID Name 
    
    #权限表:
    #ID  Url
    
    #用户权限关系表:
    #ID   用户ID   权限ID 

    第二版设计,基于角色的权限控制 rbac (role based access control)

    #用户表:       #ID Name 
    
    #角色表         #ID  title
    
    #用户角色关系表:#ID   用户ID   角色ID 
    
    #权限表:       #ID  Url

    #角色权限关系表:#ID 角色ID 权限ID
    8. 如何在其他系统中应用目前的rbac组件。
    #a. 拷贝rbac组件
    #b. 清空migrations目录
    #c. 注册rbac 到app
    d. 数据库迁移并录入权限信息
    #e. 用户登陆做权限和菜单的初始化 init_permission 
    #f. 应用中间件进行权限校验
    #g. 设置配置文件
    #h. 显示动态菜单
    #j. 粒度控制到按钮 

    1. 权限有几张表?

    2. 简述权限流程?

    3. 为什么要把权限放入session? 

    4. 静态文件和模块文件

    5. 相关技术点

    #- orm查询
    #- 去空
    #- 去重 
    #- 中间件 
    #- inclusion_tag 
    #- 引入静态文件
    #{% load staticfiles %}
    #{% static '....' %}

    6. 二级菜单时,如何构造的数据结构?

    menu_dict = {
    
              1:{
    
                   title:'信息管理',
                   icon:'fa-coffee',
                   class:'',
                   children:[
                   {title:'客户列表',url:'/customer/list/','class':'active'},
                   ]
                },            
    }

      

    11. 问题: 非菜单的权限归属?

    12. 问题:层级导航?

    13. 粒度控制到按钮?

    14. 阶段总结

    1. 如何实现的权限系统?

    #粒度控制到按钮级别的权限控制
    #- 用户登陆成功之后,将权限和菜单信息放入session
    #- 每次请求时,在中间件中做权限校验
    #- inclusion_tag实现的动态菜单 

    2. 如何实现控制到按钮的呢?

    #用户登陆时,用户所拥有的权限 别名==django 路由name 构造成一个字典;
    #在页面中写了一个 django模板的filter来进行判断是否显示;

    3. 为什么要在中间件中做校验呢?

    #所有请求在到达视图函数之前,必须经过中间件,所以在中间件中对请求做处理比较简单; 

    4. 模板中的特殊方法:

    #inclusion_tag、simpletag、filter

    5. 权限中使用了几张表?

    #六张,必须要说出来

    6. 表中的字段?(背表)

    7. 写流程(思维导读)

    8. 如何实现粒度到数据行?

    #添加一条更细粒度的表,做条件用;

    9. 修改权限之后,如想应用最新权限

    #- 我们:需要重新登陆。
    #- 不用重新登陆,如何完成?更新涉及的所有用户的session信息

    10. 最重要 *****

    #- 了解权限系统的流程和实现(一行一行过,根据表结构自己写)    不要抄
    #- 权限组件的应用

    1. 简述权限管理的实现原理。

    2. 表结构

    3. 知识点

    #- 中间件白名单:配置文件、中间件return None
    #- 权限初始化:
    #- left join 
    #- 特殊字典的构造
                            权限 = {
                                权限别名:{id:'',title:'',url,pid:''},
                                权限别名:{id:'',title:'',url,pid:''},
                                权限别名:{id:'',title:'',url,pid:''},
                            }
                            
                            菜单 = {
                                菜单ID:{
                                    title:'',
                                    icon:'',
                                    children:[
                                        {id:'1',.....}
                                    ]
                                }
                            }
    #- key为数字的字典,在序列化时会变成字符串(*)
    #- 配置文件 
    #- 中间件进行权限校验 
    #- 权限校验
    #- 导航路径
    #- pid,访问无法成为菜单的权限时,默认展开的父级权限ID
                        
    #- 动态生成菜单
    #- 通过inclusion_tag和两层for循环 + 中间件传来的pid
                    
    #- 粒度控制到按钮
        #- 基于filter并通过 别名 进行权限的判断;
    #session
    
    #orm
    
      - 去重
    
      - 去空
    
    #inclusion_tag
    
    #filter
    
    #有序字典
    
    #settings配置
    
    #引入静态文件
    
    #url别名
    
    #namespace 
    
    #路由分发
    
    #构造数据结构
    
    #ModelForm
    
    #组件应用
    
    #admin 
    
    #icon爬虫
    
    #mark_safe
    
    #下载文件

    1. 构造权限结构

    def role_test(request):
                # 问题:从数据库中获取所有的权限
                """
                {
                    1:{
                        'title':'账单列表',
                        'url':'/payment/list/',
                        'name':'payment_list',
                        children:[
                            {'title':'删除账单','url':'/payment/list/','name':'payment_list'},
                            {'title':'编辑账单','url':'/payment/list/','name':'payment_list'},
                            {'title':'添加账单','url':'/payment/list/','name':'payment_list'},
                        ]
                    },
                     2:{
                        'title':'客户列表',
                        'url':'/payment/list/',
                        'name':'payment_list',
                        children:[
                            {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                            {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                            {'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
                        ]
                    }
                }
                """

    2. 批量操作权限

    #集合交集和差集
    #批量操作:form_set

    1. 构造父子结构

    2. 构造家族结构

    comment_list = [
                    {'id':1, 'title':'写的不错', 'pid':None}
                    {'id':2, 'title':'还不错', 'pid':None}
                    {'id':3, 'title':'什么万一', 'pid':1}
                    {'id':4, 'title':'什么不错', 'pid':2}
                    {'id':5, 'title':'x1', 'pid':1},
                    {'id':6, 'title':'去你的吧', 'pid':3},
                    {'id':7, 'title':'去你的吧', 'pid':6},
                ]
                
                comment_list = [
                    {'id':1, 'title':'写的不错', 'pid':None}, # ,children:[]
                    {'id':2, 'title':'还不错', 'pid':None},
                    {'id':3, 'title':'什么万一', 'pid':1},
                    {'id':4, 'title':'什么不错', 'pid':2},
                    {'id':5, 'title':'x1', 'pid':1},
                    {'id':6, 'title':'去你的吧', 'pid':3},
                    {'id':7, 'title':'去你的吧', 'pid':6},
                ]

    3. formset

    #批量表单处理 

    4. ModelForm也有钩子函数

    #注意:如果想要主动显示错误信息,可以使用 add_error('字段','错误信息') 

    5. FK

    class Permission(models.Model):
                    """
                    权限表
                    """
                    title = models.CharField(verbose_name='标题', max_length=32)
                    url = models.CharField(verbose_name='含正则的URL', max_length=128)
                    name = models.CharField(verbose_name='URL别名',max_length=32,null=True,blank=True)
                    parent = models.ForeignKey(verbose_name='父权限',to='Permission',null=True,blank=True, limit_choices_to={'parent__isnull':True})
                    menu = models.ForeignKey(verbose_name='菜单',to='Menu',null=True,blank=True)

    6. 获取当前项目中所有的URL

    7. name 

    #URL别名:  namespace:name 
    #URL别名:  name
  • 相关阅读:
    如何实现桌面App图标可以动态显示消息数(类似手机上的QQ图标)?
    Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
    Quartz.NET开源作业调度框架系列(四):Plugin Job
    Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
    Quartz.NET开源作业调度框架系列(二):CronTrigger
    Quartz.NET开源作业调度框架系列(一):快速入门step by step
    如何在Visual Studio中开发自己的代码生成器插件
    C#如何定制Excel界面并实现与数据库交互
    Ajax+PHP+MySQL 登陆示例
    Tomcat性能优化(二) ExpiresFilter设置浏览器缓存
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/9612857.html
Copyright © 2011-2022 走看看