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

  • 增值税的征税范围
  • 个税申报错误已过申报期怎么修改
  • 现金流量怎么影响股票价值
  • 装修公司一般纳税人税率是多少啊
  • 横向转拨财政款应通过什么科目
  • 记账凭证日期填写哪一天
  • 营业外收入在资产负债表怎么填
  • 小规模无票收入怎么做账
  • 个人所得税财产所得
  • 汽车违章罚款在哪里缴纳
  • 公司代缴员工个税
  • 刻章后的发票要打印吗
  • 旧税号还能开票吗
  • 营改增后哪些费用可以抵扣
  • 专用发票地址写错字了能用吗
  • 体现公司财务状况的报表
  • 虚假会计凭证有哪些识别方法
  • 办公室房租计入什么科目
  • 服装工业企业成立时间
  • 季度所得税弥补亏损
  • 多提的费用如何做冲减分录
  • linux禁止ip访问80端口
  • windows11关机键怎么设置经典菜单
  • 处置子公司属于调整事项吗
  • vue print nb 教程
  • 仓储费计入存货成本吗
  • 材料成本差异属于成本类账户吗
  • pc应用是什么意思
  • 解决本地浏览器的方法
  • chattr
  • 三趾鹑是野鸡吗
  • 赡养老人专项扣除标准
  • 【AutoGPT】你自己运行,我先睡了—— ChatGPT过时了吗?
  • 铡刀演示
  • php中cookie的值存储在哪
  • 其他科技推广服务业可以加计扣除吗
  • 物业公司代收水费账务处理
  • 税控系统维护费普通发票可以全额抵扣吗
  • 增值税电子发票怎么下载
  • 外购商品转为自用固定资产,进项税
  • 结转费用类会计分录怎么写
  • 设计模式模板方法和策略模式对比
  • 应税销售额税率
  • 个体户怎么交税?
  • 记账凭证应具备的基本内容包括
  • 留抵抵欠税附加税需要交嘛
  • 房地产企业拆迁补偿费入账要求
  • 增值税专用发票有几联?
  • 融资租入固定资产的租赁费属于什么费用
  • 零退税率可以做免税吗
  • 冲销主营业务收入怎么做分录
  • 审车费用表
  • 开票软件升级包
  • 其他业务收入如何开票
  • 贸易公司的成本怎么做
  • 个体工商户个税怎么申报
  • 汽车贷款利息计算公式计算器
  • 发票邮寄到家
  • sql server233错误
  • 繁体软件在简体运行
  • 系统如何修改
  • 虚拟主机管理平台
  • Remoterm.exe - Remoterm是什么进程 有什么用
  • mac新版系统
  • 获取shell脚本执行结果
  • win8怎么清空电脑只剩系统
  • backtracker
  • js下拉加载
  • opengl绘制点线面
  • 如何删除命令
  • firefox margin-top失效的原因与解决办法
  • xml能写网页吗
  • node+mongodb
  • Unity的WWW类的用法整理
  • javascript基础教程教材答案
  • 山西省税务局投诉平台
  • 如何理解计算消费税时的(1
  • 成品油消费税税目税率表2023
  • 国税工作人员工资标准
  • 7月税务征收期
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设