vue权限控制路由(vue-router 动态添加路由)

article/2025/9/18 1:44:59

    用户登录后返回权限菜单,前端根据权限菜单动态添加路由,然后再动态生成菜单栏。

    思路如下:

    一、定义初始化默认路由。

二、动态配置路由,这里是把所有组件中相应的路由配置成一个个的对象,根据后台返回的菜单tree一个个去匹配。

三、通过匹配,把匹配好的路由数据addRoutes到路由中。

四、为了防止刷新页面后路由数据被清空,这里用判断是否登录的方式,再次加载动态路由。

具体代码如下:

router.js

import Vue from 'vue'
import {router} from './index'
import login from '@/views/login/login'
import layout from '@/views/layout/layout'
import home from '@/views/home/home.vue'
import depDsStorageList from '@/views/home/homePage1/depDsStorageList.vue'// 数据管理
import dataSourceAdmin from '@/views/dataManage/dataSourceAdmin/dataSourceAdmin'
import dataPoolAdmin from '@/views/dataManage/dataPoolAdmin/dataPoolAdmin'
import buildSqlTable from '@/views/dataManage/buildSqlTable/buildSqlTable'
import complianceDetectionFunction from '@/views/dataManage/complianceDetectionFunction/complianceDetectionFunction'
import tablePreview from '@/views/dataManage/dataSourceAdmin/tablePreview/tablePreview.vue'
import dataAssetsManage from '@/views/dataManage/dataAssetsManage/dataAssetsManage.vue'
//标准管理
import codeItemManage from '@/views/standardManage/codeItemManage/codeItemManage'
import metadataManage from '@/views/standardManage/metadataManage/metadataManage'
import standardFileManage from '@/views/standardManage/standardFileManage/standardFileManage'
import determinerManage from '@/views/standardManage/determinerManage/determinerManage'
//数据服务
import dataServiceAdmin from '@/views/dataService/dataServiceAdmin/dataServiceAdmin.vue'
import customizedServiceAdmin from '@/views/dataService/customizedServiceAdmin/customizedServiceAdmin.vue'//系统管理
import labelManage from '@/views/systemManage/labelManage/labelManage.vue'
import roleMenu from '@/views/systemManage/role-menu/role-menu.vue'
import userAdmin from '@/views/systemManage/user-admin/user-admin.vue'
import roleAdmin from '@/views/systemManage/role-admin/role-admin.vue'//权限
import haveNoAuthority from '@/views/systemManage/NoAuthority/haveNoAuthority'
import haveNotFound from '@/views/systemManage/NoAuthority/haveNotFound'//初始化默认路由
export let initMenu = [{path: '', redirect: '/login'},{path: '/login',name: 'login',component: login},{path: '/haveNoAuthority',name: 'haveNoAuthority',component: haveNoAuthority},{path: '/haveNotFound',name: 'haveNotFound',component: haveNotFound},{path: '',redirect: '/depDsStorageList',component: layout,children: [{path: 'depDsStorageList',name: '首页内容列表',component: depDsStorageList,},],},{path: '',redirect: 'addDataService',component: layout,children: [{path: 'addDataService',name: '新增数据服务',component: () => import('@/views/dataService/dataServiceAdmin/addDataService.vue'),},],},{path: '',redirect: '/dataPoolAdmin',component: layout,children: [{path: 'dataPoolAdmin',name: '数据池管理',component: dataPoolAdmin},],},{path: '',redirect: '/tablePreview',component: layout,children: [{path: 'tablePreview',name: '表关系预览',component: tablePreview},],},
]//动态配置路由
export let menu = {"首页": {path: '',redirect: '/home',component: layout,children: [{path: 'home',name: '首页',component: home,}],},"标准数据服务": {path: '',redirect: '/dataServiceAdmin',component: layout,children: [{path: 'dataServiceAdmin',name: '标准数据服务',component: dataServiceAdmin,}],},"定制数据服务":  {path: '',redirect: '/customizedServiceAdmin',component: layout,children: [{path: 'customizedServiceAdmin',name: '定制数据服务',component: customizedServiceAdmin,}],},"数据源管理": {path: '',redirect: '/dataSourceAdmin',component: layout,children: [{path: 'dataSourceAdmin',name: '数据源管理',component: dataSourceAdmin,}],},"数据资产管理": {path: '',redirect: '/dataAssetsManage',component: layout,children: [{path: 'dataAssetsManage',name: '数据资产管理',component: dataAssetsManage,}],},"标签管理":  {path: '',redirect: '/labelManage',component: layout,children: [{path: 'labelManage',name: '标签管理',component: labelManage,},],},"标准规范管理": {path: '',redirect: '/standardFileManage',component: layout,children: [{path: 'standardFileManage',name: '标准规范管理',component: standardFileManage},],},"数据元管理": {path: '',redirect: '/metadataManage',component: layout,children: [{path: 'metadataManage',name: '数据元管理',component: metadataManage},],},"限定词管理": {path: '',redirect: '/determinerManage',component: layout,children: [{path: 'determinerManage',name: '限定词管理',component: determinerManage},],},"代码项管理": {path: '',redirect: '/codeItemManage',component: layout,children: [{path: 'codeItemManage',name: '代码项管理',component: codeItemManage},],},"依标建库": {path: '',redirect: '/buildSqlTable',component: layout,children: [{path: 'buildSqlTable',name: '依标建库',component: buildSqlTable},],},"合规检测": {path: '',redirect: '/complianceDetectionFunction',component: layout,children: [{path: 'complianceDetectionFunction',name: '合规检测',component: complianceDetectionFunction},],},"用户管理":  {path: '',redirect: '/userAdmin',component: layout,children: [{path: 'userAdmin',name: '用户管理',component: userAdmin},],},"权限管理": {path: '',redirect: '/roleAdmin',component: layout,children: [{path: 'roleAdmin',name: '权限管理',component: roleAdmin},],},"角色资源管理": {path: '',redirect: '/roleMenu',component: layout,children: [{path: 'roleMenu',name: '角色资源管理',component: roleMenu}],}
}export let menuList = []
export const setMenuTree = function (menuTree) {let temp = new Vue({router})hanleFor(menuTree)temp.$router.addRoutes(menuList)temp.$router.addRoutes([{path: '*', redirect: '/' + menuList[0].redirect}])
}const hanleFor = function (list){for (var i=0; i<list.length; i++) {if (list[i].children) {hanleFor(list[i].children)}else{menuList.push(menu[list[i].name])}}
}
export const routers = {router: initMenu
}

index.js

import Vue from 'vue'
import iView from 'iview'
import lodash  from 'lodash'
import VueLodash  from 'vue-lodash'
import Router from 'vue-router'import { routers, menuList, setMenuTree } from './routers';
import 'iview/dist/styles/iview.css'Vue.use(Router);Vue.use(iView);Vue.use(VueLodash, lodash);export const router =  new Router({routes: routers.router
})export let getMenuFuc = function (list) {setMenuTree(list)
}if (sessionStorage.getItem("role")) {getMenuFuc(JSON.parse(sessionStorage.getItem("menuTree")))
}router.beforeEach((to, from, next) => {if (!sessionStorage.getItem("role") && to.name !== 'login') {next('/login')} else {next()}
})

login.vue

<template><div class="jq22-container loginBody" style="padding-top:100px; width: 100%; height: 100%;"><div class="login-wrap" @keydown.enter="handleSubmit"><div class="login-html"><p class="title">江苏消防数据资源管理服务平台</p><div class="hr"></div><div class="login-form"><div class="sign-in-htm"><Form ref="loginForm" :model="form" :rules="rules"><div class="group group1"><FormItem prop="account"><Icon :size="20" type="person" class="icon-user"></Icon><input v-model="form.account" type="text" class="input" placeholder="用户名"></FormItem></div><div class="group"><FormItem prop="password" v-show="hidePass"><Icon :size="16" type="locked" class="icon-pass"></Icon><div @click="showPwd"><Icon :size="22" type="eye-disabled" class="eyeDisabled"></Icon></div><input v-model="form.password" type="password" class="input" data-type="password" placeholder="密码"></FormItem><FormItem prop="password" v-show="showPass"><Icon :size="16" type="locked" class="icon-pass"></Icon><div @click="hidePwd"><Icon :size="22" type="eye" class="eyeDisabled"></Icon></div><input v-model="form.password" type="text" class="input" data-type="text" placeholder="密码"></FormItem></div><div class="group"><!--<FormItem prop="code">--><FormItem prop="code"><Icon :size="18" type="android-checkmark-circle" class="icon-pass"></Icon><input v-model="form.code" type="text" class="input" data-type="text" placeholder="验证码" maxlength="4"><img id="imgObj" alt="验证码" :src="cfg.api.obtain" @click="changeImg"/></FormItem></div><!--<div class="group"><input id="check" type="checkbox" class="check" checked><label for="check"><span class="icon"></span> 记住密码</label><a href="#forgot" style="float: right">忘记密码?</a></div>--><Alert type="error" v-show="error"><span style="color: red">{{errorMessage}}</span></Alert><div class="group"><input type="button" class="button" value="登录" @click="handleSubmit"></div></Form></div></div><div span="8" v-show="spinShow"><Spin fix><Icon type="load-c" size=50 class="demo-spin-icon-load"></Icon><div>登录中,请稍后...</div></Spin></div></div></div></div>
</template>
<style>@import "./login.css";
</style>
<script src="./loginJs.js"></script>

login.css

body{margin: 0 auto;padding: 0;width: 100%;color:#6a6f8c;background: url("./img/login_1.png");background-size: cover;
}
body,html,.loginBody{height: 100%;
}
input, button {outline: none;border: none;
}
.title{text-align: center;color: #f3f3f3;font-size: 24px;margin-bottom: 40px;font-weight: bold;
}
.login-wrap{width:100%;margin: auto;max-width:400px;min-height:500px;position:relative;background:url(./img/login_1.png);box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19);margin-top: 4%;
}
.login-html{width:100%;height:100%;position:absolute;background:rgba(40,57,101,.9);padding: 50px 20px 30px 20px;
}
.ivu-form-item-content{height: 50px;
}
.login-form .group1{position: relative;
}
.icon-user{position: absolute ;left: 10px;top: 12px;z-index: 5;color: #666;}
.login-form .group2{position: relative;padding-bottom: 10px;
}
.icon-pass{position: absolute ;left: 10px;top: 13px;z-index: 5;color: #666;
}
#imgObj{position: absolute ;width:40%;height: 30px;z-index: 5;left: 58%;top: 7px;border-radius:15px;opacity: 0.7;
}
.eyeDisabled{position: absolute ;left: 91%;top: 10px;z-index: 5;color: #666;
}
.eyeDisabled:hover{cursor: pointer;
}
.login-form .group .input{width:100%;color:#fff;display:block;text-indent: 23px;font-size: 15px;border:none;padding:5px 10px;border-radius:25px;background:rgba(255,255,255,.1);
}
.login-form .group .button{width:100%;color:#fff;display:block;border:none;padding:15px 20px;border-radius:25px;background:rgba(255,255,255,.1);margin-top: 20px;
}
.login-form .group input[data-type="password"]{text-security:circle;-webkit-text-security:circle;
}.login-form .group .button{background:#1161ee;
}
.hr{height:2px;margin:20px 0 30px 0;background:rgba(255,255,255,.2);
}
.foot-lnk{text-align:center;
}
#imgObj:hover{cursor: pointer;
}.demo-spin-icon-load{animation: ani-demo-spin 1s linear infinite;
}
@keyframes ani-demo-spin {from { transform: rotate(0deg);}50%  { transform: rotate(180deg);}to   { transform: rotate(360deg);}
}

loginJs.js

import {getMenuFuc} from '../../router/index'
export default {data () {return {form: {account: 'admin',password: '123456',code: ''},rules: {account: [{ required: true, message: '账号不能为空', trigger: 'blur' }],password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],code: [{ required: true, message: '验证码不能为空', trigger: 'blur' }]},showPass: false,hidePass: true,error: false,errorMessage: '',token: '',imgUrl: '',validate: '',spinShow:false};},created (){let _this = this_this.token = this.getCookie('token')_this.changeImg()$(".demo-spin-col").height($("body").height())},methods: {showPwd () {this.hidePass = falsethis.showPass = true},hidePwd () {this.hidePass = truethis.showPass = false},handleSubmit () {let _this = this_this.$refs.loginForm.validate((valid) => {if (valid) {_this.spinShow = true_this.$ajax.post(_this.cfg.api.login, _this.form).then(function(res){if(res.data.result){_this.setCookie('token',res.data.token, 365)let role = res.data.data.rolevar roleString = ''for (var i=0; i<role.length; i++) {if (i == role.length-1) {roleString += role[i].roleName}else{roleString += role[i].roleName + ','}}sessionStorage.setItem("account",_this.form.account)sessionStorage.setItem("role",roleString)let menuTree = res.data.data.menuTreesessionStorage.setItem("menuTree",JSON.stringify(menuTree))//用于layout页面加载菜单let buttonList = res.data.data.buttonList  //存储按钮的权限控制sessionStorage.setItem("buttonList",JSON.stringify(buttonList))getMenuFuc(menuTree)_this.$router.push('home');_this.error = false}else{_this.error = true_this.errorMessage = res.data.message_this.form.code = ''_this.changeImg()}_this.spinShow = false}).catch((error)=>{ _this.spinShow = false});}});},changeImg() {var imgSrc = $("#imgObj");var src = imgSrc.attr("src");imgSrc.attr("src", this.changeUrl(src));},changeUrl(url) {var timestamp = (new Date()).valueOf();var index = url.indexOf("?",url);if (index > 0) {url = url.substring(0, index);}if ((url.indexOf("&") >= 0)) {url = url + "×tamp=" + timestamp;} else {url = url + "?timestamp=" + timestamp;}return url;}}
};

 


http://chatgpt.dhexx.cn/article/DwJBwe0D.shtml

相关文章

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

需求 最近在项目中遇到权限控制的问题&#xff0c;由于自己接触前端也不久&#xff0c;对于路由这方面知识还有所欠缺&#xff0c;因此一直在网上找寻各种解决方案。最终还是看到花裤衩大佬的博客&#xff0c;终于对前端实现路由权限控制有了些许思路。 传送门&#xff1a;手摸…

【Vue路由(router)进一步详解】

Vue路由&#xff08;router&#xff09;进一步详解 query属性具体实例代码如下&#xff1a; params属性具体实例代码如下&#xff1a; props属性replace属性编程式路由导航路由缓存具体代码&#xff1a; 总结 本篇文章主要针对已经掌握Vue路由&#xff08;router&#xff09;基…

vue 实现动态路由

1、什么是动态路由&#xff1f; 2、动态路由的好处 3、动态路由如何实现 1、什么是动态路由&#xff1f; 动态路由&#xff0c;动态即不是写死的&#xff0c;是可变的。我们可以根据自己不同的需求加载不同的路由&#xff0c;做到不同的实现及页面的渲染。动态的路由存储可分…

16-Vue3 动态路由权限控制

Vite2Vue3TypeScriptElement-plus脚手架搭建系列 ✅01-初始化 Vite 项目 ✅02-配置 Vite2 环境变量 ✅03-Vite2 配置及说明 ✅04-Vue3 使用 SCSS ✅05-Vue3 路由配置 ✅06-TypeScript 配置及说明 ✅07-Vue3 使用 axios ✅08-Vue3 axios 对象封装 ✅09-ESLint 配置及说明 ✅10-…

【Vue路由守卫】

Vue路由守卫 Vue路由守卫全局路由守卫全局前置守卫全局后置守卫实例代码&#xff1a; 独享守卫组件内守卫总结 Vue路由守卫 路由守卫&#xff0c;简单理解来说就是&#xff0c;当用户要进行一些操作时&#xff0c;我需要用户的一些信息或数据或行为&#xff0c;我判断过后&…

vue 动态路由实现 后端控制权限时的前端处理

前端思路&#xff1a; 上图中 获取路由信息 &#xff0c;可以是后端控制的&#xff0c;可以是前端根据用户信息从路由表中筛选的。 此处只讲解后端存储路由信息的情况 组织路由信息 请求后台&#xff0c;获取返回结果&#xff0c;结果有两种可能&#xff0c;一种是组合好的…

vue-router路由权限控制的两种实现方案

前言 最近在抽时间写一套后台管理系统框架模板&#xff08;vueelement-ui&#xff09;&#xff0c;记录一些问题的解决方案。文章没什么顺序&#xff0c;就想到什么写什么了&#xff0c;也都是之前工作上碰到的问题。 抛出问题 Vue项目路由权限控制怎么实现&#xff1f; 实现…

Vue路由

目录 一、路由的概念 二、事前准备 三、 路由的相关知识点 3.1 路由的基本认识 3.2 路由小案例 3.3 路由模式的切换 3.4 指定路由的渲染位置 3.5 声明式导航 3.5.1 无参模式 3.5.2 传参模式 3.5.3 $route 与$router的区别 3.6 编程式导航 3.6.1 第一种get方…

Vue动态路由使用(后端控制)

使用VUE开发后台管理系统 完全由后端控制左边菜单项思路 在传统开发后台管理系统时&#xff0c;都会涉及权限控制这一功能需求 即&#xff1a;根据不同登录的角色账号来使用该账号拥有的功能&#xff0c;也就是说系统左边的菜单栏不是固定不变的&#xff0c;而是根据登录账号的…

Vue学习:路由

2. 路由 2.1 前端路由的发展历程 2.1.1 认识前端路由 路由其实是网络工程中的一个术语&#xff1a; 在架构一个网络时&#xff0c;非常重要的两个设备就是路由器和交换机。 ​ 当然&#xff0c;目前在我们生活中路由器也是越来越被大家所熟知&#xff0c;因为我们生活中都…

vue权限控制和动态路由

思路 登录&#xff1a;当用户填写完账号和密码后向服务端验证是否正确&#xff0c;验证通过之后&#xff0c;服务端会返回一个token&#xff0c;拿到token之后&#xff08;我会将这个token存贮到localStore中&#xff0c;保证刷新页面后能记住用户登录状态&#xff09;&#xf…

Vue 路由权限控制

当我们在做后台管理系统的时候&#xff0c;都会涉及到系统左侧的菜单树如何动态显示的问题。目前基本上都是RBAC的解决方案&#xff0c;即Role-Based Access Control&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了…

【Git CMD】Git常用命令总结

目录 0 git的工作区、暂存区、本地仓库和远程仓库0.1 图解0.2 解析 1 本地仓库1.1 创建版本库1.2 分支1.2.1 查看本地仓库的分支信息1.2.2 创建分支1.2.3 切换分支1.2.4 重命名分支1.2.5 合并分支1.2.6 删除分支 1.3 添加文件到暂存区1.3.1 添加单个文件1.3.2 添加多个文件1.3.…

Git常用命令大全(从入门到使用,学不会评论区骂我)

Git常用命令大全 1&#xff1a;Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。在Git 命令行中执行下面命令&#xff1a; 设置用户信息 git config --global user.name “你的用户名” …

Git常用命令及方法大全

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 本地分支关联远程&#xff1a;git branch --set-upstre…

Git 常用命令大全

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git192.168.1.119:ndshowgit push origin …

Git常用命令大全

Git常用命令大全 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区Index / Stage&#xff1a;暂存区Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09;Remote&#xff1a;远程仓库 本地分支关联远程 git branch --set-u…

git常用命令总结

1 git概述 1.1 简介 git是分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称DVCS&#xff09;&#xff0c;分为两种仓库 &#xff1a;本地仓库和远程仓库。 本地仓库&#xff1a;是在开发人员自己电脑上的Git仓库远程仓库&#xff1a;是在…

20 个最常用的 Git 命令用法说明及示例

在这篇文章中&#xff0c;我将介绍在使用 Git 时最常使用的 20 个命令。 作者 | Sahiti Kappagantula 译者 | 弯月&#xff0c;责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 以下是这些Git命令&#xff1a; git config git…

Git基本命令大全

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 1、git clone -b <指定分支名> <远程仓库地址> 克隆指定分支 如&#xff1a; git clone -b bestore_master ssh://gitgit-ssh.xxx.com/xxx.git 2、 git bra…