djiango -权限管理

一、权限管理表结构

 model.py  

from django.db import models

# Create your models here.

#权限表
class Permission(models.Model):                                    #
    caption = models.CharField(max_length=32)
    parent_id = models.ForeignKey('Permission', related_name='k', to_field='id', null=True, blank=True)
    code = models.CharField(max_length=64, null=True,blank=True)
    method = models.CharField(max_length=16, null=True,blank=True)
    kwargs = models.CharField(max_length=128, null=True,blank=True)
    is_menu = models.BooleanField(default=False)

    def __str__(self):
        return self.caption
#角色表
class Role(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name
#角色对应的权限表
class RoleToPermission(models.Model):
    menu_id = models.ForeignKey(Permission, to_field='id')
    role_id = models.ForeignKey(Role, to_field='id')

    def __str__(self):
        return "%s-%s" %(self.menu_id.caption, self.role_id.name)

#用户表
class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

    def __str__(self):
        return self.username

#用户对应的权限表
class UserInfoToRole(models.Model):
    user_id = models.ForeignKey(UserInfo, to_field='id')
    role_id = models.ForeignKey(Role, to_field='id')
    def __str__(self):
        return '%s-%s' %(self.user_id.username, self.role_id.name)


 

二、easyui实现权限管理后台布局

    1下载easyui:www.jeasyui.com/download/  

    2解压下载压缩包

        拷贝若干目录文件到  django静态文件目录

        

        

         拷贝至

         

    3、修改模板 

      1)源码模板目录   demo/accordion/basic.html  修改为左侧栏目

        

        2)源码模板文件   demo/tree/checkbox.html  修改为左侧栏目树形结构

           

        

三、权限数据表填充数据

  admin.py 

from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.Permission)
admin.site.register(models.Role)
admin.site.register(models.RoleToPermission)
admin.site.register(models.UserInfo)
admin.site.register(models.UserInfoToRole)

 

  python manage.py createsuperuser

 

 

  1.权限表创建数据

    标题 一级菜单

  

 

 

 

  创建二级菜单

 

   2.创建角色数据

 

 

   

   3.角色对应权限表创建数据

    

 

 

    4.创建用户

    

    

 

 

     5.用户对应角色数据

 

 

四、获取权限,登陆 以及用户信息添加到session

 viwe.py

    --login

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
        if obj:
            # 当前用户信息保存至Session
            request.session['user_info'] = {'id': obj.id, 'name': obj.username}

            # 当前用户角色列表保存至Session
            #用户id对应角色
            result_list = models.UserInfoToRole.objects.filter(user_id_id=obj.id).values('role_id_id')
            role_list = list(map(lambda x: x['role_id_id'], result_list))
            #session添加到session
            request.session['role_list'] = role_list

            # 当前用户所有权限加入Session
            from django.db.models import Count, Min, Max, Sum
            permission_list = models.RoleToPermission.objects.filter(role_id__in=role_list).values(
                'menu_id_id').annotate(c=Count('menu_id_id')).values('menu_id__caption',
                                                                     'menu_id__parent_id',
                                                                     'menu_id__code',
                                                                     'menu_id__method',
                                                                     'menu_id__kwargs')
            # 根据permission_id去重
            permission_list = list(permission_list)
            request.session['permission_list'] = permission_list

            return redirect('/index/')
    return render(request, 'login.html')

 

login.html

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/login/" method="POST">
        <input type="text" name="user" />
        <input type="password" name="pwd" />
        <input type="submit" value="登录" />
    </form>
</body>
</html>

 

group_by使用去重

 

获取去重的权限假如session

 

 

五、左侧菜单  

  

   viwe.py

  1.myrender显示固定的数据结

def index(request):
    # 根据session中保存的menu_list生成动态菜单
    # session_menu_list = request.session['menu_list']
    # menu_list = build_tree(session_menu_list)
    #
    menu_list = [
        {
            'id': 1,
            'text': '权限管理',
            'url': None,
            'children': [
                {
                    'id': 4,
                    'text': '权限',
                    'url': 'permission'
                },
                {
                    'id': 5,
                    'text': '用户',
                    'url': 'user'
                }
            ]
         },
        {
            'id': 2,
            'text': '用户管理',
            'url': None
         },
        {
            'id': 3,
            'text': '帮助',
            'url': None
         }


    ]

    return render(request, 'index.html')

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Full Layout - jQuery EasyUI Demo</title>
    <link rel="stylesheet" type="text/css" href="/static/easyui/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="/static/easyui/themes/icon.css">
    <script type="text/javascript" src="/static/easyui/jquery.min.js"></script>
    <script type="text/javascript" src="/static/easyui/jquery.easyui.min.js"></script>
    <style>
        .crm-menu{
            display: block;
            padding: 8px;
            border-bottom: 1px dotted #dddddd;
        }
        .crm-menu:hover{
            background-color: #E0ECFF;
        }
    </style>
    {% block css %} {% endblock %}
</head>
<body class="easyui-layout">
    <div data-options="region:'north',border:false" style="height:60px;background:#B3DFDA;padding:10px">
        LOGO
    </div>
    <div data-options="region:'west',split:true,title:'West'" style="width:150px;">
        <div id="aa" class="easyui-accordion" style="width:100%;">
       #两次循环显示菜单
            {% for menu in menu_list %}
                <div title="{{ menu.text }}" data-options="iconCls:'icon-ok'" style="overflow:auto;">

                    {% for child in menu.children %}
                        <a id="menu_{{ child.url }}" href='/{{ child.url }}/' class='crm-menu'>{{ child.text }}</a>
                    {% endfor %}
                </div>
            {% endfor %}


        </div>
    
    </div>
    <div data-options="region:'south',border:false" style="height:50px;background:#A9FACD;padding:10px;">south region</div>
    <div data-options="region:'center',title:'Center'">
        {% block content %} {% endblock %}
    </div>

    {% block js %} {% endblock %}
</body>
</html>

 

自己写的列表显示

 

 

  2.session里面的数据  自动生成固定格式的列表

  view.py

  

def build_node(menu_list, dic):
    #
    for menu in menu_list:
        if menu['id'] == dic['menu_id__parent_id']:
            temp = {'id': dic['menu_id__id'],'text': dic['menu_id__caption'], 'url': dic['menu_id__code'],'children': []}
            menu['children'].append(temp)
            break
        else:
            build_node(menu['children'], dic)

def build_tree(session_menu_list):
    # [ {menu_id__parent_id: None, 'menu_id__caption': '权限管理', 'menu_id__code': 'permission'},{},{} ]
    menu_list = []
    # menu_list = [{...}]
    for dic in session_menu_list:
        if dic['menu_id__parent_id'] == None:
            temp = {'id': dic['menu_id__id'],'text': dic['menu_id__caption'], 'url': dic['menu_id__code'],'children': []}
            menu_list.append(temp)
        else:
            # 当前
            build_node(menu_list, dic)
    return menu_list

 

3.创建myrender  每次返回自动把 menu加到session

viwe.py

def my_render(request, template_name, context=None, *args, **kwargs):
    session_menu_list = request.session['menu_list']
    menu_list = build_tree(session_menu_list)
    if context:   #context 是none  标题
        context['menu_list'] = menu_list
    else:         #否则是         菜单
        context = {'menu_list': menu_list}
    return render(request, template_name, context, *args, **kwargs)



def index(request):
    # 根据session中保存的menu_list生成动态菜单
    # session_menu_list = request.session['menu_list']
    # menu_list = build_tree(session_menu_list)
    #

    return my_render(request, 'index.html')

def user(request):
    return my_render(request, 'user.html')

 

 

 

六 自动生成内容页 树形结构

  html 修改模板 demo/tree/checkbox.html  

  viwe.py获得用户所有权限

 

代码:

    viwe.py

def permission(request):
    # 当前用户所有的权限

    return my_render(request, 'permission.html')

def get_permission_tree(request):
    session_permission_list = request.session['permission_list']
    permission_list = build_tree(session_permission_list)
    return HttpResponse(json.dumps(permission_list))

 

permission.html

{% extends 'layout/_layout.html' %}

{% block  content %}

    <div style="float: left;width: 300px">
        <ul id="pers_tree" ></ul>
        <!-- <ul id="tt" class="easyui-tree" data-options="url:'/get_permission_tree/',method:'get',animate:true"></ul> -->
    </div>

    <div style="float: left;width: 600px">
         <table id="dg"></table>
    </div>

{% endblock %}

{% block js %}
<script> $(function(){ InitTree(); });     #方法二 function InitTree(){ $('#pers_tree').tree({ url: '/get_permission_tree/', method: 'get', animate: true, onClick: function(node){ console.log(node.text,node.id); InitTable(node.id); InitPagination(); } }) } {% endblock %}

 

显示

 

 

 

七、根据id 获取下属权限表格

viwe.py

def get_child_permission(request):
    node_parent_id = request.GET.get('node_parent_id')
    page = request.GET.get('page')
    rows = request.GET.get('rows')
    page = int(page)
    rows = int(rows)
    start = (page - 1) * rows
    end = page * rows

    result_queryset = models.Permission.objects.filter(parent_id = node_parent_id).values('caption','code')[start:end]
    result_list = list(result_queryset)
    # [ {'caption': 'x', 'code': xxx} ]
    return HttpResponse(json.dumps(result_list))

 

 

permission.html  +

{% extends 'layout/_layout.html' %}

{% block  content %}

    <div style="float: left;width: 300px">
        <ul id="pers_tree" ></ul>
        #方法一
        <!-- <ul id="tt" class="easyui-tree" data-options="url:'/get_permission_tree/',method:'get',animate:true"></ul> -->
    </div>

    <div style="float: left;width: 600px">
         <table id="dg"></table>
    </div>

{% endblock %}

{% block js %}
    <script>
        $(function(){
            InitTree();
        });

        function InitTree(){
            $('#pers_tree').tree({
                url: '/get_permission_tree/',
                method: 'get',
                animate: true,
                onClick: function(node){
                    console.log(node.text,node.id);
                    InitTable(node.id);
                    InitPagination();
                }
            })
        }

        function InitTable(node_parent_id){
            $('#dg').datagrid({
                title: '听不下去了',
                url: '/get_child_permission/',
                method: 'get',
                queryParams: {
                    node_parent_id: node_parent_id
                },
                columns: [[
                    {
                        field: 'ck',
                        checkbox: true
                    },
                    {
                        field: 'caption',
                        title: '标题',
                        width: 180,
                        align: 'center'
                    },
                    {
                        field: 'code',
                        title: 'URL',
                        width: 180,
                        align: 'center'
                    }

                ]],
                toolbar: [
                    {
                        text: '添加',
                        iconCls: 'icon-add',
                        handler: AddRow
                    }, {
                        text: '删除',
                        iconCls: 'icon-remove',
                        handler: RemoveRow
                    }, {
                        text: '修改',
                        iconCls: 'icon-edit',
                        handler: EditRow
                    }
                ],
                pagePosition: 'both',
                pagination: true,
                pageSize: 10,
                pageNumber: 1,
                pageList: [10, 20, 50]
            })
        }

        function AddRow(){
            console.log('addrow');
        }
        function RemoveRow(){
            console.log('RemoveRow');
        }
        function EditRow(){
            console.log('EditRow');
        }

        function InitPagination() {
            var pager = $('#dg').datagrid('getPager');
            $(pager).pagination({
                beforePageText: '',
                afterPageText: '页 共{pages}页',
                displayMsg: '当前显示{from}-{to}条记录 共{total}条数据'
            })
        }
    </script>
{% endblock %}

 

显示效果:

 

转载于:https://www.cnblogs.com/wudalang/p/6019533.html

本课程为Django第八季课程:用户权限管理     本季课程主要用户登录后权限管理,内容包含:用户权限管理的总体介绍和分析、RBAC的介绍、角色管理、用户加入角色、xmselect选择框的使用、菜单管理、权限条目的管理、权限的树状结构的呈现、为角色分配权限、用户登录后构建权限的列表、在中间件中完善权限的验证、用户登录后构建侧边栏菜单的数据、登录后自动生成侧边栏的树状结构、templatetags的使用等等内容    本案例完整的演示了项目实现过程,虽然不复杂,但涉及的内容非常多,特别是前后端交互的时候,有诸多的坑等着你去踩,好在王老师全程代码呈现,带着大家一起填坑,大大提高学习效率的同时,也培养了大家良好的代码习惯,希望大家一起跟着王进老师学习Python开发。  Django第九季课程课程预告:Web项目发布到公有云  课程目标:本系列课程是从零基础开始并深入讲解Django,最终学会使用Django框架开发企业级的项目。课程知识点详细,项目实战贴近企业需求。本系列课程除了非常详细的讲解Django框架本身的知识点以外,还讲解了web开发中所需要用到的技术,学完本系列课程后,您将独立做出一个具有后台管理系统,并且前端非常优美实用的网站。对于从事一份Python Web开发相关的工作简直轻而易举。 项目展示:  
Django 是一个高效的 Web 开发框架,提供了许多方便的工具和库,可以帮助我们快速构建 Web 应用程序。其中包括创建商品管理的工具。 下面是一个简单的 Django 商品管理示例,演示如何使用 Django 创建一个基本的商品管理系统: 1. 创建一个 Django 项目和应用程序 首先,您需要创建一个 Django 项目和应用程序。您可以使用以下命令创建一个名为 `myproject` 的项目和一个名为 `products` 的应用程序: ``` $ django-admin startproject myproject $ cd myproject $ python manage.py startapp products ``` 2. 创建商品模型 接下来,您需要创建一个商品模型。在 `products/models.py` 文件中添加以下代码: ```python from django.db import models class Product(models.Model): name = models.CharField(max_length=255) description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name ``` 这个模型定义了一个名为 `Product` 的类,它继承自 Django 的 `models.Model` 类。它有几个属性,包括商品名称、描述、价格、创建时间和更新时间。`__str__` 方法定义了在 Django 管理后台中显示对象时要使用的字符串表示形式。 3. 运行数据库迁移 接下来,您需要运行数据库迁移,以便 Django 创建数据库表。 ``` $ python manage.py makemigrations $ python manage.py migrate ``` 4. 创建商品管理后台 接下来,您需要创建商品管理后台。在 `products/admin.py` 文件中添加以下代码: ```python from django.contrib import admin from .models import Product admin.site.register(Product) ``` 这会将 `Product` 模型注册到 Django 管理后台,以便您可以在后台管理商品。 5. 运行服务器 现在,您可以运行开发服务器并查看您的应用程序: ``` $ python manage.py runserver ``` 访问 `http://127.0.0.1:8000/admin/`,您应该能够在 Django 管理后台中看到一个新的“Products”部分,您可以在其中管理商品。 这是一个简单的 Django 商品管理示例,您可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值