位置: IT常识 - 正文

vue3+动态路由(vue3动态路由权限)

编辑:rootadmin
vue3+动态路由

推荐整理分享vue3+动态路由(vue3动态路由权限),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue3动态路由权限控制,vue3动态路由不生效,vue3动态路由不生效,vue3动态路由标签页,vue3动态路由不生效,vue3动态路由导航菜单,vue3动态路由导航菜单,vue3动态路由导航菜单,内容如对您有帮助,希望把文章链接给更多的朋友!

         动态路由,也就是不是写死的路由,根据自己的需求加载不同的页面;现在很多的后台管理项目就是根据用户角色的不同分配不同的功能菜单(页面);

        根据用户登录的角色返回可以访问的页面路由,前端将路由存储到 pinia 实现持久话存储,然后在路由前置守卫用 addRoute 动态添加路由,对页面进行渲染。

        通常的实现步骤:

前端调用登录接口获取用户ID(uid)         前端用uid请求接口获取路由表(JSON)对路由表进行数据格式话形成树形结构树形结构 转 vue路由结构路由结构 转  静态路由树形结构 转  菜单组件

 下面是我练习一个demo,仅用于学习与记录;

服务端代码结构:

         服务端在本地localhost:3007,

 

vue3+动态路由(vue3动态路由权限)

 server.js

//导入express 模块const express = require("express")//创建 express 实例const app = express()//导入cors 中间件const cors = require("cors")app.use(cors())//配置表单解析中间件app.use(express.urlencoded({extended:false}))const useRouter = require("./router/index.js")app.use("/api",useRouter)app.listen(3007,function (){ console.log("api server running at http://127.0.0.1:3007")})

 router/index.js

const express = require("express")const router = express.Router()const users = require("../mockDB/user.js")const routers = require("../mockDB/router.js")router.post("/routers", (req, res) => { const {uid} = req.body if (uid) { let authRouterInfo; authRouterInfo = []; const userInfo = users.find(user => user.id === JSON.parse(uid)) console.log(users) userInfo.auth.map((rid) => { routers.map((router) => { if (router.id === rid) { authRouterInfo.push(router) } }) }) res.send({ status: 0, msg: "post 请求成功", data: authRouterInfo }) } else { res.send( { status: 0, msg: "查询不到此uid !", data: null } ) } }) module.exports = router

mockDB/user.js

module.exports = [ { id:1, name:"zhangsan", auth:[2,3,6,7] }, { id:2, name:"lisi", auth:[2,3,5,6,7,8] }, { id:3, name:"wangwu", auth:[2,3,4,5,6,7,8] }, { id:4, name:"mazi", auth:[6,7,8] }]

mockDB/router.js 

module.exports = [ { id:2, pid:0, path:"/course", name:"Course", title:"课程管理" }, { id:3, pid:2, path:"operate", name:"CourseOperate", title:"课程操作", link:"/course/operate" }, { id:4, pid:3, path:"info_data", name:"CourseInfoData", title:"课程数据", link:"/course/operate/info_data" }, { id:5, pid:2, path:"add", name:"CourseAdd", title:"课程添加", link:"/course/add" }, { id:6, pid:0, path:"/student", name:"Student", title:"学生管理" }, { id:7, pid:6, path:"operate", name:"StudentOperate", title:"学生操作", link:"/student/operate" }, { id:7, pid:6, path:"add", name:"StudentAdd", title:"学生增加", link:"/student/add" }]

 前端代码结构:

         前端调用 /api/routers 传入 uid 获取用户路由表

调用接口

import axios from "axios"import qs from "qs"export function getRouters(uid){ return axios({ url:"http://127.0.0.1:3007/api/routers", method:"post", header:{ "Content-type":"application/x-www-from-urlencoded" }, data:qs.stringify({uid}) })}

 将路由表格式成树结构, 路由表结构mockDB/router.js

export function formatRouterTree(datas) { let res = [] datas.map(data => { // data.children = [] //console.log(data.children) if (data.pid === 0) { res.push(data) } else { add2Tree(data, res) } }) return res}function add2Tree(data, res) { res.map(r => { if (data.pid === r.id) { if (!r.children) r.children = [] r.children.push(data) } else { if (r.children) add2Tree(data, r.children) } })}

树结构 转 vue路由结构

export function generateRouter(userRouters) { let newRouters; newRouters = userRouters.map(r => { let routes = { path: r.path, name: r.name, component: () => import(`../view/${r.name}.vue`) } if (r.children) { routes.children = generateRouter(r.children) } return routes }); return newRouters}

先配置静态的路由,接着添加动态路由  ==> router/route.js

const routes = [ { path:"/", name:"Home", component:() => import ("../view/Home.vue") }, // { // path:"/404", // name:"NotFound", // component:() => import ("../view/NotFound.vue") // }, // { // path:"/:pathMatch(.*)", // redirect:"/404" // }]export default routes;router.beforeEach(async (to, from, next) => { const store = useRouterStore() if (!store.hasAuth) { await store.getRoutersList() let newRoutes = generateRouter(store.userRouters) let a = [...newRoutes, { path: "/404", name: "NotFound", component: () => import ("../view/NotFound.vue") }, { path: "/:pathMatch(.*)", redirect: "/404" }] a.forEach((r) => { router.addRoute(r) }) next({...to, replace: true}) console.log(a) }else { if(to.name === null){ next("/404") } next() }})

递归组件模版渲染菜单组件

本文链接地址:https://www.jiuchutong.com/zhishi/297786.html 转载请保留说明!

上一篇:计算机领域各大顶会顶刊集合梳理(计算机领域划分)

下一篇:使用D435i相机跑ORB-SLAM2_RGBD_DENSE_MAP-master稠密建图编译(实时彩色点云地图加回环+保存点云地图)(相机4244)

  • 虚拟机连接不上网络(虚拟机连接不上finalshell)

    虚拟机连接不上网络(虚拟机连接不上finalshell)

  • 华为mate20pro无线充电多少W(华为mate20pro无线充电功率)

    华为mate20pro无线充电多少W(华为mate20pro无线充电功率)

  • 淘宝追加评价有时间限制吗(淘宝追加评价有效期多久)

    淘宝追加评价有时间限制吗(淘宝追加评价有效期多久)

  • 淘宝视频怎么保存到相册里面(淘宝视频怎么保存本地)

    淘宝视频怎么保存到相册里面(淘宝视频怎么保存本地)

  • 不小心退群了并删除了如何恢复(不小心退群了并删除了如何恢复聊天记录)

    不小心退群了并删除了如何恢复(不小心退群了并删除了如何恢复聊天记录)

  • 华为耳机没坏插手机仍外放(华为耳机没坏插手机仍外放 开发者模式)

    华为耳机没坏插手机仍外放(华为耳机没坏插手机仍外放 开发者模式)

  • 大王卡不激活有影响吗(大王卡办了不激活)

    大王卡不激活有影响吗(大王卡办了不激活)

  • 华为手机指纹设置突然没有(华为手机指纹设置怎么设置啊)

    华为手机指纹设置突然没有(华为手机指纹设置怎么设置啊)

  • 路由器和光猫放一起会有信号干扰吗(路由器和光猫放在床头对人有影响吗)

    路由器和光猫放一起会有信号干扰吗(路由器和光猫放在床头对人有影响吗)

  • 抖音极速版一天最多可以刷多少金币(抖音极速版一天能刷几块钱)

    抖音极速版一天最多可以刷多少金币(抖音极速版一天能刷几块钱)

  • 美团新客9元话费券用不了(美团新用户九元话费图片)

    美团新客9元话费券用不了(美团新用户九元话费图片)

  • 华为隐私空间安全吗(华为隐私空间安装包)

    华为隐私空间安全吗(华为隐私空间安装包)

  • 快手里该账号已重置是什么意思(下载原来的快手号)

    快手里该账号已重置是什么意思(下载原来的快手号)

  • 拼多多上怎么清除推荐(拼多多上怎么清除先用后付)

    拼多多上怎么清除推荐(拼多多上怎么清除先用后付)

  • 16g是什么意思(苹果4s16g是什么意思)

    16g是什么意思(苹果4s16g是什么意思)

  • 淘宝双十二报名时间(淘宝双十二报名后不能满减)

    淘宝双十二报名时间(淘宝双十二报名后不能满减)

  • 电脑网易云听歌识曲在哪(电脑网易云听歌识曲用不了)

    电脑网易云听歌识曲在哪(电脑网易云听歌识曲用不了)

  • 索尼a73光圈在哪调(索尼a73光圈在哪设置)

    索尼a73光圈在哪调(索尼a73光圈在哪设置)

  • 服务器500错误的原因(500 internal server error (服务器错误))

    服务器500错误的原因(500 internal server error (服务器错误))

  • oppo 新机reno z上市时间(oppo出新手机了)

    oppo 新机reno z上市时间(oppo出新手机了)

  • 小米9小米之家有现货吗(小米之家有没有小米九)

    小米9小米之家有现货吗(小米之家有没有小米九)

  • 屏幕指纹手机可以贴钢化膜吗(屏幕指纹手机可以指纹不显示解锁手机吗)

    屏幕指纹手机可以贴钢化膜吗(屏幕指纹手机可以指纹不显示解锁手机吗)

  • 拼多多怎么关闭连抽(拼多多怎么关闭拼小圈不让别人看)

    拼多多怎么关闭连抽(拼多多怎么关闭拼小圈不让别人看)

  • 红米note7pro防水吗(redmi note7防水吗)

    红米note7pro防水吗(redmi note7防水吗)

  • appdata文件夹可以删除吗详情(appdata文件夹可以改名吗)

    appdata文件夹可以删除吗详情(appdata文件夹可以改名吗)

  • 【vue2可视化开发】新手会遇到的问题——大屏自适应(vue可视化面板怎么打开)

    【vue2可视化开发】新手会遇到的问题——大屏自适应(vue可视化面板怎么打开)

  • WordPress限制标签云数量(wordpress标签tag文章)

    WordPress限制标签云数量(wordpress标签tag文章)

  • 本期收入和本期免税收入有什么区别
  • 劳务公司计税税率
  • 未分配利润与净利润不相等
  • 小规模纳税人可以开1%的专票吗
  • 银行的划分标准
  • 现金折扣冲减销售收入冲销项税吗
  • 房屋出租收入其税收如何计算呢?
  • 场外货币基金赎回利息
  • 增值税专用发票可以开电子发票吗
  • 土地租金一次付清的会计处理怎么做?
  • 工资未发放是否可以仲裁
  • 账本印花税怎么缴纳
  • 营改增通知规定的税收优惠政策
  • 营改增后餐饮业税种
  • 维修税控设备分录
  • 仓库间的调拨流程
  • 应付质保金到期怎么办
  • 利息保障倍数计算公式资本化利息
  • 公司车贷款还款怎么操作
  • 投标费用属于什么会计科目
  • 免征房产税是多少
  • 应交税费已交税金借方有余额
  • 苹果手机上显示LTE是什么意思
  • 手动设定ip地址后连不上网
  • 联想thinkpad安装win7方法
  • 苹果客服人工24小时
  • win10 多屏协同
  • 应交税费的销项税额怎么算
  • eclipse 4.19
  • 敬老院利润分析
  • 借支单还款后借支单要还么
  • mongodb jpa
  • 销售费用属于损益类科目的收入还是费用
  • 公司向职工借款利息需要交税吗
  • 开具增值税发票哪些情形不用交税?
  • 城镇土地使用税的计算公式
  • 为什么要划分等价类
  • 一般纳税人开出13%的普通发票怎么扣税
  • 前后端分离与不分离
  • 蜈蚣什么情况下出现
  • 一万字综述怎么写
  • 目标检测选SSD还是YOLO
  • php读取文件内容的方法和函数
  • 工程结算如何快速审核
  • 蔬菜开票税率是多少
  • 清税证明怎么在网上申请
  • 会计期末业务有哪些?
  • 白酒消费税最低计税价格核定范围包括
  • 工程项目辅材占比
  • 个人所得税手续费返还增值税申报表怎么填
  • 什么公司可以核定企业所得税
  • 结算备付金账户是什么帐户
  • 外贸公司进口关税增值税的帐务处理流程
  • 住宿费开专票怎么做账
  • 白条入账会计处理
  • 低值易耗品摊销借贷方向
  • 独立核算的生产车间是法律主体吗
  • 工厂宿舍水电费怎么扣
  • 公司购买汽车的购置税可以抵税吗
  • 中小企业会计建议和意见
  • debian9.6安装教程
  • linux文件系统损坏
  • linux系统故障及解决方法
  • ghost后不能启动
  • WIN10专业版怎么查看操作位数
  • Win10系统安装步骤
  • marvell 网卡驱动
  • win10系统开机后任务栏无响应怎么解决
  • win7怎么修改开机启动
  • 原生java web
  • bat批处理命令大全
  • supervisor producer
  • 使用vue开发手机app
  • nodejs常用内置模块
  • python常见的格式化输出小结
  • js中splice方法
  • 广西空置房物业费减免政策吗
  • 人人财富最新消息
  • 湖南什么时候实行电子驾驶证
  • 铜进口量2019
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设