• 75


    day75

    今日内容:

    1 二级菜单 按钮的权限

    信息管理
    	客户列表
    	学生列表
    	
    财务管理
    	缴费列表
    	...
    
    
    menu
    	id title icon 	 	
    	
    权限表
    	id  title url  is_menu  foreignkey(menu_id) 
    	1   客户列表    True	1 
    	2   添加客户	False	Null(不会被渲染信息管理里没有)
    	3   编辑客户	False	Null 
    	4	删除客户	False	Null 
    	
    	
    	
    

    1.1 设计表结构

    models.py

    class Menu(models.Model):	一级标题	
    
    	title  = m.C('一级菜单')	
    	icon   = m.C('1图标')		
    
    class Permission(m.M):	
    	title url	
    	menu = m.Foreignkey('Menu',Null = True)	#默认为null 自动加id	
    	
    

    添加menu数据库 :

    添加Permission数据库:

    1.2 取值

    permission_input.py

    permissions = 	models.P.o.f(r_u_n=user_obj).value('title','url','pk','menu_id','menu_pk','menu_icon','menu_title','menu_pk','menu_pid').distinct()
    
    之前是object对象   现在是字典		
    

    字典menu

    1.3 设计数据结构

    ‘目标数据结构’		
    {1:{# 1 --menu_id 		
    'title':'..',		
    'icon':'xxx',		
    children:[{'title':'二级',‘url’:'xxx'},		
    {'title':'二级',‘url’:'xxx'},]	
    },		
    2:{# 2 --menu_id 	
    'title':'..',	
    'icon':'xxx',	
    children:[{'title':'二级',‘url’:'xxx'},	
    {'title':'二级',‘url’:'xxx'},]	
    },	
    }	
    
    permission_input.py
    permission_list = []
    permission_menu_dict = {}
    for item in Permissions : per_list.append(item['url'])
    if item['menu_id'] :
    	if item['menu_id'] in permission_menu_dict:
    			per_men_dict[item['menu__pk']]['children'].append( [
    	 ['title':item['title'],'url':item['url'], ]
     )
    	else:
      	per_men_dict[item['menu__pk']] = {
     	'title':item['menu__title'],
    	'icon':item['menu__icon'],
    	'children':[
    	{['title':item['title'],
    	'url':item['url'],]}
    	]
    } 
    
    
    
    rbac.py 取值
    @incions_flag
    menu_dict = requset.session.get('per_menu_dict')
    for key,item in menu_dict.item():
    	item['class'] = 'hide'
    	for child in item['children']:
    		
    		if re.match('^{}$'.format(child['url']['url'],request.paht)): 		
                item['class'] = ''			#给父级标签+去隐藏
                #item['class'] = 'active'
                child['class'] = 'active'
                break
    
    
    
    menu.html   
    {% for item in menu_dict.values
    div	class = 'x1'
    	div class = 'x2 hide'			#二级下拉隐藏了 
     
    			<i class={{item.icon}} i> {{item.title}}
    		for child in item.children
    		div class = 'body' {{item.class}}
    		a href {{child.url	 class='{{child.class}}' {{ch.t}}
    		
    
    

    1.4 左边的url和添加等url冲突

    点添加编辑的时候,左边的有隐藏了

    (怎么解决,另种方法)

    1 种解决:

    因为同个页面,都是coustomer开头的, 改正则

    简单,但是只能写死

    2 种解决:

    把添加编辑删除放到permission表里

    permission 
    id 		url					title		pid
    1		/customer/list/		查看客户	null
    2		/customer/add/		查看客户	1	
    3		/customer/edit/		查看客户	1	
    4		/customer/delete/		查看客户	1	
    	和我的当下pid相同  默认加
    	
    

    放到子权限下面

    models.py
    pid = models.ForeignKey('self',null=True)	#
    		+ null  1    1    1		+ null  5	5	5
    
    permission_input.py
    子:append({'pk':item['pk']})
    父:append({'pk':item['pk']})
    
    1 设置数据库,添加数据
    2 当前请求的pid == id      1  111       5   555
    
    rbac.py
    if request.pid == child['pk']:   有分类的 null  1  
    中间件的时候把pid放进去	
    
    per_input.py
    for itme in permissions:
    	per__list.append('url':item['url'],'pid':item['pid'])
    

    中间件

    for item in re.se['per_list']:
    ​	reg = item['url']
    	ret = re.sea
    	if ret:
    		request.show_id = item['pid']
    		return None 	
    		
    

    在per_input.py

    append('pk':itme['pk'])		
    

    permission归属,从属与我的id的pid

    自己从属与自己也可以,但是没有区分,谁归属于谁

    3种方法:

    设置的pid 为1111 5555 没有归属感。。。

    rbac.py

    if request.show_id == child['pk']:
    	item['class'] = ''   child='active'
    

    !permission归属,从属与我的id的pid](E:Downloadqq_download eacher_huatu_downloads20pyDjangoday75permission归属,从属与我的id的pid.png)

    菜单和二级菜单显示在添加之时

    补充:
    	菜单{url://,title:'客户','pk':1}
    		{url://,title:'财务','pk':5}
    	二级菜单:
    		点的时候,还显示
    

    功能实在不能添加的时候,改表结构,加标志位

    1.5 按钮的权限

    customer_list.html
    #{% if '/customer/add/' in request.session.permission_list%}
    		
    {%load rbac}	
    {% if '/customer/add/'|haspermission:request%}#这里的url太长了,在给他写个别名	{% if url 'customer'} 不行?!
    		
    {%endif%}
    {% if '/customer/edit'+id+'/'|haspermission:request}
    
    {% href = '/customer/edit/'{{row.id}}/}
    
    html里的
    if 过滤器没法传参 
    正常不是过滤器的时候可以传参  {%}
    就随便写个值 
    {% if '/customer/edit/1'|haspermission:request%} 后端/customer/edit/(d+)/ 匹配出来可以 有权限
    路径太长了 用别名
    选项 if edit or delete|has : 显示  没有的话,不显示选项
    			一个删除或者编辑有的话,显示选项td
    只是显示的,不是真的删除。/customer/edit/5/再另写	
    
    templatags : rbac.py
    from django import reverse
    @register.filter
    def haspermission(base_url,request):
    	base_url = reverse(base_url)	#弄成别名
    	for item in reqeust.session['per_list']:
    		reg = '^%s$' % item['url']
    		ret = re.search(reg,request.path)
        	if ret:
    			return True
    	return False
    	
    	
    	
    	2 版  给传一个url  
    	if item['name'] == base_url:
    		return True
    	
    	
    urls.py
    url(name='customer')
    url(name='customeradd')
    
    
    
    customer.py
    customer_list(request):
    	print(reverse('customeredit',args=(1,)))	>>>>>>>>>/customer/edit/1/
    
    
    (1)一级菜单:
    1 数据库表结构:权限与用户之间的关系 rbac
    2 用户登陆	登陆成功 initialsession 把权限列表和菜单列表注入session		
    permissions = modes.P.o.f(r_u_n=user_obj).distinct()
    for item in p: p.app(item.url)	
    	if item.is_menu:per_m_l.append('title':item.titl)
    3 (写死)在单独函数
    incluseion_tag: 循环遍历菜单列表P_m_l:	if is_menu:
    4  
    
    (2) 干接口的,前后端的交互的
    最多的就是设计表结构,数据结构
    写后端挺简单的	前端挺辛苦的
    
    (3)数据库-的意思

    删除

    (4)面试问
    整个流程
    rbac 的流程
    怎么设计的权限表
    二级菜单怎么设计的
    
    (5)强调一个点render(别名)

    return(request,'customer_list.html',{'date_list':date_list})

    字符串替换

    customer_list.html

    script   
    $.ajax({
    url:‘{%url 'customer'}}’   #{%url 'customer'}} 觉得是一个变量  undefined 
    ​							# 这样是路径
    type:'post',
    data:{},)
    

    放了js文件里

    script src = '{% static 'js/test.js'%}'
    render成了路径 script src = 'test.js'
    js里		url:‘{%url 'customer'}}’  	的是字符串不认识		
    	
    	1 写死 : url:'/customer/list'
    	2 写了里面
    

    2 af_prac

    (6) 引用函数的方式

    不是 from app01 import permission_input

    正解:

    from app01.permission_input import intitial_permission
    

    3 晚上课

    drf django_rest-framework

    而不是django的引擎去渲染, 是这个框架去渲染

    luffycity.com www.apeland.cn

    代码规范

    项目大了之后 放views文件夹里 写多个功能文件 解耦

    导包:

    标准库(不许pip安装的) 第三方库(pip安装) 自己封装的(自定义的)

    from django.shortcuts import render

    from django.shortcuts import reverse

    from django.shortcuts import (render,reverse)

    debug

    Debugger从上往下执行流程frames 夯在断点

    比print好 , 固定的变量    多个变量
    

    调试的太慢 : console --> 输入 username 直接取到

    err_msg 没有出现 会报错 不仅仅 打印变量,还可以做代码层的操作: models.User.objects.filter(name=username,pwd=pwd) --><QuerySet []>

    看源码的习惯 : 前面的都是源码 记录下来了Debugger ->Frames里都有记录 不太爱尝试,费劲,尝试一下,感知变化

    打两个点和打一个点有什么区别:

    两个点: 中间代码直接下去了 |》

    规范

    两个变量之间加空格

    一个py程序空一格空行表示代码的结束

    黄线表示没调用到

    简单的代码向上放,避免层级过高

    更多 pep8 规范

    # TODO 我做了一件什么事情 没做完? 记录
    # FIXME  这里没有做极值的判断,可能会出现bug
    
    信号

    发送推广信息

    给某某类发什么信息

    return redirect(reverse('customer'))

    创建好了,再去处理

    (7)menu.js

    数据正确,(自己也觉得不对前端没写好 )前端显示却不对,因为没有引入js和css

    js没法再模板里直接引用 , 必须得在extends js 里引

    menu.css

    .multi-menu .item > .body a.active {
        border-left: 2px solid #2F72AB;
    }
    

    menu.js

    $('.item .title').click(function () {
        $(this).next().toggleClass('hide');		点一下一级菜单张合二级菜单		第一下二级菜单不变因为没有下级
        $(this).parent().siblings().children(".body").addClass("hide")		点一下一级菜单 本菜单的兄弟的子代添加隐藏
    });
    

    menu.py

    for key,item in menu_dict.items():
        item['class'] = 'hide'
        for child in item['children']:
            if request.show_id == child['pk']:  #bug 第一次来时,就有下拉了。。。
                item['class'] = ''		#作用是一直保持‘’ 不隐藏  前端实现了动态	
                child['class'] = 'active'	#加了状态  巩固下拉菜单的
                break
    return {"menu_dict": menu_dict}
    

    menu.html

    {% for item in menu_dict.values %}
        <div class="item">
        <div class="title"> <i class="{{ item.icon }}"></i>{{ item.title }}</div>
            {% for child in item.children %}
            <div class="body {{ item.class }}">
          <a href="{{ child.url }}" class="{{ child.class }}">{{ child.title }}</a>            </div>
            {% endfor %}
        </div>
    {% endfor %}
    

    解决: 问的楼哥:说我少一个js文件

    问的宝哥和亮哥,清一下缓存,便有了正常的格式

    (8)customer 添加按钮的判断时

    用/customer/edit/1匹配 /customer/edit/(d+) 显示

    写过滤器

    作用简单好复用,少代码

    @register.filter
    def haspermission(base_url,request):
    	for item in req.ses.get('perssion_list'):
    		reg=item['url']
    		if re.match('^%s$'.format(reg),base_url):
    			return True
    	return False
    
  • 相关阅读:
    关于CQRS(老外经典好文)
    关于Autofac的使用陷阱
    文件写入文件分布式系统(asp.net C#)
    NET Framework 4.5.2
    asp.net开源
    关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
    sql SELECT时的with(nolock)选项说明
    树形结构的数据库表Schema设计
    C#操作符??和?:
    Byte[]和BASE64之间的转换
  • 原文地址:https://www.cnblogs.com/Doner/p/11044194.html
Copyright © 2020-2023  润新知