对vue-element-admin从后台动态查询菜单并生成路由信息的新思路

本文介绍如何在Vue项目中实现从后端动态获取路由信息,并通过权限控制显示相应页面。通过修改permission模块和user API,实现了根据用户角色动态加载路由的功能。

 

其实需求很简单,就是要 vue-element-admin 项目动态的调用接口,后台查询后返回给前端项目,符合你的权限范围内的页面!

 

(21条消息) 对vue-element-admin从后台动态查询菜单并生成路由信息_acoolper的专栏-CSDN博客

如上的一篇文章,受益匪浅,成功实现了我的需求。

 

但是我遇到了一个文章末尾评论区的通用问题,让我很不爽。

component: () => import(`@/views${item.url}/index`),

我的代码这么写始终报 Module build failed (from ./node_modules/eslint-loader/index.js): TypeError: Cannot read property 'range' of null

 

让我想到了另外的方法,规避问题:那就是,前台维护好 asyncRoutes , 根据后台请求返回的数据,对 asyncRoutes 进行字段重置。

 

time to show code

第一处修改:src/store/modules/permission.js

import { asyncRoutes, constantRoutes } from '@/router'
import { getRoutes } from '@/api/user'
 
/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}
 
/**
 * 将后台查询的 routes 数据合并到原始的 routes 数据
 * @param asyncRoutes 原始 routes 数据
 * @param loadRoutes 后台查询到的 routes 数据
 */
export function dealLoadRoutes(asyncRoutes, loadRoutes) {
  loadRoutes.forEach(loadRoute => {
    // console.log("dealLoadRoutes:" + JSON.stringify(loadRoute))
    dealLoadRoute(asyncRoutes, loadRoute)
  })
}

/**
 * 同级别节点数据合并( path 相同则认为可以合并)
 * @param asyncRoutes 原始 routes 数据
 * @param loadRoute 后台查询到的 routes 数据,单条
 */
export function dealLoadRoute(asyncRoutes, loadRoute) {
  asyncRoutes.forEach(asyncRoute =>{
    // 原始路由配置如果和后台查询到的路由配置path相同,则关键字段替换
    if(asyncRoute.path == loadRoute.path){
      asyncRoute.id = loadRoute.id
      asyncRoute.name = loadRoute.name
      asyncRoute.meta.title = loadRoute.meta.title
      asyncRoute.meta.icon = loadRoute.meta.icon
      asyncRoute.meta.roles = loadRoute.meta.roles
      console.log("path_match:"+JSON.stringify(asyncRoute))
      // 处理children
      if(asyncRoute.children){
        dealLoadRoutes(asyncRoute.children, loadRoute.children)
      }
    }
  })
}
 
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles) {
  const res = []

  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })

  return res
}
 
const state = {
  routes: [],
  addRoutes: []
}
 
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}
 
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      const loadRoutes = []
      // 先查询后台菜单数据并把数据合并到路由
      getRoutes(state.token).then(response => {
        let data = response
        if (response.code != 20000) {
          this.$message({
            message: 'routes数据加载异常',
            type: 0
          })
        } else {
          data = response.data
          Object.assign(loadRoutes, data)
          dealLoadRoutes(asyncRoutes, loadRoutes)
          let accessedRoutes
          if (roles.includes('admin')) {
            // alert(JSON.stringify(asyncRoutes))
            accessedRoutes = asyncRoutes || []
          } else {
            accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
          }
          commit('SET_ROUTES', accessedRoutes)
          resolve(accessedRoutes)
        }
        // generaMenu(asyncRoutes, data)
      }).catch(error => {
        console.log(error)
      })
    })
  }
}
 
export default {
  namespaced: true,
  state,
  mutations,
  actions
}

 

第二处修改:src/api/user.js

import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/vue-element-admin/user/login',
    method: 'post',
    data
  })
}

export function getInfo(token) {
  return request({
    url: '/vue-element-admin/user/info',
    method: 'get',
    params: { token }
  })
}

export function logout() {
  return request({
    url: '/vue-element-admin/user/logout',
    method: 'post'
  })
}

export function getRoutes(token) {
  return request({
    url: '/vue-element-admin/routes',
    method: 'get'
  })
}

 

仅仅如上的两处修改。

另外附加 /vue-element-admin/routes 请求返回的数据格式

{
    "code":20000,
    "data":[
        {
            "id":3,
            "path":"/permission",
            "meta":{
                "title":"权限控制",
                "icon":"lock",
                "roles":["editor"]
            },
            "children":[
                {
                    "id":4,
                    "path":"page",
                    "meta":{
                        "title":"My Page Permission",
                        "icon":null,
                        "roles":["editor","admin"]
                    },
                    "children":[]
                },
                {
                    "id":5,
                    "path":"directive",
                    "meta":{
                        "title":"My Directive Permission",
                        "icon":null,
                        "roles":["admin"]
                    },
                    "children":[]
                },
                {
                    "id":6,
                    "path":"role",
                    "meta":{
                        "title":"My Role Permission",
                        "icon":null,
                        "roles":["admin"]
                    },
                    "children":[]
                }
            ]
        }
    ],
    "message":"成功"
}

 

内容概要:本文围绕基于条件风险价值(CVaR)的虚拟电厂与电动汽车主从博弈策略展开研究,提出了一种应对电力市场中不确定性的优化调度模型。该模型采用Stackelberg博弈框架,将虚拟电厂设为领导者、电动汽车群体作为跟随者,结合CVaR风险度量方法有效刻画极端场景下的潜在损失,提升系统对高波动性可再生能源接入和负荷不确定性的鲁棒性。研究深入探讨了市场主体之间的交互机制、不同风险偏好对调度决策的影响以及收益分配的均衡特性,通过Matlab实现了完整的仿真代码,涵盖模型构建、求解流程与结果可视化,属于顶级EI期刊论文的复现资源,具有较强的学术参考价值和工程应用前景。; 适合人群:电力系统、能源互联网、智能电网及相关领域的研究生、科研人员与工程技术人员,尤其适合具备博弈论、风险量化分析、优化建模基础及Matlab编程能力的学习者。; 使用场景及目标:①掌握主从博弈在电力市场中的建模与实现方法;②理解CVaR在能源系统风险管理中的具体应用;③复现高水平学术论文成果进行拓展研究;④开展虚拟电厂协调调度、电动汽车参与需求响应等方向的课题研究或论文撰写。; 阅读建议:此资源以Matlab代码为核心,建议读者结合原论文进行对照学习,重点剖析模型假设、目标函数与约束条件的设计逻辑,调试运行代码尝试调整风险参数、市场结构等变量以观察系统行为变化,从而深化对博弈机制与风险规避策略的理解。
内容概要:本文聚焦于“基于线性决策规则的分布鲁棒机组组合”研究,针对风电出力不确定性下的电力系统机组组合优化问题,构建了分布鲁棒优化模型。通过引入线性决策规则对不确定变量进行建模,有效应对风电波动带来的调度风险,在仅知有限统计信息的前提下,利用模糊集描述不确定分布,提升模型在实际工程中的适用性与鲁棒性。研究采用Matlab实现算法仿真,兼顾经济性与系统安全性,具备较强的可复现性和拓展价值。文中还列举多项相关科研方向及配套资源,涵盖联邦学习、配电网状态估计、T型三电平逆变器控制等前沿课题,所有代码与资料可通过指定网盘链接或公众号“荔枝科研社”获取。; 适合人群:适用于电力系统、自动化、新能源等领域具有建模与编程基础的研究生及科研人员,尤其适合熟悉Matlab/Simulink环境掌握优化理论的研究者。; 使用场景及目标:①掌握分布鲁棒优化在含高比例可再生能源电力系统调度中的建模方法;②学习线性决策规则处理不确定性的技术路径及其Matlab实现;③复现核心算法拓展应用于科研论文撰写、项目开发或工程仿真; 阅读建议:建议结合YALMIP工具包与提供的网盘资源(含完整代码)进行实践操作,重点关注风电不确定性建模、模糊集构造与优化求解过程,同时可参考文中其他课题拓展研究视野与创新思路
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值