75

原文链接: http://www.cnblogs.com/Doner/p/11044194.html

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对象   现在是字典     

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'])     

3种方法:

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

rbac.py

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

!permission归属,从属与我的id的pid](E:\Download\qq_download\teacher_huatu_download\s20py\Django\day75\permission归属,从属与我的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'))

创建好了,再去处理

数据正确,(自己也觉得不对前端没写好 )前端显示却不对,因为没有引入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

转载于:https://www.cnblogs.com/Doner/p/11044194.html

猜你喜欢

转载自blog.csdn.net/weixin_30642561/article/details/95303276
75