位置: 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)

  • 微信聊天怎么知道对方的地址位置(微信聊天怎么知道男生喜不喜欢你)

    微信聊天怎么知道对方的地址位置(微信聊天怎么知道男生喜不喜欢你)

  • 华为荣耀9x的分辨率是多少(华为荣耀9x的分屏操作是在哪里)

    华为荣耀9x的分辨率是多少(华为荣耀9x的分屏操作是在哪里)

  • 如何让微信下星星雨(微信怎么下心)

    如何让微信下星星雨(微信怎么下心)

  • 主板cpu和dram故障灯亮(主板的cpu和dram故障灯交替亮)

    主板cpu和dram故障灯亮(主板的cpu和dram故障灯交替亮)

  • 华为怎么设置键盘壁纸(华为怎么设置键盘手写)

    华为怎么设置键盘壁纸(华为怎么设置键盘手写)

  • 设置朋友权限仅聊天什么意思(设置朋友权限仅聊天可以视频吗)

    设置朋友权限仅聊天什么意思(设置朋友权限仅聊天可以视频吗)

  • 华硕笔记本开机卡在asus画面(华硕笔记本开机没反应怎么办)

    华硕笔记本开机卡在asus画面(华硕笔记本开机没反应怎么办)

  • 苹果a2161是什么版本(苹果a2161是什么运营商)

    苹果a2161是什么版本(苹果a2161是什么运营商)

  • win7重装几个小时(重装一个win7系统多少钱)

    win7重装几个小时(重装一个win7系统多少钱)

  • 美图手机停止生产了吗(美图手机如何取消自动休眠)

    美图手机停止生产了吗(美图手机如何取消自动休眠)

  • 小米路由器网速慢怎么解决(小米路由器网速不稳定)

    小米路由器网速慢怎么解决(小米路由器网速不稳定)

  • 耳机盒可以单独充电吗(耳机盒可以单独换吗)

    耳机盒可以单独充电吗(耳机盒可以单独换吗)

  • 喜马拉雅怎么边听边看(喜马拉雅怎么边看边读)

    喜马拉雅怎么边听边看(喜马拉雅怎么边看边读)

  • 快手直播公会入驻条件(快手直播公会入口在哪里)

    快手直播公会入驻条件(快手直播公会入口在哪里)

  • 华为手机实况模式在哪(华为手机实况模式怎么关闭)

    华为手机实况模式在哪(华为手机实况模式怎么关闭)

  • 苹果比安卓好在哪(苹果比安卓好?)

    苹果比安卓好在哪(苹果比安卓好?)

  • 7p指纹键坏了可以修吗(7p指纹键坏了可以开机吗)

    7p指纹键坏了可以修吗(7p指纹键坏了可以开机吗)

  • 苹果换手机怎么把东西移过去(苹果换手机怎么恢复微信聊天记录的内容)

    苹果换手机怎么把东西移过去(苹果换手机怎么恢复微信聊天记录的内容)

  • 苹果共用一个id的弊端(苹果共用一个id怎么看对方的位置)

    苹果共用一个id的弊端(苹果共用一个id怎么看对方的位置)

  • 手机淘宝热搜怎么关闭(淘宝的热搜功能在哪)

    手机淘宝热搜怎么关闭(淘宝的热搜功能在哪)

  • 应用无法验证苹果手机(iphome无法验证应用)

    应用无法验证苹果手机(iphome无法验证应用)

  • 安卓手机如何打开.do文件(安卓手机如何打开开发者模式)

    安卓手机如何打开.do文件(安卓手机如何打开开发者模式)

  • 快充数据线和普通数据线的区别(快充数据线和普通数据线可以通用吗)

    快充数据线和普通数据线的区别(快充数据线和普通数据线可以通用吗)

  • Vue中的Pinia状态管理工具 | 一篇文章教会你全部使用细节(vue pending)

    Vue中的Pinia状态管理工具 | 一篇文章教会你全部使用细节(vue pending)

  • 应纳税所得额高了好还是低了好
  • 年终双薪究竟该怎么算
  • 企业所得税是含税价还是不含税价
  • 税务金三系统是什么?
  • 生产性资金是生产资料吗
  • 个人商业保险抵交个人所得税
  • 出口不退税进项税如何处理
  • 软件销售利润
  • 购入设备发生的运输费计入什么科目
  • 进项发票失控账务处理
  • 施工企业结算金额怎么算
  • 生产单位车间设计费应该计入什么科目?
  • 职工个人代扣款如何做账
  • 报销定额备用金什么意思
  • 净水设备配件计算方法
  • 银行收回贷款本息企业怎么做分录
  • 全年一次性奖金计税方式
  • 租赁房屋的装修
  • 增值税暂估
  • 顾问费的个税怎么扣
  • 开了红字发票税额已经缴纳怎么做账?
  • 新公司企业怎么注册
  • 未确认融资费用摊销额怎么计算
  • 原材料到半成品分录
  • 员工意外伤害保险怎么买
  • ghost读不出硬盘
  • linux系统配置ip地址命令
  • 收到押金缴国库费怎么办
  • 微信支付宝转账最新规定
  • Win10 Build 19043.1147 (21H1)预览通道更新补丁KB5004296(附完整更新日志)
  • PHP:stream_context_get_options()的用法_Stream函数
  • php stat
  • php实现邮件发送
  • php面向对象的三大特性
  • 微信小程序web-view 添加悬浮按钮
  • 安装elipse教程
  • 交易性金融资产的入账价值
  • 转出多交增值税账务处理
  • 一般纳税人两费附加减免规定
  • 打印的机票行程怎么查
  • php中isset函数作用
  • 机关单位差旅费
  • 上个月没扣社保 这个月一起交能报账吗
  • 超出python用什么
  • 税控系统减免税
  • 合并报表存货的计税基础
  • 公司制作横幅计入什么科目?
  • 中小企业所得税优惠
  • 成本发票未到如何结转成本
  • 一般纳税人免税额度
  • 返利开红字发票怎么做账
  • 支付给外包公司的工资和保险费
  • 物流公司主营业务成本会计分录
  • 什么时候确认应收
  • 已经做账发票退款怎么办
  • 会计如何建账做账
  • sql分几类
  • 苹果电脑快捷键截图怎么截
  • 检测你的vps是不是真的
  • win10系统设备管理器没有蓝牙
  • 在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker的步骤
  • os x 10.10 yosemite自动纠正怎么关?os x yosemite自动纠正功能关闭教程
  • igfxem是什么软件
  • 盗版xp黑屏的解决办法
  • win7桌面快捷方式图标没箭头
  • win1021年更新
  • linux测试软件
  • perl删除文件夹
  • Linux删除大量文件
  • css div内容自动换行
  • 3dsMax插件开发环境配置
  • js设置颜色代码
  • node.js mysql
  • linux怎么使用
  • android 属性动画原理
  • 安卓通知栏管理工具
  • jquery mobile怎么样
  • 广州市地税局副局长
  • 印刷行业费用标准
  • 争议问题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设