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: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