『分分钟玩转VueRouter●下』我对VueRouter在项目中如何使用的理解

news2024/9/22 19:43:11

路由的设置会根据系统中用户角色的数量而有所不同,大致分为三种单角色同权限、单角色不同权限、多角色。这里的角色均是只一种身份,而不是用户量。接下来的讲解纯属个人见解,大型项目会将不同权限的用户直接分开开发不同的系统。如果是小型多角色项目可以采用我的这个办法。
先说一说大致分类:

  • 单角色同权限
    • 只有一种角色,这种角色对每一个组件的权限还相同。
    • 这种直接采用静态路由即可,并且由于权限的固定路由守卫验证起来也没有那么繁杂。
  • 单角色不同权限
    • 有一种角色,但是这种角色之间有着不同的权限
    • 这种常采用路由跟着用户走的设计,也就是用户用到什么路由,系统就加载什么路由
  • 多角色
    • 一个系统有多种角色
    • 多种角色权限不同,位于一个系统
    • 这种常采用动态路由,并且将不同用户路由进行详细划分

这里我着重说一下多角色的这一个系统在这里插入图片描述

路由的设置如下目录:
在这里插入图片描述
index.js中主要存放一些所有用户均会用到的插件,以及对路由对象的初始化。(在进行完之后,将其暴露出去)

import VueRouter from "vue-router";
import Layout from "../views/Layout/index"
import Login from "../views/Login/index"

// import store from "./store/index.js"
// 基础的路由规则不受限制
const router = new VueRouter({
    routes: [
        {
            name:"home",
            path: "/",
            component: Layout,
            meta: {
                // 用于控制,只要是我们项目中的路由都可以查到这个信息
                isOurProject: true
            },
            children: []
        },
        {
            // 如果验证没有登录的话就跳转到登录页面
            path: "/login",
            component:Login
        },
        // 配置在最下面,可以守卫防止用户乱窜
        {
            name: "404",
            path: "*",
            component: () => import("../components/Nofind")
        }
    ]
})
export default router

在routeguard.js文件中将index.js导入并配置路由守卫,这里使用
router.addRoute(“home”, routeRule[0])将不同角色相关的路由进行动态加入并挂载在响应角色的home目录下。
component:()=>import(“…/views/Student/index”),是对组件进行异步加载。
const pathDic = { “1”: “/student”, “2”: “/teacher”, “3”: “/admin” }是三种用户对应的不同路径,这里还有一个tag(值为1,2,3分别代表学生、老师、管理员,正好在这个字典内作为键,用户获取后续的值)。
在登录的时候会根据用户的选择进行身份验证验证通过后使用编程式路由跳转向响应的路由,然后在路由守卫中进行比对将对应路由动态加载一下。由此区分同一系统中的不同角色。

import router from "./index"
import store from "../store/index"

//三种用户所对的路由(负责映射动态路由)
const pathDic = { "1": "/student", "2": "/teacher", "3": "/admin" }

//路由规则
const routers = [
    {
        // 学生页面
        name: "student",
        path: "/student",
        component:()=>import("../views/Student/index"),
        redirect:"/student/home",
        children:[ 
            {
                name:"studenthome",
                path:"home",
                component:()=>import("../components/Home")
            },
            {
                name:"tem",
                path:"tem",
                component:()=>import("../components/XtermTerminal"),
                meta:{
                    keepAlive:true
                }
            } ,
            {
                // 简写(管理员管理学生)
                name: "test",
                path: "test",
                component: () => import("../views/Admin/Test")
            },
            {
                name:"container",
                path:"Container",
                component:()=>import("../views/Student/Container")
            },
            {
                name:"ccontainer",
                path:"ccontainer",
                component:()=>import("../pages/Other/customContainer")
            },
            
        ]
    },
    {
        name: "teacher",
        path: "/teacher",
        component:()=>import("../views/Teacher/index"),
        redirect:"/teacher/home",
        children:[
            {
                name:"teacherhome",
                path:"home",
                component:()=>import("../views/Teacher/TeacherHome")
            },
            {
                name:"c1",
                path:"container",
                component:()=>import("../pages/Other/Container")
            },
            {
                name:"ccontainer",
                path:"ccontainer",
                component:()=>import("../pages/Other/customContainer")
            },
            {
                name:"rcontainer",
                path:"rcontainer",
                component:()=>import("../pages/Other/readyContainer")
            }
        ]
    },
    {
        //管理员页面
        name: "admin",
        path: "/admin",
        component: () => import("../views/Admin/index"),
        redirect:"/admin/home",
        children: [
            {
                name:"adminhome",
                path:"home",
                component:()=>import("../components/Home")
            },
            {
                // 简写(管理员管理学生)
                name: "ams",
                path: "manageStudent",
                component: () => import("../pages/Student/ManageStudent")
            }, 
            {
                // 简写(管理员增加学生)
                name: "aas",
                path: "addStudent",
                component: () => import("../pages/Student/addStudent")
            },
            {
                // 简写(管理员管理学生)
                name: "test",
                path: "test",
                component: () => import("../views/Admin/Test")
            },
            {
                name: "amt",
                path: "manageteacher",
                component: () => import("../pages/Teacher/ManageTeacher")
            },
            {
                name:"tem",
                path:"tem",
                component:()=>import("../components/XtermTerminal"),
                meta:{
                    keepAlive:true
                }
            }
        ]
    }
]
router.beforeEach((to, from, next) => {
    //读取vuex中的用户基本信息
    let tempname = store.state.loginModel.userInfo.userName
    let temptag = store.state.loginModel.userInfo.tag
    if (!tempname) {
        //防止用户恶意修改路由
        if (to.path !== "/login") next("/login")
        else return next()
    } else {
        // 首次进入的话会进行动态路由加载
        if (!store.state.loginModel.isLogin) {
            const routeRule = routers.filter(item => {
                return item.path === pathDic[temptag]
            })
            router.addRoute("home", routeRule[0])
            store.commit('loginModel/alertIsLogin')
            return next(pathDic[temptag])
        }
        if (to.path == "/login") next(pathDic[temptag])
        else if (to.path == "/") next(pathDic[temptag])
        else {
            next()
        }
    }

})

router.afterEach((to, from) => {
    // eslint-disable-next-line no-console
    // console.log(to,from)
    from
    document.title = to.meta.title || "默认页签"
})

在进行路由动态加载时可能会抛出警告。
在这里插入图片描述
解决方法如下(将警告捕获并忽略):

if (tag === 1) {
  this.$router.replace("/student").catch(() => {});
} else if (tag === 2) {
  this.$router.replace("/teacher").catch(() => {});
} else {
  this.$router.replace("/admin").catch(() => {});
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++基础——for循环

for循环是循环的一种 以下是 for 循环的结构: for (初始化; 判断条件; 更新) {循环体; } 执行顺序: for 语句的三个部分中,任何一个部分都可以省略。其中,若省略了判断条件,相当于判断条件永远为真。 for (int i …

fpga实操训练(从模块到系统开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们学习了fpga的一些基本操作,熟悉了这些操作,基本上说fpga已经入门了。但是距离我们用fpga开发产品,这中…

Faster RCNN网络源码解读(Ⅷ) --- RPN网络代码解析(下)RegionProposalNetwork类解析

目录 一、代码作用(rpn_function.py) 二、代码解析 2.1 RegionProposalNetwork类 2.1.1 正向传播过程forward 接着上篇博客的2.1.2节 2.1.2 assign_targets_to_anchors 2.1.3 det_utils.Matcher传入参数 2.1.4 compute_loss 2.1.5 smooth_l1_lo…

你真的会正确使用wait和notify么?

目录 wait和notify原理 API wait 与 sleep的区别 wait 和 notify的正确使用 step1 step2 step3 step4 step5 总结waitnotify wait和notify原理 当我们线程获取某个对象的monitor锁的时候就会成为owner线程,当owner线程条件不满足的时候,就会调用wait方法,该线程就会进…

惠州市政企信息化(互联网)市场调研报告

1.引言 1.1.编写目的 据广东省惠州市惠东县的政企信息化市场调研的客观性数据,分析相关数据,确定市场规模、市场潜力、市场需求,以及需求价值,为后续的市场决策、服务组合决策提供依据,也作为未来根据市场变化而调整…

Nacos 注册中心

Nacos 注册中心 目录概述需求:设计思路实现思路分析1.增加 Maven 依赖2.Client端配置注册中心3.Server端配置注册中心4.Nacos 注册中心参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

Java--Map接口详解

目录 Map接口的特点 代码实现 代码实现 Map的常用方法 代码实现 Map接口的4种遍历方法 代码实现 第一种方式 第二种方式 第三种方式 第四种方式 Map接口的特点 1)Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value 2)Map中的key和value可以…

如何在星巴克连接家中Windows台式机?(安卓,iOS, Windows, macOS配合frp穿透公网IP实现)

zhaoolee 最近热衷于和海外热心老哥们交换硬盘中的单机游戏资源(BT下载),家中有Windows台式机, 适合长时间挂机下载BT资源,zhaoolee希望能随时连接到Windows台式机新增下载任务,安装体积超大的主机游戏。 …

End-to-End Object Detection with Transformers论文阅读笔记

End-to-End Object Detection with Transformers 端到端,不需要NMS后处理了,直接出结果。 1、Abstract 将目标检测作为一个集合预测问题来解决。简化了检测的整体流程,有效的消除了许多人工设计的部分,比如NMS,anch…

数据库连接池(C++11实现)

目的: 因为对数据库的操作实质上是对磁盘的IO操作,所以如果对数据库访问次数过多,就会到导致大量的磁盘IO,为了提高MySQL数据库(基于C/S设计)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的…

还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】

目录🍀一、前言🌱二、多分类场景简介🍃三、前期准备阶段🟥3.1 运行环境准备🟧3.2 文心ERNIE系列模型介绍🟨3.3 预训练模型加载⬜3.4 加载项目代码💐四、数据准备阶段🟩4.1 数据处理流…

变不可能为可能——记房产推销员佟鑫海

有勤奋,就会有所收获。傲人的成绩和背后的努力密切相关。俗话说得好,没卖不掉的房子,仅有卖不掉房子的艺人经纪人。关键是你是否有恒心。 在明升,总会有这样一群影子,他们每天精力旺盛,衣着光鲜&#xff0…

【C/C++ SOCKET编程】基于TCP协议实现服务器客户端的简单通信

什么是SOCKET Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 TCP/IP协议 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议…

unsafe.Pointer和uintptr的区别

unsafe 包 func Alignof(x ArbitraryType) uintptr func Offsetof(x ArbitraryType) uintptr func Sizeof(x ArbitraryType) uintptr type ArbitraryType int type Pointer *ArbitraryType在unsafe包中,只提供了3个函数,两个类型。就这么少的量&#xf…

【数据结构进阶】布隆(Bloom Filter)过滤器【哈希+位图的整合】

布隆(Bloom Filter)过滤器【哈希位图的整合】 1、什么是布隆过滤器? 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空…

物联网与射频识别技术,课程实验(四)

实验4—— 基于帧的时隙ALOHA(FSA)算法的实现与性能分析 实验说明: 利用Python或Matlab模拟基于帧的时隙ALOHA算法; 分析标签数量k、帧中所含时隙个数n对信道利用率的影响,其中, 信道利用率发送数据的时间/(发送数据的时间信道空…

【JavaEE】线程的状态转换

新年快乐! 祝新的一年万事胜意! 魅力无限! 随心所欲! 蒸蒸日上! 文章目录1. 线程的基本状态2.Java中线程的状态3. 线程的转换1. 线程的基本状态 操作系统中线程有三个基本状态,就绪状态,运行状态,阻塞状态. 就绪状态, 已经获得除CPU之外的所有资源,只要得到CPU,可立即执行. …

(二十五)大白话数据库无法连接故障的定位,Too many connections

文章目录 1、你是否遇到过Too many connections?2、linux的文件句柄数量被限制1、你是否遇到过Too many connections? 今天要给大家分析另外一个真实的大家都经常会碰到的数据库生产故障,就是数据库无法连接的问题。 大家会看到的异常信息往往是“ERROR 1040(HY000): Too …

ubuntu18.04下mysql数据库安装和C语言连接操作

数据库在应用系统开发中很常见,在众多的数据库中,mysql总是会占有一席之地。本篇说明一下如何在ubuntu18.04上安装mysql数据库。 目录 1.更新环境 2.安装mysql数据库系统 3.检测是否安装成功 4.启动、重启、关闭,删除 5.给root用户设置…

vue3+Ts使用vuex模块化和非模块化管理的2种方式(非pinia)

官网写的很清楚:https://vuex.vuejs.org/zh/guide/typescript-support.html 2种方式 (都不是使用pinia的) 1:复杂版本(不定义自己的 useStore 组合式函数) 使用的时候需要在vuex引入 useStore 在store文件引入导出的key import { useStore } from ‘vu…