国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django+vue3權(quán)限菜單rabc設(shè)計(jì)和動(dòng)態(tài)路由

這篇具有很好參考價(jià)值的文章主要介紹了Django+vue3權(quán)限菜單rabc設(shè)計(jì)和動(dòng)態(tài)路由。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本次是基于Django和vue實(shí)現(xiàn)

github源碼:nineaiyu/xadmin-server: xadmin-基于Django+vue3的rbac權(quán)限管理系統(tǒng) (github.com)

Django+vue3權(quán)限菜單rabc設(shè)計(jì)和動(dòng)態(tài)路由,Xadmin,技能,Django,django,python,后端,vue,RBAC,權(quán)限控制

服務(wù)器設(shè)計(jì)及部分代碼?

權(quán)限控制的話,可以基于Django的permission進(jìn)行控制,并通過訪問api的URL操作

核心代碼如下

import re

from django.conf import settings
from rest_framework.exceptions import PermissionDenied, NotAuthenticated
from rest_framework.permissions import BasePermission

from system.models import Menu


def get_user_permission(user_obj):
    menu = []
    if user_obj.roles:
        menu_obj = Menu.objects.filter(userrole__in=user_obj.roles.all()).distinct()
        menu = menu_obj.filter(is_active=True, menu_type=2).values('path', 'component').all().distinct()
    return menu


class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """

    def has_permission(self, request, view):
        auth = bool(request.user and request.user.is_authenticated)
        if auth:
            if request.user.is_superuser:
                return True
            url = request.path_info
            for w_url in settings.PERMISSION_WHITE_URL:
                if re.match(w_url, url):
                    return True
            permission_data = get_user_permission(request.user)
            for p_data in permission_data:
                if p_data.get('component') == request.method and re.match(f"/{p_data.get('path')}", url):
                    return True
            raise PermissionDenied('權(quán)限不足')
        else:
            raise NotAuthenticated('未授權(quán)認(rèn)證')

因此,需要對menu表進(jìn)行設(shè)計(jì),由于涉及到了前端vue路由,因此,menu模型字段比較多,如下

class DbBaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="添加時(shí)間")
    updated_time = models.DateTimeField(auto_now=True, verbose_name="更新時(shí)間")
    description = models.CharField(max_length=128, verbose_name="描述信息", null=True, blank=True)

    class Meta:
        abstract = True


class MenuMeta(DbBaseModel):
    title = models.CharField(verbose_name="菜單名稱", max_length=256, null=True, blank=True)
    icon = models.CharField(verbose_name="菜單圖標(biāo)", max_length=256, null=True, blank=True)
    r_svg_name = models.CharField(verbose_name="菜單右側(cè)額外圖標(biāo)iconfont名稱,目前只支持iconfont", max_length=256,
                                  null=True, blank=True)
    is_show_menu = models.BooleanField(verbose_name="是否顯示該菜單", default=True)
    is_show_parent = models.BooleanField(verbose_name="是否顯示父級菜單", default=False)
    is_keepalive = models.BooleanField(verbose_name="是否開啟頁面緩存", default=False,
                                       help_text='開啟后,會(huì)保存該頁面的整體狀態(tài),刷新后會(huì)清空狀態(tài)')
    frame_url = models.CharField(verbose_name="內(nèi)嵌的iframe鏈接地址", max_length=256, null=True, blank=True)
    frame_loading = models.BooleanField(verbose_name="內(nèi)嵌的iframe頁面是否開啟首次加載動(dòng)畫", default=False)

    transition_enter = models.CharField(verbose_name="當(dāng)前頁面進(jìn)場動(dòng)畫", max_length=256, null=True, blank=True)
    transition_leave = models.CharField(verbose_name="當(dāng)前頁面離場動(dòng)畫", max_length=256, null=True, blank=True)

    is_hidden_tag = models.BooleanField(verbose_name="當(dāng)前菜單名稱或自定義信息禁止添加到標(biāo)簽頁", default=False)
    dynamic_level = models.IntegerField(verbose_name="顯示標(biāo)簽頁最大數(shù)量", default=1)

    class Meta:
        verbose_name = "菜單元數(shù)據(jù)"
        verbose_name_plural = "菜單元數(shù)據(jù)"
        ordering = ("-created_time",)

    def __str__(self):
        return f"{self.title}-{self.description}"


class Menu(DbBaseModel):
    parent = models.ForeignKey(to='Menu', on_delete=models.SET_NULL, verbose_name="父節(jié)點(diǎn)", null=True, blank=True)

    menu_type_choices = ((0, '目錄'), (1, '菜單'), (2, '權(quán)限'))
    menu_type = models.SmallIntegerField(choices=menu_type_choices, default=0, verbose_name="節(jié)點(diǎn)類型")

    name = models.CharField(verbose_name="組件英文名稱", max_length=128, unique=True)
    rank = models.IntegerField(verbose_name="菜單順序", default=9999)
    path = models.CharField(verbose_name="路由地址", max_length=256)
    component = models.CharField(verbose_name="組件地址", max_length=256, null=True, blank=True)
    is_active = models.BooleanField(verbose_name="是否啟用該菜單", default=True)
    meta = models.OneToOneField(to=MenuMeta, on_delete=models.CASCADE, verbose_name="菜單元數(shù)據(jù)")
    method_choices = (('GET', 'get'), ('POST', 'post'), ('PUT', 'put'), ('DELETE', 'delete'))

    def delete(self, using=None, keep_parents=False):
        if self.meta:
            self.meta.delete(using, keep_parents)
        super().delete(using, keep_parents)

    class Meta:
        verbose_name = "菜單信息"
        verbose_name_plural = "菜單信息"
        ordering = ("-created_time",)

    def __str__(self):
        return f"{self.name}-{self.menu_type}-{self.meta.title}"

最重要的menu表已經(jīng)設(shè)計(jì)完成,那么接下來就更簡單了,還需要一個(gè)獲取所有路由的方法,當(dāng)添加權(quán)限的時(shí)候,可以方便的選擇相應(yīng)的路由權(quán)限

import re
from collections import OrderedDict

from django.conf import settings
from django.urls import URLPattern, URLResolver
from django.utils.module_loading import import_string


def check_show_url(url):
    for prefix in settings.PERMISSION_SHOW_PREFIX:
        if re.match(prefix, url):
            return True


def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
    """遞歸去獲取URL
    :param pre_namespace: namespace前綴,以后用戶拼接name
    :param pre_url: url前綴,以后用于拼接url
    :param urlpatterns: 路由關(guān)系列表
    :param url_ordered_dict: 用于保存遞歸中獲取的所有路由
    """
    for item in urlpatterns:
        if isinstance(item, URLPattern):
            if not item.name:
                continue

            if pre_namespace:
                name = "%s:%s" % (pre_namespace, item.name)
            else:
                name = item.name
            if not item.name:
                raise Exception('URL路由中必須設(shè)置name屬性')
            url = pre_url + item.pattern.regex.pattern.lstrip('^')
            # url = url.replace('^', '').replace('$', '')

            if check_show_url(url):
                url_ordered_dict[name] = {'name': name, 'url': url}

        elif isinstance(item, URLResolver):  # 路由分發(fā),遞歸操作
            if pre_namespace:
                if item.namespace:
                    namespace = "%s:%s" % (pre_namespace, item.namespace)
                else:
                    namespace = item.namespace
            else:
                if item.namespace:
                    namespace = item.namespace
                else:
                    namespace = None
            recursion_urls(namespace, pre_url + item.pattern.regex.pattern.lstrip('^'), item.url_patterns,
                           url_ordered_dict)


def get_all_url_dict(pre_url='/'):
    """
       獲取項(xiàng)目中所有的URL(必須有name別名)
    """
    url_ordered_dict = OrderedDict()
    md = import_string(settings.ROOT_URLCONF)
    url_ordered_dict['#'] = {'name': '#', 'url': '#'}
    recursion_urls(None, pre_url, md.urlpatterns, url_ordered_dict)  # 遞歸去獲取所有的路由
    return url_ordered_dict.values()

前端設(shè)計(jì)

前端代碼已經(jīng)開源,GitHub如下:?nineaiyu/xadmin-client: xadmin-基于Django+vue3的rbac權(quán)限管理系統(tǒng) (github.com)???????q

前端是基于pure-admin二次開發(fā)的, 省去了前端開發(fā),直接上手。

Django+vue3權(quán)限菜單rabc設(shè)計(jì)和動(dòng)態(tài)路由,Xadmin,技能,Django,django,python,后端,vue,RBAC,權(quán)限控制

?文章來源地址http://www.zghlxwxcb.cn/news/detail-527253.html

到了這里,關(guān)于Django+vue3權(quán)限菜單rabc設(shè)計(jì)和動(dòng)態(tài)路由的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3-實(shí)戰(zhàn)-12-管理后臺-權(quán)限管理之菜單管理模塊-首頁-主題顏色-暗黑模式

    vue3-實(shí)戰(zhàn)-12-管理后臺-權(quán)限管理之菜單管理模塊-首頁-主題顏色-暗黑模式

    目錄 1-列表頁面功能開發(fā) 1.1-需求原型分析 1.2-接口和數(shù)據(jù)類型定義 1.3-獲取服務(wù)端數(shù)據(jù)渲染頁面 2-新增編輯菜單 2.1-原型需求分析 2.2-表單數(shù)據(jù)收集和頁面結(jié)構(gòu)開發(fā) 2.3-提交或者取消 3-刪除菜單 4-首頁開發(fā) 5-暗黑模式的切換和主題顏色 5.1-暗黑模式 5.2-主題顏色切換 ? ? ? 我們

    2024年02月10日
    瀏覽(17)
  • Vue-根據(jù)角色獲取菜單動(dòng)態(tài)添加路由

    Vue-根據(jù)角色獲取菜單動(dòng)態(tài)添加路由

    如果大家寫過后臺管理系統(tǒng)的項(xiàng)目,那么動(dòng)態(tài)路由一定是繞不開的,如果想偷懶的話,就把所有路由一開始都配置好,然后只根據(jù)后端返回的菜單列表渲染就好菜單就好了,但是這樣的隱患就是我在地址欄輸入的地址的時(shí)候,也會(huì)進(jìn)入這個(gè)頁面,不偷懶的方法就是本文要介紹

    2024年01月24日
    瀏覽(22)
  • vue3 element-plus動(dòng)態(tài)菜單及動(dòng)態(tài)圖標(biāo)

    引入element-plus 注冊圖標(biāo)組件 動(dòng)態(tài)引入圖標(biāo)代碼 完整代碼 路由如下

    2024年01月18日
    瀏覽(50)
  • 前端之vue 根據(jù)菜單自動(dòng)生成路由(動(dòng)態(tài)配置前端路由)

    前端之vue 根據(jù)菜單自動(dòng)生成路由(動(dòng)態(tài)配置前端路由)

    在需要權(quán)限控制的頁面,往往存在根據(jù)用戶來顯示菜單的情況,單獨(dú)根據(jù)用戶類型判斷顯然不是很好,如果后面用戶類型發(fā)生變化,項(xiàng)目修改維護(hù)可能就會(huì)比較麻煩,所以比較好的做法是根據(jù)后端返回的菜單動(dòng)態(tài)生成頁面路由,以達(dá)到完全權(quán)限控制的目的,并且若權(quán)限發(fā)生變

    2024年04月10日
    瀏覽(27)
  • vue3使用Elementplus 動(dòng)態(tài)顯示菜單icon不生效

    vue3使用Elementplus 動(dòng)態(tài)顯示菜單icon不生效

    菜單icon由后端提供,直接用的字符串返回,前端使用遍歷顯示,發(fā)現(xiàn)icon不會(huì)顯示 后端提供的是字符串,那么在component :is=\\\"menu.icon\\\"/處讀取到的也是字符串,而component組件中要求是一個(gè)能渲染的組件,類似如下結(jié)構(gòu): 想當(dāng)然的,如果后端直接返回組件形式是不是就可以了。

    2024年02月11日
    瀏覽(19)
  • (二) Vue3 + Element-Plus 實(shí)現(xiàn)動(dòng)態(tài)菜單欄

    (二) Vue3 + Element-Plus 實(shí)現(xiàn)動(dòng)態(tài)菜單欄

    系列介紹:Vue3 + Vite + TS 從零開始學(xué)習(xí) 項(xiàng)目搭建:(一) Vue3 + Vite + TS 項(xiàng)目搭建 實(shí)現(xiàn)動(dòng)態(tài)菜單欄:(二) Vue3 + Element-Plus 實(shí)現(xiàn)動(dòng)態(tài)菜單欄 實(shí)現(xiàn)動(dòng)態(tài)面包屑:(三) Vue3 + Element-Plus 實(shí)現(xiàn)動(dòng)態(tài)面包屑 實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁:(四) Vue3 + Element-Plus 實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁 實(shí)現(xiàn)動(dòng)態(tài)主題色切換(demo):(五)

    2023年04月23日
    瀏覽(59)
  • vue2+antd——實(shí)現(xiàn)動(dòng)態(tài)菜單路由功能——基礎(chǔ)積累

    vue2+antd——實(shí)現(xiàn)動(dòng)態(tài)菜單路由功能——基礎(chǔ)積累

    最近在寫后臺管理系統(tǒng),遇到一個(gè)需求就是要將之前的靜態(tài)路由改為動(dòng)態(tài)路由,使用的后臺框架是: vue-antd-admin 然后通過 loadRoutes 方法來實(shí)現(xiàn)異步動(dòng)態(tài)路由。 如上圖所示,需要在登錄接口調(diào)用成功后,書寫以下的代碼: import { loadRoutes } from \\\'@/utils/routerUtil.js\\\'; import { getCodeL

    2024年02月08日
    瀏覽(21)
  • vue3.0+element Plus實(shí)現(xiàn)頁面布局,側(cè)邊欄菜單路由跳轉(zhuǎn)

    vue3.0+element Plus實(shí)現(xiàn)頁面布局,側(cè)邊欄菜單路由跳轉(zhuǎn)

    一.?先在router.js文件中配置路由,將側(cè)邊欄中需要跳轉(zhuǎn)的頁面都添加到children中 二. 在view目錄下新建一個(gè)文件,里面包含側(cè)邊欄要跳轉(zhuǎn)的頁面 三.? 頁面樣式布局 1.?我選擇使用自定義組件BaseLayout.vue文件來設(shè)置header和aside樣式顯示 也可以使用element?plus中的Container 布局容器?

    2024年02月13日
    瀏覽(30)
  • 補(bǔ)充 vue3用戶管理權(quán)限(路由控制)

    之前有人問我 ,如果是二級路由如何添加,這里我做一個(gè)補(bǔ)充吧。直接拿方法去用就行。也不做解釋了。稍微看下就能看懂了 假設(shè),后端返回給我們一個(gè)數(shù)據(jù) [“/defa”,\\\"/defa/defa1\\\"] 這樣的一個(gè)路由表,我們就需要通過這個(gè)路由表去篩選匹配我們的動(dòng)態(tài)路由,然后在進(jìn)行添加。

    2024年01月21日
    瀏覽(21)
  • Vue3 + Element Plus 實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁及右鍵菜單

    Vue3 + Element Plus 實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁及右鍵菜單

    目錄 先上圖 ?使用el-dropdown綁定右鍵菜單,為每個(gè)tab頁綁定一個(gè)右鍵 右鍵菜單生效后控制每個(gè)下拉項(xiàng)的禁用與顯示(每一項(xiàng)代表一個(gè)功能) 每個(gè)右鍵項(xiàng)對應(yīng)的功能? 控制每次只顯示一個(gè)右鍵 完整代碼 ????????只有首頁的情況 ????????多個(gè)tab頁的情況 ?

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包