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
原文地址:https://www.cnblogs.com/Doner/p/11044194.html