分配許可權

来源:https://www.cnblogs.com/12345huangchun/archive/2019/02/26/10440635.html
-Advertisement-
Play Games

對於後臺管理工具,會根據員工的角色不同,從而擁有不同的許可權,所能訪問的頁面不同,首先要給員工分配角色,然後再給角色分配權力,這樣就完成了許可權分配。其實基於stark組件做的許可權管理,我們可以一個一個頁面的去完成許可權分配,但其實我們有更好的方法去實現,把員工、角色、權力都放在一個頁面上,一目瞭然的查看 ...


  對於後臺管理工具,會根據員工的角色不同,從而擁有不同的許可權,所能訪問的頁面不同,首先要給員工分配角色,然後再給角色分配權力,這樣就完成了許可權分配。其實基於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。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 人生苦短,我用 Python —— Life is short, you need Python 目標 Python 的起源 Python 解釋器 是用 C 語言實現的,並能夠調用 C 語言的庫文件. Python(蟒蛇) 為什麼要用 Python? Python 的特點 Python 是完全面向對 ...
  • 策略模式 雖然我本人比較討厭一些很官方的術語定義,因為我經常弄不明白有些定義講了個啥,但是為了讓這篇博文顯得不那麼輕浮,所以我也就不能免俗的先將設計模式之策略模式的定義首先丟到各位看官面前。 策略模式定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 第一眼 ...
  • 開學兩天,身上的職責直接變為兩個班班長,三個小組組長,哇這事情估計夠我忙活了,想躲都躲不掉啊,看來我還是真招人推薦各種管理職務啊,以後要是有人推薦我當經理啊領導啊該多好哈哈哈哈。記得今天奶奶生日,很開心地給奶奶打了一通電話,這怕是我第一次給奶奶電話送生日祝福了哈哈哈,是啊,很想珍惜身邊的人,但很多時 ...
  • 導師359213571如果你是剛剛玩,我來教教你,如果你已經玩很久了,卻不穩,我來拉拉你,如果你已經遍體鱗傷,我來幫幫你. 我不能保證你一夜致富但希望能細水長流,匯聚江海,先要平穩的心態,不要一盤的失誤影響你心情。 自己有規劃性和目標性。做到這兩點,過來找我我來幫你。 1、死跟計劃。現在很多群里都有 ...
  • Java基礎知識篇 面向對象和麵向過程的區別 面向過程: 優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般採用面向過程開發,性能是最重要的因素。 缺點:沒有面向對象易維護、易復用、易擴展 面向對象: 優點:易維護、易復用、易 ...
  • 導師359213571如果你是剛剛玩,我來教教你,如果你已經玩很久了,卻不穩,我來拉拉你,如果你已經遍體鱗傷,我來幫幫你. 我不能保證你一夜致富但希望能細水長流,匯聚江海,先要平穩的心態,不要一盤的失誤影響你心情。 自己有規劃性和目標性。做到這兩點,過來找我我來幫你。 1、死跟計劃。現在很多群里都有 ...
  • 導師3592135711、死跟計劃。現在很多群里都有計劃,大家都在跟計劃,一起交流但計劃只是一款軟體經過某種運算得出來的數,但大家都在跟計劃,為什麼有的人贏了,有的人輸了,這就是要會跟計劃,計劃不能盲目跟從。不能每期都買,不能每期都跟,每期都跟計劃的,跟的越緊死得越快!切記!不存在一款也已預測未來的 ...
  • 給定一個字元串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1:輸入: "babad"輸出: "bab"註意: "aba" 也是一個有效答案。 示例 2:輸入: "cbbd"輸出: "bb" 思路一:暴力法,不說了 思路二:動態規劃 參考官方給的思路: How c ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...