分配权限

12345huangchun 2019-02-26 原文

分配权限

  对于后台管理工具,会根据员工的角色不同,从而拥有不同的权限,所能访问的页面不同,首先要给员工分配角色,然后再给角色分配权力,这样就完成了权限分配。其实基于stark组件做的权限管理,我们可以一个一个页面的去完成权限分配,但其实我们有更好的方法去实现,把员工、角色、权力都放在一个页面上,一目了然的查看权限和分配权限,如下图:

  一、上代码

  1,视图函数

  我已经创建好了三张表,分别是UserInfo员工表,Role角色表,Power权力表

    def distribute_view(self,request):
        user_list=UserInfo.objects.all()
        role_list=Role.objects.all()
        power_list=Power.objects.all().values('pk','name','url','parent')
        power_id_list=[]
        uid=request.GET.get('uid')
        rid=request.GET.get('rid')
        if request.method=='POST':             #这是点击保存按钮的请求路径
            user = UserInfo.objects.filter(id=uid)
            role = Role.objects.filter(id=rid)
            if uid:                              #这是角色上的保存按钮提交的
                l = request.POST.getlist("role")
                user.first().roles.set(l)
            if rid:                             #这是权限上的保存按钮提交
                l=request.POST.getlist('power')
                pid=[]
                for i in l:
                    lis=Power.objects.filter(pk=i).first().parents.split('/')
                    pid.extend(lis)
                    pid.append(i)
                pid=list(set(pid))
                role.first().power.set(pid)
        if uid:                                #这是点击员工名字时发送的请求,用a标签发送
            roles=UserInfo.objects.get(pk=uid).roles.all().values_list('pk')
            role_id_list=[role[0] for role in roles]
            powers=UserInfo.objects.get(pk=uid).roles.filter(power__isnull=False).values_list('power__pk')
            power_id_list=[power[0] for power in powers]
        if rid:                                #这是点击角色名字时发送的请求,用a标签发送
            powers=Role.objects.get(pk=rid).power.all().values_list('pk')
            power_id_list = [power[0] for power in powers]
        for one in power_list:
            if one['url']==None:
                one['url']=''
        power_json=json.dumps(list(power_list))

        return render(request,'distribute.html',locals())

  3,前端页面

  在我的模板里有一个base.html的母版,现在只是继承他,母版里分为三个部分,已经写好的有导航区和左侧菜单,我们只需要完成内容区,然后加进去就行,下面写的就是内容区的内容。

{% extends "base.html" %}
{% block css %}
    <style>
        .excute{
            color: blue;
            margin-left: 30px;
        }
        .ac{
            background-color:grey;!important;
        }
    </style>
{% endblock %}
{% block content %}
    <div class="row">
        <div class="col-md-2">                            #这是渲染员工那一列面板
            <div class="panel panel-success">
                <!-- Default panel contents -->
                <div class="panel-heading">用户</div>
                <div class="panel-body">
                    <!-- Table -->
                    <table class="table">
                        {% for user in user_list %} 
                            {% if user.pk|safe == uid %}         #被点中的颜色变
                                <tr class="ac"><td><a href="?uid={{ user.pk }}">{{ user.name }}</a></td></tr>
                            {% else %}
                                <tr><td><a href="?uid={{ user.pk }}">{{ user.name }}</a></td></tr>
                            {% endif %}

                        {% endfor %}
                    </table>
                </div>
            </div>
        </div>
        <form action="" method="post">
        {% csrf_token %}
        <div class="col-md-3">                       #这是渲染角色的面板
            <div class="panel panel-info">
                <!-- Default panel contents -->
                <div class="panel-heading">角色
                    {% if uid %}
                        <input type="submit" value="保存">           #当点击某个员工的名字时会发送请求,而且携带uid,所以能取到uid,从而把保存按钮给显示出来,其他时候都是不显示的
                    {% endif %}
                </div>
                <div class="panel-body">
                    <!-- Table -->
                    <table class="table">
                        {% for role in role_list %}
                            {% if role.id|safe == rid %}               #当点击某个角色的名字时会发送请求,并携带rid,所以能取到rid,从而把保存按钮给显示出来,其他时候都不显示
                                <tr class="ac">       #被点中颜色变
                                <td><a href="?rid={{ role.pk }}">{{ role.name }}</a></td>
                                {% if role.id in role_id_list %}             
                                    <td><input type="checkbox" name="role" value="{{ role.pk }}" checked></td>
                                {% else %}
                                    <td><input type="checkbox" name="role" value="{{ role.pk }}"></td>
                                {% endif %}
                                </tr>
                            {% else %}
                                <tr>
                                <td><a href="?rid={{ role.pk }}">{{ role.name }}</a></td>
                                {% if role.id in role_id_list %}
                                    <td><input type="checkbox" name="role" value="{{ role.pk }}" checked></td>
                                {% else %}
                                    <td><input type="checkbox" name="role" value="{{ role.pk }}"></td>
                                {% endif %}
                                </tr>
                            {% endif %}

                        {% endfor %}
                    </table>
                </div>
            </div>
        </div>
        </form>
        <form action="" method="post">
        {% csrf_token %}
        <div class="col-md-6 power">                      #这是渲染权力的面板
            <div class="panel panel panel-warning">
                <div class="panel-heading">权力
                    {% if rid %}
                        <input type="submit" value="保存">
                    {% endif %}
                </div>
                {% for power in power_list %}
                    {% if not power.parent %}                    #在这里只拿到没有父级的菜单,也就是一级菜单
                        <div class="panel-body">
                            <!-- Table -->
                            <table class="table">
                                <thead class="pk_{{ power.pk }}">
                                    <tr><th>{{ power.name }}</th></tr>
                                </thead>
                            </table>
                        </div>
                    {% endif %}
                {% endfor %}
            </div>
        </div>
        </form>
    </div>

{% endblock %}
{% block script %}
    <script>
        $(function () {
          distribute()
        });
        function distribute() {
            var list={{ power_json|safe }};
            $.each(list,function(i,power){               #这是渲染出非一级菜单
                var pk=power['pk'];
                var url=power['url'];
                var name=power['name'];
                var parent=power['parent'];
                var ele=null;
                if (url==''){
                    ele=`<tbody><tr class='pk_${pk}'><td>${name}</td></tr></tbody>`;
                }
                else {
                    ele=`<span class='pk_${pk} excute'>${name}<input type="checkbox" name="power" value="${pk}"></span>`;
                    }
                $('.pk_'+parent).after(ele)
            });
        var power_id_list={{ power_id_list|safe }};                  #这是给拥有的权利附上‘checked’,让他显示勾中
        $.each(power_id_list,function(i,j){
            $("[name=power][value='"+j+"']").prop("checked",true);
        })
        }
    </script>
{% endblock %}

  二、功能

  1,直接访问页面

  2,点击用户名字

  此时就可以给员工选择角色,然后点保存,酒后在后台把这位员工的角色给change

  3,点击角色

  现在就可以为角色分配权力,点击保存,就会把角色的权利给change。

 

发表于 2019-02-26 22:24 W的一天 阅读() 评论() 编辑 收藏

 

版权声明:本文为12345huangchun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/12345huangchun/p/10440635.html

分配权限的更多相关文章

  1. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url […]...

  2. Django(6)自定义路由转换器

    自定义路径转换器 有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以 […]...

  3. django之urls系统

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像D […]...

  4. Vue结合Django-Rest-Frameword结合实现登录认证(二)

    在上一篇 [Vue结合Django-Rest-Frameword结合实现登录认证(一)]文章中,我们利用`to […]...

  5. Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin […]...

  6. Django: 项目实战从0开始—实现登录注册系统。(2) – 超nmmmmm

    Django: 项目实战从0开始—实现登录注册系统。(2) 前面我们已经创建好数据模型了,并且在a […]...

  7. Django学习笔记(19)——BBS+Blog项目开发(3)细节知识点补充

      本文将BBS+Blog项目开发中所需要的细节知识点进行补充,其中内容包括KindEditor编辑器的使用, […]...

  8. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_e […]...

随机推荐

  1. sqlite数据库

      来自:https://carsonho.blog.csdn.net/article/details/532 […]...

  2. C#数据类型及其转换详解

    首先分析了C#的数据类型,以及值类型和引用类型的区别,最后介绍了三种类型转换的函数,以及他们的区别和使用场景, […]...

  3. GEF入门实例_总结_04_Eclipse插件启动流程分析

    一、前言 本文承接上一节:GEF入门实例_总结_03_显示菜单和工具栏 注意到app目录下的6个类文件。 这6 […]...

  4. java基础 – 形参和实参,值传递和引用传递

    形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。 形参只有在方法被 […]...

  5. python迭代器

    目录 1. 可迭代对象 2. 如何判断一个对象是否可以迭代 3. 可迭代对象的本质 4. iter()函数与n […]...

  6. 非常有用的免费UI设计工具和资源

    这篇文章要与大家分享的都是很棒的免费UI设计工具和资源,有Web开发方面的,也有移动开发方面的,非常丰富,相信 […]...

  7. 2000年前十大经典PC游戏

    1、仙剑奇侠传(大宇·狂徒 /1995/RPG )   作为中文 RPG 游戏当之无愧的极品,所有玩过《仙》的 […]...

  8. 【转】如图,win7登陆界面,键盘失灵,没办法登陆。求解!如何在这个界面打开个鼠标可以点的软键盘 – wi100sh

    【转】如图,win7登陆界面,键盘失灵,没办法登陆。求解!如何在这个界面打开个鼠标可以点的软键盘 原文网址:h […]...

展开目录

目录导航