array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【转】vue 动态路由实现 - 爱码网
方案一:
运用场景:系统根据登录账号的权限,动态加载左侧菜单; 后端直接返回的路由菜单数据

实现:

1.获取的数据格式

  • 一级目录component: ”components/main”
  • 二级目录component: ”components/parentView”
  • 目录下菜单component: "view/organization/user/user1.vue", //实际指向而定
  •  path值不可有重复指向
【转】vue 动态路由实现

------------

2.将后端树转化为路由树( libs/util.js )

  •  递归树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//动态路由
/**
 * @description 将后端菜单树转换为路由树 递归树
 * @param {Array} menus
 * @returns {Array}
 */
export const backendMenusToRouters = (menus) => {
  let routers = []
  forEach(menus, (menu) => {
    // 将后端数据转换成路由数据
    let route = backendMenuToRoute(menu)
    // 如果后端数据有下级,则递归处理下级
    if (menu.children && menu.children.length !== 0 && menu.name != "") {
      route.children = backendMenusToRouters(menu.children)
    }
    routers.push(route)
  })
  // console.log(routers)
  return routers
}
 

  • 处理树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * @description 将后端菜单转换为路由 处理树
 * @param {Object} menu
 * @returns {Object}
 */
const backendMenuToRoute = (menu) => {
  // 具体内容根据自己的数据结构来定,这里需要注意的一点是
  // 原先routers写法是component: () => import('@/view/error-page/404.vue')
  // 经过json数据转换,这里会丢失,所以需要按照上面提过的做转换,下面只写了核心点,其他自行处理
  let route = Object.assign({}, menu)
  // route.component = () => import(`/* webpackChunkName: ${menu.title} */'@/${menu.component}'`)\
 
  // 菜单配置的时候都是矢量图标库里面的图标所以要加上iconfont,ivew-admin里面都是默认的font-family:'Ionicons'=>转成 font-family:'iconfont'
  if(menu.meta){
    route.meta.icon = `iconfont ${menu.meta.icon}`
  //矢量图标转划
   
  if(menu.component == "components/main"){
    route.component = Main;  //一级菜单判断
  }
  else if(menu.component == "components/parentView"){
    route.component = parentView; //二级菜单判断
  }
  else{
    route.component  = () =>  import(`@/${menu.component}`);
  }
  return route
}
 


  • 左侧菜单数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
///////////////动态路由
/**
 * @param {Array} list 通过路由列表得到菜单列表
 * @param access
 * @returns {Array}
 */
export const getUserMenuByRouter = (list) => {
  // console.log(list)
  let res = []
  forEach(list, item => {
 
    //meta没配置,或者配置了,但hideInMenu=false
    if (!item.meta || (item.meta && !item.meta.hideInMenu)) {
      let obj = {
        icon: (item.meta && item.meta.icon) || '',
        name: item.name,
        meta: item.meta
      }
      //有下级子元素或者showAlways=true并且还有权限访问,继续递归处理下级(item.meta && !item.meta.showAlways)
      if ((hasChild(item))) {
        obj.children = getUserMenuByRouter(item.children)
      }
      //如果配置了href,设置href
      if (item.meta && item.meta.href) obj.href = `${baseUrl}`+`${item.meta.href}`
      //加入
      res.push(obj)
    }
  })
  return res
}
 

  • 后台管理踩过的坑
2.1菜单配置使用的是矢量图标库里面的图标所以要加上和iview图标font-family属性不一致;ivew-admin里面都是默认的font-family:'Ionicons'=>转成 font-family:'iconfont'
  *解决* :这里不可以全局修改属性值,在个别使用到的地方做css的修改。

 2.2对一级菜单、二级菜单的component参数进行分别判断
 
 

3.全局管理并缓存路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 获取用户相关信息
    getUserInfo ({ state, commit }) {
      let paramer ={
        token:state.token,
        refresData:false,
      }
      // console.log(state.token)
      return new Promise((resolve, reject) => {
        try {
          getUserInfo(paramer).then(res => {
            // console.log(res)
            const data = res.data.result
            // console.log("菜单",JSON.stringify(data.menuRoutes))
            // commit('setAvatar', data.avatar) //头像
 
            commit('setUserName', data.loginName)
            commit('setUserInfo', data)
            commit('setAccess', data.roleInfoDto.roleName) //权限 角色
            commit('setHasGetInfo'true)
            let routers = backendMenusToRouters(data.menuRoutes)
            console.log(routers)
            commit('setRouters', routers)
            commit('setHasGetRouter'true)
 
            localStorage.setItem("getInfo"true);
            localStorage.setItem("router", JSON.stringify(data.menuRoutes));
            resolve(data)
          }).catch(err => {
            reject(err)
          })
        catch (error) {
          reject(error)
        }
      })
    },
 
 

4.重置路由,在最后添加404页面路径

获取到缓存里的数据,在until.js中的方法转化后得到路由数据,最后加上404页面路径并重置路由
*(InitRouters中的业务逻辑,根据实际情况进行修改)*

  • 除了考虑正常跳转,浏览器刷新,不存在的页面地址都需考虑
  • Tip:浏览器刷新后,路由中的name值可能会消失

*根据缓存中的name值去循环判断(这里name和path在配置的时候是一致的)...实际情况判断...*
【转】vue 动态路由实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
```html
// version2
const initRouters = (to, next) => {
 
  // 在路由最后动态添加404, path:"*"
  let rou = JSON.parse(localStorage.getItem("router"));
  let routers = backendMenusToRouters(rou);
  routers.push({
    path: '*',
    name: 'error_404',
    meta: {
      hideInMenu: true
    },
    component: () => import('@/view/error-page/404.vue')
  })
  router.addRoutes(routers);
 
  let arr = [];
  let names2 = [];
  let names = getAllNames(rou,arr);
  names2= names.concat(["login","home","error_401","error_500"]);
  console.log(names2)
 
  let path = to.path;
  let path1 = path.substr(path.lastIndexOf('/') + 1);
  console.log(path1)
  console.log(names2.includes(path1))
 
 
  if (to.matched.length > 0 ) {
    next()
  }
  else if (to.name !== null && to.matched.length === 0) {
    next({
      name: 'error_404'
    })
    return
  }
  else {
    next({
      name: path1
    })
  }
}
 

Tip: 路由陷入无线循环的情况:
【转】vue 动态路由实现

 

相关文章: