django項目后台權限管理功能。


對后台管理員進行分角色,分類別管理,每個管理員登錄賬號后只顯示自己負責的權限范圍。

創建后台管理數據庫

models.py文件內

# 管理員表
class Superuser(models.Model):
    super_id=models.AutoField(primary_key=True)
    super_name=models.CharField(max_length=255)
    super_pwd=models.CharField(max_length=255)
    role = models.ManyToManyField(to='Role', )
#后台菜單表
class Menu(models.Model):
    """
    菜單表
    """
    name = models.CharField(verbose_name='菜單名', max_length=255)
    path = models.CharField(verbose_name='路徑', max_length=255,
                            null=True,
                            blank=True)  # null :針對數據庫,如果 null=True, 表示數據庫的該字段可以為空,即在Null字段顯示為YES。blank :針對表單,如果 blank=True,表示你的表單填寫該字段時可以不填,但是對數據庫來說,沒有任何影響
    pid = models.ForeignKey(verbose_name='關聯的權限', to='Menu', null=True, blank=True, related_name='parents',
                            help_text='父id', on_delete=models.CASCADE)

    # def __str__(self):
    #     return self.name

# 權限表
class Permission(models.Model):
    """
    權限表
    """
    name = models.CharField(verbose_name='權限名', max_length=255)
    path = models.CharField(verbose_name='路徑', max_length=255,
                            null=True,
                            blank=True)  # null :針對數據庫,如果 null=True, 表示數據庫的該字段可以為空,即在Null字段顯示為YES。blank :針對表單,如果 blank=True,表示你的表單填寫該字段時可以不填,但是對數據庫來說,沒有任何影響
    pid = models.ForeignKey(verbose_name='關聯的權限', to='Permission', null=True, blank=True, related_name='parents',
                            help_text='父id', on_delete=models.CASCADE)
    #1對多
    menu = models.ForeignKey(verbose_name='所屬菜單', to='Menu', null=True, blank=True, help_text='null表示不是菜單;非null表示是二級菜單',on_delete=models.CASCADE)
    # def __str__(self):
    #     return self.name

#角色表
class Role(models.Model):
    """
    角色表
    """
    name = models.CharField(verbose_name='角色名', max_length=255)
    access = models.CharField(verbose_name='可以訪問的權限', max_length=255,
                              null=True,
                              blank=True)

創建和遷移數據庫命令

python manage.py makemigrations
python manage.py migrate

應用目錄下定義中間件,my_middleware.py文件,用來使權限生效。

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect
from blog.models import Role,Superuser,Menu,Permission
import json

class AuthMiddleware(MiddlewareMixin):
    # 重寫process_request方法
    def process_request(self, request):
        # 如果路徑中包含back即為后台路徑
        if 'back/' in request.path:
            # 獲取用戶登錄的id
            super_id = request.session.get('super_id')
            # 判斷是否登錄,未登錄則跳轉至登錄界面
            if not super_id and request.path != '/back/index/login/':
                return redirect('/back/index/login/')
            if super_id:
                # 判讀當前登錄用戶,是否擁有訪問此路徑的權限
                role_objs = Superuser.objects.filter(super_id=super_id).first().role.all().values('id')# 查詢用戶角色
                permission_obj = Permission.objects.filter(path=request.path).first()  # 當前訪問的權限id
                # 如果查詢到有權限對象
                if permission_obj:
                    # 定義權限列表
                    permission_list=[]
                    # 遍歷角色對象
                    for role in role_objs:
                        # print(role['id'])
                        # 獲取角色的權限
                        access_obj=Role.objects.filter(id=role['id']).first()
                        # 向權限列表中添加數據
                        permission_list.extend(access_obj.access.split(","))
                    # print(permission_list)
                    # 如果當前訪問的權限id,不在權限列表匯總,返回無權限
                    if str(permission_obj.id) not in permission_list:
                        if request.method=='POST':
                            res={'status':1,'info':'無權限'}
                            return HttpResponse(json.dumps(res))
                    # if permission_obj.id not in permission_list:
                        return HttpResponse("無權限")
                    else:
                        return None

settings.py文件中添加定義的中間件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'blog.my_middlewares.AuthMiddleware',
]

寫功能,

菜單管理功能

前端引入

<script src="/static/jQuery-1.8.2.min.js"></script>
<script src="/static/layer/layer.js"></script>

前端html

#菜單列表、刪除,編輯
<table class="tablelist">
    <thead>
    <tr>
        {#                    <th><input name="" type="checkbox" value="" checked="checked"/></th>#}
        <th>菜單序號<i class="sort"><img src="/static/back/images/px.gif"/></i></th>
        <th>菜單名稱</th>
        <th>菜單等級</th>
        <th>上級菜單</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for v in menu_list %}
        <tr>
            {#                        <td><input name="" type="checkbox" value=""/></td>#}
            <td>{{ forloop.counter }}</td>
            <td>{{ v.name }}</td>

            <td>
                <h6>一級菜單</h6>
            </td>
            <td>
                <h6>無</h6>
            </td>

            <td>
                <a href="javascript:;" data-id="{{ v.id }}" class="tablelink del_1">刪除</a>&nbsp;&nbsp;
                <a href="/back/article/editor_menu_f/{{ v.id }}/" data-editor="{{ v.super_id }}"
                   class="tablelink editor">編輯</a>

            </td>


        </tr>
    {% endfor %}
    {% for v in menu_list_z %}
        <tr>
            {#                        <td><input name="" type="checkbox" value=""/></td>#}
            <td>{{ forloop.counter }}</td>
            <td>{{ v.name }}</td>

            <td>
                <h6>二級菜單</h6>
            </td>
            <td>
                <h6>{{ v.pid.name }}</h6>
            </td>

            <td>
                <a href="javascript:;" data-id="{{ v.id }}" class="tablelink del_2">刪除</a>&nbsp;&nbsp;
                <a href="/back/article/editor_menu_z/{{ v.id }}/" data-editor="{{ v.super_id }}"
                   class="tablelink editor">編輯</a>

            </td>


        </tr>
    {% endfor %}

    </tbody>
</table>

#新增菜單
<form method="post" onsubmit="return false" id="menu_1">
    {% csrf_token %}
    <table class="tablelist">
        <thead>
        <tr>
            <th>新增一級菜單</th>
        </tr>
        <tr>
            <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入菜單名稱" name="menu_name">
            </th>
        </tr>
        </thead>
    </table>
    <input type="button" value="提交" id="onsubmit" style="width: 100px; height: 30px;">
</form>
<br><br>
<form method="post" onsubmit="return false" id="menu_2">
    {% csrf_token %}
    <table class="tablelist">
        <thead>
        <tr>
            <th>新增二級菜單</th>
        </tr>
        <tr>
            <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入菜單名稱" name="menu_name">
            </th>
            <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入菜單路徑" name="menu_path">
            </th>


            <th>

                <select name="pid">
                    <option value="" style="display: none">選擇所屬一級菜單</option>
                    {% for v in menu_list %}
                        <option value="{{ v.id }}">{{ v.name }}</option>
                    {% endfor %}
                </select>

            </th>


        </tr>
        </thead>
    </table>

    <input type="button" value="提交" id="onsubmit2" style="width: 100px; height: 30px;">
</form>

前端js

<script>
    {#    添加一級菜單#}
    $(document).ready(function () {
        $('#onsubmit').click(function () {
            $.post('/back/article/menu_add/', $('#menu_1').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info'])
                    location.href='/back/article/menu_add/'
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    })
    {#添加二級菜單#}
    $(document).ready(function () {
        $('#onsubmit2').click(function () {
            $.post('/back/article/menu_add1/', $('#menu_2').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info'])
                    location.href='/back/article/menu_add/'
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    });
{#    刪除一級菜單#}
$(document).ready(function () {
        $('.del_1').click(function () {
            _this=this;
            layer.confirm('刪除一級菜單會連帶刪除所屬二級菜單,確定刪除嗎?',{
                btn:['確定','取消']
            },function(){
                id=$(_this).data('id');
                $.post('/back/article/menu_del_f/',{'id':id,'csrfmiddlewaretoken':'{{ csrf_token }}'},function (data) {
                if (data['status']==0){
                    layer.msg(data['info'])
                    location.href='/back/article/menu_add/'
                }else {
                    layer.msg(data['info'])
                }
            },'json')
            },function () {

            })

        })
    })
    {#    刪除二級菜單#}
$(document).ready(function () {
        $('.del_2').click(function () {
            _this=this;
            layer.confirm('確定刪除這個二級菜單嗎?',{
                btn:['確定','取消']
            },function(){
                id=$(_this).data('id');
                $.post('/back/article/menu_del_z/',{'id':id,'csrfmiddlewaretoken':'{{ csrf_token }}'},function (data) {
                if (data['status']==0){
                    layer.msg(data['info'])
                    location.href='/back/article/menu_add/'
                }else {
                    layer.msg(data['info'])
                }
            },'json')
            },function () {

            })

        })
    })
</script>

路由

# 新增一級菜單
re_path('article/menu_add/', article.menu_add, name='article/menu_add/'),
# 新增二級菜單
re_path('article/menu_add1/', article.menu_add1, name='article/menu_add1/'),
# 刪除一級菜單
re_path('article/menu_del_f/', article.menu_del_f, name='article/menu_del_f/'),
# 刪除二級菜單
re_path('article/menu_del_z/', article.menu_del_z, name='article/menu_del_z/'),
# 編輯一級菜單
re_path('article/editor_menu_f/(\d+)/',article.editor_menu_f,name='article/editor_menu_f/'),
# 編輯二級菜單
re_path('article/editor_menu_z/(\d+)/',article.editor_menu_z,name='article/editor_menu_z/'),

方法

from collections import OrderedDict

# 新增一級菜單
def menu_add(request):
    menu_list=Menu.objects.filter(pid__isnull=True)
    menu_list_z=Menu.objects.filter(pid__isnull=False)
    if request.method=='POST':
        res = {'status': None, 'info': None}
        menu_name=request.POST.get('menu_name')
        menu_name_f_obj=Menu.objects.filter(name=menu_name,pid_id__isnull=True)
        if menu_name_f_obj:
            res = {'status': 1, 'info': '菜單名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        if menu_name:
            menu_obj=Menu.objects.create(name=menu_name)
            if menu_obj:
                permission_obj=Permission.objects.create(name=menu_name,menu_id=menu_obj.id)
                res = {'status': 0, 'info': '添加成功'}
            else:
                res = {'status': 1, 'info': '添加失敗'}
            return HttpResponse(json.dumps(res))
        else:
            res = {'status': 2, 'info': '請輸入菜單名稱'}
        return  HttpResponse(json.dumps(res))
    return render(request,'article/menu_add.html',locals())
    
    # 添加二級菜單
def menu_add1(request):
    if request.method=='POST':
        res = {'status': None, 'info': None}
        menu_name=request.POST.get('menu_name')
        menu_path=request.POST.get('menu_path')
        pid=request.POST.get('pid')
        menu_name_z_obj = Menu.objects.filter(name=menu_name,pid_id__isnull=False)
        if menu_name_z_obj:
            res = {'status': 1, 'info': '菜單名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        if not menu_name:
            res = {'status': 1, 'info': '未輸入菜單名稱'}
            return HttpResponse(json.dumps(res))
        if not menu_path:
            res = {'status': 2, 'info': '未輸入菜單路徑'}
            return HttpResponse(json.dumps(res))
        if not pid:
            res = {'status': 3, 'info': '未選擇所屬一級菜單'}
            return HttpResponse(json.dumps(res))
        menu_obj=Menu.objects.create(name=menu_name,path=menu_path,pid_id=pid)
        if menu_obj:
            menu_id=Permission.objects.filter(menu_id=pid).first().id
            permission_obj=Permission.objects.create(name=menu_name,path=menu_path,menu_id=menu_obj.id,pid_id=menu_id)
            res = {'status': 0, 'info': '添加成功'}
        else:
            res = {'status': 1, 'info': '添加失敗'}
        return HttpResponse(json.dumps(res))


# 刪除一級菜單
def menu_del_f(request):
    if request.method=='POST':
        res = {'status': None, 'info': None}
        menu_id=request.POST.get('id')
        if not menu_id:
            res = {'status': 1, 'info': '異常'}
            return HttpResponse(json.dumps(res))
        menu_f=Menu.objects.filter(id=menu_id).delete()
        menu_z=Menu.objects.filter(pid_id=menu_id).delete()
        permission_f=Permission.objects.filter(menu_id=menu_id).values('id').first()
        # print(permission_f['id'])
        if permission_f:
            permission_z=Permission.objects.filter(pid_id=permission_f['id']).delete()
        permission_f = Permission.objects.filter(menu_id=menu_id).delete()
        if menu_f and permission_f:
            res = {'status': 0, 'info': '刪除成功'}
        else:
            res = {'status': 2, 'info': '刪除失敗'}
        return HttpResponse(json.dumps(res))
    return HttpResponse('ok')
    
# 刪除二級菜單
def menu_del_z(request):
    if request.method=='POST':
        res = {'status': None, 'info': None}
        menu_id=request.POST.get('id')
        if not menu_id:
            res = {'status': 1, 'info': '異常'}
            return HttpResponse(json.dumps(res))
        menu_obj=Menu.objects.filter(id=menu_id).delete()
        permission_obj=Permission.objects.filter(menu_id=menu_id).delete()
        if menu_obj and permission_obj:
            res = {'status': 0, 'info': '刪除成功'}
        else:
            res = {'status': 2, 'info': '刪除失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))
    return HttpResponse('ok')
    
# 編輯一級菜單
def editor_menu_f(request,id):
    menu_f_obj=Menu.objects.filter(id=id).first().name
    if request.method=='POST':
        menu_f_name=request.POST.get('menu_f')
        if not menu_f_name:
            res = {'status': 1, 'info': '未輸入菜單名稱'}
            return HttpResponse(json.dumps(res))
        menu_f_name_obj=Menu.objects.filter(name=menu_f_name,pid_id__isnull=True)
        if menu_f_name_obj and menu_f_name != menu_f_obj:
            res = {'status': 1, 'info': '菜單名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        menu_obj=Menu.objects.filter(id=id).update(name=menu_f_name)
        permission_obj=Permission.objects.filter(menu_id=id).update(name=menu_f_name)
        if menu_obj and permission_obj:
            res = {'status': 0, 'info': '修改成功'}
        else:
            res = {'status': 1, 'info': '修改失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))

    return render(request,'article/editor_menu_f.html',locals())

# 編輯二級菜單
def editor_menu_z(request,id):
    menu_obj=Menu.objects.filter(id=id).first()
    menu_list=Menu.objects.filter(pid_id__isnull=True)
    if request.method == 'POST':
        res = {'status': None, 'info': None}
        menu_name = request.POST.get('menu_name')
        menu_path = request.POST.get('menu_path')
        pid = request.POST.get('pid')
        menu_name_z_obj = Menu.objects.filter(name=menu_name, pid_id__isnull=False)
        if menu_name_z_obj and menu_name !=menu_obj.name:
            res = {'status': 1, 'info': '菜單名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        if not menu_name:
            res = {'status': 1, 'info': '未輸入菜單名稱'}
            return HttpResponse(json.dumps(res))
        if not menu_path:
            res = {'status': 2, 'info': '未輸入菜單路徑'}
            return HttpResponse(json.dumps(res))
        if not pid:
            res = {'status': 3, 'info': '未選擇所屬一級菜單'}
            return HttpResponse(json.dumps(res))
        menu_obj = Menu.objects.filter(id=id).update(name=menu_name, path=menu_path, pid_id=pid)
        if menu_obj:
            menu_id = Permission.objects.filter(menu_id=pid).first().id
            permission_obj = Permission.objects.filter(menu_id=id).update(name=menu_name, path=menu_path,
                                                       pid_id=menu_id)
            res = {'status': 0, 'info': '修改成功'}
        else:
            res = {'status': 1, 'info': '修改失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))


    return render(request,'article/editor_menu_z.html',locals())

#角色管理功能

前端引入

<script src="/static/jQuery-1.8.2.min.js"></script>
<script src="/static/layer/layer.js"></script>

前端頁面

<div id="tab2" class="tabson">
    <table class="tablelist">
        <thead>
        <tr>
            {#                    <th><input name="" type="checkbox" value="" checked="checked"/></th>#}
            <th>角色序號<i class="sort"><img src="/static/back/images/px.gif"/></i></th>
            <th>角色名稱</th>
            {#                    <th>角色權限</th>#}
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for v in role_obj %}
            <tr>
                {#                        <td><input name="" type="checkbox" value=""/></td>#}
                <td>{{ forloop.counter }}</td>
                <td>{{ v.name }}</td>
                {% if v.id == 4 %}
                    <td>
                        <h6>不能對超級管理員進行操作</h6>
                    </td>
                {% else %}
                    <td>
                        <a href="javascript:;" data-id="{{ v.id }}" class="tablelink del">刪除</a>&nbsp;&nbsp;
                        <a href="/back/article/editor_role/{{ v.id }}/" data-editor="{{ v.super_id }}"
                           class="tablelink editor">編輯</a>
                        {#                            <a href="/back/article/role_add1/{{ v.id }}">&nbsp;&nbsp;&nbsp;>>設置權限</a>#}
                    </td>
                {% endif %}

            </tr>
        {% endfor %}


        </tbody>
    </table>

    {#######################################################################}


    <br><br>


</div>

<th><a href="/back/article/role_add1/">>>新增角色 </a></th>

新增角色的html

<script src="/static/jQuery-1.8.2.min.js"></script>
<script src="/static/layer/layer.js"></script>

<form method="post" onsubmit="return false">
    {% csrf_token %}

    <table class="tablelist">
        <thead>
        <tr>
            <th>角色名稱: &nbsp;&nbsp;<input type="text" name="role_name" placeholder="輸入角色名稱"></th>
        </tr>
        <tr>
            <th>
                選擇所有權限: <br>
                {% for k,v in permission_all.items %}

                    &nbsp;&nbsp;&nbsp;
                    <input class="checkall" type="checkbox" name="check[]" id="{{ v.id }}" value="{{ v.id }}"
                            {% if  v.id|safe in permission_current %} checked="true'"  {% endif %}>
                    <label for="{{ v.id }}">{{ v.name }}</label>
                    <div>{% for v2 in v.children %}<input class="check" type="checkbox" id="{{ v2.id }}" value="{{ v2.id }}" name="check[]"  {% if  v2.id|safe in permission_current  %} checked="true'"  {% endif %}><label for="{{ v2.id }}">{{ v2.name }}</label>&nbsp; &nbsp; &nbsp; {% endfor %}</div>
                {% endfor %}
            </th>

        </tr>
        </thead>
    </table>

    <input type="button" value="提交" id="onsubmit" style="width: 100px; height: 30px;">
    <br><br>


</form>


#js
<script>
    {#    新建角色#}
    $(document).ready(function () {
        $('#onsubmit').click(function () {
            _this = this;
            id = $(_this).data('id');
            console.log(id);
            $.post('/back/article/role_add1/', $('form').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info']);
                    location.href='/back/article/role_add/'
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    });
{#局部全選全不選#}
$(document).on('click','.checkall',function () {
        $(this).next().next().children().prop('checked',$(this).prop('checked'))
    });
    $(document).on('click','.check',function () {
        $(this).parent().prev().prev().prop('checked',!$('%s:not(:checked)'%$(this).siblings()).length)
    });
</script>

前端js

<script>
    {#    增加職位#}
    $(document).ready(function () {
        $('#onsubmit').click(function () {
            $.post('/back/article/role_add/', $('#role_1').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info']);
                    location.href = '/back/article/role_add/'
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    });


    {#        刪除管理員#}
    $('.del').click(function () {
        _this = this;
        layer.confirm('刪除后不可恢復,確定刪除嗎?', {
            btn: ['確定', '取消']
        }, function () {
            id = $(_this).data('id');
            $.post('/back/article/role_del/', {'id': id, 'csrfmiddlewaretoken': '{{ csrf_token }}'}, function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info']);
                    $(_this).parent().parent().remove()
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        }, function () {

        });

    });
</script>

路由

# 角色列表
re_path('article/role_add/', article.role_add, name='article/role_add/'),
# 新增角色
re_path('article/role_add1/', article.role_add1, name='article/role_add1/'),
# 刪除角色
re_path('article/role_del/', article.role_del, name='article/role_del/'),
# 編輯角色
re_path('article/editor_role/(\d+)/',article.editor_role,name='article/editor_role/'),

方法

# 角色列表
def role_add(request):
    permission_obj=Permission.objects.filter(pid__isnull=False)
    role_obj=Role.objects.all()
    permission_list=[]
    permission_obj_new=Permission.objects.filter(pid__isnull=True)
    # for i in permission_obj_new:
    #     permission_list.append(i.id)
    # print(permission_list)
    # print(permission_obj_new)
    if request.method=='POST':
        res = {'status': None, 'info': None}
        role=request.POST.get('role')
        if not role:
            res = {'status': 1, 'info': '未輸入職位名稱'}
            return HttpResponse(json.dumps(res))
        role_new=Role.objects.create(name=role)
        if role_new:
            res = {'status': 0, 'info': '添加成功'}
        else:
            res = {'status': 2, 'info': '添加失敗'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/role_add.html',locals())
    
    
# 新增角色
def role_add1(request):
    # permission_current1 = Role.objects.filter(id=id).first()
    # if permission_current1.access:
    #     permission_current = permission_current1.access.split(",")
        # print(permission_current)
    permission_all = OrderedDict()
    permission = Permission.objects.filter(pid__isnull=True).all()
    for v in permission:
        permission2 = Permission.objects.filter(pid=v.id).all()
        permission_all[v.id] = {
            'id': v.id,
            'name': v.name,
            'path': v.path,
            'children': permission2
        }
    # role_obj=Role.objects.filter(id=id).first()
    # permission_obj = Permission.objects.filter(pid__isnull=False)
    if request.method=='POST':
        name=request.POST.get('role_name')
        if not name:
            res = {'status': 1, 'info': '未輸入角色名稱'}
            return HttpResponse(json.dumps(res))
        role_name_obj=Role.objects.filter(name=name)
        if role_name_obj:
            res = {'status': 1, 'info': '角色名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        check=request.POST.getlist('check[]')
        chk=','.join(check)
        role_obj = Role.objects.create(name=name,access=chk)
        # new_role_obj=Role.objects.filter(id=id).update(access=chk)
        if role_obj:
            res = {'status': 0, 'info': '添加成功'}
        else:
            res = {'status': 1, 'info': '添加失敗'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/role_add1.html',locals())
    
    
# 刪除角色
def role_del(request):
    if request.method=='POST':
        res = {'status': None, 'info': None}
        role_id=request.POST.get('id')
        if not role_id:
            res = {'status': 1, 'info': '未選擇要刪除的角色'}
            return HttpResponse(json.dumps(res))
        role_del=Role.objects.filter(id=role_id).delete()
        if role_del:
            res = {'status': 0, 'info': '刪除成功'}
        else:
            res = {'status': 2, 'info': '刪除失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))
    return HttpResponse('ok')
    
    
# 編輯角色
def editor_role(request,id):
    role_obj=Role.objects.filter(id=id).first()
    permission_current1 = Role.objects.filter(id=id).first()
    if permission_current1.access:
        permission_current = permission_current1.access.split(",")
        # print(permission_current)
    permission_all = OrderedDict()
    permission = Permission.objects.filter(pid__isnull=True).all()
    for v in permission:
        permission2 = Permission.objects.filter(pid=v.id).all()
        permission_all[v.id] = {
            'id': v.id,
            'name': v.name,
            'path': v.path,
            'children': permission2
        }
    if request.method=='POST':
        check = request.POST.getlist('check[]')
        # print(check)
        chk = ','.join(check)
        new_role_obj = Role.objects.filter(id=id).update(access=chk)
        role_name=request.POST.get('role_name')
        if not role_name:
            res = {'status': 1, 'info': '未輸入角色名稱'}
            return HttpResponse(json.dumps(res))
        role_name_old_obj=Role.objects.filter(name=role_name)
        if role_name_old_obj and role_name != role_obj.name:
            res = {'status': 1, 'info': '角色名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        role_name_obj=Role.objects.filter(id=id).update(name=role_name)
        if role_name_obj and new_role_obj:
            res = {'status': 0, 'info': '修改成功'}
        else:
            res = {'status': 1, 'info': '修改失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/editor_role.html',locals())

#非菜單權限功能

前端頁面

<table class="tablelist">
 <form method="post" onsubmit="return false">
{% csrf_token %}
    <thead>
     <tr>
        <th>權限序號</th>
        <th>權限名稱</th>
        <th>操作</th>
    </tr>
    </thead>
 <thead>
     {% for v in permission_obj %}
    <tr>

        <th>{{ forloop.counter }}</th>
        <th>{{ v.name }}</th>

        <th>
            <a href="javascript:;" data-id="{{ v.id }}" class="tablelink del">刪除</a>
            <a href="/back/article/editor_permission_it/{{ v.id }}" data-editor="{{ v.id }}" class="tablelink editor">編輯</a>

        </th>

    </tr>
    {% endfor %}
    </thead>
  </form>
</table>


<form method="post" onsubmit="return false" id="menu_2">
    {% csrf_token %}
    <table class="tablelist">
        <thead>
        <tr>
            <th colspan="2">新增權限</th>
        </tr>
        <tr>
            <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入權限名稱" name="permission_name">
            </th>
            <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入權限路徑" name="permission_path">
            </th>



        </tr>
        </thead>
    </table>

    <input type="button" value="提交" id="onsubmit2" style="width: 100px; height: 30px;">
</form>

前端js

<script>
    {#        刪除其他權限#}
        $('.del').click(function () {
            _this=this
            layer.confirm('刪除后不可恢復,確定刪除嗎?',{
                btn:['確定','取消']
            },function(){
                id=$(_this).data('id');
                $.post('/back/article/permission_it_del/',{'id':id,'csrfmiddlewaretoken':'{{ csrf_token }}'},function (data) {
                    if (data['status']==0){
                        layer.msg(data['info']);
                        $(_this).parent().parent().remove()
                    }else{
                        layer.msg(data['info'])
                    }
                },'json')
            },function () {

            });

        });

        {#添加權限#}
    $(document).ready(function () {
        $('#onsubmit2').click(function () {
            $.post('/back/article/permission_list/', $('#menu_2').serialize(), function (data) {
                if (data['status'] == 0) {
                    layer.msg(data['info']);
                    location.href='/back/article/permission_list/'
                } else {
                    layer.msg(data['info'])
                }
            }, 'json')
        })
    });
</script>

路由

# 其他權限
re_path('article/permission_list/',article.permission_list,name='article/permission_list/'),
# 刪除其他權限
re_path('article/permission_it_del/',article.permission_it_del,name='article/permission_it_del/'),
# 編輯非菜單權限
re_path('article/editor_permission_it/(\d+)/',article.editor_permission_it,name='article/editor_permission_it/'),

方法

# 其他權限
def permission_list(request):
    permission_obj=Permission.objects.filter(menu_id__isnull=True,pid_id__isnull=True)
    if request.method=='POST':
        permission_name=request.POST.get('permission_name')
        permission_path=request.POST.get('permission_path')
        print(permission_name,permission_path)
        if not permission_name:
            res = {'status': 1, 'info': '未輸入權限名稱'}
            return HttpResponse(json.dumps(res))
        if not permission_path:
            res = {'status': 2, 'info': '未輸入權限路徑'}
            return HttpResponse(json.dumps(res))
        permission_name_obj=Permission.objects.filter(name=permission_name,menu_id__isnull=True,pid_id__isnull=True)
        if permission_name_obj:
            res = {'status': 2, 'info': '權限名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        permission_new_obj=Permission.objects.create(name=permission_name,path=permission_path)
        if permission_new_obj:
            res = {'status': 0, 'info': '添加成功'}
        else:
            res = {'status': 1, 'info': '添加失敗'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/permisson_list.html',locals())
    
# 刪除其他權限
def permission_it_del(request):
    if request.method=='POST':
        id=request.POST.get('id')
        permission_del_obj=Permission.objects.filter(id=id).delete()
        if permission_del_obj:
            res = {'status': 0, 'info': '刪除成功'}
        else:
            res = {'status': 0, 'info': '刪除失敗'}
        return HttpResponse(json.dumps(res))
    return HttpResponse('ok')

        
# 編輯其他權限
def editor_permission_it(request,id):
    permission_obj=Permission.objects.filter(id=id).first()
    if request.method=='POST':
        permission_name=request.POST.get('permission_name')
        permission_path=request.POST.get('permission_path')
        if not permission_name:
            res = {'status': 1, 'info': '未輸入權限名稱'}
            return HttpResponse(json.dumps(res))
        if not permission_path:
            res = {'status': 2, 'info': '未輸入權限路徑'}
            return HttpResponse(json.dumps(res))
        permission_name_obj=Permission.objects.filter(name=permission_name)
        if permission_name_obj and permission_name != permission_obj.name:
            res = {'status': 1, 'info': '權限名稱已存在,請重新編輯'}
            return HttpResponse(json.dumps(res))
        permission_new_obj=Permission.objects.filter(id=id).update(name=permission_name,path=permission_path)
        if permission_new_obj:
            res = {'status': 0, 'info': '修改成功'}
        else:
            res = {'status': 1, 'info': '修改失敗,請聯系技術人員'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/editor_permission_it.html',locals())

#管理員列表功能

前端html

<div id="tab2" class="tabson">

            <table class="tablelist">
                <thead>
                <tr>
{#                    <th><input name="" type="checkbox" value="" checked="checked"/></th>#}
                    <th>管理員序號<i class="sort"><img src="/static/back/images/px.gif"/></i></th>
                    <th>管理員名稱</th>
                    <th>管理員權限</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for v in super_obj %}
                    <tr>
{#                        <td><input name="" type="checkbox" value=""/></td>#}
                        <td>{{ forloop.counter }}</td>
                        <td>{{ v.super_name }}</td>
                        <td>{% for v2 in v.role.all %}
                            {{ v2.name }} &nbsp;&nbsp;
                            {% endfor %}
                        </td>

                    {% if v.role.first.id == 4 %}
                        <td>
                            <h6>不能對超級管理員進行操作</h6>
                        </td>
                        {% else %}
                        <td>
                            <a href="javascript:;" data-id="{{ v.super_id }}" class="tablelink del">刪除</a>
                            <a href="/back/article/editor_back/{{ v.super_id }}" data-editor="{{ v.super_id }}" class="tablelink editor">編輯</a>
                            <a href="/back/article/permission_add1/{{ v.super_id }}">&nbsp;&nbsp;&nbsp;>>分配權限</a>
                        </td>
                    {% endif %}

                    </tr>
                {% endfor %}
                


                </tbody>
            </table>
        <div style="float: right;">
            <nav aria-label="Page navigation">
                    <ul class="pagination">
                        {% if article_obj.has_previous %}
                            <li class="previous"><a
                                    href="/back/article/super_list/?page={{ article_obj.previous_page_number }}">上一頁</a>
                            </li>
                        {% else %}
                            <li class="previous disabled"><a href="#">上一頁</a></li>
                        {% endif %}





                        {% for num in pageRange %}
                            <li {% if num == currentPage %}class=" active"{% endif %}><a
                                    href="?page={{ num }}">{{ num }}</a></li>
                        {% endfor %}





                        {% if article_obj.has_next %}
                            <li class="next"><a
                                    href="/back/article/super_list/?page={{ article_obj.next_page_number }}">下一頁</a>
                            </li>
                        {% else %}
                            <li class="next disabled"><a href="#">下一頁</a></li>
                        {% endif %}

                    </ul>
                </nav>
        </div>

前端js

<script>
{#        刪除管理員#}
        $('.del').click(function () {
            _this=this
            layer.confirm('刪除后不可恢復,確定刪除嗎?',{
                btn:['確定','取消']
            },function(){
                id=$(_this).data('id');
                $.post('/back/article/super_delete/',{'id':id,'csrfmiddlewaretoken':'{{ csrf_token }}'},function (data) {
                    if (data['status']==0){
                        layer.msg(data['info']);
                        $(_this).parent().parent().remove()
                    }else{
                        layer.msg(data['info'])
                    }
                },'json')
            },function () {

            });

        });


    </script>

路由

# 給管理員重新分配角色(權限)
re_path('article/permission_add1/(\d+)/', article.permission_add1,name='article/permission_add1/'),
# 編輯管理員信息
re_path('article/editor_back/(\d+)/', article.editor_back,name='article/editor_back/'),
# 刪除管理員
re_path('article/super_delete/', article.super_delete,name='article/super_delete/'),

方法

# 刪除管理員
def super_delete(request):
    super_name=request.session.get('super_name')
    res={'status':None,'info':None}
    id=request.POST.get('id')

    super_del=Superuser.objects.filter(super_id=id).delete()
    if super_del:
        res['status']=0
        res['info']='刪除成功'
    else:
        res['status'] = 1
        res['info'] = '刪除失敗'
    return HttpResponse(json.dumps(res))
    
    
# 修改管理員信息
def editor_back(request,id):
    super_name = request.session.get('super_name')
    res = {'status': None, 'info': None}
    super_obj=Superuser.objects.filter(super_id=id).first()
    if request.method=='POST':

        super_name = Superuser.objects.filter(super_id=id).first().super_name
        new_super_name = request.POST.get('super_name')
        new_super_pwd = request.POST.get('super_pwd')
        if not new_super_name:
            res = {'status': 4, 'info': '未填寫帳號'}
            return HttpResponse(json.dumps(res))
        if not new_super_pwd:
            res = {'status': 5, 'info': '未填寫密碼'}
            return HttpResponse(json.dumps(res))
        old_super_name = Superuser.objects.filter(super_name=new_super_name)
        if old_super_name and new_super_name != super_name:
            res = {'status': 1, 'info': '帳號已存在'}
        else:
            super_obj = Superuser.objects.filter(super_id=id).update(super_name=new_super_name,
                                                                     super_pwd=make_password(new_super_pwd))
            if super_obj:
                res = {'status': 0, 'info': '修改成功'}
            else:
                res = {'status': 2, 'info': '修改失敗'}
            return HttpResponse(json.dumps(res))
        return HttpResponse(json.dumps(res))

        # return HttpResponse(json.dumps(res),locals())
    return render(request,'article/editor_back.html',locals())
    
    
# 分配權限
def permission_add1(request,id):
    print(id)
    super_obj=Superuser.objects.filter(super_id=id).first()
    role_obj=Role.objects.all()
    role_obj_new=Superuser.objects.filter(super_id=id).first().role.all().values('id')
    role_list=[]
    for i in role_obj_new:
        print(i['id'])
        role_list.append(str(i['id']))
    print(role_list)
    if request.method=='POST':
        res = {'status': None, 'info': None}
        check=request.POST.getlist('check[]')
        super_obj.role.clear()
        for i in check:
            super_obj.role.add(i)

        res = {'status': 0, 'info': '成功'}
        return HttpResponse(json.dumps(res))
    return render(request,'article/permission_add1.html',locals())

#添加管理員功能

前端html

<form method="post" onsubmit="return false">
        {% csrf_token %}
        <table class="tablelist">
            <thead>
            <tr>
            <th>超級管理員名稱<i class="sort"><img src="/static/back/images/px.gif" /></i></th>
            <th>密碼</th>
            <th>設置權限</th>
            <th>操作</th>
            </tr>
            <tr>
                <th style="border: 1px #9C9C9C solid;"><input type="text" placeholder="輸入管理員名稱" name="super_name"></th>
                <th style="border: 1px #9C9C9C solid;"><input type="password" placeholder="輸入密碼" name="super_pwd"></th>
                <th style="border: 1px #9C9C9C solid;">{% for v in role_obj %}

                                &nbsp;&nbsp;&nbsp; {% if v.id == 4 %}
                                    <input type="checkbox" name="check[]" id="{{ v.id }}" value="{{ v.id }}"
                                            {% if  v.id|safe in role_list %} checked="true'"  {% endif %} onclick="layer.msg('普通用戶不可設為超級管理員'); return false">
                                    <label for="{{ v.id }}">{{ v.name }}</label>
                                {% else %}
                                <input type="checkbox" name="check[]" id="{{ v.id }}" value="{{ v.id }}"
                                        {% if  v.id|safe in role_list %} checked="true'"  {% endif %}>
                                <label for="{{ v.id }}">{{ v.name }}</label>
{#                                <div>{% for v2 in v.children %}<input type="checkbox" id="{{ v2.id }}" value="{{ v2.id }}" name="check[]"  {% if  v2.id|safe in permission_current  %} checked="true'"  {% endif %}><label for="{{ v2.id }}">{{ v2 }}</label>&nbsp; &nbsp; &nbsp; {% endfor %}</div>#}
                {% endif %}
                {% endfor %}</th>

                <th style="border: 1px #9C9C9C solid;"><input type="button" value="提交" id="onsubmit"></th>
            </tr>
            </thead>



        </table>
    </form>

前端js

<script>
        $(document).ready(function () {
            $('#onsubmit').click(function () {
                $.post('/back/article/super_add/',$('form').serialize(),function (data) {
                    if (data['status']==0){
                        layer.msg(data['info']);
                        location.href='/back/article/super_list/'
                    } else {
                        layer.msg(data['info'])
                    }
                },'json')
            })
        })
    </script>

路由

# 添加管理員功能
re_path('article/super_add/', article.super_add, name='article/super_add/'),

方法

# 新增管理員
def super_add(request):
    role_obj = Role.objects.all()
    if request.method == 'POST':
        res={"status":None,'info':None}
        super_name=request.POST.get('super_name')
        super_back_pwd=request.POST.get('super_pwd')
        super_pwd=make_password(request.POST.get('super_pwd'))

        if super_name and super_back_pwd:
            super_old_obj=Superuser.objects.filter(super_name=super_name)
            if super_old_obj:
                res['status'] = 3
                res['info'] = '管理員名稱已存在'
                return HttpResponse(json.dumps(res))
            super_obj = Superuser.objects.create(super_name=super_name, super_pwd=super_pwd)
            if super_obj:
                check = request.POST.getlist('check[]')
                super_obj.role.clear()
                for i in check:
                    super_obj.role.add(i)
                res['status'] = 0
                res['info'] = '增加成功'
            else:
                res['status'] = 1
                res['info'] = '添加失敗'
            return HttpResponse(json.dumps(res))
        else:
            res['status'] = 2
            res['info'] = '請填寫完整信息'
        return HttpResponse(json.dumps(res))
    return render(request,'article/super_add.html',locals())

頁面的一些效果

給其中的管理員設置權限后,登錄結果

done。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM