vue-router防跳墙控制

vue-router防跳墙控制

因为在实际开发中,从自己的角度来看,发现可以通过地址栏输入地址,便可以进入本没有权限的网页。而我们一般只是操作登录页面,其他页面很少考虑,此刻特来尝试解决一下

  • 基于vue-router使用

思路
1363709-20180612143122299-147454028.png

  • 页面初始结构
<el-row class="tac">
  <el-col :span="6">
    <h5>默认颜色</h5>
    <el-menu
      default-active="2"
      class="el-menu-vertical-demo"
      @open="handleOpen"
      @close="handleClose">
      <el-submenu index="1">
        <template slot="title">
          <i class="el-icon-location"></i>
          <span>导航一</span>
        </template>

        <el-menu-item-group>
          <router-link to="/nav_menu/nav_menu_one">
            <el-menu-item index="1-1">选项1</el-menu-item>
          </router-link>
          <router-link to="/nav_menu/nav_menu_two">
            <el-menu-item index="1-2">选项2</el-menu-item>
          </router-link>
          <router-link to="/nav_menu/nav_menu_three">
            <el-menu-item index="1-3">选项3</el-menu-item>
          </router-link>
        </el-menu-item-group>
      </el-submenu>
    </el-menu>
  </el-col>
  <el-col :span="6">
    <router-view />
  </el-col>
</el-row>
  • 效果图
    1363709-20180612142930171-1793672593.gif

  • 通过请求后,获取用户可显示的菜单栏 (假设指定选项2无法显示)

js

data() {
    return {
        user: {}
    }
},   
created() {
    this.getUserInfo()
},
methods: {
    /**
    * 用户信息
    */
    getUserInfo() {
        // 假设用户信息
        const USER_INFO = ['one', 'three']
        //开始进行添加
        for (let item of USER_INFO) {
            this.user[item] = true
        }  
    },
}

html 对每个链接添加 v-if="user.**" 可以进行指定显示

<el-menu-item-group>
    <router-link to="/nav_menu/nav_menu_one" v-if="user.one">
    <el-menu-item index="1-1">选项1</el-menu-item>
    </router-link>
    <router-link to="/nav_menu/nav_menu_two" v-if="user.two">
    <el-menu-item index="1-2">选项2</el-menu-item>
    </router-link>
    <router-link to="/nav_menu/nav_menu_three" v-if="user.three">
    <el-menu-item index="1-3">选项3</el-menu-item>
    </router-link>
</el-menu-item-group>
  • 效果图
    1363709-20180612142948671-765207480.gif

但是这样并不能防止跳墙,假设在地址栏中输入指定的地址
1363709-20180612144217622-1699308518.gif

可以看到,本不应该显示选项2的,结果依旧可以显示

  • 再对路由进行加工处理

    利用 meta 进行处理 meta: { flag: ** }

{
    path: '/nav_menu',
    name: 'NavMenu',
    component: () => import('./../components/NavMenu.vue'),
    children: [
    { path: 'nav_menu_one',   meta: {flag: 'one'},  component: () => import('./../components/NavMenuOne.vue') },
    { path: 'nav_menu_two',   meta: {flag: 'two'},  component: () => import('./../components/NavMenuTwo.vue') },
    { path: 'nav_menu_three', meta: {flag: 'three'},  component: () => import('./../components/NavMenuThree.vue')},
    ]
},

业务逻辑处理

router.beforeEach((to, from, next) => {
  // 假设显示的数据
  const USER_MENU = ['one', 'three'] 
  // ---------------------------------------
  if (USER_MENU.includes(to.meta.flag)) {
    next()
  } else {
    if (to.path === '/error') {
      next()
    } else {
      next('/error')
    }
  }
})
  • 效果图
    1363709-20180612143207469-870404874.gif

至此,我们的要求就暂时完成了

总结

  • 在测试过程中,会有相应的一些问题。特别是考虑到,如何拿到数据,这个可能会有点麻烦,需要仔细再仔细
  • 个人觉得待优化的地方是,每个链接都需要添加v-if,目前没有想到更好的替代
  • 由于需要指定 字段 因而需要与后台沟通好

最后希望能抛砖引玉,能有更优的解决方案

转载于:https://www.cnblogs.com/sinosaurus/p/9172852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值