权限控制--动态生成路由
在后台管理项目中 我们经常会根据不同的用户权限 来动态生成不同的路由导航 以达到权限控制(不同权限生成的路由导航不同)
流程
用户在登录页面输入账号密码---》后端接收判断用户权限---》后端根据不同的用户权限返回对应的导航数据----》前端生成对应的路由导航
重点:动态生成路由
1 前端页面创建
创建登录页面并设置路由
创建登录页面完成用户登录界面 在views下创建LoginView,vue登录页
<template>
<div>
<h1>我是登录页面</h1>
用户名:<input type="text"/>
密码:<input type="text"/>
<button>点我登录</button>
</div>
</template>
<script>
export default {
}
</script>
<style>
</style>
配置登录页路由规则
配置登录页路由规则 在router下的index.js配置路由规则
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/login',
name: 'login',
component: () => import('../views/LoginView.vue')
},
{
path:"/",
redirect:"/login"
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
创建首页 并配置路由规则
在views下创建首页 并配置路由规则
<template>
<div>
我是首页
</div>
</template>
<script>
export default {
}
</script>
<style>
</style>
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/login',
name: 'login',
component: () => import('../views/LoginView.vue')
},
{
path: '/home',
name: 'home',
component: () => import('../views/HomeView.vue')
},
{
path:"/",
redirect:"/login"
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
根据前期的项目的原型设计 创建不同用户权限的页面
原型设计工具 墨刀 蓝湖 墨客
在views下创建不同权限用户的所有页面
<template>
<div>
我是管理员的--用户管理页面
</div>
</template>
<script>
export default {
}
</script>
<style scoped>
div{
width: 100%;
height: 500px;
background-color: rgb(156, 0, 133);
}
</style>
2.登录请求后台 得到不同权限的用户数据
接口是模拟的 密码不限制 只限制了 用户名进行测试
接口地址:http://localhost:8899/login
参数:uname admin:管理员 user:普通用户
方式get
返回值:
userid : 1普通用户 0 管理员 -1登录失败
<template>
<div>
<h1>我是登录页面</h1>
用户名:<input type="text" v-model="inputa" /> 密码:<input
type="text"
v-model="inputb"
/>
<button @click="fun()">点我登录</button>
</div>
</template>
<script>
import $http from "axios";
export default {
data() {
return {
inputa: "",
inputb: "",
};
},
methods: {
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
});
},
},
};
</script>
<style>
</style>
3.判断用户是否登陆成功
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
// 判断是否登录成功
if(ok.data.userid!=-1){
alert("欢迎您"+ok.data.msg)
}else{
alert("用户名密码错误请重新登录")
}
});
},
4 使用this.$router.addRoutes()动态添加路由
在Login页面登陆成功之后 可以得到后台返回的路由信息 那么我们就使用addRoutes来进行动态添加路由
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
// 判断是否登录成功
if(ok.data.userid!=-1){
alert("欢迎您"+ok.data.msg)
// 在登陆成功的时候使用addRoutes添加动态路由
this.$router.addRoutes([
{
path:"/home",
name:"hone",
// 不要忘了引用home页面 import Home from "@/views/HomeView.vue"
component:Home,
children:[]//这里的children就是后台给我们的路由数据 但是我们需要处理路由数据
}
])
}else{
alert("用户名密码错误请重新登录")
}
});
},
5处理后台返回的数据并动态生成路由
因为后台返回的数据 和我们在vue中使用的路由规则格式不匹配 所以我们需要处理他 但是不要忘了 把处理好的数据要放到addRoutes生成的二级路由中
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
// 处理路由数据
let children=[];
// 遍历后台数据 生成我们的路由规则
for(var i=0;i<ok.data.routerdata.length;i++){
// 这里要先读取 否则在下面得路由拦截在中就没有办法获取了
let routerdata=ok.data.routerdata[i]
children.push({
path:routerdata.path,
name:routerdata.name,
component: () => import(`@/views/${routerdata.demo}`)
})
}
// 把children变量放到addRoutes生成的二级路由规则中
// 处理路由数据
// 判断是否登录成功
if(ok.data.userid!=-1){
alert("欢迎您"+ok.data.msg)
// 在登陆成功的时候使用addRoutes添加动态路由
this.$router.addRoutes([
{
path:"/home",
name:"hone",
// 不要忘了引用home页面 import Home from "@/views/HomeView.vue"
component:Home,
children//这里的children就是后台给我们的路由数据 但是我们需要处理路由数据
}
])
}else{
alert("用户名密码错误请重新登录")
}
});
},
6缓存路由信息并且动态生成路由导航
缓存数据
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
// 处理路由数据
let children=[];
// 遍历后台数据 生成我们的路由规则
for(var i=0;i<ok.data.routerdata.length;i++){
// 这里要先读取 否则在下面得路由拦截在中就没有办法获取了
let routerdata=ok.data.routerdata[i]
children.push({
path:routerdata.path,
name:routerdata.name,
component: () => import(`@/views/${routerdata.demo}`)
})
}
// 把children变量放到addRoutes生成的二级路由规则中
// 处理路由数据
// 缓存后台请求的路由数据方便动态生成导航
window.sessionStorage.setItem("link",JSON.stringify(ok.data.routerdata))
// 缓存后台请求的路由数据方便动态生成导航
// 判断是否登录成功
if(ok.data.userid!=-1){
alert("欢迎您"+ok.data.msg)
// 在登陆成功的时候使用addRoutes添加动态路由
this.$router.addRoutes([
{
path:"/home",
name:"hone",
// 不要忘了引用home页面 import Home from "@/views/HomeView.vue"
component:Home,
children//这里的children就是后台给我们的路由数据 但是我们需要处理路由数据
}
])
}else{
alert("用户名密码错误请重新登录")
}
});
},
在home页面生成二级路由导航 与设置二级路由出口
<template>
<div>
我是首页
<!-- 根据数据遍历生成导航 -->
<router-link v-for="(v,i) in routerdata" :key="i" :to="'/home/'+v.path">{{v.path}}--{{v.name}}</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
data(){
return {
routerdata:[]
}
},
mounted(){
// 把得到的路由规则转换之后传递给data数据
this.routerdata=JSON.parse(window.sessionStorage.getItem("link"))
}
}
</script>
<style>
</style>
在登录页面请求完成后跳转到home页面
fun() {
// 这里没有使用拦截器与api封装工作的时候需要使用
$http({
url: "http://localhost:8899/login",
params: { uname: this.inputa, upwd: this.inputb },
}).then((ok) => {
console.log(ok);
// 处理路由数据
let children=[];
// 遍历后台数据 生成我们的路由规则
for(var i=0;i<ok.data.routerdata.length;i++){
// 这里要先读取 否则在下面得路由拦截在中就没有办法获取了
let routerdata=ok.data.routerdata[i]
children.push({
path:routerdata.path,
name:routerdata.name,
component: () => import(`@/views/${routerdata.demo}`)
})
}
// 把children变量放到addRoutes生成的二级路由规则中
// 处理路由数据
// 缓存后台请求的路由数据方便动态生成导航
window.sessionStorage.setItem("link",JSON.stringify(ok.data.routerdata))
// 缓存后台请求的路由数据方便动态生成导航
// 判断是否登录成功
if(ok.data.userid!=-1){
alert("欢迎您"+ok.data.msg)
// 在登陆成功的时候使用addRoutes添加动态路由
this.$router.addRoutes([
{
path:"/home",
name:"home",
// 不要忘了引用home页面 import Home from "@/views/HomeView.vue"
component:Home,
children//这里的children就是后台给我们的路由数据 但是我们需要处理路由数据
}
])
// 跳转到登录页面
// 跳转到登录页面
// 跳转到登录页面
this.$router.push("/home")
}else{
alert("用户名密码错误请重新登录")
}
});
},