内容简介:为了解决 跳转页面时,也保留菜单栏的数据, 可以再auth表里添加一个 foreignkey 关联自己的方式自锁:最终的输出:(json格式化后:)
为了解决 跳转页面时,也保留菜单栏的数据, 可以再auth表里添加一个 foreignkey 关联自己的方式自锁:
class Auth(models.Model): ##权限表
name = models.CharField(max_length=64, blank=True, null=True, verbose_name="显示路径名")
url = models.CharField(max_length=64, blank=True, null=True, verbose_name="路径")
groupauth = models.ForeignKey(to='AuthGroup', blank=True, null=True, verbose_name="组权限", related_name="authgroup") #组和权限是一对多的关系,一个组有多个权限
to_display = models.ForeignKey(to='Auth', blank=True, null=True, verbose_name='显示', related_name='authauth') ##增加的此句
def __str__(self):
return self.url
class Meta:
verbose_name_plural = "权限表"
更新数据表:
python manage.py makemigrations python manage.py migrate
登录后需要做的两件事:
- 把菜单相关的数据拿到; - 把用户所有能访问的url拿到;
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from auth_server import models
def auth_demo(request):
if request.method == 'GET':
return render(request, 'login.html', locals())
else:
username = request.POST.get('username')
password = request.POST.get('password')
user_obj_li = models.UserInfo.objects.filter(name=username, password=password)
if user_obj_li.first():
obj_all = user_obj_li.values('userPosition__auth__url',
'userPosition__auth__name',
'userPosition__auth__to_display__name',
'userPosition__auth__group__name',
'userPosition__auth__group__name',
'userPosition__auth__group__menu__name',
)
print(obj_all)
###菜单
menu_dic = {}
for i in obj_all:
menu_auth_dic = {
'url': i.get('userPosition__auth__url'), ##跨表取到auth的url信息
'name': i.get('userPosition__auth__name'),
'display_url': i.get('userPosition__auth__to_display__url'),
'display_name': i.get('userPosition__auth__to_display__name')
}
if i.get('userPosition__auth__group__menu__name') in menu_dic.keys():
if not i.get('userPosition__auth__to_display__name'):
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'].append(menu_auth_dic)
else:
menu_dic[i.get('userPosition__auth__group__menu__name')] = {}
menu_dic[i.get('userPosition__auth__group__menu__name')]['name'] = i.get('userPosition__auth__group__menu__name')
if not i.get('userPosition__auth__to_display__name'):
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [menu_auth_dic, ]
else:
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = []
print("菜单-->", menu_dic)
###权限
auth_dic = {}
for i in obj_all:
if i.get('userPosition__auth__group__name') in auth_dic.keys():
auth_dic[i.get('userPosition__auth__group__name')]['url'].append(i.get('userPosition__auth__name'))
else:
auth_dic[i.get('userPosition__auth__group__name')] = {'url': [i.get('userPosition__auth__name'), ], }
print('权限 ---> ', auth_dic)
else:
error = "用户名或密码不正确!"
return render(request, 'login.html', locals())
return HttpResponse("登录成功!")
最终的输出:(json格式化后:)
菜单-- > {
'权限': {
'lower': [{
'display_url': None,
'display_name': None,
'name': '/auth/add.html',
'url': '增加权限'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/(\\d+)/update.html',
'url': '更新权限'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/(\\d+)/del.html',
'url': '删除权限'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/list.html',
'url': '查看权限'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/host/list.html',
'url': '查看主机'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/host/(\\d+)/update.html',
'url': '更新主机'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/host/(\\d+)/del.html',
'url': '删除主机'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/host/add.html',
'url': '增加主机'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/authgroup/(\\d+)/update.html',
'url': '更新权限组'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/authgroup/(\\d+)/del.html',
'url': '删除权限组'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/authgroup/add.html',
'url': '增加权限组'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/menu/(\\d+)/del.html',
'url': '删除菜单'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/menu/(\\d+)/update.html',
'url': '更新菜单'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/menu/list.html',
'url': '查看菜单'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/menu/add.html',
'url': '增加菜单'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/user/(\\d+)/del.html',
'url': '删除用户'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/user/(\\d+)/update.html',
'url': '更新用户'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/user/add.html',
'url': '增加用户'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/user/list.html',
'url': '查看用户'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/position/add.html',
'url': '增加职位'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/position/list.html',
'url': '查看职位'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/position/(\\d+)/update.html',
'url': '更新职位'
}, {
'display_url': None,
'display_name': None,
'name': '/auth/position/(\\d+)/delete.html',
'url': '删除职位'
}],
'name': '权限'
}
}
----
权限-- - > {
'用户表': {
'url': ['/auth/user/(\\d+)/del.html', '/auth/user/(\\d+)/update.html', '/auth/user/add.html', '/auth/user/list.html']
},
'职位表': {
'url': ['/auth/position/add.html', '/auth/position/list.html', '/auth/position/(\\d+)/update.html', '/auth/position/(\\d+)/delete.html']
},
'主机': {
'url': ['/auth/host/list.html', '/auth/host/(\\d+)/update.html', '/auth/host/(\\d+)/del.html', '/auth/host/add.html']
},
'菜单表': {
'url': ['/auth/menu/(\\d+)/del.html', '/auth/menu/(\\d+)/update.html', '/auth/menu/list.html', '/auth/menu/add.html']
},
'权限表': {
'url': ['/auth/add.html', '/auth/(\\d+)/update.html', '/auth/(\\d+)/del.html', '/auth/list.html']
},
'权限组表': {
'url': ['/auth/authgroup/(\\d+)/update.html', '/auth/authgroup/(\\d+)/del.html', '/auth/authgroup/add.html', '/auth/authgroup/list.html']
}
}
如上的obj_all中的querySetList:
< QuerySet[{
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '增加权限',
'userPosition__auth__group__name': '权限表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/add.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '更新权限',
'userPosition__auth__group__name': '权限表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/(\\d+)/update.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '删除权限',
'userPosition__auth__group__name': '权限表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/(\\d+)/del.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '查看权限',
'userPosition__auth__group__name': '权限表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/list.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '查看主机',
'userPosition__auth__group__name': '主机',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/host/list.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '更新主机',
'userPosition__auth__group__name': '主机',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/host/(\\d+)/update.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '删除主机',
'userPosition__auth__group__name': '主机',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/host/(\\d+)/del.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '增加主机',
'userPosition__auth__group__name': '主机',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/host/add.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '更新权限组',
'userPosition__auth__group__name': '权限组表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/authgroup/(\\d+)/update.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '删除权限组',
'userPosition__auth__group__name': '权限组表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/authgroup/(\\d+)/del.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '增加权限组',
'userPosition__auth__group__name': '权限组表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/authgroup/add.html'
}, {
'userPosition__auth__to_display__name': '/auth/authgroup/list.html',
'userPosition__auth__url': '查看权限组',
'userPosition__auth__group__name': '权限组表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/authgroup/list.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '删除菜单',
'userPosition__auth__group__name': '菜单表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/menu/(\\d+)/del.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '更新菜单',
'userPosition__auth__group__name': '菜单表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/menu/(\\d+)/update.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '查看菜单',
'userPosition__auth__group__name': '菜单表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/menu/list.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '增加菜单',
'userPosition__auth__group__name': '菜单表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/menu/add.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '删除用户',
'userPosition__auth__group__name': '用户表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/user/(\\d+)/del.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '更新用户',
'userPosition__auth__group__name': '用户表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/user/(\\d+)/update.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '增加用户',
'userPosition__auth__group__name': '用户表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/user/add.html'
}, {
'userPosition__auth__to_display__name': None,
'userPosition__auth__url': '查看用户',
'userPosition__auth__group__name': '用户表',
'userPosition__auth__group__menu__name': '权限',
'userPosition__auth__name': '/auth/user/list.html'
}, '...(remaining elements truncated)...'] >
二、左侧菜单和权限应用
如上代码如果直接写在view视图中太臃肿,而且没有任何逻辑性,看起来也比较乱。我们可以封装为一个函数,通过传值即可调用函数:
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
from auth_server import models
from utils import login_auth
def auth_demo(request):
if request.method == 'GET':
return render(request, 'login.html', locals())
else:
username = request.POST.get('username')
password = request.POST.get('password')
user_obj_li = models.UserInfo.objects.filter(name=username, password=password)
if user_obj_li.first():
###用户名,密码输入正确,初始化数据:
login_auth.menu_auth(user_obj_li, request)
###跳转到index页面:
print("123123")
return redirect('/index.html')
else:
###用户名或密码错误:
print("345345")
error = "用户名或密码错误!!"
return render(request, 'login.html',locals())
def index(request):
menu_dic = request.session.get('menu_dic')
print("666666")
print("menu_dic--->", menu_dic)
return render(request, 'index.html', {'menu_dic': menu_dic})
如上我们所用的方式是直接在pycharm界面打印出来这部分数据,现在我们就需要将这部分数据保存到 内存,数据库或者session中;然后我们直接去取这部分数据即可!
login_auth.py (将数据存入session中)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019-2-2 15:27
# @Author : zhdya@zhdya.cn
# @File : login_auth.py
from django.shortcuts import render,HttpResponse
def menu_auth(user_obj_li, request):
obj_all = user_obj_li.values('userPosition__auth__url',
'userPosition__auth__name',
'userPosition__auth__to_display__url',
'userPosition__auth__to_display__name',
'userPosition__auth__group__name',
'userPosition__auth__group__menu__name',
)
print(obj_all)
###菜单
menu_dic = {}
for i in obj_all:
menu_auth_dic = {
'url': i.get('userPosition__auth__url'), ##跨表取到auth的url信息
'name': i.get('userPosition__auth__name'),
'display_url': i.get('userPosition__auth__to_display__url'),
'display_name': i.get('userPosition__auth__to_display__name')
}
if i.get('userPosition__auth__group__menu__name') in menu_dic.keys():
# 第一次是空字典,所以是走else
if not i.get('userPosition__auth__to_display__name'):
# 第二次 字典有值了 判断 to_display 一对多关系
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'].append(menu_auth_dic)
# menu_dic.get(i.get('userPosition__auth__group__menu__name')).get('lower').append(menu_auth_dic)
# 将字典的lower 的值, 是一个列表 [{},{},{}],往里面添加列表的值(字典) -> append(dict)
else:
menu_dic[i.get('userPosition__auth__group__menu__name')] = {}
menu_dic[i.get('userPosition__auth__group__menu__name')]['name'] = i.get('userPosition__auth__group__menu__name')
# menu_dic.get(i.get('userPosition__auth__group__menu__name')) = {}
# menu_dic.get(i.get('userPosition__auth__group__menu__name')).get('name') = i.get('userPosition__auth__group__menu__name')
if not i.get('userPosition__auth__to_display__name'):
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = [menu_auth_dic, ]
else:
menu_dic[i.get('userPosition__auth__group__menu__name')]['lower'] = []
print("菜单-->", menu_dic)
request.session['menu_dic'] = menu_dic ###存入session
###权限
auth_dic = {}
for i in obj_all:
if i.get('userPosition__auth__group__name') in auth_dic.keys():
auth_dic[i.get('userPosition__auth__group__name')]['url'].append(i.get('userPosition__auth__name'))
else:
auth_dic[i.get('userPosition__auth__group__name')] = {'url': [i.get('userPosition__auth__name'), ], }
print('权限 ---> ', auth_dic)
request.session['auth_dic'] = auth_dic ###存入session
在写index前,先来看下我们获取的menu_dic数据:(部分)
菜单-- > {
'权限': {
'lower': [{
'display_name': None,
'url': '增加权限',
'display_url': None,
'name': '/auth/add.html'
}, {
'display_name': None,
'url': '更新权限',
'display_url': None,
'name': '/auth/(\\d+)/update.html'
}, {
'display_name': None,
'url': '删除权限',
'display_url': None,
'name': '/auth/(\\d+)/del.html'
},
index.html(根据如上数据,获取需要的数据)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="index">
{% for item in menu_dic.values %}
<h2>{{ item.name }}</h2>
{% for i in item.lower %}
<div>
<a href="{{ i.name }}"> {{ i.url }} </a>
</div>
{% endfor %}
{% endfor %}
</div>
</body>
</html>
使用不同的账户,得到的是不同的权限:
BOSS1账户:
ceshi1账户:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring-Security权限管理框架(1)——根据角色权限登录
- 三大渗透框架权限维持
- Django框架–权限表设计
- ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
- 基于注解的6.0权限动态请求框架——JPermission
- YuebonCore 1.0.1 发布,权限管理及快速开发框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java程序设计
宋中山 严千钧 等编 / 清华大学出版社 / 2005-8 / 27.00元
本书全面、系统地介绍了Java语言的基本概念、基本语法和编程方法。主要内容包括:Java语言概述、数据类型与运算符、流程控制语句、类与对象、继承与多态、异常处理、工具类和算法、Applet小应用程序、图形用户界面、输入和输出、Java多线程以及Java高级编程。每章后面附有习题,读者可参考使用。 本书内容丰富,结构合理,语言简洁,深入浅出,通俗易懂。基础知识与程序实例相结合,示例典型......一起来看看 《Java程序设计》 这本书的介绍吧!