分配許可權

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...