vue纯前端设计动态路由+页面架构

基于Vue的前端架构设计 架构图 前后端分离总架构图 前端架构设计图 MVVM架构模式 MVVM的简介 MVVM 由 Model,View,ViewModel 三部分构成,Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。 在MVVM架构下,Vie... 阅读详情

前言

好久没有更新博客了,今天就写一下vue脚手架+antd如何架构一个后台管理系统页面,本来是想弄微前端的但是想想还是算了,不过你熟了的话,可以使用微前端进行架构,基于主体布局不变嵌入微前端。

上图

还行,不过有很多细节没有处理好。不过作为一个参考模型是足够了,我的写偏向简单,看一遍就会了

开始

这里我就主要讲两块(页面架构、路由设计)

App.vue

ps:这里添加一个路由组件(一级页面需要)

<template>
  <div id="app">
     <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      
    }
  },
  mounted() {
    
  },
  created() {
   
  },
  methods: {
    
  }
}
</script>

<style>

</style>

layout.vue

ps:在tab标签下添加一个路由组件(二级页面需要)

<template>
  <div>
      <a-layout id="components-layout-demo-top-side">
        <!-- 头部页 -->
        <a-layout-header class="header">
          <div class="logo" />
          <a-menu
            theme="dark"
            mode="horizontal"
            :default-selected-keys="headerSelectMenu"
            :style="{ lineHeight: '64px' }"
            @click="changHeaderMenu"
          >
            <a-menu-item v-for="item in headerMenu" :key="item['id']">
              {{item.name}}
            </a-menu-item>
          </a-menu>
        </a-layout-header>
        <!-- 主体页 -->
        <a-layout-content style="padding: 0 50px">
          <!-- 面包屑 -->
          <!-- <a-breadcrumb style="margin: 16px 0">
            <a-breadcrumb-item>首页</a-breadcrumb-item>
            <a-breadcrumb-item>测试</a-breadcrumb-item>
            <a-breadcrumb-item>测试页</a-breadcrumb-item>
          </a-breadcrumb> -->
          <!-- 左边导航栏 -->
          <a-layout style="padding: 24px 0; background: #fff">
            <a-layout-sider width="200" style="background: #fff">
              <!-- :default-open-keys="leftOpenSelectMenu" -->
              <!-- :default-selected-keys="leftSelectMenu" -->
              <a-menu
                mode="inline"
                style="height: 100%"
                :default-open-keys="leftOpenSelectMenu" 
                :default-selected-keys="leftSelectMenu"
                @click="changLeftMenu"
              >
                <a-sub-menu v-for="leftItem in leftMenu" :key="leftItem['id']">
                  <span slot="title"><a-icon type="user" />{{leftItem['name']}}</span>
                  <a-menu-item v-for="leftCholdrenItem in leftItem['children']" :key="leftCholdrenItem['id']">
                    {{leftCholdrenItem['name']}}
                  </a-menu-item>
                </a-sub-menu>
              </a-menu>
            </a-layout-sider>
            <!-- 页面内容显示 -->
            <a-layout-content :style="{ padding: '0 24px', minHeight: '280px' }">
              <!-- 页面标签 -->
              <a-tabs v-model="activeKey" type="editable-card" @edit="onEdit" :hideAdd="true" @change="changTab">
                <a-tab-pane v-for="pane in panes" :key="pane.key" :tab="pane.title" :closable="pane.closable">
                  <!-- {{ pane.content }} -->
                  
                  <keep-alive>
                      <router-view></router-view>
                  </keep-alive> 

                </a-tab-pane>
              </a-tabs>
            </a-layout-content>
          </a-layout>
        </a-layout-content>
        <!-- 底部页 -->
        <a-layout-footer style="text-align: center">
          Ant Design ©2018 Created by Ant UED
        </a-layout-footer>
      </a-layout>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      activeKey: [],
      panes: [],

      headerSelectMenu: ['1'],
      headerMenu: [
        {
          name: '头部导航1',
          router: '',
          id: "1"
        },
        {
          name: '头部导航2',
          router: '',
          id: "2"
        }
      ],

      leftMenu: [],

      leftOpenSelectMenu: [],
      leftSelectMenu: [],
      

      leftMenuOne: [
        {
          name: '头部导航栏1',
          router: '',
          id: "1",
          children: [
            {
              name: '头部导航栏1-1',
              router: '/',
              id: "1-1"
            },
            {
              name: '头部导航栏1-2',
              router: '/test1',
              id: "1-2"
            }
          ]
        },
      ],
      leftMenuTwo: [
        {
          name: '头部导航栏2',
          router: '',
          id: "2",
          children: [
            {
              name: '头部导航栏2-1',
              router: '/test3',
              id: "2-1"
            },
            {
              name: '头部导航栏2-2',
              router: '/test4',
              id: "2-2"
            }
          ]
        },
        {
          name: '用户模块',
          router: '',
          id: "3",
          children: [
            {
              name: '用户列表',
              router: '/user',
              id: "3-1"
            }
          ]
        },
      ]
    }
  },
  mounted() {
    
  },
  created() {
    this.leftMenu = this.leftMenuOne
    this.leftSelectMenu = ['1-1']
    this.leftOpenSelectMenu = ['1']
    // { title: '头部导航栏1-2', content: 'Content of Tab 2', key: '1-2', closable: false }
    this.panes = [
      { title: '头部导航栏1-1', content: 'Content of Tab 1', key: '1-1', closable: false}
    ];
    this.activeKey = "1-1"
  },
  methods: {
    changTab(item) {

      // 头部导航栏1  点击 到头部导航栏2  tab标签有导航栏1的页面点击不过去
      
      this.leftSelectMenu = [item]

      console.log(item)
      let keyArr = item.split("-")

      console.log(keyArr)

      let keyFatherMenu = {}
      this.leftMenu.forEach((fatherMenuItem) => {
        if (fatherMenuItem['id'] == keyArr[0].toString()) {
          keyFatherMenu = fatherMenuItem
        }
      })
      console.log(keyFatherMenu)
      let addMenuObj = {}

      for(let j =1 ; j < keyArr.length; j ++) {
        let keyItem = keyArr[j]
        console.log(keyItem)
        if ('children' in keyFatherMenu) {
          keyFatherMenu['children'].forEach((childrenMenuItem) => {
            if (childrenMenuItem['id'] == keyArr[0] + '-' +keyItem) {
              addMenuObj = childrenMenuItem
              console.log(addMenuObj)
            }
          })
        }
      }

      this.$router.push({path:addMenuObj['router'], params:{}})
    },
    callback(key) {
      console.log(key);
    },
    onEdit(targetKey, action) {
      this[action](targetKey);
    },
    remove(targetKey) {
      let activeKey = this.activeKey;
      let lastIndex;
      this.panes.forEach((pane, i) => {
        if (pane.key === targetKey) {
          lastIndex = i - 1;
        }
      });
      const panes = this.panes.filter(pane => pane.key !== targetKey);
      if (panes.length && activeKey === targetKey) {
        if (lastIndex >= 0) {
          activeKey = panes[lastIndex].key;
        } else {
          activeKey = panes[0].key;
        }
      }
      this.panes = panes;
      this.activeKey = activeKey;
    },

    changLeftMenu(item) {
      // console.log(item)

      for(let i=0; i < this.panes.length; i ++) {
        let panesItem = this.panes[i]
        if(panesItem['key'] == item['key']) {
          this.activeKey = item['key']

          let keyArr = item['key'].split("-")
          let keyFatherMenu = {}
          this.leftMenu.forEach((fatherMenuItem) => {
            if (fatherMenuItem['id'] ==keyArr[0]) {
              keyFatherMenu = fatherMenuItem
            }
          })
          // console.log(keyFatherMenu)
          let addMenuObj = {}

          for(let j =1 ; j < keyArr.length; j ++) {
            let keyItem = keyArr[j]
            // console.log(keyItem)
            if ('children' in keyFatherMenu) {
              keyFatherMenu['children'].forEach((childrenMenuItem) => {
                if (childrenMenuItem['id'] == keyArr[0] + '-' +keyItem) {
                  addMenuObj = childrenMenuItem
                  // console.log(addMenuObj)
                }
              })
            }
          }

          this.$router.push({path:addMenuObj['router'], params:{}})
          break
        } else {
          if (i == this.panes.length - 1) {
            // console.log("最后一个元素")
            // console.log(this.leftMenu)

            let keyArr = item['key'].split("-")
            let keyFatherMenu = {}
            this.leftMenu.forEach((fatherMenuItem) => {
              if (fatherMenuItem['id'] ==keyArr[0]) {
                keyFatherMenu = fatherMenuItem
              }
            })
            // console.log(keyFatherMenu)
            let addMenuObj = {}

            for(let j =1 ; j < keyArr.length; j ++) {
              let keyItem = keyArr[j]
              // console.log(keyItem)
              if ('children' in keyFatherMenu) {
                keyFatherMenu['children'].forEach((childrenMenuItem) => {
                  if (childrenMenuItem['id'] == keyArr[0] + '-' +keyItem) {
                    addMenuObj = childrenMenuItem
                    // console.log(addMenuObj)
                  }
                })
              }
            }

            // 显示关闭图标
            this.panes.forEach((panesItemTwo) => {
              panesItemTwo['closable'] = true
            })

            // 进行添加
            let newAddObj = { title: addMenuObj['name'], content: 'Content of Tab' + item['key'], key: item['key'], closable: false }
            // console.log(newAddObj)
            this.panes.push(newAddObj)
            // 选中当前添加标签
            this.activeKey = item['key']
            this.$router.push({path:addMenuObj['router'], params:{}})
            break
          }
        }
      }
    },

    changHeaderMenu(item) {
      console.log(item['key'])
      if(item['key'] == '1') {
        this.leftMenu = this.leftMenuOne
        this.leftSelectMenu = ['1-1']
        this.leftOpenSelectMenu = [item['key']]
        this.activeKey = "1-1"
      } else if(item['key'] == '2') {
        this.leftMenu = this.leftMenuTwo
        this.leftSelectMenu = ['2-1']
        this.leftOpenSelectMenu = [item['key']]
        this.activeKey = "2-1"
      }
    }
  }
}
</script>

<style>

#components-layout-demo-top-side .logo {
  width: 120px;
  height: 31px;
  background: rgba(255, 255, 255, 0.2);
  margin: 16px 28px 16px 0;
  float: left;
}

</style>

main.js

import Vue from 'vue'

import router from './routers/index'

import App from './App.vue'

import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';

Vue.use(Antd);


Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  router
}).$mount('#app')

路由文件

import Layout from "@/views/layout/index"

/**
 * auth true登录才能访问,false不需要登录
 * keepAlive true缓存,false不缓存
 */

// 默认路由
export default [
    {
        path: '/',
        component: Layout,
        children: [
            {
                path: '/', // 首页
                meta: { auth: false, keepAlive: false },
                component: resolve => require(['@/views/home/'], resolve)
            },
            {
                path: '/test', // 测试
                meta: { auth: false, keepAlive: false },
                component: resolve => require(['@/views/test/'], resolve)
            }
        ]
    },
    {
        path: '/login',
        component: resolve => require(['@/views/login/'], resolve),
        meta: { auth: false, keepAlive: false },
    },
    {
        path: "/404",
        component: resolve => require(['@/views/notFound/'], resolve),
    }
]

路由权限文件

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './config'
import Layout from "@/views/layout/index"

const _import = require('./_import_' + process.env.NODE_ENV)

Vue.use(VueRouter)

let getApiRouter = [
    {
        path: '/',
        component: "layout",
        children: [
            {
                path: '/test1', // 测试1
                meta: { auth: false, keepAlive: false },
                component: "test1"
            },
            {
                path: '/test2', // 测试2
                meta: { auth: false, keepAlive: false },
                component: "test2"
            },
            {
                path: '/test3', // 测试3
                meta: { auth: false, keepAlive: false },
                component: "test3"
            },
            {
                path: '/test4', // 测试4
                meta: { auth: false, keepAlive: false },
                component: "test4"
            },
            {
                path: '/user', // 用户列表
                meta: { auth: false, keepAlive: false },
                component: "user"
            },
        ]
    },
    {
        path: '*',
        redirect: "/404"
    }
]

let sumRouter = null

// 路由配置
const router = new VueRouter({
    mode: 'history',
    base: __dirname,
    routes
})

router.beforeEach((to, from, next) => {
    console.log(to)
    console.log(from)
    if (!sumRouter) {
        // 处理路由
        let dynamicMenu = filterAsyncRouter(getApiRouter)
        // 动态添加路由
        sumRouter = routes.concat(dynamicMenu)
        router.addRoutes(sumRouter)
        next({ ...to, replace: true })
    }
    next()
})

function filterAsyncRouter(asyncRouterMap) {
    const accessedRouters = asyncRouterMap.filter((route) => {
        if (route.component) {
            if (route.component === 'layout') {
                route.component = Layout
            } else {
                route.component = _import(route.component)
            }
        }
        if (route.children && route.children.length) {
            route.children = filterAsyncRouter(route.children)
        }
        return true
    })
    return accessedRouters
}


export default router

其实也没啥好讲的~想看整体代码进到这个传送门。

结束

总结~好像也没啥好总结的,也就那样。

Vue布局秘籍:用这些技巧打造炫酷页面! el-container、el-header、el-aside和el-footer是Element UI框架中的布局组件,有着以下关系:- el-container:容器组件,是整个布局的最外层容器,包含了页面的整体布局。- el-header:头部组件,位于容器组件的顶部,通常用于放置导航栏、logo等。- el-aside:侧边栏组件,放置在容器组件的左侧或右侧,用于放置边栏菜单、快捷导航等。- el-footer:底部组件,位于容器组件的底部,通常用于放置页脚信息、版权声明等。 阅读详情

相关推荐

基于 vue 的可插拔架构设计

什么是可插拔架构 简单来说,可插拔架构就好比是一个插排,可以连接一个及以上的插头,插头插上或者拔下都不影响插排的正常使用,插上去某个插头连接的电器可用,拔下来,该电器停用。而在我们前端体系中,一个个带插头的电器可以看成是项目上的各个模块,插排就是我们的项目主体(或者叫基座工程),通过配置文件来定义需要安装在基座上的模块信息,子模块的插拔不会影响基座工程的正常运行,从而达到前端模块的热部署(热插拔)。 这也是微前端解决方案的一种,关于微前端的概念,应用场景,使用意义等在这里就不多说了,感兴趣的童鞋可以自行go

DMS程序猿 3173

管理后台布局-左菜单-右侧内容宽度控制(使用ant design vue)

项目结构如下: 布局实现的代码段 <template> <a-layout> <a-layout-sider v-model="collapsed" :trigger="null" collapsible class="app-sider" > <div class="logo-box"></div> <SideMenu :openCurr.

qq_43468165的博客 4273

Vue前端动态路由权限配置

一文搞懂vue通过addRoute动态路由配置

qq_45637995的博客 3391

Layout布局的使用

本文用AntDV的Layout实现了页面基本布局

江湖郎中 5891

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

从零开始:QNX SDP 8.0开发环境搭建与实战入门

本文详细介绍了如何从零开始搭建QNX SDP 8.0开发环境并进行实战入门。内容涵盖许可证获取、环境安装、命令行与IDE工具使用、BSP构建、系统镜像生成,以及编写、编译和运行第一个QNX程序的全过程。旨在帮助嵌入式开发者,特别是汽车电子和工业控制领域的工程师,快速掌握这一实时操作系统(RTOS)的开发基础。

weixin_29163857的博客 641

Vue基础知识总结 11:前端路由vue-router

当打包构建应用时,JavaScript包会变得非常大,影响页面加载。如果我们能吧不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

学Java,找哪吒 4万+

Pascal Context数据集实战:从安装到格式转换的完整指南

本文提供了Pascal Context数据集的完整实战指南,从安装配置到格式转换的详细步骤。Pascal Context是计算机视觉领域重要的语义分割数据集,包含540个精细标注类别。文章涵盖数据集下载、环境配置、预处理技巧和常见问题解决方案,帮助开发者高效利用这一数据集进行场景理解任务。

weixin_30216561的博客 616

Vue实现动态路由

动态添加路由。说着好像很简单,但看了很多教程,也跟着教程写了很多代码,但最后都跑不通(很多原因,比如:版本问题,教程没有全部代码,只有核心代码片段等)。😭😭😭所以,我只能狠下心,写下这篇博客,方便自己总结,也为了避免大家踩坑。废话不多说,

无所谓^_^博客 1万+

【QT】QtCreator卸载与安装(非正常状态)

QtCreator卸载与安装(非正常状态)

Cappuccino Blog 1万+

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 584

基于VUE实现前端动态路由权限控制

需求 最近在项目中遇到权限控制的问题,由于自己接触前端也不久,对于路由这方面知识还有所欠缺,因此一直在网上找寻各种解决方案。最终还是看到花裤衩大佬的博客,终于对前端实现路由权限控制有了些许思路。 传送门:手摸手,带你用vue撸后台 下面这篇博客也有所参考:基于Vue实现后台系统权限控制 先说说我在项目中需要实现的效果: 由超级管理员在页面中进行选择,从而控制其他用户访问各页面的权限。系统再根据该用...

qq_38430097的博客 6487

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1210

Vue核心知识:动态路由实现完整方案

实现Vue中的动态路由不仅仅需要前端的配置,还涉及到后端与数据库的配合。通过数据库存储路由信息和角色权限,后端根据角色返回路由数据,前端通过vue-router动态生成路由配置,并通过vuex管理路由状态。动态加载组件也是提高性能的一个关键点,确保用户只在需要时才加载路由对应的组件。通过这种方式,系统可以灵活地配置和管理不同用户的权限路由,使得前端界面能够根据用户角色和权限进行个性化的展示。

百锦再的博客 5671

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

光学测量仿真软件:Zygo_(5).Zygo的数据处理与分析方法

通过上述综合案例,我们可以看到Zygo中的数据处理与分析方法是如何一步一步应用于实际数据的。从数据导入到预处理,再到滤波、表面分析、缺陷检测和数据可视化,每一步都至关重要,最终确保了数据的准确性和可靠性。处理后的数据还可以导出为多种格式,便于在其他软件中进行进一步的处理或报告。希望这个案例能够帮助您更好地理解和应用Zygo中的数据处理与分析方法。

kkchenjj的博客 946

前端单独实现 vue 动态路由

在用户登录成功后从服务器获取用户的权限信息,在 vuex 的异步处理函数中过滤掉角色权限不存在的路由,使用concat()合并公共路由,最后使用动态添加可访问的路由。这样可以确保应用根据用户的权限动态加载相应的路由,增强安全性与灵活性。

a123456234的博客 1951

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Vue3纯前端实现Vue路由权限的方法详解

Vue3纯前端实现Vue路由权限的方法详解

leveretz的博客 3376

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【vue-router】vue-router如何实现动态路由

在构建基于Vue.js的单页面应用(SPA)时,Vue Router是一个不可或缺的工具。它提供了声明式的路由功能,使开发者能够轻松地管理和控制应用内的导航逻辑。动态路由是Vue Router中的一项重要特性,它允许我们根据运行时的数据来动态地匹配路由。这对于需要根据用户输入或后端响应来调整应用行为的场景尤其有用。本文将详细介绍动态路由的概念、作用及其在Vue Router中的具体实现,并通过一系列实际案例来展示如何有效地使用这项功能。

景天科技苑 6万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Vue动态路由的前端实现

1. 需求描述 最近开发的一个项目,涉及到这样一个需求:随着项目的不断推进,后台管理功能逐渐增多,与此同时,静态路由表也逐渐扩大,需要把静态路由方式转换为动态路由方式。要完成这样一个转换,有几个技术要点需要解决,其中一个就是前端的实现方式。那么,前端如何实现呢? 2. 实现 Vue动态路由的前端实现,网上有不少参考资料。但大多存在代码冗余,思路模糊不清的情况。现在整理一下思路。当前端发送登录请求login向后台请求数据后,后台会返回一个user对象至前端,前端把该对象保存至vuex中,同时,保存user中的

凡江林的博客 5544

Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

emm,项目中使用动态路由实现根据后端返回的用户详情信息,动态将该用户能够访问的页面信息,动态生成并且绑定到路由对象中。但是后端返回的不包含像是页面详情页,新增页的权限路由,如果前端在路由对象中写死的话,那每次进入页面都得判断是否将进入一个用户没有权限的页面,但是路由中有存在的。3.GetPossibleDetails 根据传递过来的信息,筛选出存在权限的数据, 转换成路由信息,因为如果在本地中已经定义了全部的页面新增,详情,编辑等页面,但是咱们还是需要根据后端返回的权限中,判断咱们是否注册该页面的路由。

qq_45061461的博客 4156

Vue 动态路由的实现

vue项目实现动态路由的方式大体可分为两种: 前端这边把路由写好,登录的时候根据用户的角色权限来动态展示路由,(前端控制路由) 详情可参阅花裤衩大佬的项目手把手…,我当时看这个项目看了好久才明白一点逻辑, 因为大神的动态路由那里有好多层判断,并且穿插各种vuex,把小白的我都快搞懵逼了,对我启发很大,也正是这篇文章,给我提供了很多逻辑 后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由) 今天我们来讲讲用后台传递路由表实现动态路由的思路,因为公司的项目里路有部分用

weixin_42069147的博客 7811

vue动态路由

前言 当我们开发的系统涉及多权限的情况下,就需要对菜单进行分权限展示,对于管理员A可以展示用户数据页面,但不能展示经营盈亏页面,对管理员B可以展示经营盈亏页面,不能展示用户数据页面。 那么对于我们来说就需要对路由进行隐藏,但vue最常用的静态路由很难实现这种情况,即便是将菜单栏实现了菜单隐藏,但由于静态路由还是存在的,所以当用户在得知路由的情况下,可以在导航栏手动输入路由进行跳转。虽然这种情况可以使用路由守卫进行拦截,但当权限划分过于细腻后,编写的路由守卫将会过于复杂,冗余;所以更为适用的则是动态路由。 优

m0_51079637的博客 7843

vue-router动态路由实现前端权限管理

年初了,抱着试试水的心态出去面试了两家公司;其中一家公司面试的时候多次问到了vue-router的动态路由实现权限管理的问题;回来后我就仔细研究了一下 router.addRoutes 动态路由是基于vue-router 新增的router.addRoutes方法来实现的;也就是为了达到当用户登录之后通过判断用的权限来觉得前端哪些页面能展示,哪些不能展示; 第一步 创建vue-router ro...

qq_41114603的博客 5082

JeecgBoot前端路由:Vue Router动态路由配置

你是否还在为企业级应用中的路由权限管理感到头疼?是否遇到过不同角色需要展示不同菜单的需求?本文将带你一文掌握JeecgBoot中基于Vue Router的动态路由解决方案,从基础配置到高级应用,让你轻松应对复杂权限场景。 ## 路由系统架构概览 JeecgBoot前端路由系统采用模块化设计,主要由路由实例创建、路由配置和权限控制三部分组成。核心文件结构如下: - **路由实例**:[src/...

gitblog_00410的博客 971
上一篇: 2021年总结
下一篇: 计算机网络原理恺撒密码/列置密码总结
An_s
博客等级 码龄10年 665粉丝 363原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值